Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -rf760ffc4b10556e5186e9ceb90294262063440ca -r10490255c11360811da5f426f8bdee5f007ce413 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision f760ffc4b10556e5186e9ceb90294262063440ca) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision 10490255c11360811da5f426f8bdee5f007ce413) @@ -41,7 +41,8 @@ #define BATTERY_COMM_TIME_OUT_MS 2 ///< Battery communication time out in ms. #define BATTERY_MONITOR_INTERVAL_MS 247 ///< Battery monitor interval in ms. #define AC_POWER_LOST_PERSISTENT_COUNT 3 ///< AC power lost persistent count before alarming. -#define BATTERY_COMM_FAULT_PERSISTENTCE_COUNT 5 ///< Battery communication fault persistent count before alarming. +#define BATTERY_COMM_FAULT_PERSISTENCE_COUNT 4 ///< Battery communication fault persistent count before alarming. +#define BATTERY_COMM_FAULT_PERSISTENCE_TIMER ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Battery communication fault persistence timer. #define BATTERY_MAH_2_MWH_FACTOR 14.7F ///< Conversion factor for mAh to mWh. #define BATTERY_MIN_CAPACITY_MWH 5000.0F ///< Minimum battery capacity for starting a treatment is 10 minutes (5 Wh @ 30W). @@ -136,6 +137,9 @@ // ********** private data ********** static OVERRIDE_F32_T batteryRemCapacity_mWh = { 0.0, 0.0, 0.0, 0 }; ///< Battery pack remaining capacity (in mWh). +static OVERRIDE_U32_T batteryStatus = { 0, 0, 0, 0 }; ///< Battery status +static OVERRIDE_U32_T batteryChargerStatus = { 0, 0, 0, 0 }; ///< Battery charger status +static OVERRIDE_U32_T batteryI2CStatusRegister = { 0, 0, 0, 0 }; ///< Battery I2C Interrupt Status register static U32 lastBatteryMonitorTime; ///< Previous battery monitor time. static U32 commFaultPersistentCount; ///< Persistence count for battery comm fault. @@ -146,6 +150,9 @@ // ********** private function prototypes ********** static F32 getBatteryRemainingCapacity_mWh( void ); +static U32 getBatteryStatus( void ); +static U32 getBatteryChargerStatus( void ); +static U32 getI2CStatusRegister( void ) static void setupI2CDriver( void ); static BOOL waitForTxReady( void ); static BOOL waitForRxReady( void ); @@ -178,6 +185,7 @@ // Initialize persistent alarm for battery pack status error initPersistentAlarm( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, 0, BATT_STATUS_ERROR_PERSIST_MS ); + initPersistentAlarm( ALARM_ID_HD_BATTERY_COMM_FAULT, 0, BATTERY_COMM_FAULT_PERSISTENCE_TIMER ); setupI2CDriver(); } @@ -233,6 +241,23 @@ /*********************************************************************//** * @brief + * The getI2CStatusRegister function returns the I2C status register + * @details Inputs: batteryI2CStatusRegister, i2cREG1->STR + * @details Outputs: none + * @return I2C Interrupt Status. + *************************************************************************/ +static U32 getI2CStatusRegister( void ) +{ + U32 result = i2cREG1->STR; + + if ( OVERRIDE_KEY == batteryI2CStatusRegister.override ) + { + result = batteryI2CStatusRegister.ovData; + } +} + +/*********************************************************************//** + * @brief * The getBatteryRemainingCapacity_mWh function returns the latest battery * remaining capacity (in mWh). * @details Inputs: batteryRemCapacity_mWh @@ -253,6 +278,45 @@ /*********************************************************************//** * @brief + * The getBatteryStatus function returns the latest battery status + * @details Inputs: batteryStatus + * @details Outputs: none + * @return battery status. + *************************************************************************/ +static U32 getBatteryStatus( void ) +{ + U32 result = batteryStatus.data; + + if ( OVERRIDE_KEY == batteryStatus.override ) + { + result = batteryStatus.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getBatteryChargerStatus function returns the latest battery + * charger status. + * @details Inputs: batteryChargerStatus + * @details Outputs: none + * @return battery charger status. + *************************************************************************/ +static U32 getBatteryChargerStatus( void ) +{ + U32 result = batteryChargerStatus.data; + + if ( OVERRIDE_KEY == batteryChargerStatus.override ) + { + result = batteryChargerStatus.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The setupI2CDriver function setups i2c driver in repeat mode to be * compatible with SMBus protocol. * @details Inputs: none @@ -399,17 +463,17 @@ if ( TRUE == waitForAccessReady() ) { - if ( 0 == ( i2cREG1->STR & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) + if ( 0 == ( getI2CStatusRegister() & ( (U32)I2C_NACK | (U32)I2C_AL ) ) ) { commFaultPersistentCount = 0; result = TRUE; } else { generateStopCondition(); - if ( ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENTCE_COUNT ) + if ( TRUE == isPersistentAlarmTriggered(ALARM_ID_HD_BATTERY_COMM_FAULT, ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENCE_COUNT ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, slaveAddr ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, slaveAddr, commFaultPersistentCount ); } } } @@ -466,9 +530,9 @@ if ( FALSE == result ) { - if ( ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENTCE_COUNT ) + if ( TRUE == isPersistentAlarmTriggered(ALARM_ID_HD_BATTERY_COMM_FAULT, ++commFaultPersistentCount > BATTERY_COMM_FAULT_PERSISTENCE_COUNT ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, dataPtr ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_BATTERY_COMM_FAULT, dataPtr, commFaultPersistentCount ); commFaultPersistentCount = 0; } } @@ -511,9 +575,10 @@ case BATTERY_PACK_BATTERY_STATUS4: case BATTERY_PACK_BATTERY_STATUS5: getBatteryData ( BATTERY_PACK_SLAVE_ADDRESS, BATTERY_PACK_ADDR_BATTERY_STATUS, &BatteryStatusData.BatteryStatus ); - if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, ( BatteryStatusData.BatteryStatus & BATTERY_PACK_ERROR_BITS ) != 0 ) ) ) + batteryStatus.data = BatteryStatusData.BatteryStatus; + if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, ( getBatteryStatus() & BATTERY_PACK_ERROR_BITS ) != 0 ) ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, BatteryStatusData.BatteryStatus ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_BATTERY_PACK_ERROR_DETECTED, getBatteryStatus(), BATTERY_PACK_ERROR_BITS ); } break; @@ -640,17 +705,18 @@ case BATTERY_CHARGER_STATUS5: if ( TRUE == getBatteryData( BATTERY_CHARGER_SLAVE_ADDRESS, BATTERY_CHARGER_STATUS_CMD, &BatteryStatusData.BatteryChargerStatus ) ) { // If A/C not present, trigger A/C lost alarm + batteryChargerStatus.data = BatteryStatusData.BatteryChargerStatus; if ( 0 == ( BatteryStatusData.BatteryChargerStatus & BATTERY_CHARGER_STATUS_AC_PRESENT_MASK ) ) { // Pre-Treatment, Treatment, or Post-Treatment mode if ( opMode == MODE_PRET || opMode == MODE_TREA || opMode == MODE_POST ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT, BatteryStatusData.BatteryChargerStatus ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT, getBatteryChargerStatus() ); } // Standby, Service, or Treatment Parameters mode else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST, BatteryStatusData.BatteryChargerStatus ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST, getBatteryChargerStatus() ); } } else @@ -714,7 +780,7 @@ * @param value override battery remaining percent * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetBatteryRemainingPercentOverride( F32 value ) // TODO - rename to capacity (instead of percent) + messaging + Dialin // TODO - add override of broadcast interval // TODO - broadcast battery data +BOOL testSetBatteryRemainingCapacityOverride( F32 value ) // TODO - rename to capacity (instead of percent) + messaging + Dialin // TODO - add override of broadcast interval // TODO - broadcast battery data { BOOL result = FALSE; @@ -730,13 +796,13 @@ /*********************************************************************//** * @brief - * The testResetSetBatteryRemainingPercentOverride function resets the + * The testResetBatteryRemainingPercentOverride function resets the * override of the battery remaining percent value. * @details Inputs: none * @details Outputs: batteryRemCapacity_mWh * @return TRUE if reset successful, FALSE if not *************************************************************************/ -BOOL testResetSetBatteryRemainingPercentOverride( void ) +BOOL testResetBatteryRemainingCapacityOverride( void ) { BOOL result = FALSE; @@ -750,4 +816,140 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetBatteryStatusOverride function overrides the battery + * status value. + * @details Inputs: none + * @details Outputs: batteryStatus + * @param value override battery status + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBatteryStatusOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryStatus.ovData = value; + batteryStatus.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBatteryStatusOverride function resets the + * override of the battery status value. + * @details Inputs: none + * @details Outputs: batteryStatus + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBatteryStatusOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryStatus.override = OVERRIDE_RESET; + batteryStatus.ovData = batteryStatus.ovInitData; + } + + return result; +} + + +/*********************************************************************//** + * @brief + * The testSetBatteryChargerStatusOverride function overrides the battery + * charger status value. + * @details Inputs: none + * @details Outputs: batteryChargerStatus + * @param value override battery charge status + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBatteryChargerStatusOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryChargerStatus.ovData = value; + batteryChargerStatus.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBatteryChargerStatusOverride function resets the + * override of the battery charger status. + * @details Inputs: none + * @details Outputs: batteryChargerStatus + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBatteryChargerStatusOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryChargerStatus.override = OVERRIDE_RESET; + batteryChargerStatus.ovData = batteryChargerStatus.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetBatteryI2CStatusOverride function overrides the battery + * i2c status register value. + * @details Inputs: none + * @details Outputs: batteryI2CStatusRegister + * @param value override battery charge status + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetBatteryI2CStatusOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryI2CStatusRegister.ovData = value; + batteryI2CStatusRegister.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetBatteryI2CStatusOverride function resets the + * override of the battery i2c status register value. + * @details Inputs: none + * @details Outputs: batteryI2CStatusRegister + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetBatteryI2CStatusOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + batteryI2CStatusRegister.override = OVERRIDE_RESET; + batteryI2CStatusRegister.ovData = batteryI2CStatusRegister.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Drivers/Battery.h =================================================================== diff -u -rf760ffc4b10556e5186e9ceb90294262063440ca -r10490255c11360811da5f426f8bdee5f007ce413 --- firmware/App/Drivers/Battery.h (.../Battery.h) (revision f760ffc4b10556e5186e9ceb90294262063440ca) +++ firmware/App/Drivers/Battery.h (.../Battery.h) (revision 10490255c11360811da5f426f8bdee5f007ce413) @@ -79,8 +79,14 @@ BOOL isBatteryCharged( void ); BOOL isACPowerLost( void ); -BOOL testSetBatteryRemainingPercentOverride( F32 value ); -BOOL testResetSetBatteryRemainingPercentOverride( void ); +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 ); /**@}*/ Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r82a8a3cf0ea04c4d2732a8ea912cfb85b981ec5f -r10490255c11360811da5f426f8bdee5f007ce413 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 82a8a3cf0ea04c4d2732a8ea912cfb85b981ec5f) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 10490255c11360811da5f426f8bdee5f007ce413) @@ -1711,6 +1711,18 @@ case MSD_ID_HD_RTC_CTL_REG3_STATUS_OVERRIDE: handleHDRTCControlReg3StatusOverrideRequest( message ); break; + + case MSG_ID_HD_BATTERY_STATUS_OVERRIDE: + handleBatteryStatusOverrideRequest( message ); + break; + + case MSG_ID_HD_BATTERY_CHARGER_STATUS_OVERRIDE: + handleBatteryChargerStatusOverrideRequest( message ); + break; + + case MSG_ID_HD_BATTERY_COMM_STATUS_OVERRIDE: + handleBatteryI2CStatusOverrideRequest( message ); + break; // The default cannot be reached in VectorCAST since the cases are run in a for loop default: // Unrecognized message ID received - ignore Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r82a8a3cf0ea04c4d2732a8ea912cfb85b981ec5f -r10490255c11360811da5f426f8bdee5f007ce413 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 82a8a3cf0ea04c4d2732a8ea912cfb85b981ec5f) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 10490255c11360811da5f426f8bdee5f007ce413) @@ -5271,11 +5271,11 @@ memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { - result = testSetBatteryRemainingPercentOverride( payload.state.f32 ); + result = testSetBatteryRemainingCapacityOverride( payload.state.f32 ); } else { - result = testResetSetBatteryRemainingPercentOverride(); + result = testResetBatteryRemainingCapacityOverride(); } } @@ -7843,4 +7843,100 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** + * @brief + * The handleBatteryStatusOverrideRequest function handles a + * request to override battery status. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBatteryStatusOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBatteryStatusOverride( payload.state.u32 ); + } + else + { + result = testResetBatteryStatusOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleBatteryChargerStatusOverrideRequest function handles a + * request to override battery charger status. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBatteryChargerStatusOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBatteryChargerStatusOverride( payload.state.u32 ); + } + else + { + result = testResetBatteryChargerStatusOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleBatteryStatusOverrideRequest function handles a + * request to override battery status. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleBatteryI2CStatusOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetBatteryI2CStatusOverride( payload.state.u32 ); + } + else + { + result = testResetBatteryI2CStatusOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r82a8a3cf0ea04c4d2732a8ea912cfb85b981ec5f -r10490255c11360811da5f426f8bdee5f007ce413 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 82a8a3cf0ea04c4d2732a8ea912cfb85b981ec5f) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 10490255c11360811da5f426f8bdee5f007ce413) @@ -870,6 +870,15 @@ // MSD_ID_HD_RTC_CTL_REG3_STATUS_OVERRIDE void handleHDRTCControlReg3StatusOverrideRequest( MESSAGE_T * message ); +// MSG_ID_HD_BATTERY_STATUS_OVERRIDE +void handleBatteryStatusOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_BATTERY_CHARGER_STATUS_OVERRIDE +void handleBatteryChargerStatusOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_BATTERY_COMM_STATUS_OVERRIDE +void handleBatteryI2CStatusOverrideRequest( MESSAGE_T *message ); + /**@}*/ #endif