Index: firmware/App/Services/StateServices/DrySelfTests.c =================================================================== diff -u -ref261eec9da3f584ac2d017524097556dcccdd59 -rdfe866f3cafcc1bfd1ecf9191ed823488c2e55e1 --- firmware/App/Services/StateServices/DrySelfTests.c (.../DrySelfTests.c) (revision ef261eec9da3f584ac2d017524097556dcccdd59) +++ firmware/App/Services/StateServices/DrySelfTests.c (.../DrySelfTests.c) (revision dfe866f3cafcc1bfd1ecf9191ed823488c2e55e1) @@ -23,6 +23,7 @@ #include "Common.h" #include "DDInterface.h" #include "DrySelfTests.h" +#include "FpgaTD.h" #include "LevelSensors.h" #include "Messaging.h" #include "ModePreTreat.h" @@ -47,35 +48,54 @@ // ********** private definitions ********** // Pressure self-test timing -#define PRE_NORMAL_PRESSURE_DELAY_MS ( 5 * MS_PER_SECOND ) ///< Delay before capturing baseline arterial and venous pressures. -#define STABILITY_PRESSURE_CHECK_TIME_MS ( 4 * MS_PER_SECOND ) ///< Time allowed for pressure stabilization. -#define VENOUS_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor venous pressure decay (leak check). -#define ARTERIAL_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor arterial pressure decay (leak check). +//#define PRE_NORMAL_PRESSURE_DELAY_MS ( 5 * MS_PER_SECOND ) ///< Delay before capturing baseline arterial and venous pressures. +//#define STABILITY_PRESSURE_CHECK_TIME_MS ( 4 * MS_PER_SECOND ) ///< Time allowed for pressure stabilization. +//#define VENOUS_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor venous pressure decay (leak check). +//#define ARTERIAL_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor arterial pressure decay (leak check). #define TUBING_SET_INSERT_PRESSURE_SETTLE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Time required for pressure settling after tubing set insertion. -#define VENOUS_PRESSURE_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Max time allowed to reach venous pressure target. -#define ARTERIAL_PRESSURE_TIMEOUT_MS ( 30 * MS_PER_SECOND ) ///< Max time allowed to reach arterial pressure target. -#define PRESSURE_RELIEF_CHECK_TIME_MS ( 30 * MS_PER_SECOND ) ///< Pressure Relief check time in ms. -#define ARTERIAL_PRESSURE_SETTLE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Arterial pressure settle time in ms +//#define VENOUS_PRESSURE_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Max time allowed to reach venous pressure target. +//#define ARTERIAL_PRESSURE_TIMEOUT_MS ( 30 * MS_PER_SECOND ) ///< Max time allowed to reach arterial pressure target. +//#define PRESSURE_RELIEF_CHECK_TIME_MS ( 30 * MS_PER_SECOND ) ///< Pressure Relief check time in ms. +//#define ARTERIAL_PRESSURE_SETTLE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Arterial pressure settle time in ms #define MAX_DRY_SELF_TEST_TIME ( 12 * SEC_PER_MIN ) ///< Maximum total dry self-test duration. #define SELF_TEST_TIME_DATA_PUB_INTERVAL ( 1 * MS_PER_SECOND ) ///< Interval for publishing self-test progress data. #define TUBING_SET_AUTH_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Tubing set authentication timeout //Pressure self-test pump flow -#define BLOOD_PUMP_PRESSURE_SELF_TEST_FLOW 100 ///< Blood pump flow rate during arterial pressure self-test (mL/min). +//#define BLOOD_PUMP_PRESSURE_SELF_TEST_FLOW 100 ///< Blood pump flow rate during arterial pressure self-test (mL/min). // Pressure thresholds -#define ZERO_PRESSURE_THRESHOLD_MMHG 15.0F ///< Zeroing the pressure -#define VENOUS_PRESSURE_TARGET_MMHG 250.0F ///< Target venous pressure threshold during pressure build. -#define ARTERIAL_PRESSURE_TARGET_MMHG -200.0F ///< Target arterial pressure threshold during pressure build. -#define VENOUS_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed venous pressure variation during stabilization. -#define ARTERIAL_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed arterial pressure variation during stabilization. -#define VENOUS_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed venous pressure difference during leak check. -#define ARTERIAL_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed arterial pressure difference during leak check. -#define VENOUS_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F ///< Venous pressure must return within this threshold after relief. -#define ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F ///< Arterial pressure must return within this threshold after relief. +//#define ZERO_PRESSURE_THRESHOLD_MMHG 15.0F ///< Zeroing the pressure +//#define VENOUS_PRESSURE_TARGET_MMHG 250.0F ///< Target venous pressure threshold during pressure build. +//#define ARTERIAL_PRESSURE_TARGET_MMHG -200.0F ///< Target arterial pressure threshold during pressure build. +//#define VENOUS_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed venous pressure variation during stabilization. +//#define ARTERIAL_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed arterial pressure variation during stabilization. +//#define VENOUS_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed venous pressure difference during leak check. +//#define ARTERIAL_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed arterial pressure difference during leak check. +//#define VENOUS_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F ///< Venous pressure must return within this threshold after relief. +//#define ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F ///< Arterial pressure must return within this threshold after relief. +// New +// Pressure self-test timing +#define PRE_NORMAL_PRESSURE_DELAY_MS ( 5 * MS_PER_SECOND ) ///< Delay before zeroing pressure sensors. +#define PRESSURE_BUILD_TIMEOUT_MS ( 40 * MS_PER_SECOND ) ///< Maximum pressure build time. +#define PRESSURE_STABILIZATION_TIME_MS ( 1 * MS_PER_SECOND ) ///< Pressure stabilization time. +#define PRESSURE_DECAY_CHECK_TIME_MS ( 2 * MS_PER_SECOND ) ///< Pressure decay monitoring time. +#define PRESSURE_RELIEF_CHECK_TIME_MS ( 2 * MS_PER_SECOND ) ///< Pressure relief verification time. +// Pressure thresholds +#define PRESSURE_SELF_TEST_H4_SPEED_RPM 1500 ///< H4 blood pump speed during pressure self-test +#define ZERO_PRESSURE_THRESHOLD_MMHG 15.0F ///< Zeroing the pressure +#define NEG_ART_PRESSURE_TARGET_MMHG -250.0F ///< Negative arterial pressure generation targets +#define POS_VEN_PRESSURE_TARGET_MMHG 375.0F ///< Positive venous pressure generation targets +#define NEG_ART_STABILIZED_PRESSURE_MMHG -200.0F ///< Minimum arterial pressure that must remain after stabilization +#define POS_VEN_STABILIZED_PRESSURE_MMHG 250.0F ///< Minimum venous pressure that must remain after stabilization +#define POS_ART_PRESSURE_TARGET_MMHG 200.0F ///< Positive arterial pressure generation target +#define POS_ART_STABILIZED_PRESSURE_MMHG 180.0F ///< Minimum positive arterial pressure after stabilization +#define PRESSURE_DECAY_TOLERANCE_MMHG 2.5F ///< Maximum pressure change allowed during decay checks +#define PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F ///< Pressure must return within +/-5 mmHg during relief + /// Payload record structure for dry self-test authentication response typedef struct { @@ -85,44 +105,83 @@ // ********** private data ********** -static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of Dry Self-Test state machine -static U32 selfTestPreviousPublishDataTime; ///< Last progress data publish time -static U32 selfTestStartTime; ///< Start time of dry self-tests -static BOOL doorStateAfterTubingSetInstall; ///< Tracks door transition after tubing set install -static BOOL selfTestsResumeRequested; ///< Resume requested from STOPPED state -static BOOL tubingSetLeakChecksStarted; ///< Indicates tubing set leak check started -static BOOL barcodeScanResponseReceived; ///< Barcode response received flag -static U32 authenticationStartTime; ///< Authentication start timer -static BOOL authResponseReceived; ///< Indicates UI auth response received -static BOOL authResponseValidTubingSet; ///< Indicates tubing set is valid -static BOOL authResponseModalityAccepted; ///< Indicates tubing set modality is accepted +//static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of Dry Self-Test state machine +//static U32 selfTestPreviousPublishDataTime; ///< Last progress data publish time +//static U32 selfTestStartTime; ///< Start time of dry self-tests +//static BOOL doorStateAfterTubingSetInstall; ///< Tracks door transition after tubing set install +//static BOOL selfTestsResumeRequested; ///< Resume requested from STOPPED state +//static BOOL tubingSetLeakChecksStarted; ///< Indicates tubing set leak check started +//static BOOL barcodeScanResponseReceived; ///< Barcode response received flag +//static U32 authenticationStartTime; ///< Authentication start timer +//static BOOL authResponseReceived; ///< Indicates UI auth response received +//static BOOL authResponseValidTubingSet; ///< Indicates tubing set is valid +//static BOOL authResponseModalityAccepted; ///< Indicates tubing set modality is accepted +// +//// Pressure normal +//static U32 pressureSelfTestPreNormalStartTime; ///< Start time for pre-normal pressure setup delay +// +//// Venous pressure +//static U32 venousSetupStartTime; ///< Venous setup start time +//static F32 peakVenousPressure; ///< Peak venous pressure during stabilization +//static U32 venousPressureStabilizationStartTime; ///< Start time for venous stabilization +//static F32 venousPressureP1; ///< First stable venous pressure sample +//static F32 venousPressureP2; ///< Second venous pressure sample for leak check +//static U32 venousPressureLeakCheckStartTime; ///< Start time for venous leak check +//static U32 venousPressureReliefStartTime; ///< Start time for venous pressure relief +// +//// Arterial pressure +//static U32 arterialSetupStartTime; ///< Arterial pressure setup state entry +//static U32 pressureSelfTestArterialStartTime; ///< Start time for arterial pressure build-up +//static F32 peakArterialPressure; ///< Peak arterial pressure during stabilization +//static U32 arterialPressureStabilizationStartTime; ///< Start time for arterial stabilization +//static F32 arterialPressureP1; ///< First stable arterial pressure sample +//static F32 arterialPressureP2; ///< Second arterial pressure sample for leak check +//static U32 arterialPressureLeakCheckStartTime; ///< Start time for arterial leak check +//static U32 arterialPressureReliefStartTime; ///< Start time for arterial pressure relief +// +//// Used to avoid comparing pump running pressure against immediate post hard stop pressure. +//static U32 arterialPressureSettleStartTime; ///< Arterial pressure settle start time +//static BOOL arterialPressureBaselineCaptured; ///< Arterial Pressure base captured +static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current Dry Self-Test state. + +static U32 selfTestPreviousPublishDataTime; ///< Previous progress publish time. +static U32 selfTestStartTime; ///< Dry Self-Test start time. + +static BOOL doorStateAfterTubingSetInstall; ///< Door transition after tubing set installation. +static BOOL selfTestsResumeRequested; ///< Resume request from STOPPED state. +static BOOL tubingSetLeakChecksStarted; ///< Pressure/leak testing started. + +static BOOL barcodeScanResponseReceived; ///< Barcode scan response received. +static U32 authenticationStartTime; ///< Tubing authentication start time. +static BOOL authResponseReceived; ///< Authentication response received. +static BOOL authResponseValidTubingSet; ///< Tubing set valid. +static BOOL authResponseModalityAccepted; ///< Tubing modality accepted. + // Pressure normal -static U32 pressureSelfTestPreNormalStartTime; ///< Start time for pre-normal pressure setup delay +static U32 pressureSelfTestPreNormalStartTime; ///< Pressure normal setup start time. -// Venous pressure -static U32 venousSetupStartTime; ///< Venous setup start time -static F32 peakVenousPressure; ///< Peak venous pressure during stabilization -static U32 venousPressureStabilizationStartTime; ///< Start time for venous stabilization -static F32 venousPressureP1; ///< First stable venous pressure sample -static F32 venousPressureP2; ///< Second venous pressure sample for leak check -static U32 venousPressureLeakCheckStartTime; ///< Start time for venous leak check -static U32 venousPressureReliefStartTime; ///< Start time for venous pressure relief +// Negative arterial / positive venous +static U32 negArtPosVenSetupStartTime; ///< Combined pressure build start time. +static U32 negArtPosVenStabilizationStartTime; ///< Combined stabilization start time. +static U32 negArtPosVenDecayStartTime; ///< Combined decay check start time. -// Arterial pressure -static U32 arterialSetupStartTime; ///< Arterial pressure setup state entry -static U32 pressureSelfTestArterialStartTime; ///< Start time for arterial pressure build-up -static F32 peakArterialPressure; ///< Peak arterial pressure during stabilization -static U32 arterialPressureStabilizationStartTime; ///< Start time for arterial stabilization -static F32 arterialPressureP1; ///< First stable arterial pressure sample -static F32 arterialPressureP2; ///< Second arterial pressure sample for leak check -static U32 arterialPressureLeakCheckStartTime; ///< Start time for arterial leak check -static U32 arterialPressureReliefStartTime; ///< Start time for arterial pressure relief +static F32 negArtPressureP1; ///< Negative arterial first pressure sample. +static F32 negArtPressureP2; ///< Negative arterial second pressure sample. +static F32 posVenPressureP1; ///< Positive venous first pressure sample. +static F32 posVenPressureP2; ///< Positive venous second pressure sample. -// Used to avoid comparing pump running pressure against immediate post hard stop pressure. -static U32 arterialPressureSettleStartTime; ///< Arterial pressure settle start time -static BOOL arterialPressureBaselineCaptured; ///< Arterial Pressure base captured +// Positive arterial +static U32 posArtSetupStartTime; ///< Positive arterial build start time. +static U32 posArtStabilizationStartTime; ///< Positive arterial stabilization start time. +static U32 posArtDecayStartTime; ///< Positive arterial decay start time. +static F32 posArtPressureP1; ///< Positive arterial first pressure sample. +static F32 posArtPressureP2; ///< Positive arterial second pressure sample. + +// Pressure relief +static U32 pressureReliefStartTime; ///< Pressure relief start time. + // ********** private function prototypes ********** static void publishDrySelfTestProgress( void ); @@ -134,15 +193,18 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedTubingSetCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestTubingSetLoadedCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestTubingSetAuthenticationState( 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 handleDrySelfTestNegArtPosVenPressureSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestNegArtPosVenStabilizationState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestNegArtPosVenDecayCheckState( void ); + +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPosArtPressureSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPosArtStabilizationState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPosArtDecayCheckState( void ); + +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureReliefState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ); /*********************************************************************//** @@ -161,20 +223,7 @@ pressureSelfTestPreNormalStartTime = 0; - venousSetupStartTime = 0; - venousPressureStabilizationStartTime = 0; - venousPressureLeakCheckStartTime = 0; - venousPressureReliefStartTime = 0; - - pressureSelfTestArterialStartTime = 0; - arterialPressureStabilizationStartTime = 0; - arterialPressureLeakCheckStartTime = 0; - arterialPressureReliefStartTime = 0; - - arterialPressureSettleStartTime = 0; - authenticationStartTime = 0; - doorStateAfterTubingSetInstall = TRUE; selfTestsResumeRequested = FALSE; tubingSetLeakChecksStarted = FALSE; @@ -184,15 +233,23 @@ authResponseValidTubingSet = FALSE; authResponseModalityAccepted = FALSE; - peakVenousPressure = 0.0F; - venousPressureP1 = 0.0F; - venousPressureP2 = 0.0F; + negArtPosVenSetupStartTime = 0; + negArtPosVenStabilizationStartTime = 0; + negArtPosVenDecayStartTime = 0; - peakArterialPressure = 0.0F; - arterialPressureP1 = 0.0F; - arterialPressureP2 = 0.0F; + negArtPressureP1 = 0.0F; + negArtPressureP2 = 0.0F; + posVenPressureP1 = 0.0F; + posVenPressureP2 = 0.0F; - arterialPressureBaselineCaptured = FALSE; + posArtSetupStartTime = 0; + posArtStabilizationStartTime = 0; + posArtDecayStartTime = 0; + + posArtPressureP1 = 0.0F; + posArtPressureP2 = 0.0F; + + pressureReliefStartTime = 0; } /*********************************************************************//** @@ -250,38 +307,34 @@ currentDrySelfTestsState = handleDrySelfTestPressureSensorNormalSetupState(); break; - case DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE: - currentDrySelfTestsState = handleDrySelfTestVenousPressureSetupState(); + case DRY_SELF_TESTS_NEG_ART_POS_VEN_PRESSURE_SETUP_STATE: + currentDrySelfTestsState = handleDrySelfTestNegArtPosVenPressureSetupState(); break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE: - currentDrySelfTestsState = handleDrySelfTestVenousPressureStabilizationState(); + case DRY_SELF_TESTS_NEG_ART_POS_VEN_STABILIZATION_STATE: + currentDrySelfTestsState = handleDrySelfTestNegArtPosVenStabilizationState(); break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE: - currentDrySelfTestsState = handleDrySelfTestVenousPressureLeakCheckState(); + case DRY_SELF_TESTS_NEG_ART_POS_VEN_DECAY_CHECK_STATE: + currentDrySelfTestsState = handleDrySelfTestNegArtPosVenDecayCheckState(); break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE: - currentDrySelfTestsState = handleDrySelfTestVenousPressureReliefState(); + case DRY_SELF_TESTS_POS_ART_PRESSURE_SETUP_STATE: + currentDrySelfTestsState = handleDrySelfTestPosArtPressureSetupState(); break; - case DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE: - currentDrySelfTestsState = handleDrySelfTestArterialPressureSetupState(); + case DRY_SELF_TESTS_POS_ART_STABILIZATION_STATE: + currentDrySelfTestsState = handleDrySelfTestPosArtStabilizationState(); break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE: - currentDrySelfTestsState = handleDrySelfTestArterialPressureStabilizationState(); + case DRY_SELF_TESTS_POS_ART_DECAY_CHECK_STATE: + currentDrySelfTestsState = handleDrySelfTestPosArtDecayCheckState(); break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE: - currentDrySelfTestsState = handleDrySelfTestArterialPressureLeakCheckState(); + case DRY_SELF_TESTS_PRESSURE_RELIEF_STATE: + currentDrySelfTestsState = handleDrySelfTestPressureReliefState(); break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE: - currentDrySelfTestsState = handleDrySelfTestArterialPressureReliefState(); - break; - case DRY_SELF_TESTS_STOPPED_STATE: currentDrySelfTestsState = handleDrySelfTestStoppedState(); break; @@ -533,11 +586,11 @@ /*********************************************************************//** * @brief - * The handleDrySelfTestPressureSensorNormalSetupState function handles the setup - * for pressure sensors dry self-test. - * @details \b Inputs: pressureSelfTestPreNormalStartTime, art, ven + * The handleDrySelfTestPressureSensorNormalSetupState function verifies + * arterial and venous pressures before pressure sensor zeroing. + * @details \b Inputs: pressureSelfTestPreNormalStartTime * @details \b Outputs: none - * @return the next state of dry self-tests state machine + * @return next Dry Self-Test state *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorNormalSetupState( void ) { @@ -548,11 +601,11 @@ F32 art = getFilteredArterialPressure(); F32 ven = getFilteredVenousPressure(); - if ( ( fabs(art) < ZERO_PRESSURE_THRESHOLD_MMHG ) && ( fabs(ven) < ZERO_PRESSURE_THRESHOLD_MMHG ) ) + if ( ( fabs( art ) < ZERO_PRESSURE_THRESHOLD_MMHG ) && + ( fabs( ven ) < ZERO_PRESSURE_THRESHOLD_MMHG ) ) { setArtVenPressureOffsets(); - //venousSetupStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE; + state = DRY_SELF_TESTS_NEG_ART_POS_VEN_PRESSURE_SETUP_STATE; } else { @@ -565,139 +618,148 @@ } /*********************************************************************//** -* @brief -* The handleDrySelfTestVenousPressureSetupState function handles the setup -* for the venous pressure sensor dry self-test. -* @details \b Inputs: venousSetupStartTime -* @details \b Outputs: peakVenousPressure, venousPressureStabilizationStartTime -* @return the next state of dry self-tests state machine -*************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureSetupState( void ) + * @brief + * The handleDrySelfTestNegArtPosVenPressureSetupState function monitors + * negative arterial and positive venous pressure generation. + * @details \b Inputs: negArtPosVenSetupStartTime, + * @details \b Outputs: none + * @return next Dry Self-Test state + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestNegArtPosVenPressureSetupState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_NEG_ART_POS_VEN_PRESSURE_SETUP_STATE; + F32 art = getFilteredArterialPressure(); F32 ven = getFilteredVenousPressure(); - // If it reaches to traget venous pressure >= 250 mmHg then the transition to venous pressure stablization state - if ( ven >= VENOUS_PRESSURE_TARGET_MMHG ) + if ( ( art <= NEG_ART_PRESSURE_TARGET_MMHG ) && ( ven >= POS_VEN_PRESSURE_TARGET_MMHG ) ) { - peakVenousPressure = ven; - venousPressureStabilizationStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE; + state = DRY_SELF_TESTS_NEG_ART_POS_VEN_STABILIZATION_STATE; } - // Time out alarm if it does not reach within 60 sec tolerance - else if ( TRUE == didTimeout( venousSetupStartTime, VENOUS_PRESSURE_TIMEOUT_MS ) ) + else if ( TRUE == didTimeout( negArtPosVenSetupStartTime, PRESSURE_BUILD_TIMEOUT_MS ) ) { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURIZATION_TIMEOUT, ven ); + if ( art > NEG_ART_PRESSURE_TARGET_MMHG ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURIZATION_TIMEOUT, art ); + } + else + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURIZATION_TIMEOUT, ven ); + } + state = DRY_SELF_TESTS_STOPPED_STATE; } return state; } -/*********************************************************************//** - * @brief - * The handleDrySelfTestVenousPressureStabilizationState function handles - * venous pressure stabilization check. - * @details \b Inputs: venousPressureStabilizationStartTime - * @details \b Outputs: venousPressureP1, venousPressureLeakCheckStartTime - * @return the next state of dry self-tests state machine - *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureStabilizationState( void ) -{ - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE; - if ( TRUE == didTimeout( venousPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) - { - venousPressureP1 = getFilteredVenousPressure(); - venousPressureLeakCheckStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE; - } - - return state; -} - /*********************************************************************//** * @brief - * The handleDrySelfTestVenousPressureLeakCheckState function handles - * venous pressure leak check. - * @details \b Inputs: venousPressureLeakCheckStartTime, venousPressureP1 - * @details \b Outputs: venousPressureP2, venousPressureReliefStartTime - * @return the next state of dry self-tests state machine + * The handleDrySelfTestNegArtPosVenStabilizationState function verifies + * negative arterial and positive venous pressure after stabilization. + * @details \b Inputs: negArtPosVenStabilizationStartTime, + * @details \b Outputs: negArtPressureP1, posVenPressureP1 + * @return next Dry Self-Test state *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureLeakCheckState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestNegArtPosVenStabilizationState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_NEG_ART_POS_VEN_STABILIZATION_STATE; - if ( TRUE == didTimeout( venousPressureLeakCheckStartTime, VENOUS_PRESSURE_LEAK_CHECK_TIME_MS ) ) + if ( TRUE == didTimeout( negArtPosVenStabilizationStartTime, PRESSURE_STABILIZATION_TIME_MS ) ) { - F32 diff; + F32 art = getFilteredArterialPressure(); + F32 ven = getFilteredVenousPressure(); - venousPressureP2 = getFilteredVenousPressure(); - diff = fabs( venousPressureP1 - venousPressureP2 ); - - if ( diff <= VENOUS_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG ) + if ( ( art <= NEG_ART_STABILIZED_PRESSURE_MMHG ) && ( ven >= POS_VEN_STABILIZED_PRESSURE_MMHG ) ) { - venousPressureReliefStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE; + negArtPressureP1 = art; + posVenPressureP1 = ven; + state = DRY_SELF_TESTS_NEG_ART_POS_VEN_DECAY_CHECK_STATE; } else { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_LEAK, venousPressureP1, venousPressureP2 ); + if ( art > NEG_ART_STABILIZED_PRESSURE_MMHG ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_DECAY, art ); + } + else + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_DECAY, ven ); + } state = DRY_SELF_TESTS_STOPPED_STATE; } } return state; } + + /*********************************************************************//** * @brief - * The handleDrySelfTestVenousPressureReliefState function handles - * venous pressure relief state. - * @details \b Inputs: venousPressureReliefStartTime - * @details \b Outputs: none - * @return the next state of dry self-tests state machine + * The handleDrySelfTestNegArtPosVenDecayCheckState function verifies + * arterial and venous pressure decay. + * @details \b Inputs: negArtPosVenDecayStartTime, negArtPressureP1, + * posVenPressureP1 + * @details \b Outputs: negArtPressureP2, posVenPressureP2 + * @return next Dry Self-Test state *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureReliefState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestNegArtPosVenDecayCheckState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_NEG_ART_POS_VEN_DECAY_CHECK_STATE; - if ( TRUE == didTimeout( venousPressureReliefStartTime, PRESSURE_RELIEF_CHECK_TIME_MS ) ) + if ( TRUE == didTimeout( negArtPosVenDecayStartTime, PRESSURE_DECAY_CHECK_TIME_MS ) ) { - F32 ven = getFilteredVenousPressure(); + F32 artDiff; + F32 venDiff; - if ( fabs( ven ) <= VENOUS_PRESSURE_RELIEF_THRESHOLD_MMHG ) + negArtPressureP2 = getFilteredArterialPressure(); + posVenPressureP2 = getFilteredVenousPressure(); + + artDiff = fabs( negArtPressureP1 - negArtPressureP2 ); + venDiff = fabs( posVenPressureP1 - posVenPressureP2 ); + + if ( ( artDiff <= PRESSURE_DECAY_TOLERANCE_MMHG ) && ( venDiff <= PRESSURE_DECAY_TOLERANCE_MMHG ) ) { - arterialSetupStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE; + state = DRY_SELF_TESTS_POS_ART_PRESSURE_SETUP_STATE; } else { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_RELIEF, ven ); + if ( artDiff > PRESSURE_DECAY_TOLERANCE_MMHG ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_LEAK, artDiff ); + } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_LEAK, posVenPressureP1, posVenPressureP2 ); + } + state = DRY_SELF_TESTS_STOPPED_STATE; } } return state; } + /*********************************************************************//** * @brief - * The handleDrySelfTestPressureArterialSetupState function handles the setup - * for the arterial pressure sensor dry self-test. - * @details \b Inputs: pressureSelfTestArterialStartTime + * The handleDrySelfTestPosArtPressureSetupState function monitors + * positive arterial pressure generation. + * @details \b Inputs: posArtSetupStartTime * @details \b Outputs: none - * @return the next state of dry self-tests state machine + * @return next Dry Self-Test state *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureSetupState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPosArtPressureSetupState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_POS_ART_PRESSURE_SETUP_STATE; + F32 art = getFilteredArterialPressure(); - if ( art <= ARTERIAL_PRESSURE_TARGET_MMHG ) + if ( art >= POS_ART_PRESSURE_TARGET_MMHG ) { - state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; + state = DRY_SELF_TESTS_POS_ART_STABILIZATION_STATE; } - else if ( TRUE == didTimeout( pressureSelfTestArterialStartTime, ARTERIAL_PRESSURE_TIMEOUT_MS ) ) + else if ( TRUE == didTimeout( posArtSetupStartTime, PRESSURE_BUILD_TIMEOUT_MS ) ) { SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURIZATION_TIMEOUT, art ); state = DRY_SELF_TESTS_STOPPED_STATE; @@ -706,73 +768,62 @@ return state; } + /*********************************************************************//** * @brief - * The handleDrySelfTestArterialPressureStabilizationState function monitors - * arterial pressure, verifies target pressure is reached, and records P1 - * after stabilization. - * @details \b Inputs: pressureSelfTestArterialStartTime, peakArterialPressure, - * arterialPressureStabilizationStartTime, arterialPressureBaselineCaptured, - * @details \b Outputs: peakArterialPressure, arterialPressureP1, - * arterialPressureLeakCheckStartTime, arterialPressureBaselineCaptured, - * arterialPressureStabilizationStartTime - * @return the next state of dry self-tests state machine + * The handleDrySelfTestPosArtStabilizationState function verifies + * positive arterial pressure after stabilization. + * @details \b Inputs: posArtStabilizationStartTime + * @details \b Outputs: posArtPressureP1 + * @return next Dry Self-Test state *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureStabilizationState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPosArtStabilizationState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_POS_ART_STABILIZATION_STATE; - if ( FALSE == arterialPressureBaselineCaptured ) + if ( TRUE == didTimeout( posArtStabilizationStartTime, PRESSURE_STABILIZATION_TIME_MS ) ) { - if ( TRUE == didTimeout( arterialPressureSettleStartTime, ARTERIAL_PRESSURE_SETTLE_TIME_MS ) ) - { - peakArterialPressure = getFilteredArterialPressure(); - arterialPressureStabilizationStartTime = getMSTimerCount(); - arterialPressureBaselineCaptured = TRUE; - } - } - else if ( TRUE == didTimeout( arterialPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) - { - F32 currentArterialPressure = getFilteredArterialPressure(); - F32 diff = fabs( peakArterialPressure - currentArterialPressure ); + F32 art = getFilteredArterialPressure(); - if ( diff <= ARTERIAL_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG ) + if ( art >= POS_ART_STABILIZED_PRESSURE_MMHG ) { - arterialPressureP1 = currentArterialPressure; - arterialPressureLeakCheckStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE; + posArtPressureP1 = art; + state = DRY_SELF_TESTS_POS_ART_DECAY_CHECK_STATE; } else { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_DECAY, diff ); + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_DECAY, art ); state = DRY_SELF_TESTS_STOPPED_STATE; } } return state; } + /*********************************************************************//** * @brief - * The handleDrySelfTestArterialPressureLeakCheckState function verifies - * arterial pressure leak by comparing P1 and P2. - * @details \b Inputs: arterialPressureLeakCheckStartTime, arterialPressureP1 - * @details \b Outputs: arterialPressureP2 - * @return the next state of dry self-tests state machine + * The handleDrySelfTestPosArtDecayCheckState function verifies positive + * arterial pressure decay. + * @details \b Inputs: posArtDecayStartTime, posArtPressureP1 + * @details \b Outputs: posArtPressureP2 + * @return next Dry Self-Test state *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureLeakCheckState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPosArtDecayCheckState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_POS_ART_DECAY_CHECK_STATE; - if ( TRUE == didTimeout( arterialPressureLeakCheckStartTime, ARTERIAL_PRESSURE_LEAK_CHECK_TIME_MS ) ) + if ( TRUE == didTimeout( posArtDecayStartTime, PRESSURE_DECAY_CHECK_TIME_MS ) ) { - arterialPressureP2 = getFilteredArterialPressure(); - F32 diff = fabs( arterialPressureP1 - arterialPressureP2 ); + F32 diff; - if ( diff <= ARTERIAL_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG ) + posArtPressureP2 = getFilteredArterialPressure(); + + diff = fabs( posArtPressureP1 - posArtPressureP2 ); + + if ( diff <= PRESSURE_DECAY_TOLERANCE_MMHG ) { - arterialPressureReliefStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE; + state = DRY_SELF_TESTS_PRESSURE_RELIEF_STATE; } else { @@ -784,32 +835,293 @@ return state; } + /*********************************************************************//** * @brief - * The handleDrySelfTestArterialPressureReliefState function relieves - * arterial pressure and verifies return to baseline. - * @details \b Inputs: arterialPressureReliefStartTime + * The handleDrySelfTestPressureReliefState function verifies arterial + * and venous pressure relief. + * @details \b Inputs: pressureReliefStartTime * @details \b Outputs: none - * @return the next state of dry self-tests state machine + * @return next Dry Self-Test state *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureReliefState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureReliefState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE; - F32 art = getFilteredArterialPressure(); + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_RELIEF_STATE; - if ( fabs( art ) <= ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG ) + if ( TRUE == didTimeout( pressureReliefStartTime, PRESSURE_RELIEF_CHECK_TIME_MS ) ) { - state = DRY_SELF_TESTS_COMPLETE_STATE; + F32 art = getFilteredArterialPressure(); + F32 ven = getFilteredVenousPressure(); + + if ( ( fabs( art ) <= PRESSURE_RELIEF_THRESHOLD_MMHG ) && ( fabs( ven ) <= PRESSURE_RELIEF_THRESHOLD_MMHG ) ) + { + state = DRY_SELF_TESTS_COMPLETE_STATE; + } + else + { + if ( fabs( art ) > PRESSURE_RELIEF_THRESHOLD_MMHG ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_RELIEF, art ); + } + else + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_RELIEF, ven ); + } + + state = DRY_SELF_TESTS_STOPPED_STATE; + } } - else if ( TRUE == didTimeout( arterialPressureReliefStartTime, PRESSURE_RELIEF_CHECK_TIME_MS ) ) - { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_RELIEF, art ); - state = DRY_SELF_TESTS_STOPPED_STATE; - } return state; } +///*********************************************************************//** +//* @brief +//* The handleDrySelfTestVenousPressureSetupState function handles the setup +//* for the venous pressure sensor dry self-test. +//* @details \b Inputs: venousSetupStartTime +//* @details \b Outputs: peakVenousPressure, venousPressureStabilizationStartTime +//* @return the next state of dry self-tests state machine +//*************************************************************************/ +//static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureSetupState( void ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE; +// F32 ven = getFilteredVenousPressure(); +// +// // If it reaches to traget venous pressure >= 250 mmHg then the transition to venous pressure stablization state +// if ( ven >= VENOUS_PRESSURE_TARGET_MMHG ) +// { +// peakVenousPressure = ven; +// venousPressureStabilizationStartTime = getMSTimerCount(); +// state = DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE; +// } +// // Time out alarm if it does not reach within 60 sec tolerance +// else if ( TRUE == didTimeout( venousSetupStartTime, VENOUS_PRESSURE_TIMEOUT_MS ) ) +// { +// SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURIZATION_TIMEOUT, ven ); +// state = DRY_SELF_TESTS_STOPPED_STATE; +// } +// +// return state; +//} +// +///*********************************************************************//** +// * @brief +// * The handleDrySelfTestVenousPressureStabilizationState function handles +// * venous pressure stabilization check. +// * @details \b Inputs: venousPressureStabilizationStartTime +// * @details \b Outputs: venousPressureP1, venousPressureLeakCheckStartTime +// * @return the next state of dry self-tests state machine +// *************************************************************************/ +//static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureStabilizationState( void ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE; +// +// if ( TRUE == didTimeout( venousPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) +// { +// venousPressureP1 = getFilteredVenousPressure(); +// venousPressureLeakCheckStartTime = getMSTimerCount(); +// state = DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE; +// } +// +// return state; +//} +// +///*********************************************************************//** +// * @brief +// * The handleDrySelfTestVenousPressureLeakCheckState function handles +// * venous pressure leak check. +// * @details \b Inputs: venousPressureLeakCheckStartTime, venousPressureP1 +// * @details \b Outputs: venousPressureP2, venousPressureReliefStartTime +// * @return the next state of dry self-tests state machine +// *************************************************************************/ +//static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureLeakCheckState( void ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE; +// +// if ( TRUE == didTimeout( venousPressureLeakCheckStartTime, VENOUS_PRESSURE_LEAK_CHECK_TIME_MS ) ) +// { +// F32 diff; +// +// venousPressureP2 = getFilteredVenousPressure(); +// diff = fabs( venousPressureP1 - venousPressureP2 ); +// +// if ( diff <= VENOUS_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG ) +// { +// venousPressureReliefStartTime = getMSTimerCount(); +// state = DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE; +// } +// else +// { +// SET_ALARM_WITH_2_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_LEAK, venousPressureP1, venousPressureP2 ); +// state = DRY_SELF_TESTS_STOPPED_STATE; +// } +// } +// +// return state; +//} +///*********************************************************************//** +// * @brief +// * The handleDrySelfTestVenousPressureReliefState function handles +// * venous pressure relief state. +// * @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 ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE; +// +// if ( TRUE == didTimeout( venousPressureReliefStartTime, PRESSURE_RELIEF_CHECK_TIME_MS ) ) +// { +// F32 ven = getFilteredVenousPressure(); +// +// if ( fabs( ven ) <= VENOUS_PRESSURE_RELIEF_THRESHOLD_MMHG ) +// { +// arterialSetupStartTime = getMSTimerCount(); +// state = DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE; +// } +// else +// { +// SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_RELIEF, ven ); +// state = DRY_SELF_TESTS_STOPPED_STATE; +// } +// } +// +// return state; +//} +// +///*********************************************************************//** +// * @brief +// * The handleDrySelfTestPressureArterialSetupState function handles the setup +// * for the arterial pressure sensor dry self-test. +// * @details \b Inputs: pressureSelfTestArterialStartTime +// * @details \b Outputs: none +// * @return the next state of dry self-tests state machine +// *************************************************************************/ +//static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureSetupState( void ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE; +// F32 art = getFilteredArterialPressure(); +// +// if ( art <= ARTERIAL_PRESSURE_TARGET_MMHG ) +// { +// state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; +// } +// else if ( TRUE == didTimeout( pressureSelfTestArterialStartTime, ARTERIAL_PRESSURE_TIMEOUT_MS ) ) +// { +// SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURIZATION_TIMEOUT, art ); +// state = DRY_SELF_TESTS_STOPPED_STATE; +// } +// +// return state; +//} +// +///*********************************************************************//** +// * @brief +// * The handleDrySelfTestArterialPressureStabilizationState function monitors +// * arterial pressure, verifies target pressure is reached, and records P1 +// * after stabilization. +// * @details \b Inputs: pressureSelfTestArterialStartTime, peakArterialPressure, +// * arterialPressureStabilizationStartTime, arterialPressureBaselineCaptured, +// * @details \b Outputs: peakArterialPressure, arterialPressureP1, +// * arterialPressureLeakCheckStartTime, arterialPressureBaselineCaptured, +// * arterialPressureStabilizationStartTime +// * @return the next state of dry self-tests state machine +// *************************************************************************/ +//static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureStabilizationState( void ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; +// +// if ( FALSE == arterialPressureBaselineCaptured ) +// { +// if ( TRUE == didTimeout( arterialPressureSettleStartTime, ARTERIAL_PRESSURE_SETTLE_TIME_MS ) ) +// { +// peakArterialPressure = getFilteredArterialPressure(); +// arterialPressureStabilizationStartTime = getMSTimerCount(); +// arterialPressureBaselineCaptured = TRUE; +// } +// } +// else if ( TRUE == didTimeout( arterialPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) +// { +// F32 currentArterialPressure = getFilteredArterialPressure(); +// F32 diff = fabs( peakArterialPressure - currentArterialPressure ); +// +// if ( diff <= ARTERIAL_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG ) +// { +// arterialPressureP1 = currentArterialPressure; +// arterialPressureLeakCheckStartTime = getMSTimerCount(); +// state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE; +// } +// else +// { +// SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_DECAY, diff ); +// state = DRY_SELF_TESTS_STOPPED_STATE; +// } +// } +// +// return state; +//} +// +///*********************************************************************//** +// * @brief +// * The handleDrySelfTestArterialPressureLeakCheckState function verifies +// * arterial pressure leak by comparing P1 and P2. +// * @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 ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE; +// +// if ( TRUE == didTimeout( arterialPressureLeakCheckStartTime, ARTERIAL_PRESSURE_LEAK_CHECK_TIME_MS ) ) +// { +// arterialPressureP2 = getFilteredArterialPressure(); +// F32 diff = fabs( arterialPressureP1 - arterialPressureP2 ); +// +// if ( diff <= ARTERIAL_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG ) +// { +// arterialPressureReliefStartTime = getMSTimerCount(); +// state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE; +// } +// else +// { +// SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_LEAK, diff ); +// state = DRY_SELF_TESTS_STOPPED_STATE; +// } +// } +// +// return state; +//} +// +///*********************************************************************//** +// * @brief +// * The handleDrySelfTestArterialPressureReliefState function relieves +// * arterial pressure and verifies return to baseline. +// * @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 ) +//{ +// DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE; +// F32 art = getFilteredArterialPressure(); +// +// if ( fabs( art ) <= ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG ) +// { +// state = DRY_SELF_TESTS_COMPLETE_STATE; +// } +// else if ( TRUE == didTimeout( arterialPressureReliefStartTime, PRESSURE_RELIEF_CHECK_TIME_MS ) ) +// { +// SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_RELIEF, art ); +// state = DRY_SELF_TESTS_STOPPED_STATE; +// } +// +// return state; +//} + + /*********************************************************************//** * @brief * The handleDrySelfTestStoppedState function handles the stopped dry self-tests @@ -977,130 +1289,128 @@ cmdBypassDialyzer( TRUE ); cmdChangeQd( targetDialysateFlowMLPM ); cmdChangeQuf( 0.0F ); + resetArtVenPressureOffsets(); pressureSelfTestPreNormalStartTime = getMSTimerCount(); tubingSetLeakChecksStarted = TRUE; } break; - case DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE: + + case DRY_SELF_TESTS_NEG_ART_POS_VEN_PRESSURE_SETUP_STATE: { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); + setH4Direction( MOTOR_DIR_FORWARD ); + setH4SetSpeed( PRESSURE_SELF_TEST_H4_SPEED_RPM ); + setH4Enabled( TRUE ); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + // H12 + H13 create positive venous pressure. setAirPumpState( AIR_PUMP_STATE_ON, AIR_PUMP_DUTY_CYCLE_MAX ); 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 ); - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE, 0 ); - venousSetupStartTime = getMSTimerCount(); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_NEG_ART_POS_VEN_PRESSURE_SETUP_STATE, 0 ); + negArtPosVenSetupStartTime = getMSTimerCount(); + } break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE: + case DRY_SELF_TESTS_NEG_ART_POS_VEN_STABILIZATION_STATE: { U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); 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 ); + negArtPosVenStabilizationStartTime = getMSTimerCount(); + } break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE: + case DRY_SELF_TESTS_NEG_ART_POS_VEN_DECAY_CHECK_STATE: { U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); cmdBypassDialyzer( TRUE ); - cmdChangeQd( targetDialysateFlowMLPM ); + cmdChangeQd(targetDialysateFlowMLPM ); cmdChangeQuf( 0.0F ); + negArtPosVenDecayStartTime = getMSTimerCount(); } break; - case DRY_SELF_TESTS_VENOUS_PRESSURE_RELIEF_STATE: + case DRY_SELF_TESTS_POS_ART_PRESSURE_SETUP_STATE: { U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - signalBloodPumpHardStop(); + setH4Direction( MOTOR_DIR_REVERSE ); + setH4SetSpeed( PRESSURE_SELF_TEST_H4_SPEED_RPM ); + setH4Enabled( TRUE ); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); - 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 ); setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); 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 ); - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE, 0 ); - pressureSelfTestArterialStartTime = getMSTimerCount(); + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT, (U32)DRY_SELF_TESTS_POS_ART_PRESSURE_SETUP_STATE, 0 ); + posArtSetupStartTime = getMSTimerCount(); + } break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE: + case DRY_SELF_TESTS_POS_ART_STABILIZATION_STATE: { - U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); 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 ); - arterialPressureSettleStartTime = getMSTimerCount(); - arterialPressureBaselineCaptured = FALSE; + posArtStabilizationStartTime = getMSTimerCount(); + } break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_LEAK_CHECK_STATE: + case DRY_SELF_TESTS_POS_ART_DECAY_CHECK_STATE: { U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); - setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); 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 ); + posArtDecayStartTime = getMSTimerCount(); + } break; - case DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE: + case DRY_SELF_TESTS_PRESSURE_RELIEF_STATE: { U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); @@ -1113,19 +1423,22 @@ cmdBypassDialyzer( TRUE ); cmdChangeQd( targetDialysateFlowMLPM ); cmdChangeQuf( 0.0F ); + pressureReliefStartTime = getMSTimerCount(); + } break; case DRY_SELF_TESTS_COMPLETE_STATE: signalBloodPumpHardStop(); setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); cmdChangeQuf( 0.0F ); break; case DRY_SELF_TESTS_STOPPED_STATE: signalBloodPumpHardStop(); setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); - // Set valves to stop set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT );