/************************************************************************** * * Copyright (c) 2024-2024 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) Vinayakam Mani * @date (last) 05-Aug-2024 * * @author (original) Vinayakam Mani * @date (original) 05-Aug-2024 * ***************************************************************************/ #include "ConcentratePumps.h" #include "DialysatePumps.h" #include "Heaters.h" #include "ModeFault.h" #include "Messaging.h" #include "OperationModes.h" #include "SafetyShutdown.h" #include "Utilities.h" #include "Valves.h" /** * @addtogroup DDFaultMode * @{ */ // ********** private definitions ********** #define DELAY_VALVE_MS ( 1 * MS_PER_SECOND ) ///< Valve state change delay in ms. // ********** private data ********** static DD_FAULT_STATE_T faultState; ///< Currently active fault state. static DD_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 DD_FAULT_STATE_T handleFaultStartState( void ); static DD_FAULT_STATE_T handleFaultDeenergizedState( void ); static DD_FAULT_STATE_T handleFaultEnergizedState( void ); static DD_FAULT_NVDATA_STATE_T handleFaultNVDataMgmtStartState( void ); static DD_FAULT_NVDATA_STATE_T handleFaultRunNVPOSTsState( void ); /*********************************************************************//** * @brief * The initFaultMode function initializes the Fault Mode unit. * @details \b Inputs : none * @details \b Outputs: Fault mode unit initialized * @return none *************************************************************************/ void initFaultMode( void ) { faultState = DD_FAULT_STATE_START; faultNVDataState = DD_FAULT_NVDATA_STATE_START; faultPOSTSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; } /*********************************************************************//** * @brief * The transitionToFaultMode function prepares for transition to fault mode. * @details \b Inputs: none * @details \b Outputs: none * @return initial state *************************************************************************/ U32 transitionToFaultMode( void ) { initFaultMode(); setCurrentSubState( NO_SUB_STATE ); // Publish POST failure status to UI if fault triggered in Init/POST mode if ( DD_MODE_INIT == getPreviousOperationMode() ) { // Broadcast final POST failed //sendPOSTFinalResult( FALSE ); } return faultState; } /*********************************************************************//** * @brief * The execFaultMode function executes the fault mode state machine. * @details \b Inputs: faultState * @details \b Outputs: Fault mode state machine executed * @return current state of fault mode *************************************************************************/ U32 execFaultMode( void ) { // execute current fault state switch ( faultState ) { case DD_FAULT_STATE_START: faultState = handleFaultStartState(); break; case DD_FAULT_DEENERGIZED_STATE: faultState = handleFaultDeenergizedState(); break; case DD_FAULT_ENERGIZED_STATE: faultState = handleFaultEnergizedState(); break; default: faultState = DD_FAULT_STATE_START; break; } return faultState; } /*********************************************************************//** * @brief * The execFaultNVdataMgmt 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 execFaultNVdataMgmt( void ) { // execute current fault NVData state manangement state switch ( faultNVDataState ) { case DD_FAULT_NVDATA_STATE_START: faultNVDataState = handleFaultNVDataMgmtStartState(); break; case DD_FAULT_NVDATA_STATE_RUN_NV_POSTS: faultNVDataState = handleFaultRunNVPOSTsState(); break; case DD_FAULT_NVDATA_STATE_COMPLETE: //Do Nothing break; default: faultNVDataState = DD_FAULT_NVDATA_STATE_COMPLETE; break; } return faultNVDataState; } /*********************************************************************//** * @brief * The getCurrentFaultState function returns the current state of the fault mode. * @details \b Inputs: faultState * @details \b Outputs: none * @return current state of fault mode *************************************************************************/ DD_FAULT_STATE_T getCurrentFaultState( void ) { return faultState; } /*********************************************************************//** * @brief * The deenergizeActuators function sets all the actuators to reset and * de-energized state. * @details \b Inputs: none * @details \b Outputs: none * @param parkPumps TRUE if concentrate pumps should be parked, FALSE if not * @return none *************************************************************************/ void deenergizeActuators( BOOL parkPumps ) { U32 i; // De-energize all the hydraulics valves setValveStateDelayed( D53_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D52_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D8_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D54_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D14_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D65_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D64_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D31_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D34_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D35_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D40_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D47_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D3_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( M4_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); // De-energize Balancing chamber and Ultrafiltration valves for ( i = FIRST_BC_VALVE; i <= LAST_BC_VALVE; i++ ) { setValveStateDelayed( (VALVES_T)i, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); } // TODO: To be removed once HDD clean up is done for ( i = FIRST_UF_VALVE; i <= FIRST_UF_VALVE; i++ ) { setValveStateDelayed( (VALVES_T)i, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); } requestConcentratePumpOff( D11_PUMP, parkPumps ); requestConcentratePumpOff( D10_PUMP, parkPumps ); requestConcentratePumpOff( D76_PUMP, parkPumps ); signalDialysatePumpHardStop( D12_PUMP ); signalDialysatePumpHardStop( D48_PUMP ); stopHeater( D5_HEAT ); stopHeater( D45_HEAT ); } /*********************************************************************//** * @brief * The deenergizeActuatorsWithDrainEnabled function sets most of the actuators * to reset and de-energized state, except drain and spent balancing chamber * valves enabled. * @details \b Inputs: none * @details \b Outputs: none * @param parkPumps TRUE if concentrate pumps should be parked, FALSE if not * @return none *************************************************************************/ void deenergizeActuatorsWithDrainEnabled( BOOL parkPumps ) { U32 i; // Energize drain and spent balancing chamber valves to relieve the pressure. setValveState( D53_VALV, VALVE_STATE_OPEN ); setValveState( D23_VALV, VALVE_STATE_OPEN ); setValveState( D24_VALV, VALVE_STATE_OPEN ); setValveState( D25_VALV, VALVE_STATE_OPEN ); setValveState( D26_VALV, VALVE_STATE_OPEN ); // De-energize hydraulics valves setValveStateDelayed( D52_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D8_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D54_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D14_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D65_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D64_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D31_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D34_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D35_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D40_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D47_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D3_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( M4_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); // De-energize portion of balancing chamber valves. setValveStateDelayed( D19_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D20_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D21_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); setValveStateDelayed( D22_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); // TODO: To be removed once HDD clean up is done // De-energize Ultrafiltration valves for ( i = FIRST_UF_VALVE; i <= FIRST_UF_VALVE; i++ ) { setValveStateDelayed( (VALVES_T)i, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); } requestConcentratePumpOff( D11_PUMP, parkPumps ); requestConcentratePumpOff( D10_PUMP, parkPumps ); requestConcentratePumpOff( D76_PUMP, parkPumps ); signalDialysatePumpHardStop( D12_PUMP ); signalDialysatePumpHardStop( D48_PUMP ); stopHeater( D5_HEAT ); stopHeater( D45_HEAT ); } /*********************************************************************//** * @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 DD_FAULT_STATE_T handleFaultStartState( void ) { DD_FAULT_STATE_T state = DD_FAULT_STATE_START; // Check saftey shutdown line already pulled if ( TRUE == isSafetyShutdownActivated() ) { state = DD_FAULT_DEENERGIZED_STATE; } else { state = DD_FAULT_ENERGIZED_STATE; } return state; } /*********************************************************************//** * @brief * The handleFaultDeenergizedState function handles the deenergized * state of the fault mode. * @details \b Inputs: faultNVDataState * @details \b Outputs: none * @return fault state *************************************************************************/ static DD_FAULT_STATE_T handleFaultDeenergizedState( void ) { DD_FAULT_STATE_T state = DD_FAULT_DEENERGIZED_STATE; deenergizeActuators( NO_PARK_CONC_PUMPS ); //Make sure the stored config datas read completely. execFaultNVdataMgmt(); 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 DD_FAULT_STATE_T handleFaultEnergizedState( void ) { DD_FAULT_STATE_T state = DD_FAULT_ENERGIZED_STATE; deenergizeActuatorsWithDrainEnabled( NO_PARK_CONC_PUMPS ); //Make sure the stored config datas read completely. execFaultNVdataMgmt(); //if saftey shutdown line pulled meanwhile, trainsition to deenergized state if ( TRUE == isSafetyShutdownActivated() ) { state = DD_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 DD_FAULT_NVDATA_STATE_T handleFaultNVDataMgmtStartState( void ) { //TODO : Revisit once NV data management been implemented DD_FAULT_NVDATA_STATE_T state = DD_FAULT_NVDATA_STATE_START; //NVDATAMGMT_RECORDS_READ_STATUS_T status = getNVRecordsReadStatus(); // switch ( status ) // { // // If the records are queued or already read, go directly to NV POST to process // // their CRCs. // case NVDATAMGMT_RECORDS_QUEUED: // case NVDATAMGMT_RECORDS_READ: // state = DD_FAULT_NVDATA_STATE_RUN_NV_POSTS; // break; // // // If the NV post was completed prior to transitioning to fault mode, do nothing // case NVDATAMGMT_RECORDS_CRC_CHECKED: // state = DD_FAULT_NVDATA_STATE_COMPLETE; // break; // } return state; } /*********************************************************************//** * @brief * The handleFaultRunNVPOSTsState function handles running non-volatile POSTs. * @details \b Inputs: faultPOSTSelfTestResult * @details \b Outputs: faultPOSTSelfTestResult * @return next fault NVdata management state *************************************************************************/ static DD_FAULT_NVDATA_STATE_T handleFaultRunNVPOSTsState( void ) { //TODO : Revisit once NV data management been implemented DD_FAULT_NVDATA_STATE_T state = DD_FAULT_NVDATA_STATE_RUN_NV_POSTS; // faultPOSTSelfTestResult = execNVDataMgmtSelfTest(); // // // Regardless of the status of the NV POST transition to the complete state. // if ( ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) || ( SELF_TEST_STATUS_FAILED == faultPOSTSelfTestResult ) ) // { // state = DD_FAULT_NVDATA_STATE_COMPLETE; // } return state; } /**@}*/