/************************************************************************** * * 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 * * @author (last) Sean Nash * @date (last) 26-May-2020 * * @author (original) Sean * @date (original) 20-Apr-2020 * ***************************************************************************/ #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_MINS 5U #define HEAT_DISINFECTION_FLUSH_TIME_MINS 3U #define HEAT_DISINFECTION_OVERALL_TIME_MINS 30U #define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0U #define DRAIN_PUMP_TARGET_RPM 2800U #define RO_PUMP_TARGET_FLOW_RATE_LPM 0.9 // ********** 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 handleHeatDisinfectEvacDialysateReservoir1( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateReservoir2( 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 ) { switch ( heatDisinfectionState ) { case DG_HEAT_DISINFECT_STATE_START: heatDisinfectionState = handleHeatDisinfectStart(); 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(); 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 ) { // NOTE: make sure DG is not in the middle of something and it is in standby // initHeatDisinfectMode(); requestNewOperationMode( DG_MODE_HEAT ); } /*********************************************************************//** * @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(); requestNewOperationMode( DG_MODE_STAN ); } // ********** private function definitions ********** static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_1; setActuatorsToStop(); /*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_RECIRC_C_TO_NC ); setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); setROPumpTargetFlowRate( 0 ); //setDrainPumpTargetSpeed( DRAIN_PUMP_TARGET_RPM, PUMP_CONTROL_MODE_OPEN_LOOP ); stopInletUVReactor(); stopOutletUVReactor(); stopPrimaryHeater(); stopTrimmerHeater();*/ //TODO FOR TESTING ONLY, REMOVE state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; //TODO FOR TESTING ONLY, REMOVE return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateReservoir1( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVAC_DIALYSATE_RESERVOIR_1; 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 ); setROPumpTargetFlowRate( 0 ); signalDrainPumpHardStop(); stopInletUVReactor(); stopOutletUVReactor(); stopPrimaryHeater(); stopTrimmerHeater(); return state; } static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacDialysateReservoir2( void ) { } 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; 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 ); For the actual heat disinfection setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); // For sending the fluid to drain for pump testing 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 ); setROPumpTargetFlowRate( 0.7 ); //setDrainPumpTargetSpeed( 0, PUMP_CONTROL_MODE_CLOSED_LOOP ); //startInletUVReactor(); //startOutletUVReactor(); //startPrimaryHeater(); //stopTrimmerHeater(); // For debugging purposes only REMOVE state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2; // For debugging purposes only REMOVE 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 signalROPumpHardStop(); signalDrainPumpHardStop(); stopInletUVReactor(); stopOutletUVReactor(); stopPrimaryHeater(); stopTrimmerHeater(); } /**@}*/