Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rd7cae63618be45748f93b1576ca49e7825fe0cf8 -rfdaecc8cba085b8f2a57c8478c6ad800f7303483 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision fdaecc8cba085b8f2a57c8478c6ad800f7303483) @@ -21,6 +21,7 @@ #include "TaskGeneral.h" #include "Timers.h" #include "TxParams.h" +#include "StatePreTxDrySelfTests.h" /** * @addtogroup TDPreTreatmentMode @@ -111,7 +112,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - currentPreTreatmentState = handleSelfTestDryState(); + currentPreTreatmentState = handleDrySelfTestState(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -141,6 +142,19 @@ /*********************************************************************//** * @brief + * The getPreTreatmentSubState function gets the current + * pre-treatment mode state. + * @details Inputs: currentPreTreatmentState + * @details Outputs: none + * @return currentPreTreatmentState + *************************************************************************/ +TD_PRE_TREATMENT_MODE_STATE_T getPreTreatmentSubState( void ) +{ + return currentPreTreatmentState; +} + +/*********************************************************************//** + * @brief * The handleSelfTestDryState function performs dry self-test. * @details Inputs: none * @details Outputs: transition to prime state on user request Index: firmware/App/Modes/ModePreTreat.h =================================================================== diff -u -rd7cae63618be45748f93b1576ca49e7825fe0cf8 -rfdaecc8cba085b8f2a57c8478c6ad800f7303483 --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision fdaecc8cba085b8f2a57c8478c6ad800f7303483) @@ -36,6 +36,8 @@ 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 -rd7cae63618be45748f93b1576ca49e7825fe0cf8 -rfdaecc8cba085b8f2a57c8478c6ad800f7303483 --- firmware/App/Modes/StatePreTxDrySelfTests.c (.../StatePreTxDrySelfTests.c) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) +++ firmware/App/Modes/StatePreTxDrySelfTests.c (.../StatePreTxDrySelfTests.c) (revision fdaecc8cba085b8f2a57c8478c6ad800f7303483) @@ -18,19 +18,24 @@ #include "AirPump.h" #include "AirTrap.h" #include "BloodFlow.h" -#include "BloodFlow.h" #include "Bubbles.h" +#include "Buttons.h" +#include "Common.h" #include "DDInterface.h" -#include "Ejector.h" -#include "FPGA.h" #include "LevelSensors.h" +#include "Messaging.h" #include "ModePreTreat.h" -#include "TxParams.h" +#include "ModeTreatment.h" +#include "OperationModes.h" #include "Pressures.h" +#include "RotaryValve.h" #include "StatePreTxDrySelfTests.h" #include "Switches.h" #include "TaskGeneral.h" #include "Timers.h" +#include "TDCommon.h" +#include "TxParams.h" +#include "Utilities.h" #include "Valves.h" #include "Valve3Way.h" @@ -80,22 +85,22 @@ // ********** private data ********** static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of Dry Self-Test state machine -static U32 pressureSelfTestPreNormalStartTime; ///< Pressure dry self-test pre-normal start time. -static U32 selfTestStartTime; ///< Timestamp when self-tests started -static U32 selfTestPreviousPublishDataTime; ///< Last time progress data was published -static U32 selfTestCartridgeSettleTime; ///< Delay timer after cartridge insertion -static U32 syringeOcclusionDelayStartTime; ///< Delay before checking syringe occlusion -static BOOL selfTestsResumeRequested; ///< Indicates resume request from STOPPED state -static BOOL doorStateAfterCartridgeInstall; ///< Tracks door transition post cartridge insertion -static BOOL dryPressureTestsCompleted; ///< Indicates pressure tests completion -static BOOL cartridgeUsedTestRun; ///< Indicates cartridge-used check executed -static BOOL occlusionBaselineWasSet; ///< Indicates baseline pressure established +static U32 selfTestStartTime; ///< Start time of dry self-tests +static U32 selfTestPreviousPublishDataTime; ///< Last progress data publish time +static U32 selfTestCartridgeSettleTime; ///< Delay after cartridge insertion +static U32 syringeOcclusionDelayStartTime; ///< Delay before syringe occlusion check +static BOOL selfTestsResumeRequested; ///< Resume requested from STOPPED state +static BOOL doorStateAfterCartridgeInstall; ///< Tracks door transition after cartridge install +static BOOL useHeparin; ///< Indicates whether heparin is enabled +static BOOL barcodeScanResponseReceived; ///< Barcode response received flag +static BOOL barcodeScanSuccessful; ///< Barcode scan result +static BOOL authResponseReceived; ///< Indicates authentication response received +static BOOL authResponseValidTubeSet; ///< Indicates tube set is valid +static BOOL authResponseModalityAccepted; ///< Indicates tube set modality is accepted +static BOOL dryPressureTestsCompleted; ///< Indicates dry pressure tests completed +static BOOL cartridgeUsedTestRun; ///< Indicates cartridge-used test executed +static BOOL occlusionBaselineWasSet; ///< Indicates occlusion baseline established static BOOL heparinOcclusionTestRun; ///< Indicates heparin occlusion test executed -static BOOL authResponseReceived; ///< Authentication response received from external subsystem -static BOOL authResponseValidTubeSet; ///< Indicates whether tube set is valid -static BOOL authResponseModalityAccepted; ///< Indicates whether tube set matches selected treatment modality -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 @@ -104,17 +109,19 @@ 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 BOOL arterialPressureTargetReached; ///< Indicates arterial pressure target reached +static U32 pressureSelfTestPreNormalStartTime; ///< Start time for pre-normal pressure setup delay +static U32 venousPressureStabilizationStartTime; ///< Start time for venous stabilization +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 self-test +static U32 pressureSelfTestNormalizedStartTime; ///< Start time for pressure normalization +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 ); @@ -144,24 +151,30 @@ /*********************************************************************//** * @brief * The initSelfTests function initializes the SelfTests module. - * @details Inputs: none - * @details Outputs: SelfTests module initialized. + * @details \b Inputs: none + * @details \b Outputs: SelfTests module initialized. * @return none *************************************************************************/ void initSelfTests( void ) { - selfTestStartTime = 0; - selfTestPreviousPublishDataTime = 0; - syringeOcclusionDelayStartTime = 0; - doorStateAfterCartridgeInstall = TRUE; + currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; + selfTestStartTime = 0; + selfTestPreviousPublishDataTime = 0; + selfTestCartridgeSettleTime = 0; + syringeOcclusionDelayStartTime = 0; + doorStateAfterCartridgeInstall = TRUE; + dryPressureTestsCompleted = FALSE; + cartridgeUsedTestRun = FALSE; + occlusionBaselineWasSet = FALSE; + heparinOcclusionTestRun = FALSE; } /*********************************************************************//** * @brief * The signalResumeSelfTests function signals the self-tests to resume * previous operation. - * @details Inputs: none - * @details Outputs: primeResumeRequested + * @details \b Inputs: none + * @details \b Outputs: primeResumeRequested * @return none *************************************************************************/ void signalResumeSelfTests( void ) @@ -172,8 +185,8 @@ /*********************************************************************//** * @brief * The resetSelfTestsFlags function resets all self-tests signal flags. - * @details Inputs: none - * @details Outputs: signal flags set to FALSE + * @details \b Inputs: none + * @details \b Outputs: signal flags set to FALSE * @return none *************************************************************************/ static void resetSelfTestsFlags( void ) @@ -185,39 +198,38 @@ * @brief * The setupForSelfTestsStop function sets actuators appropriately for self-tests * states. - * @details Inputs: dryPressureTestsCompleted, PreTreatmentSubState - * @details Outputs: All pumps stopped + * @details \b Inputs: dryPressureTestsCompleted, PreTreatmentSubState + * @details \b Outputs: All pumps stopped * @return none *************************************************************************/ static void setupForSelfTestsStop( void ) { signalBloodPumpHardStop(); + // Air trap control to stopp + endAirTrapControl(); // if ( TRUE == isAlarmActive( ALARM_ID_TD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ) ) // { // retractSyringePump(); // } // else // { - // stopSyringePump(); +// stopSyringePump(); // } - setValvePosition( H13_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H20_VALV, VALVE_POSITION_A_INSERT_EJECT ); + // Set valves + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - // If the TD has finished no cart s.t. but not dry pressure tests, Open to vent pressure - // to prevent air going to the Saline bag. + // Vent pressure only during dry self-test if pressure tests not completed if ( ( TD_PRE_TREATMENT_SELF_TEST_DRY_STATE == getPreTreatmentSubState() ) && ( FALSE == dryPressureTestsCompleted ) ) { setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValveAirTrap( STATE_OPEN ); } - else { setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValveAirTrap( STATE_CLOSED ); } } @@ -248,28 +260,23 @@ * @brief * The transitionToDrySelfTests function resets anything required before * the start of dry self-tests. - * @details Inputs: front door state - * @details Outputs: Dry self-tests re-initialized, changed depending + * @details \b Inputs: front door state + * @details \b Outputs: Dry self-tests re-initialized, changed depending * on front door state * @return none *************************************************************************/ void transitionToDrySelfTests( void ) { - // State Reset - currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; pressureSelfTestBloodPumpRunStartTime = 0; pressureSelfTestNormalizedStartTime = 0; previousNormalArterialPressure = 0.0F; previousNormalVenousPressure = 0.0F; - dryPressureTestsCompleted = FALSE; - cartridgeUsedTestRun = FALSE; - occlusionBaselineWasSet = FALSE; - heparinOcclusionTestRun = FALSE; selfTestStartTime = getMSTimerCount(); selfTestPreviousPublishDataTime = getMSTimerCount(); selfTestCartridgeSettleTime = getMSTimerCount(); doorClosedRequired( TRUE ); setCurrentSubState( (U32)currentDrySelfTestsState ); + transitionToDrySelfTestsState( currentDrySelfTestsState ); signalBloodPumpHardStop(); // stopSyringePump(); @@ -294,8 +301,8 @@ /*********************************************************************//** * @brief * The execDrySelfTests function executes the dry self-tests state machine. - * @details Inputs: currentDrySelfTestsState - * @details Outputs: currentDrySelfTestsState, pressureSelfTestPreNormalStartTime + * @details \b Inputs: currentDrySelfTestsState + * @details \b Outputs: currentDrySelfTestsState, pressureSelfTestPreNormalStartTime * @return none *************************************************************************/ void execDrySelfTests( void ) @@ -364,7 +371,7 @@ currentDrySelfTestsState = handleDrySelfTestArterialPressureReliefState(); break; - case DRY_SELF_TESTS_SYRINGE_PRIME_STATE: + case DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE: currentDrySelfTestsState = handleDrySelfTestSyringePumpPrimeState(); break; @@ -402,15 +409,15 @@ data.timeout = MAX_DRY_SELF_TEST_TIME; data.countdown = ( elapsedSelfTestTimeInSecs <= MAX_DRY_SELF_TEST_TIME ? ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ) : 0 ); - broadcastData( MSG_ID_TD_NO_CART_SELF_TEST_PROGRESS_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); + broadcastData( MSG_ID_TD_DRY_SELF_TEST_PROGRESS_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); } } /*********************************************************************//** * @brief * The getDrySelfTestsState function returns the current state of dry self-tests sub-mode. - * @details Inputs: currentDrySelfTestsState - * @details Outputs: none + * @details \b Inputs: currentDrySelfTestsState + * @details \b Outputs: none * @return current dry self-tests state *************************************************************************/ U32 getDrySelfTestsState( void ) @@ -493,7 +500,7 @@ *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; BUBBLE_STATE_T bubbleStatus = getBubbleDetectedState( H18_BBLD ); AIR_TRAP_LEVELS_T lowerAirTrap = getLevelSensorState( H17_LEVL ); AIR_TRAP_LEVELS_T upperAirTrap = getLevelSensorState( H16_LEVL ); @@ -505,7 +512,7 @@ ( AIR_TRAP_LEVEL_AIR == lowerAirTrap ) && ( AIR_TRAP_LEVEL_AIR == upperAirTrap ) ) { - // If catridge is valid it proceed + // If catridge is valid proceed resetArtVenPressureOffsets(); SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_TUBING_SET_BARCODE_SCAN_REQUEST, 0, 0 ); state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; @@ -545,20 +552,19 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeLoadedCheckState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; - BOOL barcodeScanComplete = isBarcodeScanComplete(); - BOOL barcodeScanSuccess = didBarcodeScanSucceed(); - if ( TRUE == barcodeScanComplete ) + if ( TRUE == barcodeScanResponseReceived ) { - if ( TRUE == barcodeScanSuccess ) + barcodeScanResponseReceived = FALSE; + if ( TRUE == barcodeScanSuccessful ) { - // If Barcode is valid proceed to authentication + // If barcode is athuenticated move to next state 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 invalid it trigger an alarm + // If barcode authentication is failed trigger an alarm activateAlarmNoData( ALARM_ID_TD_INSTALL_NEW_CARTRIDGE ); } } @@ -567,7 +573,6 @@ { if ( TRUE == isAlarmActive( ALARM_ID_TD_NO_CARTRIDGE_LOADED ) ) { - // Reset baseline after reinstall occlusionBaselineWasSet = FALSE; } state = DRY_SELF_TESTS_STOPPED_STATE; @@ -581,6 +586,7 @@ * @brief * The handleDrySelfTestTubeSetAuthenticationState function handles tube set * authentication and processes the authentication response. +* @details \b Message \b Received: MSG_ID_UI_TUBE_SET_AUTHENTICATION_RESPONSE * @details \b Message \b Sent: MSG_ID_TD_TUBE_SET_AUTHENTICATION_RESPONSE * @details \b Inputs: authResponseReceived, authResponseValidTubeSet, * authResponseModalityAccepted @@ -590,49 +596,39 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestTubeSetAuthenticationState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_TUBE_SET_AUTHENTICATION_STATE; - BOOL accepted = FALSE; - REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; TUBE_SET_AUTH_RESULT_PAYLOAD_T payload; - // Initialize payload - memset( (U08*)&payload, 0, sizeof( TUBE_SET_AUTH_RESULT_PAYLOAD_T ) ); + // Initialize the payload + memset( (U08*)&payload, 0, sizeof(payload) ); - // Process authentication response if ( TRUE == authResponseReceived ) { authResponseReceived = FALSE; - // Validate tube set - if ( FALSE == authResponseValidTubeSet ) + if ( ( TRUE == authResponseValidTubeSet ) && ( TRUE == authResponseModalityAccepted ) ) { - rejReason = REQUEST_REJECT_REASON_TD_AUTHENTICATION_INVALID; - } - else if ( FALSE == authResponseModalityAccepted ) - { - rejReason = REQUEST_REJECT_REASON_TD_AUTHENTICATION_MODALITY_MISMATCH; - } - else - { - accepted = TRUE; - } - // Handle result - if ( TRUE == accepted ) - { - payload.accepted = (U32)TRUE; - payload.reason = (U32)REQUEST_REJECT_REASON_NONE; + // Checking validity and modality match + payload.accepted = TRUE; + payload.reason = REQUEST_REJECT_REASON_NONE; state = DRY_SELF_TESTS_SYRINGE_PUMP_SEEK_STATE; } else { - payload.accepted = (U32)FALSE; - payload.reason = (U32)rejReason; - // Trigger an alarm if the cartridge is invalid - if ( REQUEST_REJECT_REASON_TD_AUTHENTICATION_INVALID == rejReason ) + payload.accepted = FALSE; + if ( FALSE == authResponseValidTubeSet ) { + // If invalid tube set occurs trigger an alarm + payload.reason = REQUEST_REJECT_REASON_TD_AUTHENTICATION_INVALID; activateAlarmNoData( ALARM_ID_TD_INVALID_TUBE_SET ); } + else + { + // Modality mismatch + payload.reason = REQUEST_REJECT_REASON_TD_AUTHENTICATION_MODALITY_MISMATCH; + } } + // 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 ) ); + sendMessage( MSG_ID_TD_TUBE_SET_AUTHENTICATION_RESPONSE, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&payload, sizeof(payload) ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -648,23 +644,23 @@ * @brief * The handleDrySelfTestSyringePumpSeekState function handles the syringe * pump seek dry self-test state. - * @details Inputs: useHeparin - * @details Outputs: pressureSelfTestPreNormalStartTime + * @details \b Inputs: useHeparin + * @details \b Outputs: pressureSelfTestPreNormalStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpSeekState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_SYRINGE_PUMP_SEEK_STATE; - BOOL done = FALSE; +// BOOL done = FALSE; if ( TRUE == doesAlarmStatusIndicateStop() ) { state = DRY_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } - else - { // using Heparin? - if ( TRUE == useHeparin ) +// else +// { // using Heparin? +// if ( TRUE == useHeparin ) // { // syringe pump is not busy? // if ( FALSE == isSyringePumpRunning() ) // { // seek completed? @@ -699,8 +695,8 @@ * @brief * The handleDrySelfTestPressureSensorNormalSetupState function handles the setup * for pressure sensors dry self-test. - * @details Inputs: pressureSelfTestPreNormalStartTime - * @details Outputs: previousNormalArterialPressure, previousNormalVenousPressure + * @details \b Inputs: pressureSelfTestPreNormalStartTime + * @details \b Outputs: previousNormalArterialPressure, previousNormalVenousPressure * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorNormalSetupState( void ) @@ -729,8 +725,8 @@ * @brief * The handleDrySelfTestVenousPressureSetupState function handles the setup * for the venous pressure sensor dry self-test. -* @details Inputs: none -* @details Outputs: venousPressureStabilizationStartTime +* @details \b Inputs: none +* @details \b Outputs: venousPressureStabilizationStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureSetupState( void ) @@ -745,7 +741,7 @@ 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 ); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE, 0 ); venousPressureStabilizationStartTime = getMSTimerCount(); peakVenousPressure = getFilteredVenousPressure(); state = DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE; @@ -758,8 +754,8 @@ * @brief * The handleDrySelfTestVenousPressureStabilizationState function handles * venous pressure stabilization check. - * @details Inputs: venousPressureStabilizationStartTime, peakVenousPressure - * @details Outputs: venousPressureP1 + * @details \b Inputs: venousPressureStabilizationStartTime, peakVenousPressure + * @details \b Outputs: venousPressureP1 * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureStabilizationState( void ) @@ -796,8 +792,8 @@ * @brief * The handleDrySelfTestVenousPressureLeakCheckState function handles * venous pressure leak check. - * @details Inputs: venousPressureLeakCheckStartTime, venousPressureP1 - * @details Outputs: venousPressureP2 + * @details \b Inputs: venousPressureLeakCheckStartTime, venousPressureP1 + * @details \b Outputs: venousPressureP2 * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureLeakCheckState( void ) @@ -833,8 +829,8 @@ * @brief * The handleDrySelfTestVenousPressureReliefState function handles * venous pressure relief state. - * @details Inputs: venousPressureReliefStartTime - * @details Outputs: none + * @details \b Inputs: venousPressureReliefStartTime + * @details \b Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureReliefState( void ) @@ -868,11 +864,11 @@ * @brief * The handleDrySelfTestPressureArterialSetupState function handles the setup * for the arterial pressure sensor dry self-test. - * @details Inputs: none - * @details Outputs: pressureSelfTestArterialStartTime + * @details \b Inputs: none + * @details \b Outputs: pressureSelfTestArterialStartTime * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureArterialSetupState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureSetupState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE; @@ -884,7 +880,7 @@ 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 ); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE, 0 ); pressureSelfTestArterialStartTime = getMSTimerCount(); arterialPressureTargetReached = FALSE; state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; @@ -898,9 +894,9 @@ * The handleDrySelfTestArterialPressureStabilizationState function monitors * arterial pressure, verifies target pressure is reached, and records P1 * after stabilization. - * @details Inputs: pressureSelfTestArterialStartTime, + * @details \b Inputs: pressureSelfTestArterialStartTime, * arterialPressureStabilizationStartTime - * @details Outputs: peakArterialPressure, arterialPressureP1, + * @details \b Outputs: peakArterialPressure, arterialPressureP1, * arterialPressureLeakCheckStartTime * @return the next state of dry self-tests state machine *************************************************************************/ @@ -962,8 +958,8 @@ * @brief * The handleDrySelfTestArterialPressureLeakCheckState function verifies * arterial pressure leak by comparing P1 and P2. - * @details Inputs: arterialPressureLeakCheckStartTime, arterialPressureP1 - * @details Outputs: arterialPressureP2 + * @details \b Inputs: arterialPressureLeakCheckStartTime, arterialPressureP1 + * @details \b Outputs: arterialPressureP2 * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureLeakCheckState( void ) @@ -999,8 +995,8 @@ * @brief * The handleDrySelfTestArterialPressureReliefState function relieves * arterial pressure and verifies return to baseline. - * @details Inputs: arterialPressureReliefStartTime - * @details Outputs: none + * @details \b Inputs: arterialPressureReliefStartTime + * @details \b Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureReliefState( void ) @@ -1018,7 +1014,7 @@ if ( fabs( pressure ) <= ARTERIAL_RELIEF_PRESSURE_THRESHOLD_MMHG ) { - state = DRY_SELF_TESTS_SYRINGE_PRIME_STATE; + state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; } else { @@ -1034,16 +1030,16 @@ * @brief * The handleDrySelfTestSyringePumpPrimeState function handles the prime * operation for syringe pump. - * @details Inputs: none - * @details Outputs: none + * @details \b Inputs: none + * @details \b Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpPrimeState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_SYRINGE_PRIME_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; -// if ( TRUE == useHeparin ) -// { + if ( TRUE == useHeparin ) + { // if ( FALSE == isSyringePumpRunning() ) // { // if ( TRUE == isSyringePlungerFound() ) @@ -1070,27 +1066,27 @@ // } // } // } -// } -// else -// { -// state = DRY_SELF_TESTS_COMPLETE_STATE; -// } -// -// if ( TRUE == doesAlarmStatusIndicateStop() ) -// { -// state = DRY_SELF_TESTS_STOPPED_STATE; -// setupForSelfTestsStop(); -// } + } + else + { + state = DRY_SELF_TESTS_COMPLETE_STATE; + } + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = DRY_SELF_TESTS_STOPPED_STATE; + setupForSelfTestsStop(); + } + return state; -//} +} /*********************************************************************//** * @brief * The handleDrySelfTestSyringePumpOcclusionDetectionState function handles * occlusion detection after prime has completed. - * @details Inputs: syringeOcclusionDelayStartTime - * @details Outputs: heparinOcclusionTestRun + * @details \b Inputs: syringeOcclusionDelayStartTime + * @details \b Outputs: heparinOcclusionTestRun * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpOcclusionDetectionState( void ) @@ -1099,10 +1095,10 @@ if ( TRUE == didTimeout( syringeOcclusionDelayStartTime, SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ) ) { - if ( FALSE == checkForSyringeOcclusion( FALSE ) ) // transition to complete state only when occlusion is removed - { - state = DRY_SELF_TESTS_COMPLETE_STATE; - } +// if ( FALSE == checkForSyringeOcclusion( FALSE ) ) // transition to complete state only when occlusion is removed +// { +// state = DRY_SELF_TESTS_COMPLETE_STATE; +// } heparinOcclusionTestRun = TRUE; } @@ -1119,46 +1115,86 @@ * @brief * The handleDrySelfTestStoppedState function handles the stopped dry self-tests * operation. - * @details Inputs: selfTestsResumeRequested, occlusionBaselineWasSet, + * @details \b Inputs: selfTestsResumeRequested, occlusionBaselineWasSet, * dryPressureTestsCompleted, cartridgeUsedTestRun, heparinOcclusionTestRun - * @details Outputs: selfTestsResumeRequested, selfTestStartTime, selfTestCartridgeSettleTime + * @details \b Outputs: selfTestsResumeRequested, selfTestStartTime, selfTestCartridgeSettleTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_STOPPED_STATE; + setAlarmResumePerDoorAndLatch(); + doorClosedRequired( FALSE ); + // if not enough heparin alarm, pre-load pusher after retract completes + if ( TRUE == isAlarmActive( ALARM_ID_TD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ) ) + { + // prevent resume until syringe is retracted and pre-loaded + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); +// if ( TRUE != isSyringePumpRunning() ) +// { +// if ( TRUE == isSyringePumpHome() ) +// { +// preloadSyringePlunger(); +// } +// else if ( TRUE == isSyringePumpPreLoaded() ) +// { +// setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); +// } +// } + } + + // if heparin occlusin alarm, keep calling check function so alarm condition will clear when resolved if ( TRUE == isAlarmActive( ALARM_ID_TD_SYRINGE_PUMP_OCCLUSION ) ) +// { +// checkForSyringeOcclusion( FALSE ); +// } + + // depressurized the line from failed pressure self tests. + if ( FALSE == dryPressureTestsCompleted ) { - checkForSyringeOcclusion( FALSE ); + if ( getFilteredVenousPressure() <= VENOUS_LEAK_PRESSURE_DIFF_TOLERANCE_MMHG ) + { + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + } } + // if resume request, resume dry self-tests if ( TRUE == selfTestsResumeRequested ) { - selfTestsResumeRequested = FALSE; - selfTestStartTime = getMSTimerCount(); - selfTestCartridgeSettleTime = getMSTimerCount(); - + // Restart self-test start time + selfTestsResumeRequested = FALSE; + selfTestStartTime = getMSTimerCount(); + selfTestCartridgeSettleTime = getMSTimerCount(); + doorClosedRequired( TRUE ); if ( TRUE == heparinOcclusionTestRun ) { state = DRY_SELF_TESTS_COMPLETE_STATE; } else if ( TRUE == dryPressureTestsCompleted ) { - state = DRY_SELF_TESTS_SYRINGE_PRIME_STATE; + state = ALARM_ID_TD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM; } - else if ( TRUE == cartridgeUsedTestRun ) - { - state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; - } - else if ( FALSE == occlusionBaselineWasSet ) - { - state = DRY_SELF_TESTS_START_STATE; - } else { - state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + if ( TRUE == cartridgeUsedTestRun ) + { + resetArtVenPressureOffsets(); + state = DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE; + } + else if ( TRUE != occlusionBaselineWasSet ) + { + selfTestCartridgeSettleTime = getMSTimerCount(); + state = DRY_SELF_TESTS_START_STATE; + } + else + { + state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + } } } @@ -1169,308 +1205,303 @@ * @brief * The transitionToDrySelfTestsState function handles the transition to * dry self-test states by setting actuators. -* -* @details Inputs: none -* @details Outputs: none +* @details \b Inputs: none +* @details \b Outputs: none * @param newState the targeted dry self-test state * @return none *************************************************************************/ static void transitionToDrySelfTestsState( DRY_SELF_TESTS_STATE_T newState ) { - switch ( newState ) - { - case DRY_SELF_TESTS_START_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + switch ( newState ) + { + case DRY_SELF_TESTS_START_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_TUBE_SET_AUTHENTICATION_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_SYRINGE_PUMP_SEEK_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_PRESSURE_SENSOR_NORMAL_SETUP_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - startAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_TUBE_SET_AUTHENTICATION_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_SYRINGE_PUMP_SEEK_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - setBloodPumpTargetFlowRate( BLOOD_PUMP_PRESSURE_SELF_TEST_FLOW, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_PRESSURE_SENSOR_NORMAL_SETUP_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_SYRINGE_PRIME_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); - setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + startAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_SYRINGE_PUMP_OCCLUSION_CHECK_STATE: - { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); - endAirTrapControl(); - set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); - retractEjector(); - cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); - cmdChangeQuf( 0.0F ); - } - break; + case DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - case DRY_SELF_TESTS_COMPLETE_STATE: - { - signalBloodPumpHardStop(); - endAirTrapControl(); - cmdChangeQuf( 0.0F ); - } - break; + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; - case DRY_SELF_TESTS_STOPPED_STATE: - { - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); - setAlarmResumePerDoorAndLatch(); - doorClosedRequired( FALSE ); - } - break; + case DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_INVALID_DRY_SELF_TEST_STATE, (U32)newState ); - break; - } + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + + setBloodPumpTargetFlowRate( BLOOD_PUMP_PRESSURE_SELF_TEST_FLOW, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); + setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_SYRINGE_PUMP_OCCLUSION_CHECK_STATE: + { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + + signalBloodPumpHardStop(); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); + endAirTrapControl(); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + cmdBypassDialyzer( TRUE ); + cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQuf( 0.0F ); + } + break; + + case DRY_SELF_TESTS_COMPLETE_STATE: + signalBloodPumpHardStop(); + endAirTrapControl(); + cmdChangeQuf( 0.0F ); + break; + + case DRY_SELF_TESTS_STOPPED_STATE: + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setAlarmResumePerDoorAndLatch(); + doorClosedRequired( FALSE ); + break; + + default: + 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 -rd7cae63618be45748f93b1576ca49e7825fe0cf8 -rfdaecc8cba085b8f2a57c8478c6ad800f7303483 --- firmware/App/Modes/StatePreTxDrySelfTests.h (.../StatePreTxDrySelfTests.h) (revision d7cae63618be45748f93b1576ca49e7825fe0cf8) +++ firmware/App/Modes/StatePreTxDrySelfTests.h (.../StatePreTxDrySelfTests.h) (revision fdaecc8cba085b8f2a57c8478c6ad800f7303483) @@ -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.h * * @author (last) Varshini Nagabooshanam * @date (last) 01-Apr-2026 @@ -18,15 +18,14 @@ #ifndef __SELF_TESTS_H__ #define __SELF_TESTS_H__ -#include "Common.h" #include "TDCommon.h" #include "TDDefs.h" /** - * @defgroup SelfTests - * @brief SelfTests module. This module handles self-tests execution for pre-treatment mode. + * @defgroup StatePreTxDrySelfTests + * @brief StatePreTxDrySelfTests module. This module handles self-tests execution for pre-treatment mode. * - * @addtogroup SelfTests + * @addtogroup StatePreTxDrySelfTests * @{ */ @@ -40,10 +39,13 @@ } SELF_TEST_DRY_PAYLOAD_T; // ********** public function prototypes ********** + void initSelfTests( void ); void transitionToDrySelfTests( void ); void execDrySelfTests( void ); +U32 getDrySelfTestsState( void ); + void handleDoorCloseAfterCartridgeInsertion( void ); /**@}*/