Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -r0a62c26f8c74795bd1a695de879e1a33524481ed -rb74d08ff24839ebbea51582772ed2b9588558ea0 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 0a62c26f8c74795bd1a695de879e1a33524481ed) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -5,7 +5,7 @@ * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * -* @file ModePostTreat.h +* @file ModePostTreat.c * * @author (last) Praneeth Bunne * @date (last) 13-Apr-2026 @@ -15,15 +15,10 @@ * ***************************************************************************/ -#include "BloodFlow.h" #include "Buttons.h" -#include "Ejector.h" -#include "Messaging.h" #include "ModePostTreat.h" #include "OperationModes.h" -#include "PeristalticPump.h" -#include "TaskGeneral.h" -#include "TDDefs.h" +#include "StateServices/TubeSetAutoEject.h" /** * @addtogroup TDPostTreatmentMode @@ -32,19 +27,7 @@ // ********** private definitions ********** -///< Auto eject timeout interval (ms/task time) -#define AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) - -///< Blood pump flow rate (mL/min) for the ejecting operation -#define AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN 100U - -// ********** private data ********** - -static BOOL autoEjectReqReceived; ///< Flag indicating that user confirmed to eject tubeset -static U32 autoEjectTimerCounter; ///< Timer counter shared across all auto-eject sub-states - static TD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current Post-Treatment sub-state -static POST_TX_AUTO_EJECT_STATE_T currentPostTxAutoEjectState; ///< Current Post-Treatment Auto Eject sub-state // ********** private function prototypes ********** @@ -54,12 +37,6 @@ static TD_POST_TREATMENT_STATE_T handleDisposableRemovalState(void ); static TD_POST_TREATMENT_STATE_T handleVerifyState( void ); -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectAwaitConfirmState( void ); -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ); -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ); -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ); -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ); - /*********************************************************************//** * @brief * The initPostTreatmentMode function initializes the Post-Treatment mode. @@ -70,9 +47,6 @@ void initPostTreatmentMode( void ) { currentPostTreatmentState = TD_POST_TREATMENT_AUTO_EJECT_STATE; - currentPostTxAutoEjectState = POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; - autoEjectReqReceived = FALSE; - autoEjectTimerCounter = 0; } /*********************************************************************//** @@ -87,6 +61,7 @@ U32 transitionToPostTreatmentMode( void ) { initPostTreatmentMode(); + initTubeSetAutoEject(); setPostTreatStateTransition( currentPostTreatmentState ); return (U32)currentPostTreatmentState; @@ -192,47 +167,23 @@ /*********************************************************************//** * @brief - * The handleAutoEjectState function executes the Post-Treatment - * mode Auto Eject state machine. - * @details Inputs: currentPostTxAutoEjectState - * @details Outputs: Advances the Post-Treatment Auto Eject sub-state - * and next Post-Treatment top-level state when eject is complete. - * @return next post-treatment mode state + * The handleAutoEjectState function calls Tube Set Auto-Eject Service and + * advances to Disposable removal state once the service signals + * completion. + * @details Inputs: none + * @details Outputs: Advances Post-Treatment state when eject is complete. + * @return next Post-Treatment mode state *************************************************************************/ static TD_POST_TREATMENT_STATE_T handleAutoEjectState( void ) { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_AUTO_EJECT_STATE; - switch ( currentPostTxAutoEjectState ) - { - case POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION: - currentPostTxAutoEjectState = handleAutoEjectAwaitConfirmState(); - break; + // call tube set eject service to auto-eject tube set + execTubeSetAutoEject(); - case POST_TX_AUTO_EJECT_STATE_HOMING: - currentPostTxAutoEjectState = handleAutoEjectHomingState(); - break; - - case POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR: - currentPostTxAutoEjectState = handleAutoEjectExtendingEjectorState(); - break; - - case POST_TX_AUTO_EJECT_STATE_EJECTING: - currentPostTxAutoEjectState = handleAutoEjectEjectingState(); - break; - - case POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR: - currentPostTxAutoEjectState = handleAutoEjectRetractingEjectorState(); - - if ( NUM_OF_POST_TX_AUTO_EJECT_SUB_STATES == currentPostTxAutoEjectState ) - { - state = TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; - } - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TX_AUTO_EJECT_INVALID_STATE, (U32)currentPostTxAutoEjectState ); - break; + if( TRUE == isTubeSetAutoEjectComplete() ) + { + state = TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; } return state; @@ -273,183 +224,4 @@ return state; } -/*********************************************************************//** - * @brief - * The handleAutoEjectAwaitConfirmState function handles the Await confirm - * sub-state of the Post-Treatment Auto-Eject state machine. - * Waits for the user request to auto-eject - * @details Inputs: autoEjectReqReceived - * @details Outputs: autoEjectReqReceived - * @return next Auto-Eject sub-state - *************************************************************************/ -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectAwaitConfirmState( void ) -{ - POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; - - if ( TRUE == autoEjectReqReceived ) - { - homeBloodPump(); - autoEjectTimerCounter = 0; - autoEjectReqReceived = FALSE; - subState = POST_TX_AUTO_EJECT_STATE_HOMING; - } - - return subState; -} - -/*********************************************************************//** - * @brief - * The handleAutoEjectHomingState function handles the Homing sub-state - * of the Post-Treatment Auto-Eject state machine. - * Homes the blood pump (H4) - * @details Inputs: autoEjectTimerCounter - * @details Outputs: autoEjectTimerCounter - * @return next Auto-Eject sub-state - *************************************************************************/ -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ) -{ - POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_HOMING; - - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL) - { - signalBloodPumpHardStop(); - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, (U32)isPeristalticPumpHome(), autoEjectTimerCounter ); - } - else if ( TRUE == isPeristalticPumpHome() ) - { - extendEjector(); - autoEjectTimerCounter = 0; - subState = POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR; - } - - return subState; -} - -/*********************************************************************//** - * @brief - * The handleAutoEjectExtendingEjectorState function handles the - * Extending Ejector sub-state of the Post-Treatment Auto-Eject - * state machine. Extends the ejector pin (H5) to engage the tubeset. - * @details Inputs: autoEjectTimerCounter - * @details Outputs: autoEjectTimerCounter - * @return next Auto-Eject sub-state - *************************************************************************/ -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ) -{ - POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR; - - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); - } - else if ( EJECTOR_STATE_EXTENDED == getEjectorState() ) - { - setBloodPumpTargetFlowRate( AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - autoEjectTimerCounter = 0; - subState = POST_TX_AUTO_EJECT_STATE_EJECTING; - } - - return subState; -} - -/*********************************************************************//** - * @brief - * The handleAutoEjectEjectingState function handles the Ejecting sub-state - * of the Post-Treatment Auto-Eject state machine. Rotates the blood pump (H4) - * forward at 100 mL/min with the ejector extended to push the tubeset - * out of the rotor. - * @details Inputs: autoEjectTimerCounter - * @details Outputs: autoEjectTimerCounter - * @return next Auto-Eject sub-state - *************************************************************************/ -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ) -{ - POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_EJECTING; - - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) - { - signalBloodPumpHardStop(); - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), autoEjectTimerCounter ); - } - else if ( TRUE == isPeristalticPumpHome() ) - { - signalBloodPumpHardStop(); - retractEjector(); - autoEjectTimerCounter = 0; - subState = POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR; - } - - return subState; -} - -/*********************************************************************//** - * @brief - * The handleAutoEjectRetractingEjectorState function handles the - * Retracting Ejector sub-state of the Post-Treatment Auto-Eject state - * machine. Retracts the ejector pin (H5) after the tubeset has been ejected. - * @details Inputs: autoEjectTimerCounter - * @details Outputs: autoEjectTimerCounter - * @return next Auto-Eject sub-state - *************************************************************************/ -static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ) -{ - POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR; - - if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); - } - else if ( EJECTOR_STATE_RETRACTED == getEjectorState() ) - { - autoEjectTimerCounter = 0; - subState = NUM_OF_POST_TX_AUTO_EJECT_SUB_STATES; - } - - return subState; -} - -/*********************************************************************//** - * @brief - * The handleAutoEjectRequest function handles a UI request to remove the - * disposable tubeset. - * @details Inputs: none - * @details Outputs: autoEjectReqReceived - * @param message UI message which includes the user confirmation to - * eject the tubeset - * @return TRUE if confirmation/rejection accepted, FALSE if not - *************************************************************************/ -BOOL handleAutoEjectRequest( MESSAGE_T *message ) -{ - BOOL result = FALSE; - BOOL notInValidState = FALSE; - TD_OP_MODE_T mode = getCurrentOperationMode(); - UI_RESPONSE_PAYLOAD_T response; - - if ( 0 == message->hdr.payloadLen ) - { - notInValidState = ( ( ( TD_POST_TREATMENT_AUTO_EJECT_STATE != currentPostTreatmentState ) || - ( POST_TX_AUTO_EJECT_STATE_AWAIT_CONFIRMATION != currentPostTxAutoEjectState ) ) ? TRUE : FALSE ); - - if ( ( mode != MODE_POST ) || ( TRUE == notInValidState ) ) - { - response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; - } - else - { - autoEjectReqReceived = TRUE; - result = TRUE; - response.rejectionReason = REQUEST_REJECT_REASON_NONE; - } - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_MESSAGE_PAYLOAD_LENGTH, (U32)message->hdr.payloadLen ); - } - - response.accepted = result; - sendMessage( MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); - - return result; -} - /**@}*/