Index: firmware/App/Services/StateServices/TubeSetAutoEject.c =================================================================== diff -u -rb314f68347ca0720d370fd5ace385a2d8d92fabe -r08662b6d28ebfd8f41b56b1792648deb99dca5e4 --- firmware/App/Services/StateServices/TubeSetAutoEject.c (.../TubeSetAutoEject.c) (revision b314f68347ca0720d370fd5ace385a2d8d92fabe) +++ firmware/App/Services/StateServices/TubeSetAutoEject.c (.../TubeSetAutoEject.c) (revision 08662b6d28ebfd8f41b56b1792648deb99dca5e4) @@ -46,6 +46,7 @@ static BOOL autoEjectReqReceived; ///< Flag indicating that user confirmed to eject tubeset static U32 autoEjectTimerCounter; ///< Timer counter shared across all auto-eject states static BOOL bpLastHome; ///< Flag for Blood Pump last home (for rising-edge) +static BOOL backOffAfterRetract; ///< Flag indicating back-off required after retract. static TUBE_SET_AUTO_EJECT_STATE_T currentAutoEjectState; ///< Current Tube Set Auto Eject state @@ -55,8 +56,8 @@ static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ); static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ); static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ); -static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectBackOffState( void ); static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ); +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectBackOffState( void ); static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectCompleteState( void ); /*********************************************************************//** @@ -73,6 +74,7 @@ autoEjectReqReceived = FALSE; autoEjectTimerCounter = 0; bpLastHome = TRUE; + backOffAfterRetract = FALSE; } /*********************************************************************//** @@ -104,14 +106,14 @@ currentAutoEjectState = handleAutoEjectEjectingState(); break; - case TUBE_SET_AUTO_EJECT_STATE_BACK_OFF: - currentAutoEjectState = handleAutoEjectBackOffState(); - break; - case TUBE_SET_AUTO_EJECT_STATE_RETRACTING_EJECTOR: currentAutoEjectState = handleAutoEjectRetractingEjectorState(); break; + case TUBE_SET_AUTO_EJECT_STATE_BACK_OFF: + currentAutoEjectState = handleAutoEjectBackOffState(); + break; + case TUBE_SET_AUTO_EJECT_STATE_COMPLETE: currentAutoEjectState = handleAutoEjectCompleteState(); break; @@ -219,7 +221,7 @@ * forward at 100 mL/min with the ejector extended to push the tubeset * out of the rotor. * @details \b Inputs: autoEjectTimerCounter, bpLastHome - * @details \b Outputs: autoEjectTimerCounter, bpLastHome + * @details \b Outputs: autoEjectTimerCounter, bpLastHome, backOffAfterRetract * @return next Auto-Eject state *************************************************************************/ static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ) @@ -238,9 +240,10 @@ { signalBloodPumpHardStop(); SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BLOOD_TUBE_SET_FAILURE, bpTorque ); - setBloodPumpTargetFlowRate( AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); + retractEjector(); autoEjectTimerCounter = 0; - state = TUBE_SET_AUTO_EJECT_STATE_BACK_OFF; + backOffAfterRetract = TRUE; + state = TUBE_SET_AUTO_EJECT_STATE_RETRACTING_EJECTOR; } // BP home position check (rising edge: motor must leave home and return) else if ( ( TRUE == bpCurrentHome ) && ( FALSE == bpLastHome ) ) @@ -262,31 +265,35 @@ /*********************************************************************//** * @brief - * The handleAutoEjectBackOffState function handles the Auto-Eject Back-Off - * state of Tube Set Eject state machine. - * @details \b Inputs: autoEjectTimerCounter - * @details \b Outputs: autoEjectTimerCounter + * The handleAutoEjectRetractingEjectorState function handles the + * Retracting Ejector state of the Tube Set Eject state machine. + * Retracts the ejector pin (H5) after the tubeset has been ejected. + * @details \b Inputs: autoEjectTimerCounter, backOffAfterRetract + * @details \b Outputs: autoEjectTimerCounter, backOffAfterRetract * @return next Auto-Eject state *************************************************************************/ -static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectBackOffState( void ) +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ) { - TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_AUTO_EJECT_STATE_BACK_OFF; + TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_AUTO_EJECT_STATE_RETRACTING_EJECTOR; if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) { - signalBloodPumpHardStop(); - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), autoEjectTimerCounter ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); } - else if ( TRUE == isPeristalticPumpHome() ) + else if ( EJECTOR_STATE_RETRACTED == getEjectorState() ) { - signalBloodPumpHardStop(); - clearAlarmTD( ALARM_ID_TD_AUTO_LOAD_EJECT_BLOOD_TUBE_SET_FAILURE ); + autoEjectTimerCounter = 0; - if ( FALSE == isAlarmActive( ALARM_ID_TD_AUTO_LOAD_EJECT_BLOOD_TUBE_SET_FAILURE ) ) + if ( TRUE == backOffAfterRetract ) { - autoEjectTimerCounter = 0; - state = TUBE_SET_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; + setBloodPumpTargetFlowRate( AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); + backOffAfterRetract = FALSE; + state = TUBE_SET_AUTO_EJECT_STATE_BACK_OFF; } + else + { + state = TUBE_SET_AUTO_EJECT_STATE_COMPLETE; + } } else { @@ -298,25 +305,31 @@ /*********************************************************************//** * @brief - * The handleAutoEjectRetractingEjectorState function handles the - * Retracting Ejector state of the Tube Set Eject state machine. - * Retracts the ejector pin (H5) after the tubeset has been ejected. + * The handleAutoEjectBackOffState function handles the Auto-Eject Back-Off + * state of Tube Set Eject state machine. * @details \b Inputs: autoEjectTimerCounter * @details \b Outputs: autoEjectTimerCounter * @return next Auto-Eject state *************************************************************************/ -static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ) +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectBackOffState( void ) { - TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_AUTO_EJECT_STATE_RETRACTING_EJECTOR; + TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_AUTO_EJECT_STATE_BACK_OFF; if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); + signalBloodPumpHardStop(); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), autoEjectTimerCounter ); } - else if ( EJECTOR_STATE_RETRACTED == getEjectorState() ) + else if ( TRUE == isPeristalticPumpHome() ) { - autoEjectTimerCounter = 0; - state = TUBE_SET_AUTO_EJECT_STATE_COMPLETE; + signalBloodPumpHardStop(); + clearAlarmTD( ALARM_ID_TD_AUTO_LOAD_EJECT_BLOOD_TUBE_SET_FAILURE ); + + if ( FALSE == isAlarmActive( ALARM_ID_TD_AUTO_LOAD_EJECT_BLOOD_TUBE_SET_FAILURE ) ) + { + autoEjectTimerCounter = 0; + state = TUBE_SET_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; + } } else { Index: firmware/App/Services/StateServices/TubeSetAutoEject.h =================================================================== diff -u -rb314f68347ca0720d370fd5ace385a2d8d92fabe -r08662b6d28ebfd8f41b56b1792648deb99dca5e4 --- firmware/App/Services/StateServices/TubeSetAutoEject.h (.../TubeSetAutoEject.h) (revision b314f68347ca0720d370fd5ace385a2d8d92fabe) +++ firmware/App/Services/StateServices/TubeSetAutoEject.h (.../TubeSetAutoEject.h) (revision 08662b6d28ebfd8f41b56b1792648deb99dca5e4) @@ -39,8 +39,8 @@ TUBE_SET_AUTO_EJECT_STATE_HOMING, // Homing blood pump TUBE_SET_AUTO_EJECT_STATE_EXTENDING_EJECTOR, // Extending ejector state TUBE_SET_AUTO_EJECT_STATE_EJECTING, // Ejecting tubeset state - TUBE_SET_AUTO_EJECT_STATE_BACK_OFF, // Auto-Eject Back-off state TUBE_SET_AUTO_EJECT_STATE_RETRACTING_EJECTOR, // Retracting ejector state + TUBE_SET_AUTO_EJECT_STATE_BACK_OFF, // Auto-Eject Back-off state TUBE_SET_AUTO_EJECT_STATE_COMPLETE, // Auto-Eject complete state NUM_OF_TUBE_SET_AUTO_EJECT_SUB_STATES, // Num of auto-eject sub-states };