Index: firmware/App/Modes/TreatmentRecirc.c =================================================================== diff -u -rc9888e14bff0341adc3f05d60f6b6b3cb08ff738 -r44f94ed0e1a5c287d3ec39e6e0ef774e01714e8c --- firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision c9888e14bff0341adc3f05d60f6b6b3cb08ff738) +++ firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 44f94ed0e1a5c287d3ec39e6e0ef774e01714e8c) @@ -51,8 +51,8 @@ static BOOL recircBackToTreatmenRequested; ///< Flag indicates user requesting to go back to treatment (confirming re-connected). static BOOL recircResumeRequested; ///< Flag indicates user requesting resumption of re-circulating. static BOOL recircEndTreatmentRequested; ///< Flag indicates user requesting end of treatment. -static BOOL dialysateRecircBlocked; ///< Flag indicates previous user stop dialysate recirculation condition -static BOOL bloodRecircBlocked; ///< Flag indicates previous user stop blood recirculation condition +static BOOL prevDialysateRecircBlocked; ///< Flag indicates previous user stop dialysate recirculation condition +static BOOL prevBloodRecircBlocked; ///< Flag indicates previous user stop blood recirculation condition // ********** private function prototypes ********** static void resetTreatmentRecircFlags( void ); @@ -65,13 +65,14 @@ static TREATMENT_RECIRC_STATE_T handleRecircRecircState( void ); static TREATMENT_RECIRC_STATE_T handleRecircStoppedState( void ); static TREATMENT_RECIRC_STATE_T handleRecircReconnectPatientState( void ); -static TREATMENT_RECIRC_STATE_T handleTreatmentRecircOnOff( TREATMENT_RECIRC_STATE_T result ); static BOOL handleRecircReconnectUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static BOOL handleRecicConfirmReconnectUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static BOOL handleRecircResumeUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); static BOOL handleRecircConfirmDisconnectUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ); +static void checkTreatmentRecircOnOff( void ); + static void publishTreatmentRecircData( void ); /*********************************************************************//** @@ -88,8 +89,8 @@ recircTimerCtr = 0; recircPublishTimerCtr = 0; resetTreatmentRecircFlags(); - dialysateRecircBlocked = isDialysateRecircBlocked(); - bloodRecircBlocked = isBloodRecircBlocked(); + prevDialysateRecircBlocked = isDialysateRecircBlocked(); + prevBloodRecircBlocked = isBloodRecircBlocked(); } /*********************************************************************//** @@ -111,11 +112,11 @@ /*********************************************************************//** * @brief * The setFullStop function stops all HD activity. This function will be - * called by rinseback mode when an alarm (stop, noBloodRecirc, + * called by the recirculation on/off when an alarm (stop, noBloodRecirc, * noDialysateRecirc) occurs or the user pressed the stop button. - * Rinseback may be resumed later. - * @details Inputs: none - * @details Outputs: Blood and dialysate pumps stopped. Heparin pump stopped. + * Recirculation may be resumed. + * @details Inputs: pump status + * @details Outputs: Pumps stopped, blood circuit valves closed. * @return none *************************************************************************/ static void setFullStop( void ) @@ -128,17 +129,13 @@ signalDialOutPumpHardStop(); signalBloodPumpHardStop(); + // stop trimmer heater too + cmdStopDGTrimmerHeater(); + // Set valves to safe state - // Dialysate in bypass - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); // patient blood lines closed setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); - - // Stop the ancillary pumps - stopSyringePump(); - endAirTrapControl(); } /*********************************************************************//** @@ -167,6 +164,7 @@ stopSyringePump(); // Stop air trap leveling control endAirTrapControl(); + // Re-circulate dialysate side of dialyzer w/ heating to maintain temperature setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); cmdStartDGTrimmerHeater(); @@ -264,8 +262,7 @@ publishTreatmentRecircData(); // Start/stop dialysate recirculation during rinseback mode based on active alarms that would block it - treatmentRecircState = handleTreatmentRecircOnOff( treatmentRecircState ); - + checkTreatmentRecircOnOff( ); } /*********************************************************************//** @@ -319,6 +316,10 @@ setupForRecirculationStopState(); signalEndTreatment(); // signal end Tx sub-mode } + else if ( TRUE == recircResumeRequested ) // Restart the BP + { + setupForRecirculationState(); + } return result; } @@ -565,33 +566,37 @@ /*********************************************************************//** * @brief - * The handleTreatmentRecircOnOff function starts/stops recirculation + * The checkTreatmentRecircOnOff function starts/stops recirculation * during rinseback sub-mode based on active alarm properties. * Simplified case for user stop - all stop/all go states only. - * @details Inputs: none - * @details Outputs: dialysate recirculation started or stopped as appropriate + * @details Inputs: prevBloodRecircBlocked, prevDialysateRecircBlocked + * @details Inputs: alarmStatus, recircResumeRequested + * @details Outputs: recirculation started or stopped as appropriate; + * @details Outputs: prevBloodRecircBlocked,prevDialysateRecircBlocked * @return none *************************************************************************/ -static TREATMENT_RECIRC_STATE_T handleTreatmentRecircOnOff( TREATMENT_RECIRC_STATE_T result ) +static void checkTreatmentRecircOnOff( void ) { + BOOL dialysateRecircBlocked = isDialysateRecircBlocked(); // Flag indicates user stop dialysate recirculation condition + BOOL bloodRecircBlocked = isBloodRecircBlocked(); // Flag indicates user stop blood recirculation condition + // if there was any change - if ( ( dialysateRecircBlocked != isDialysateRecircBlocked() ) || ( bloodRecircBlocked != isBloodRecircBlocked() ) ) + if ( ( dialysateRecircBlocked != prevDialysateRecircBlocked ) || ( bloodRecircBlocked != prevBloodRecircBlocked ) ) { // Stop recirc if blocked by alarm - if ( ( TRUE == isDialysateRecircBlocked() ) && ( TRUE == isBloodRecircBlocked() ) ) + if ( ( TRUE == dialysateRecircBlocked ) && ( TRUE == bloodRecircBlocked ) ) { setFullStop( ); - result = TREATMENT_RECIRC_STOPPED_STATE; } - else if ( ( isDialysateRecircBlocked() != TRUE ) && ( isBloodRecircBlocked() != TRUE ) ) + else if ( ( dialysateRecircBlocked != TRUE ) && ( bloodRecircBlocked != TRUE ) ) { + // Re-circulate dialysate side of dialyzer w/ heating to maintain temperature setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); cmdStartDGTrimmerHeater(); + recircResumeRequested = TRUE; // Resume recirculation blood pump from where ever we are. } - bloodRecircBlocked = isBloodRecircBlocked(); - dialysateRecircBlocked = isDialysateRecircBlocked(); + prevBloodRecircBlocked = bloodRecircBlocked; + prevDialysateRecircBlocked = dialysateRecircBlocked; } - - return result; } /*********************************************************************//**