Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r14d740bbb065f043daaa348bcda5f447e1c16a32 -rc28337436dce61c9ecc295d191c44628e089bf33 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 14d740bbb065f043daaa348bcda5f447e1c16a32) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision c28337436dce61c9ecc295d191c44628e089bf33) @@ -104,6 +104,7 @@ static BOOL bloodPrimeToDialysisRequest; ///< Flag indicates blood prime has completed and time to start dialysis. static BOOL rinsebackToRecircRequest; ///< Flag indicates user has requested to proceed to re-circulate sub-mode. static BOOL treatmentEndToRinsebackRequest; ///< Flag indicates user has requested final rinseback. +static BOOL resumeBlockedByAlarm; ///< Flag indicates an alarm has blocked resume of this treatment. static U32 pendingParamChangesTimer; ///< User required to confirm UF volume change within 1 minute. static F32 pendingUFVolumeChange; ///< An ultrafiltration volume change (mL) is pending user confirmation. @@ -158,6 +159,7 @@ bloodIsPrimed = FALSE; treatmentCompleted = FALSE; rinsebackDone = FALSE; + resumeBlockedByAlarm = FALSE; treatmentTimeMS = 0; lastTreatmentTimeStamp = 0; @@ -246,6 +248,19 @@ /*********************************************************************//** * @brief + * The isTreatmentResumeBlocked function determines whether the treatment has + * seen an alarm that prevents resumption. + * @details Inputs: resumeBlockedByAlarm + * @details Outputs: none + * @return resumeBlockedByAlarm + *************************************************************************/ +BOOL isTreatmentResumeBlocked( void ) +{ + return resumeBlockedByAlarm; +} + +/*********************************************************************//** + * @brief * The getTreatmentTimeRemainingSecs function determines the number of seconds * remaining in the treatment. * @details Inputs: presTreatmentTimeSecs, treatmentTimeMS @@ -595,6 +610,12 @@ activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_BY_USER ); } + // Check if resume treatment blocked by alarm + if ( TRUE == doesAlarmIndicateNoResume() ) + { + resumeBlockedByAlarm = TRUE; + } + // Check dialysate temperature during treatment mode (except end state where treatment is over, dialyzer is bypassed and temp is no longer an issue) if ( currentTreatmentState != TREATMENT_END_STATE ) { Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r14d740bbb065f043daaa348bcda5f447e1c16a32 -rc28337436dce61c9ecc295d191c44628e089bf33 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 14d740bbb065f043daaa348bcda5f447e1c16a32) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision c28337436dce61c9ecc295d191c44628e089bf33) @@ -113,6 +113,7 @@ TREATMENT_STATE_T getTreatmentState( void ); // Determine the current treatment sub-mode (state) BOOL isTreatmentCompleted( void ); // Determine whether the treatment has completed +BOOL isTreatmentResumeBlocked( void ); // Determine whether the treatment is not allowed to be resumed. U32 getTreatmentTimeRemainingSecs( void ); // Determine number of seconds remaining in the treatment U32 getActualTreatmentTimeSecs( void ); // Determine the actual treatment duration in seconds BOOL getRinsebackCompleted( void ); // Determine whether a rinseback has been completed Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r41eaf78372c0ee2a79b38d0a06bd3f02d54baed4 -rc28337436dce61c9ecc295d191c44628e089bf33 --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 41eaf78372c0ee2a79b38d0a06bd3f02d54baed4) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision c28337436dce61c9ecc295d191c44628e089bf33) @@ -912,6 +912,10 @@ { *rejReason = REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED; } + else if ( TRUE == isTreatmentResumeBlocked() ) + { + *rejReason = REQUEST_REJECT_REASON_TREATMENT_CANNOT_BE_RESUMED; + } else if ( ( RINSEBACK_STOP_INIT_STATE != rinsebackState ) && ( RINSEBACK_STOP_STATE != rinsebackState ) ) { *rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; Index: firmware/App/Modes/TreatmentRecirc.c =================================================================== diff -u -r25ede6f944eb53b68c8073404663c99d3ce158b0 -rc28337436dce61c9ecc295d191c44628e089bf33 --- firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 25ede6f944eb53b68c8073404663c99d3ce158b0) +++ firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision c28337436dce61c9ecc295d191c44628e089bf33) @@ -337,14 +337,18 @@ { BOOL result = FALSE; - if ( TREATMENT_RECIRC_RECIRC_STATE == treatmentRecircState ) + if ( treatmentRecircState != TREATMENT_RECIRC_RECIRC_STATE ) { - result = TRUE; - recircReconnectRequested = TRUE; + *rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; } + else if ( TRUE == isTreatmentResumeBlocked() ) + { + *rejReason = REQUEST_REJECT_REASON_TREATMENT_CANNOT_BE_RESUMED; + } else { - *rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; + result = TRUE; + recircReconnectRequested = TRUE; } return result; Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r25ede6f944eb53b68c8073404663c99d3ce158b0 -rc28337436dce61c9ecc295d191c44628e089bf33 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 25ede6f944eb53b68c8073404663c99d3ce158b0) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision c28337436dce61c9ecc295d191c44628e089bf33) @@ -130,11 +130,11 @@ 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. -static BOOL alarmAudioTestToneRequested; +static ALARM_AUDIO_SELF_TEST_STATE_T alarmAudioSelfTestState; ///< Current state of the alarm audio self tests. +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. + // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); @@ -212,6 +212,7 @@ alarmStatus.ok = FALSE; alarmAudioTestToneRequested = FALSE; + resumeBlockedByAlarmProperty = FALSE; alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; } @@ -649,6 +650,19 @@ /*********************************************************************//** * @brief + * The doesAlarmIndicateNoResume function determines whether any currently + * active alarm has treatment resume blocked property. + * @details Inputs: resumeBlockedByAlarmProperty + * @details Outputs: none + * @return TRUE if any active alarm has no resume property, FALSE if not + *************************************************************************/ +BOOL doesAlarmIndicateNoResume( void ) +{ + return resumeBlockedByAlarmProperty; +} + +/*********************************************************************//** + * @brief * The getCurrentAlarmStatePriority function determines the current alarm * state priority (NONE, LOW, MEDIUM, or HIGH). * @details Inputs: alarmStatus @@ -1139,7 +1153,8 @@ BOOL systemFault = FALSE; BOOL stop = FALSE; BOOL noClear = FALSE; - BOOL noResume = FALSE; + BOOL noResume = FALSE; + BOOL noResumePerAlarmPropertyOnly = FALSE; BOOL noRinseback = FALSE; BOOL noEndTreatment = FALSE; BOOL usrAckReq = FALSE; @@ -1164,6 +1179,7 @@ systemFault = ( TRUE == ALARM_TABLE[ a ].alarmIsFault ? TRUE : systemFault ); stop = ( TRUE == ALARM_TABLE[ a ].alarmStops ? TRUE : stop ); noClear = ( TRUE == ALARM_TABLE[ a ].alarmNoClear ? TRUE : noClear ); + noResumePerAlarmPropertyOnly = ( ALARM_TABLE[ a ].alarmNoResume ? TRUE : noResumePerAlarmPropertyOnly ); // 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; @@ -1228,7 +1244,8 @@ alarmStatus.noRinseback = noRinseback; alarmStatus.noEndTreatment = noEndTreatment; alarmStatus.ok = usrAckReq; - alarmStatus.noMinimize = noMinimize; + alarmStatus.noMinimize = noMinimize; + resumeBlockedByAlarmProperty = noResumePerAlarmPropertyOnly; } /*********************************************************************//** Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r9d924ec76ce770eb2a94088bfe37bfb0e30981a8 -rc28337436dce61c9ecc295d191c44628e089bf33 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 9d924ec76ce770eb2a94088bfe37bfb0e30981a8) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision c28337436dce61c9ecc295d191c44628e089bf33) @@ -206,6 +206,7 @@ BOOL isBloodRecircBlocked( void ); BOOL isDialysateRecircBlocked( void ); BOOL doesAlarmStatusIndicateStop( void ); +BOOL doesAlarmIndicateNoResume( void ); ALARM_PRIORITY_T getCurrentAlarmStatePriority( void ); BOOL isAlarmRecoverable( ALARM_ID_T alarm ); void setAlarmAudioVolume( U32 volumeLevel );