Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rae7ff6466ac1225cb5998990cc5163edc53ce003 -rb70bf4c5a7cdb4218d812546b3bc5d7dad152700 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision ae7ff6466ac1225cb5998990cc5163edc53ce003) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision b70bf4c5a7cdb4218d812546b3bc5d7dad152700) @@ -492,7 +492,7 @@ if ( SAMPLE_WATER_COMPLETE_STATE == getSampleWaterState() ) #endif { - if ( TRUE == getSampleWaterResult() ) + if ( SELF_TEST_STATUS_PASSED == getSampleWaterResult() ) { if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) { Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r30f049651877229042e3f8700c8596e5b9a1e0f4 -rb70bf4c5a7cdb4218d812546b3bc5d7dad152700 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 30f049651877229042e3f8700c8596e5b9a1e0f4) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision b70bf4c5a7cdb4218d812546b3bc5d7dad152700) @@ -37,7 +37,7 @@ // ********** private data ********** -#define BROADCAST_HD_OP_MODE_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< HD operation mode broadcast interval (in task interval/sec). +#define BROADCAST_HD_OP_MODE_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< HD operation mode broadcast interval (in task interval/sec). // ********** private data ********** Index: firmware/App/Modes/SampleWater.c =================================================================== diff -u -rae7ff6466ac1225cb5998990cc5163edc53ce003 -rb70bf4c5a7cdb4218d812546b3bc5d7dad152700 --- firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision ae7ff6466ac1225cb5998990cc5163edc53ce003) +++ firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision b70bf4c5a7cdb4218d812546b3bc5d7dad152700) @@ -116,13 +116,22 @@ /*********************************************************************//** * @brief * The getSampleWaterResult function returns the result from sample water testing. - * @details Inputs: sampleWaterPassed + * @details Inputs: sampleWaterResult * @details Outputs: none - * @return TRUE if sample water result passed, otherwise FALSE + * @return water sample self-test status *************************************************************************/ -BOOL getSampleWaterResult( void ) +SELF_TEST_STATUS_T getSampleWaterResult( void ) { - return sampleWaterResult; + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_FAILED; + +#ifndef SKIP_SAMPLE_WATER + if ( TRUE == sampleWaterResult ) +#endif + { + result = SELF_TEST_STATUS_PASSED; + } + + return result; } /*********************************************************************//** Index: firmware/App/Modes/SampleWater.h =================================================================== diff -u -rae7ff6466ac1225cb5998990cc5163edc53ce003 -rb70bf4c5a7cdb4218d812546b3bc5d7dad152700 --- firmware/App/Modes/SampleWater.h (.../SampleWater.h) (revision ae7ff6466ac1225cb5998990cc5163edc53ce003) +++ firmware/App/Modes/SampleWater.h (.../SampleWater.h) (revision b70bf4c5a7cdb4218d812546b3bc5d7dad152700) @@ -38,7 +38,7 @@ void execSampleWater( void ); U32 getSampleWaterState( void ); -BOOL getSampleWaterResult( void ); +SELF_TEST_STATUS_T getSampleWaterResult( void ); void signalSampleWaterUserAction( REQUESTED_SAMPLE_WATER_USER_ACTIONS_T action ); // from user void setSampleWaterResult( BOOL result ); // from user Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r809d8fc395e63afc52a13fc30087d2cf50ad4d9a -rb70bf4c5a7cdb4218d812546b3bc5d7dad152700 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 809d8fc395e63afc52a13fc30087d2cf50ad4d9a) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision b70bf4c5a7cdb4218d812546b3bc5d7dad152700) @@ -41,20 +41,21 @@ #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. #define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG -50.0 ///< Arterial pressure low limit after running blood pump. #define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG 400 ///< Venous pressure high limit after running blood pump. -#define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 5 ///< Difference in pressure readings after return to normal state tolerance (in mmHg). +#define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 5.0 ///< Difference in pressure readings after return to normal state tolerance (in mmHg). #define DIP_FLOW_RATE_SETUP_ML_MIN 100 ///< Dialysate inlet pump flow rate during the setup for wet self-test. #define DIP_FLOW_RATE_FIRST_DISPLACEMENT_ML_MIN 100 ///< Dialysate inlet pump flow rate during the first displacement in wet self-test. #define DIP_FLOW_RATE_SECOND_DISPLACEMENT_ML_MIN 600 ///< Dialysate inlet pump flow rate during the second displacement in wet self-test. -#define WET_SELF_TEST_RESERVOIR_ONE_SETUP_VOLUME_ML 1200 ///< Setup volume for reservoir one before wet self-test in ml. -#define WET_SELF_TEST_FIRST_DISPLACEMENT_TARGET_VOLUME_ML 100 ///< Target of first displacement volume in ml. -#define WET_SELF_TEST_SECOND_DISPLACEMENT_TARGET_VOLUME_ML 600 ///< Target of second displacement volume in ml. -#define WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE 5 ///< Tolerance on integrated volume in percentage. +#define WET_SELF_TEST_RESERVOIR_ONE_SETUP_VOLUME_ML 1200.0 ///< Setup volume for reservoir one before wet self-test in ml. +#define WET_SELF_TEST_FIRST_DISPLACEMENT_TARGET_VOLUME_ML 100.0 ///< Target of first displacement volume in ml. +#define WET_SELF_TEST_SECOND_DISPLACEMENT_TARGET_VOLUME_ML 600.0 ///< Target of second displacement volume in ml. +#define WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE 5.0 ///< Tolerance on integrated volume in percentage. #define WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G 1.5 ///< Tolerance in the load cell readings of the displacement in grams. #define WET_SELF_TEST_DISPLACEMENT_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Time to displace dialysate in wet self-test in ms. #define RESERVOIR_SETTLE_TIME_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time allotted for reservoir to settle in ms. @@ -67,7 +68,7 @@ { 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_BUBBLE_DETECTOR_STATE, ///< Bubble detectors wet self-tests state. + WET_SELF_TESTS_PRIME_CHECK_STATE, ///< Prime check wet self-tests state, checks for primed patient lines. 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. @@ -84,11 +85,12 @@ static BOOL noCartSelfTestsResult; ///< Result of no cartridge self-tests. static NO_CART_SELF_TESTS_STATE_T currentNoCartSelfTestsState; ///< Current state of the no cartridge self-tests state machine. static U32 runPumpStartTime; ///< Beginning time when pumps start running -static BOOL hasPumpsStarted; ///< Flag indicates pumps have started running for self-test. +static BOOL havePumpsStarted; ///< Flag indicates pumps have started running for self-test. 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 U32 pressureSelfTestNormalizedStartTime; ///< Normalized pressure dry self-test start time. static F32 previousNormalArterialPressure; ///< Holds the previous normal arterial pressure reading. static F32 previousNormalVenousPressure; ///< Holds the previous normal venous pressure reading. @@ -112,14 +114,13 @@ static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( SELF_TEST_STATUS_T *result ); -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestDoorSwitchState( void ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStartHomingState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStoppedState( void ); static void handleDrySelfTestsStopRequest( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ); @@ -128,7 +129,7 @@ static void handleWetSelfTestsStopRequest( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestStartState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestSetupState( void ); -static WET_SELF_TESTS_STATE_T handleWetSelfTestBubbleDetectorsState( SELF_TEST_STATUS_T *result ); +static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( SELF_TEST_STATUS_T *result ); 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 ); @@ -201,7 +202,7 @@ noCartSelfTestsResult = FALSE; currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; runPumpStartTime = 0; - hasPumpsStarted = FALSE; + havePumpsStarted = FALSE; resetSelfTestsFlags(); } @@ -266,11 +267,11 @@ case NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE: // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DOOR_SWITCH_STATE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_HOMING_STATE; break; - case NO_CART_SELF_TESTS_DOOR_SWITCH_STATE: - currentNoCartSelfTestsState = handleNoCartSelfTestDoorSwitchState(); + case NO_CART_SELF_TESTS_START_HOMING_STATE: + currentNoCartSelfTestsState = handleNoCartSelfTestStartHomingState(); break; case NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE: @@ -341,6 +342,7 @@ drySelfTestsResult = FALSE; currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; pressureSelfTestBloodPumpRunStartTime = 0; + pressureSelfTestNormalizedStartTime = 0; previousNormalArterialPressure = 0.0; previousNormalVenousPressure = 0.0; @@ -373,17 +375,18 @@ currentDrySelfTestsState = handleDrySelfTestWaitForDoorCloseState(); break; - case DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE: - currentDrySelfTestsState = handleDrySelfTestBubbleDetectorsState(); + case DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE: + currentDrySelfTestsState = handleDrySelfTestUsedCartridgeCheckState(); break; - case DRY_SELF_TESTS_AIR_TRAP_STATE: - currentDrySelfTestsState = handleDrySelfTestAirTrapState(); - break; - case DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE: if ( SELF_TEST_STATUS_PASSED == execPresOcclDryTest() ) { + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_OPEN ); currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE; } break; @@ -493,8 +496,8 @@ currentWetSelfTestsState = handleWetSelfTestSetupState(); break; - case WET_SELF_TESTS_BUBBLE_DETECTOR_STATE: - currentWetSelfTestsState = handleWetSelfTestBubbleDetectorsState( &result ); + case WET_SELF_TESTS_PRIME_CHECK_STATE: + currentWetSelfTestsState = handleWetSelfTestPrimeCheckState( &result ); break; case WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE: @@ -593,6 +596,7 @@ signalDialInPumpHardStop(); signalDialOutPumpHardStop(); + // TODO: Use appropriate sensor driver if ( STATE_CLOSED == getFPGADoorState() ) { state = NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE; @@ -613,9 +617,9 @@ { NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_PUMPS_STATE; - if ( FALSE == hasPumpsStarted ) + if ( FALSE == havePumpsStarted ) { - hasPumpsStarted = TRUE; + havePumpsStarted = TRUE; setBloodPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); @@ -629,6 +633,7 @@ signalDialInPumpHardStop(); signalDialOutPumpHardStop(); + // TODO: Use appropriate sensor driver setFPGASensorTest( BLOOD_LEAK_SELF_TEST_SET ); state = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; } @@ -650,6 +655,7 @@ if ( TRUE == getFPGABloodLeakDetectorStatus() ) { + // TODO: Use appropriate sensor driver setFPGASensorTest( BLOOD_LEAK_NORMAL_OPERATION ); state = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; } @@ -663,17 +669,16 @@ /*********************************************************************//** * @brief - * The handleNoCartSelfTestDoorSwitchState function executes door switch self-test. + * The handleNoCartSelfTestStartHomingState function start homing process for + * all the valves and pumps. * @details Inputs: none - * @details Outputs: none + * @details Outputs: Valves and pumps started homing * @return the next state of no cartridge self-tests state machine *************************************************************************/ -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestDoorSwitchState( void ) +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStartHomingState( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_DOOR_SWITCH_STATE; VALVE_T valve; - // TODO implement door switch self-test for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) { homeValve( valve ); @@ -683,9 +688,7 @@ homeDialInPump(); homeDialOutPump(); - state = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; - - return state; + return NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; } /*********************************************************************//** @@ -723,6 +726,7 @@ if ( TRUE == selfTestsResumeRequested ) { selfTestsResumeRequested = FALSE; + havePumpsStarted = TRUE; state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; } @@ -749,8 +753,8 @@ /*********************************************************************//** * @brief - * The handleDrySelfTestWaitForDoorCloseState function verify no fluid is detected - * by bubble detectors. + * The handleDrySelfTestWaitForDoorCloseState function makes sure door is + * closed before starting self-tests. * @details Inputs: none * @details Outputs: none * @return the next state of dry self-tests state machine @@ -759,54 +763,33 @@ { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + // TODO: Use appropriate sensor driver if ( STATE_CLOSED == getFPGADoorState() ) { - state = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; } return state; } /*********************************************************************//** * @brief - * The handleDrySelfTestBubbleDetectorsState function verify no fluid is detected - * by bubble detectors. + * The handleDrySelfTestUsedCartridgeCheckState function verify no fluid is + * detected by bubble detectors to ensure the cartridge is new. * @details Inputs: none * @details Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ) { - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + 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(); - if ( ( TRUE == isADADetectedAir ) && ( TRUE == isADVDetectedAir ) ) - { - state = DRY_SELF_TESTS_AIR_TRAP_STATE; - } - else - { - activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleDrySelfTestAirTrapState function verify no fluid is detected - * by air trap. - * @details Inputs: none - * @details Outputs: none - * @return the next state of dry self-tests state machine - *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ) -{ - DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_AIR_TRAP_STATE; - - if ( ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && + if ( ( TRUE == isADADetectedAir ) && ( TRUE == isADVDetectedAir ) && + ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) { state = DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE; @@ -855,16 +838,20 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_STATE; - F32 const arterialPressure = getMeasuredArterialPressure(); F32 const venousPressure = getMeasuredVenousPressure(); + + // End the test when reaching target pressure or time out if ( ( TRUE == didTimeout( pressureSelfTestBloodPumpRunStartTime, BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) || ( ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG >= arterialPressure ) || ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) { + // Test pass when reading positive arterial pressure and negative venous pressure if ( ( arterialPressure < 0) && ( venousPressure > 0 ) ) { + signalBloodPumpHardStop(); setValvePosition( VBV, VALVE_POSITION_B_OPEN ); - setValveAirTrap( STATE_CLOSED ); + setValveAirTrap( STATE_OPEN ); + pressureSelfTestNormalizedStartTime = getMSTimerCount(); state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; } else @@ -889,17 +876,20 @@ { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; - F32 const arterialPressureDiff = fabs( getMeasuredArterialPressure() - previousNormalArterialPressure); - F32 const venousPressureDiff = fabs( getMeasuredVenousPressure() - previousNormalVenousPressure); + F32 const arterialPressureDiff = fabs( getMeasuredArterialPressure() - previousNormalArterialPressure ); + F32 const venousPressureDiff = fabs( getMeasuredVenousPressure() - previousNormalVenousPressure ); - if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) + if ( TRUE == didTimeout( pressureSelfTestNormalizedStartTime, NORMALIZED_PRESSURE_SELF_TEST_TIME ) ) { - state = DRY_SELF_TESTS_COMPLETE_STATE; + if ( ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) + { + state = DRY_SELF_TESTS_COMPLETE_STATE; + } + else + { + *result = SELF_TEST_STATUS_FAILED; + } } - else - { - *result = SELF_TEST_STATUS_FAILED; - } return state; } @@ -961,20 +951,18 @@ if ( FALSE == isValvesSettingSent ) { + isValvesSettingSent = TRUE; + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + if ( resOneWeight > WET_SELF_TEST_RESERVOIR_ONE_SETUP_VOLUME_ML ) { - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); cmdChangeDGValveSetting( DG_VALVE_SETTING_R1_TO_R2 ); } else { - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); cmdChangeDGValveSetting( DG_VALVE_SETTING_R2_TO_R1 ); } - - isValvesSettingSent = TRUE; } if ( ( TRUE == isValvesSettingSent ) && ( TRUE == getDGCommandResponse( DG_CMD_VALVE_SETTING, &cmdResp ) ) ) @@ -985,7 +973,7 @@ if ( FALSE == cmdResp.rejected ) { setDialInPumpTargetFlowRate( DIP_FLOW_RATE_SETUP_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - fmdIntegratedVolume = 0; + fmdIntegratedVolume = 0.0; state = WET_SELF_TESTS_SETUP_STATE; } } @@ -1010,25 +998,26 @@ if ( setupDisplacementVolume <= 0 ) { signalDialInPumpHardStop(); - state = WET_SELF_TESTS_BUBBLE_DETECTOR_STATE; + state = WET_SELF_TESTS_PRIME_CHECK_STATE; } return state; } /*********************************************************************//** * @brief - * The handleWetSelfTestBubbleDetectorsState function handles the wet self-test - * for bubble detectors. - * @details Inputs: Arterial and venous air bubble status + * The handleWetSelfTestPrimeCheckState function checks arterial and venous + * lines to make sure they are primed. + * @details Inputs: Arterial and venous bubble detectors status * @details Outputs: Test pass/fail * @param result self-test result * @return the next state of wet self-tests state machine *************************************************************************/ -static WET_SELF_TESTS_STATE_T handleWetSelfTestBubbleDetectorsState( SELF_TEST_STATUS_T *result ) +static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( SELF_TEST_STATUS_T *result ) { - WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_BUBBLE_DETECTOR_STATE; + WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_PRIME_CHECK_STATE; + // TODO: Use appropriate sensor driver BOOL const isADADetectedAir = getFPGAArterialAirBubbleStatus(); BOOL const isADVDetectedAir = getFPGAVenousAirBubbleStatus(); @@ -1078,7 +1067,7 @@ { setDialInPumpTargetFlowRate( DIP_FLOW_RATE_FIRST_DISPLACEMENT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); displacementStartTime = getMSTimerCount(); - fmdIntegratedVolume = 0; + fmdIntegratedVolume = 0.0; state = WET_SELF_TESTS_FIRST_DISPLACEMENT_STATE; } } @@ -1126,9 +1115,9 @@ if ( TRUE == didTimeout( settleStartTime, RESERVOIR_SETTLE_TIME_MS ) ) { - F32 const resOneDiffAfterDisplacement = fabs( getReservoirWeightLargeFilter( DG_RESERVOIR_1 ) - reservoirVolume[ DG_RESERVOIR_1 ] ); - F32 const resTwoDiffAfterDisplacement = fabs( getReservoirWeightLargeFilter( DG_RESERVOIR_2 ) - reservoirVolume[ DG_RESERVOIR_2 ] ); - F32 const integratedVolumeToTargetPercent = 1 - ( fmdIntegratedVolume / WET_SELF_TEST_FIRST_DISPLACEMENT_TARGET_VOLUME_ML ); + F32 const resOneDiffAfterDisplacement = reservoirVolume[ DG_RESERVOIR_1 ] - getReservoirWeightLargeFilter( DG_RESERVOIR_1 ); + F32 const resTwoDiffAfterDisplacement = getReservoirWeightLargeFilter( DG_RESERVOIR_2 ) - reservoirVolume[ DG_RESERVOIR_2 ]; + F32 const integratedVolumeToTargetPercent = fabs( 1.0 - ( fmdIntegratedVolume / WET_SELF_TEST_FIRST_DISPLACEMENT_TARGET_VOLUME_ML ) ); if ( ( fabs( resOneDiffAfterDisplacement - resTwoDiffAfterDisplacement) <= WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G ) && ( integratedVolumeToTargetPercent <= WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE ) ) @@ -1157,7 +1146,7 @@ WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE; DG_CMD_RESPONSE_T cmdResp; - if ( ( FALSE == isValvesSettingSent ) && ( TRUE == didTimeout( settleStartTime, RESERVOIR_SETTLE_TIME_MS ) ) ) + if ( FALSE == isValvesSettingSent ) { reservoirVolume[ DG_RESERVOIR_1 ] = getReservoirWeightLargeFilter( DG_RESERVOIR_1 ); reservoirVolume[ DG_RESERVOIR_2 ] = getReservoirWeightLargeFilter( DG_RESERVOIR_2 ); @@ -1177,7 +1166,7 @@ { setDialInPumpTargetFlowRate( DIP_FLOW_RATE_SECOND_DISPLACEMENT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); displacementStartTime = getMSTimerCount(); - fmdIntegratedVolume = 0; + fmdIntegratedVolume = 0.0; state = WET_SELF_TESTS_SECOND_DISPLACEMENT_STATE; } } @@ -1226,9 +1215,9 @@ if ( TRUE == didTimeout( settleStartTime, RESERVOIR_SETTLE_TIME_MS ) ) { - F32 const resOneDiffAfterDisplacement = fabs( getReservoirWeightLargeFilter( DG_RESERVOIR_1 ) - reservoirVolume[ DG_RESERVOIR_1 ] ); - F32 const resTwoDiffAfterDisplacement = fabs( getReservoirWeightLargeFilter( DG_RESERVOIR_2 ) - reservoirVolume[ DG_RESERVOIR_2 ] ); - F32 const integratedVolumeToTargetPercent = 1 - ( fmdIntegratedVolume / WET_SELF_TEST_SECOND_DISPLACEMENT_TARGET_VOLUME_ML ); + F32 const resOneDiffAfterDisplacement = getReservoirWeightLargeFilter( DG_RESERVOIR_1 ) - reservoirVolume[ DG_RESERVOIR_1 ]; + F32 const resTwoDiffAfterDisplacement = reservoirVolume[ DG_RESERVOIR_2 ] - getReservoirWeightLargeFilter( DG_RESERVOIR_2 ); + F32 const integratedVolumeToTargetPercent = fabs( 1.0 - ( fmdIntegratedVolume / WET_SELF_TEST_SECOND_DISPLACEMENT_TARGET_VOLUME_ML ) ); if ( ( fabs( resOneDiffAfterDisplacement - resTwoDiffAfterDisplacement) <= WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G ) && ( integratedVolumeToTargetPercent <= WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE ) )