/**********************************************************************//** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModeHeatDisinfect.c * * @date 20-Dec-2019 * @author S. Nash * * @brief Top-level state machine for the heat disinfect mode. * **************************************************************************/ #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" //TODO control composition pumps /** * @addtogroup DGHeatDisinfectMode * @{ */ // ********** 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 2800U #define RO_PUMP_TARGET_PRESSURE 110U // ********** private data ********** static DG_HEAT_DISINFECT_STATE_T heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; ///< Currently active heat disinfect state. static BOOL hasTemperatureReachedToTarget; static U32 heatDisinfectElapsedTime; // ********** private function prototypes ********** static void setActuatorsToStop( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWater( 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 ); /*********************************************************************//** * @brief * The initHeatDisinfectMode function initializes the heat disinfect Mode module. * @details * Inputs : none * Outputs : none * @return none *************************************************************************/ void initHeatDisinfectMode( void ) { heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; } /*********************************************************************//** * @brief * The transitionToHeatDisinfectMode function prepares for transition * to heat disinfect mode. * @details * Inputs : none * Outputs : none * @return none *************************************************************************/ void transitionToHeatDisinfectMode( void ) { initHeatDisinfectMode(); setActuatorsToStop(); } /*********************************************************************//** * @brief * The execHeatDisinfectMode function executes the heat disinfect Mode * state machine. * @details * Inputs : none * Outputs : none * @return current state. *************************************************************************/ U32 execHeatDisinfectMode( void ) { // execute current heat disinfect state 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_FILL_WITH_WATER: heatDisinfectionState = handleHeatDisinfectFillWithWater(); break; case DG_HEAT_DISINFECT_STATE_HEAT_WATER: heatDisinfectionState = handleHeatDisinfectHeatWater(); 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 heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; break; } return (U32)heatDisinfectionState; } /*********************************************************************//** * @brief * The getCurrentHeatDisinfectState function returns the current state of the \n * heat disinfect mode. * @details * Inputs : heatState * Outputs : none * @return the current state of heat disinfect mode. *************************************************************************/ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ) { return heatDisinfectionState; } /*********************************************************************//** * @brief * The startDGHeatDisinfect function starts heat disinfect mode. * @details * Inputs : none * Outputs : none * @return none *************************************************************************/ void startDGHeatDisinfect( void ) { // make sure DG is not in the middle of something and it is in standby // transitionToHeatDisinfectMode(); // Call request start heat disinfect } /*********************************************************************//** * @brief * The stopDGHeatDisinfect function stops heat disinfect mode. * @details * Inputs : heatDisinfectionState * Outputs : heatDisinfectionState * @return none *************************************************************************/ void stopDGHeatDisinfect( void ) { heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; // request standby mode setActuatorsToStop(); // Not needed } // ********** private function definitions ********** static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_START; 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_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_R1_C_TO_NO ); setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); setROPumpTargetPressure( 0, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDrainPumpTargetSpeed( 0, PUMP_CONTROL_MODE_OPEN_LOOP ); stopInletUVReactor(); stopOutletUVReactor(); stopPrimaryHeater(); stopTrimmerHeater(); return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE; return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWater( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectHeatWater( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2; 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; return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DEPRIME_RESERVOIRS; return state; } static void setActuatorsToStop( void ) { setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); 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_RECIRC_C_TO_NC ); setValveState ( VDR, VALVE_STATE_RECIRC_C_TO_NC ); setValveState ( VPI, VALVE_STATE_CLOSED ); setValveState ( VSP, VALVE_STATE_CLOSED ); setValveState ( VPD, VALVE_STATE_DRAIN_C_TO_NC ); //TODO composition pumps setROPumpTargetPressure( 0, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDrainPumpTargetSpeed( 0, PUMP_CONTROL_MODE_OPEN_LOOP ); stopInletUVReactor(); stopOutletUVReactor(); stopPrimaryHeater(); stopTrimmerHeater(); } /**@}*/