Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rc05775820109b5e83596c58a3b4248ac6cdb1d65 -r1240b612f790f931825aba86ec37f37eccce9336 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision c05775820109b5e83596c58a3b4248ac6cdb1d65) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 1240b612f790f931825aba86ec37f37eccce9336) @@ -17,6 +17,8 @@ #include "AirTrap.h" #include "BloodFlow.h" +#include "BloodLeak.h" +#include "Bubble.h" #include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" @@ -40,9 +42,6 @@ #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 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 NORMALIZED_PRESSURE_SELF_TEST_TIME ( 2 * MS_PER_SECOND ) ///< Time to wait for pressure to normalize in ms. @@ -76,7 +75,9 @@ { WET_SELF_TESTS_START_STATE = 0, ///< Wet self-tests starting state. WET_SELF_TESTS_SETUP_STATE, ///< Setup reservoirs for wet self-tests. + WET_SELF_TESTS_BUBBLES_STATE, ///< Wet self-test air bubble detectors state. WET_SELF_TESTS_PRIME_CHECK_STATE, ///< Prime check wet self-tests state, checks for primed patient lines. + WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE, ///< Blood leak detector self-test state. WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE, ///< Setup valve and start dialysate pump for first displacement. WET_SELF_TESTS_FIRST_DISPLACEMENT_STATE, ///< Fill reservoir 2 with 100 mL of dialysate from reservoir 1 state. WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE, ///< After first displacement completed verify state. @@ -138,7 +139,9 @@ static WET_SELF_TESTS_STATE_T handleWetSelfTestStartState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestSetupState( void ); +static WET_SELF_TESTS_STATE_T handleWetSelfTestBubblesState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( SELF_TEST_STATUS_T *result ); +static WET_SELF_TESTS_STATE_T handleWetSelfTestBloodLeakDetectorState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementSetupState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementVerifyState( SELF_TEST_STATUS_T *result ); @@ -261,9 +264,6 @@ case NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE: execDialInFlowTest(); - - // TODO: Use appropriate sensor driver - setFPGASensorTest( BLOOD_LEAK_SELF_TEST_SET ); currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; break; @@ -494,10 +494,18 @@ currentWetSelfTestsState = handleWetSelfTestSetupState(); break; + case WET_SELF_TESTS_BUBBLES_STATE: + currentWetSelfTestsState = handleWetSelfTestBubblesState(); + break; + case WET_SELF_TESTS_PRIME_CHECK_STATE: currentWetSelfTestsState = handleWetSelfTestPrimeCheckState( &result ); break; + case WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE: + currentWetSelfTestsState = handleWetSelfTestBloodLeakDetectorState(); + break; + case WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE: currentWetSelfTestsState = handleWetSelfTestFirstDisplacementSetupState(); break; @@ -778,11 +786,10 @@ { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; - // TODO: Use appropriate sensor driver - BOOL const isADADetectedAir = getFPGAArterialAirBubbleStatus(); - BOOL const isADVDetectedAir = getFPGAVenousAirBubbleStatus(); + BUBBLE_STATUS_T const ADABubbleStatus = getBubbleStatus( ADA ); + BUBBLE_STATUS_T const ADVBubbleStatus = getBubbleStatus( ADV ); - if ( ( TRUE == isADADetectedAir ) && ( TRUE == isADVDetectedAir ) && + if ( ( BUBBLE_DETECTED == ADABubbleStatus ) && ( BUBBLE_DETECTED == ADVBubbleStatus ) && ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) { @@ -1056,6 +1063,34 @@ if ( setupDisplacementVolume <= 0 ) { signalDialInPumpHardStop(); + selfTestBubble( ADA ); + selfTestBubble( ADV ); + state = WET_SELF_TESTS_BUBBLES_STATE; + } + + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = WET_SELF_TESTS_STOPPED_STATE; + setupForSelfTestsStop(); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleWetSelfTestBubblesState function waiting for air bubble detectors + * self-tests to finish. + * @details Inputs: bubbleSelfTestStatus + * @details Outputs: none + * @return the next state of wet self-tests state machine + *************************************************************************/ +static WET_SELF_TESTS_STATE_T handleWetSelfTestBubblesState( void ) +{ + WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_BUBBLES_STATE; + + if ( ( SELF_TEST_STATUS_PASSED == getBubbleSelfTestStatus( ADA ) ) && ( SELF_TEST_STATUS_PASSED == getBubbleSelfTestStatus( ADV ) ) ) + { state = WET_SELF_TESTS_PRIME_CHECK_STATE; } @@ -1082,17 +1117,43 @@ WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_PRIME_CHECK_STATE; *result = SELF_TEST_STATUS_FAILED; - // TODO: Use appropriate sensor driver - BOOL const isADADetectedAir = getFPGAArterialAirBubbleStatus(); - BOOL const isADVDetectedAir = getFPGAVenousAirBubbleStatus(); + BUBBLE_STATUS_T const ADABubbleStatus = getBubbleStatus( ADA ); + BUBBLE_STATUS_T const ADVBubbleStatus = getBubbleStatus( ADV ); #ifndef SKIP_AIR_BUBBLE_CHECK - if ( ( FALSE == isADADetectedAir ) && ( FALSE == isADVDetectedAir ) ) + if ( ( BUBBLE_NOT_DETECTED == ADABubbleStatus ) && ( BUBBLE_NOT_DETECTED == ADVBubbleStatus ) ) #endif { + zeroBloodLeak(); + state = WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE; + *result = SELF_TEST_STATUS_PASSED; + } + + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = WET_SELF_TESTS_STOPPED_STATE; + setupForSelfTestsStop(); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleWetSelfTestBloodLeakDetectorState function handles zeroing and + * self-test for blood leak detector. + * @details Inputs: none + * @details Outputs: next self-test state + * @return the next state of wet self-tests state machine + *************************************************************************/ +static WET_SELF_TESTS_STATE_T handleWetSelfTestBloodLeakDetectorState( void ) +{ + WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE; + + if ( SELF_TEST_STATUS_PASSED == getBloodLeakSelfTestStatus() ) + { settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE; - *result = SELF_TEST_STATUS_PASSED; } if ( TRUE == doesAlarmStatusIndicateStop() )