Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rc965df576088a9b2eb23d826f8f7e9f03d1bc962 -r1662b3ac21c7d19e218efbe44a25285778e8ea2b --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c965df576088a9b2eb23d826f8f7e9f03d1bc962) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 1662b3ac21c7d19e218efbe44a25285778e8ea2b) @@ -385,6 +385,11 @@ state = HD_PRE_TREATMENT_CART_INSTALL_STATE; } + if ( ( TRUE == isAlarmActive( ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY ) ) || ( TRUE == isAlarmActive( ALARM_ID_INSTALL_NEW_CARTRIDGE ) ) ) + { + state = HD_PRE_TREATMENT_CART_INSTALL_STATE; + } + if ( TRUE == isDrySelfTestsPassed() ) { transitionToPrime(); Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rd52b27c2797b07f6aba2e05c8ba24156b820fdbc -r1662b3ac21c7d19e218efbe44a25285778e8ea2b --- firmware/App/Modes/Prime.c (.../Prime.c) (revision d52b27c2797b07f6aba2e05c8ba24156b820fdbc) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 1662b3ac21c7d19e218efbe44a25285778e8ea2b) @@ -648,6 +648,7 @@ { if ( TRUE == didTimeout( loadcellSteadyVolumeStartTime, MIN_LOAD_CELL_STEADY_VOLUME_TIME ) ) { + transitionToWetSelfTests(); state = HD_PRIME_WET_SELF_TESTS_STATE; } } Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r6417c75d0c2a9643bcdb797065dbcde59e1dc734 -r1662b3ac21c7d19e218efbe44a25285778e8ea2b --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 6417c75d0c2a9643bcdb797065dbcde59e1dc734) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 1662b3ac21c7d19e218efbe44a25285778e8ea2b) @@ -38,6 +38,13 @@ #define BLOOD_LEAK_SELF_TEST_SET 0x1 ///< Initiate blood leak self-test. #define BLOOD_LEAK_NORMAL_OPERATION 0x0 ///< Return blood leak to normal operation. +#define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 5 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. + +#define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT -50.0 ///< Arterial pressure low limit after running blood pump. +#define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT 400 ///< Venous pressure high limit after running blood pump. + +#define NORMAL_PRESSURE_DIFF_TOLERANCE 5 ///< Difference in pressure readings after return to normal state tolerance (in mmHg). + /// No cartridge self-tests state machine. typedef enum No_Cart_Self_Tests_State { @@ -61,9 +68,12 @@ typedef enum Dry_Self_Tests_state { DRY_SELF_TESTS_START_STATE = 0, ///< Dry self-tests starting state. - DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE, ///< Bubble detectors dry self-tests state. - DRY_SELF_TESTS_AIR_TRAP_STATE, ///< Air trap fill level ultrasonic sensor dry self-tests state. - DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< Occlusion sensors dry self-tests state. + DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE, ///< Bubble detectors dry self-test state. + DRY_SELF_TESTS_AIR_TRAP_STATE, ///< Air trap fill level ultrasonic sensor dry self-test state. + DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< Occlusion sensors dry self-test state. + DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE, ///< Pressure sensors dry self-test setup valves and pump state. + DRY_SELF_TESTS_PRESSURE_SENSORS_STATE, ///< Pressure sensors verify pressure readings state. + DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE, ///< Preassure sensors verify normal pressure readings state. DRY_SELF_TESTS_COMPLETE, ///< Dry self-test complete state. NUM_OF_DRY_SELF_TESTS_STATES ///< Number of dry self-tests states. } DRY_SELF_TESTS_STATE_T; @@ -86,6 +96,9 @@ static BOOL drySelfTestsResult; ///< Result of dry self-tests. 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 F32 previousNormalArterialPressure; ///< Holds the previous normal arterial pressure reading. +static F32 previousNormalVenousPressure; ///< Holds the previous normal venous pressure reading. static BOOL wetSelfTestsResult; ///< Result of wet self-tests. static WET_SELF_TESTS_STATE_T currentWetSelfTestsState; ///< Current state of the wet self-tests state machine. @@ -269,6 +282,8 @@ *************************************************************************/ void execDrySelfTests( void ) { + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; + // execute dry self-tests state machine switch ( currentDrySelfTestsState ) { @@ -310,7 +325,7 @@ if ( SELF_TEST_STATUS_PASSED == result ) { - currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE; + currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE; } else { @@ -319,6 +334,58 @@ } break; + case DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE: + previousNormalArterialPressure = getMeasuredArterialPressure(); + previousNormalVenousPressure = getMeasuredVenousPressure(); + + 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( PUMP_SELF_TEST_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + pressureSelfTestBloodPumpRunStartTime = getMSTimerCount(); + + currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_STATE; + break; + + case DRY_SELF_TESTS_PRESSURE_SENSORS_STATE: + { + F32 const arterialPressure = getMeasuredArterialPressure(); + F32 const venousPressure = getMeasuredVenousPressure(); + if ( ( TRUE == didTimeout( pressureSelfTestBloodPumpRunStartTime, BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) || + ( ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT >= arterialPressure ) || ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT <= venousPressure ) ) + { + if ( ( arterialPressure < 0) && ( venousPressure > 0 ) ) + { + setValvePosition( VBV, VALVE_POSITION_B_OPEN ); + setValveAirTrap( STATE_CLOSED ); + currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; + } + else + { + result = SELF_TEST_STATUS_FAILED; + } + } + } + break; + + case DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE: + { + F32 const arterialPressureDiff = fabs( getMeasuredArterialPressure() - previousNormalArterialPressure); + F32 const venousPressureDiff = fabs( getMeasuredVenousPressure() - previousNormalVenousPressure); + + if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE ) ) + { + currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE; + } + else + { + result = SELF_TEST_STATUS_FAILED; + } + } + break; + case DRY_SELF_TESTS_COMPLETE: drySelfTestsResult = TRUE; break; @@ -328,6 +395,11 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_DRY_SELF_TEST_STATE, (U32)currentDrySelfTestsState ); break; } + + if ( SELF_TEST_STATUS_FAILED == result ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_SELF_TEST_FAILURE, currentDrySelfTestsState ); + } } /*********************************************************************//**