Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r1a7a7cfefc37883ca506c92d0f0b1436e5810c2f -rdbfeaf78c05fc922eba6ff8c7a31ba8a9392c642 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 1a7a7cfefc37883ca506c92d0f0b1436e5810c2f) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision dbfeaf78c05fc922eba6ff8c7a31ba8a9392c642) @@ -18,6 +18,7 @@ #include "i2c.h" #include "Battery.h" +#include "SystemCommMessages.h" #include "Timers.h" /** @@ -45,18 +46,19 @@ // ********** private data ********** -static U16 batteryStatus = 0; ///< Battery current status. -static U16 batteryRelStateOfCharge_pct = 0; ///< Battery pack relative state of charge. -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. -static BOOL hasBatteryChargerStatus = FALSE; ///< Flag indicates if battery charger status has been obtained. -static U32 commFaultPersistentCount = 0; ///< Persistence count for battery comm fault. +static U16 batteryStatus = 0; ///< Battery current status. +static OVERRIDE_U32_T batteryRelStateOfCharge_pct = { 0, 0, 0, 0 }; ///< Battery pack relative state of charge. +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. +static BOOL hasBatteryChargerStatus = FALSE; ///< Flag indicates if battery charger status has been obtained. +static U32 commFaultPersistentCount = 0; ///< Persistence count for battery comm fault. -static SELF_TEST_STATUS_T batteryTestStatus; ///< Current battery SOC test status. +static SELF_TEST_STATUS_T batteryTestStatus; ///< Current battery SOC test status. // ********** private function prototypes ********** +static U32 getBatteryRemainingPercent( void ); static void setupI2CDriver( void ); static BOOL waitForTxReady( void ); static BOOL waitForRxReady( void ); @@ -76,7 +78,7 @@ void initBattery( void ) { batteryStatus = 0; - batteryRelStateOfCharge_pct = 0; + batteryRelStateOfCharge_pct.data = 0; batteryPackStatus = 0; lastBatteryMonitorTime = 0; lostACPowerPersistentCount = 0; @@ -90,12 +92,15 @@ /*********************************************************************//** * @brief * The execBatteryMonitor function monitors the battery status. - * @details Inputs: batteryMonitorTimerCounter + * @details Inputs: lastBatteryMonitorTime, hasBatteryChargerStatus, batteryStatus, + * batteryRelStateOfCharge_pct, batteryPackStatus * @details Outputs: monitor battery status * @return none *************************************************************************/ void execBatteryMonitor( void ) { + U16 relStateOfCharge_pct; + if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) { lastBatteryMonitorTime = getMSTimerCount(); @@ -106,7 +111,7 @@ if ( TRUE == getBatteryData( BATTERY_CHARGER_SLAVE_ADDRESS, BATTERY_CHARGER_STATUS_CMD, &batteryStatus ) ) { - if ( ( batteryStatus & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) == 0 ) + if ( 0 == ( batteryStatus & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) ) { if ( ++lostACPowerPersistentCount > AC_POWER_LOST_PERSISTENT_COUNT ) { @@ -117,6 +122,7 @@ } else { + clearAlarmCondition( ALARM_ID_HD_AC_POWER_LOST ); lostACPowerPersistentCount = 0; } } @@ -125,11 +131,12 @@ { hasBatteryChargerStatus = FALSE; - if ( TRUE == getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_REL_STATE_OF_CHARGE_CMD, &batteryRelStateOfCharge_pct ) ) + if ( TRUE == getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_REL_STATE_OF_CHARGE_CMD, &relStateOfCharge_pct ) ) { - if ( ( SELF_TEST_STATUS_IN_PROGRESS == batteryTestStatus ) && ( batteryRelStateOfCharge_pct < BATTERY_PACK_MIN_CHARGE_PCT ) ) + batteryRelStateOfCharge_pct.data = (U32)relStateOfCharge_pct; + if ( ( SELF_TEST_STATUS_IN_PROGRESS == batteryTestStatus ) && ( getBatteryRemainingPercent() < BATTERY_PACK_MIN_CHARGE_PCT ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_PACK_CHARGE_TOO_LOW, batteryRelStateOfCharge_pct ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_PACK_CHARGE_TOO_LOW, getBatteryRemainingPercent() ); } } @@ -170,19 +177,26 @@ * @brief * The getBatteryRemainingPercent function returns the latest battery relative * state of charge percentage. - * @details Inputs: none + * @details Inputs: batteryRelStateOfCharge_pct * @details Outputs: none * @return battery relative state of charge percentage *************************************************************************/ -U16 getBatteryRemainingPercent( void ) +static U32 getBatteryRemainingPercent( void ) { - return batteryRelStateOfCharge_pct; + U32 result = batteryRelStateOfCharge_pct.data; + + if ( OVERRIDE_KEY == batteryRelStateOfCharge_pct.override ) + { + result = batteryRelStateOfCharge_pct.ovData; + } + + return result; } /*********************************************************************//** * @brief * The setupI2CDriver function setups i2c driver in repeat mode to be - * compatiable with SMBus protocol. + * compatible with SMBus protocol. * @details Inputs: none * @details Outputs: setup i2c driver in repeat mode * @return none @@ -304,11 +318,11 @@ /*********************************************************************//** * @brief - * The startComm function starts i2c communication and verifies slave devices ack. - * @details Inputs: none + * The startCommTx function starts i2c communication and verifies slave devices ack. + * @details Inputs: i2cREG1 * @details Outputs: starts i2c comm in master transmit mode * @param slaveAddr slave device address - * @return none + * @return TRUE if start communication successful, otherwise FALSE *************************************************************************/ static BOOL startCommTx( U32 slaveAddr ) { @@ -395,4 +409,56 @@ return result; } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetBatteryRemainingPercentOverride function overrides the battery + * remaining percent value. + * @details Inputs: none + * @details Outputs: batteryRelStateOfCharge_pct + * @param value override battery remaining percent + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBatteryRemainingPercentOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryRelStateOfCharge_pct.ovData = value; + batteryRelStateOfCharge_pct.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * 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 + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetSetBatteryRemainingPercentOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryRelStateOfCharge_pct.override = OVERRIDE_RESET; + batteryRelStateOfCharge_pct.ovData = batteryRelStateOfCharge_pct.ovInitData; + } + + return result; +} + /**@}*/