Index: firmware/App/Drivers/BatteryDriver.c =================================================================== diff -u -r76687feec84ff53de5eed426b26290bd08de963c -r0b606b5cbf2df52ea9845544155eae947ca4b8ee --- firmware/App/Drivers/BatteryDriver.c (.../BatteryDriver.c) (revision 76687feec84ff53de5eed426b26290bd08de963c) +++ firmware/App/Drivers/BatteryDriver.c (.../BatteryDriver.c) (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -14,24 +14,28 @@ * @date (original) 11-May-2026 * ***************************************************************************/ -#include -#include // For memcpy +#include // For memcpy +#include "BatteryDriver.h" #include "i2c.h" +#include "Messaging.h" #include "Timers.h" /** - * @addtogroup Battery + * @addtogroup BatteryDriver * @{ */ // ********** private definitions ********** #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 = { 0, 0, 0, 0 }; ///< Battery I2C Interrupt Status register +static OVERRIDE_U32_T batteryI2CStatusRegister; ///< Battery I2C Interrupt Status register + // ********** private function prototypes ********** static void setupI2CDriver( void ); @@ -45,22 +49,28 @@ /*********************************************************************//** * @brief - * The initsetupI2CDriver function initializes the I2C driver. - * @details Inputs: none - * @details Outputs: I2C driver initialized. + * 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) { +// batteryI2CStatusRegister.data = 0; +// batteryI2CStatusRegister.ovData = 0; +// batteryI2CStatusRegister.ovInitData = 0; +// batteryI2CStatusRegister.override = 0; + memset(&batteryI2CStatusRegister, 0, sizeof(OVERRIDE_U32_T)); setupI2CDriver(); } /*********************************************************************//** * @brief - * The setupI2CDriver function setups i2c driver in repeat mode to be + * The setupI2CDriver function sets up the I2C driver in repeat mode to be * compatible with SMBus protocol. - * @details Inputs: none - * @details Outputs: setup i2c driver in repeat mode + * @details \b Inputs: none + * @details \b Outputs: I2C driver configured in repeat mode. * @return none *************************************************************************/ static void setupI2CDriver( void ) @@ -72,11 +82,11 @@ /*********************************************************************//** * @brief - * The waitForTxReady function checks for transmit ready status from i2c - * driver with a timeout. - * @details Inputs: none - * @details Outputs: checked i2c transmit ready status - * @return TRUE if i2c driver ready to transmit data, otherwise FALSE + * The waitForTxReady function checks for transmit ready status from the + * I2C driver with a timeout. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if I2C driver is ready to transmit, otherwise FALSE *************************************************************************/ static BOOL waitForTxReady( void ) { @@ -93,11 +103,11 @@ /*********************************************************************//** * @brief - * The waitForRxReady function checks for receive ready status from i2c - * driver with a timeout. - * @details Inputs: none - * @details Outputs: checked i2c receive ready status - * @return TRUE if i2c driver ready to receive data, otherwise FALSE + * The waitForRxReady function checks for receive ready status from the + * I2C driver with a timeout. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if I2C driver is ready to receive, otherwise FALSE *************************************************************************/ static BOOL waitForRxReady( void ) { @@ -114,10 +124,11 @@ /*********************************************************************//** * @brief - * The waitForAccessReady function checks if i2c registers are ready to be accessed. - * @details Inputs: none - * @details Outputs: checked i2c registers access ready status - * @return TRUE if i2c driver registers are ready to be accessed, otherwise FALSE + * The waitForAccessReady function checks if I2C registers are ready + * to be accessed. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if I2C driver registers are ready to be accessed, otherwise FALSE *************************************************************************/ static BOOL waitForAccessReady( void ) { @@ -134,10 +145,10 @@ /*********************************************************************//** * @brief - * The generateStopCondition function generates a i2c stop condition and + * The generateStopCondition function generates an I2C stop condition and * waits until the stop condition is detected or timed out. - * @details Inputs: none - * @details Outputs: generated i2c stop condition + * @details \b Inputs: none + * @details \b Outputs: I2C stop condition generated. * @return none *************************************************************************/ static void generateStopCondition( void ) @@ -166,7 +177,14 @@ BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ) { BOOL result = FALSE; - + if (slaveAddr) + { + slaveAddr = BATTERY_PACK_SLAVE_ADDRESS; + } + else + { + slaveAddr = BATTERY_CHARGER_SLAVE_ADDRESS; + } if ( TRUE == startCommTx( slaveAddr ) ) { U16 data = (U16)( (*dataPtr) & MASK_OFF_MSW ); @@ -183,11 +201,14 @@ /*********************************************************************//** * @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 + * The startCommTx function starts I2C communication and verifies the + * slave device acknowledges. + * @details \b Alarm: ALARM_ID_TD_BATTERY_COMM_FAULT if too many + * communication faults detected. + * @details \b Inputs: i2cREG1 + * @details \b Outputs: I2C communication started in master transmit mode. + * @param slaveAddr slave device address to communicate with. + * @return TRUE if communication started successfully, otherwise FALSE *************************************************************************/ static BOOL startCommTx( U32 slaveAddr ) { @@ -226,12 +247,15 @@ /*********************************************************************//** * @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 data, otherwise FALSE + * The getData function sends a command to the battery device and retrieves + * the response data. + * @details \b Alarm: ALARM_ID_TD_BATTERY_COMM_FAULT if too many + * communication faults detected. + * @details \b Inputs: none + * @details \b Outputs: battery data retrieved from device. + * @param command command to send to the device. + * @param dataPtr pointer to store the command response data. + * @return TRUE if data received successfully, otherwise FALSE *************************************************************************/ static BOOL getData( U08 command, U16 * dataPtr ) { @@ -273,11 +297,12 @@ /*********************************************************************//** * @brief - * The getI2CStatusRegister function returns the I2C status register - * @details Inputs: batteryI2CStatusRegister, i2cREG1->STR - * @details Outputs: none - * @param reset override on get - * @return I2C Interrupt Status. + * The getI2CStatusRegister function returns the current I2C status + * register value. + * @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 ) { @@ -297,11 +322,12 @@ /*********************************************************************//** * @brief - * The checkTooManyI2CCommFaults function checks for too many comm faults - * within a set period of time. Assumed function is being called when a new - * comm fault is detected so a new comm fault will be added to the list. - * @details Inputs: none - * @details Outputs: alarm 98 on trigger. + * The checkTooManyI2CCommFaults function checks for too many I2C + * communication faults within a set period of time. + * @details \b Alarm: ALARM_ID_TD_BATTERY_COMM_FAULT if too many + * communication faults are detected within the time window. + * @details \b Inputs: none + * @details \b Outputs: none * @return none *************************************************************************/ static void checkTooManyI2CCommFaults( void ) @@ -312,5 +338,20 @@ } } -/**@}*/ +/*********************************************************************//** + * @brief + * The testBatteryI2CStatusOverride function overrides the battery I2C + * status register value. + * @details \b Inputs: none + * @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 result = f32Override( message, (OVERRIDE_F32_T*)&batteryI2CStatusRegister ); + return result; +} +/**@}*/ Index: firmware/App/Drivers/BatteryDriver.h =================================================================== diff -u -r76687feec84ff53de5eed426b26290bd08de963c -r0b606b5cbf2df52ea9845544155eae947ca4b8ee --- firmware/App/Drivers/BatteryDriver.h (.../BatteryDriver.h) (revision 76687feec84ff53de5eed426b26290bd08de963c) +++ firmware/App/Drivers/BatteryDriver.h (.../BatteryDriver.h) (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -22,27 +22,20 @@ #include "Utilities.h" /** - * @defgroup Battery Battery - * @brief The battery module provides interfaces to the smart battery charger controller through I2C communication. + * @defgroup BatteryDriver + * @brief The battery Driver module provides interfaces to the smart battery charger controller and Battery Pack through I2C communication. * - * @addtogroup Battery + * @addtogroup BatteryDriver * @{ */ // ********** public function prototypes ********** + void initsetupI2CDriver(void); BOOL getBatteryData( U32 slaveAddr, U08 command, U32 * dataPtr ); U32 getI2CStatusRegister( BOOL resetOverride ); +BOOL testBatteryI2CStatusOverride( MESSAGE_T *message ); -BOOL testSetBatteryRemainingCapacityOverride( F32 value ); -BOOL testResetBatteryRemainingCapacityOverride( void ); -BOOL testSetBatteryStatusOverride( U32 value ); -BOOL testResetBatteryStatusOverride( void ); -BOOL testSetBatteryChargerStatusOverride( U32 value ); -BOOL testResetBatteryChargerStatusOverride( void ); -BOOL testSetBatteryI2CStatusOverride( U32 value ); -BOOL testResetBatteryI2CStatusOverride( void ); - /**@}*/ #endif /* APP_DRIVERS_BATTERYDRIVER_H_ */ Index: firmware/App/Monitors/Battery.c =================================================================== diff -u --- firmware/App/Monitors/Battery.c (revision 0) +++ firmware/App/Monitors/Battery.c (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -0,0 +1,356 @@ +/************************************************************************** +* +* Copyright (c) 2026 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 +* +* @author (last) Suresh Dharnala +* @date (last) 15-May-2026 +* +* @author (original) Suresh Dharnala +* @date (original) 13-May-2026 +* +***************************************************************************/ + +#include "Battery.h" +#include "BatteryDriver.h" +#include "Messaging.h" +#include "PersistentAlarm.h" +#include "Timers.h" + +/** + * @addtogroup Battery + * @{ + */ + +// ********** private definitions ********** + +#define BATTERY_CHARGER_STATUS1_CMD 0x21 ///< Battery charger status register 1 +#define BATTERY_CHARGER_STATUS2_CMD 0x22 ///< Battery charger status register 2. +#define BATTERY_CHARGER_FAULT_CMD 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_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. +// Battery logging +#define BATTERY_CHARGER_ADDR_TS 0x37 ///< Battery thermistor ADC register. +#define BATTERY_CHARGER_ADDR_VBAT 0x33 ///< Battery voltage ADC register. +#define BATTERY_CHARGER_ADDR_VSYS 0x35 ///< Battery system voltage ADC register. +#define BATTERY_CHARGER_ADDR_CURRENT 0x2F ///< 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 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 BATTERY_MANAGEMENT_ENUM_T current_BM_value; ///< Index for which battery data to read now. +static BATTERY_MANAGER_PAYLOAD_T BatteryManagerData; ///< Record with latest battery pack data updated at the slower frequency. +static BATTERY_STATUS_PAYLOAD_T BatteryStatusData; ///< Record with latest battery pack/charger status data updated at the faster frequency. + +// ********** private function prototypes ********** + +static F32 getBatteryRemainingCapacity_mAh( void ); +static U32 getBatteryStatus( void ); +static U32 getBatteryChargerStatus( void ); +static void getBatteryManagementData( void ); +static void publishBatteryManagementData( void ); +static void publishBatteryStatusData( void ); + +/*********************************************************************//** + * @brief + * The initBattery function initializes the Battery monitor module. + * @details \b Inputs: none + * @details \b Outputs: Battery monitor module initialized. + * @return none + *************************************************************************/ +void initBattery( void ) +{ + initsetupI2CDriver(); + current_BM_value = BEGINNING_OF_LIST; + lastBatteryMonitorTime = 0; + memset( &batteryStatus, 0, sizeof(OVERRIDE_U32_T)); + memset( &batteryChargerStatus, 0, sizeof(OVERRIDE_U32_T)); + memset( &batteryRemCapacity_mAh, 0, sizeof(OVERRIDE_U32_T)); + 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_TD_BATTERY_PACK_ERROR_DETECTED, 0, BATT_STATUS_ERROR_PERSIST_MS ); + // Initialize bad message CRC time windowed count + initTimeWindowedCount( TIME_WINDOWED_COUNT_BATT_COMM_ERROR, BATTERY_COMM_FAULT_COUNT, BATTERY_COMM_FAULT_TIMER ); +} + +/*********************************************************************//** + * @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(); + } +} + +/*********************************************************************//** + * @brief + * The getBatteryChargerStatus function returns the latest battery + * charger status. + * @details \b Inputs: batteryChargerStatus + * @details \b Outputs: none + * @return latest battery charger status value. + *************************************************************************/ +static U32 getBatteryChargerStatus( void ) +{ + U32 result = batteryChargerStatus.data; + + if ( OVERRIDE_KEY == batteryChargerStatus.override ) + { + result = batteryChargerStatus.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getBatteryStatus function returns the latest battery pack status. + * @details \b Inputs: batteryStatus + * @details \b Outputs: none + * @return latest battery pack status value. + *************************************************************************/ +static U32 getBatteryStatus( void ) +{ + U32 result = batteryStatus.data; + + if ( OVERRIDE_KEY == batteryStatus.override ) + { + result = batteryStatus.ovData; + } + + 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. + *************************************************************************/ +static F32 getBatteryRemainingCapacity_mAh( void ) +{ + F32 result = batteryRemCapacity_mAh.data; + + if ( OVERRIDE_KEY == batteryRemCapacity_mAh.override ) + { + result = batteryRemCapacity_mAh.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getBatteryManagementData function reads one battery data item per + * call in a round robin fashion and publishes the collected data when + * the full list has been read. + * @details \b Alarm: ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED if battery + * pack status error bits are set. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if invalid battery + * management data state is detected. + * @details \b Inputs: current_BM_value, BatteryStatusData + * @details \b Outputs: batteryRemCapacity_mAh, BatteryManagerData + * @return none + *************************************************************************/ +static void getBatteryManagementData(void) +{ + // 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_CAPACITY: + getBatteryData (BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_REMAINING_CAPACITY, &BatteryStatusData.RemainingCapacity ); + batteryRemCapacity_mAh.data = (F32)BatteryStatusData.RemainingCapacity; + break; + + case BATTERY_PACK_BATTERY_STATUS: + getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_BATTERY_STATUS, &BatteryStatusData.BatteryStatus ); + batteryStatus.data = BatteryStatusData.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_CHARGER_STATUS: + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_STATUS1_CMD, &BatteryStatusData.BatteryChargerStatus ) ) + { + batteryChargerStatus.data = BatteryStatusData.BatteryChargerStatus; + } + // Publish battery status data after reading battery charger status (last status read) + publishBatteryStatusData(); + break; + + case BATTERY_PACK_RELATIVE_STATE_OF_CHARGE: + getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_RELATIVE_STATE_OF_CHARGE, &BatteryManagerData.RelativeStateOfCharge ); + break; + + case BATTERY_PACK_FULL_CHARGE_CAPACITY: + getBatteryData ( BATTERY_PACK_ADDRESS, BATTERY_PACK_ADDR_FULL_CHARGE_CAPACITY, &BatteryManagerData.FullChargeCapacity ); + break; + + case BATTERY_CHARGER_TS: + getBatteryData ( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_ADDR_TS, &BatteryManagerData.TS ); + BatteryManagerData.TS = (BatteryManagerData.TS * 1024.0f) / 100.0F; + break; + + case BATTERY_CHARGER_VBAT: + getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_ADDR_VBAT, &BatteryManagerData.VBAT ); + BatteryManagerData.VBAT = BatteryManagerData.VBAT * 2U; + break; + + case BATTERY_CHARGER_VSYS: + getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_ADDR_VSYS, &BatteryManagerData.VSYS ); + BatteryManagerData.VSYS = BatteryManagerData.VSYS * 2U; + break; + + case BATTERY_CHARGER_FAULT: + getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_FAULT_CMD, &BatteryManagerData.FaultStatus ); + break; + + case BATTERY_CHARGER_CURRENT: + getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_ADDR_CURRENT, &BatteryManagerData.IBAT ); + BatteryManagerData.IBAT = BatteryManagerData.IBAT * 2U; + break; + + case END_OF_LIST: + current_BM_value = BEGINNING_OF_LIST; + publishBatteryManagementData(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_BATTERY_MANAGEMENT_DATA_STATE, current_BM_value ) + break; + } +} + +/*********************************************************************//** + * @brief + * The isBatteryCharged function checks if the battery has sufficient + * charge to allow starting a treatment. + * @details \b Inputs: batteryRemCapacity_mAh + * @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 ); +} + +/*********************************************************************//** + * @brief + * The publishBatteryManagementData function publishes the battery + * management data over CAN. + * @details \b Message \b Sent: MSG_ID_TD_BATTERY_MANAGEMENT_DATA + * @details \b Inputs: BatteryManagerData + * @details \b Outputs: none + * @return none + *************************************************************************/ +static void publishBatteryManagementData( void ) +{ + broadcastData( MSG_ID_TD_BATTERY_MANAGEMENT_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&BatteryManagerData, sizeof( BATTERY_MANAGER_PAYLOAD_T ) ); +} + +/*********************************************************************//** + * @brief + * The publishBatteryStatusData function publishes the battery status + * data over CAN. + * @details \b Message \b Sent: MSG_ID_TD_BATTERY_STATUS_DATA + * @details \b Inputs: BatteryStatusData + * @details \b Outputs: none + * @return none + *************************************************************************/ +static void publishBatteryStatusData( void ) +{ + BATTERY_STATUS_PAYLOAD_T batteryStatusData; + + batteryStatusData.RemainingCapacity = (U32)getBatteryRemainingCapacity_mAh(); + batteryStatusData.BatteryStatus = getBatteryStatus(); + batteryStatusData.BatteryChargerStatus = getBatteryChargerStatus(); + batteryStatusData.BatteryI2CStatus = getI2CStatusRegister( FALSE ); + + broadcastData( MSG_ID_TD_BATTERY_STATUS_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&batteryStatusData, sizeof( BATTERY_STATUS_PAYLOAD_T ) ); +} + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testBatteryRemainingCapacityOverride function overrides the battery + * remaining capacity value. + * @details \b Inputs: none + * @details \b Outputs: batteryRemCapacity_mAh + * @param message override message from Diamond which includes the + * remaining capacity value to override to. + * @return TRUE if override request is successful, FALSE if not + *************************************************************************/ +BOOL testBatteryRemainingCapacityOverride( MESSAGE_T *message ) +{ + BOOL result = f32Override( message, &batteryRemCapacity_mAh ); + return result; +} + +/*********************************************************************//** + * @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 = f32Override( message, (OVERRIDE_F32_T*) &batteryStatus ); + 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 = f32Override( message, (OVERRIDE_F32_T*)&batteryChargerStatus ); + return result; +} Index: firmware/App/Monitors/Battery.h =================================================================== diff -u --- firmware/App/Monitors/Battery.h (revision 0) +++ firmware/App/Monitors/Battery.h (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -0,0 +1,92 @@ +/************************************************************************** +* +* Copyright (c) 2026 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.h +* +* @author (last) Suresh Dharnala +* @date (last) 15-May-2026 +* +* @author (original) Suresh Dharnala +* @date (original) 13-May-2026 +* +***************************************************************************/ + +#ifndef APP_MONITORS_BATTERY_H_ +#define APP_MONITORS_BATTERY_H_ + +#include "Utilities.h" +#include "Messaging.h" + +/** + * @defgroup Battery + * @brief The battery monitor module reads and publishes battery charger + * and battery pack data over I2C and SMBus. + * + * @addtogroup Battery + * @{ + */ + +// ********** public definitions ********** +/// Payload record structure for battery status data broadcast message +typedef struct +{ + U32 RemainingCapacity; ///< Remaining capacity (mAh). + U32 BatteryStatus; ///< Battery status. + U32 BatteryChargerStatus; ///< Battery charge status. + U32 BatteryI2CStatus; +} BATTERY_STATUS_PAYLOAD_T; + +/// Payload record structure for battery module data broadcast message +typedef struct +{ + U32 FaultStatus; ///< Charger fault status. + U32 TS; ///< Temperature. + U32 VBAT; ///< Voltage. + U32 VSYS; ///< System voltage in mV. + U32 IBAT; ///< Current. + U32 RelativeStateOfCharge; ///< Relative state of charge. + U32 FullChargeCapacity; ///< Full charge capacity. +} BATTERY_MANAGER_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 ); +void execBatteryMonitor( void ); +BOOL isBatteryCharged( void ); + +BOOL testBatteryRemainingCapacityOverride( MESSAGE_T *message ); +BOOL testBatteryStatusOverride( MESSAGE_T *message ); +BOOL testBatteryChargerStatusOverride( MESSAGE_T *message ); + +/**@}*/ + +#endif /* APP_MONITORS_BATTERY_H_ */ Fisheye: Tag 0b606b5cbf2df52ea9845544155eae947ca4b8ee refers to a dead (removed) revision in file `firmware/App/Monitors/BatteryMonitor.c'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 0b606b5cbf2df52ea9845544155eae947ca4b8ee refers to a dead (removed) revision in file `firmware/App/Monitors/BatteryMonitor.h'. Fisheye: No comparison available. Pass `N' to diff? Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r76687feec84ff53de5eed426b26290bd08de963c -r0b606b5cbf2df52ea9845544155eae947ca4b8ee --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 76687feec84ff53de5eed426b26290bd08de963c) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -186,7 +186,7 @@ SW_FAULT_ID_TD_AIR_PUMP_DUTY_CYCLE_OUT_OF_RANGE = 155, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER = 156, SW_FAULT_ID_INVALID_TREATMENT_MODALITY = 157, - SW_FAULT_ID_BATTERY_INVALID_MANAGEMENT_DATA_STATE = 158, + SW_FAULT_ID_INVALID_BATTERY_MANAGEMENT_DATA_STATE = 158, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -re9e339870c5ed01230963f00d400331ab879c91f -r0b606b5cbf2df52ea9845544155eae947ca4b8ee --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision e9e339870c5ed01230963f00d400331ab879c91f) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -20,6 +20,7 @@ #include "AirPump.h" #include "AirTrap.h" #include "AlarmMgmt.h" +#include "Battery.h" #include "BloodFlow.h" #include "Bubbles.h" #include "Buttons.h" @@ -183,6 +184,9 @@ { 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, &testBatteryRemainingCapacityOverride }, + { MSG_ID_TD_BATTERY_STATUS, &testBatteryStatusOverride }, + { MSG_ID_TD_BATTERY_CHARGER_STATUS, &testBatteryChargerStatusOverride }, }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLER_LOOKUP) / sizeof(MSG_HANDLER_LOOKUP_T)) Index: firmware/App/Tasks/TaskBG.c =================================================================== diff -u -r0c0b53371cd48b9a74528b507bb41e36780b298e -r0b606b5cbf2df52ea9845544155eae947ca4b8ee --- firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 0c0b53371cd48b9a74528b507bb41e36780b298e) +++ firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "Battery.h" #include "TDCommon.h" //#include "Battery.h" @@ -23,7 +24,6 @@ #include "Timers.h" //#include "Voltages.h" #include "WatchdogMgmt.h" -#include "BatteryMonitor.h" /** * @addtogroup TaskBackground * @{ Index: firmware/source/sys_main.c =================================================================== diff -u -r76687feec84ff53de5eed426b26290bd08de963c -r0b606b5cbf2df52ea9845544155eae947ca4b8ee --- firmware/source/sys_main.c (.../sys_main.c) (revision 76687feec84ff53de5eed426b26290bd08de963c) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 0b606b5cbf2df52ea9845544155eae947ca4b8ee) @@ -64,10 +64,10 @@ #include "TDCommon.h" #include "AirPump.h" #include "AirTrap.h" +#include "Battery.h" #include "BloodFlow.h" #include "Bubbles.h" #include "Buttons.h" -#include "BatteryMonitor.h" #include "CpldInterface.h" #include "DDInterface.h" #include "Ejector.h"