Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -re6294e11f102440f7d825b697a31622ad0cdc370 -r5ca11d82e660ba31b6821420eb9098e036e6d93c --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision e6294e11f102440f7d825b697a31622ad0cdc370) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 5ca11d82e660ba31b6821420eb9098e036e6d93c) @@ -8,7 +8,7 @@ * @file AlarmMgmt.c * * @author (last) Sean Nash -* @date (last) 18-May-2023 +* @date (last) 02-Jun-2023 * * @author (original) Sean Nash * @date (original) 07-Nov-2019 @@ -142,6 +142,7 @@ static BOOL alarmAudioTestToneRequested; ///< Flag indicates whether alarm audio test tone should be output. static BOOL resumeBlockedByAlarmProperty; ///< Flag indicates whether treatment resumption is currently blocked by alarm property. +static BOOL alarmNoRetrigger; ///< Flag indicates whether some alarms should be prevented from re-triggering after being cleared by rinseback or end-tx options // ********** private function prototypes ********** @@ -154,7 +155,7 @@ static void updateAlarmsSilenceStatus( void ); static void updateAlarmsFlags( void ); -static void clearAllRecoverableAlarms( void ); +static void clearAllRecoverableAlarms( ALARM_USER_ACTION_T action ); static void resetAlarmPriorityFIFO( ALARM_PRIORITY_T priority ); static U32 getAlarmStartTime( ALARM_ID_T alarmID ); @@ -222,6 +223,7 @@ alarmsBlockedTimer = 0; alarmAudioTestToneRequested = FALSE; resumeBlockedByAlarmProperty = FALSE; + alarmNoRetrigger = FALSE; alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; } @@ -396,29 +398,33 @@ if ( ( ALARM_NOT_BLOCKED == alarmsBlockedTimer ) || ( ALARM_ID_HD_AC_POWER_LOST == alarm ) || ( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT == alarm ) ) - { - // Broadcast alarm and data if alarm not already active - if ( FALSE == alarmIsActive[ alarm ] ) + { // do not re-trigger alarm if blocked by property + if ( ( FALSE == alarmNoRetrigger ) || + ( ( ALARM_TABLE[ alarm ].alarmNoRetrigOnRB != TRUE ) && ( ALARM_TABLE[ alarm ].alarmNoRetrigOnEndTx != TRUE ) ) ) { - ALARM_TRIGGERED_PAYLOAD_T data; - - data.alarm = (U32)alarm; - data.almDataType1 = (U32)alarmData1.dataType; - data.almData1 = alarmData1.data.uInt.data; - data.almDataType2 = (U32)alarmData2.dataType; - data.almData2 = alarmData2.data.uInt.data; - data.almPriority = ALARM_TABLE[ alarm ].alarmPriority; - data.almRank = ALARM_TABLE[ alarm ].alarmSubRank; - data.almClrTopOnly = ALARM_TABLE[ alarm ].alarmClearOnly; - - broadcastData( MSG_ID_ALARM_TRIGGERED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_TRIGGERED_PAYLOAD_T ) ); - // Send information for UI to log to treatment log - if ( ( TRUE == ALARM_TABLE[ alarm ].alarmTreatmentLog ) && ( MODE_TREA == getCurrentOperationMode() ) ) + // Broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[ alarm ] ) { - sendTreatmentLogAlarmEventData( alarm, alarmData1, alarmData2 ); - } - } - activateAlarm( alarm ); + ALARM_TRIGGERED_PAYLOAD_T data; + + data.alarm = (U32)alarm; + data.almDataType1 = (U32)alarmData1.dataType; + data.almData1 = alarmData1.data.uInt.data; + data.almDataType2 = (U32)alarmData2.dataType; + data.almData2 = alarmData2.data.uInt.data; + data.almPriority = ALARM_TABLE[ alarm ].alarmPriority; + data.almRank = ALARM_TABLE[ alarm ].alarmSubRank; + data.almClrTopOnly = ALARM_TABLE[ alarm ].alarmClearOnly; + + broadcastData( MSG_ID_ALARM_TRIGGERED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_TRIGGERED_PAYLOAD_T ) ); + // Send information for UI to log to treatment log + if ( ( TRUE == ALARM_TABLE[ alarm ].alarmTreatmentLog ) && ( MODE_TREA == getCurrentOperationMode() ) ) + { + sendTreatmentLogAlarmEventData( alarm, alarmData1, alarmData2 ); + } + } + activateAlarm( alarm ); + } } } else @@ -490,6 +496,30 @@ { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, alarm ) } +} + +/*********************************************************************//** + * @brief + * The clearNoRetriggerFlag function clears the no re-trigger flag. + * @details Inputs: none + * @details Outputs: alarmNoRetrigger + * @return none + *************************************************************************/ +void clearNoRetriggerFlag( void ) +{ + alarmNoRetrigger = FALSE; +} + +/*********************************************************************//** + * @brief + * The clearNoRetriggerFlag function returns the no re-trigger flag. + * @details Inputs: alarmNoRetrigger + * @details Outputs: none + * @return alarmNoRetrigger + *************************************************************************/ +BOOL getNoRetriggerFlag( void ) +{ + return alarmNoRetrigger; } /*********************************************************************//** @@ -557,7 +587,7 @@ *************************************************************************/ void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action ) { - // Validate given action + // Clear recoverable alarms on user action if ( ( action < NUMBER_OF_ALARM_USER_ACTIONS ) && ( action != ALARM_USER_ACTION_END_TREATMENT ) ) // end tx action must be confirmed first { ALARM_ID_T a = alarmStatus.alarmTop; @@ -572,12 +602,12 @@ // Otherwise we must be in mode/state where ack was only option - so clear all like other options else { - clearAllRecoverableAlarms(); + clearAllRecoverableAlarms( action ); } } else { - clearAllRecoverableAlarms(); + clearAllRecoverableAlarms( action ); } } @@ -908,7 +938,7 @@ // Check for user confirmation of end treatment alarm response if ( CONFIRMATION_REQUEST_STATUS_ACCEPTED == getConfirmationRequestStatus( GENERIC_CONFIRM_ID_TREATMENT_END ) ) { - clearAllRecoverableAlarms(); + clearAllRecoverableAlarms( ALARM_USER_ACTION_END_TREATMENT ); initiateAlarmAction( ALARM_ACTION_END_TREATMENT ); } @@ -1160,7 +1190,7 @@ BOOL stop = FALSE; BOOL noClear = FALSE; BOOL noResume = FALSE; - BOOL noResumePerAlarmPropertyOnly = FALSE; + BOOL noResumePerAlarmPropertyOnly = alarmNoRetrigger; // cannot resume if no re-trigger flag is set BOOL noRinseback = FALSE; BOOL noEndTreatment = FALSE; BOOL usrAckReq = FALSE; @@ -1259,6 +1289,7 @@ alarmStatus.noEndTreatment = noEndTreatment; alarmStatus.ok = usrAckReq; alarmStatus.noMinimize = noMinimize; + alarmStatus.noReTrigger = alarmNoRetrigger; resumeBlockedByAlarmProperty = noResumePerAlarmPropertyOnly; } @@ -1267,20 +1298,44 @@ * The clearAllRecoverableAlarms function clears all currently active * recoverable alarms. * @details Inputs: ALARM_TABLE[] - * @details Outputs: All currently active recoverable alarms are cleared + * @details Outputs: alarmNoRetrigger, alarmIsActive[] + * @param action user action that prompted clearing of recoverable alarms * @return none *************************************************************************/ -static void clearAllRecoverableAlarms( void ) +static void clearAllRecoverableAlarms( ALARM_USER_ACTION_T action ) { ALARM_ID_T a; // assigning to 1 in order to prevent ALARM_ID_NO_ALARM being cleared // which will cause a fault - for ( a = ( ( ALARM_ID_T ) 1 ) ; a < NUM_OF_ALARM_IDS; a++ ) + for ( a = ( ( ALARM_ID_T ) 1 ); a < NUM_OF_ALARM_IDS; a++ ) { // Clear alarm if alarm allowed to be cleared and not clear only (those are cleared individually) if ( ( FALSE == ALARM_TABLE[ a ].alarmNoClear ) && ( FALSE == ALARM_TABLE[ a ].alarmClearOnly ) ) { + // set no re-trigger flag if appropriate + if ( TRUE == alarmIsActive[ a ] ) + { + if ( ( ALARM_USER_ACTION_RINSEBACK == action ) && ( TRUE == ALARM_TABLE[ a ].alarmNoRetrigOnRB ) ) + { // alarms with no re-trigger on rinseback property should set the no re-trigger flag + alarmNoRetrigger = TRUE; + } + else if ( ( ALARM_USER_ACTION_END_TREATMENT == action ) && ( TRUE == ALARM_TABLE[ a ].alarmNoRetrigOnEndTx ) ) + { // alarms with no re-trigger on end-tx property should set the no re-trigger flag + alarmNoRetrigger = TRUE; + } + else if ( ALARM_USER_ACTION_ACK == action ) + { + if ( ( TRUE == ALARM_TABLE[ a ].alarmNoResume ) && ( TRUE == ALARM_TABLE[ a ].alarmNoRinseback ) ) + { // alarms that only allow end-tx that occur in rinseback or recirc states of treatment mode should set the no re-trigger flag + if ( ( MODE_TREA == getCurrentOperationMode() ) && + ( ( TREATMENT_RINSEBACK_STATE == getCurrentSubMode() ) || ( TREATMENT_RECIRC_STATE == getCurrentSubMode() ) ) ) + { + alarmNoRetrigger = TRUE; + } + } + } + } clearAlarm( a ); } }