Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r93b7026089877765744c2c465c51fd6912d7084b -rc672f41061bcd500d6593655641cb27ce3ae58fc --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 93b7026089877765744c2c465c51fd6912d7084b) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision c672f41061bcd500d6593655641cb27ce3ae58fc) @@ -19,7 +19,8 @@ #define __ALARM_MGMT_C__ -#include "AlarmLamp.h" +#include "AlarmLamp.h" +#include "FPGA.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -31,9 +32,10 @@ */ // ********** private definitions ********** + +/// Interval to control lamp and audio and to publish alarm status data. +#define ALARM_STATUS_PUBLISH_INTERVAL ( ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) -#define ALARM_STATUS_PUBLISH_INTERVAL (250 / TASK_GENERAL_INTERVAL) ///< Default interval to publish alarm status data. - #define ALARM_SILENCE_EXPIRES_IN_SECS (60) ///< Alarm silence expiration time in seconds. #define SUPERVISOR_ALARM_KEY 0xD2C3B4A5 ///< 32-bit key required for clear all alarms request. @@ -52,8 +54,6 @@ // ********** private data ********** -/// interval (in ms) at which to publish alarm status to CAN bus -DATA_DECL( U32, AlarmStatusPub, alarmStatusPublishInterval, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL ); static U32 alarmStatusPublicationTimerCounter = 0; ///< Used to schedule alarm status publication to CAN bus. /// table - current state of each alarm @@ -65,22 +65,24 @@ static COMP_ALARM_STATUS_T alarmStatus; ///< Record for the current composite alarm status. -static ALARM_ID_T alarmPriorityFIFO[ NUM_OF_ALARM_PRIORITIES ]; ///< FIFO - first activated alarm in each alarm priority category. +static ALARM_ID_T alarmPriorityFIFO[ NUM_OF_ALARM_PRIORITIES ]; ///< FIFO - first activated alarm in each alarm priority category. + +static U32 alarmAudioVolumeLevel = MAX_ALARM_VOLUME_LEVEL; ///< Set alarm audio volume level (0..7). // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); static void updateAlarmsState( void ); -static void setAlarmLampAndAudio( void ); +static void setAlarmLamp( void ); +static void setAlarmAudio( void ); static void updateAlarmsSilenceStatus( void ); static void handleAlarmEscalations( void ); static void updateAlarmsFlags( void ); static void resetAlarmPriorityFIFO( ALARM_PRIORITY_T priority ); static U32 getAlarmStartTime( U32 alarmID ); -static U32 getPublishAlarmStatusInterval( void ); /*********************************************************************//** * @brief @@ -146,10 +148,12 @@ updateAlarmsState(); updateAlarmsFlags(); updateAlarmsSilenceStatus(); - setAlarmLampAndAudio(); // publish alarm status at interval - if ( ++alarmStatusPublicationTimerCounter >= getPublishAlarmStatusInterval() ) - { + if ( ++alarmStatusPublicationTimerCounter >= ALARM_STATUS_PUBLISH_INTERVAL ) + { + // lamp and audio timing sync'd with broadcast so UI can stay in sync with lamp rhythm + setAlarmLamp(); + setAlarmAudio(); broadcastAlarmStatus( alarmStatus ); alarmStatusPublicationTimerCounter = 0; } @@ -336,7 +340,7 @@ ALARM_ID_T a; // inactivate (clear) all active recoverable alarms - for ( a = 0; a < NUM_OF_ALARM_IDS; a++ ) + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { clearAlarm( a ); } @@ -458,6 +462,22 @@ return result; } + +/*********************************************************************//** + * @brief +* The setAlarmAudioVolume function sets the current alarm audio volume level. +* @details Inputs: none +* @details Outputs: alarmAudioVolumeLevel +* @param volumeLevel level of volume requested (0..7) +* @return none +*************************************************************************/ +void setAlarmAudioVolume( U32 volumeLevel ) +{ + if ( volumeLevel <= MAX_ALARM_VOLUME_LEVEL ) + { + alarmAudioVolumeLevel = volumeLevel; + } +} /*********************************************************************//** * @brief @@ -530,14 +550,15 @@ /*********************************************************************//** * @brief - * The setAlarmLampAndAudio function sets the alarm lamp and audio patterns - * according to the current state of alarms. + * The setAlarmLamp function sets the alarm lamp pattern according to the + * current state of alarms. * @details Inputs: none * @details Outputs: Alarm lamp patter set according to current alarms status. * @return none *************************************************************************/ -static void setAlarmLampAndAudio( void ) -{ +static void setAlarmLamp( void ) +{ + // set alarm lamp pattern to appropriate pattern for current alarm state if ( getCurrentAlarmLampPattern() != LAMP_PATTERN_MANUAL ) { switch ( alarmStatus.alarmsState ) @@ -570,45 +591,50 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, alarmStatus.alarmsState ) break; } - alarmStatus.lampOn = getAlarmLampOn(); } + + // execute alarm lamp controller + execAlarmLamp(); + + // set lamp on flag to match current state of alarm lamp + if ( getCurrentAlarmLampPattern() != LAMP_PATTERN_MANUAL ) + { + alarmStatus.lampOn = getAlarmLampOn(); + } else { alarmStatus.lampOn = FALSE; } - - if ( TRUE == alarmStatus.alarmsSilenced ) - { - // TODO - no audio - } - else // alarms not silenced - { - switch ( alarmStatus.alarmsState ) - { - case ALARM_PRIORITY_NONE: - // TODO - no audio - break; - - case ALARM_PRIORITY_LOW: - // TODO - low priority audio - break; - - case ALARM_PRIORITY_MEDIUM: - // TODO - medium priority audio - break; - - case ALARM_PRIORITY_HIGH: - // TODO - high priority audio - break; - - default: - // TODO - high priority audio - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, alarmStatus.alarmsState ) - break; - } - } } +/*********************************************************************//** + * @brief + * The setAlarmAudio function sets the alarm audio pattern according to + * the current state of alarms. + * @details Inputs: none + * @details Outputs: Alarm audio patter set according to current alarms status. + * @return none + *************************************************************************/ +static void setAlarmAudio( void ) +{ + if ( TRUE == alarmStatus.alarmsSilenced ) + { + setAlarmAudioState( ALARM_PRIORITY_NONE, alarmAudioVolumeLevel ); + } + else // alarms not silenced + { + if ( alarmStatus.alarmsState < NUM_OF_ALARM_PRIORITIES ) + { + setAlarmAudioState( alarmStatus.alarmsState, alarmAudioVolumeLevel ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, alarmStatus.alarmsState ) + setAlarmAudioState( ALARM_PRIORITY_HIGH, alarmAudioVolumeLevel ); + } + } +} + /*********************************************************************//** * @brief * The updateAlarmsSilenceStatus function updates the alarms silence state. @@ -781,83 +807,14 @@ } } -/*********************************************************************//** - * @brief - * The getPublishAlarmStatusInterval function gets the alarm status - * publication interval. - * @details Inputs: alarmStatusPublishInterval - * @details Outputs: none - * @return the current alarm status publication interval (in ms). - *************************************************************************/ -U32 getPublishAlarmStatusInterval( void ) -{ - U32 result = alarmStatusPublishInterval.data; - - if ( OVERRIDE_KEY == alarmStatusPublishInterval.override ) - { - result = alarmStatusPublishInterval.ovData; - } - - return result; -} - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief - * The testSetAlarmStatusPublishIntervalOverride function overrides the - * alarm status publish interval. - * @details Inputs: none - * @details Outputs: alarmStatusPublishInterval - * @param value override blood flow data publish interval with (in ms) - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetAlarmStatusPublishIntervalOverride( U32 value ) -{ - BOOL result = FALSE; - - // verify tester has logged in with HD - if ( TRUE == isTestingActivated() ) - { - U32 intvl = value / TASK_GENERAL_INTERVAL; - - result = TRUE; - alarmStatusPublishInterval.ovData = intvl; - alarmStatusPublishInterval.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetAlarmStatusPublishIntervalOverride function resets the override - * of the alarm status publish interval. - * @details Inputs: none - * @details Outputs: alarmStatusPublishInterval - * @return TRUE if override reset successful, FALSE if not - *************************************************************************/ -BOOL testResetAlarmStatusPublishIntervalOverride( void ) -{ - BOOL result = FALSE; - - // verify tester has logged in with HD - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - alarmStatusPublishInterval.override = OVERRIDE_RESET; - alarmStatusPublishInterval.ovData = alarmStatusPublishInterval.ovInitData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The testSetAlarmStateOverride function overrides the state of the * alarm active state for a given alarm with the alarm management with * a given active state.