Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r518fb519933260477ba20118744399f94ac1a632 -r9dd9502d10f57408dd50fd43275b29b89a8a66c9 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 518fb519933260477ba20118744399f94ac1a632) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9dd9502d10f57408dd50fd43275b29b89a8a66c9) @@ -35,21 +35,23 @@ // ********** private definitions ********** -#define HEAT_DISINFECT_TARGET_TEMPERATURE 85U ///< Heat disinfection target temperature +// TODO: Change the target temperature to 85 +#define HEAT_DISINFECT_TARGET_TEMPERATURE 30U ///< Heat disinfection target temperature #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_RECIRC_PATH_TIME_MS 120000U -#define HEAT_DISINFECT_FLUSH_TIME_MINS 3U -#define HEAT_DISINFECT_OVERALL_TIME_MINS 50U +#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) +#define HEAT_DISINFECT_OVERALL_TIME_MS (50*60000) #define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0U #define DRAIN_PUMP_TARGET_RPM 2800U #define RO_PUMP_TARGET_FLOW_RATE_LPM 0.9 -#define FULL_RESERVOIRS_WEIGHT_GRAMS 2000U -#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 0U +#define FULL_RESERVOIRS_WEIGHT_GRAMS 500U +#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 200U // ********** private data ********** @@ -63,7 +65,7 @@ NUM_OF_EVACUTE_STATES } HEAT_DISINFECT_EVACUTE_STATE_T; //TODO do we need this enum? -static HEAT_DISINFECT_EVACUTE_STATE_T heatDisinfectEvacState = EVACUATE_OFF_STATE; +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 U32 heatDisinfectElapsedTime; static U32 stateTimer; @@ -72,6 +74,7 @@ static void stopActuators( void ); static BOOL isTemperatureInRange( void ); +static BOOL hasHeatDisinfectTimeElapsed( void ); static void execEvacuateFluidPath( void ); // TODO may not be needed (internal state machine) static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ); @@ -96,6 +99,7 @@ *************************************************************************/ void initHeatDisinfectMode( void ) { + heatDisinfectElapsedTime = 0; heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; } @@ -131,7 +135,8 @@ heatDisinfectionState = handleHeatDisinfectStart(); break; - case DG_HEAT_DISINFECT_STATE_EVAC_RECIRC_PATH: + case DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RECIRC_PATH: + heatDisinfectionState = handleHeatDisinfectEvacDialysateRecircPath(); break; case DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_1: @@ -218,7 +223,7 @@ *************************************************************************/ void stopDGHeatDisinfect( void ) { - heatDisinfectionState = DG_HEAT_DISINFECT_STATE_COMPLETE; + //heatDisinfectionState = DG_HEAT_DISINFECT_STATE_COMPLETE; stopActuators(); requestNewOperationMode( DG_MODE_STAN ); } @@ -227,7 +232,7 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_RECIRC_PATH; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RECIRC_PATH; stopActuators(); @@ -251,7 +256,7 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateRecircPath( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_RECIRC_PATH; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RECIRC_PATH; if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) { @@ -406,14 +411,19 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; + if ( hasHeatDisinfectTimeElapsed() ) + { + state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; + } // If the temperature is out of tolerance, go back to heat water - if ( ! isTemperatureInRange() ) + else if ( ! isTemperatureInRange() ) { state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; } - else if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) + else if ( didTimeout( stateTimer, HEAT_DISINFECT_RECIRC_PATH_TIME_MS ) ) { heatDisinfectElapsedTime = heatDisinfectElapsedTime + HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS; //TODO Test + // Set the state for reservoir 1 to reservoir 2 setValveState ( VPI, VALVE_STATE_OPEN ); setValveState ( VBF, VALVE_STATE_OPEN ); setValveState ( VSP, VALVE_STATE_CLOSED ); @@ -429,6 +439,7 @@ setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2; } @@ -439,14 +450,76 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2; - return state; + if ( hasHeatDisinfectTimeElapsed() ) + { + state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; + } + // If the temperature is out of tolerance, go back to heat water + else if ( ! isTemperatureInRange() ) + { + state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; + } + else if ( didTimeout( stateTimer, HEAT_DISINFECT_R1_TO_R2_TIME_MS ) ) + { + heatDisinfectElapsedTime = heatDisinfectElapsedTime + HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS; //TODO Test + // Set the state for reservoir 1 to 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_FILL_C_TO_NC ); + setValveState ( VDR, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRC, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); + setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); + setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1; + } + + return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1; + if ( hasHeatDisinfectTimeElapsed() ) + { + state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; + } + // If the temperature is out of tolerance, go back to heat water + else if ( ! isTemperatureInRange() ) + { + state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; + } + else if ( didTimeout( stateTimer, HEAT_DISINFECT_R2_TO_R1_TIME_MS ) ) + { + heatDisinfectElapsedTime = heatDisinfectElapsedTime + HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS; //TODO Test + // Set the state for reservoir 1 to 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_FILL_C_TO_NC ); + setValveState ( VDR, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRC, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); + setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); + + setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1; + } + return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ) @@ -525,4 +598,16 @@ return result; } +static BOOL hasHeatDisinfectTimeElapsed( void ) +{ + BOOL result = FALSE; + + if ( heatDisinfectElapsedTime > HEAT_DISINFECT_OVERALL_TIME_MS ) + { + result = TRUE; + } + + return result; +} + /**@}*/