Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r62200ed6423dfd6ff7881bd0fc308162384e663e -r1240b612f790f931825aba86ec37f37eccce9336 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 62200ed6423dfd6ff7881bd0fc308162384e663e) +++ 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. @@ -122,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 ); @@ -139,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 ); @@ -213,10 +215,10 @@ void transitionToNoCartSelfTests( void ) { F32 const bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); #ifndef DISABLE_SYRINGE_PUMP - useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ); + useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ? TRUE : FALSE ); #else useHeparin = FALSE; #endif @@ -262,16 +264,9 @@ 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_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; @@ -342,14 +337,6 @@ *************************************************************************/ void transitionToDrySelfTests() { - F32 const bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - -#ifndef DISABLE_SYRINGE_PUMP - useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ); -#else - useHeparin = FALSE; -#endif currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; pressureSelfTestBloodPumpRunStartTime = 0; pressureSelfTestNormalizedStartTime = 0; @@ -507,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; @@ -603,39 +598,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; - // TODO: Use appropriate sensor driver - BOOL const bloodLeakDetector = getFPGABloodLeakDetectorStatus(); - - if ( TRUE == bloodLeakDetector ) - { - // TODO: Use appropriate sensor driver - setFPGASensorTest( BLOOD_LEAK_NORMAL_OPERATION ); - state = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; - } - else - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BLOOD_LEAK_SELF_TEST_FAILURE, (U32)bloodLeakDetector ); - } - - 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 @@ -674,7 +636,7 @@ if ( TRUE == useHeparin ) { - if ( ( FALSE == isSyringePumpHome() ) && ( TRUE == isSyringePumpStopped() ) ) + if ( TRUE == isSyringePumpStopped() ) { retractSyringePump(); } @@ -824,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 ) ) ) { @@ -1102,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; } @@ -1128,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() )