Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r5e79889ab3931589b2e05d554097d1a106c6634a -r62200ed6423dfd6ff7881bd0fc308162384e663e --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 5e79889ab3931589b2e05d554097d1a106c6634a) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 62200ed6423dfd6ff7881bd0fc308162384e663e) @@ -122,10 +122,11 @@ static void setupForSelfTestsStop( void ); 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( 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 handleNoCartSelfTestHomeValvesState( void ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeSyringePumpState( void ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeIdleState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStoppedState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); @@ -273,21 +274,25 @@ case NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE: // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_HOMING_STATE; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_STATE; break; - case NO_CART_SELF_TESTS_START_HOMING_STATE: - currentNoCartSelfTestsState = handleNoCartSelfTestStartHomingState(); + case NO_CART_SELF_TESTS_HOME_VALVES_STATE: + currentNoCartSelfTestsState = handleNoCartSelfTestHomeValvesState(); break; - case NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE: - currentNoCartSelfTestsState = handleNoCartSelfTestHomeValvesAndPumpState(); + case NO_CART_SELF_TESTS_HOME_SYRINGE_PUMP_STATE: + currentNoCartSelfTestsState = handleNoCartSelfTestHomeSyringePumpState(); break; case NO_CART_SELF_TESTS_PUMPS_STATE: currentNoCartSelfTestsState = handleNoCartSelfTestPumpsState(); break; + case NO_CART_SELF_TESTS_HOME_IDLE_STATE: + currentNoCartSelfTestsState = handleNoCartSelfTestHomeIdleState(); + break; + case NO_CART_SELF_TESTS_STOPPED_STATE: currentNoCartSelfTestsState = handleNoCartSelfTestStoppedState(); break; @@ -598,37 +603,53 @@ /*********************************************************************//** * @brief - * The handleNoCartSelfTestPumpsState function runs blood, dialysate inlet, - * dialysate outlet pumps for certain time to make sure no alarms occur. + * 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 handleNoCartSelfTestPumpsState( void ) +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_PUMPS_STATE; + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; + // TODO: Use appropriate sensor driver + BOOL const bloodLeakDetector = getFPGABloodLeakDetectorStatus(); - if ( FALSE == havePumpsStarted ) + if ( TRUE == bloodLeakDetector ) { - 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 ); - setDialOutPumpTargetRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - runPumpStartTime = getMSTimerCount(); + // 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 == didTimeout( runPumpStartTime, PUMP_RUN_SELF_TEST_TIME_MS ) ) + if ( TRUE == doesAlarmStatusIndicateStop() ) { - signalBloodPumpHardStop(); - signalDialInPumpHardStop(); - signalDialOutPumpHardStop(); + setupForSelfTestsStop(); + state = NO_CART_SELF_TESTS_STOPPED_STATE; + } - // Home pumps for cartridge installation - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); - state = NO_CART_SELF_TESTS_COMPLETE_STATE; + return state; +} + +/*********************************************************************//** + * @brief + * The handleNoCartSelfTestHomeValvesState function starts homing process for + * all the valves. + * @details Inputs: none + * @details Outputs: Home all valves + * @return the next state of no cartridge self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesState( void ) +{ + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_HOME_SYRINGE_PUMP_STATE; + VALVE_T valve; + + for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) + { + homeValve( valve ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -642,27 +663,26 @@ /*********************************************************************//** * @brief - * The handleNoCartSelfTestLeakDetectorsState function verify leak detectors status. - * @details Inputs: none - * @details Outputs: none - * @param result self-test result + * The handleNoCartSelfTestHomeSyringePumpState function homes syringe pump. + * @details Inputs: useHeparin + * @details Outputs: Home syringe pump * @return the next state of no cartridge self-tests state machine *************************************************************************/ -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( void ) +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeSyringePumpState( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_LEAK_DETECTORS_STATE; - // TODO: Use appropriate sensor driver - BOOL const bloodLeakDetector = getFPGABloodLeakDetectorStatus(); + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_HOME_SYRINGE_PUMP_STATE; - if ( TRUE == bloodLeakDetector ) + if ( TRUE == useHeparin ) { - // TODO: Use appropriate sensor driver - setFPGASensorTest( BLOOD_LEAK_NORMAL_OPERATION ); - state = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; + if ( ( FALSE == isSyringePumpHome() ) && ( TRUE == isSyringePumpStopped() ) ) + { + retractSyringePump(); + } } - else + + if ( TRUE == isSyringePumpHome() ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BLOOD_LEAK_SELF_TEST_FAILURE, (U32)bloodLeakDetector ); + state = NO_CART_SELF_TESTS_PUMPS_STATE; } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -676,29 +696,37 @@ /*********************************************************************//** * @brief - * The handleNoCartSelfTestStartHomingState function start homing process for - * all the valves and pumps. + * The handleNoCartSelfTestPumpsState function runs blood, dialysate inlet, + * dialysate outlet pumps for certain time to make sure no alarms occur. * @details Inputs: none - * @details Outputs: Valves and pumps started homing + * @details Outputs: Ran self-test for blood, dialysate in, dialysate out pumps * @return the next state of no cartridge self-tests state machine *************************************************************************/ -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStartHomingState( void ) +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; - VALVE_T valve; + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_PUMPS_STATE; - for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) + if ( FALSE == havePumpsStarted ) { - homeValve( valve ); + 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 ); + setDialOutPumpTargetRate( PUMP_SELF_TEST_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + runPumpStartTime = getMSTimerCount(); } - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); - - if ( TRUE == useHeparin ) + if ( TRUE == didTimeout( runPumpStartTime, PUMP_RUN_SELF_TEST_TIME_MS ) ) { - retractSyringePump(); + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + + // Home pumps for cartridge installation + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); + state = NO_CART_SELF_TESTS_HOME_IDLE_STATE; } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -712,28 +740,20 @@ /*********************************************************************//** * @brief - * The handleNoCartSelfTestHomeValvesAndPumpState function homes all valves - * and pumps. + * The handleNoCartSelfTestHomeIdleState function waits for all pumps finish homing. * @details Inputs: none - * @details Outputs: none + * @details Outputs: All pumps finished homing * @return the next state of no cartridge self-tests state machine *************************************************************************/ -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ) +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeIdleState( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_HOME_IDLE_STATE; - // Retry homing syringe pump - if ( ( FALSE == isSyringePumpHome() ) && ( TRUE == isSyringePumpStopped() ) ) + if ( ( FALSE == isDialInPumpRunning() ) && ( FALSE == isDialOutPumpRunning() ) && ( FALSE == isBloodPumpRunning() ) ) { - retractSyringePump(); + state = NO_CART_SELF_TESTS_COMPLETE_STATE; } - if ( ( FALSE == isDialInPumpRunning() ) && ( FALSE == isDialOutPumpRunning() ) && - ( FALSE == isBloodPumpRunning() ) && ( TRUE == isSyringePumpHome() ) ) - { - state = NO_CART_SELF_TESTS_PUMPS_STATE; - } - if ( TRUE == doesAlarmStatusIndicateStop() ) { setupForSelfTestsStop(); @@ -758,7 +778,7 @@ if ( TRUE == selfTestsResumeRequested ) { selfTestsResumeRequested = FALSE; - havePumpsStarted = TRUE; + havePumpsStarted = FALSE; state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; }