Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r52ca7c614ee2a0479c03c6581f3b34fcd2ee4786 -r88dfa298eb85a9153d0bf216916308337096c835 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 52ca7c614ee2a0479c03c6581f3b34fcd2ee4786) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision 88dfa298eb85a9153d0bf216916308337096c835) @@ -35,24 +35,19 @@ #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_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. #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_MONITOR_INTERVAL_MS 250 ///< 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_LOGGING_INTERVAL_MS 300 ///< get a value this often to get all ~30 values in 10 sec -#define ADDR_REMAININGCAPACITYALARM 0x01 +#define ADDR_REMAININGCAPACITYALARM 0x01 // SN - Use "_" between words, add prefix BATTERY_PACK_ to each #define ADDR_REMAININGTIMEALARM 0x02 #define ADDR_BATTERYMODE 0x03 #define ADDR_ATRATE 0x04 @@ -87,22 +82,11 @@ /// 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 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. -static BOOL hasBatteryChargerStatus = FALSE; ///< Flag indicates if battery charger status has been obtained. -static U32 commFaultPersistentCount = 0; ///< Persistence count for battery comm fault. - // ENUM of battery management values for iterating typedef enum BatteryManagementEnum { - BEGINNING_OF_LIST=0, - REMAININGCAPACITY1, + BEGINNING_OF_LIST = 0, + REMAININGCAPACITY1 = BEGINNING_OF_LIST, BATTERYSTATUS1, REMAININGCAPACITYALARM, REMAININGTIMEALARM, @@ -141,12 +125,19 @@ MANUFACTURERNAME, DEVICENAME, DEVICECHEMISTRY, + BATTERY_CHARGER_STATUS, END_OF_LIST } BATTERY_MANAGEMENT_ENUM_T; +// ********** private data ********** + +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 lostACPowerPersistentCount = 0; ///< Persistent count for AC power lost alarm. +static U32 commFaultPersistentCount = 0; ///< Persistence count for battery comm fault. + static BATTERY_MANAGEMENT_ENUM_T current_BM_value; static BATTERY_MANAGER_PAYLOAD_T BatteryLoggingData; -static U32 lastBatteryGetDataTime; // ********** private function prototypes ********** @@ -156,7 +147,7 @@ static BOOL waitForRxReady( void ); static BOOL waitForAccessReady( void ); static void generateStopCondition( void ); -static BOOL getBatteryData( U32 slaveAddr, U08 command, U16 * dataPtr ); +static BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ); static BOOL startCommTx( U32 slaveAddr ); static BOOL getData( U08 command, U16 * dataPtr ); @@ -173,16 +164,13 @@ *************************************************************************/ void initBattery( void ) { - batteryStatus = 0; - batteryRelStateOfCharge_pct = 0; - batteryPackStatus = 0; lastBatteryMonitorTime = 0; lostACPowerPersistentCount = 0; - hasBatteryChargerStatus = FALSE; commFaultPersistentCount = 0; current_BM_value = BEGINNING_OF_LIST; lastBatteryGetDataTime = getMSTimerCount(); + memset( &BatteryLoggingData, 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 ); @@ -201,59 +189,11 @@ *************************************************************************/ void execBatteryMonitor( void ) { - U16 relStateOfCharge_pct; - U16 remCapacity_mAh; - if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) { lastBatteryMonitorTime = getMSTimerCount(); - - if ( FALSE == hasBatteryChargerStatus ) - { - hasBatteryChargerStatus = TRUE; - - if ( TRUE == getBatteryData( BATTERY_CHARGER_SLAVE_ADDRESS, BATTERY_CHARGER_STATUS_CMD, &batteryStatus ) ) - { - if ( 0 == ( batteryStatus & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) ) - { - 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 - { - clearAlarmCondition( ALARM_ID_HD_AC_POWER_LOST ); - lostACPowerPersistentCount = 0; - } - } - } - else - { - hasBatteryChargerStatus = FALSE; - - if ( TRUE == getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_REL_STATE_OF_CHARGE_CMD, &relStateOfCharge_pct ) ) - { - 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 ( ( 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 ); - } - } - } + getBatteryManagementData(); } - getBatteryManagementData(); } /*********************************************************************//** @@ -396,13 +336,15 @@ * @param dataPtr data pointer to store command response data * @return none *************************************************************************/ -static BOOL getBatteryData( U32 slaveAddr, U08 command, U16 * dataPtr ) +static BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ) { BOOL result = FALSE; if ( TRUE == startCommTx( slaveAddr ) ) { - if ( TRUE == getData( command, dataPtr ) ) + U16 data = (U16)( *dataPtr & MASK_OFF_MSW ); + + if ( TRUE == getData( command, &data ) ) { result = TRUE; } @@ -512,56 +454,29 @@ *************************************************************************/ static void getBatteryManagementData(void) { - //check if interval has elapsed - if ( FALSE == didTimeout( lastBatteryGetDataTime, BATTERY_LOGGING_INTERVAL_MS ) ) - { - return; - } - lastBatteryGetDataTime = getMSTimerCount(); - current_BM_value += 1; - switch( current_BM_value ) { case REMAININGCAPACITY1: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITY, &BatteryLoggingData.RemainingCapacity1); - break; - - case BATTERYSTATUS1: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYSTATUS, &BatteryLoggingData.BatteryStatus1); - break; - case REMAININGCAPACITY2: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITY, &BatteryLoggingData.RemainingCapacity2); - break; - - case BATTERYSTATUS2: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYSTATUS, &BatteryLoggingData.BatteryStatus2); - break; - case REMAININGCAPACITY3: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITY, &BatteryLoggingData.RemainingCapacity3); - break; - - case BATTERYSTATUS3: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYSTATUS, &BatteryLoggingData.BatteryStatus3); - break; - case REMAININGCAPACITY4: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITY, &BatteryLoggingData.RemainingCapacity4); - break; - - case BATTERYSTATUS4: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYSTATUS, &BatteryLoggingData.BatteryStatus4); - break; - case REMAININGCAPACITY5: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITY, &BatteryLoggingData.RemainingCapacity5); + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITY, &BatteryLoggingData.RemainingCapacity); + batteryRemCapacity_mAh.data = (F32)BatteryLoggingData.RemainingCapacity * BATTERY_MAH_2_MWH_FACTOR; break; + case BATTERYSTATUS1: + case BATTERYSTATUS2: + case BATTERYSTATUS3: + case BATTERYSTATUS4: case BATTERYSTATUS5: - getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYSTATUS, &BatteryLoggingData.BatteryStatus5); + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYSTATUS, &BatteryLoggingData.BatteryStatus); + if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, ( BatteryLoggingData.BatteryStatus & BATTERY_PACK_ERROR_BITS ) != 0 ) ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, BatteryLoggingData.BatteryStatus ); + } break; - + case REMAININGCAPACITYALARM: getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITYALARM, &BatteryLoggingData.RemainingCapacityAlarm ); break; @@ -678,16 +593,42 @@ getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_DEVICECHEMISTRY, &BatteryLoggingData.DeviceChemistry); break; + case BATTERY_CHARGER_STATUS: + if ( TRUE == getBatteryData( BATTERY_CHARGER_SLAVE_ADDRESS, BATTERY_CHARGER_STATUS_CMD, &BatteryLoggingData.BatteryChargerStatus ) ) + { + if ( 0 == ( BatteryLoggingData.BatteryChargerStatus & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) ) + { + if ( ++lostACPowerPersistentCount > AC_POWER_LOST_PERSISTENT_COUNT ) + { +#ifndef DISABLE_BATT_COMM + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST, BatteryLoggingData.BatteryChargerStatus ); +#endif + } + } + else + { + clearAlarmCondition( ALARM_ID_HD_AC_POWER_LOST ); + lostACPowerPersistentCount = 0; + } + } + case END_OF_LIST: current_BM_value = BEGINNING_OF_LIST; publishBatteryManagementData(); break; + default: + // TODO s/w fault break; } + // Go to next value for next time + current_BM_value += 1; } + + + /*********************************************************************//** * @brief * The publishBatteryManagementData function publishes the accumulated battery management data Index: firmware/App/Drivers/Battery.h =================================================================== diff -u -r52ca7c614ee2a0479c03c6581f3b34fcd2ee4786 -r88dfa298eb85a9153d0bf216916308337096c835 --- firmware/App/Drivers/Battery.h (.../Battery.h) (revision 52ca7c614ee2a0479c03c6581f3b34fcd2ee4786) +++ firmware/App/Drivers/Battery.h (.../Battery.h) (revision 88dfa298eb85a9153d0bf216916308337096c835) @@ -32,22 +32,18 @@ /// Payload record structure for battery module data broadcast message typedef struct { - U32 RemainingCapacity1; - U32 BatteryStatus1; // + U32 RemainingCapacity; + U32 BatteryStatus; // U32 RemainingCapacityAlarm; // U32 RemainingTimeAlarm; // U32 BatteryMode; // U32 AtRate; // - U32 RemainingCapacity2; // inserting multiple instances of RemainingCapacity - U32 BatteryStatus2; // inserting multiple instances of BatteryStatus U32 AtRateTimeToFull; // U32 AtRateTimeToEmpty; // U32 AtRateOK; // U32 Temperature; // U32 Voltage; // U32 Current; // - U32 RemainingCapacity3; // - U32 BatteryStatus3; // U32 AverageCurrent; // U32 MaxError; // U32 RelativeStateOfCharge; // @@ -57,20 +53,17 @@ U32 AverageTimeToEmpty; // U32 AverageTimeToFull; // U32 ChargingCurrent; // - U32 RemainingCapacity4; // - U32 BatteryStatus4; // U32 ChargingVoltage; // U32 CycleCount; // U32 DesignCapacity; // U32 DesignVoltage; // U32 SpecificationInfo; // U32 ManufactureDate; // U32 SerialNumber; // - U32 RemainingCapacity5; // - U32 BatteryStatus5; // U32 ManufacturerName; // U32 DeviceName; // U32 DeviceChemistry; // + U32 BatteryChargerStatus; // } BATTERY_MANAGER_PAYLOAD_T; // ********** public function prototypes **********