Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -rcd21cbb4e733bfdf52f83bdca7a905645022c572 -r44e745e602377ae878e1d31f0469cdcc47248ace --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision cd21cbb4e733bfdf52f83bdca7a905645022c572) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 44e745e602377ae878e1d31f0469cdcc47248ace) @@ -45,11 +45,14 @@ /// Interval (ms/task time) at which the post-treatment state data is published on the CAN bus. #define POST_TREATMENT_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) +#define DIP_DRAIN_DG_FLOW_RATE_ML_MIN 60 ///< DG drain inlet pump flow rate in mL/min. +#define DIP_DRAIN_DG_RUNTIME_MS 20000 ///< DG drain inlet pump run time in ms. /// Post-Treatment drain reservoirs state machine. typedef enum Drain_States { - DRAIN_RESERVOIR_SWITCH_STATE = 0, ///< Switch reservoir state. + DRAIN_DG_DEPRIME_STATE = 0, ///< Drain DG De-prime dialysate lines of excess fluid state. + DRAIN_RESERVOIR_SWITCH_STATE, ///< Switch reservoir state. DRAIN_RESERVOIR_START_DRAIN_STATE, ///< Drain reservoir start drain state. DRAIN_RESERVOIR_DRAIN_STATE, ///< Drain first reservoir state. DRAIN_RESERVOIR_COMPLETE_STATE, ///< Drain complete state. @@ -62,6 +65,8 @@ static BOOL disposableRemovalConfirmed; ///< Flag indicates user confirms disposable removal. static BOOL rinseConcentrateLines; ///< FLag indicates to rinse concentrate lines. static BOOL isThisFirstDrain; ///< Flag to indicate whether this is the first time the reservoir is drained. +static BOOL drainDGDePrimeActive; ///< FLag to indicate DePrime DG Dialysate lines active +static U32 drainDGDePrimeStarttime; ///< DG DePrime start time static BOOL dgCommandSent; ///< Flag indicates whether a DG command has been already sent. static HD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current state of post-treatment mode state machine. static DRAIN_STATE_T currentDrainReservoirState; ///< Current drain reservoir state. @@ -79,6 +84,7 @@ static HD_POST_TREATMENT_STATE_T handlePostTreatmentVerifyState( void ); static void execDrainReservoirs( void ); +static DRAIN_STATE_T handleDrainDePrimeDGDialysateLinesState( void ); static DRAIN_STATE_T handleDrainReservoirSwitchState( void ); static DRAIN_STATE_T handleDrainReservoirStartDrainState( void ); static DRAIN_STATE_T handleDrainReservoirDrainState( void ); @@ -101,8 +107,10 @@ isThisFirstDrain = TRUE; dgCommandSent = FALSE; currentPostTreatmentState = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; - currentDrainReservoirState = DRAIN_RESERVOIR_SWITCH_STATE; + currentDrainReservoirState = DRAIN_DG_DEPRIME_STATE; postTreatmentPublishTimerCounter = 0; + drainDGDePrimeActive = FALSE; + drainDGDePrimeStarttime = 0; // Reset treatment log data memset( &treatmentLogData, 0x0, sizeof( TREATMENT_LOG_DATA_PAYLOAD_T ) ); @@ -505,6 +513,10 @@ { switch ( currentDrainReservoirState ) { + case DRAIN_DG_DEPRIME_STATE: + currentDrainReservoirState = handleDrainDePrimeDGDialysateLinesState(); + break; + case DRAIN_RESERVOIR_SWITCH_STATE: currentDrainReservoirState = handleDrainReservoirSwitchState(); break; @@ -529,6 +541,42 @@ /*********************************************************************//** * @brief + * The handleDrainDePrimeDGDialysateLinesState function waits for DG to complete + * reservoir switch. + * @details Inputs: + * @details Outputs: + * @return next state + *************************************************************************/ +static DRAIN_STATE_T handleDrainDePrimeDGDialysateLinesState( void ) +{ + DRAIN_STATE_T state = DRAIN_DG_DEPRIME_STATE; + + if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) + { + if ( FALSE == drainDGDePrimeActive ) + { + // First entry - Run DPi slow reverse, VDi, VDo closed in init, DPo Off in init. + setDialInPumpTargetFlowRate( DIP_DRAIN_DG_FLOW_RATE_ML_MIN, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); + drainDGDePrimeStarttime = getMSTimerCount(); + drainDGDePrimeActive = TRUE; + } + } + if ( TRUE == drainDGDePrimeActive ) + { + // Thereafter, check for time elapsed + if ( TRUE == didTimeout( drainDGDePrimeStarttime, DIP_DRAIN_DG_RUNTIME_MS ) ) + { + drainDGDePrimeActive = FALSE; + signalDialInPumpHardStop( ); + state = DRAIN_RESERVOIR_SWITCH_STATE; + } + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleDrainReservoirSwitchState function waits for DG to complete * reservoir switch. * @details Inputs: isThisFirstDrain, dgCommandSent