/**********************************************************************//** * * Copyright (c) 2019-2020 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 Timers.c * * @date 07-Nov-2019 * @author S. Nash * * @brief Alarm Management service module. Provides general alarm management \n * functionality including support functions for triggering and clearing \n * specific alarms. * **************************************************************************/ #include "AlarmMgmt.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" /** * @addtogroup AlarmManagement * @{ */ // ********** private definitions ********** /// A blank alarm data record for alarms that do not include alarm data when triggered. const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_NONE, 0 }; // ********** private data ********** /// table - current state of each alarm DATA_ARRAY_DECL( BOOL, AlarmStates, NUM_OF_ALARM_IDS, alarmIsActive ); // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); static DATA_ARRAY_GET_PROTOTYPE( BOOL, getAlarmActive, alarmID ); /************************************************************************* * @brief initAlarmMgmt * The initAlarmMgmt function initializes the AlarmMgmt module. * @details * Inputs : none * Outputs : AlarmMgmt module initialized. * @param none * @return none *************************************************************************/ void initAlarmMgmt( void ) { ALARM_ID_T a; // initialize alarm states and start time stamps for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { alarmIsActive[ a ].data = FALSE; alarmIsActive[ a ].ovData = FALSE; alarmIsActive[ a ].ovInitData = TRUE; alarmIsActive[ a ].override = OVERRIDE_RESET; } } /************************************************************************* * @brief execAlarmMgmt * The execAlarmMgmt function executes the alarm management functions to be \n * done periodically. * @details * Inputs : * Outputs : * @param none * @return none *************************************************************************/ void execAlarmMgmt( void ) { // TODO - any alarm audio or LED/lamp management for DG? } /************************************************************************* * @brief activateAlarm * The activateAlarm function activates a given alarm. * @details * Inputs : none * Outputs : alarmIsActive[] * @param alarm : ID of alarm to activate * @return none *************************************************************************/ static void activateAlarm( ALARM_ID_T alarm ) { // verify given alarm 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 ) ) { // activate alarm alarmIsActive[ alarm ].data = TRUE; #ifdef DEBUG_ENABLED { // TODO - temporary debug code - remove later char debugStr[ 256 ]; sprintf( debugStr, "ALARM triggered:%5d \n", alarm ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); } #endif } } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) } } /************************************************************************* * @brief activateAlarmNoData * The activateAlarmNoData function activates a given alarm. Also, an alarm \n * message is broadcast to the rest of the system. This function will \n * include given data in the broadcast message for logging. * @details * Inputs : none * Outputs : alarm triggered message sent, alarm activated * @param alarm : ID of alarm to activate * @param alarmData : supporting data to include in alarm msg * @return none *************************************************************************/ void activateAlarmNoData( ALARM_ID_T alarm ) { // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { broadcastAlarmTriggered( (U16)alarm, blankAlarmData, blankAlarmData ); } activateAlarm( alarm ); } /************************************************************************* * @brief activateAlarm1Data * The activateAlarm1Data function activates a given alarm. Also, an alarm \n * message is broadcast to the rest of the system. This function will \n * include given data in the broadcast message for logging. * @details * Inputs : none * Outputs : alarm triggered message sent, alarm activated * @param alarm : ID of alarm to activate * @param alarmData : supporting data to include in alarm msg * @return none *************************************************************************/ void activateAlarm1Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData ) { // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { broadcastAlarmTriggered( (U16)alarm, alarmData, blankAlarmData ); } activateAlarm( alarm ); } /************************************************************************* * @brief activateAlarm2Data * The activateAlarm2Data function activates a given alarm. Also, an alarm \n * message is broadcast to the rest of the system. This function will \n * include two given data in the broadcast message for logging. * @details * Inputs : none * Outputs : alarm triggered message sent, alarm activated * @param alarm : ID of alarm to activate * @param alarmData1 : supporting data to include in alarm msg * @param alarmData2 : supporting data to include in alarm msg * @return none *************************************************************************/ void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ) { // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { broadcastAlarmTriggered( (U16)alarm, alarmData1, alarmData2 ); } activateAlarm( alarm ); } /************************************************************************* * @brief clearAlarm * The clearAlarm function clears a given alarm if it is recoverable. Also \n * an alarm message is broadcast to the rest of the system. * @details * Inputs : none * Outputs : AlarmStatusTable[] * @param alarm : ID of alarm to clear * @return none *************************************************************************/ void clearAlarm( 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 == alarmIsActive[ alarm ].data ) { broadcastAlarmCleared( alarm ); alarmIsActive[ alarm ].data = FALSE; } } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, alarm ) } } /************************************************************************* * @brief isAlarmActive * The isAlarmActive function determines whether a given alarm is currently \n * active. * @details * Inputs : alarmIsActive[] * Outputs : none * @param alarmID : 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 getAlarmActive * The getAlarmActive function gets the active state of a given alarm. * @details * Inputs : alarmIsActive[] * Outputs : none * @param alarmID : ID of alarm to check * @return TRUE if given alarm is active, FALSE if not *************************************************************************/ static DATA_ARRAY_GET( BOOL, getAlarmActive, alarmID, NUM_OF_ALARM_IDS-1, alarmIsActive, TRUE ) /**@}*/ /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /************************************************************************* * @brief * The testSetAlarmStateOverride function overrides the state of the \n * alarm active state for a given alarm with the alarm management with \n * a given active state. * @details * Inputs : none * Outputs : alarm activated or cleared * @param alarmID : ID of alarm to activate or clear * @param value : override state for the given alarm ID (1=activate, 0=clear) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetAlarmStateOverride( U32 alarmID, U32 state ) { BOOL result = FALSE; if ( alarmID < NUM_OF_ALARM_IDS ) { if ( TRUE == isTestingActivated() ) { if ( TRUE == state ) { activateAlarmNoData( (ALARM_ID_T)alarmID ); } else { clearAlarm( (ALARM_ID_T)alarmID ); } result = TRUE; } } return result; } /************************************************************************* * @brief * The testResetAlarmStateOverride function resets the override of the \n * state of the active state for a given alarm with the alarm management. * @details * Inputs : none * Outputs : alarm cleared * @param alarmID : ID of alarm to clear * @return TRUE if alarm clear successful, FALSE if not *************************************************************************/ BOOL testResetAlarmStateOverride( U32 alarmID ) { BOOL result = FALSE; if ( alarmID < NUM_OF_ALARM_IDS ) { if ( TRUE == isTestingActivated() ) { result = TRUE; clearAlarm( (ALARM_ID_T)alarmID ); } } return result; }