Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rb79c79bdbae63b4672f7222a859e01103e58c756 -r2a3b3e3864c423cc538aff9760989e419c1ab503 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision b79c79bdbae63b4672f7222a859e01103e58c756) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 2a3b3e3864c423cc538aff9760989e419c1ab503) @@ -41,9 +41,12 @@ #define PUMP_RUN_SELF_TEST_TIME_MS ( 15 * MS_PER_SECOND ) ///< Self-test time to run pumps in ms. #define PUMP_SELF_TEST_FLOW_RATE_ML_MIN 100 ///< Self-test pump flow rate in mL/min. -#define SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ( 3 * MS_PER_SECOND ) ///< Delay 3 seconds then check for syringe pump prime occlusion. +#define BLOOD_PUMP_PRESSURE_SELF_TEST_FLOW 100 +#define DIAL_IN_PUMP_PRESSURE_SELF_TEST_FLOW 350 +#define SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ( 1 * MS_PER_SECOND ) ///< Delay 3 seconds then check for syringe pump prime occlusion. #define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 12 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. +#define DIAL_IN_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 20 * MS_PER_SECOND ) #define DECAY_PRESSURE_SELF_TEST_TIME ( 4 * MS_PER_SECOND ) ///< time to wait for pressure to decay in ms. #define STABILTY_PRESSURE_SELF_TEST_TIME ( 5 * MS_PER_SECOND ) ///< Time to wait for pressure to stabilize in ms. #define NORMALIZED_PRESSURE_SELF_TEST_TIME ( 4 * MS_PER_SECOND ) ///< Time to wait for pressure to normalize in ms. @@ -54,7 +57,8 @@ #define VENOUS_STABILITY_PRESSURE_DIFF_TOLERANCE_MMHG 5.0F ///< Difference in venous pressure readings while in a stable pressured state (in mmHg). #define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG -200.0F ///< Arterial pressure low limit after running blood pump. -#define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG 80.0F ///< Venous pressure high limit after running blood pump. +#define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG 200.0F ///< Venous pressure high limit after running blood pump. +#define VENOUS_PRESSURE_SELF_TEST_FIRST_PASS_LIMIT_MMHG 160.0F ///< Venous pressure high limit after running dpi in first test. #define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 10.0F ///< Difference in pressure readings after return to normal state tolerance (in mmHg). @@ -90,6 +94,7 @@ static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of the dry self-tests state machine. static U32 pressureSelfTestBloodPumpRunStartTime; ///< Pressure dry self-test blood pump runs start time. +static U32 pressureSelfTestDialInPumpRunStartTime; static U32 pressureSelfTestNormalizedStartTime; ///< Normalized pressure dry self-test start time. static U32 pressureSelfTestDecayStartTime; ///< Decay pressure dry self-test start time. static U32 pressureSelfTestStabilityStartTime; ///< Stability pressure dry self-test start time. @@ -131,8 +136,11 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsArterialSetupState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsArterialState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsDecayState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsStabilityState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( void ); @@ -438,23 +446,35 @@ case DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE: if ( SELF_TEST_STATUS_PASSED == execPresOcclDryTest() ) { - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_OPEN ); - currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE; + currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE; } break; - case DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE: - currentDrySelfTestsState = handleDrySelfTestPressureSensorsSetupState(); + case DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE: + currentDrySelfTestsState = handleDrySelfTestPressureSensorsNormalSetupState(); break; - case DRY_SELF_TESTS_PRESSURE_SENSORS_PRESSURIZED_STATE: - currentDrySelfTestsState = handleDrySelfTestPressureSensorsState(); + case DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS_SETUP_STATE: + currentDrySelfTestsState = handleDrySelfTestPressureSensorsVenousSetupState(); break; + case DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS: + currentDrySelfTestsState = handleDrySelfTestPressureSensorsVenousState(); + break; + + case DRY_SELF_TESTS_PRESSURE_SENSORS_ARTERIAL_SETUP_STATE: + currentDrySelfTestsState = handleDrySelfTestPressureSensorsArterialSetupState(); + break; + + case DRY_SELF_TESTS_PRESSURE_SENSORS_ARTERIAL: + currentDrySelfTestsState = handleDrySelfTestPressureSensorsArterialState(); + break; + case DRY_SELF_TESTS_PRESSURE_SENSORS_DECAY_STATE: currentDrySelfTestsState = handleDrySelfTestPressureSensorsDecayState(); break; @@ -873,7 +893,7 @@ if (( STATE_CLOSED == frontDoor ) && (STATE_CLOSED == pumpTrack ) ) { state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); @@ -932,9 +952,9 @@ * @details Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalSetupState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_PRESSURIZED_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS_SETUP_STATE; if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -951,13 +971,104 @@ { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, previousNormalArterialPressure, previousNormalVenousPressure ); } + } + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestPressureSensorsVenousSetupState function handles the setup + * for the venous pressure sensor dry self-test. + * @details Inputs: none + * @details Outputs: pressureSelfTestDialInPumpRunStartTime + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousSetupState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS; + + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = DRY_SELF_TESTS_STOPPED_STATE; + setupForSelfTestsStop(); + } + + else + { setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_B_OPEN ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_CLOSED ); - setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( DIAL_IN_PUMP_PRESSURE_SELF_TEST_FLOW, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + pressureSelfTestDialInPumpRunStartTime = getMSTimerCount(); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestPressureSensorsVenousState function tests the readings of + * the venous pressure sensor and verify they are in correct range. + * @details Inputs: pressureSelfTestDialInPumpRunStartTime + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_VENOUS; + F32 const venousPressure = getFilteredVenousPressure(); + + // End the test when reaching target pressure or time out + if ( ( TRUE == didTimeout( pressureSelfTestDialInPumpRunStartTime, DIAL_IN_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) || + ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) + { + signalDialInPumpHardStop(); + state = DRY_SELF_TESTS_PRESSURE_SENSORS_ARTERIAL_SETUP_STATE; + } + + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, venousPressure, VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG ); + } + + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = DRY_SELF_TESTS_STOPPED_STATE; + setupForSelfTestsStop(); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestPressureSensorsArterialSetupState function handles the setup + * for the arterial pressure sensor dry self-test. + * @details Inputs: + * @details Outputs: pressureSelfTestBloodPumpRunStartTime + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsArterialSetupState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_ARTERIAL; + + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = DRY_SELF_TESTS_STOPPED_STATE; + setupForSelfTestsStop(); + } + + else + { + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_B_OPEN ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_CLOSED ); + setBloodPumpTargetFlowRate( BLOOD_PUMP_PRESSURE_SELF_TEST_FLOW, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); pressureSelfTestBloodPumpRunStartTime = getMSTimerCount(); } @@ -966,39 +1077,35 @@ /*********************************************************************//** * @brief - * The handleDrySelfTestPressureSensorsState function tests the readings of - * pressure sensors and verify they are in correct range. - * @details Inputs: peakArterialPressure, peakVenousPressure, + * The handleDrySelfTestPressureSensorsArterialState function tests the readings of + * the arterial pressure sensor and verify they are in correct range. + * @details Inputs: pressureSelfTestBloodPumpRunStartTime + * @details Outputs: peakVenousPressure, peakArterialPressure, * pressureSelfTestDecayStartTime - * @details Outputs: peakArterialPressure, peakVenousPressure, - * pressureSelfTestDecayStartTime * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsArterialState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_PRESSURIZED_STATE; + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_ARTERIAL; F32 const arterialPressure = getFilteredArterialPressure(); F32 const venousPressure = getFilteredVenousPressure(); // End the test when reaching target pressure or time out - if ( TRUE == didTimeout( pressureSelfTestBloodPumpRunStartTime, BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) + if ( ( TRUE == didTimeout( pressureSelfTestBloodPumpRunStartTime, BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) || + ( ( ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG >= arterialPressure ) && ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) ) { - peakArterialPressure = arterialPressure; peakVenousPressure = venousPressure; - + peakArterialPressure = arterialPressure; signalBloodPumpHardStop(); - // Test pass when reading positive arterial pressure and negative venous pressure - if ( ( ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG >= arterialPressure ) && ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) - { - pressureSelfTestDecayStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_PRESSURE_SENSORS_DECAY_STATE; - } - else - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, arterialPressure, venousPressure ); - } + pressureSelfTestDecayStartTime = getMSTimerCount(); + state = DRY_SELF_TESTS_PRESSURE_SENSORS_DECAY_STATE; } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, venousPressure, arterialPressure ); + } + if ( TRUE == doesAlarmStatusIndicateStop() ) { state = DRY_SELF_TESTS_STOPPED_STATE; @@ -1007,7 +1114,6 @@ return state; } - /*********************************************************************//** * @brief * The handleDrySelfTestPressureSensorsDecayState function verifies