Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r19a8bf98a7154e24c35da25225d4b55bf70ddd09 -r3633c7c348e95b11175dfb4a4a183bdb6cd24478 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 19a8bf98a7154e24c35da25225d4b55bf70ddd09) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision 3633c7c348e95b11175dfb4a4a183bdb6cd24478) @@ -7,8 +7,8 @@ * * @file Battery.c * -* @author (last) Dara Navaei -* @date (last) 24-May-2022 +* @author (last) Michael Garthwaite +* @date (last) 07-Sep-2022 * * @author (original) Quang Nguyen * @date (original) 24-Feb-2021 @@ -18,6 +18,7 @@ #include "i2c.h" #include "Battery.h" +#include "PersistentAlarm.h" #include "SystemCommMessages.h" #include "Timers.h" @@ -35,6 +36,7 @@ #define BATTERY_CHARGER_STATUS_AC_PRESENT_MASK 0x8000 ///< Battery charger status AC present bit mask. #define BATTERY_PACK_REL_STATE_OF_CHARGE_CMD 0x0D ///< Command to get battery pack relative state of charge. +#define BATTERY_PACK_REM_CAPACITY_CMD 0x0F ///< Command to get battery pack remaining capacity (in mAh). #define BATTERY_PACK_STATUS_CMD 0x16 ///< Command to get battery pack status. #define BATTERY_PACK_ERROR_BITS 0x0F ///< Error codes are in the first byte. @@ -44,11 +46,18 @@ #define BATTERY_MONITOR_INTERVAL_MS 750 ///< Battery monitor interval in ms. #define AC_POWER_LOST_PERSISTENT_COUNT 3 ///< AC power lost persistent count before alarming. #define BATTERY_COMM_FAULT_PERSISTENTCE_COUNT 5 ///< Battery communication fault persistent count before alarming. + +#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). +/// Persist time (in ms) for battery pack status error condition. +static const U32 BATT_STATUS_ERROR_PERSIST_MS = ( 5 * MS_PER_SECOND ); + // ********** private data ********** static U16 batteryStatus = 0; ///< Battery current status. -static OVERRIDE_U32_T batteryRelStateOfCharge_pct = { 0, 0, 0, 0 }; ///< Battery pack relative state of charge. +static U32 batteryRelStateOfCharge_pct; ///< Battery pack relative state of charge. +static OVERRIDE_F32_T batteryRemCapacity_mAh = { 0.0, 0.0, 0.0, 0 }; ///< Battery pack remaining capacity (in mAh). static U16 batteryPackStatus = 0; ///< Battery pack current status. static U32 lastBatteryMonitorTime = 0; ///< Previous battery monitor time. static U32 lostACPowerPersistentCount = 0; ///< Persistent count for AC power lost alarm. @@ -57,7 +66,7 @@ // ********** private function prototypes ********** -static U32 getBatteryRemainingPercent( void ); +static F32 getBatteryRemainingCapacity_mWh( void ); static void setupI2CDriver( void ); static BOOL waitForTxReady( void ); static BOOL waitForRxReady( void ); @@ -77,27 +86,32 @@ void initBattery( void ) { batteryStatus = 0; - batteryRelStateOfCharge_pct.data = 0; + batteryRelStateOfCharge_pct = 0; batteryPackStatus = 0; lastBatteryMonitorTime = 0; lostACPowerPersistentCount = 0; hasBatteryChargerStatus = FALSE; commFaultPersistentCount = 0; + // Initialize persistent alarm for battery pack status error + initPersistentAlarm( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, 0, BATT_STATUS_ERROR_PERSIST_MS ); + setupI2CDriver(); } /*********************************************************************//** * @brief * The execBatteryMonitor function monitors the battery status. * @details Inputs: lastBatteryMonitorTime, hasBatteryChargerStatus, batteryStatus, - * batteryRelStateOfCharge_pct, batteryPackStatus - * @details Outputs: monitor battery status + * batteryRelStateOfCharge_pct, batteryPackStatus, lostACPowerPersistentCount + * @details Outputs: lastBatteryMonitorTime, hasBatteryChargerStatus, + * lostACPowerPersistentCount, batteryRelStateOfCharge_pct, batteryRemCapacity_mAh * @return none *************************************************************************/ void execBatteryMonitor( void ) { U16 relStateOfCharge_pct; + U16 remCapacity_mAh; if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) { @@ -131,20 +145,17 @@ if ( TRUE == getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_REL_STATE_OF_CHARGE_CMD, &relStateOfCharge_pct ) ) { - batteryRelStateOfCharge_pct.data = (U32)relStateOfCharge_pct; - if ( getBatteryRemainingPercent() < BATTERY_PACK_MIN_CHARGE_PCT ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_PACK_CHARGE_TOO_LOW, getBatteryRemainingPercent() ); - } - else - { - clearAlarmCondition( ALARM_ID_HD_BATTERY_PACK_CHARGE_TOO_LOW ); - } + batteryRelStateOfCharge_pct = (U32)relStateOfCharge_pct; } + if ( TRUE == getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_REM_CAPACITY_CMD, &remCapacity_mAh ) ) + { + batteryRemCapacity_mAh.data = (F32)remCapacity_mAh * BATTERY_MAH_2_MWH_FACTOR; + } + if ( TRUE == getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_STATUS_CMD, &batteryPackStatus ) ) { - if ( 0 != ( batteryPackStatus & BATTERY_PACK_ERROR_BITS ) ) + if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, ( batteryPackStatus & BATTERY_PACK_ERROR_BITS ) != 0 ) ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, batteryPackStatus ); } @@ -162,24 +173,24 @@ *************************************************************************/ BOOL isBatteryCharged( void ) { - return ( getBatteryRemainingPercent() > BATTERY_PACK_MIN_CHARGE_PCT ? TRUE : FALSE ); + return TRUE; // TODO - restore when I2C issue(s) resolved. ( getBatteryRemainingCapacity_mWh() > BATTERY_MIN_CAPACITY_MWH ? TRUE : FALSE ); } /*********************************************************************//** * @brief - * The getBatteryRemainingPercent function returns the latest battery relative - * state of charge percentage. - * @details Inputs: batteryRelStateOfCharge_pct + * The getBatteryRemainingCapacity_mWh function returns the latest battery + * remaining capacity (in mWh). + * @details Inputs: batteryRemCapacity_mAh * @details Outputs: none - * @return battery relative state of charge percentage + * @return battery remaining capacity (in mWh). *************************************************************************/ -static U32 getBatteryRemainingPercent( void ) +static F32 getBatteryRemainingCapacity_mWh( void ) { - U32 result = batteryRelStateOfCharge_pct.data; + F32 result = batteryRemCapacity_mAh.data; - if ( OVERRIDE_KEY == batteryRelStateOfCharge_pct.override ) + if ( OVERRIDE_KEY == batteryRemCapacity_mAh.override ) { - result = batteryRelStateOfCharge_pct.ovData; + result = batteryRemCapacity_mAh.ovData; } return result; @@ -411,19 +422,19 @@ * The testSetBatteryRemainingPercentOverride function overrides the battery * remaining percent value. * @details Inputs: none - * @details Outputs: batteryRelStateOfCharge_pct + * @details Outputs: batteryRemCapacity_mAh * @param value override battery remaining percent * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetBatteryRemainingPercentOverride( U32 value ) +BOOL testSetBatteryRemainingPercentOverride( U32 value ) // TODO - rename to capacity (instead of percent) + messaging + Dialin // TODO - add override of broadcast interval // TODO - broadcast battery data { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - batteryRelStateOfCharge_pct.ovData = value; - batteryRelStateOfCharge_pct.override = OVERRIDE_KEY; + batteryRemCapacity_mAh.ovData = value; + batteryRemCapacity_mAh.override = OVERRIDE_KEY; } return result; @@ -434,8 +445,7 @@ * The testResetSetBatteryRemainingPercentOverride function resets the * override of the battery remaining percent value. * @details Inputs: none - * @details Outputs: batteryRelStateOfCharge_pct - * @param value override battery remaining percent + * @details Outputs: batteryRemCapacity_mAh * @return TRUE if reset successful, FALSE if not *************************************************************************/ BOOL testResetSetBatteryRemainingPercentOverride( void ) @@ -445,8 +455,8 @@ if ( TRUE == isTestingActivated() ) { result = TRUE; - batteryRelStateOfCharge_pct.override = OVERRIDE_RESET; - batteryRelStateOfCharge_pct.ovData = batteryRelStateOfCharge_pct.ovInitData; + batteryRemCapacity_mAh.override = OVERRIDE_RESET; + batteryRemCapacity_mAh.ovData = batteryRemCapacity_mAh.ovInitData; } return result;