Index: firmware/App/Drivers/BatteryDriver.c =================================================================== diff -u -r78d196593cdcc9c3cd7166f02a99a7408a3e0b32 -rbbc62d810da9b094ea4f0fc765e1586ed37f0b34 --- firmware/App/Drivers/BatteryDriver.c (.../BatteryDriver.c) (revision 78d196593cdcc9c3cd7166f02a99a7408a3e0b32) +++ firmware/App/Drivers/BatteryDriver.c (.../BatteryDriver.c) (revision bbc62d810da9b094ea4f0fc765e1586ed37f0b34) @@ -34,16 +34,16 @@ // ********** private data ********** -static OVERRIDE_U32_T batteryI2CStatusRegister; ///< Battery I2C Interrupt Status register +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 +static const U32 deviceAddr[NUM_OF_BATTERY_DEVICES] = { + BATTERY_CHARGER_SLAVE_ADDRESS, ///< BATTERY_CHARGER_ADDRESS + BATTERY_PACK_SLAVE_ADDRESS, ///< BATTERY_PACK_ADDRESS }; /// Lookup table mapping register enum to register addresses. -const U32 reg_addr[NUM_OF_BATTERY_REGISTERS-1] = { +static const U32 regAddr[NUM_OF_BATTERY_REGISTERS - 1] = { 0x00, ///< BEGINNING_OF_LIST 0x0f, ///< BATTERY_PACK_REMAINING_CAPACITY 0x16, ///< BATTERY_PACK_BATTERY_STATUS @@ -70,18 +70,18 @@ /*********************************************************************//** * @brief - * The initsetupI2CDriver function initializes the I2C driver for battery + * The initSetupI2cDriver function initializes the I2C driver for battery * communication. * @details \b Inputs: none * @details \b Outputs: I2C driver initialized. * @return none *************************************************************************/ -void initsetupI2CDriver(void) +void initSetupI2cDriver( void ) { - batteryI2CStatusRegister.data = 0; - batteryI2CStatusRegister.ovData = 0; - batteryI2CStatusRegister.ovInitData = 0; - batteryI2CStatusRegister.override = OVERRIDE_RESET; + batteryI2cStatusRegister.data = 0; + batteryI2cStatusRegister.ovData = 0; + batteryI2cStatusRegister.ovInitData = 0; + batteryI2cStatusRegister.override = OVERRIDE_RESET; setupI2CDriver(); } @@ -197,18 +197,19 @@ BOOL getBatteryData( BATTERY_DEVICE_ADDRESS_ENUM_T deviceSel, BATTERY_MANAGEMENT_ENUM_T registerSel, U32 * dataPtr ) { BOOL result = FALSE; - - if ( TRUE == startCommTx( device_addr[deviceSel] ) ) + if ( ( deviceSel < NUM_OF_BATTERY_DEVICES ) && ( registerSel < NUM_OF_BATTERY_REGISTERS -1 ) ) { - U16 data = (U16)( (*dataPtr) & MASK_OFF_MSW ); - - if ( TRUE == getData( reg_addr[registerSel], &data ) ) + if ( TRUE == startCommTx( deviceAddr[deviceSel] ) ) { - *dataPtr = data; - result = TRUE; + U16 responseData = (U16)( (*dataPtr) & MASK_OFF_MSW ); + + if ( TRUE == getData( regAddr[registerSel], &responseData ) ) + { + *dataPtr = responseData; + result = TRUE; + } } } - return result; } @@ -237,7 +238,7 @@ if ( TRUE == waitForAccessReady() ) { - if ( 0 == ( getI2CStatusRegister( TRUE ) & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) + if ( 0 == ( getI2cStatusRegister( TRUE ) & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) { result = TRUE; } @@ -273,7 +274,7 @@ static BOOL getData( U08 command, U16 * dataPtr ) { BOOL result = FALSE; - U16 batteryData = 0; + U16 responseData = 0; if ( TRUE == waitForTxReady() ) { @@ -290,12 +291,12 @@ { // Due to the double buffer, the master must generate the stop condition after the (message size - 1)th data i2cSetStop( i2cREG1 ); - batteryData = i2cReceiveByte( i2cREG1); + responseData = i2cReceiveByte( i2cREG1 ); if ( TRUE == waitForRxReady() ) { - batteryData = ( batteryData | ( i2cReceiveByte( i2cREG1) << 8 ) ); - *dataPtr = batteryData; + responseData = ( responseData | ( i2cReceiveByte( i2cREG1 ) << 8 ) ); + *dataPtr = responseData; result = TRUE; } else @@ -310,23 +311,23 @@ /*********************************************************************//** * @brief - * The getI2CStatusRegister function returns the current I2C status + * The getI2cStatusRegister function returns the current I2C status * register value. - * @details \b Inputs: batteryI2CStatusRegister, i2cREG1->STR + * @details \b Inputs: batteryI2cStatusRegister, i2cREG1->STR * @details \b Outputs: none * @param resetOverride flag to reset the override after reading. * @return current I2C interrupt status register value. *************************************************************************/ -U32 getI2CStatusRegister( BOOL resetOverride ) +U32 getI2cStatusRegister( BOOL resetOverride ) { U32 result = i2cREG1->STR; - if ( OVERRIDE_KEY == batteryI2CStatusRegister.override ) + if ( OVERRIDE_KEY == batteryI2cStatusRegister.override ) { - result = batteryI2CStatusRegister.ovData; + result = batteryI2cStatusRegister.ovData; if ( TRUE == resetOverride ) { - batteryI2CStatusRegister.override = OVERRIDE_RESET; - batteryI2CStatusRegister.ovData = batteryI2CStatusRegister.ovInitData; + batteryI2cStatusRegister.override = OVERRIDE_RESET; + batteryI2cStatusRegister.ovData = batteryI2cStatusRegister.ovInitData; } } @@ -356,20 +357,19 @@ * TEST SUPPORT FUNCTIONS *************************************************************************/ - /*********************************************************************//** * @brief - * The testBatteryI2CStatusOverride function overrides the battery I2C + * The testBatteryI2cStatusOverride function overrides the battery I2C * status register value. * @details \b Inputs: none - * @details \b Outputs: batteryI2CStatusRegister + * @details \b Outputs: batteryI2cStatusRegister * @param message override message from Diamond which includes the * I2C status register value to override to. * @return TRUE if override request is successful, FALSE if not *************************************************************************/ -BOOL testBatteryI2CStatusOverride( MESSAGE_T *message ) +BOOL testBatteryI2cStatusOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &batteryI2CStatusRegister, 0x0, 0xFFFFFFFF ); + BOOL result = u32Override( message, &batteryI2cStatusRegister, OFF, HEX_32_BIT_FULL_SCALE ); return result; } Index: firmware/App/Drivers/BatteryDriver.h =================================================================== diff -u -r78d196593cdcc9c3cd7166f02a99a7408a3e0b32 -rbbc62d810da9b094ea4f0fc765e1586ed37f0b34 --- firmware/App/Drivers/BatteryDriver.h (.../BatteryDriver.h) (revision 78d196593cdcc9c3cd7166f02a99a7408a3e0b32) +++ firmware/App/Drivers/BatteryDriver.h (.../BatteryDriver.h) (revision bbc62d810da9b094ea4f0fc765e1586ed37f0b34) @@ -45,24 +45,23 @@ BATTERY_CHARGER_VSYS, ///< Battery charger system voltage (in mV) BATTERY_CHARGER_FAULT, ///< Battery charger fault status BATTERY_CHARGER_CURRENT, ///< Battery charger current (in mA) - NUM_OF_BATTERY_REGISTERS, ///< Number of battery registers BATTERY_END_OF_LIST_TIME_TO_PUBLISH, ///< End of battery data list - + NUM_OF_BATTERY_REGISTERS ///< Number of battery registers } 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 + NUM_OF_BATTERY_DEVICES ///< Number of battery devices } BATTERY_DEVICE_ADDRESS_ENUM_T; // ********** public function prototypes ********** -void initsetupI2CDriver(void); +void initSetupI2cDriver( void ); BOOL getBatteryData( BATTERY_DEVICE_ADDRESS_ENUM_T deviceSel, BATTERY_MANAGEMENT_ENUM_T registerSel, U32 * dataPtr ); -U32 getI2CStatusRegister( BOOL resetOverride ); -BOOL testBatteryI2CStatusOverride( MESSAGE_T *message ); +U32 getI2cStatusRegister( BOOL resetOverride ); +BOOL testBatteryI2cStatusOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Monitors/Battery.c =================================================================== diff -u -r78d196593cdcc9c3cd7166f02a99a7408a3e0b32 -rbbc62d810da9b094ea4f0fc765e1586ed37f0b34 --- firmware/App/Monitors/Battery.c (.../Battery.c) (revision 78d196593cdcc9c3cd7166f02a99a7408a3e0b32) +++ firmware/App/Monitors/Battery.c (.../Battery.c) (revision bbc62d810da9b094ea4f0fc765e1586ed37f0b34) @@ -19,6 +19,7 @@ #include "BatteryDriver.h" #include "Messaging.h" #include "PersistentAlarm.h" +#include "TestSupport.h" #include "Timers.h" /** @@ -29,29 +30,28 @@ // ********** private definitions ********** #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_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. -#define BATTERY_MIN_CAPACITY_MAH 1950.0F ///< Minimum battery capacity for starting a treatment. - +#define BATTERY_MIN_CAPACITY_MAH 1950U ///< Minimum battery capacity for starting a treatment. +#define BATTERY_CHARGER_ERROR_BITS 0x08 ///< Error codes are in the first byte of third bit. +#define BATTERY_CHARGER_FAULTY_ERROR_BITS 0XFF ///< Error codes are in the first and second byte. // ********** private data ********** -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_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. -static BATTERY_DATA_PAYLOAD_T batterydata; ///< Record with latest battery data. +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 batteryRegisterOverrides[ NUM_OF_BATTERY_REGISTERS-1 ]; ///< Battery register data and overrides. +static BATTERY_MANAGEMENT_ENUM_T currentBmValue; ///< Index for which battery data to read now. +static BATTERY_DATA_PAYLOAD_T batteryData; ///< Record with latest battery data. // ********** private function prototypes ********** -static U32 getBatteryRemainingCapacity_mAh( void ); -static U32 getBatteryStatus( void ); -static U32 getBatteryChargerStatus( void ); +static void initBatteryRegisterOverrides( void ); +static void setBatteryRegisterData( BATTERY_MANAGEMENT_ENUM_T registerSel, U32 data ); +static U32 getBatteryRegisterValue( BATTERY_MANAGEMENT_ENUM_T registerSel ); static void getBatteryManagementData( void ); static void publishBatteryDataPayload( void ); +static void checkPersistentAlarmTrigger( ALARM_ID_T alarmID, BATTERY_MANAGEMENT_ENUM_T registerSel, U08 errorBits ); /*********************************************************************//** * @brief @@ -62,23 +62,12 @@ *************************************************************************/ void initBattery( void ) { - initsetupI2CDriver(); - current_BM_value = BEGINNING_OF_LIST; + initSetupI2cDriver(); + currentBmValue = BEGINNING_OF_LIST; lastBatteryMonitorTime = 0; - batteryStatus.data = 0; - batteryStatus.ovData = 0; - batteryStatus.ovInitData = 0; - batteryStatus.override = OVERRIDE_RESET; - batteryChargerStatus.data = 0; - batteryChargerStatus.ovData = 0; - batteryChargerStatus.ovInitData = 0; - batteryChargerStatus.override = OVERRIDE_RESET; - batteryRemCapacity_mAh.data = 0; - batteryRemCapacity_mAh.ovData = 0; - batteryRemCapacity_mAh.ovInitData = 0; - batteryRemCapacity_mAh.override = OVERRIDE_RESET; - memset( &BatteryData, 0, sizeof( BATTERY_DATA_PAYLOAD_T ) ); - memset( &batterydata, 0, sizeof( BATTERY_DATA_PAYLOAD_T ) ); + initBatteryRegisterOverrides(); + memset( &batteryData, 0, sizeof( BATTERY_DATA_PAYLOAD_T ) ); + // Initialize persistent alarm for battery pack status error initPersistentAlarm( ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED, 0, BATT_STATUS_ERROR_PERSIST_MS ); // Initialize bad message CRC time windowed count @@ -87,78 +76,101 @@ /*********************************************************************//** * @brief - * The execBatteryMonitor function monitors the battery status by reading - * battery data in a round robin fashion and publishing the results. - * @details \b Inputs: lastBatteryMonitorTime - * @details \b Outputs: lastBatteryMonitorTime + * The initBatteryRegisterOverrides function initializes the battery register + * data/override records. + * @details \b Inputs: none + * @details \b Outputs: batteryRegisterOverrides[] * @return none *************************************************************************/ -void execBatteryMonitor( void ) +static void initBatteryRegisterOverrides( void ) { - if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) + U32 registerIdx; + + for ( registerIdx = 0; registerIdx < NUM_OF_BATTERY_REGISTERS-1; registerIdx++ ) { - lastBatteryMonitorTime = getMSTimerCount(); - getBatteryManagementData(); + batteryRegisterOverrides[ registerIdx ].data = 0U; + batteryRegisterOverrides[ registerIdx ].ovData = 0U; + batteryRegisterOverrides[ registerIdx ].ovInitData = 0U; + batteryRegisterOverrides[ registerIdx ].override = OVERRIDE_RESET; } } /*********************************************************************//** * @brief - * The getBatteryChargerStatus function returns the latest battery - * charger status. - * @details \b Inputs: batteryChargerStatus - * @details \b Outputs: none - * @return latest battery charger status value. + * The setBatteryRegisterData function updates the raw battery register data. + * @details \b Inputs: batteryRegisterOverrides[] + * @details \b Outputs: batteryRegisterOverrides[] + * @param registerSel battery register to update + * @param data value to store for the given register + * @return none *************************************************************************/ -static U32 getBatteryChargerStatus( void ) +static void setBatteryRegisterData( BATTERY_MANAGEMENT_ENUM_T registerSel, U32 data ) { - U32 result = batteryChargerStatus.data; - - if ( OVERRIDE_KEY == batteryChargerStatus.override ) + if ( registerSel < NUM_OF_BATTERY_REGISTERS-1 ) { - result = batteryChargerStatus.ovData; + batteryRegisterOverrides[ registerSel ].data = data; } - - return result; } /*********************************************************************//** * @brief - * The getBatteryStatus function returns the latest battery pack status. - * @details \b Inputs: batteryStatus + * The getBatteryRegisterValue function returns the current battery register + * value after applying any active override. + * @details \b Inputs: batteryRegisterOverrides[] * @details \b Outputs: none - * @return latest battery pack status value. + * @param registerSel battery register to read + * @return current battery register value *************************************************************************/ -static U32 getBatteryStatus( void ) +static U32 getBatteryRegisterValue( BATTERY_MANAGEMENT_ENUM_T registerSel ) { - U32 result = batteryStatus.data; + U32 result = 0U; - if ( OVERRIDE_KEY == batteryStatus.override ) + if ( registerSel < NUM_OF_BATTERY_REGISTERS-1 ) { - result = batteryStatus.ovData; + result = getU32OverrideValue( &batteryRegisterOverrides[ registerSel ] ); } return result; } /*********************************************************************//** * @brief - * The getBatteryRemainingCapacity_mAh function returns the latest battery - * remaining capacity in mAh. - * @details \b Inputs: batteryRemCapacity_mAh - * @details \b Outputs: none - * @return latest battery remaining capacity in mAh. + * The checkPersistentAlarmTrigger function checks whether the specified + * battery register contains any error bits and triggers a persistent alarm + * when the condition remains active for the configured persistence period. + * @details \b Inputs: batteryRegisterOverrides, persistent alarm state + * @details \b Outputs: Alarm generated if error condition persists + * @param alarmID alarm identifier associated with the error condition + * @param registerSel battery register to evaluate + * @param errorBits bit mask containing the error bits to monitor + * @return none *************************************************************************/ -static U32 getBatteryRemainingCapacity_mAh( void ) +static void checkPersistentAlarmTrigger( ALARM_ID_T alarmID, BATTERY_MANAGEMENT_ENUM_T registerSel, U08 errorBits ) { - U32 result = batteryRemCapacity_mAh.data; - - if ( OVERRIDE_KEY == batteryRemCapacity_mAh.override ) + if ( registerSel < NUM_OF_BATTERY_REGISTERS-1 ) { - result = batteryRemCapacity_mAh.ovData; + if ( TRUE == isPersistentAlarmTriggered( alarmID, ( getBatteryRegisterValue( registerSel ) & errorBits ) != 0U ) ) + { + SET_ALARM_WITH_2_U32_DATA( alarmID, getBatteryRegisterValue( registerSel ), errorBits ); + } } +} - return result; +/*********************************************************************//** + * @brief + * The execBatteryMonitor function monitors the battery status by reading + * battery data in a round robin fashion and publishing the results. + * @details \b Inputs: lastBatteryMonitorTime + * @details \b Outputs: lastBatteryMonitorTime + * @return none + *************************************************************************/ +void execBatteryMonitor( void ) +{ + if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) + { + lastBatteryMonitorTime = getMSTimerCount(); + getBatteryManagementData(); + } } /*********************************************************************//** @@ -170,80 +182,110 @@ * pack status error bits are set. * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if an invalid battery * management data state is detected. - * @details \b Inputs: current_BM_value, BatteryData - * @details \b Outputs: current_BM_value, batteryRemCapacity_mAh, - * batteryStatus, batteryChargerStatus, BatteryData + * @details \b Inputs: currentBmValue, batteryRegisterOverrides[] + * @details \b Outputs: currentBmValue, batteryRegisterOverrides[] * @return none *************************************************************************/ -static void getBatteryManagementData(void) +static void getBatteryManagementData( void ) { + U32 responseData; + // 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; + currentBmValue += 1; - switch( current_BM_value ) + switch( currentBmValue ) { case BATTERY_PACK_REMAINING_CAPACITY: - getBatteryData (BATTERY_PACK_ADDRESS, BATTERY_PACK_REMAINING_CAPACITY, &batterydata.RemainingCapacity ); - batteryRemCapacity_mAh.data = batterydata.RemainingCapacity; + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_REMAINING_CAPACITY, &responseData ) ) + { + setBatteryRegisterData( BATTERY_PACK_REMAINING_CAPACITY, responseData ); + } break; case BATTERY_PACK_BATTERY_STATUS: - 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 ) ) ) + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_BATTERY_STATUS, &responseData ) ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED, getBatteryStatus(), BATTERY_PACK_ERROR_BITS ); + setBatteryRegisterData( BATTERY_PACK_BATTERY_STATUS, responseData ); + checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED, BATTERY_PACK_BATTERY_STATUS, 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; + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_RELATIVE_STATE_OF_CHARGE, &responseData ) ) + { + setBatteryRegisterData( BATTERY_PACK_RELATIVE_STATE_OF_CHARGE, responseData ); + } + break; case BATTERY_PACK_FULL_CHARGE_CAPACITY: - getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_FULL_CHARGE_CAPACITY, &batterydata.FullChargeCapacity ); + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_FULL_CHARGE_CAPACITY, &responseData ) ) + { + setBatteryRegisterData( BATTERY_PACK_FULL_CHARGE_CAPACITY, responseData ); + } break; case BATTERY_CHARGER_STATUS: - if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_STATUS, &batterydata.BatteryChargerStatus ) ) + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_STATUS, &responseData ) ) { - batteryChargerStatus.data = batterydata.BatteryChargerStatus; + setBatteryRegisterData( BATTERY_CHARGER_STATUS, responseData ); + checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_CHARGER_ERROR_DETECTED, BATTERY_CHARGER_STATUS, BATTERY_CHARGER_ERROR_BITS ); } break; case BATTERY_CHARGER_TS: - getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_TS, &batterydata.TS ); - batterydata.TS = (batterydata.TS * 1024.0f) / 100.0F; + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_TS, &responseData ) ) + { + setBatteryRegisterData( BATTERY_CHARGER_TS, (U32)( ( responseData * 1024.0F ) / 100.0F ) ); + } break; case BATTERY_CHARGER_VBAT: - getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_VBAT, &batterydata.VBAT ); - batterydata.VBAT = batterydata.VBAT * 2U; + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_VBAT, &responseData ) ) + { + setBatteryRegisterData( BATTERY_CHARGER_VBAT, (U32)( responseData * 2U ) ); + } break; case BATTERY_CHARGER_VSYS: - getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_VSYS, &batterydata.VSYS ); - batterydata.VSYS = batterydata.VSYS * 2U; + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_VSYS, &responseData ) ) + { + setBatteryRegisterData( BATTERY_CHARGER_VSYS, (U32)( responseData * 2U ) ); + } break; case BATTERY_CHARGER_FAULT: - getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_FAULT, &batterydata.FaultStatus ); + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_FAULT, &responseData ) ) + { + setBatteryRegisterData( BATTERY_CHARGER_FAULT, responseData ); + checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_CHARGER_ERROR_DETECTED, BATTERY_CHARGER_FAULT, BATTERY_CHARGER_FAULTY_ERROR_BITS ); + } break; case BATTERY_CHARGER_CURRENT: - getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_CHARGER_CURRENT, &batterydata.IBAT ); - batterydata.IBAT = batterydata.IBAT * 2U; - current_BM_value += 1; /// To avoid default case and execute the publish data in a next iteration + responseData = 0U; + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_CURRENT, &responseData ) ) + { + setBatteryRegisterData( BATTERY_CHARGER_CURRENT, (U32)( responseData * 2U ) ); + } break; case BATTERY_END_OF_LIST_TIME_TO_PUBLISH: - current_BM_value = BEGINNING_OF_LIST; + currentBmValue = BEGINNING_OF_LIST; publishBatteryDataPayload(); break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_BATTERY_MANAGEMENT_DATA_STATE, current_BM_value ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_BATTERY_MANAGEMENT_DATA_STATE, currentBmValue ); break; } } @@ -252,90 +294,58 @@ * @brief * The isBatteryCharged function checks if the battery has sufficient * charge to allow starting a treatment. - * @details \b Inputs: batteryRemCapacity_mAh + * @details \b Inputs: batteryRegisterOverrides[] * @details \b Outputs: none * @return TRUE if battery has sufficient charge, otherwise FALSE *************************************************************************/ BOOL isBatteryCharged( void ) { - return ( getBatteryRemainingCapacity_mAh() > BATTERY_MIN_CAPACITY_MAH ? TRUE : FALSE ); + return ( getBatteryRegisterValue( BATTERY_PACK_REMAINING_CAPACITY ) > BATTERY_MIN_CAPACITY_MAH ? TRUE : FALSE ); } /*********************************************************************//** * @brief * The publishBatteryDataPayload function updates and publishes the battery * data payload over CAN. * @details \b Message \b Sent: MSG_ID_TD_BATTERY_DATA - * @details \b Inputs: BatteryData, batteryRemCapacity_mAh, batteryStatus, - * batteryChargerStatus, batteryI2CStatusRegister - * @details \b Outputs: BatteryData + * @details \b Inputs: batteryRegisterOverrides[], batteryData + * @details \b Outputs: batteryData * @return none *************************************************************************/ static void publishBatteryDataPayload( void ) { - BatteryData.RemainingCapacity = getBatteryRemainingCapacity_mAh(); - BatteryData.BatteryStatus = getBatteryStatus(); - BatteryData.BatteryChargerStatus = getBatteryChargerStatus(); - BatteryData.BatteryI2CStatus = getI2CStatusRegister( FALSE ); - BatteryData.FaultStatus = batterydata.FaultStatus; - BatteryData.FullChargeCapacity = batterydata.FullChargeCapacity; - BatteryData.IBAT = batterydata.IBAT; - BatteryData.RelativeStateOfCharge = batterydata.RelativeStateOfCharge; - BatteryData.TS = batterydata.TS; - BatteryData.VBAT = batterydata.VBAT; - BatteryData.VSYS = batterydata.VSYS; - broadcastData( MSG_ID_TD_BATTERY_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&BatteryData, sizeof( BATTERY_DATA_PAYLOAD_T ) ); + batteryData.remainingCapacity = getBatteryRegisterValue( BATTERY_PACK_REMAINING_CAPACITY ); + batteryData.batteryStatus = getBatteryRegisterValue( BATTERY_PACK_BATTERY_STATUS ); + batteryData.batteryChargerStatus = getBatteryRegisterValue( BATTERY_CHARGER_STATUS ); + batteryData.batteryI2cStatus = getI2cStatusRegister( FALSE ); + batteryData.faultStatus = getBatteryRegisterValue( BATTERY_CHARGER_FAULT ); + batteryData.ts = getBatteryRegisterValue( BATTERY_CHARGER_TS ); + batteryData.vbat = getBatteryRegisterValue( BATTERY_CHARGER_VBAT ); + batteryData.vsys = getBatteryRegisterValue( BATTERY_CHARGER_VSYS ); + batteryData.ibat = getBatteryRegisterValue( BATTERY_CHARGER_CURRENT ); + batteryData.relativeStateOfCharge = getBatteryRegisterValue( BATTERY_PACK_RELATIVE_STATE_OF_CHARGE ); + batteryData.fullChargeCapacity = getBatteryRegisterValue( BATTERY_PACK_FULL_CHARGE_CAPACITY ); + + broadcastData( MSG_ID_TD_BATTERY_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&batteryData, sizeof( BATTERY_DATA_PAYLOAD_T ) ); } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ - /*********************************************************************//** * @brief - * The testBatteryRemainingCapacityOverride function overrides the battery - * remaining capacity value. + * The testBatteryRegisterOverride function overrides one battery register + * value based on the supplied array index. * @details \b Inputs: none - * @details \b Outputs: batteryRemCapacity_mAh - * @param message override message from Diamond which includes the - * remaining capacity value to override to. + * @details \b Outputs: batteryRegisterOverrides[] + * @param message override message from Diamond which includes the register + * index and value to override. * @return TRUE if override request is successful, FALSE if not *************************************************************************/ -BOOL testBatteryRemainingCapacityOverride( MESSAGE_T *message ) +BOOL testBatteryRegisterOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &batteryRemCapacity_mAh, 0x0, 0xFFFFFFFF ); - return result; + return u32ArrayOverride( message, batteryRegisterOverrides, BATTERY_CHARGER_CURRENT, OFF, HEX_32_BIT_FULL_SCALE ); } -/*********************************************************************//** - * @brief - * The testBatteryStatusOverride function overrides the battery - * pack status value. - * @details \b Inputs: none - * @details \b Outputs: batteryStatus - * @param message override message from Diamond which includes the - * battery status value to override to. - * @return TRUE if override request is successful, FALSE if not - *************************************************************************/ -BOOL testBatteryStatusOverride( MESSAGE_T *message ) -{ - BOOL result = u32Override( message, &batteryStatus, 0x0, 0xFFFFFFFF ); - return result; -} - -/*********************************************************************//** - * @brief - * The testBatteryChargerStatusOverride function overrides the battery - * charger status value. - * @details \b Inputs: none - * @details \b Outputs: batteryChargerStatus - * @param message override message from Diamond which includes the - * charger status value to override to. - * @return TRUE if override request is successful, FALSE if not - *************************************************************************/ -BOOL testBatteryChargerStatusOverride( MESSAGE_T *message ) -{ - BOOL result = u32Override( message, &batteryChargerStatus, 0x0, 0xFFFFFFFF ); - return result; -} +/**@}*/ Index: firmware/App/Monitors/Battery.h =================================================================== diff -u -r78d196593cdcc9c3cd7166f02a99a7408a3e0b32 -rbbc62d810da9b094ea4f0fc765e1586ed37f0b34 --- firmware/App/Monitors/Battery.h (.../Battery.h) (revision 78d196593cdcc9c3cd7166f02a99a7408a3e0b32) +++ firmware/App/Monitors/Battery.h (.../Battery.h) (revision bbc62d810da9b094ea4f0fc765e1586ed37f0b34) @@ -32,20 +32,20 @@ // ********** public definitions ********** -/// Payload record structure for battery data broadcast message +/// Payload record structure for battery data broadcast message. typedef struct { - U32 RemainingCapacity; ///< Remaining capacity in mAh. - U32 BatteryStatus; ///< Battery pack status. - U32 BatteryChargerStatus; ///< Battery charger status. - U32 BatteryI2CStatus; ///< Battery I2C status. - U32 FaultStatus; ///< Charger fault status. - U32 TS; ///< Thermistor percentage. - U32 VBAT; ///< Battery voltage in mV. - U32 VSYS; ///< System voltage in mV. - U32 IBAT; ///< Battery current in mA. - U32 RelativeStateOfCharge; ///< Relative state of charge. - U32 FullChargeCapacity; ///< Full charge capacity in mAh. + U32 remainingCapacity; ///< Remaining capacity in mAh. + U32 batteryStatus; ///< Battery pack status. + U32 batteryChargerStatus; ///< Battery charger status. + U32 batteryI2cStatus; ///< Battery I2C status. + U32 faultStatus; ///< Charger fault status. + U32 ts; ///< Thermistor percentage. + U32 vbat; ///< Battery voltage in mV. + U32 vsys; ///< System voltage in mV. + U32 ibat; ///< Battery current in mA. + U32 relativeStateOfCharge; ///< Relative state of charge. + U32 fullChargeCapacity; ///< Full charge capacity in mAh. } BATTERY_DATA_PAYLOAD_T; //********** public function prototypes ********** @@ -54,9 +54,7 @@ void execBatteryMonitor( void ); BOOL isBatteryCharged( void ); -BOOL testBatteryRemainingCapacityOverride( MESSAGE_T *message ); -BOOL testBatteryStatusOverride( MESSAGE_T *message ); -BOOL testBatteryChargerStatusOverride( MESSAGE_T *message ); +BOOL testBatteryRegisterOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r9e14f8c931ea3f2afdedc92de71bd497868a4176 -rbbc62d810da9b094ea4f0fc765e1586ed37f0b34 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 9e14f8c931ea3f2afdedc92de71bd497868a4176) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision bbc62d810da9b094ea4f0fc765e1586ed37f0b34) @@ -184,9 +184,7 @@ { MSG_ID_TD_BLOOD_PRIME_VOLUME_OVERRIDE, &testBloodPrimeVolumeOverride }, { MSG_ID_TD_BLOOD_PRIME_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testBloodPrimePublishIntervalOverride }, { MSG_ID_TD_ENABLE_VENOUS_BUBBLE_ALARM, &testEnableVenousBubbleAlarm }, - { MSG_ID_TD_BATTERY_REMAINING_CAPACITY_OVERRIDE_REQUEST, &testBatteryRemainingCapacityOverride }, - { MSG_ID_TD_BATTERY_STATUS_OVERRIDE_REQUEST, &testBatteryStatusOverride }, - { MSG_ID_TD_BATTERY_CHARGER_STATUS_OVERRIDE_REQUEST, &testBatteryChargerStatusOverride }, + { MSG_ID_TD_BATTERY_REGISTERS_OVERRIDE_REQUEST, &testBatteryRegisterOverride }, }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLER_LOOKUP) / sizeof(MSG_HANDLER_LOOKUP_T))