Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r46b163d19c65e8c21db7b0247bbb1af0dba1ece5 -r6e6b2319dc060c5fa59062742978ac47d3b92082 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 46b163d19c65e8c21db7b0247bbb1af0dba1ece5) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 6e6b2319dc060c5fa59062742978ac47d3b92082) @@ -128,6 +128,8 @@ static BOOL alarmUserRecoveryActionEnabled[ NUMBER_OF_ALARM_USER_ACTIONS ]; ///< Alarm user recovery actions enabled flags. +static BOOL alarmButtonBlockers[ NUM_OF_ALARM_BUTTON_BLOCKERS ]; ///< Flags indicating whether alarm table or state properties are blocking alarm buttons for UI. + /// Current state of the alarm audio self tests. static ALARM_AUDIO_SELF_TEST_STATE_T alarmAudioSelfTestState; /// Flag indicates whether alarm audio test tone should be output. @@ -161,8 +163,9 @@ *************************************************************************/ void initAlarmMgmt( void ) { - ALARM_PRIORITY_T p; - ALARM_ID_T a; + ALARM_PRIORITY_T p; + ALARM_ID_T a; + ALARM_BUTTON_BLOCKER_T b; // Disable backup audio CLR_BACKUP_AUDIO_ENABLE(); @@ -183,6 +186,11 @@ alarmPriorityFIFO[ p ].alarmID = ALARM_ID_NO_ALARM; alarmPriorityFIFO[ p ].subRank = LOWEST_ALARM_SUB_RANK; alarmPriorityFIFO[ p ].timeSinceTriggeredMS = 0; + } + // Initialize alarm button blocker flags + for ( b = (ALARM_BUTTON_BLOCKER_T)0; b < NUM_OF_ALARM_BUTTON_BLOCKERS; b++ ) + { + alarmButtonBlockers[ b ] = FALSE; } // Initialize composite alarm state alarmStatus.alarmsState = ALARM_PRIORITY_NONE; @@ -223,15 +231,8 @@ updateAlarmsState(); updateAlarmsFlags(); updateAlarmsSilenceStatus(); - // Publish alarm status at interval - if ( ++alarmStatusPublicationTimerCounter >= getU32OverrideValue( &alarmStatusPublishInterval ) ) - { - // Lamp and audio timing sync'd with broadcast so UI can stay in sync with lamp rhythm - setAlarmLamp(); - setAlarmAudio(); - broadcastAlarmStatus( alarmStatus ); - alarmStatusPublicationTimerCounter = 0; - } + // Publish alarm status and information at interval + publishAlarmInfo(); } /*********************************************************************//** @@ -786,9 +787,6 @@ alarmBackupAudioCurrent.data = getFPGABackupAlarmAudioCurrent(); // TODO - Check current vs. expected audio output - - // Publish alarm information at interval - publishAlarmInfo(); } /*********************************************************************//** @@ -1107,6 +1105,12 @@ stop = ( TRUE == ALARM_TABLE[ a ].alarmStops ? TRUE : stop ); noClear = ( TRUE == ALARM_TABLE[ a ].alarmNoClear ? TRUE : noClear ); // Set user alarm recovery actions allowed flags + alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RESUME ] = ALARM_TABLE[ a ].alarmNoResume; + alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RINSEBACK ] = ALARM_TABLE[ a ].alarmNoRinseback; + alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_END_TREATMENT ] = ALARM_TABLE[ a ].alarmNoEndTreatment; + alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RESUME ] = alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_RESUME ]; + alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RINSEBACK ] = alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_RINSEBACK ]; + alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_END_TREATMENT ] = alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_END_TREATMENT ]; if ( TRUE == alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_RESUME ] ) { noResume = ( TRUE == ALARM_TABLE[ a ].alarmNoResume ? TRUE : noResume ); @@ -1218,14 +1222,24 @@ /*********************************************************************//** * @brief - * The publishAlarmInfo function publishes alarm information at the set - * interval. + * The publishAlarmInfo function publishes alarm information and status + * at the set intervals. * @details Inputs: - * @details Outputs: alarm information are published to CAN bus. + * @details Outputs: alarm information and status are published to CAN bus. * @return none *************************************************************************/ static void publishAlarmInfo( void ) { + // Publish alarm status at interval + if ( ++alarmStatusPublicationTimerCounter >= getU32OverrideValue( &alarmStatusPublishInterval ) ) + { + // Lamp and audio timing sync'd with broadcast so UI can stay in sync with lamp rhythm + setAlarmLamp(); + setAlarmAudio(); + broadcastAlarmStatus( alarmStatus ); + alarmStatusPublicationTimerCounter = 0; + } + // Publish voltages monitor data on interval if ( ++alarmInfoPublicationTimerCounter >= getU32OverrideValue( &alarmInfoPublishInterval ) ) { @@ -1236,6 +1250,12 @@ data.audioCurrLG = getAlarmAudioPrimaryLowGainCurrent(); data.backupAudioCurr = getAlarmAudioBackupCurrent(); data.safetyShutdown = isSafetyShutdownActivated(); + data.uiAlarmButtonBlocks[ ALARM_BUTTON_TABLE_BLOCK_RESUME ] = alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RESUME ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_TABLE_BLOCK_RINSEBACK ] = alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RINSEBACK ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_TABLE_BLOCK_END_TREATMENT ] = alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_END_TREATMENT ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_STATE_BLOCK_RESUME ] = alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RESUME ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_STATE_BLOCK_RINSEBACK ] = alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RINSEBACK ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_STATE_BLOCK_END_TREATMENT ] = alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_END_TREATMENT ]; broadcastData( MSG_ID_HD_ALARM_INFORMATION, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( ALARM_INFO_PAYLOAD_T ) ); alarmInfoPublicationTimerCounter = 0; Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r46b163d19c65e8c21db7b0247bbb1af0dba1ece5 -r6e6b2319dc060c5fa59062742978ac47d3b92082 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 46b163d19c65e8c21db7b0247bbb1af0dba1ece5) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 6e6b2319dc060c5fa59062742978ac47d3b92082) @@ -118,16 +118,6 @@ ALARM_DATAS_T data; ///< The alarm data of specified type. } ALARM_DATA_T; -/// Payload record structure for the alarm info message. -typedef struct -{ - U32 audioVolume; ///< Audio volume level (1..5) - F32 audioCurrHG; ///< Primary alarm audio current - high gain (mA) - F32 audioCurrLG; ///< Primary alarm audio current - low gain (mA) - F32 backupAudioCurr; ///< Backup alarm audio current (mA) - BOOL safetyShutdown; ///< Safety shutdown activated? (T/F) -} ALARM_INFO_PAYLOAD_T; - /// Payload record structure for the alarm triggered message. typedef struct { @@ -143,7 +133,35 @@ #pragma pack(pop) +/// Enumeration of alarm button blockers. +typedef enum Alarm_Button_Blockers +{ + ALARM_BUTTON_TABLE_BLOCK_RESUME = 0, ///< Alarm table properties are blocking alarm resume button + ALARM_BUTTON_TABLE_BLOCK_RINSEBACK, ///< Alarm table properties are blocking alarm rinseback button + ALARM_BUTTON_TABLE_BLOCK_END_TREATMENT, ///< Alarm table properties are blocking alarm end treatment button + ALARM_BUTTON_STATE_BLOCK_RESUME, ///< State properties are blocking alarm resume button + ALARM_BUTTON_STATE_BLOCK_RINSEBACK, ///< State properties are blocking alarm rinseback button + ALARM_BUTTON_STATE_BLOCK_END_TREATMENT, ///< State properties are blocking alarm end treatment button + NUM_OF_ALARM_BUTTON_BLOCKERS ///< Number of alarm actions +} ALARM_BUTTON_BLOCKER_T; + +#pragma pack(push, 1) + +/// Payload record structure for the alarm info message. +typedef struct +{ + U32 audioVolume; ///< Audio volume level (1..5) + F32 audioCurrHG; ///< Primary alarm audio current - high gain (mA) + F32 audioCurrLG; ///< Primary alarm audio current - low gain (mA) + F32 backupAudioCurr; ///< Backup alarm audio current (mA) + BOOL safetyShutdown; ///< Safety shutdown activated? (T/F) + U08 uiAlarmButtonBlocks[ NUM_OF_ALARM_BUTTON_BLOCKERS ]; ///< Flags indicating UI alarm buttons blocked by alarm table or state +} ALARM_INFO_PAYLOAD_T; + +#pragma pack(pop) + #pragma pack(push, 2) + /// Payload record structure for an alarm status message. typedef struct {