/************************************************************************** * * Copyright (c) 2025-2025 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 FPModeFault.c * * @author (last) “Raghu * @date (last) 14-Oct-2025 * * @author (original) Michael Garthwaite * @date (original) 08-Sep-2025 * ***************************************************************************/ #include "BoostPump.h" #include "FPModeFault.h" #include "FPModeStandby.h" #include "FPOperationModes.h" #include "PersistentAlarm.h" #include "ROPump.h" #include "SafetyShutdown.h" #include "SystemCommDD.h" #include "TaskGeneral.h" #include "Valves.h" /** * @addtogroup FPFaultMode * @{ */ // ********** private definitions ********** // ********** private data ********** static FP_FAULT_STATE_T faultState; ///< Currently active fault state. static FP_FAULT_NVDATA_STATE_T faultNVDataState; ///< Currently active NVdata fault state static SELF_TEST_STATUS_T faultPOSTSelfTestResult; ///< Fault POST self test result. // ********** private function prototypes ********** static FP_FAULT_STATE_T handleFaultStartState( void ); static FP_FAULT_STATE_T handleFaultDeenergizedState( void ); static FP_FAULT_STATE_T handleFaultEnergizedState( void ); static FP_FAULT_NVDATA_STATE_T handleFaultNVDataMgmtStartState( void ); static FP_FAULT_NVDATA_STATE_T handleFaultRunNVPOSTsState( void ); /*********************************************************************//** * @brief * The initFPFaultMode function initializes the fault mode unit. * @details \b Inputs: none * @details \b Outputs:unit variables initialized. * @return none *************************************************************************/ void initFPFaultMode( void ) { faultState = FP_FAULT_STATE_START; faultNVDataState = FP_FAULT_NVDATA_STATE_START; faultPOSTSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; } /*********************************************************************//** * @brief * The transitionToFPFaultMode function prepares for transition to fault mode. * while transition, deenergize all actuators. * @details \b Inputs: none * @details \b Outputs: Re-initialized Init and POST mode * @return initial state *************************************************************************/ U32 transitionToFPFaultMode( void ) { initFPFaultMode(); setCurrentFPSubState( NO_FP_SUB_STATE ); return faultState; } /*********************************************************************//** * @brief * The getCurrentFPFaultState function returns the current state of the fault mode. * @details \b Inputs: faultState * @details \b Outputs: none * @return current state of fault mode *************************************************************************/ FP_FAULT_STATE_T getCurrentFPFaultState( void ) { return faultState; } /*********************************************************************//** * @brief * The execFPFaultMode function executes the fault mode state machine. * @details \b Inputs: none * @details \b Outputs: Fault mode state machine executed * @return current state *************************************************************************/ U32 execFPFaultMode( void ) { // execute current fault state switch ( faultState ) { case FP_FAULT_STATE_START: faultState = handleFaultStartState(); break; case FP_FAULT_DEENERGIZED_STATE: faultState = handleFaultDeenergizedState(); break; case FP_FAULT_ENERGIZED_STATE: faultState = handleFaultEnergizedState(); break; default: faultState = FP_FAULT_STATE_START; break; } return faultState; } /*********************************************************************//** * @brief * The execFPFaultNVdataMgmt function executes the fault mode NVData * management state machine. * @details \b Inputs: faultNVDataState * @details \b Outputs: Fault mode NVdata state machine executed * @return current state of fault NVDATA management mode *************************************************************************/ U32 execFPFaultNVdataMgmt( void ) { // execute current fault NVData state manangement state switch ( faultNVDataState ) { case FP_FAULT_NVDATA_STATE_START: faultNVDataState = handleFaultNVDataMgmtStartState(); break; case FP_FAULT_NVDATA_STATE_RUN_NV_POSTS: faultNVDataState = handleFaultRunNVPOSTsState(); break; case FP_FAULT_NVDATA_STATE_COMPLETE: //Do Nothing break; default: faultNVDataState = FP_FAULT_NVDATA_STATE_COMPLETE; break; } return faultNVDataState; } /*********************************************************************//** * @brief * The handleFaultStartState function handles the start state of * the fault mode. * @details \b Inputs: safetyShutdownActivated * @details \b Outputs: none * @return next fault state *************************************************************************/ static FP_FAULT_STATE_T handleFaultStartState( void ) { FP_FAULT_STATE_T state = FP_FAULT_STATE_START; // Check saftey shutdown line already pulled if ( TRUE == isSafetyShutdownActivated() ) { state = FP_FAULT_DEENERGIZED_STATE; } else { state = FP_FAULT_ENERGIZED_STATE; } return state; } /*********************************************************************//** * @brief * The handleFaultDeenergizedState function handles the deenergized * state of the fault mode. * @details \b Inputs: none * @details \b Outputs: none * @return fault state *************************************************************************/ static FP_FAULT_STATE_T handleFaultDeenergizedState( void ) { FP_FAULT_STATE_T state = FP_FAULT_DEENERGIZED_STATE; deEnergizeFPActuators( FALSE ); //Make sure the stored config datas read completely. TODO - Determine if NV mgmt is needed for FP execFPFaultNVdataMgmt(); return state; } /*********************************************************************//** * @brief * The handleFaultEnergizedState function handles the energized * state of the fault mode (by enabling few valves). * @details \b Inputs: none * @details \b Outputs: none * @return fault state *************************************************************************/ static FP_FAULT_STATE_T handleFaultEnergizedState( void ) { FP_FAULT_STATE_T state = FP_FAULT_ENERGIZED_STATE; deEnergizeFPActuators( TRUE ); //Make sure the stored config datas read completely. TODO - Determine if NV mgmt is needed for FP execFPFaultNVdataMgmt(); //if saftey shutdown line pulled meanwhile, trainsition to deenergized state if ( TRUE == isSafetyShutdownActivated() ) { state = FP_FAULT_DEENERGIZED_STATE; } return state; } /*********************************************************************//** * @brief * The handleFaultNVDataMgmtStartState function handles the start state of * the fault NVdata management. * @details \b Inputs: none * @details \b Outputs: none * @return next fault NVdata management state *************************************************************************/ static FP_FAULT_NVDATA_STATE_T handleFaultNVDataMgmtStartState( void ) { //TODO : Revisit once NV data management been implemented FP_FAULT_NVDATA_STATE_T state = FP_FAULT_NVDATA_STATE_START; return state; } /*********************************************************************//** * @brief * The handleFaultRunNVPOSTsState function handles running non-volatile POSTs. * @details \b Inputs: none * @details \b Outputs: none * @return next fault NVdata management state *************************************************************************/ static FP_FAULT_NVDATA_STATE_T handleFaultRunNVPOSTsState( void ) { //TODO : Revisit once NV data management been implemented FP_FAULT_NVDATA_STATE_T state = FP_FAULT_NVDATA_STATE_RUN_NV_POSTS; return state; } /*********************************************************************//** * @brief * The deEnergizeFPActuators function sets most of the actuators * to reset and de-energized state * @details \b Inputs: none * @details \b Outputs: none * @param isDrainEnabled TRUE if the FP is set to drain, FALSE if not * @return none *************************************************************************/ void deEnergizeFPActuators( BOOL isDrainEnabled ) { U32 i; if ( FALSE == isFPDefeatured() ) { if ( TRUE == isBoostPumpInstalled() ) { signalBoostPumpHardStop(); } signalROPumpHardStop(); if ( TRUE == isDrainEnabled ) { setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_OPEN ); setValveState( P6_VALV, VALVE_STATE_OPEN ); setValveState( P11_VALV, VALVE_STATE_OPEN ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_OPEN ); setValveState( P39_VALV, VALVE_STATE_OPEN ); } else { for ( i = FIRST_IO_VALVE; i <= LAST_FP_VALVE; i++ ) { setValveState( (DD_VALVES_T)i, VALVE_STATE_CLOSED); } } } // Defeatured System. Only have m4 to control else { setValveState( M4_VALV, VALVE_STATE_CLOSED); } } /**@}*/