Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rbd30744a51141ff5e56088eac67a9641866ab6cc -r0f9838d6b8606a6a9853ccb6157e4c25d70ddd02 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision bd30744a51141ff5e56088eac67a9641866ab6cc) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 0f9838d6b8606a6a9853ccb6157e4c25d70ddd02) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2023 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 AlarmMgmt.c * * @author (last) Dara Navaei -* @date (last) 13-Jun-2022 +* @date (last) 18-Jan-2023 * * @author (original) Sean Nash * @date (original) 07-Nov-2019 @@ -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; @@ -212,8 +220,8 @@ * The execAlarmMgmt function executes the alarm management functions to be * done periodically. The composite alarm state is updated, alarm lamp and * audio patterns are updated, and status is sent out to the rest of the system. - * @details Inputs: alarmStatusTable[], ALARM_TABLE[] - * @details Outputs: alarmStatus + * @details Inputs: none + * @details Outputs: none * @return none *************************************************************************/ void execAlarmMgmt( void ) @@ -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(); } /*********************************************************************//** @@ -670,7 +671,7 @@ /*********************************************************************//** * @brief -* The handleActiveAlarmListRequest function processed the active alarms list +* The handleActiveAlarmListRequest function processes the active alarms list * request from UI. * @details Inputs: alarmIsActive[] * @details Outputs: sent active alarms list to UI @@ -703,6 +704,41 @@ sendActiveAlarmsList( accepted, rejReason, activeAlarmList, sizeof( activeAlarmList ) ); } + +/*********************************************************************//** + * @brief +* The handleResendActiveAlarmsRequest function processes the request to re-send +* all active alarms. +* @details Inputs: alarmIsActive[] +* @details Outputs: none +* @return none +*************************************************************************/ +void handleResendActiveAlarmsRequest( void ) +{ + U32 index; + + if ( TRUE == isAnyAlarmActive() ) + { + for ( index = 0; index < NUM_OF_ALARM_IDS; index++ ) + { + if ( TRUE == isAlarmActive( (ALARM_ID_T)index ) ) + { + ALARM_TRIGGERED_PAYLOAD_T data; + + data.alarm = index; + data.almDataType1 = BLANK_ALARM_DATA.dataType; + data.almData1 = BLANK_ALARM_DATA.data.uInt.data; + data.almDataType2 = BLANK_ALARM_DATA.dataType; + data.almData2 = BLANK_ALARM_DATA.data.uInt.data; + data.almPriority = ALARM_TABLE[ index ].alarmPriority; + data.almRank = ALARM_TABLE[ index ].alarmSubRank; + data.almClrTopOnly = ALARM_TABLE[ index ].alarmClearOnly; + + broadcastData( MSG_ID_ALARM_TRIGGERED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_TRIGGERED_PAYLOAD_T ) ); + } + } + } +} /*********************************************************************//** * @brief @@ -738,8 +774,8 @@ /*********************************************************************//** * @brief * The monitorAlarms function monitors alarm audio current. - * @details Inputs: alarmStatusTable[] - * @details Outputs: alarmPriorityFIFO[], alarmStatus + * @details Inputs: none + * @details Outputs: alarmPrimaryAudioCurrentHG * @return none *************************************************************************/ static void monitorAlarms( void ) @@ -751,9 +787,6 @@ alarmBackupAudioCurrent.data = getFPGABackupAlarmAudioCurrent(); // TODO - Check current vs. expected audio output - - // Publish alarm information at interval - publishAlarmInfo(); } /*********************************************************************//** @@ -894,8 +927,8 @@ * @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. + * @details Inputs: alarmAudioTestToneRequested + * @details Outputs: alarmAudioTestToneRequested * @return none *************************************************************************/ static void setAlarmAudio( void ) @@ -916,7 +949,7 @@ } // If alarm silenced, play no alarm audio. - else if ( TRUE == alarmStatus.alarmsSilenced ) + else if ( ( ALARM_PRIORITY_NONE == alarmStatus.alarmsState ) || ( TRUE == alarmStatus.alarmsSilenced ) ) { setAlarmAudioState( ALARM_PRIORITY_NONE, ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[volume][ALARM_AUDIO_VOLUME_GAIN], @@ -1046,8 +1079,8 @@ * @brief * The updateAlarmsFlags function updates the alarms flags of the alarms * status record. - * @details Inputs: none - * @details Outputs: alarmStatus + * @details Inputs: alarmStatus, alarmIsActive, ALARM_TABLE, alarmButtonBlockers + * @details Outputs: alarmStatus, alarmUserRecoveryActionEnabled, * @return none *************************************************************************/ static void updateAlarmsFlags( void ) @@ -1063,6 +1096,15 @@ HD_OP_MODE_T currentMode = getCurrentOperationMode(); ALARM_ID_T a; + // Set user alarm recovery actions allowed by state flags + alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RESUME ] = ( TRUE == alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_RESUME ] ? FALSE : TRUE ); + alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RINSEBACK ] = ( TRUE == alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_RINSEBACK ] ? FALSE : TRUE ); + alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_END_TREATMENT ] = ( TRUE == alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_END_TREATMENT ] ? FALSE : TRUE ); + // Reset user alarm recovery actions allowed by active alarms flags + alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RESUME ] = FALSE; + alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RINSEBACK ] = FALSE; + alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_END_TREATMENT ] = FALSE; + // Determine alarm flags for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { @@ -1072,6 +1114,9 @@ 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; if ( TRUE == alarmUserRecoveryActionEnabled[ ALARM_USER_ACTION_RESUME ] ) { noResume = ( TRUE == ALARM_TABLE[ a ].alarmNoResume ? TRUE : noResume ); @@ -1183,14 +1228,24 @@ /*********************************************************************//** * @brief - * The publishAlarmInfo function publishes alarm information at the set - * interval. - * @details Inputs: - * @details Outputs: alarm information are published to CAN bus. + * The publishAlarmInfo function publishes alarm information and status + * at the set intervals. + * @details Inputs: alarmInfoPublicationTimerCounter, alarmButtonBlockers + * @details Outputs: alarmStatusPublicationTimerCounter * @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 ) ) { @@ -1201,6 +1256,12 @@ data.audioCurrLG = getAlarmAudioPrimaryLowGainCurrent(); data.backupAudioCurr = getAlarmAudioBackupCurrent(); data.safetyShutdown = isSafetyShutdownActivated(); + data.uiAlarmButtonBlocks[ ALARM_BUTTON_TABLE_BLOCK_RESUME ] = (U08)alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RESUME ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_TABLE_BLOCK_RINSEBACK ] = (U08)alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_RINSEBACK ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_TABLE_BLOCK_END_TREATMENT ] = (U08)alarmButtonBlockers[ ALARM_BUTTON_TABLE_BLOCK_END_TREATMENT ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_STATE_BLOCK_RESUME ] = (U08)alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RESUME ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_STATE_BLOCK_RINSEBACK ] = (U08)alarmButtonBlockers[ ALARM_BUTTON_STATE_BLOCK_RINSEBACK ]; + data.uiAlarmButtonBlocks[ ALARM_BUTTON_STATE_BLOCK_END_TREATMENT ] = (U08)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; @@ -1351,6 +1412,18 @@ return result; } + +/*********************************************************************//** + * @brief + * The resetAlarmAudioPOSTState function resets the alarm audio POST state. + * @details Inputs: none + * @details Outputs: alarmAudioSelfTestState + * @return none + *************************************************************************/ +void resetAlarmAudioPOSTState( void ) +{ + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; +} /*************************************************************************