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 ); + } } /*********************************************************************//**