/**********************************************************************//** * * 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" /** * @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 600U #define RO_PUMP_TARGET_PRESSURE 110U #define TURN_ON TRUE #define TURN_OFF FALSE // ********** private data ********** #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. * @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(); } /*********************************************************************//** * @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_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 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; } // ********** 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; } /**@}*/