Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r4d7d40a27130dc813d653f044cbb856b1b7d8481 -r2326a384932d92d970f9ec46c1dc1e8881b8bc8d --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 4d7d40a27130dc813d653f044cbb856b1b7d8481) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 2326a384932d92d970f9ec46c1dc1e8881b8bc8d) @@ -16,7 +16,8 @@ ***************************************************************************/ #include "AlarmMgmt.h" -#include "OperationModes.h" +#include "OperationModes.h" +#include "PersistentAlarm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" @@ -32,12 +33,12 @@ // ********** private data ********** -static OVERRIDE_U32_T alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of current state of each alarm +static OVERRIDE_U32_T alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of current state of each alarm +static BOOL alarmConditionIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of flag indicates if an alarm condition is active // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); -static BOOL getAlarmActive( U32 alarmID ); /*********************************************************************//** * @brief @@ -48,15 +49,17 @@ *************************************************************************/ void initAlarmMgmt( void ) { - ALARM_ID_T a; + ALARM_ID_T alrm; // initialize alarm states and start time stamps - for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + for ( alrm = ALARM_ID_NO_ALARM; alrm < NUM_OF_ALARM_IDS; alrm++ ) { - alarmIsActive[ a ].data = FALSE; - alarmIsActive[ a ].ovData = FALSE; - alarmIsActive[ a ].ovInitData = TRUE; - alarmIsActive[ a ].override = OVERRIDE_RESET; + alarmIsActive[ alrm ].data = FALSE; + alarmIsActive[ alrm ].ovData = FALSE; + alarmIsActive[ alrm ].ovInitData = TRUE; + alarmIsActive[ alrm ].override = OVERRIDE_RESET; + + alarmConditionIsActive[ alrm ] = FALSE; } } @@ -86,10 +89,11 @@ if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { // no need to do anything if alarm is already active - if ( FALSE == getAlarmActive( alarm ) ) + if ( FALSE == isAlarmActive( alarm ) ) { // activate alarm - alarmIsActive[ alarm ].data = TRUE; + alarmIsActive[ alarm ].data = TRUE; + alarmConditionIsActive[ alarm ] = TRUE; } } else @@ -112,7 +116,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, blankAlarmData, blankAlarmData ); + broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -145,7 +149,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, alarmData, blankAlarmData ); + broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -179,7 +183,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, alarmData1, alarmData2 ); + broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -234,51 +238,88 @@ } } +/*********************************************************************//** + * @brief + * The clearAlarmCondition function clears a given alarm's condition detected + * flag. Also an alarm message is broadcast to the rest of the system. + * @details Inputs: none + * @details Outputs: alarmConditionIsActive[] + * @param alarm ID of alarm to clear condition for + * @return none + *************************************************************************/ +void clearAlarmCondition( ALARM_ID_T alarm ) +{ + // verify given alarm + if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + { + // clear alarm and broadcast alarm clear if not already cleared + if ( TRUE == alarmConditionIsActive[ alarm ] ) + { + broadcastAlarmConditionCleared( alarm ); + alarmConditionIsActive[ alarm ] = FALSE; + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, alarm ) + } +} + /*********************************************************************//** * @brief * The isAlarmActive function determines whether a given alarm is currently active. * @details Inputs: alarmIsActive[] * @details Outputs: none - * @param alarmID ID of alarm to check + * @param alarm ID of alarm to check * @return TRUE if given alarm is active, FALSE if not - *************************************************************************/ + *************************************************************************/ BOOL isAlarmActive( ALARM_ID_T alarm ) { - BOOL result = getAlarmActive( alarm ); - - return result; -} - -/*********************************************************************//** - * @brief - * The getAlarmActive function gets the active state of a given alarm. - * @details Inputs: alarmIsActive[] - * @details Outputs: none - * @param alarmID ID of alarm to check - * @return TRUE if given alarm is active, FALSE if not - *************************************************************************/ -static BOOL getAlarmActive( U32 alarmID ) -{ BOOL result = TRUE; - if ( alarmID < NUM_OF_ALARM_IDS ) + if ( alarm < NUM_OF_ALARM_IDS ) { - if ( OVERRIDE_KEY == alarmIsActive[ alarmID ].override ) + if ( OVERRIDE_KEY == alarmIsActive[ alarm ].override ) { - result = (BOOL)alarmIsActive[ alarmID ].ovData; + result = (BOOL)alarmIsActive[ alarm ].ovData; } else { - result = (BOOL)alarmIsActive[ alarmID ].data; + result = (BOOL)alarmIsActive[ alarm ].data; } } else { activateAlarmNoData( ALARM_ID_DG_SOFTWARE_FAULT ); } - return result; + return result; } +/*********************************************************************//** + * @brief + * The checkPersistentAlarm function triggers/clears an alarm if an alarm condition + * has persisted/cleared over given time limit. + * @details Inputs: none + * @details Outputs: checks whether an alarm is triggered or an alarm condition is cleared + * @param alarmID ID of alarm to check + * @param isErrorOccured Flag indicates alarm condition is active or not + * @param data alarm data + * @param limit alarm condition limit + * @return TRUE if given alarm is active, FALSE if not + *************************************************************************/ +void checkPersistentAlarm( ALARM_ID_T alarm, BOOL const isErrorOccured, F32 const data, F32 const limit ) +{ + if ( TRUE == isPersistentAlarmTriggered( alarm, isErrorOccured ) ) + { + SET_ALARM_WITH_2_F32_DATA( alarm, data, limit ); + } + + if ( TRUE == isPersistentAlarmConditionCleared( alarm, isErrorOccured ) ) + { + clearAlarmCondition( alarm ); + } +} + /************************************************************************* * TEST SUPPORT FUNCTIONS