Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r1d07de4e970f54f2ae1786ef546cf5567df9ba8e -r7df6ce585f0af9bcc65c74a7da4d92f9c449b221 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 1d07de4e970f54f2ae1786ef546cf5567df9ba8e) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision 7df6ce585f0af9bcc65c74a7da4d92f9c449b221) @@ -41,8 +41,8 @@ #define BATTERY_COMM_TIME_OUT_MS 2 ///< Battery communication time out in ms. #define BATTERY_MONITOR_INTERVAL_MS 247 ///< Battery monitor interval in ms. #define AC_POWER_LOST_PERSISTENT_COUNT 3 ///< AC power lost persistent count before alarming. -#define BATTERY_COMM_FAULT_PERSISTENCE_COUNT 4 ///< Battery communication fault persistent count before alarming. -#define BATTERY_COMM_FAULT_PERSISTENCE_TIMER ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Battery communication fault persistence timer. +#define BATTERY_COMM_FAULT_COUNT 5 ///< Battery communication fault persistent count before alarming. +#define BATTERY_COMM_FAULT_TIMER ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Battery communication fault persistence timer. #define BATTERY_MAH_2_MWH_FACTOR 14.7F ///< Conversion factor for mAh to mWh. #define BATTERY_MIN_CAPACITY_MWH 5000.0F ///< Minimum battery capacity for starting a treatment is 10 minutes (5 Wh @ 30W). @@ -141,7 +141,6 @@ static OVERRIDE_U32_T batteryChargerStatus = { 0, 0, 0, 0 }; ///< Battery charger status static OVERRIDE_U32_T batteryI2CStatusRegister = { 0, 0, 0, 0 }; ///< Battery I2C Interrupt Status register static U32 lastBatteryMonitorTime; ///< Previous battery monitor time. -static U32 commFaultPersistentCount; ///< Persistence count for battery comm fault. static BATTERY_MANAGEMENT_ENUM_T current_BM_value; ///< Index for which battery data to read now. static BATTERY_MANAGER_PAYLOAD_T BatteryManagerData; ///< Record with latest battery pack data updated at the slower frequency. @@ -161,7 +160,7 @@ static BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ); static BOOL startCommTx( U32 slaveAddr ); static BOOL getData( U08 command, U16 * dataPtr ); - +static void checkTooManyCommFaults( void ); // For logging static void getBatteryManagementData( void ); static void publishBatteryManagementData( void ); @@ -177,16 +176,17 @@ void initBattery( void ) { lastBatteryMonitorTime = 0; - commFaultPersistentCount = 0; current_BM_value = BEGINNING_OF_LIST; memset( &BatteryStatusData, 0, sizeof( BATTERY_STATUS_PAYLOAD_T ) ); memset( &BatteryManagerData, 0, sizeof( BATTERY_MANAGER_PAYLOAD_T ) ); // Initialize persistent alarm for battery pack status error initPersistentAlarm( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, 0, BATT_STATUS_ERROR_PERSIST_MS ); - initPersistentAlarm( ALARM_ID_HD_BATTERY_COMM_FAULT, 0, BATTERY_COMM_FAULT_PERSISTENCE_TIMER ); + // Initialize bad message CRC time windowed count + initTimeWindowedCount( TIME_WINDOWED_COUNT_BATT_COMM_ERROR, BATTERY_COMM_FAULT_COUNT, BATTERY_COMM_FAULT_TIMER ); + setupI2CDriver(); } @@ -467,16 +467,12 @@ { if ( 0 == ( getI2CStatusRegister() & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) { - commFaultPersistentCount = 0; result = TRUE; } else { generateStopCondition(); - if ( TRUE == isPersistentAlarmTriggered(ALARM_ID_HD_BATTERY_COMM_FAULT, ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENCE_COUNT ) ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, slaveAddr, commFaultPersistentCount ); - } + checkTooManyCommFaults(); } } } @@ -532,11 +528,7 @@ if ( FALSE == result ) { - if ( TRUE == isPersistentAlarmTriggered(ALARM_ID_HD_BATTERY_COMM_FAULT, ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENCE_COUNT ) ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, dataPtr, commFaultPersistentCount ); - commFaultPersistentCount = 0; - } + checkTooManyCommFaults(); } return result; @@ -755,7 +747,24 @@ broadcastData( MSG_ID_HD_BATTERY_STATUS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&batteryStatusData, sizeof( BATTERY_STATUS_PAYLOAD_T ) ); } +/*********************************************************************//** + * @brief + * The checkTooManyCommFaults function checks for too many comm faults + * within a set period of time. Assumed function is being called when a new + * comm fault is detected so a new comm fault will be added to the list. + * @details Inputs: none + * @details Outputs: alarm 98 on trigger. + * @return none + *************************************************************************/ +static void checkTooManyCommFaults( void ) +{ + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_BATT_COMM_ERROR ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, TIME_WINDOWED_COUNT_BATT_COMM_ERROR ); + } +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/