/************************************************************************** * * 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) Sean * @date (last) 30-Jul-2024 * * @author (original) Sean * @date (original) 30-Jul-2024 * ***************************************************************************/ #include "AirPump.h" #include "BloodFlow.h" #include "Bubbles.h" #include "BubbleDetector.h" #include "Buttons.h" #include "CpldInterface.h" #include "Ejector.h" #include "Messaging.h" #include "ModeFault.h" #include "OperationModes.h" #include "RotaryValve.h" #include "Switches.h" #include "Utilities.h" #include "Valve3Way.h" #include "Valves.h" /** * @addtogroup TDFaultMode * @{ */ // ********** private data ********** static TD_FAULT_STATE_T faultState; ///< Currently active fault state. static SELF_TEST_STATUS_T faultPOSTSelfTestResult; ///< Fault POST self test result. // ********** private function prototypes ********** static void transitionToModeFaultState( TD_FAULT_STATE_T newState ); static TD_FAULT_STATE_T handleFaultEnergizedActuatorsState( void ); static TD_FAULT_STATE_T handleFaultDeenergizedActuatorsState( void ); // TODO keep reading the NV data if came here from POST /*********************************************************************//** * @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 = TD_FAULT_ENERGIZED_STATE; faultPOSTSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; if ( TRUE == isSafetyShutdownActivated() ) { faultState = TD_FAULT_DEENERGIZED_STATE; } } /*********************************************************************//** * @brief * The transitionToFaultMode function prepares for transition to fault mode. * @details \b Inputs: none * @details \b Outputs: none * @return initial state of the fault mode state machine *************************************************************************/ U32 transitionToFaultMode( void ) { TD_OP_MODE_T previousOpMode = getPreviousOperationMode(); initFaultMode(); transitionToModeFaultState( faultState ); requestAlarmLampPattern( LAMP_PATTERN_FAULT ); // in case we get here before LED POST can take alarm lamp out of manual control. doorClosedRequired( FALSE ); // syringeDetectionRequired( FALSE ); //setVenousBubbleDetectionEnabled( H18_BBLD, FALSE ); setCurrentSubState( NO_SUB_STATE ); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, FALSE ); // Publish POST failure status to UI if fault triggered in Init/POST mode if ( MODE_INIT == previousOpMode ) { // sendPOSTFinalResult( FALSE ); } if ( ( MODE_PRET == previousOpMode ) || ( MODE_TREA == previousOpMode ) ) { // collectTreatmentLogData(); // sendTreatmentLogDataToUI(); } return faultState; } /*********************************************************************//** * @brief * The execFaultMode function executes the Fault Mode state machine. * @details \b Inputs: none * @details \b Outputs: none * @return current state of the fault mode *************************************************************************/ U32 execFaultMode( void ) { // The stop button press events are consumed here upon requesting to stop. isStopButtonPressed(); switch( faultState ) { case TD_FAULT_ENERGIZED_STATE: faultState = handleFaultEnergizedActuatorsState(); break; case TD_FAULT_DEENERGIZED_STATE: faultState = handleFaultDeenergizedActuatorsState(); break; default: // Fault in fault mode is needed? SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_FAULT_INVALID_STATE, (U32)faultState ) faultState = TD_FAULT_ENERGIZED_STATE; break; } return faultState; } /*********************************************************************//** * @brief * The signalAlarmActionToFaultMode function executes the given alarm action * as appropriate while in Fault Mode. * @details \b Inputs: none * @details \b Outputs: given alarm action executed * @param action ID of alarm action to execute * @return none *************************************************************************/ void signalAlarmActionToFaultMode( ALARM_ACTION_T action ) { // Fault mode is terminal and already in safe state - no alarm actions handled in this mode. } /*********************************************************************//** * @brief * The transition to mode fault state function. * @details \b Inputs: none * @details \b Outputs: none * @return none *************************************************************************/ static void transitionToModeFaultState( TD_FAULT_STATE_T newState ) { switch ( newState ) { case TD_FAULT_ENERGIZED_STATE: signalBloodPumpHardStop(); setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); abortEjectorOperation(); // stopSyringePump(); break; case TD_FAULT_DEENERGIZED_STATE: signalBloodPumpHardStop(); setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); abortEjectorOperation(); // stopSyringePump(); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_FAULT_INVALID_STATE, (U32)newState ) break; } } /*********************************************************************//** * @brief * The handleFaultEnergizedActuatorsState function handles the energized state * of the fault mode. * @details \b Inputs: none * @details \b Outputs: none * @return next state *************************************************************************/ static TD_FAULT_STATE_T handleFaultEnergizedActuatorsState( void ) { TD_FAULT_STATE_T state = TD_FAULT_ENERGIZED_STATE; if ( TRUE == isSafetyShutdownActivated() ) { state = TD_FAULT_DEENERGIZED_STATE; transitionToModeFaultState( state ); } return state; } /*********************************************************************//** * @brief * The handleFaultDeenergizedActuatorsState function handles the deenergized state * of the fault mode. * @details \b Inputs: none * @details \b Outputs: none * @return next state *************************************************************************/ static TD_FAULT_STATE_T handleFaultDeenergizedActuatorsState( void ) { TD_FAULT_STATE_T state = TD_FAULT_DEENERGIZED_STATE; // terminal state return state; } /**@}*/