Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r9dd9502d10f57408dd50fd43275b29b89a8a66c9 -r8266598642c10b864905217d75d483f9ece15a0b --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9dd9502d10f57408dd50fd43275b29b89a8a66c9) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 8266598642c10b864905217d75d483f9ece15a0b) @@ -27,6 +27,7 @@ #include "UVReactors.h" //TODO control composition pumps +//TODO add header to functions /** * @addtogroup DGHeatDisinfectMode @@ -40,7 +41,7 @@ #define MAX_TPO_AND_TDI_SENSORS_DIFFERENCE 1U #define MAX_TEMPERATURE_DEVIATION_FROM_TARGET 4U -#define HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS 4000U //TODo do we need this? +#define HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS 4000U //TODo do we need this? Change this to the amount of time the composite pumps will run #define HEAT_DISINFECT_RECIRC_PATH_TIME_MS (1*60000) #define HEAT_DISINFECT_R1_TO_R2_TIME_MS (1*60000) #define HEAT_DISINFECT_R2_TO_R1_TIME_MS (1*60000) @@ -55,39 +56,46 @@ // ********** private data ********** -/// Heat disinfect evacuate states -typedef enum evacuate_path +/// Heat disinfect evacuate/fill states +typedef enum heat_disinfect_internal_states { - EVACUATE_OFF_STATE = 0, - EVACUATE_RECIRC_PATH_STATE, - EVACUATE_RESERVOIR_1_STATE, - EVACUATE_RESERVOIR_2_STATE, - NUM_OF_EVACUTE_STATES -} HEAT_DISINFECT_EVACUTE_STATE_T; //TODO do we need this enum? + INTERNAL_HEAT_DISINFECT_STATE_OFF = 0, + INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER, + INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH, + INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_1, + INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_2, + INTERNAL_HEAT_DISINFECT_STATE_COMPLETE, + NUM_OF_INTERNAL_STATES +} INTERNAL_HEAT_DISINFECT_STATE_T; -static HEAT_DISINFECT_EVACUTE_STATE_T heatDisinfectEvacState = EVACUATE_OFF_STATE; //TODO we might not need this -static DG_HEAT_DISINFECT_STATE_T heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; ///< Currently active heat disinfect state. +static INTERNAL_HEAT_DISINFECT_STATE_T heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; +static DG_HEAT_DISINFECT_STATE_T heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; ///< Currently active heat disinfect state. static U32 heatDisinfectElapsedTime; static U32 stateTimer; // ********** private function prototypes ********** static void stopActuators( void ); +static void setActuatorsToFillWater( void ); + static BOOL isTemperatureInRange( void ); static BOOL hasHeatDisinfectTimeElapsed( void ); -static void execEvacuateFluidPath( void ); // TODO may not be needed (internal state machine) +static void execHeatDisinfectInternalStates( void ); +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectOffState( void ); +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterState( void ); +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacRecircPathState( void ); +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisifnectEvacReservoir1State( void ); +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacReservoir2State( void ); + static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateRecircPath( void ); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateReservoir1( void ); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateReservoir2( void ); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWater( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysateFillWithWater( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectHeatWater( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterDeprimeReservoirs( void ); /*********************************************************************//** * @brief @@ -100,7 +108,7 @@ void initHeatDisinfectMode( void ) { heatDisinfectElapsedTime = 0; - heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; + heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; } /*********************************************************************//** @@ -129,59 +137,47 @@ *************************************************************************/ U32 execHeatDisinfectMode( void ) { - switch ( heatDisinfectionState ) + switch ( heatDisinfectState ) { case DG_HEAT_DISINFECT_STATE_START: - heatDisinfectionState = handleHeatDisinfectStart(); + heatDisinfectState = handleHeatDisinfectStart(); break; - case DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RECIRC_PATH: - heatDisinfectionState = handleHeatDisinfectEvacDialysateRecircPath(); + case DG_HEAT_DISINFECT_EVACUATE_DIALYSATE_FILL_WITH_WATER: + heatDisinfectState = handleHeatDisinfectEvacuateDialysateFillWithWater(); break; - case DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_1: - heatDisinfectionState = handleHeatDisinfectEvacDialysateReservoir1(); - break; - - case DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_2: - heatDisinfectionState = handleHeatDisinfectEvacDialysateReservoir2(); - break; - - case DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER: - heatDisinfectionState = handleHeatDisinfectFillWithWater(); - break; - case DG_HEAT_DISINFECT_STATE_HEAT_WATER: - heatDisinfectionState = handleHeatDisinfectHeatWater(); + heatDisinfectState = handleHeatDisinfectHeatWater(); break; case DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH: - heatDisinfectionState = handleHeatDisinfectRecirculationPath(); + heatDisinfectState = handleHeatDisinfectRecirculationPath(); break; case DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2: - heatDisinfectionState = handleHeatDisinfectReservoir1To2(); + heatDisinfectState = handleHeatDisinfectReservoir1To2(); break; case DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1: - heatDisinfectionState = handleHeatDisinfectReservoir2To1(); + heatDisinfectState = handleHeatDisinfectReservoir2To1(); break; case DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH: - heatDisinfectionState = handleHeatDisinfectDrainPath(); + heatDisinfectState = handleHeatDisinfectDrainPath(); break; - case DG_HEAT_DISINFECT_STATE_DEPRIME_RESERVOIRS: - heatDisinfectionState = handleHeatDisinfectDeprimeReservoirs(); + case DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS: + heatDisinfectState = handleHeatDisinfectFillWithWaterDeprimeReservoirs(); break; default: // TODO - s/w fault - heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; + heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; break; } - return (U32)heatDisinfectionState; + return (U32)heatDisinfectState; } /*********************************************************************//** @@ -195,7 +191,7 @@ *************************************************************************/ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ) { - return heatDisinfectionState; + return heatDisinfectState; } /*********************************************************************//** @@ -232,126 +228,23 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RECIRC_PATH; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_EVACUATE_DIALYSATE_FILL_WITH_WATER; stopActuators(); + heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; - // Set the actuators for evacuate recirculation path - setValveState ( VPI, VALVE_STATE_OPEN ); - setValveState ( VBF, VALVE_STATE_OPEN ); - setValveState ( VSP, VALVE_STATE_CLOSED ); - setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); - setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); - setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); - setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); - stateTimer = getMSTimerCount(); // For evac recirc path - return state; } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateRecircPath( void ) +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysateFillWithWater( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RECIRC_PATH; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_EVACUATE_DIALYSATE_FILL_WITH_WATER; - if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) - { - // Set the state to evacuate reservoir 1 - signalROPumpHardStop(); - setValveState ( VPI, VALVE_STATE_OPEN ); - setValveState ( VBF, VALVE_STATE_OPEN ); - setValveState ( VSP, VALVE_STATE_CLOSED ); - setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); - setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); - setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); - setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); - setDrainPumpTargetSpeed ( DRAIN_PUMP_TARGET_RPM ); + execHeatDisinfectInternalStates(); //TODO test to see if it is needed to be in an if statement - state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_1; - } - - return state; -} - -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateReservoir1( void ) -{ - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_1; - - F32 reservoir1Weight = getLoadCellFilteredWeight ( LOAD_CELL_A1 ); - - if ( reservoir1Weight <= EMPTY_RESERVOIRS_WEIGHT_GRAMS ) + if ( heatDisinfectInternalState == INTERNAL_HEAT_DISINFECT_STATE_COMPLETE ) { - // Set the state to evacuate reservoir 2 - setValveState ( VPI, VALVE_STATE_OPEN ); - setValveState ( VBF, VALVE_STATE_OPEN ); - setValveState ( VSP, VALVE_STATE_CLOSED ); - setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); - setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); - setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); - setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); - //setDrainPumpTargetSpeed ( DRAIN_PUMP_TARGET_RPM ); probably it is not needed - - state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_2; - } - - return state; -} - -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateReservoir2( void ) -{ - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_2; - - F32 reservoir2Weight = getLoadCellFilteredWeight ( LOAD_CELL_B1 ); - - if ( reservoir2Weight <= EMPTY_RESERVOIRS_WEIGHT_GRAMS ) - { - // Set the state to fill water - setValveState ( VPI, VALVE_STATE_OPEN ); - setValveState ( VBF, VALVE_STATE_OPEN ); - setValveState ( VSP, VALVE_STATE_CLOSED ); - setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); - setValveState ( VPO, VALVE_STATE_FILL_C_TO_NC ); - setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); - setValveState ( VRD, VALVE_STATE_R2_C_TO_NO ); - setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); - setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); - - // Start the UV reactors to disinfect the water that - // is being filled up - startInletUVReactor(); - startOutletUVReactor(); - - state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; - } - - return state; -} - -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWater( void ) -{ - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; - - F32 reservoir1Weight = getLoadCellFilteredWeight ( LOAD_CELL_A1 ); - F32 reservoir2Weight = getLoadCellFilteredWeight ( LOAD_CELL_B1 ); - - if ( reservoir1Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS && - reservoir2Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS ) - { + // Done with evacuation and fill, set the states to heat up water // Drain pump is stopped to exit the open loop mode signalDrainPumpHardStop(); @@ -377,7 +270,6 @@ } return state; - } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectHeatWater( void ) @@ -517,7 +409,15 @@ setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); stateTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1; + + if ( heatDisinfectElapsedTime > HEAT_DISINFECT_OVERALL_TIME_MS ) + { + state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; + } + else + { + state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; + } } return state; @@ -528,49 +428,216 @@ return state; } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs( void ) +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterDeprimeReservoirs( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DEPRIME_RESERVOIRS; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS; return state; } -static void execEvacuateFluidPath( void ) +static void execHeatDisinfectInternalStates( void ) { - switch ( heatDisinfectEvacState ) + switch ( heatDisinfectInternalState ) { - case EVACUATE_OFF_STATE: + case INTERNAL_HEAT_DISINFECT_STATE_OFF: + heatDisinfectInternalState = handleHeatDisinfectOffState(); break; - case EVACUATE_RECIRC_PATH_STATE: + case INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER: + heatDisinfectInternalState = handleHeatDisinfectFillWithWaterState(); break; - case EVACUATE_RESERVOIR_1_STATE: + case INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH: + heatDisinfectInternalState = handleHeatDisinfectEvacRecircPathState(); break; - case EVACUATE_RESERVOIR_2_STATE: + case INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_1: + heatDisinfectInternalState = handleHeatDisifnectEvacReservoir1State(); break; + case INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_2: + heatDisinfectInternalState = handleHeatDisinfectEvacReservoir2State(); + break; + + case INTERNAL_HEAT_DISINFECT_STATE_COMPLETE: + // Do nothing + break; + default: + heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; break; } } +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectOffState( void ) +{ + INTERNAL_HEAT_DISINFECT_STATE_T state = INTERNAL_HEAT_DISINFECT_STATE_OFF; + // If the state is evacuate dialysate, start with evacuating recirculate path + if ( heatDisinfectState == DG_HEAT_DISINFECT_EVACUATE_DIALYSATE_FILL_WITH_WATER ) + { + // Set the actuators for evacuate recirculation path + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + stateTimer = getMSTimerCount(); // For evac recirc path. TODO later, it should be controlled using + // the composite pump + state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH; + } + else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) + { + setActuatorsToFillWater(); + // Start the UV reactors to disinfect the water that + // is being filled up + startInletUVReactor(); + startOutletUVReactor(); + + state = INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER; + } + + return state; +} + +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterState( void ) +{ + INTERNAL_HEAT_DISINFECT_STATE_T state = INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER; + + F32 reservoir1Weight = getLoadCellFilteredWeight ( LOAD_CELL_A1 ); + F32 reservoir2Weight = getLoadCellFilteredWeight ( LOAD_CELL_B1 ); + + if ( reservoir1Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS && + reservoir2Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS ) + { + if ( heatDisinfectState == DG_HEAT_DISINFECT_EVACUATE_DIALYSATE_FILL_WITH_WATER ) + { + stopActuators(); + state = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; + } + else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) + { + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + stateTimer = getMSTimerCount(); + + state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH; + } + } + + return state; +} + +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacRecircPathState( void ) +{ + INTERNAL_HEAT_DISINFECT_STATE_T state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH; + + // TODO change this to composition pump mode + if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) + { + // Set the state to evacuate reservoir 1 + signalROPumpHardStop(); + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); + setDrainPumpTargetSpeed ( DRAIN_PUMP_TARGET_RPM ); + + state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_1; + } + + return state; +} + +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisifnectEvacReservoir1State( void ) +{ + INTERNAL_HEAT_DISINFECT_STATE_T state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_1; + + F32 reservoir1Weight = getLoadCellFilteredWeight ( LOAD_CELL_A1 ); + + if ( reservoir1Weight <= EMPTY_RESERVOIRS_WEIGHT_GRAMS ) + { + // Set the state to evacuate reservoir 2 + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); + //setDrainPumpTargetSpeed ( DRAIN_PUMP_TARGET_RPM ); probably it is not needed TODO test this + + state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_2; + } + + return state; +} + +static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacReservoir2State( void ) +{ + INTERNAL_HEAT_DISINFECT_STATE_T state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_2; + + F32 reservoir2Weight = getLoadCellFilteredWeight ( LOAD_CELL_B1 ); + + if ( reservoir2Weight <= EMPTY_RESERVOIRS_WEIGHT_GRAMS ) + { + if ( heatDisinfectState == DG_HEAT_DISINFECT_EVACUATE_DIALYSATE_FILL_WITH_WATER ) + { + setActuatorsToFillWater(); + state = INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER; + } + else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) + { + state = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; + } + } + + return state; +} + static void stopActuators( void ) { - /*setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); - setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); - setValveState ( VRD, VALVE_STATE_R2_C_TO_NO ); - setValveState ( VRO, VALVE_STATE_R2_C_TO_NC ); - setValveState ( VPO, VALVE_STATE_FILL_C_TO_NC ); - setValveState ( VBF, VALVE_STATE_CLOSED ); - setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState ( VPI, VALVE_STATE_CLOSED ); + // De-energize all the valves + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); setValveState ( VSP, VALVE_STATE_CLOSED ); - setValveState ( VPD, VALVE_STATE_DRAIN_C_TO_NC );*/ + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); //TODO composition pumps signalROPumpHardStop(); @@ -610,4 +677,20 @@ return result; } +static void setActuatorsToFillWater( void ) +{ + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_FILL_C_TO_NC ); + setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); + setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); +} + /**@}*/