Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r0293b812a836d8d7480b66f3651be974c66314fa -rcd5be724d5a3ba7457e761191d82f278654d7f5c --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 0293b812a836d8d7480b66f3651be974c66314fa) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision cd5be724d5a3ba7457e761191d82f278654d7f5c) @@ -1,20 +1,21 @@ /************************************************************************** * -* Copyright (c) 2021-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2021-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file Battery.c * -* @author (last) Sean Nash -* @date (last) 18-Jan-2023 +* @author (last) Dara Navaei +* @date (last) 08-Oct-2023 * * @author (original) Quang Nguyen * @date (original) 24-Feb-2021 * ***************************************************************************/ - +#include // For memcpy + #include "i2c.h" #include "Battery.h" @@ -41,8 +42,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). @@ -131,7 +132,8 @@ BATTERY_PACK_MANUFACTURER_NAME, ///< Battery pack mfg name BATTERY_PACK_DEVICE_NAME, ///< Battery pack device name BATTERY_PACK_DEVICE_CHEMISTRY, ///< Battery pack device chemistry - END_OF_LIST + END_OF_LIST, ///< End of battery data list + NUM_OF_BATTERY_PACK_LIST, ///< Number of battery pack list } BATTERY_MANAGEMENT_ENUM_T; // ********** private data ********** @@ -141,7 +143,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. @@ -152,7 +153,7 @@ static F32 getBatteryRemainingCapacity_mWh( void ); static U32 getBatteryStatus( void ); static U32 getBatteryChargerStatus( void ); -static U32 getI2CStatusRegister( void ); +static U32 getI2CStatusRegister( BOOL resetOverride ); static void setupI2CDriver( void ); static BOOL waitForTxReady( void ); static BOOL waitForRxReady( void ); @@ -161,7 +162,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 +178,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(); } @@ -196,7 +198,7 @@ * @details Inputs: lastBatteryMonitorTime * @details Outputs: lastBatteryMonitorTime * @return none - *************************************************************************/ + *************************************************************************/ void execBatteryMonitor( void ) { if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) @@ -220,39 +222,24 @@ /*********************************************************************//** * @brief - * The isACPowerLost function determines whether A/C power loss has been - * detected. - * @details Inputs: none - * @details Outputs: none - * @return TRUE if A/C power loss condition is in effect, FALSE if not - *************************************************************************/ -BOOL isACPowerLost( void ) -{ - BOOL result = TRUE; - - if ( ( FALSE == isAlarmConditionDetected( ALARM_ID_HD_AC_POWER_LOST ) ) && - ( FALSE == isAlarmConditionDetected( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT ) ) ) - { - result = FALSE; - } - - return result; -} - -/*********************************************************************//** - * @brief * The getI2CStatusRegister function returns the I2C status register * @details Inputs: batteryI2CStatusRegister, i2cREG1->STR * @details Outputs: none + * @param reset override on get * @return I2C Interrupt Status. *************************************************************************/ -static U32 getI2CStatusRegister( void ) +static U32 getI2CStatusRegister( BOOL resetOverride ) { U32 result = i2cREG1->STR; if ( OVERRIDE_KEY == batteryI2CStatusRegister.override ) { result = batteryI2CStatusRegister.ovData; + if ( TRUE == resetOverride ) + { + batteryI2CStatusRegister.override = OVERRIDE_RESET; + batteryI2CStatusRegister.ovData = batteryI2CStatusRegister.ovInitData; + } } return result; @@ -465,18 +452,14 @@ if ( TRUE == waitForAccessReady() ) { - if ( 0 == ( getI2CStatusRegister() & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) + if ( 0 == ( getI2CStatusRegister( TRUE ) & ( (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(); } } } @@ -527,18 +510,13 @@ *dataPtr = batteryData; result = TRUE; } + else + { + checkTooManyCommFaults(); + } } } - 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; - } - } - return result; } @@ -706,26 +684,8 @@ case BATTERY_CHARGER_STATUS4: case BATTERY_CHARGER_STATUS5: if ( TRUE == getBatteryData( BATTERY_CHARGER_SLAVE_ADDRESS, BATTERY_CHARGER_STATUS_CMD, &BatteryStatusData.BatteryChargerStatus ) ) - { // If A/C not present, trigger A/C lost alarm + { batteryChargerStatus.data = BatteryStatusData.BatteryChargerStatus; - if ( 0 == ( getBatteryChargerStatus() & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) ) - { - // Pre-Treatment, Treatment, or Post-Treatment mode - if ( opMode == MODE_PRET || opMode == MODE_TREA || opMode == MODE_POST ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT, getBatteryChargerStatus() ); - } - // Standby, Service, or Treatment Parameters mode - else - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST, getBatteryChargerStatus() ); - } - } - else - { - clearAlarmCondition( ALARM_ID_HD_AC_POWER_LOST ); - clearAlarmCondition( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT ); - } } // Publish battery status data after reading battery charger status (last status read) publishBatteryStatusData(); @@ -737,7 +697,7 @@ break; default: - // TODO s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_BATTERY_INVALID_MANAGEMENT_DATA_STATE, current_BM_value ) break; } } @@ -768,12 +728,29 @@ batteryStatusData.RemainingCapacity = (U32)getBatteryRemainingCapacity_mWh(); batteryStatusData.BatteryStatus = getBatteryStatus(); batteryStatusData.BatteryChargerStatus = getBatteryChargerStatus(); - batteryStatusData.BatteryI2CStatus = getI2CStatusRegister(); + batteryStatusData.BatteryI2CStatus = getI2CStatusRegister( FALSE ); 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 *************************************************************************/