Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rd608769332d4ffe19f39a18caca14d6155f13e0a -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision d608769332d4ffe19f39a18caca14d6155f13e0a) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -36,7 +36,8 @@ // ********** private definitions ********** /// Treatment stop status broadcast interval. -#define TREATMENT_STOP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +#define TREATMENT_STOP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +#define DIALYSATE_FLOW_RATE_FOR_BLOOD_DETECT_RECOVERY_MLPM 600 ///< Dialysate flow rate for blood detect recovery in mL/min. // ********** private data ********** @@ -55,6 +56,8 @@ static TREATMENT_STOP_STATE_T handleTreatmentStopAlarmsAndSignals( TREATMENT_STOP_STATE_T state ); static TREATMENT_STOP_STATE_T handleTreatmentStopDialysateRecircState( void ); static TREATMENT_STOP_STATE_T handleTreatmentStopBloodRecircState( void ); +static TREATMENT_STOP_STATE_T handleTreatmentRecoverBloodDetectState( void ); +static void setupForRecoverBloodDetectState( void ); static void handleTreatmentStopBloodSittingTimer( void ); static void publishTreatmentStopData( void ); @@ -252,6 +255,10 @@ currentTxStopState = handleTreatmentStopNoRecircState(); break; + case TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE: + currentTxStopState = handleTreatmentRecoverBloodDetectState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, currentTxStopState ); break; @@ -276,9 +283,11 @@ *************************************************************************/ static TREATMENT_STOP_STATE_T handleTreatmentStopAlarmsAndSignals( TREATMENT_STOP_STATE_T state ) { + // TODO Sorry Sean, I had to! TREATMENT_STOP_STATE_T result = state; - BOOL bloodRecircBlocked = isBloodRecircBlocked(); - BOOL dialysateRecircBlocked = isDialysateRecircBlocked(); + BOOL bloodRecircBlocked = isBloodRecircBlocked(); + BOOL dialysateRecircBlocked = isDialysateRecircBlocked(); + BOOL isBloodDetectAlarmActive = FALSE; // Both unblocked and not in recirculate both state if ( ( TREATMENT_STOP_RECIRC_STATE != state ) && ( FALSE == dialysateRecircBlocked ) && ( FALSE == bloodRecircBlocked ) ) @@ -314,6 +323,13 @@ result = TREATMENT_STOP_RECIRC_DIALYSATE_ONLY_STATE; } + if ( ( TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE != state ) && ( dialysateRecircBlocked != TRUE ) && + ( TRUE == isAlarmActive( ALARM_ID_HD_BLOOD_LEAK_RECOVERING_PLEASE_WAIT ) ) ) + { + setupForRecoverBloodDetectState(); + result = TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE; + } + return result; } @@ -391,6 +407,23 @@ return result; } +static TREATMENT_STOP_STATE_T handleTreatmentRecoverBloodDetectState( void ) +{ + TREATMENT_STOP_STATE_T result = TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE; + + result = handleTreatmentStopAlarmsAndSignals( result ); + + return result; +} + +static void setupForRecoverBloodDetectState( void ) +{ + doorClosedRequired( TRUE, TRUE ); + // Close dialyzer inlet and go to bypass mode + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_BLOOD_DETECT_RECOVERY_MLPM, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); +} + /*********************************************************************//** * @brief * The handleTreatmentStopBloodSittingTimer function handles the no re-circ