#include "slave_monitoring.h" #include "stm32f3xx_hal.h" #include "ts_state_machine.h" #include #include SlaveHandle slaves[N_SLAVES]; uint16_t min_voltage; int16_t max_temp; void slaves_init() { for (int i = 0; i < N_SLAVES; i++) { slaves[i].id = i; slaves[i].error.kind = SLAVE_ERR_NONE; slaves[i].last_message = 0; memset(&slaves[i].voltages, 0, sizeof(slaves[i].voltages)); memset(&slaves[i].temperatures, 0, sizeof(slaves[i].temperatures)); } } void slaves_check() { int any_slave_error = 0; uint32_t now = HAL_GetTick(); uint16_t min_voltage_new = 0xFFFF; int16_t max_temp_new = 0xFFFF; for (int i = 0; i < N_SLAVES; i++) { if (now - slaves[i].last_message >= SLAVE_TIMEOUT) { // Don't overwrite a different error kind if (slaves[i].error.kind == SLAVE_ERR_NONE) { slaves[i].error.kind = SLAVE_ERR_TIMEOUT; } } else if (slaves[i].error.kind == SLAVE_ERR_TIMEOUT) { slaves[i].error.kind = SLAVE_ERR_NONE; } for (int j = 0; j < N_CELLS_SERIES; j++) { uint16_t v = slaves[i].voltages[j]; if (v < min_voltage_new) { min_voltage_new = v; } } for (int j = 0; j < N_TEMP_SENSORS; j++) { int16_t t = slaves[i].temperatures[j]; if (t > max_temp_new) { max_temp_new = t; } } if (slaves[i].error.kind != SLAVE_ERR_NONE) { any_slave_error = 1; } } min_voltage = min_voltage_new; max_temp = max_temp_new; if (any_slave_error) { ts_sm_set_error_source(TS_ERROR_SOURCE_SLAVES, 1); } } void slaves_handle_panic(uint8_t *data) { uint8_t slave_id = data[0]; switch (data[1]) { case SLAVE_PANIC_OT: slaves[slave_id].error.kind = SLAVE_ERR_OT; break; case SLAVE_PANIC_UT: slaves[slave_id].error.kind = SLAVE_ERR_UT; break; case SLAVE_PANIC_OV: slaves[slave_id].error.kind = SLAVE_ERR_OV; break; case SLAVE_PANIC_UV: slaves[slave_id].error.kind = SLAVE_ERR_UV; break; } memcpy(&slaves[slave_id].error.data, &data[2], 4); slaves[slave_id].last_message = HAL_GetTick(); } void slaves_handle_log(uint8_t *data) { // TODO }