fix: any macro now returns zero on no match, reset error counters on (re-)init

This commit is contained in:
Kilian Bracher 2025-03-04 17:23:48 +01:00
parent 76a358207d
commit a249064059

View File

@ -46,6 +46,8 @@ ADBMS_DetailedStatus AMS_Init(SPI_HandleTypeDef* hspi) {
} }
pollingTimes = (struct pollingTimes){HAL_GetTick(), HAL_GetTick()}; pollingTimes = (struct pollingTimes){HAL_GetTick(), HAL_GetTick()};
packetChecksumFails = 0;
deviceSleeps = 0;
return NO_ERROR; return NO_ERROR;
} }
@ -59,7 +61,7 @@ ADBMS_DetailedStatus AMS_Init(SPI_HandleTypeDef* hspi) {
break; \ break; \
} \ } \
} \ } \
first_match; \ first_match + 1; \
}) })
ADBMS_DetailedStatus AMS_Idle_Loop() { ADBMS_DetailedStatus AMS_Idle_Loop() {
@ -70,11 +72,11 @@ ADBMS_DetailedStatus AMS_Idle_Loop() {
packetChecksumFails += (amsAuxAndStatusMeasurement(&modules) == HAL_ERROR); packetChecksumFails += (amsAuxAndStatusMeasurement(&modules) == HAL_ERROR);
static int match = 0; int match = 0;
if ((match = any(module.status.SLEEP))) { if ((match = any(module.status.SLEEP))) {
deviceSleeps++; deviceSleeps++;
if (deviceSleeps > MAX_DEVICE_SLEEP) { if (deviceSleeps > MAX_DEVICE_SLEEP) {
return (ADBMS_DetailedStatus){ADBMS_INTERNAL_BMS_TIMEOUT, match}; return (ADBMS_DetailedStatus){ADBMS_INTERNAL_BMS_TIMEOUT, match - 1};
} else { } else {
amsReset(); amsReset();
} }
@ -86,7 +88,7 @@ ADBMS_DetailedStatus AMS_Idle_Loop() {
// iteration. // iteration.
amsClearFlag(); amsClearFlag();
return (ADBMS_DetailedStatus){ADBMS_INTERNAL_BMS_FAULT, match}; return (ADBMS_DetailedStatus){ADBMS_INTERNAL_BMS_FAULT, match - 1};
} }
packetChecksumFails += (amsCellMeasurement(&modules) == HAL_ERROR); packetChecksumFails += (amsCellMeasurement(&modules) == HAL_ERROR);
@ -97,16 +99,16 @@ ADBMS_DetailedStatus AMS_Idle_Loop() {
} }
if ((match = any(module.overVoltage))) { if ((match = any(module.overVoltage))) {
return (ADBMS_DetailedStatus){ADBMS_OVERVOLT, match}; return (ADBMS_DetailedStatus){ADBMS_OVERVOLT, match - 1};
} }
if ((match = any(module.underVoltage))) { if ((match = any(module.underVoltage))) {
return (ADBMS_DetailedStatus){ADBMS_UNDERVOLT, match}; return (ADBMS_DetailedStatus){ADBMS_UNDERVOLT, match - 1};
} }
// TODO: replace with the correct threshold for the internal die temperature // TODO: replace with the correct threshold for the internal die temperature
if ((match = any(module.internalDieTemp > 28000 || module.status.THSD))) { if ((match = any(module.internalDieTemp > 28000 || module.status.THSD))) {
return (ADBMS_DetailedStatus){ADBMS_INTERNAL_BMS_OVERTEMP, match}; return (ADBMS_DetailedStatus){ADBMS_INTERNAL_BMS_OVERTEMP, match - 1};
} }
// mcuDelay(10); // mcuDelay(10);