Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rb7764e26a3460652da29b1f957706dfaca413226 -re25708d560989de50b01aa38bba81ea2b5794645 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision b7764e26a3460652da29b1f957706dfaca413226) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision e25708d560989de50b01aa38bba81ea2b5794645) @@ -18,6 +18,7 @@ #include "AirTrap.h" #include "BloodFlow.h" #include "BloodLeak.h" +#include "Bubble.h" #include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" @@ -74,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. @@ -120,7 +123,6 @@ static void setupForSelfTestsStop( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ); -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeSyringePumpState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ); @@ -137,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 ); @@ -260,15 +264,9 @@ case NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE: execDialInFlowTest(); - - zeroBloodLeak(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; break; - case NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE: - currentNoCartSelfTestsState = handleNoCartSelfTestLeakDetectorsState(); - break; - case NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE: // TODO: Implement self tests currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_STATE; @@ -504,10 +502,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; @@ -600,31 +606,6 @@ /*********************************************************************//** * @brief - * The handleNoCartSelfTestLeakDetectorsState function verifies leak detectors status. - * @details Inputs: none - * @details Outputs: none - * @return the next state of no cartridge self-tests state machine - *************************************************************************/ -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( void ) -{ - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; - - if ( SELF_TEST_STATUS_PASSED == getBloodLeakSelfTestStatus() ) - { - state = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; - } - - if ( TRUE == doesAlarmStatusIndicateStop() ) - { - setupForSelfTestsStop(); - state = NO_CART_SELF_TESTS_STOPPED_STATE; - } - - return state; -} - -/*********************************************************************//** - * @brief * The handleNoCartSelfTestHomeValvesState function starts homing process for * all the valves. * @details Inputs: none @@ -813,11 +794,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 ) ) ) { @@ -1091,6 +1071,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; } @@ -1117,17 +1125,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() )