Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r49dba1e95bb3763b4c150e7a80b84a65264a7ca8 -r61c515bc5b8a9494ca25dbfcc2394f3a7b7c57e7 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 49dba1e95bb3763b4c150e7a80b84a65264a7ca8) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 61c515bc5b8a9494ca25dbfcc2394f3a7b7c57e7) @@ -83,6 +83,8 @@ static BOOL resumeTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment resume. static BOOL initiateRinsebackAlarmResponseRequest; ///< Flag indicates user has requested rinseback. static BOOL endTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment end. +static BOOL rinsebackToStoppedRequest; ///< Flag indicates user has requested return to treatment from rinseback workflow. +static BOOL rinsebackToEndTreatmentRequest; ///< Flag indicates user has requested end of treatment from rinseback workflow. 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. @@ -91,7 +93,7 @@ // ********** private function prototypes ********** -static void resetAlarmResponseFlags( void ); +static void resetSignalFlags( void ); static void broadcastTreatmentSettingsRanges( void ); static TREATMENT_STATE_T handleTreatmentStartState( void ); static TREATMENT_STATE_T handleTreatmentBloodPrimeState( void ); @@ -125,7 +127,7 @@ presMaxUFVolumeML = 0.0; presUFRate = 0.0; - resetAlarmResponseFlags(); + resetSignalFlags(); pendingParamChangesTimer = 0; pendingUFVolumeChange = 0.0; @@ -135,17 +137,19 @@ /*********************************************************************//** * @brief - * The resetAlarmResponseFlags function resets the alarm response flags. + * The resetSignalFlags function resets all signal flags. * @details Inputs: none - * @details Outputs: flags set to FALSE + * @details Outputs: signal flags set to FALSE * @return none *************************************************************************/ -static void resetAlarmResponseFlags( void ) +static void resetSignalFlags( void ) { alarmStopSignalled = FALSE; resumeTreatmentAlarmResponseRequest = FALSE; initiateRinsebackAlarmResponseRequest = FALSE; endTreatmentAlarmResponseRequest = FALSE; + rinsebackToStoppedRequest = FALSE; + rinsebackToEndTreatmentRequest = FALSE; } /*********************************************************************//** @@ -279,6 +283,32 @@ /*********************************************************************//** * @brief + * The signalRinsebackToStopped function signals that user wants to return + * to treatment from rinseback workflow. + * @details Inputs: none + * @details Outputs: flag + * @return none + *************************************************************************/ +void signalRinsebackToStopped( void ) +{ + rinsebackToStoppedRequest = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalRinsebackToEnd function signals that user wants to end the + * treatment from rinseback workflow. + * @details Inputs: none + * @details Outputs: flag + * @return none + *************************************************************************/ +void signalRinsebackToEnd( void ) +{ + rinsebackToEndTreatmentRequest = TRUE; +} + +/*********************************************************************//** + * @brief * The execTreatmentMode function executes the Treatment Mode state machine. * @details Inputs: currentTreatmentState * @details Outputs: currentTreatmentState @@ -337,7 +367,7 @@ } // Alarm response request flags should be handled at this point, reset in case not handled in current state - resetAlarmResponseFlags(); + resetSignalFlags(); // Broadcast treatment data broadcastTreatmentTimeAndState(); @@ -535,6 +565,19 @@ execRinseback(); + if ( TRUE == rinsebackToStoppedRequest ) + { + rinsebackToStoppedRequest = FALSE; + transitionToTreatmentStop(); + result = TREATMENT_STOP_STATE; + } + else if ( TRUE == rinsebackToEndTreatmentRequest ) + { + rinsebackToEndTreatmentRequest = FALSE; + // TODO - transition to end state + result = TREATMENT_END_STATE; + } + return result; } Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -rfa356a2bce909141f45c6832659fa1ceea5bfbba -r61c515bc5b8a9494ca25dbfcc2394f3a7b7c57e7 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision fa356a2bce909141f45c6832659fa1ceea5bfbba) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 61c515bc5b8a9494ca25dbfcc2394f3a7b7c57e7) @@ -84,6 +84,8 @@ void transitionToTreatmentMode( void ); // Prepares for transition to treatment mode U32 execTreatmentMode( void ); // Execute the treatment mode state machine (call from OperationModes) void signalAlarmActionToTreatmentMode( ALARM_ACTION_T action ); // Execute alarm action as appropriate for Treatment mode +void signalRinsebackToStopped( void ); // Rinseback or Re-circ sub-mode is signaling to return to treatment stopped sub-mode +void signalRinsebackToEnd( void ); // Rinseback or Re-circ sub-mode is signaling to end treatment TREATMENT_STATE_T getTreatmentState( void ); // Determine the current treatment sub-mode (state) BOOL getRinsebackCompleted( void ); // Determine whether a rinseback has been completed Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r49dba1e95bb3763b4c150e7a80b84a65264a7ca8 -r61c515bc5b8a9494ca25dbfcc2394f3a7b7c57e7 --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 49dba1e95bb3763b4c150e7a80b84a65264a7ca8) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 61c515bc5b8a9494ca25dbfcc2394f3a7b7c57e7) @@ -38,9 +38,9 @@ // ********** private definitions ********** #define TARGET_RINSEBACK_VOLUME_ML 300.0 ///< Target rinseback volume to deliver back to the patient (in mL). -#define RINSEBACK_FLOW_RATE_ADJ_ML_MIN 25.0 ///< Adjustment amount (in mL/min) to apply when user requests increase/decrease in flow rate. -#define MIN_RINSEBACK_FLOW_RATE_ML_MIN 50.0 ///< Minimum rinseback flow rate (in mL/min). -#define MAX_RINSEBACK_FLOW_RATE_ML_MIN 150.0 ///< Maximum rinseback flow rate (in mL/min). +#define RINSEBACK_FLOW_RATE_ADJ_ML_MIN 25 ///< Adjustment amount (in mL/min) to apply when user requests increase/decrease in flow rate. +#define MIN_RINSEBACK_FLOW_RATE_ML_MIN 50 ///< Minimum rinseback flow rate (in mL/min). +#define MAX_RINSEBACK_FLOW_RATE_ML_MIN 150 ///< Maximum rinseback flow rate (in mL/min). static const F32 RINSEBACK_FLOW_INTEGRATOR = 1.0 / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); @@ -139,8 +139,8 @@ // Set valves to safe state setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBA, VALVE_POSITION_B_OPEN ); - setValvePosition( VBV, VALVE_POSITION_B_OPEN ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); // Ensure all pumps except DPi stopped signalBloodPumpHardStop(); @@ -165,7 +165,6 @@ { case RINSEBACK_STOP_INIT_STATE: rinsebackState = handleRinsebackStopInitState(); - //setBloodIsPrimed( FALSE ); TODO - call in handler when transition to RB run break; case RINSEBACK_RUN_STATE: @@ -206,6 +205,26 @@ { RINSEBACK_STATE_T result = RINSEBACK_STOP_INIT_STATE; + if ( TRUE == startRinsebackRequested ) + { + // Open VBA and VBV valves to allow flow from saline bag and to patient venous line + setValvePosition( VBA, VALVE_POSITION_B_OPEN ); + setValvePosition( VBV, VALVE_POSITION_B_OPEN ); + // Start blood pump at rinseback flow rate + setBloodPumpTargetFlowRate( getTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + // From moment we start rinseback, we consider blood side of dialyzer no longer fully primed + setBloodIsPrimed( FALSE ); + result = RINSEBACK_RUN_STATE; + } + else if ( TRUE == backToTreatmentRequested ) + { + // TODO - signal treatment mode to go back to treatment stop state + } + else if ( TRUE == endTreatmentRequested ) + { + // TODO - signal treatment mode to go to treatment end state + } + return result; } @@ -225,7 +244,7 @@ cumulativeRinsebackVolume_mL += ( getMeasuredBloodFlowRate() * RINSEBACK_FLOW_INTEGRATOR ); // Has rinseback completed? - if ( cumulativeRinsebackVolume_mL <= TARGET_RINSEBACK_VOLUME_ML ) + if ( cumulativeRinsebackVolume_mL >= TARGET_RINSEBACK_VOLUME_ML ) { setRinsebackIsCompleted( TRUE ); result = RINSEBACK_STOP_STATE; @@ -238,14 +257,32 @@ // Otherwise, continue rinseback else { // Has user requested rate change? - if ( ( TRUE == incrRinsebackFlowRateRequested ) || ( TRUE == incrRinsebackFlowRateRequested ) ) + if ( ( TRUE == incrRinsebackFlowRateRequested ) || ( TRUE == decrRinsebackFlowRateRequested ) ) { - // TODO - update rate if within limits + U32 rbRate = getTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); + + if ( TRUE == incrRinsebackFlowRateRequested ) + { + rbRate += RINSEBACK_FLOW_RATE_ADJ_ML_MIN; + } + else + { + rbRate -= RINSEBACK_FLOW_RATE_ADJ_ML_MIN; + } + if ( ( rbRate >= MIN_RINSEBACK_FLOW_RATE_ML_MIN ) && ( rbRate <= MAX_RINSEBACK_FLOW_RATE_ML_MIN ) ) + { + setTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE, rbRate ); + } } + + // TODO - monitor max time or independent volume as safety check for rinseback operation } return result; } +#define RINSEBACK_FLOW_RATE_ADJ_ML_MIN 25 ///< Adjustment amount (in mL/min) to apply when user requests increase/decrease in flow rate. +#define MIN_RINSEBACK_FLOW_RATE_ML_MIN 50 ///< Minimum rinseback flow rate (in mL/min). +#define MAX_RINSEBACK_FLOW_RATE_ML_MIN 150 ///< Maximum rinseback flow rate (in mL/min). /*********************************************************************//** * @brief @@ -418,7 +455,7 @@ static BOOL handleIncrRinsebackUserAction( REQUEST_REJECT_REASON_CODE_T *rejReason ) { BOOL result = FALSE; - F32 rbRate = (F32)getTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); + U32 rbRate = getTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); if ( ( rbRate + RINSEBACK_FLOW_RATE_ADJ_ML_MIN ) <= MAX_RINSEBACK_FLOW_RATE_ML_MIN ) {