Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r52863cba9685f31136ab3f4b4764a17ccf34fc05 -rf7e3018ec6ab762fe08efb42b21fb2ca970174b0 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 52863cba9685f31136ab3f4b4764a17ccf34fc05) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision f7e3018ec6ab762fe08efb42b21fb2ca970174b0) @@ -27,6 +27,8 @@ #define ALARM_STATUS_PUBLISH_INTERVAL (500/TASK_GENERAL_INTERVAL) // 500ms / task interval +#define ALARM_SILENCE_EXPIRES_IN_SECS (60) + #pragma pack(push,1) typedef struct { @@ -55,7 +57,16 @@ { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_SPEED_CHECK { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK - { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE } // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_MC_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_MC_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE } // ALARM_ID_WATCHDOG_EXPIRED }; const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_NONE, 0 }; @@ -180,6 +191,8 @@ // no need to do anything if alarm is already active if ( FALSE == getAlarmActive( alarm ) ) { + // if alarms silenced, end silence due to new alarm + alarmStatus.alarmsSilenced = FALSE; // if alarm is a fault, request transition to fault mode if ( TRUE == alarmTable[ alarm ].alarmIsFault ) { @@ -221,7 +234,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); + broadcastAlarmTriggered( (U16)alarm, blankAlarmData, blankAlarmData ); } activateAlarm( alarm ); } @@ -243,7 +256,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); + broadcastAlarmTriggered( (U16)alarm, alarmData, blankAlarmData ); } activateAlarm( alarm ); } @@ -266,7 +279,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); + broadcastAlarmTriggered( (U16)alarm, alarmData1, alarmData2 ); } activateAlarm( alarm ); } @@ -364,7 +377,7 @@ ALARM_ID_T a; BOOL faultsActive = FALSE; - // update FIFOs per alarm status table + // update FIFOs per active alarms table for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { if ( TRUE == getAlarmActive(a) ) @@ -406,17 +419,14 @@ { case ALARM_PRIORITY_NONE: requestAlarmLampPattern( LAMP_PATTERN_OK ); - // TODO - no audio break; case ALARM_PRIORITY_LOW: requestAlarmLampPattern( LAMP_PATTERN_LOW_ALARM ); - // TODO - low priority audio break; case ALARM_PRIORITY_MEDIUM: requestAlarmLampPattern( LAMP_PATTERN_MED_ALARM ); - // TODO - medium priority audio break; case ALARM_PRIORITY_HIGH: @@ -428,10 +438,41 @@ { requestAlarmLampPattern( LAMP_PATTERN_HIGH_ALARM ); } + break; + + default: + requestAlarmLampPattern( LAMP_PATTERN_FAULT ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, alarmStatus.alarmsState ) + break; + } + } + + 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_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, alarmStatus.alarmsState ) break; } @@ -442,14 +483,37 @@ * @brief updateAlarmsSilenceStatus * The updateAlarmsSilenceStatus function updates the alarms silence state. * @details - * Inputs : none - * Outputs : none + * Inputs : alarmStatus + * Outputs : alarmStatus * @param none * @return none *************************************************************************/ static void updateAlarmsSilenceStatus( void ) { + // if alarms not silenced, reset alarms silence related properties + if ( TRUE != alarmStatus.alarmsSilenced ) + { + alarmStatus.alarmsSilenceExpiresIn = 0; + alarmStatus.alarmsSilenceStart = 0; + } + else + { + U32 timeSinceAlarmSilenceStart = calcTimeSince( alarmStatus.alarmsSilenceStart ) / MS_PER_SECOND; + if ( timeSinceAlarmSilenceStart >= ALARM_SILENCE_EXPIRES_IN_SECS ) + { + alarmStatus.alarmsSilenceExpiresIn = 0; + } + else + { + alarmStatus.alarmsSilenceExpiresIn = ALARM_SILENCE_EXPIRES_IN_SECS - timeSinceAlarmSilenceStart; + } + // if alarms silence expires, end it + if ( 0 == alarmStatus.alarmsSilenceExpiresIn ) + { + alarmStatus.alarmsSilenced = FALSE; + } + } } /************************************************************************* @@ -463,7 +527,55 @@ *************************************************************************/ static void handleAlarmEscalations( void ) { + U32 secsToEscalate = 0; + ALARM_ID_T nextAlarmToEscalate = ALARM_ID_NO_ALARM; + ALARM_ID_T a; + // update escalations + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + { + if ( TRUE == getAlarmActive( a ) ) + { + // does active alarm escalate? + if ( ALARM_ID_NO_ALARM != alarmTable[ a ].alarmEscalatesTo ) + { + U32 secsRemaining = (S32)alarmTable[ a ].alarmEscalatesAfter - ( (S32)calcTimeSince( getAlarmStartTime( a ) / MS_PER_SECOND ) ); + + // time to escalate? + if ( secsRemaining <= 0 ) + { + activateAlarmNoData( alarmTable[ a ].alarmEscalatesTo ); + clearAlarm( a ); + } + else + { // no candidates for alarm escalation yet? + if ( ALARM_ID_NO_ALARM == nextAlarmToEscalate ) + { + secsToEscalate = secsRemaining; + nextAlarmToEscalate = a; + } + // sooner candidate for alarm escalation? + else if ( secsRemaining < secsToEscalate ) + { + secsToEscalate = secsRemaining; + nextAlarmToEscalate = a; + } + } + } // if alarm escalates + } // if alarm active + } // alarm table loop + + // update alarm escalation properties + if ( ALARM_ID_NO_ALARM == nextAlarmToEscalate ) + { + alarmStatus.alarmsToEscalate = FALSE; + alarmStatus.alarmsEscalatesIn = 0; + } + else + { + alarmStatus.alarmsToEscalate = TRUE; + alarmStatus.alarmsEscalatesIn = secsToEscalate; + } } /************************************************************************* @@ -478,7 +590,48 @@ *************************************************************************/ static void updateAlarmsFlags( void ) { + BOOL systemFault = FALSE; + BOOL stop = FALSE; + BOOL noClear = FALSE; + BOOL noResume = FALSE; + BOOL noRinseback = FALSE; + BOOL noEndTreatment = FALSE; + BOOL noNewTreatment = FALSE; + BOOL bypassDialyzer = FALSE; + ALARM_ID_T a; + // determine alarm flags + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + { + if ( TRUE == getAlarmActive( a ) ) + { + systemFault = ( TRUE == alarmTable[ a ].alarmIsFault ? TRUE : systemFault ); + stop = ( TRUE == alarmTable[ a ].alarmStops ? TRUE : stop ); + noClear = ( TRUE == alarmTable[ a ].alarmNoClear ? TRUE : noClear ); + noResume = ( TRUE == alarmTable[ a ].alarmNoResume ? TRUE : noResume ); + noRinseback = ( TRUE == alarmTable[ a ].alarmNoRinseback ? TRUE : noRinseback ); + noEndTreatment = ( TRUE == alarmTable[ a ].alarmNoEndTreatment ? TRUE : noEndTreatment ); + noNewTreatment = ( TRUE == alarmTable[ a ].alarmNoNewTreatment ? TRUE : noNewTreatment ); + bypassDialyzer = ( TRUE == alarmTable[ a ].alarmDialyzerBypass ? TRUE : bypassDialyzer ); + + } // if alarm active + } // alarm table loop + + // do not bypass dialyzer if stop or fault flag set + if ( ( TRUE == systemFault ) || ( TRUE == stop ) ) + { + bypassDialyzer = FALSE; + } + + // set updated alarm flags + alarmStatus.systemFault = systemFault; + alarmStatus.stop = stop; + alarmStatus.noClear = noClear; + alarmStatus.noResume = noResume; + alarmStatus.noRinseback = noRinseback; + alarmStatus.noEndTreatment = noEndTreatment; + alarmStatus.noNewTreatment = noNewTreatment; + alarmStatus.bypassDialyzer = bypassDialyzer; } /*************************************************************************