Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r46b163d19c65e8c21db7b0247bbb1af0dba1ece5 -r52ca7c614ee2a0479c03c6581f3b34fcd2ee4786 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 46b163d19c65e8c21db7b0247bbb1af0dba1ece5) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision 52ca7c614ee2a0479c03c6581f3b34fcd2ee4786) @@ -49,7 +49,41 @@ #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_REMAININGTIMEALARM 0x02 +#define ADDR_BATTERYMODE 0x03 +#define ADDR_ATRATE 0x04 +#define ADDR_ATRATETIMETOFULL 0x05 +#define ADDR_ATRATETIMETOEMPTY 0x06 +#define ADDR_ATRATEOK 0x07 +#define ADDR_TEMPERATURE 0x08 +#define ADDR_VOLTAGE 0x09 +#define ADDR_CURRENT 0x0a +#define ADDR_AVERAGECURRENT 0x0b +#define ADDR_MAXERROR 0x0c +#define ADDR_RELATIVESTATEOFCHARGE 0x0d +#define ADDR_ABSOLUTESTATEOFCHARGE 0x0e +#define ADDR_REMAININGCAPACITY 0x0f +#define ADDR_FULLCHARGECAPACITY 0x10 +#define ADDR_RUNTIMETOEMPTY 0x11 +#define ADDR_AVERAGETIMETOEMPTY 0x12 +#define ADDR_AVERAGETIMETOFULL 0x13 +#define ADDR_CHARGINGCURRENT 0x14 +#define ADDR_CHARGINGVOLTAGE 0x15 +#define ADDR_BATTERYSTATUS 0x16 +#define ADDR_CYCLECOUNT 0x17 +#define ADDR_DESIGNCAPACITY 0x18 +#define ADDR_DESIGNVOLTAGE 0x19 +#define ADDR_SPECIFICATIONINFO 0x1a +#define ADDR_MANUFACTUREDATE 0x1b +#define ADDR_SERIALNUMBER 0x1c +#define ADDR_MANUFACTURERNAME 0x20 +#define ADDR_DEVICENAME 0x21 +#define ADDR_DEVICECHEMISTRY 0x22 + /// Persist time (in ms) for battery pack status error condition. static const U32 BATT_STATUS_ERROR_PERSIST_MS = ( 5 * MS_PER_SECOND ); @@ -64,8 +98,58 @@ static BOOL hasBatteryChargerStatus = FALSE; ///< Flag indicates if battery charger status has been obtained. static U32 commFaultPersistentCount = 0; ///< Persistence count for battery comm fault. -// ********** private function prototypes ********** +// ENUM of battery management values for iterating +typedef enum BatteryManagementEnum +{ + BEGINNING_OF_LIST=0, + REMAININGCAPACITY1, + BATTERYSTATUS1, + REMAININGCAPACITYALARM, + REMAININGTIMEALARM, + BATTERYMODE, + ATRATE, + ATRATETIMETOFULL, + REMAININGCAPACITY2, + BATTERYSTATUS2, + ATRATETIMETOEMPTY, + ATRATEOK, + TEMPERATURE, + VOLTAGE, + CURRENT, + AVERAGECURRENT, + REMAININGCAPACITY3, + BATTERYSTATUS3, + MAXERROR, + RELATIVESTATEOFCHARGE, + ABSOLUTESTATEOFCHARGE, + FULLCHARGECAPACITY, + RUNTIMETOEMPTY, + AVERAGETIMETOEMPTY, + AVERAGETIMETOFULL, + REMAININGCAPACITY4, + BATTERYSTATUS4, + CHARGINGCURRENT, + CHARGINGVOLTAGE, + CYCLECOUNT, + DESIGNCAPACITY, + DESIGNVOLTAGE, + SPECIFICATIONINFO, + MANUFACTUREDATE, + REMAININGCAPACITY5, + BATTERYSTATUS5, + SERIALNUMBER, + MANUFACTURERNAME, + DEVICENAME, + DEVICECHEMISTRY, + END_OF_LIST +} BATTERY_MANAGEMENT_ENUM_T; +static BATTERY_MANAGEMENT_ENUM_T current_BM_value; +static BATTERY_MANAGER_PAYLOAD_T BatteryLoggingData; +static U32 lastBatteryGetDataTime; + +// ********** private function prototypes ********** + static F32 getBatteryRemainingCapacity_mWh( void ); static void setupI2CDriver( void ); static BOOL waitForTxReady( void ); @@ -75,15 +159,19 @@ static BOOL getBatteryData( U32 slaveAddr, U08 command, U16 * dataPtr ); static BOOL startCommTx( U32 slaveAddr ); static BOOL getData( U08 command, U16 * dataPtr ); - -/*********************************************************************//** - * @brief - * The initBattery function initializes the Battery module. + +// For logging +static void getBatteryManagementData( void ); +static void publishBatteryManagementData( void ); + +/*********************************************************************//** + * @brief + * The initBattery function initializes the Battery module. * @details Inputs: none - * @details Outputs: Battery module is initialized. + * @details Outputs: Battery module is initialized. * @return none - *************************************************************************/ -void initBattery( void ) + *************************************************************************/ +void initBattery( void ) { batteryStatus = 0; batteryRelStateOfCharge_pct = 0; @@ -93,22 +181,25 @@ hasBatteryChargerStatus = FALSE; commFaultPersistentCount = 0; + current_BM_value = BEGINNING_OF_LIST; + lastBatteryGetDataTime = getMSTimerCount(); + // 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. +} + +/*********************************************************************//** + * @brief + * The execBatteryMonitor function monitors the battery status. * @details Inputs: lastBatteryMonitorTime, hasBatteryChargerStatus, batteryStatus, - * batteryRelStateOfCharge_pct, batteryPackStatus, lostACPowerPersistentCount + * batteryRelStateOfCharge_pct, batteryPackStatus, lostACPowerPersistentCount * @details Outputs: lastBatteryMonitorTime, hasBatteryChargerStatus, - * lostACPowerPersistentCount, batteryRelStateOfCharge_pct, batteryRemCapacity_mAh - * @return none + * lostACPowerPersistentCount, batteryRelStateOfCharge_pct, batteryRemCapacity_mAh + * @return none *************************************************************************/ -void execBatteryMonitor( void ) +void execBatteryMonitor( void ) { U16 relStateOfCharge_pct; U16 remCapacity_mAh; @@ -162,6 +253,7 @@ } } } + getBatteryManagementData(); } /*********************************************************************//** @@ -411,7 +503,204 @@ return result; } +/*********************************************************************//** + * @brief + * The getBatteryManagementData function accumulates the battery management data and publishes when complete + * @details Inputs: + * @details Outputs: + * @return none + *************************************************************************/ +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); + break; + + case BATTERYSTATUS5: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYSTATUS, &BatteryLoggingData.BatteryStatus5); + break; + + case REMAININGCAPACITYALARM: + getBatteryData( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGCAPACITYALARM, &BatteryLoggingData.RemainingCapacityAlarm ); + break; + + case REMAININGTIMEALARM: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_REMAININGTIMEALARM, &BatteryLoggingData.RemainingTimeAlarm); + break; + + case BATTERYMODE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_BATTERYMODE, &BatteryLoggingData.BatteryMode); + break; + + case ATRATE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_ATRATE, &BatteryLoggingData.AtRate); + break; + + case ATRATETIMETOFULL: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_ATRATETIMETOFULL, &BatteryLoggingData.AtRateTimeToFull); + break; + + case ATRATETIMETOEMPTY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_ATRATETIMETOEMPTY, &BatteryLoggingData.AtRateTimeToEmpty); + break; + + case ATRATEOK: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_ATRATEOK, &BatteryLoggingData.AtRateOK); + break; + + case TEMPERATURE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_TEMPERATURE, &BatteryLoggingData.Temperature); + break; + + case VOLTAGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_VOLTAGE, &BatteryLoggingData.Voltage); + break; + + case CURRENT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_CURRENT, &BatteryLoggingData.Current); + break; + + case AVERAGECURRENT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_AVERAGECURRENT, &BatteryLoggingData.AverageCurrent); + break; + + case MAXERROR: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_MAXERROR, &BatteryLoggingData.MaxError); + break; + + case RELATIVESTATEOFCHARGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_RELATIVESTATEOFCHARGE, &BatteryLoggingData.RelativeStateOfCharge); + break; + + case ABSOLUTESTATEOFCHARGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_ABSOLUTESTATEOFCHARGE, &BatteryLoggingData.AbsoluteStateOfCharge); + break; + + case FULLCHARGECAPACITY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_FULLCHARGECAPACITY, &BatteryLoggingData.FullChargeCapacity); + break; + + case RUNTIMETOEMPTY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_RUNTIMETOEMPTY, &BatteryLoggingData.RunTimeToEmpty); + break; + + case AVERAGETIMETOEMPTY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_AVERAGETIMETOEMPTY, &BatteryLoggingData.AverageTimeToEmpty); + break; + + case AVERAGETIMETOFULL: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_AVERAGETIMETOFULL, &BatteryLoggingData.AverageTimeToFull); + break; + + case CHARGINGCURRENT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_CHARGINGCURRENT, &BatteryLoggingData.ChargingCurrent); + break; + + case CHARGINGVOLTAGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_CHARGINGVOLTAGE, &BatteryLoggingData.ChargingVoltage); + break; + + case CYCLECOUNT: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_CYCLECOUNT, &BatteryLoggingData.CycleCount); + break; + + case DESIGNCAPACITY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_DESIGNCAPACITY, &BatteryLoggingData.DesignCapacity); + break; + + case DESIGNVOLTAGE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_DESIGNVOLTAGE, &BatteryLoggingData.DesignVoltage); + break; + + case SPECIFICATIONINFO: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_SPECIFICATIONINFO, &BatteryLoggingData.SpecificationInfo); + break; + + case MANUFACTUREDATE: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_MANUFACTUREDATE, &BatteryLoggingData.ManufactureDate); + break; + + case SERIALNUMBER: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_SERIALNUMBER, &BatteryLoggingData.SerialNumber); + break; + + case MANUFACTURERNAME: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_MANUFACTURERNAME, &BatteryLoggingData.ManufacturerName); + break; + + case DEVICENAME: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_DEVICENAME, &BatteryLoggingData.DeviceName); + break; + + case DEVICECHEMISTRY: + getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, ADDR_DEVICECHEMISTRY, &BatteryLoggingData.DeviceChemistry); + break; + + case END_OF_LIST: + current_BM_value = BEGINNING_OF_LIST; + publishBatteryManagementData(); + break; + default: + break; + } + +} + +/*********************************************************************//** + * @brief + * The publishBatteryManagementData function publishes the accumulated battery management data + * @details Inputs: + * @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*)&BatteryLoggingData, sizeof( BATTERY_MANAGER_PAYLOAD_T ) ); + +} /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/