Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rc01e4ef09394caa74227509f70e2f0444171ae0b -rd7cae63618be45748f93b1576ca49e7825fe0cf8 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c01e4ef09394caa74227509f70e2f0444171ae0b) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) @@ -18,6 +18,7 @@ #include "Buttons.h" #include "ModePreTreat.h" #include "OperationModes.h" +#include "TaskGeneral.h" #include "Timers.h" #include "TxParams.h" @@ -38,6 +39,7 @@ // ********** private function prototypes ********** +static TD_PRE_TREATMENT_MODE_STATE_T handleDrySelfTestState( void ); ///< Handle dry self tests state during Pre-Treatment static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); ///< Handle Confirm Rx state during Pre-Treatment /*********************************************************************//** @@ -144,7 +146,7 @@ * @details Outputs: transition to prime state on user request * @return current state (sub-mode) *************************************************************************/ -static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +static TD_PRE_TREATMENT_MODE_STATE_T handleDrySelfTestState( void ) { TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; Index: firmware/App/Modes/ModePreTreat.h =================================================================== diff -u -rc01e4ef09394caa74227509f70e2f0444171ae0b -rd7cae63618be45748f93b1576ca49e7825fe0cf8 --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision c01e4ef09394caa74227509f70e2f0444171ae0b) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) @@ -36,8 +36,6 @@ U32 transitionToPreTreatmentMode( void ); // Prepares for transition to pre-treatment mode U32 execPreTreatmentMode( void ); // Execute the pre-treatment mode state machine (call from OperationModes) -TD_PRE_TREATMENT_MODE_STATE_T getPreTreatmentSubState( void ); // Get the current pre-treatment sub mode. - /**@}*/ #endif Index: firmware/App/Modes/StatePreTxDrySelfTests.c =================================================================== diff -u -refdbfe0a1ee81f4a71cadd5bae98ef4543b6572d -rd7cae63618be45748f93b1576ca49e7825fe0cf8 --- firmware/App/Modes/StatePreTxDrySelfTests.c (.../StatePreTxDrySelfTests.c) (revision efdbfe0a1ee81f4a71cadd5bae98ef4543b6572d) +++ firmware/App/Modes/StatePreTxDrySelfTests.c (.../StatePreTxDrySelfTests.c) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) @@ -5,7 +5,7 @@ * 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 SelfTests.h +* @file StatePreTxDrySelfTests.c * * @author (last) Varshini Nagabooshanam * @date (last) 01-Apr-2026 @@ -21,25 +21,28 @@ #include "BloodFlow.h" #include "Bubbles.h" #include "DDInterface.h" +#include "Ejector.h" #include "FPGA.h" +#include "LevelSensors.h" +#include "ModePreTreat.h" #include "TxParams.h" #include "Pressures.h" #include "StatePreTxDrySelfTests.h" #include "Switches.h" -#include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" +#include "Valve3Way.h" /** - * @addtogroup SelfTests + * @addtogroup StatePreTxDrySelfTests * @{ */ // ********** private definitions ********** // Syringe pump -#define SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ( 1 * MS_PER_SECOND ) ///< Delay before checking syringe pump occlusion after prime. +#define SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ( 1 * MS_PER_SECOND ) ///< Delay before checking syringe pump occlusion after prime. // Pressure self-test timing #define PRE_NORMAL_PRESSURE_SELF_TEST_DELAY_MS ( 5 * MS_PER_SECOND ) ///< Delay before capturing baseline arterial and venous pressures. @@ -94,49 +97,50 @@ static BOOL requestInstallMode; ///< Triggers transition to INSTALL mode when authentication fails static BOOL useHeparin; ///< Indicates whether heparin functionality is enabled for current treatment static F32 previousNormalArterialPressure; ///< Arterial pressure at baseline -static F32 previousNormalVenousPressure; // Venous pressure at baseline -static F32 peakVenousPressure; // Peak venous pressure during stabilization -static F32 venousPressureP1; // First stable venous pressure sample -static F32 venousPressureP2; // Second venous pressure sample for leak check -static F32 peakArterialPressure; // Peak arterial pressure during stabilization -static F32 arterialPressureP1; // First stable arterial pressure sample -static F32 arterialPressureP2; // Second arterial pressure sample for leak check -static BOOL arterialPressureTargetReached; // Indicates whether arterial pressure target has been reached -static U32 venousPressureStabilizationStartTime; // Start time for venous stabilization phase -static U32 venousPressureLeakCheckStartTime; // Start time for venous leak check -static U32 venousPressureReliefStartTime; // Start time for venous pressure relief -static U32 pressureSelfTestBloodPumpRunStartTime; // Blood pump run start for pressure test -static U32 pressureSelfTestNormalizedStartTime; // Time when pressures normalized -static U32 pressureSelfTestArterialStartTime; // Start time for arterial pressure build-up -static U32 arterialPressureStabilizationStartTime; // Start time for arterial stabilization -static U32 arterialPressureLeakCheckStartTime; // Start time for arterial leak check -static U32 arterialPressureReliefStartTime; // Start time for arterial pressure relief +static F32 previousNormalVenousPressure; ///< Venous pressure at baseline +static F32 peakVenousPressure; ///< Peak venous pressure during stabilization +static F32 venousPressureP1; ///< First stable venous pressure sample +static F32 venousPressureP2; ///< Second venous pressure sample for leak check +static F32 peakArterialPressure; ///< Peak arterial pressure during stabilization +static F32 arterialPressureP1; ///< First stable arterial pressure sample +static F32 arterialPressureP2; ///< Second arterial pressure sample for leak check +static BOOL arterialPressureTargetReached; ///< Indicates whether arterial pressure target has been reached +static U32 venousPressureStabilizationStartTime; ///< Start time for venous stabilization phase +static U32 venousPressureLeakCheckStartTime; ///< Start time for venous leak check +static U32 venousPressureReliefStartTime; ///< Start time for venous pressure relief +static U32 pressureSelfTestBloodPumpRunStartTime; ///< Blood pump run start for pressure test +static U32 pressureSelfTestNormalizedStartTime; ///< Time when pressures normalized +static U32 pressureSelfTestArterialStartTime; ///< Start time for arterial pressure build-up +static U32 arterialPressureStabilizationStartTime; ///< Start time for arterial stabilization +static U32 arterialPressureLeakCheckStartTime; ///< Start time for arterial leak check +static U32 arterialPressureReliefStartTime; ///< Start time for arterial pressure relief // ********** private function prototypes ********** static void resetSelfTestsFlags( void ); static void setupForSelfTestsStop( void ); static void setAlarmResumePerDoorAndLatch( void ); +static void transitionToDrySelfTestsState( DRY_SELF_TESTS_STATE_T newState ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestStartState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeLoadedCheckState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestTubeSetAuthenticationState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpSeekState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalSetupState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousSetupState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsArterialSetupState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsArterialState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsDecayState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsStabilityState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpPrimeState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorNormalSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureStabilizationState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureLeakCheckState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureReliefState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureStabilizationState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureLeakCheckState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureReliefState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpPrimeState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpOcclusionDetectionState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ); -static void transitionToDrySelfTestsState( DRY_SELF_TESTS_STATE_T newState ); - /*********************************************************************//** * @brief * The initSelfTests function initializes the SelfTests module. @@ -329,7 +333,7 @@ break; case DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE: - currentDrySelfTestsState = handleDrySelfTestPressureVenousSetupState(); + currentDrySelfTestsState = handleDrySelfTestVenousPressureSetupState(); break; case DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE: @@ -345,7 +349,7 @@ break; case DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE: - currentDrySelfTestsState = handleDrySelfTestPressureArterialSetupState(); + currentDrySelfTestsState = handleDrySelfTestArterialPressureSetupState(); break; case DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE: @@ -365,17 +369,16 @@ break; case DRY_SELF_TESTS_SYRINGE_PUMP_OCCLUSION_CHECK_STATE: - currentDrySelfTestsState = handleDrySelfTestSyringePumpOcclusionCheckState(); + currentDrySelfTestsState = handleDrySelfTestSyringePumpOcclusionDetectionState(); break; - case DRY_SELF_TESTS_COMPLETE_STATE: - currentDrySelfTestsState = handleDrySelfTestCompleteState(); - break; - case DRY_SELF_TESTS_STOPPED_STATE: currentDrySelfTestsState = handleDrySelfTestStoppedState(); break; + case DRY_SELF_TESTS_COMPLETE_STATE: + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, currentDrySelfTestsState ); break; @@ -494,6 +497,7 @@ BUBBLE_STATE_T bubbleStatus = getBubbleDetectedState( H18_BBLD ); AIR_TRAP_LEVELS_T lowerAirTrap = getLevelSensorState( H17_LEVL ); AIR_TRAP_LEVELS_T upperAirTrap = getLevelSensorState( H16_LEVL ); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_DRY_SELF_TEST_CARTRIDGE_RESULT, (U32)bubbleStatus, (U32)BUBBLE_DETECTED ); // Check if cartridge is dry @@ -503,15 +507,15 @@ { // If catridge is valid it proceed resetArtVenPressureOffsets(); - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_REQUEST_BARCODE_SCAN ); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_TUBING_SET_BARCODE_SCAN_REQUEST, 0, 0 ); state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; } else { // Allow wet cartridge only for test configuration if ( TRUE == getTestConfigStatus( TEST_CONFIG_USE_WET_CARTRIDGE ) ) { - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_REQUEST_BARCODE_SCAN ); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_TUBING_SET_BARCODE_SCAN_REQUEST, 0, 0 ); cartridgeUsedTestRun = TRUE; state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; } @@ -549,12 +553,12 @@ if ( TRUE == barcodeScanSuccess ) { // If Barcode is valid proceed to authentication - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BARCODE_SCAN_SUCCESS ); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_TUBING_SET_BARCODE_SCAN_AUTHENTICATED, 0, 0 ); state = DRY_SELF_TESTS_TUBE_SET_AUTHENTICATION_STATE; } else { - // If barcode is valid it trigger an alarm + // If barcode is invalid it trigger an alarm activateAlarmNoData( ALARM_ID_TD_INSTALL_NEW_CARTRIDGE ); } } @@ -577,71 +581,66 @@ * @brief * The handleDrySelfTestTubeSetAuthenticationState function handles tube set * authentication and processes the authentication response. -* -* @details \b Message \b Sent: MSG_ID_TD_TUBE_SET_AUTH_RESULT -* @details Inputs: authResponseReceived, authResponseValidTubeSet, +* @details \b Message \b Sent: MSG_ID_TD_TUBE_SET_AUTHENTICATION_RESPONSE +* @details \b Inputs: authResponseReceived, authResponseValidTubeSet, * authResponseModalityAccepted -* @details Outputs: none +* @details \b Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestTubeSetAuthenticationState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_TUBE_SET_AUTHENTICATION_STATE; - BOOL authInvalid = TRUE; - BOOL tubeSetIsValid = FALSE; - BOOL modalityIsValid = FALSE; + BOOL accepted = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; TUBE_SET_AUTH_RESULT_PAYLOAD_T payload; - //Initialize Payload + // Initialize payload memset( (U08*)&payload, 0, sizeof( TUBE_SET_AUTH_RESULT_PAYLOAD_T ) ); - // Check Response + // Process authentication response if ( TRUE == authResponseReceived ) { authResponseReceived = FALSE; - tubeSetIsValid = authResponseValidTubeSet; - modalityIsValid = authResponseModalityAccepted; -/ if ( TRUE == tubeSetIsValid ) + // Validate tube set + if ( FALSE == authResponseValidTubeSet ) { - if ( TRUE == modalityIsValid ) - { - authInvalid = FALSE; - } + rejReason = REQUEST_REJECT_REASON_TD_AUTHENTICATION_INVALID; } - // Result Handling - if ( FALSE == authInvalid ) + else if ( FALSE == authResponseModalityAccepted ) { - // Valid + modality match + rejReason = REQUEST_REJECT_REASON_TD_AUTHENTICATION_MODALITY_MISMATCH; + } + else + { + accepted = TRUE; + } + // Handle result + if ( TRUE == accepted ) + { payload.accepted = (U32)TRUE; - payload.reason = (U32)AUTH_REASON_NONE; -// requestSyringeSeek(); + payload.reason = (U32)REQUEST_REJECT_REASON_NONE; state = DRY_SELF_TESTS_SYRINGE_PUMP_SEEK_STATE; } else { payload.accepted = (U32)FALSE; - if ( FALSE == tubeSetIsValid ) + payload.reason = (U32)rejReason; + // Trigger an alarm if the cartridge is invalid + if ( REQUEST_REJECT_REASON_TD_AUTHENTICATION_INVALID == rejReason ) { - // Invalid tube set activateAlarmNoData( ALARM_ID_TD_INVALID_TUBE_SET ); - payload.reason = (U32)AUTH_REASON_INVALID; } - else - { - // Modality mismatch - payload.reason = (U32)AUTH_REASON_MODALITY_MISMATCH; - } - requestInstallMode = TRUE; } - - sendMessage( MSG_ID_TD_TUBE_SET_AUTHENTICATION_RESPONSE, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&payload, sizeof( TUBE_SET_AUTH_RESULT_PAYLOAD_T ) ); + // Send response to UI + sendMessage( MSG_ID_TD_TUBE_SET_AUTHENTICATION_RESPONSE, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&payload, sizeof( TUBE_SET_AUTH_RESULT_PAYLOAD_T ) ); } if ( TRUE == doesAlarmStatusIndicateStop() ) { state = DRY_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } + return state; } @@ -698,7 +697,7 @@ /*********************************************************************//** * @brief - * The handleDrySelfTestPressureSensorsSetupState function handles the setup + * The handleDrySelfTestPressureSensorNormalSetupState function handles the setup * for pressure sensors dry self-test. * @details Inputs: pressureSelfTestPreNormalStartTime * @details Outputs: previousNormalArterialPressure, previousNormalVenousPressure @@ -728,13 +727,13 @@ /*********************************************************************//** * @brief -* The handleDrySelfTestPressureVenousSetupState function handles the setup +* The handleDrySelfTestVenousPressureSetupState function handles the setup * for the venous pressure sensor dry self-test. * @details Inputs: none -* @details Outputs: pressureSelfTestVenousTestStartTime +* @details Outputs: venousPressureStabilizationStartTime * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureVenousSetupState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureSetupState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE; @@ -745,6 +744,8 @@ } else { + // Log start of venous pressure test + SEND_EVENT_WITH_1_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE ); venousPressureStabilizationStartTime = getMSTimerCount(); peakVenousPressure = getFilteredVenousPressure(); state = DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE; @@ -882,6 +883,8 @@ } else { + // Log start of arterial pressure test + SEND_EVENT_WITH_1_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE ); pressureSelfTestArterialStartTime = getMSTimerCount(); arterialPressureTargetReached = FALSE; state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; @@ -1465,7 +1468,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_STATE, (U32)newState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_INVALID_DRY_SELF_TEST_STATE, (U32)newState ); break; } } Index: firmware/App/Modes/StatePreTxDrySelfTests.h =================================================================== diff -u -refdbfe0a1ee81f4a71cadd5bae98ef4543b6572d -rd7cae63618be45748f93b1576ca49e7825fe0cf8 --- firmware/App/Modes/StatePreTxDrySelfTests.h (.../StatePreTxDrySelfTests.h) (revision efdbfe0a1ee81f4a71cadd5bae98ef4543b6572d) +++ firmware/App/Modes/StatePreTxDrySelfTests.h (.../StatePreTxDrySelfTests.h) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) @@ -18,6 +18,7 @@ #ifndef __SELF_TESTS_H__ #define __SELF_TESTS_H__ +#include "Common.h" #include "TDCommon.h" #include "TDDefs.h" @@ -31,34 +32,20 @@ // ********** public definitions ********** -/// Payload record structure for no cartridge self-test data broadcast message -typedef struct -{ - U32 timeout; ///< No cartridge self-test timeout (in seconds) - U32 countdown; ///< No cartridge self-test timeout countdown (in seconds) -} SELF_TEST_NO_CARTRIDGE_PAYLOAD_T; - /// Payload record structure for dry self-test data broadcast message typedef struct { U32 timeout; ///< Dry self-test timeout (in seconds) U32 countdown; ///< Dry self-test timeout countdown (in seconds) } SELF_TEST_DRY_PAYLOAD_T; -/// Payload record structure for no cartridge self-test data broadcast message -typedef enum AuthRejectReasons -{ - AUTH_REASON_NONE = 0, ///< No rejection reason - AUTH_REASON_INVALID, ///< Invalid tube set - AUTH_REASON_MODALITY_MISMATCH, ///< Modality mismatch - NUM_OF_AUTH_REJECT_REASONS ///< Number of auth reject reasons -} AUTH_REJECT_REASON_T; - // ********** public function prototypes ********** void initSelfTests( void ); -void execDrySelfTests( void ); void transitionToDrySelfTests( void ); +void execDrySelfTests( void ); +void handleDoorCloseAfterCartridgeInsertion( void ); + /**@}*/ #endif Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -rc01e4ef09394caa74227509f70e2f0444171ae0b -rd7cae63618be45748f93b1576ca49e7825fe0cf8 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision c01e4ef09394caa74227509f70e2f0444171ae0b) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) @@ -185,6 +185,7 @@ SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE = 148, SW_FAULT_ID_TD_AIR_PUMP_DUTY_CYCLE_OUT_OF_RANGE = 149, SW_FAULT_ID_TD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE = 150, + SW_FAULT_ID_TD_INVALID_DRY_SELF_TEST_STATE = 151, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T;