Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r6311eb9b65fdeec7a285d25e07f3932ac0fb6cf1 -r07b9515c080aa68fecfa331cbc593adea4c0b8dc --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 6311eb9b65fdeec7a285d25e07f3932ac0fb6cf1) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 07b9515c080aa68fecfa331cbc593adea4c0b8dc) @@ -189,6 +189,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 ) { @@ -373,7 +375,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) ) @@ -415,17 +417,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: @@ -437,10 +436,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; } @@ -451,14 +481,27 @@ * @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 + { + alarmStatus.alarmsSilenceExpiresIn = calcTimeSince( alarmStatus.alarmsSilenceStart ) / MS_PER_SECOND; + if ( 0 == alarmStatus.alarmsEscalatesIn ) + { + alarmStatus.alarmsSilenced = FALSE; + } + } } /************************************************************************* @@ -472,7 +515,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; + } } /************************************************************************* @@ -487,7 +578,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; } /*************************************************************************