Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r84bb8663dae71170e1743a2bed37b0aa47465b47 -rcf62b937520e0ec38b86d65f1adbbc962d64f2a7 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 84bb8663dae71170e1743a2bed37b0aa47465b47) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision cf62b937520e0ec38b86d65f1adbbc962d64f2a7) @@ -1,25 +1,27 @@ /************************************************************************** * -* Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. +* Copyright (c) 2021-2022 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 +* @file Battery.c * -* @author (last) Quang Nguyen -* @date (last) 24-Feb-2021 +* @author (last) Dara Navaei +* @date (last) 22-Sep-2022 * -* @author (original) Quang Nguyen -* @date (original) 24-Feb-2021 +* @author (original) Quang Nguyen +* @date (original) 24-Feb-2021 * ***************************************************************************/ #include "i2c.h" #include "Battery.h" -#include "Timers.h" - +#include "PersistentAlarm.h" +#include "SystemCommMessages.h" +#include "Timers.h" + /** * @addtogroup Battery * @{ @@ -33,110 +35,205 @@ #define BATTERY_CHARGER_STATUS_CMD 0x13 ///< Command to get battery charger status. #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_REMAINING_CAPACITY_CMD 0x0F ///< Command to get battery pack remaining capacity. +#define BATTERY_PACK_ERROR_BITS 0x0F ///< Error codes are in the first byte. +#define BATTERY_PACK_MIN_CHARGE_PCT 50 ///< Minimum battery pack state of charge in percentage. -#define BATTERY_COMM_TIME_OUT_MS 1 ///< Battery communication time out in ms. -#define BATTERY_MONITOR_INTERVAL_MS 750 ///< Battery monitor interval in ms. +#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_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). + +// Battery logging +#define BATTERY_PACK_ADDR_REMAINING_CAPACITY_ALARM 0x01 +#define BATTERY_PACK_ADDR_REMAINING_TIME_ALARM 0x02 +#define BATTERY_PACK_ADDR_BATTERY_MODE 0x03 +#define BATTERY_PACK_ADDR_AT_RATE 0x04 +#define BATTERY_PACK_ADDR_AT_RATE_TIME_TO_FULL 0x05 +#define BATTERY_PACK_ADDR_AT_RATE_TIME_TO_EMPTY 0x06 +#define BATTERY_PACK_ADDR_AT_RATE_OK 0x07 +#define BATTERY_PACK_ADDR_TEMPERATURE 0x08 +#define BATTERY_PACK_ADDR_VOLTAGE 0x09 +#define BATTERY_PACK_ADDR_CURRENT 0x0a +#define BATTERY_PACK_ADDR_AVERAGE_CURRENT 0x0b +#define BATTERY_PACK_ADDR_MAX_ERROR 0x0c +#define BATTERY_PACK_ADDR_RELATIVE_STATE_OF_CHARGE 0x0d +#define BATTERY_PACK_ADDR_ABSOLUTE_STATE_OF_CHARGE 0x0e +#define BATTERY_PACK_ADDR_REMAINING_CAPACITY 0x0f +#define BATTERY_PACK_ADDR_FULL_CHARGE_CAPACITY 0x10 +#define BATTERY_PACK_ADDR_RUN_TIME_TO_EMPTY 0x11 +#define BATTERY_PACK_ADDR_AVERAGE_TIME_TO_EMPTY 0x12 +#define BATTERY_PACK_ADDR_AVERAGE_TIME_TO_FULL 0x13 +#define BATTERY_PACK_ADDR_CHARGING_CURRENT 0x14 +#define BATTERY_PACK_ADDR_CHARGING_VOLTAGE 0x15 +#define BATTERY_PACK_ADDR_BATTERY_STATUS 0x16 +#define BATTERY_PACK_ADDR_CYCLE_COUNT 0x17 +#define BATTERY_PACK_ADDR_DESIGN_CAPACITY 0x18 +#define BATTERY_PACK_ADDR_DESIGN_VOLTAGE 0x19 +#define BATTERY_PACK_ADDR_SPECIFICATION_INFO 0x1a +#define BATTERY_PACK_ADDR_MANUFACTURE_DATE 0x1b +#define BATTERY_PACK_ADDR_SERIAL_NUMBER 0x1c +#define BATTERY_PACK_ADDR_MANUFACTURER_NAME 0x20 +#define BATTERY_PACK_ADDR_DEVICE_NAME 0x21 +#define BATTERY_PACK_ADDR_DEVICE_CHEMISTRY 0x22 + +/// Persist time (in ms) for battery pack status error condition. +static const U32 BATT_STATUS_ERROR_PERSIST_MS = ( 5 * MS_PER_SECOND ); + +// ENUM of battery management values for iterating +typedef enum BatteryManagementEnum +{ + BEGINNING_OF_LIST = 0, + BATTERY_PACK_REMAINING_CAPACITY1, + BATTERY_PACK_BATTERY_STATUS1, + BATTERY_CHARGER_STATUS1, + BATTERY_PACK_REMAINING_CAPACITY_ALARM, + BATTERY_PACK_REMAINING_TIME_ALARM, + BATTERY_PACK_BATTERY_MODE, + BATTERY_PACK_AT_RATE, + BATTERY_PACK_AT_RATE_TIME_TO_FULL, + BATTERY_PACK_REMAINING_CAPACITY2, + BATTERY_PACK_BATTERY_STATUS2, + BATTERY_CHARGER_STATUS2, + BATTERY_PACK_AT_RATE_TIME_TO_EMPTY, + BATTERY_PACK_AT_RATE_OK, + BATTERY_PACK_TEMPERATURE, + BATTERY_PACK_VOLTAGE, + BATTERY_PACK_CURRENT, + BATTERY_PACK_AVERAGE_CURRENT, + BATTERY_PACK_REMAINING_CAPACITY3, + BATTERY_PACK_BATTERY_STATUS3, + BATTERY_CHARGER_STATUS3, + BATTERY_PACK_MAX_ERROR, + BATTERY_PACK_RELATIVE_STATE_OF_CHARGE, + BATTERY_PACK_ABSOLUTE_STATE_OF_CHARGE, + BATTERY_PACK_FULL_CHARGE_CAPACITY, + BATTERY_PACK_RUN_TIME_TO_EMPTY, + BATTERY_PACK_AVERAGE_TIME_TO_EMPTY, + BATTERY_PACK_AVERAGE_TIME_TO_FULL, + BATTERY_PACK_REMAINING_CAPACITY4, + BATTERY_PACK_BATTERY_STATUS4, + BATTERY_CHARGER_STATUS4, + BATTERY_PACK_CHARGING_CURRENT, + BATTERY_PACK_CHARGING_VOLTAGE, + BATTERY_PACK_CYCLE_COUNT, + BATTERY_PACK_DESIGN_CAPACITY, + BATTERY_PACK_DESIGN_VOLTAGE, + BATTERY_PACK_SPECIFICATION_INFO, + BATTERY_PACK_MANUFACTURE_DATE, + BATTERY_PACK_REMAINING_CAPACITY5, + BATTERY_PACK_BATTERY_STATUS5, + BATTERY_CHARGER_STATUS5, + BATTERY_PACK_SERIAL_NUMBER, + BATTERY_PACK_MANUFACTURER_NAME, + BATTERY_PACK_DEVICE_NAME, + BATTERY_PACK_DEVICE_CHEMISTRY, + + END_OF_LIST +} BATTERY_MANAGEMENT_ENUM_T; + // ********** private data ********** -static U16 batteryStatus = 0; ///< Battery current status. -static U16 batteryRelStateOfCharge_pct = 0; ///< Battery pack relative state of charge. -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. - -// ********** private function prototypes ********** +static OVERRIDE_F32_T batteryRemCapacity_mAh = { 0.0, 0.0, 0.0, 0 }; ///< Battery pack remaining capacity (in mAh). +static U32 lastBatteryMonitorTime = 0; ///< Previous battery monitor time. +static U32 commFaultPersistentCount = 0; ///< Persistence count for battery comm fault. +static BATTERY_MANAGEMENT_ENUM_T current_BM_value; +static BATTERY_MANAGER_PAYLOAD_T BatteryManagerData; +static BATTERY_STATUS_PAYLOAD_T BatteryStatusData; +// ********** private function prototypes ********** + +static F32 getBatteryRemainingCapacity_mWh( void ); static void setupI2CDriver( void ); -static BOOL startCommTx( U32 slaveAddr ); static BOOL waitForTxReady( void ); static BOOL waitForRxReady( void ); static BOOL waitForAccessReady( void ); static void generateStopCondition( void ); -static BOOL getBatteryData( U08 command, U16 * dataPtr ); - -/*********************************************************************//** - * @brief - * The initBattery function initializes the Battery module. - * @details Inputs: none - * @details Outputs: Battery module is initialized. - * @return none - *************************************************************************/ -void initBattery( void ) +static BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ); +static BOOL startCommTx( U32 slaveAddr ); +static BOOL getData( U08 command, U16 * dataPtr ); + +// For logging +static void getBatteryManagementData( void ); +static void publishBatteryManagementData( void ); +static void publishBatteryStatusData( void ); + +/*********************************************************************//** + * @brief + * The initBattery function initializes the Battery module. + * @details Inputs: none + * @details Outputs: Battery module is initialized. + * @return none + *************************************************************************/ +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 ); + setupI2CDriver(); -} - -/*********************************************************************//** - * @brief - * The execBatteryMonitor function monitors the battery status. - * @details Inputs: batteryMonitorTimerCounter - * @details Outputs: monitor battery status - * @return none +} + +/*********************************************************************//** + * @brief + * The execBatteryMonitor function monitors the battery status. + * @details Inputs: lastBatteryMonitorTime + * @details Outputs: lastBatteryMonitorTime + * @return none *************************************************************************/ -void execBatteryMonitor( void ) +void execBatteryMonitor( void ) { if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) { lastBatteryMonitorTime = getMSTimerCount(); - - if ( FALSE == hasBatteryChargerStatus ) - { - hasBatteryChargerStatus = TRUE; - - if ( TRUE == startCommTx( BATTERY_CHARGER_SLAVE_ADDRESS ) ) - { - if ( TRUE == getBatteryData( BATTERY_CHARGER_STATUS_CMD, &batteryStatus ) ) - { - if ( ( batteryStatus & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) == 0 ) - { - if ( ++lostACPowerPersistentCount > AC_POWER_LOST_PERSISTENT_COUNT ) - { - -#ifndef DISABLE_BATT_COMM - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST, batteryStatus ); -#endif - } - } - else - { - lostACPowerPersistentCount = 0; - } - } - } - } - else - { - hasBatteryChargerStatus = FALSE; - - if ( TRUE == startCommTx( BATTERY_PACK_SLAVE_ADDRESS ) ) - { - getBatteryData( BATTERY_PACK_REL_STATE_OF_CHARGE_CMD, &batteryRelStateOfCharge_pct ); - } - } + getBatteryManagementData(); } } /*********************************************************************//** * @brief - * The getBatteryRemainingPercent function returns the latest battery relative - * state of charge percentage. - * @details Inputs: none + * The isBatteryCharged function checks if the battery is charged. + * @details Inputs: batteryRelStateOfCharge_pct * @details Outputs: none - * @return battery relative state of charge percentage + * @return TRUE if battery is charged, otherwise FALSE *************************************************************************/ -U16 getBatteryRemainingPercent( void ) +BOOL isBatteryCharged( void ) { - return batteryRelStateOfCharge_pct; + return ( getBatteryRemainingCapacity_mWh() > BATTERY_MIN_CAPACITY_MWH ? TRUE : FALSE ); } /*********************************************************************//** * @brief + * The getBatteryRemainingCapacity_mWh function returns the latest battery + * remaining capacity (in mWh). + * @details Inputs: batteryRemCapacity_mAh + * @details Outputs: none + * @return battery remaining capacity (in mWh). + *************************************************************************/ +static F32 getBatteryRemainingCapacity_mWh( void ) +{ + F32 result = batteryRemCapacity_mAh.data; + + if ( OVERRIDE_KEY == batteryRemCapacity_mAh.override ) + { + result = batteryRemCapacity_mAh.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 @@ -150,52 +247,6 @@ /*********************************************************************//** * @brief - * The startComm function starts i2c communication and verifies slave devices ack. - * @details Inputs: none - * @details Outputs: starts i2c comm in master transmit mode - * @param slaveAddr slave device address - * @return none - *************************************************************************/ -static BOOL startCommTx( U32 slaveAddr ) -{ - BOOL result = FALSE; - - i2cSetSlaveAdd( i2cREG1, slaveAddr ); - - if ( FALSE == i2cIsBusBusy( i2cREG1 ) ) - { - i2cSetDirection( i2cREG1, I2C_TRANSMITTER ); - i2cSetMode( i2cREG1, I2C_MASTER ); - i2cSetStart( i2cREG1 ); - - if ( TRUE == waitForAccessReady() ) - { - if ( 0 == ( i2cREG1->STR & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) - { - result = TRUE; - } - else - { - generateStopCondition(); -#ifndef DISABLE_BATT_COMM - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, slaveAddr ); -#endif - } - } - - } - - if ( FALSE == result ) - { - // Reset i2c bus if cannot communicate with battery slave devices - setupI2CDriver(); - } - - return result; -} - -/*********************************************************************//** - * @brief * The waitForTxReady function checks for transmit ready status from i2c * driver with a timeout. * @details Inputs: none @@ -278,17 +329,94 @@ /*********************************************************************//** * @brief - * The getBatteryStatus function send command to smart battery charger controller - * interface to get battery status. + * The getBatteryData function starts i2c communication with battery device + * and get data based on given command. * @details Inputs: none + * @details Outputs: get data from battery device + * @param slaveAddr battery slave device address + * @param command command to send to the slave device + * @param dataPtr data pointer to store command response data + * @return none + *************************************************************************/ +static BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ) +{ + BOOL result = FALSE; + + if ( TRUE == startCommTx( slaveAddr ) ) + { + U16 data = (U16)( (*dataPtr) & MASK_OFF_MSW ); + if ( TRUE == getData( command, &data ) ) + { + *dataPtr = data; + result = TRUE; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * 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 TRUE if start communication successful, otherwise FALSE + *************************************************************************/ +static BOOL startCommTx( U32 slaveAddr ) +{ + BOOL result = FALSE; + + i2cSetSlaveAdd( i2cREG1, slaveAddr ); + + if ( FALSE == i2cIsBusBusy( i2cREG1 ) ) + { + i2cSetDirection( i2cREG1, I2C_TRANSMITTER ); + i2cSetMode( i2cREG1, I2C_MASTER ); + i2cSetStart( i2cREG1 ); + + if ( TRUE == waitForAccessReady() ) + { + if ( 0 == ( i2cREG1->STR & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) + { + commFaultPersistentCount = 0; + result = TRUE; + } + else + { + generateStopCondition(); + if ( ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENTCE_COUNT ) + { +#ifndef DISABLE_BATT_COMM + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, slaveAddr ); +#endif + } + } + } + } + + if ( FALSE == result ) + { + // Reset i2c bus if cannot communicate with battery slave devices + setupI2CDriver(); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getData function send command to battery interface to get data. + * @details Inputs: none * @details Outputs: get the battery data based on given command * @param command command to send to the slave device * @param dataPtr data pointer to store command response data - * @return TRUE if received battery status, otherwise FALSE + * @return TRUE if received battery data, otherwise FALSE *************************************************************************/ -static BOOL getBatteryData( U08 command, U16 * dataPtr ) +static BOOL getData( U08 command, U16 * dataPtr ) { BOOL result = FALSE; + U16 batteryData = 0; if ( TRUE == waitForTxReady() ) { @@ -305,17 +433,305 @@ { // Due to the double buffer, the master must generate the stop condition after the (message size - 1)th data i2cSetStop( i2cREG1 ); - *dataPtr = i2cReceiveByte( i2cREG1); + batteryData = i2cReceiveByte( i2cREG1); if ( TRUE == waitForRxReady() ) { - *dataPtr = ( *dataPtr | ( i2cReceiveByte( i2cREG1) << 8 ) ); + batteryData = ( batteryData | ( i2cReceiveByte( i2cREG1) << 8 ) ); + *dataPtr = batteryData; result = TRUE; } } } + if ( FALSE == result ) + { + if ( ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENTCE_COUNT ) + { +#ifndef DISABLE_BATT_COMM + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, dataPtr ); +#endif + commFaultPersistentCount = 0; + } + } + return result; } +/*********************************************************************//** + * @brief + * The getBatteryManagementData function accumulates the battery management and status data and + * publishes the two sets of values when complete. Also, the battery remaining capacity is stored, + * the battery status alarm is set if necessary, and the loss of AC power alarm is set if necessary. + * @details Inputs: current_BM_value determines which single value to read + * @details Outputs: batteryRemCapacity_mAh, publishes battery management data and battery status data, + * battery status alarm, AC power loss alarm. + * @return none + *************************************************************************/ +static void getBatteryManagementData(void) +{ + HD_OP_MODE_T opMode = getCurrentOperationMode(); + + // Increment the position in the enum. Starting value is BEGINNING_OF_LIST (0), so on the first + // cycle through this function it will be set to the first valid position (1) + current_BM_value += 1; + + switch( current_BM_value ) + { + case BATTERY_PACK_REMAINING_CAPACITY1: + case BATTERY_PACK_REMAINING_CAPACITY2: + case BATTERY_PACK_REMAINING_CAPACITY3: + case BATTERY_PACK_REMAINING_CAPACITY4: + case BATTERY_PACK_REMAINING_CAPACITY5: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_REMAINING_CAPACITY, &BatteryStatusData.RemainingCapacity); + batteryRemCapacity_mAh.data = (F32)BatteryStatusData.RemainingCapacity * BATTERY_MAH_2_MWH_FACTOR; + break; + + case BATTERY_PACK_BATTERY_STATUS1: + case BATTERY_PACK_BATTERY_STATUS2: + case BATTERY_PACK_BATTERY_STATUS3: + case BATTERY_PACK_BATTERY_STATUS4: + case BATTERY_PACK_BATTERY_STATUS5: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_BATTERY_STATUS, &BatteryStatusData.BatteryStatus); + if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, ( BatteryStatusData.BatteryStatus & BATTERY_PACK_ERROR_BITS ) != 0 ) ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, BatteryStatusData.BatteryStatus ); + } + break; + + case BATTERY_PACK_REMAINING_CAPACITY_ALARM: + getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_REMAINING_CAPACITY_ALARM, &BatteryManagerData.RemainingCapacityAlarm ); + break; + + case BATTERY_PACK_REMAINING_TIME_ALARM: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_REMAINING_TIME_ALARM, &BatteryManagerData.RemainingTimeAlarm); + break; + + case BATTERY_PACK_BATTERY_MODE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_BATTERY_MODE, &BatteryManagerData.BatteryMode); + break; + + case BATTERY_PACK_AT_RATE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_AT_RATE, &BatteryManagerData.AtRate); + break; + + case BATTERY_PACK_AT_RATE_TIME_TO_FULL: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_AT_RATE_TIME_TO_FULL, &BatteryManagerData.AtRateTimeToFull); + break; + + case BATTERY_PACK_AT_RATE_TIME_TO_EMPTY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_AT_RATE_TIME_TO_EMPTY, &BatteryManagerData.AtRateTimeToEmpty); + break; + + case BATTERY_PACK_AT_RATE_OK: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_AT_RATE_OK, &BatteryManagerData.AtRateOK); + break; + + case BATTERY_PACK_TEMPERATURE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_TEMPERATURE, &BatteryManagerData.Temperature); + break; + + case BATTERY_PACK_VOLTAGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_VOLTAGE, &BatteryManagerData.Voltage); + break; + + case BATTERY_PACK_CURRENT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_CURRENT, &BatteryManagerData.Current); + break; + + case BATTERY_PACK_AVERAGE_CURRENT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_AVERAGE_CURRENT, &BatteryManagerData.AverageCurrent); + break; + + case BATTERY_PACK_MAX_ERROR: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_MAX_ERROR, &BatteryManagerData.MaxError); + break; + + case BATTERY_PACK_RELATIVE_STATE_OF_CHARGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_RELATIVE_STATE_OF_CHARGE, &BatteryManagerData.RelativeStateOfCharge); + break; + + case BATTERY_PACK_ABSOLUTE_STATE_OF_CHARGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_ABSOLUTE_STATE_OF_CHARGE, &BatteryManagerData.AbsoluteStateOfCharge); + break; + + case BATTERY_PACK_FULL_CHARGE_CAPACITY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_FULL_CHARGE_CAPACITY, &BatteryManagerData.FullChargeCapacity); + break; + + case BATTERY_PACK_RUN_TIME_TO_EMPTY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_RUN_TIME_TO_EMPTY, &BatteryManagerData.RunTimeToEmpty); + break; + + case BATTERY_PACK_AVERAGE_TIME_TO_EMPTY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_AVERAGE_TIME_TO_EMPTY, &BatteryManagerData.AverageTimeToEmpty); + break; + + case BATTERY_PACK_AVERAGE_TIME_TO_FULL: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_AVERAGE_TIME_TO_FULL, &BatteryManagerData.AverageTimeToFull); + break; + + case BATTERY_PACK_CHARGING_CURRENT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_CHARGING_CURRENT, &BatteryManagerData.ChargingCurrent); + break; + + case BATTERY_PACK_CHARGING_VOLTAGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_CHARGING_VOLTAGE, &BatteryManagerData.ChargingVoltage); + break; + + case BATTERY_PACK_CYCLE_COUNT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_CYCLE_COUNT, &BatteryManagerData.CycleCount); + break; + + case BATTERY_PACK_DESIGN_CAPACITY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_DESIGN_CAPACITY, &BatteryManagerData.DesignCapacity); + break; + + case BATTERY_PACK_DESIGN_VOLTAGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_DESIGN_VOLTAGE, &BatteryManagerData.DesignVoltage); + break; + + case BATTERY_PACK_SPECIFICATION_INFO: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_SPECIFICATION_INFO, &BatteryManagerData.SpecificationInfo); + break; + + case BATTERY_PACK_MANUFACTURE_DATE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_MANUFACTURE_DATE, &BatteryManagerData.ManufactureDate); + break; + + case BATTERY_PACK_SERIAL_NUMBER: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_SERIAL_NUMBER, &BatteryManagerData.SerialNumber); + break; + + case BATTERY_PACK_MANUFACTURER_NAME: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_MANUFACTURER_NAME, &BatteryManagerData.ManufacturerName); + break; + + case BATTERY_PACK_DEVICE_NAME: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_DEVICE_NAME, &BatteryManagerData.DeviceName); + break; + + case BATTERY_PACK_DEVICE_CHEMISTRY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_DEVICE_CHEMISTRY, &BatteryManagerData.DeviceChemistry); + break; + + case BATTERY_CHARGER_STATUS1: + case BATTERY_CHARGER_STATUS2: + case BATTERY_CHARGER_STATUS3: + case BATTERY_CHARGER_STATUS4: + case BATTERY_CHARGER_STATUS5: + if ( TRUE == getBatteryData( BATTERY_CHARGER_SLAVE_ADDRESS, BATTERY_CHARGER_STATUS_CMD, &BatteryStatusData.BatteryChargerStatus ) ) + { + if ( 0 == ( BatteryStatusData.BatteryChargerStatus & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) ) + { +#ifndef DISABLE_BATT_COMM + // Standby, Service, or Treatment Parameters mode + if ( opMode == MODE_STAN || opMode == MODE_SERV || opMode == MODE_TPAR ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST, BatteryStatusData.BatteryChargerStatus ); + } + // Pre-Treatment, Treatment, or Post-Treatment mode + else if( opMode == MODE_PRET || opMode == MODE_TREA || opMode == MODE_POST ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST_SECOND, BatteryStatusData.BatteryChargerStatus ); + } +#endif + } + else + { + clearAlarmCondition( ALARM_ID_HD_AC_POWER_LOST ); + } + } + + publishBatteryStatusData(); + break; + + case END_OF_LIST: + current_BM_value = BEGINNING_OF_LIST; + publishBatteryManagementData(); + break; + + default: + // TODO s/w fault + break; + } + +} + +/*********************************************************************//** + * @brief + * The publishBatteryManagementData function publishes the battery management data + * @details Inputs: BatteryManagerData + * @details Outputs: send battery management data + * @return none + *************************************************************************/ +static void publishBatteryManagementData( void ) +{ + broadcastData( MSG_ID_HD_BATTERY_MANAGEMENT_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&BatteryManagerData, sizeof( BATTERY_MANAGER_PAYLOAD_T ) ); +} + +/*********************************************************************//** + * @brief + * The publishBatteryStatusData function publishes the battery status data + * @details Inputs: BatteryStatusData + * @details Outputs: send battery status data + * @return none + *************************************************************************/ +static void publishBatteryStatusData( void ) +{ + BatteryStatusData.RemainingCapacity = (U32)getBatteryRemainingCapacity_mWh(); + broadcastData( MSG_ID_HD_BATTERY_STATUS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&BatteryStatusData, sizeof( BATTERY_STATUS_PAYLOAD_T ) ); +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetBatteryRemainingPercentOverride function overrides the battery + * remaining percent value. + * @details Inputs: none + * @details Outputs: batteryRemCapacity_mAh + * @param value override battery remaining percent + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBatteryRemainingPercentOverride( F32 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; + batteryRemCapacity_mAh.ovData = value; + batteryRemCapacity_mAh.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetSetBatteryRemainingPercentOverride function resets the + * override of the battery remaining percent value. + * @details Inputs: none + * @details Outputs: batteryRemCapacity_mAh + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetSetBatteryRemainingPercentOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryRemCapacity_mAh.override = OVERRIDE_RESET; + batteryRemCapacity_mAh.ovData = batteryRemCapacity_mAh.ovInitData; + } + + return result; +} + /**@}*/