/************************************************************************** * * Copyright (c) 2019-2022 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 ModeFault.c * * @author (last) Dara Navaei * @date (last) 12-Jul-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 * ***************************************************************************/ #include "ConcentratePumps.h" #include "DrainPump.h" #include "Heaters.h" #include "ModeFault.h" #include "NVDataMgmt.h" #include "OperationModes.h" #include "ROPump.h" #include "RTC.h" #include "SystemCommMessages.h" #include "UVReactors.h" #include "Valves.h" /** * @addtogroup DGFaultMode * @{ */ // ********** private definitions ********** #define DELAY_VALVE_MS ( 1 * MS_PER_SECOND ) ///< Valve state change delay in ms. // ********** private data ********** static DG_FAULT_STATE_T faultState; ///< Currently active fault state. static DG_POST_STATE_T faultPOSTState; ///< Fault POST state. static SELF_TEST_STATUS_T faultPOSTSelfTestResult; ///< Fault POST self test result. // ********** private function prototypes ********** static DG_FAULT_STATE_T handleRunNVPOSTsState( void ); /*********************************************************************//** * @brief * The initFaultMode function initializes the Fault Mode module. * @details Inputs: none * @details Outputs: Fault mode module initialized * @return none *************************************************************************/ void initFaultMode( void ) { faultState = DG_FAULT_STATE_START; faultPOSTState = DG_POST_STATE_RTC; faultPOSTSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; } /*********************************************************************//** * @brief * The transitionToFaultMode function prepares for transition to fault mode. * @details Inputs: none * @details Outputs: none * @return initial state *************************************************************************/ U32 transitionToFaultMode( void ) { deenergizeActuators(); initFaultMode(); // Publish POST failure status to UI if fault triggered in Init/POST mode if ( DG_MODE_INIT == getPreviousOperationMode() ) { // Broadcast final POST failed sendPOSTFinalResult( FALSE ); } // Reset the RTC and NV data management POST states so // the POSTs can be redone again resetNVDataMgmtPostState(); resetRTCPostState(); return faultState; } /*********************************************************************//** * @brief * The execFaultMode function executes the fault mode state machine. * @details Inputs: none * @details Outputs: Fault mode state machine executed * @return current state of fault mode *************************************************************************/ U32 execFaultMode( void ) { deenergizeActuators(); // execute current fault state switch ( faultState ) { case DG_FAULT_STATE_START: faultState = DG_FAULT_STATE_RUN_NV_POSTS; break; case DG_FAULT_STATE_RUN_NV_POSTS: faultState = handleRunNVPOSTsState(); break; case DG_FAULT_STATE_COMPLETE: // Do nothing break; default: faultState = DG_FAULT_STATE_COMPLETE; break; } return faultState; } /*********************************************************************//** * @brief * The getCurrentFaultState function returns the current state of the fault mode. * @details Inputs: faultState * @details Outputs: none * @return current state of fault mode *************************************************************************/ DG_FAULT_STATE_T getCurrentFaultState( void ) { return faultState; } /*********************************************************************//** * @brief * The deenergizeActuators function sets all the actuators to reset and * de-energized state. * @details Inputs: none * @details Outputs: none * @return none *************************************************************************/ void deenergizeActuators( void ) { // Turn off the UV reactors turnOffUVReactor( INLET_UV_REACTOR ); turnOffUVReactor( OUTLET_UV_REACTOR ); // De-energize all the valves setValveStateDelayed( VPI, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( VBF, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( VSP, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( VPD, VALVE_STATE_DRAIN_C_TO_NO, DELAY_VALVE_MS ); setValveStateDelayed( VPO, VALVE_STATE_NOFILL_C_TO_NO, DELAY_VALVE_MS ); setValveStateDelayed( VDR, VALVE_STATE_DRAIN_C_TO_NO, DELAY_VALVE_MS ); setValveStateDelayed( VRC, VALVE_STATE_DRAIN_C_TO_NO, DELAY_VALVE_MS ); setValveStateDelayed( VRO, VALVE_STATE_R1_C_TO_NO, DELAY_VALVE_MS ); setValveStateDelayed( VRD1, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( VRD2, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( VRI, VALVE_STATE_R1_C_TO_NO, DELAY_VALVE_MS ); setValveStateDelayed( VRF, VALVE_STATE_R2_C_TO_NO, DELAY_VALVE_MS ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); signalROPumpHardStop(); signalDrainPumpHardStop(); stopHeater( DG_PRIMARY_HEATER ); stopHeater( DG_TRIMMER_HEATER ); } /*********************************************************************//** * @brief * The handleRunNVPOSTsState function handles running the RTC and non-volatile * data management POSTs. * @details Inputs: faultPOSTState, faultPOSTSelfTestResult * @details Outputs: faultPOSTState, faultPOSTSelfTestResult * @return next state *************************************************************************/ static DG_FAULT_STATE_T handleRunNVPOSTsState( void ) { DG_FAULT_STATE_T state = DG_FAULT_STATE_RUN_NV_POSTS; switch ( faultPOSTState ) { case DG_POST_STATE_RTC: #ifndef DISABLE_RTC_POST_FAULT faultPOSTSelfTestResult = execRTCSelfTest(); if ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) { faultPOSTState = DG_POST_STATE_NVDATAMGMT; } else if ( SELF_TEST_STATUS_FAILED == faultPOSTSelfTestResult ) { state = DG_FAULT_STATE_COMPLETE; } #else faultPOSTState = DG_POST_STATE_NVDATAMGMT; #endif break; case DG_POST_STATE_NVDATAMGMT: faultPOSTSelfTestResult = execNVDataMgmtSelfTest(); if ( ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) || ( SELF_TEST_STATUS_FAILED == faultPOSTSelfTestResult ) ) { state = DG_FAULT_STATE_COMPLETE; } break; } return state; } /**@}*/