Index: firmware/App/Modes/TreatmentRecirc.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -r71319ba4a10ae2e8d33c74a388b39cff14e9b636 --- firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Modes/TreatmentRecirc.c (.../TreatmentRecirc.c) (revision 71319ba4a10ae2e8d33c74a388b39cff14e9b636) @@ -51,6 +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 prevDialysateRecircBlocked; ///< Flag indicates previous user stop dialysate recirculation condition +static BOOL prevBloodRecircBlocked; ///< Flag indicates previous user stop blood recirculation condition // ********** private function prototypes ********** @@ -69,6 +71,8 @@ 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 ); /*********************************************************************//** @@ -85,6 +89,8 @@ recircTimerCtr = 0; recircPublishTimerCtr = 0; resetTreatmentRecircFlags(); + prevDialysateRecircBlocked = isDialysateRecircBlocked(); + prevBloodRecircBlocked = isBloodRecircBlocked(); } /*********************************************************************//** @@ -122,13 +128,14 @@ setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setupForRecirculationStopState(); - // Enable venous bubble detection while recirculating - setVenousBubbleDetectionEnabled( TRUE ); + // Disable venous bubble detection while recirculating + setVenousBubbleDetectionEnabled( FALSE ); // Ensure syringe pump is stopped 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(); @@ -170,6 +177,7 @@ { // Stop blood pump signalBloodPumpHardStop(); + // Close arterial and venous lines setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); @@ -223,6 +231,9 @@ // Broadcast recirc status publishTreatmentRecircData(); + + // Start/stop dialysate recirculation during rinseback mode based on active alarms that would block it + checkTreatmentRecircOnOff( ); } /*********************************************************************//** @@ -522,6 +533,47 @@ /*********************************************************************//** * @brief + * 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: prevBloodRecircBlocked, prevDialysateRecircBlocked, + * alarmStatus, recircResumeRequested + * @details Outputs: recirculation started or stopped as appropriate; + * prevBloodRecircBlocked,prevDialysateRecircBlocked + * @return none + *************************************************************************/ +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 != prevDialysateRecircBlocked ) + { // Stop recirc if blocked by alarm + if ( ( TRUE == dialysateRecircBlocked ) ) + { // Stop the dialin pumps + signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); + } + else + { // 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(); + } + prevDialysateRecircBlocked = dialysateRecircBlocked; + } + if ( bloodRecircBlocked != prevBloodRecircBlocked ) + { // Stop recirc if blocked by alarm + if ( TRUE == bloodRecircBlocked ) + { + signalBloodPumpHardStop(); + } // Pump on/blood and valves dealt with in the state machine. + prevBloodRecircBlocked = bloodRecircBlocked; + } +} + +/*********************************************************************//** + * @brief * The publishTreatmentRecircData function publishes recirc progress to UI * at 1 Hz interval. * @details Inputs: recircPublishTimerCtr, recircTimerCtr