Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -rbbf1e3736be03a4f041ace57e0f95e23caf472dd -rcab7c64f095b7ed9061cc537ce48d82eb4464d92 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision bbf1e3736be03a4f041ace57e0f95e23caf472dd) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision cab7c64f095b7ed9061cc537ce48d82eb4464d92) @@ -14,8 +14,16 @@ * **************************************************************************/ +#include "Timers.h" #include "ModeHeatDisinfect.h" #include "OperationModes.h" +#include "Valves.h" +#include "Heaters.h" +#include "DrainPump.h" +#include "LoadCell.h" +#include "ROPump.h" +#include "TemperatureSensors.h" +#include "UVReactors.h" /** * @addtogroup DGHeatDisinfectMode @@ -24,12 +32,51 @@ // ********** private definitions ********** +#define HEAT_DISINFECTION_TARGET_TEMP 85U ///< Heat disinfection target temperature +#define HEAT_DISINFECTION_OVERALL_TIME 60U ///< Heat disinfection overall time in minutes +#define HEAT_DISINFECTION_RECIRC_PATH_TIME 5U +#define HEAT_DISINFECTION_FLUSH_TIME 3U + +#define DRAIN_PUMP_TARGET_RPM 600U +#define RO_PUMP_TARGET_PRESSURE 110U +#define TURN_ON TRUE +#define TURN_OFF FALSE + // ********** private data ********** -static DG_HEAT_DISINFECT_STATE_T heatState = DG_HEAT_DISINFECT_STATE_START; ///< Currently active heat disinfect state. +#pragma pack(push, 1) +typedef struct +{ + VALVE_STATE_NAMES_T valvesStates [ NUM_OF_VALVES ]; + U32 ROPumpTargetPressure; + BOOL compositionPump1; + BOOL compositionPump2; + U32 drainPumpTargetRPM; + BOOL inletUVReactor; + BOOL outletUVReactor; + BOOL primaryHeater; + BOOL trimmerHeater; +} ACTUATORS_STATE_T; +#pragma pack(pop) +static DG_HEAT_DISINFECT_STATE_T heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; ///< Currently active heat disinfect state. +static ACTUATORS_STATE_T actuatorsState; +static BOOL hasTemperatureReachedToTarget; +static U32 heatDisinfectElapsedTime; + // ********** private function prototypes ********** +static BOOL setActuators(); + +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFlush(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs(); + /*********************************************************************//** * @brief * The initHeatDisinfectMode function initializes the heat disinfect Mode module. @@ -40,7 +87,7 @@ *************************************************************************/ void initHeatDisinfectMode( void ) { - heatState = DG_HEAT_DISINFECT_STATE_START; + heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; } /*********************************************************************//** @@ -67,18 +114,47 @@ U32 execHeatDisinfectMode( void ) { // execute current heat disinfect state - switch ( heatState ) + switch ( heatDisinfectionState ) { case DG_HEAT_DISINFECT_STATE_START: + heatDisinfectionState = handleHeatDisinfectStart(); break; + case DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE: + heatDisinfectionState = handleHeatDisinfectEvacuateDialysate(); + break; + + case DG_HEAT_DISINFECT_STATE_FLUSH: + heatDisinfectionState = handleHeatDisinfectFlush(); + break; + + case DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH: + heatDisinfectionState = handleHeatDisinfectRecirculationPath(); + break; + + case DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2: + heatDisinfectionState = handleHeatDisinfectReservoir1To2(); + break; + + case DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1: + heatDisinfectionState = handleHeatDisinfectReservoir2To1(); + break; + + case DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH: + heatDisinfectionState = handleHeatDisinfectDrainPath(); + break; + + case DG_HEAT_DISINFECT_STATE_DEPRIME_RESERVOIRS: + heatDisinfectionState = handleHeatDisinfectDeprimeReservoirs(); + break; + default: // TODO - s/w fault - heatState = DG_HEAT_DISINFECT_STATE_START; + heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; break; } - return heatState; + return (U32)heatDisinfectionState; } /*********************************************************************//** @@ -92,7 +168,148 @@ *************************************************************************/ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ) { - return heatState; + return heatDisinfectionState; } +// ********** private function definitions ********** + +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_START; + + actuatorsState.valvesStates [ VRF ] = VALVE_STATE_R1_C_TO_NC; + actuatorsState.valvesStates [ VRI ] = VALVE_STATE_R2_C_TO_NC; + actuatorsState.valvesStates [ VRD ] = VALVE_STATE_R1_C_TO_NC; + actuatorsState.valvesStates [ VRO ] = VALVE_STATE_R2_C_TO_NC; + actuatorsState.valvesStates [ VPO ] = VALVE_STATE_FILL_C_TO_NC; + actuatorsState.valvesStates [ VBF ] = VALVE_STATE_CLOSED; + actuatorsState.valvesStates [ VRC ] = VALVE_STATE_RECIRC_C_TO_NC; + actuatorsState.valvesStates [ VDR ] = VALVE_STATE_RECIRC_C_TO_NC; + actuatorsState.valvesStates [ VPI ] = VALVE_STATE_CLOSED; + actuatorsState.valvesStates [ VSP ] = VALVE_STATE_CLOSED; + actuatorsState.valvesStates [ VR1 ] = 0; + actuatorsState.valvesStates [ VR2 ] = 0; + actuatorsState.valvesStates [ VPD ] = VALVE_STATE_DRAIN_C_TO_NC; + actuatorsState.compositionPump1 = TURN_OFF; + actuatorsState.compositionPump2 = TURN_OFF; + actuatorsState.drainPumpTargetRPM = 0; + actuatorsState.inletUVReactor = TURN_OFF; + actuatorsState.outletUVReactor= TURN_OFF; + actuatorsState.ROPumpTargetPressure = 0; + actuatorsState.primaryHeater = TURN_OFF; + actuatorsState.trimmerHeater = TURN_OFF; + + setActuators(); + + return state; +} +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE; + + return state; + +} +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFlush() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH; + + return state; + +} +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; + + return state; + + +} +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2; + + return state; + + +} +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1; + + return state; + +} +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; + + return state; + + +} +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs() +{ + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DEPRIME_RESERVOIRS; + + return state; +} + +BOOL setActuators() +{ + BOOL status = TRUE; + U08 i; + + for ( i = 0; i < NUM_OF_VALVES; i++ ) + { + status = setValveState ( i, actuatorsState.valvesStates [ i ] ); + } + + status = setROPumpTargetPressure( actuatorsState.ROPumpTargetPressure, PUMP_CONTROL_MODE_CLOSED_LOOP ); + + status = setDrainPumpTargetSpeed( actuatorsState.drainPumpTargetRPM ); + + // TODO composite pumps + + if ( actuatorsState.inletUVReactor ) + { + status = startInletUVReactor (); + } + else + { + stopInletUVReactor (); + } + + if ( actuatorsState.outletUVReactor ) + { + status = startOutletUVReactor (); + } + else + { + stopOutletUVReactor (); + } + + if ( actuatorsState.primaryHeater ) + { + setPrimaryHeaterTargetTemperature ( HEAT_DISINFECTION_TARGET_TEMP ); + status = startPrimaryHeater (); + } + else + { + stopPrimaryHeater (); + } + + if ( actuatorsState.trimmerHeater ) + { + setTrimmerHeaterTargetTemperature ( HEAT_DISINFECTION_TARGET_TEMP ); + status = startTrimmerHeater (); + } + else + { + stopTrimmerHeater(); + } + + return status; +} + /**@}*/