Index: firmware/App/Drivers/BatteryDriver.c =================================================================== diff -u -r9e14f8c931ea3f2afdedc92de71bd497868a4176 -ree67a27bd69956eb8cfd7c5986538b441b8b7aa7 --- firmware/App/Drivers/BatteryDriver.c (.../BatteryDriver.c) (revision 9e14f8c931ea3f2afdedc92de71bd497868a4176) +++ firmware/App/Drivers/BatteryDriver.c (.../BatteryDriver.c) (revision ee67a27bd69956eb8cfd7c5986538b441b8b7aa7) @@ -28,13 +28,32 @@ // ********** private definitions ********** -#define BATTERY_COMM_TIME_OUT_MS 2 ///< Battery communication time out in ms. +#define BATTERY_COMM_TIME_OUT_MS 2 ///< Battery communication time out in ms. #define BATTERY_CHARGER_SLAVE_ADDRESS 0x6B ///< Battery charger controller device address. #define BATTERY_PACK_SLAVE_ADDRESS 0x0B ///< Battery pack device address. // ********** private data ********** static OVERRIDE_U32_T batteryI2CStatusRegister; ///< Battery I2C Interrupt Status register +/// Lookup table mapping device enum to I2C slave addresses. +const U32 device_addr[NUM_OF_BATTERY_DEVICES] = { + 0x6B, ///< BATTERY_CHARGER_ADDRESS + 0x0B, ///< BATTERY_PACK_ADDRESS +}; +/// Lookup table mapping register enum to register addresses. +const U32 reg_addr[END_OF_LIST] = { + 0x00, ///< BEGINNING_OF_LIST + 0x0f, ///< BATTERY_PACK_REMAINING_CAPACITY + 0x16, ///< BATTERY_PACK_BATTERY_STATUS + 0x0d, ///< BATTERY_PACK_RELATIVE_STATE_OF_CHARGE + 0x10, ///< BATTERY_PACK_FULL_CHARGE_CAPACITY + 0x21, ///< BATTERY_CHARGER_STATUS + 0x08, ///< BATTERY_CHARGER_TS + 0x09, ///< BATTERY_CHARGER_VBAT + 0x35, ///< BATTERY_CHARGER_VSYS + 0x24, ///< BATTERY_CHARGER_FAULT + 0x0a, ///< BATTERY_CHARGER_CURRENT +}; // ********** private function prototypes ********** @@ -57,10 +76,6 @@ *************************************************************************/ void initsetupI2CDriver(void) { -// batteryI2CStatusRegister.data = 0; -// batteryI2CStatusRegister.ovData = 0; -// batteryI2CStatusRegister.ovInitData = 0; -// batteryI2CStatusRegister.override = 0; memset(&batteryI2CStatusRegister, 0, sizeof(OVERRIDE_U32_T)); setupI2CDriver(); } @@ -169,27 +184,20 @@ * and get data based on given command. * @details \b Inputs: none * @details \b 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 + * @param devicesel battery device to communicate with. + * @param registersel register to read from batteru device. + * @param dataPtr pointer to store the register data + * @return TRUE if data received successfully, otherwise FALSE *************************************************************************/ -BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ) +BOOL getBatteryData( BATTERY_DEVICE_ADDRESS_ENUM_T devicesel, BATTERY_MANAGEMENT_ENUM_T registersel, U32 * dataPtr ) { BOOL result = FALSE; - if (slaveAddr) + + if ( TRUE == startCommTx( device_addr[devicesel] ) ) { - slaveAddr = BATTERY_PACK_SLAVE_ADDRESS; - } - else - { - slaveAddr = BATTERY_CHARGER_SLAVE_ADDRESS; - } - if ( TRUE == startCommTx( slaveAddr ) ) - { U16 data = (U16)( (*dataPtr) & MASK_OFF_MSW ); - if ( TRUE == getData( command, &data ) ) + if ( TRUE == getData( reg_addr[registersel], &data ) ) { *dataPtr = data; result = TRUE; @@ -338,6 +346,12 @@ } } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + /*********************************************************************//** * @brief * The testBatteryI2CStatusOverride function overrides the battery I2C Index: firmware/App/Drivers/BatteryDriver.h =================================================================== diff -u -r0b606b5cbf2df52ea9845544155eae947ca4b8ee -ree67a27bd69956eb8cfd7c5986538b441b8b7aa7 --- firmware/App/Drivers/BatteryDriver.h (.../BatteryDriver.h) (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) +++ firmware/App/Drivers/BatteryDriver.h (.../BatteryDriver.h) (revision ee67a27bd69956eb8cfd7c5986538b441b8b7aa7) @@ -29,10 +29,36 @@ * @{ */ +// ********** public definitions ********** + +/// Enumeration of battery data to be read from the battery pack or battery charger in a round-robin fashion. +typedef enum BatteryManagementEnum +{ + BEGINNING_OF_LIST = 0, ///< Start of battery data list + BATTERY_PACK_REMAINING_CAPACITY, ///< Remaining battery capacity (in mAh) + BATTERY_PACK_BATTERY_STATUS, ///< Battery pack status + BATTERY_PACK_RELATIVE_STATE_OF_CHARGE, ///< Battery pack relative state of charge (%) + BATTERY_PACK_FULL_CHARGE_CAPACITY, ///< Battery pack full charge capacity in mAh + BATTERY_CHARGER_STATUS, ///< Battery charger status register 1 (0x21) + BATTERY_CHARGER_TS, ///< Battery charger temperature (in deg K) + BATTERY_CHARGER_VBAT, ///< Battery charger terminal voltage (in mV) + BATTERY_CHARGER_VSYS, ///< Battery charger system voltage (in mV) + BATTERY_CHARGER_FAULT, ///< Battery charger fault status + BATTERY_CHARGER_CURRENT, ///< Battery charger current (in mA) + END_OF_LIST, ///< End of battery data list +} BATTERY_MANAGEMENT_ENUM_T; + +typedef enum BatteryDevicesEnum +{ + BATTERY_CHARGER_ADDRESS = 0, ///< Battery charger at I2C address + BATTERY_PACK_ADDRESS, ///< Battery pack at SMBus address + NUM_OF_BATTERY_DEVICES, ///< Number of battery devices +} BATTERY_DEVICE_ADDRESS_ENUM_T; + // ********** public function prototypes ********** void initsetupI2CDriver(void); -BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ); +BOOL getBatteryData( BATTERY_DEVICE_ADDRESS_ENUM_T devicesel, BATTERY_MANAGEMENT_ENUM_T registersel, U32 * dataPtr ); U32 getI2CStatusRegister( BOOL resetOverride ); BOOL testBatteryI2CStatusOverride( MESSAGE_T *message ); Index: firmware/App/Monitors/Battery.c =================================================================== diff -u -r9e14f8c931ea3f2afdedc92de71bd497868a4176 -ree67a27bd69956eb8cfd7c5986538b441b8b7aa7 --- firmware/App/Monitors/Battery.c (.../Battery.c) (revision 9e14f8c931ea3f2afdedc92de71bd497868a4176) +++ firmware/App/Monitors/Battery.c (.../Battery.c) (revision ee67a27bd69956eb8cfd7c5986538b441b8b7aa7) @@ -28,39 +28,27 @@ // ********** private definitions ********** -#define BATTERY_CHARGER_ADDR_STATUS1 0x21 ///< Battery charger status register 1 -#define BATTERY_CHARGER_ADDR_STATUS2 0x22 ///< Battery charger status register 2. -#define BATTERY_CHARGER_ADDR_FAULT 0x24 ///< Command to get battery charger fault. -#define BATTERY_PACK_ERROR_BITS 0x0F ///< Error codes are in the first byte. - -#define BATTERY_MONITOR_INTERVAL_MS 850 ///< Battery monitor interval in ms. +#define BATTERY_MONITOR_INTERVAL_MS 247 ///< Battery monitor interval in ms. #define BATTERY_COMM_FAULT_COUNT 5 ///< Battery communication fault persistent count before alarming. #define BATTERY_COMM_FAULT_TIMER ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Battery communication fault persistence timer. +#define BATTERY_PACK_ERROR_BITS 0x0F ///< Error codes are in the first byte. // Battery logging -#define BATTERY_CHARGER_ADDR_TS 0x08 ///< Battery thermistor ADC register. -#define BATTERY_CHARGER_ADDR_VBAT 0x09 ///< Battery voltage ADC register. -#define BATTERY_CHARGER_ADDR_VSYS 0x35 ///< Battery system voltage ADC register. -#define BATTERY_CHARGER_ADDR_CURRENT 0x0a ///< Battery current ADC register. -#define BATTERY_PACK_ADDR_RELATIVE_STATE_OF_CHARGE 0x0d ///< Battery pack address relative state of charge. -#define BATTERY_PACK_ADDR_REMAINING_CAPACITY 0x0f ///< Battery pack address remaining capacity. -#define BATTERY_PACK_ADDR_FULL_CHARGE_CAPACITY 0x10 ///< Battery pack address full charge capacity. -#define BATTERY_PACK_ADDR_BATTERY_STATUS 0x16 ///< Battery pack address battery status. #define BATTERY_MIN_CAPACITY_MAH 1950.0F ///< Minimum battery capacity for starting a treatment. // ********** private data ********** /// Persist time (in ms) for battery pack status error condition. -static const U32 BATT_STATUS_ERROR_PERSIST_MS = ( 5 * MS_PER_SECOND ); +static const U32 BATT_STATUS_ERROR_PERSIST_MS = ( 5 * MS_PER_SECOND ); ///< Persist time in ms for battery pack status error condition. static U32 lastBatteryMonitorTime; ///< Previous battery monitor time. static OVERRIDE_U32_T batteryStatus; ///< Battery status static OVERRIDE_U32_T batteryChargerStatus; ///< Battery charger status -static OVERRIDE_F32_T batteryRemCapacity_mAh; ///< Battery pack remaining capacity (in mAh). +static OVERRIDE_U32_T batteryRemCapacity_mAh; ///< Battery pack remaining capacity (in mAh). static BATTERY_MANAGEMENT_ENUM_T current_BM_value; ///< Index for which battery data to read now. static BATTERY_DATA_PAYLOAD_T BatteryData; ///< Record with latest battery data. // ********** private function prototypes ********** -static F32 getBatteryRemainingCapacity_mAh( void ); +static U32 getBatteryRemainingCapacity_mAh( void ); static U32 getBatteryStatus( void ); static U32 getBatteryChargerStatus( void ); static void getBatteryManagementData( void ); @@ -152,9 +140,9 @@ * @details \b Outputs: none * @return latest battery remaining capacity in mAh. *************************************************************************/ -static F32 getBatteryRemainingCapacity_mAh( void ) +static U32 getBatteryRemainingCapacity_mAh( void ) { - F32 result = batteryRemCapacity_mAh.data; + U32 result = batteryRemCapacity_mAh.data; if ( OVERRIDE_KEY == batteryRemCapacity_mAh.override ) { @@ -187,55 +175,55 @@ switch( current_BM_value ) { case BATTERY_PACK_REMAINING_CAPACITY: - getBatteryData (BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_REMAINING_CAPACITY, &BatteryData.RemainingCapacity ); - batteryRemCapacity_mAh.data = (F32)BatteryData.RemainingCapacity; + getBatteryData (BATTERY_PACK_ADDRESS, BATTERY_PACK_REMAINING_CAPACITY, &BatteryData.RemainingCapacity ); + batteryRemCapacity_mAh.data = BatteryData.RemainingCapacity; break; case BATTERY_PACK_BATTERY_STATUS: - getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_BATTERY_STATUS, &BatteryData.BatteryStatus ); + getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_BATTERY_STATUS, &BatteryData.BatteryStatus ); batteryStatus.data = BatteryData.BatteryStatus; if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED, ( getBatteryStatus() & BATTERY_PACK_ERROR_BITS ) != 0 ) ) ) { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED, getBatteryStatus(), BATTERY_PACK_ERROR_BITS ); } break; + case BATTERY_PACK_RELATIVE_STATE_OF_CHARGE: + getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_RELATIVE_STATE_OF_CHARGE, &BatteryData.RelativeStateOfCharge ); + break; + + case BATTERY_PACK_FULL_CHARGE_CAPACITY: + getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_FULL_CHARGE_CAPACITY, &BatteryData.FullChargeCapacity ); + break; + case BATTERY_CHARGER_STATUS: - if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_ADDR_STATUS1, &BatteryData.BatteryChargerStatus ) ) + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_STATUS, &BatteryData.BatteryChargerStatus ) ) { batteryChargerStatus.data = BatteryData.BatteryChargerStatus; } break; - case BATTERY_PACK_RELATIVE_STATE_OF_CHARGE: - getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_RELATIVE_STATE_OF_CHARGE, &BatteryData.RelativeStateOfCharge ); - break; - - case BATTERY_PACK_FULL_CHARGE_CAPACITY: - getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_FULL_CHARGE_CAPACITY, &BatteryData.FullChargeCapacity ); - break; - case BATTERY_CHARGER_TS: - getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_ADDR_TS, &BatteryData.TS ); + getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_TS, &BatteryData.TS ); BatteryData.TS = (BatteryData.TS * 1024.0f) / 100.0F; break; case BATTERY_CHARGER_VBAT: - getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_ADDR_VBAT, &BatteryData.VBAT ); + getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_VBAT, &BatteryData.VBAT ); BatteryData.VBAT = BatteryData.VBAT * 2U; break; case BATTERY_CHARGER_VSYS: - getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_ADDR_VSYS, &BatteryData.VSYS ); + getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_VSYS, &BatteryData.VSYS ); BatteryData.VSYS = BatteryData.VSYS * 2U; break; case BATTERY_CHARGER_FAULT: - getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_ADDR_FAULT, &BatteryData.FaultStatus ); + getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_FAULT, &BatteryData.FaultStatus ); break; case BATTERY_CHARGER_CURRENT: - getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_ADDR_CURRENT, &BatteryData.IBAT ); + getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_CURRENT, &BatteryData.IBAT ); BatteryData.IBAT = BatteryData.IBAT * 2U; break; @@ -275,7 +263,7 @@ *************************************************************************/ static void publishBatteryDataPayload( void ) { - BatteryData.RemainingCapacity = (U32)getBatteryRemainingCapacity_mAh(); + BatteryData.RemainingCapacity = getBatteryRemainingCapacity_mAh(); BatteryData.BatteryStatus = getBatteryStatus(); BatteryData.BatteryChargerStatus = getBatteryChargerStatus(); BatteryData.BatteryI2CStatus = getI2CStatusRegister( FALSE ); @@ -299,7 +287,7 @@ *************************************************************************/ BOOL testBatteryRemainingCapacityOverride( MESSAGE_T *message ) { - BOOL result = f32Override( message, &batteryRemCapacity_mAh ); + BOOL result = f32Override( message, (OVERRIDE_F32_T*) &batteryRemCapacity_mAh ); return result; } Index: firmware/App/Monitors/Battery.h =================================================================== diff -u -r9e14f8c931ea3f2afdedc92de71bd497868a4176 -ree67a27bd69956eb8cfd7c5986538b441b8b7aa7 --- firmware/App/Monitors/Battery.h (.../Battery.h) (revision 9e14f8c931ea3f2afdedc92de71bd497868a4176) +++ firmware/App/Monitors/Battery.h (.../Battery.h) (revision ee67a27bd69956eb8cfd7c5986538b441b8b7aa7) @@ -47,31 +47,6 @@ U32 FullChargeCapacity; ///< Full charge capacity in mAh. } BATTERY_DATA_PAYLOAD_T; -/// Enumeration of battery data to be read from the battery pack or battery charger in a round-robin fashion. -typedef enum BatteryManagementEnum -{ - BEGINNING_OF_LIST = 0, ///< Start of battery data list - BATTERY_PACK_REMAINING_CAPACITY, ///< Remaining battery capacity (in mAh) - BATTERY_PACK_BATTERY_STATUS, ///< Battery pack status - BATTERY_CHARGER_STATUS, ///< Battery charger status register 1 (0x21) - BATTERY_PACK_RELATIVE_STATE_OF_CHARGE, ///< Battery pack relative state of charge (%) - BATTERY_PACK_FULL_CHARGE_CAPACITY, ///< Battery pack full charge capacity in mAh - BATTERY_CHARGER_TS, ///< Battery charger temperature (in deg K) - BATTERY_CHARGER_VBAT, ///< Battery charger terminal voltage (in mV) - BATTERY_CHARGER_VSYS, ///< Battery charger system voltage (in mV) - BATTERY_CHARGER_FAULT, ///< Battery charger fault status - BATTERY_CHARGER_CURRENT, ///< Battery charger current (in mA) - END_OF_LIST, ///< End of battery data list - NUM_OF_BATTERY_PACK_LIST, ///< Number of battery pack list -} BATTERY_MANAGEMENT_ENUM_T; - -typedef enum BatteryDevicesEnum -{ - BATTERY_CHARGER_ADDRESS = 0, ///< Battery charger at I2C address - BATTERY_PACK_ADDRESS, ///< Battery pack at SMBus address - NUM_OF_BATTERY_DEVICES, ///< Number of battery devices -} BATTERY_DEVICE_ADDRESS_ENUM_T; - //********** public function prototypes ********** void initBattery( void );