Index: firmware/App/Monitors/Battery.c =================================================================== diff -u -rf65325ed47c1d70a3abf8a6f853f858b57228734 -r365cfa9529a444e02ecc928dea87e97bca95c193 --- firmware/App/Monitors/Battery.c (.../Battery.c) (revision f65325ed47c1d70a3abf8a6f853f858b57228734) +++ firmware/App/Monitors/Battery.c (.../Battery.c) (revision 365cfa9529a444e02ecc928dea87e97bca95c193) @@ -32,32 +32,32 @@ // ********** private definitions ********** -#define BATTERY_MONITOR_INTERVAL_MS 247 ///< Battery monitor interval in ms. -#define BATTERY_DATA_PUB_INTERVAL BATTERY_END_OF_LIST_TIME_TO_PUBLISH ///< Default battery data publish interval in battery monitor ticks. -#define BATTERY_COMM_FAULT_COUNT 5 ///< Battery communication fault persistent count before alarming. +#define BATTERY_MONITOR_INTERVAL_MS 247 ///< Battery monitoring interval in milliseconds. +#define BATTERY_DATA_PUB_INTERVAL BATTERY_END_OF_LIST_TIME_TO_PUBLISH ///< Default battery data publish interval in battery monitor cycles. +#define BATTERY_COMM_FAULT_COUNT 5 ///< Number of communication failures required 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 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. -#define BATTERY_FULL_CAPACITY_MAH 3900U -#define BATTERY_NOMINAL_CAPACITY_WH ( 25.20 * 3.90 ) -#define BATTERY_60WH_CAPACITY_MAH ( ( BATTERY_FULL_CAPACITY_MAH / BATTERY_NOMINAL_CAPACITY_WH ) * 60 ) -#define V_REGN 5.0 -#define R_PULLUP 10000.0 -#define R0 10000.0 -#define T0 298.15 -#define BETA 3435 +#define BATTERY_PACK_ERROR_BITS 0x0F ///< Battery-pack status error-bit mask. +#define BATTERY_MIN_CAPACITY_MAH 1950U ///< Minimum remaining capacity required to start treatment. +#define BATTERY_CHARGER_ERROR_BITS 0x08 ///< Battery-charger status error-bit mask. +#define BATTERY_CHARGER_FAULTY_ERROR_BITS 0XFF ///< Error codes are in the first and second byte. +#define BATTERY_FULL_CAPACITY_MAH 3900U ///< Nominal full-charge battery capacity in mAh. +#define BATTERY_NOMINAL_CAPACITY_WH ( 25.20 * 3.90 ) ///< Nominal battery energy capacity in Wh. +#define BATTERY_60WH_CAPACITY_MAH ( ( BATTERY_FULL_CAPACITY_MAH / BATTERY_NOMINAL_CAPACITY_WH ) * 60 ) ///< Battery capacity equivalent to 60 Wh in mAh. +#define V_REGN 5.0 ///< Charger REGN reference voltage in volts. +#define R_PULLUP 10000.0 ///< Thermistor pull-up resistance in ohms. +#define R0 10000.0 ///< Thermistor nominal resistance at T0 in ohms. +#define T0 298.15 ///< Thermistor nominal temperature in kelvin. +#define BETA 3435 ///< Thermistor beta coefficient in kelvin. // ********** 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 U32 batteryDataPublicationTimerCounter; ///< Used to schedule battery data publication to CAN bus. +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 U32 batteryDataPublicationTimerCounter; ///< Used to schedule battery data publication to CAN bus. static OVERRIDE_U32_T batteryRegisterOverrides[ NUM_OF_BATTERY_REGISTERS-1 ]; ///< Battery register data and overrides. -static OVERRIDE_U32_T batteryDataPublishInterval; ///< Interval at which to publish battery data to CAN bus. -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. +static OVERRIDE_U32_T batteryDataPublishInterval; ///< Interval at which to publish battery data to CAN bus. +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 ********** @@ -66,7 +66,9 @@ 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 ); +static void checkPersistentAlarmTrigger( ALARM_ID_T alarmID, + BATTERY_MANAGEMENT_ENUM_T registerSel, + U08 errorBits ); /*********************************************************************//** * @brief @@ -123,7 +125,7 @@ /*********************************************************************//** * @brief * The setBatteryRegisterData function updates the raw battery register data. - * @details \b Inputs: batteryRegisterOverrides[] + * @details \b Inputs: none * @details \b Outputs: batteryRegisterOverrides[] * @param registerSel battery register to update * @param data value to store for the given register @@ -170,13 +172,17 @@ * @param errorBits bit mask containing the error bits to monitor * @return none *************************************************************************/ -static void checkPersistentAlarmTrigger( ALARM_ID_T alarmID, BATTERY_MANAGEMENT_ENUM_T registerSel, U08 errorBits ) +static void checkPersistentAlarmTrigger( ALARM_ID_T alarmID, + BATTERY_MANAGEMENT_ENUM_T registerSel, + U08 errorBits ) { if ( registerSel < NUM_OF_BATTERY_REGISTERS-1 ) { - if ( TRUE == isPersistentAlarmTriggered( alarmID, ( getBatteryRegisterValue( registerSel ) & errorBits ) != 0U ) ) + if ( TRUE == isPersistentAlarmTriggered( + alarmID, ( getBatteryRegisterValue( registerSel ) & errorBits ) != 0U ) ) { - SET_ALARM_WITH_2_U32_DATA( alarmID, getBatteryRegisterValue( registerSel ), errorBits ); + SET_ALARM_WITH_2_U32_DATA( + alarmID, getBatteryRegisterValue( registerSel ), errorBits ); } } } @@ -223,43 +229,50 @@ { case BATTERY_PACK_REMAINING_CAPACITY: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_REMAINING_CAPACITY, &responseData ) ) + if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, + BATTERY_PACK_REMAINING_CAPACITY, &responseData ) ) { setBatteryRegisterData( BATTERY_PACK_REMAINING_CAPACITY, responseData ); } break; case BATTERY_PACK_BATTERY_STATUS: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_BATTERY_STATUS, &responseData ) ) + if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, + BATTERY_PACK_BATTERY_STATUS, &responseData ) ) { setBatteryRegisterData( BATTERY_PACK_BATTERY_STATUS, responseData ); - checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED, BATTERY_PACK_BATTERY_STATUS, BATTERY_PACK_ERROR_BITS ); + checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_PACK_ERROR_DETECTED, + BATTERY_PACK_BATTERY_STATUS, BATTERY_PACK_ERROR_BITS ); } break; case BATTERY_PACK_RELATIVE_STATE_OF_CHARGE: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_RELATIVE_STATE_OF_CHARGE, &responseData ) ) + 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: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, BATTERY_PACK_FULL_CHARGE_CAPACITY, &responseData ) ) + if ( TRUE == getBatteryData( BATTERY_PACK_ADDRESS, + BATTERY_PACK_FULL_CHARGE_CAPACITY, &responseData ) ) { setBatteryRegisterData( BATTERY_PACK_FULL_CHARGE_CAPACITY, responseData ); } break; case BATTERY_CHARGER_STATUS: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_STATUS, &responseData ) ) + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, + BATTERY_CHARGER_STATUS, &responseData ) ) { setBatteryRegisterData( BATTERY_CHARGER_STATUS, responseData ); - checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_CHARGER_ERROR_DETECTED, BATTERY_CHARGER_STATUS, BATTERY_CHARGER_ERROR_BITS ); + checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_CHARGER_ERROR_DETECTED, + BATTERY_CHARGER_STATUS, BATTERY_CHARGER_ERROR_BITS ); } break; @@ -268,49 +281,54 @@ if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_TS, &responseData ) ) { float TS_ratio = 0.0f; - float V_TS = 0.0f; - float R_NTC = 0.0f; - float T_K = 0.0f; - float T_C = 0.0f; + float V_TS = 0.0f; + float R_NTC = 0.0f; + float T_K = 0.0f; + float T_C = 0.0f; TS_ratio = responseData/1024.0f; V_TS = TS_ratio * V_REGN; - R_NTC = R_PULLUP * V_TS / (V_REGN - V_TS); - T_K = 1 / (1/T0 + (1/BETA) * log(R_NTC / R0)); - T_C = T_K - 273.15; - U32 temp_decic = (U32)roundf(T_C * 10.0f); + R_NTC = R_PULLUP * V_TS / ( V_REGN - V_TS ); + T_K = 1 / ( 1/T0 + ( 1/BETA ) * log( R_NTC / R0 ) ); + T_C = T_K - 273.15; + U32 temp_decic = (U32)roundf( T_C * 10.0f ); setBatteryRegisterData( BATTERY_CHARGER_TS, temp_decic ); } break; case BATTERY_CHARGER_VBAT: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_VBAT, &responseData ) ) + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, + BATTERY_CHARGER_VBAT, &responseData ) ) { setBatteryRegisterData( BATTERY_CHARGER_VBAT, (U32)( responseData * 2U ) ); } break; case BATTERY_CHARGER_VSYS: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_VSYS, &responseData ) ) + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, + BATTERY_CHARGER_VSYS, &responseData ) ) { setBatteryRegisterData( BATTERY_CHARGER_VSYS, (U32)( responseData * 2U ) ); } break; case BATTERY_CHARGER_FAULT: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_FAULT, &responseData ) ) + 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 ); + checkPersistentAlarmTrigger( ALARM_ID_TD_BATTERY_CHARGER_ERROR_DETECTED, + BATTERY_CHARGER_FAULT, BATTERY_CHARGER_FAULTY_ERROR_BITS ); } break; case BATTERY_CHARGER_CURRENT: responseData = 0U; - if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, BATTERY_CHARGER_CURRENT, &responseData ) ) + if ( TRUE == getBatteryData( BATTERY_CHARGER_ADDRESS, + BATTERY_CHARGER_CURRENT, &responseData ) ) { setBatteryRegisterData( BATTERY_CHARGER_CURRENT, (U32)( responseData * 2U ) ); } @@ -323,7 +341,9 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_BATTERY_MANAGEMENT_DATA_STATE, currentBmValue ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, + SW_FAULT_ID_INVALID_BATTERY_MANAGEMENT_DATA_STATE, + currentBmValue ); break; } } @@ -332,13 +352,18 @@ * @brief * The isBatteryCharged function checks if the battery has sufficient * charge to allow starting a treatment. - * @details \b Inputs: batteryRegisterOverrides[] + * @details \b Inputs: none * @details \b Outputs: none * @return TRUE if battery has sufficient charge, otherwise FALSE *************************************************************************/ BOOL isBatteryCharged( void ) { - return ( getBatteryRegisterValue( BATTERY_PACK_REMAINING_CAPACITY ) > BATTERY_MIN_CAPACITY_MAH ? TRUE : FALSE ); + BOOL result = 0U; + + result = ( getBatteryRegisterValue( BATTERY_PACK_REMAINING_CAPACITY ) + > BATTERY_MIN_CAPACITY_MAH ? TRUE : FALSE ); + + return result; } /*********************************************************************//** @@ -351,9 +376,10 @@ *************************************************************************/ BOOL isBatteryRemainingCapacityLessThan60Wh( void ) { - U32 result = 0U; + BOOL result = 0U; - result = ( getBatteryRegisterValue( BATTERY_PACK_REMAINING_CAPACITY ) < BATTERY_60WH_CAPACITY_MAH ) ? TRUE : FALSE; + result = ( getBatteryRegisterValue( BATTERY_PACK_REMAINING_CAPACITY ) + < BATTERY_60WH_CAPACITY_MAH ) ? TRUE : FALSE; return result; } @@ -385,7 +411,8 @@ 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 ) ); + broadcastData( MSG_ID_TD_BATTERY_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, + (U08*)&batteryData, sizeof( BATTERY_DATA_PAYLOAD_T ) ); batteryDataPublicationTimerCounter = 0; } } @@ -408,7 +435,10 @@ *************************************************************************/ BOOL testBatteryRegisterOverride( MESSAGE_T *message ) { - return u32ArrayOverride( message, batteryRegisterOverrides, BATTERY_CHARGER_CURRENT, OFF, HEX_32_BIT_FULL_SCALE ); + BOOL result = u32ArrayOverride( message, batteryRegisterOverrides, + BATTERY_CHARGER_CURRENT, OFF, HEX_32_BIT_FULL_SCALE ); + + return result; } /*********************************************************************//** @@ -423,7 +453,8 @@ *************************************************************************/ BOOL testBatteryPublishIntervalOverride( MESSAGE_T *message ) { - BOOL result = u32BroadcastIntervalOverride( message, &batteryDataPublishInterval, BATTERY_MONITOR_INTERVAL_MS ); + BOOL result = u32BroadcastIntervalOverride( message, &batteryDataPublishInterval, + BATTERY_MONITOR_INTERVAL_MS ); return result; }