Index: firmware/.settings/org.eclipse.core.resources.prefs =================================================================== diff -u -rf1e3338feb8fccadf01aa629aec4a55132f6fd77 -rb74d08ff24839ebbea51582772ed2b9588558ea0 --- firmware/.settings/org.eclipse.core.resources.prefs (.../org.eclipse.core.resources.prefs) (revision f1e3338feb8fccadf01aa629aec4a55132f6fd77) +++ firmware/.settings/org.eclipse.core.resources.prefs (.../org.eclipse.core.resources.prefs) (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -7,6 +7,8 @@ encoding//Debug/App/Modes/subdir_vars.mk=UTF-8 encoding//Debug/App/Monitors/subdir_rules.mk=UTF-8 encoding//Debug/App/Monitors/subdir_vars.mk=UTF-8 +encoding//Debug/App/Services/StateServices/subdir_rules.mk=UTF-8 +encoding//Debug/App/Services/StateServices/subdir_vars.mk=UTF-8 encoding//Debug/App/Services/subdir_rules.mk=UTF-8 encoding//Debug/App/Services/subdir_vars.mk=UTF-8 encoding//Debug/App/Tasks/subdir_rules.mk=UTF-8 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; -} - /**@}*/ Index: firmware/App/Modes/ModePostTreat.h =================================================================== diff -u -rf054fdd3579dacb03b5b41a363e259949ff63965 -rb74d08ff24839ebbea51582772ed2b9588558ea0 --- firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision f054fdd3579dacb03b5b41a363e259949ff63965) +++ firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -35,8 +35,6 @@ U32 transitionToPostTreatmentMode( void ); // Prepares for transition to post-treatment mode U32 execPostTreatmentMode( void ); // Execute the post-treatment mode state machine (call from OperationModes) -BOOL handleAutoEjectRequest( MESSAGE_T *message); - /**@}*/ #endif Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r0a62c26f8c74795bd1a695de879e1a33524481ed -rb74d08ff24839ebbea51582772ed2b9588558ea0 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 0a62c26f8c74795bd1a695de879e1a33524481ed) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -15,15 +15,10 @@ * ***************************************************************************/ -#include "BloodFlow.h" #include "Buttons.h" -#include "Messaging.h" #include "ModePreTreat.h" #include "OperationModes.h" -#include "PeristalticPump.h" -#include "Switches.h" -#include "TaskGeneral.h" -#include "TDDefs.h" +#include "StateServices/TubeSetInstall.h" #include "Timers.h" #include "TxParams.h" @@ -34,19 +29,7 @@ // ********** private definitions ********** -///< Auto-Load timeout interval (ms/task time) -#define AUTO_LOAD_TIMEOUT_INTERVAL ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) - -//< Blood pump flow rate (mL/min) for Auto-Load operation -#define AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN 100U - -// ********** private data ********** - -static BOOL confirmTubesetPlaced; ///< Flag indicating user has confirmed tubeset is placed -static U32 autoLoadTimerCounter; ///< Auto-Load operation timer counter - static TD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current Pre-Treatment sub-state -static PRE_TX_INSTALL_STATE_T currentPreTxInstallState; ///< Current Pre-Treatment Install sub-state // ********** private function prototypes ********** @@ -60,9 +43,6 @@ static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); ///< Handle Confirm Rx state during Pre-Treatment static TD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); ///< Handle Patient Connection state during Pre-Treatment -static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ); ///< Handle Await Tubset Install Confirmation sub-state -static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ); ///< Handle Auto-Load sub-state - /*********************************************************************//** * @brief * The initPreTreatmentMode function initializes the Pre-Treatment mode. @@ -76,9 +56,6 @@ // Start a fresh Treatment Parameters session for this run. resetTreatmentParameters(); currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; - currentPreTxInstallState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; - confirmTubesetPlaced = FALSE; - autoLoadTimerCounter = 0; } /*********************************************************************//** @@ -93,6 +70,7 @@ U32 transitionToPreTreatmentMode( void ) { initPreTreatmentMode(); + initTubeSetInstall(); return (U32)currentPreTreatmentState; } @@ -219,35 +197,23 @@ /*********************************************************************//** * @brief - * The handleInstallState function executes the Pre-Treatment Install - * state machine. - * @details Inputs: currentPreTxInstallState - * @details Outputs: Advances the Pre-Treatment Install sub-state and - * next Pre-Treatment top-level state when install is complete. - * @return current Pre-Treatment state. + * The handleInstallState function calls Tube Set Install Service and + * advances to Self Test Dry state once the service signals + * completion. + * @details Inputs: none + * @details Outputs: Advances Pre-Treatment state when install is complete. + * @return next Pre-Treatment mode state *************************************************************************/ static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ) { TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; - switch(currentPreTxInstallState) - { - case PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION: - currentPreTxInstallState = handleAwaitTubesetConfirmationState(); - break; + // call tube set install service to auto-load tube set + execTubeSetInstall(); - case PRE_TX_INSTALL_STATE_AUTO_LOAD: - currentPreTxInstallState = handleAutoLoadState(); - - if ( NUM_OF_PRE_TX_INSTALL_SUB_STATES == currentPreTxInstallState ) - { - state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; - } - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TX_INSTALL_INVALID_STATE, (U32)currentPreTxInstallState ); - break; + if ( TRUE == isTubeSetInstallComplete() ) + { + state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; } return state; @@ -351,104 +317,16 @@ /*********************************************************************//** * @brief - * The handleAwaitTubesetConfirmationState function handles the Await - * tubeset confirmation state of Pre-Treatement mode install state - * machine. Should wait for the user to confirm the tubeset is placed, - * and verifies that the blood pump door (H9) is closed. - * @details Inputs: confirmTubsetPlaced - * @details Outputs: confirmTubesetPlaced - * return next Pre-Treatment Install sub-state - *************************************************************************/ -static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ) -{ - PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; - - if ( TRUE == confirmTubesetPlaced ) - { - // Door closed required from Auto-loading onwards, set to false if not required in subsequent states - doorClosedRequired( TRUE ); - - if ( STATE_CLOSED == getSwitchState( H9_SWCH ) ) - { - confirmTubesetPlaced = FALSE; - setBloodPumpTargetFlowRate( AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; - } - } - - return subState; -} - -/*********************************************************************//** - * @brief - * The handleAutoLoadState function handles the Auto-Load state of - * Pre-Treatement mode install state. - * @details Inputs: autoLoadTimerCounter - * @details Outputs: autoLoadTimerCounter - * return next Pre-Treatment Install sub-state - *************************************************************************/ -static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ) -{ - PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; - - // Timeout check - if ( ++autoLoadTimerCounter >= AUTO_LOAD_TIMEOUT_INTERVAL ) - { - signalBloodPumpHardStop(); - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), autoLoadTimerCounter ); - } - else if ( TRUE == isPeristalticPumpHome() ) - { - signalBloodPumpHardStop(); - autoLoadTimerCounter = 0; - subState = NUM_OF_PRE_TX_INSTALL_SUB_STATES; - } - - return subState; -} - -/*********************************************************************//** - * @brief - * The handleAutoLoadRequest function handles a UI request to - * confirm tubeset installation. + * The signalGoToInstallState function resets the Tube Set Install Service + * and set the current state of pre-treatment to install state. * @details Inputs: none - * @details Outputs: confirmTubesetPlaced - * @param message UI message which includes the user confirmation of - * tubset installation. - * @return TRUE if confirmation/rejection accepted, FALSE if not + * @details Outputs: currentPreTreatmentState, initTubeSetInstall() + * @return none *************************************************************************/ -BOOL handleAutoLoadRequest( MESSAGE_T *message ) +void signalGoToInstallState( void ) { - BOOL result = FALSE; - BOOL notInValidState = FALSE; - TD_OP_MODE_T mode = getCurrentOperationMode(); - UI_RESPONSE_PAYLOAD_T response; - - if ( 0 == message->hdr.payloadLen ) - { - notInValidState = ( ( ( TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE != currentPreTreatmentState ) || - ( PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION != currentPreTxInstallState ) ) ? TRUE : FALSE ); - - if ( ( mode != MODE_PRET ) || ( TRUE == notInValidState ) ) - { - response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; - } - else - { - confirmTubesetPlaced = 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_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); - - return result; + initTubeSetInstall(); + currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; } /**@}*/ Index: firmware/App/Modes/ModePreTreat.h =================================================================== diff -u -r981882ba5ad72f45d836aae606dadd273a888058 -rb74d08ff24839ebbea51582772ed2b9588558ea0 --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 981882ba5ad72f45d836aae606dadd273a888058) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -35,7 +35,7 @@ U32 transitionToPreTreatmentMode( void ); // Prepares for transition to pre-treatment mode U32 execPreTreatmentMode( void ); // Execute the pre-treatment mode state machine (call from OperationModes) -BOOL handleAutoLoadRequest( MESSAGE_T *message ); // Handle UI auto-load confirmation request +void signalGoToInstallState( void ); // Signal Pre-Treatment mode to transition to Install state. /**@}*/ Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rf054fdd3579dacb03b5b41a363e259949ff63965 -rb74d08ff24839ebbea51582772ed2b9588558ea0 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision f054fdd3579dacb03b5b41a363e259949ff63965) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -30,8 +30,6 @@ #include "FpgaTD.h" #include "LevelSensors.h" #include "Messaging.h" -#include "ModePostTreat.h" -#include "ModePreTreat.h" #include "ModeStandby.h" #include "OperationModes.h" #include "PAL.h" @@ -43,6 +41,8 @@ #include "Switches.h" #include "SystemCommTD.h" #include "Temperatures.h" +#include "StateServices/TubeSetAutoEject.h" +#include "StateServices/TubeSetInstall.h" #include "TxParams.h" #include "Utilities.h" #include "Valve3Way.h" Index: firmware/App/Services/StateServices/TubeSetAutoEject.c =================================================================== diff -u --- firmware/App/Services/StateServices/TubeSetAutoEject.c (revision 0) +++ firmware/App/Services/StateServices/TubeSetAutoEject.c (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -0,0 +1,309 @@ +/************************************************************************** +* +* Copyright (c) 2025-2026 Diality Inc. - All Rights Reserved. +* +* 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 TubeSetAutoEject.c +* +* @author (last) Praneeth Bunne +* @date (last) 29-Apr-2026 +* +* @author (original) Praneeth Bunne +* @date (original) 29-Apr-2026 +* +***************************************************************************/ + +#include "BloodFlow.h" +#include "Ejector.h" +#include "Messaging.h" +#include "OperationModes.h" +#include "PeristalticPump.h" +#include "TaskGeneral.h" +#include "TubeSetAutoEject.h" + +/** + * @addtogroup TubeSetAutoEject + * @{ + */ + +// ********** 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 states +static BOOL ejectComplete; ///< True once the service has finished successfully + +static TUBE_SET_AUTO_EJECT_STATE_T currentAutoEjectState; ///< Current Tube Set Auto Eject state + +// ********** private function prototypes ********** + +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectAwaitConfirmState( void ); +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 handleAutoEjectRetractingEjectorState( void ); + +/*********************************************************************//** +* @brief +* The initTubeSetAutoEject function initializes the Tube Set Eject service. +* @details Inputs: none +* @details Outputs: Resets the flags, counters and sets the initial +* Tube Set Eject sub-state. +* @return none +**************************************************************************/ +void initTubeSetAutoEject( void ) +{ + currentAutoEjectState = TUBE_SET_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; + autoEjectReqReceived = FALSE; + autoEjectTimerCounter = 0; + ejectComplete = FALSE; +} + +/*********************************************************************//** + * @brief + * The execTubeSetEject function executes the Tube Set Eject + * state machine. + * @details Inputs: currentAutoEjectState + * @details Outputs: currentAutoEjectState, ejectComplete. Advances the + * Tube Set Eject sub-state + * @return none + *************************************************************************/ +void execTubeSetAutoEject( void ) +{ + if( TRUE == ejectComplete ) + { + return; + } + + switch ( currentAutoEjectState ) + { + case TUBE_SET_AUTO_EJECT_STATE_AWAIT_CONFIRMATION: + currentAutoEjectState = handleAutoEjectAwaitConfirmState(); + break; + + case TUBE_SET_AUTO_EJECT_STATE_HOMING: + currentAutoEjectState = handleAutoEjectHomingState(); + break; + + case TUBE_SET_AUTO_EJECT_STATE_EXTENDING_EJECTOR: + currentAutoEjectState = handleAutoEjectExtendingEjectorState(); + break; + + case TUBE_SET_AUTO_EJECT_STATE_EJECTING: + currentAutoEjectState = handleAutoEjectEjectingState(); + break; + + case TUBE_SET_AUTO_EJECT_STATE_RETRACTING_EJECTOR: + currentAutoEjectState = handleAutoEjectRetractingEjectorState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TX_AUTO_EJECT_INVALID_STATE, (U32)currentAutoEjectState ); + break; + } +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectAwaitConfirmState function handles the Await confirm + * state of the Tube Set Eject state machine. + * Waits for the user request to auto-eject + * @details Inputs: autoEjectReqReceived + * @details Outputs: autoEjectReqReceived + * @return next Auto-Eject state + *************************************************************************/ +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectAwaitConfirmState( void ) +{ + TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_AUTO_EJECT_STATE_AWAIT_CONFIRMATION; + + if ( TRUE == autoEjectReqReceived ) + { + homeBloodPump(); + autoEjectTimerCounter = 0; + autoEjectReqReceived = FALSE; + state = TUBE_SET_AUTO_EJECT_STATE_HOMING; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectHomingState function handles the Homing state + * of the Tube Set Eject state machine. + * Homes the blood pump (H4) + * @details Inputs: autoEjectTimerCounter, isPeristalticPumpHome() + * @details Outputs: autoEjectTimerCounter + * @return next Auto-Eject state + *************************************************************************/ +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ) +{ + TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_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; + state = TUBE_SET_AUTO_EJECT_STATE_EXTENDING_EJECTOR; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectExtendingEjectorState function handles the + * Extending Ejector state of the Tube Set Eject Service + * state machine. Extends the ejector pin (H5) to engage the tubeset. + * @details Inputs: autoEjectTimerCounter, getEjectorState() + * @details Outputs: autoEjectTimerCounter + * @return next Auto-Eject state + *************************************************************************/ +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ) +{ + TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_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; + state = TUBE_SET_AUTO_EJECT_STATE_EJECTING; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectEjectingState function handles the Ejecting state + * of the Tube Set 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, isPeristalticPumpHome() + * @details Outputs: autoEjectTimerCounter + * @return next Auto-Eject state + *************************************************************************/ +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ) +{ + TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_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; + state = TUBE_SET_AUTO_EJECT_STATE_RETRACTING_EJECTOR; + } + + return state; +} + +/*********************************************************************//** + * @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. + * @details Inputs: autoEjectTimerCounter, getEjectorState() + * @details Outputs: autoEjectTimerCounter, ejectComplete + * @return next Auto-Eject state + *************************************************************************/ +static TUBE_SET_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ) +{ + TUBE_SET_AUTO_EJECT_STATE_T state = TUBE_SET_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; + ejectComplete = TRUE; + state = NUM_OF_TUBE_SET_AUTO_EJECT_SUB_STATES; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The isTubeSetEjectComplete function reports whether the eject + * service has finished successfully. + * @details \b Inputs: ejectComplete + * @details \b Outputs: none + * @return TRUE if auto-eject completed and ejector is retracted, + * FALSE otherwise. + *************************************************************************/ +BOOL isTubeSetAutoEjectComplete( void ) +{ + return ejectComplete; +} + +/*********************************************************************//** + * @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 validMode = FALSE; + TD_OP_MODE_T mode = getCurrentOperationMode(); + UI_RESPONSE_PAYLOAD_T response; + + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + + if ( 0 == message->hdr.payloadLen ) + { + validMode = ( ( ( mode == MODE_POST ) || ( mode == MODE_TREA ) ) ? TRUE : FALSE ); + + if ( ( TRUE != validMode ) || ( TUBE_SET_AUTO_EJECT_STATE_AWAIT_CONFIRMATION != currentAutoEjectState ) ) + { + response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + } + else + { + autoEjectReqReceived = TRUE; + result = TRUE; + } + } + 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; +} + +/**@}*/ Index: firmware/App/Services/StateServices/TubeSetAutoEject.h =================================================================== diff -u --- firmware/App/Services/StateServices/TubeSetAutoEject.h (revision 0) +++ firmware/App/Services/StateServices/TubeSetAutoEject.h (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -0,0 +1,58 @@ +/************************************************************************** +* +* Copyright (c) 2025-2026 Diality Inc. - All Rights Reserved. +* +* 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 TubeSetAutoEject.h +* +* @author (last) Praneeth Bunne +* @date (last) 29-Apr-2026 +* +* @author (original) Praneeth Bunne +* @date (original) 29-Apr-2026 +* +***************************************************************************/ + +#ifndef __TUBE_SET_AUTO_EJECT_H__ +#define __TUBE_SET_AUTO_EJECT_H__ + +#include "TDCommon.h" +#include "TDDefs.h" + +/** + * @defgroup TubeSetAutoEject TubeSetAutoEject + * @brief TubeSetAutoEject provide services to + * Treatment and Post-Treatment modes.. + * + * @addtogroup TubeSetAutoEject + * @{ + */ + +// ********** public definitions ********** + +// Enumeration of Tube Set Auto-Eject states. +enum Tube_Set_Auto_Eject_States +{ + TUBE_SET_AUTO_EJECT_STATE_AWAIT_CONFIRMATION = 0, // Waiting for user confirmation to auto-eject + 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_RETRACTING_EJECTOR, // Retracting ejector state + NUM_OF_TUBE_SET_AUTO_EJECT_SUB_STATES, // Num of auto-eject sub-states +}; +/// Type for TD Tube Set Auto-Eject service enumeration +typedef enum Tube_Set_Auto_Eject_States TUBE_SET_AUTO_EJECT_STATE_T; + +// ********** public function prototypes ********** + +void initTubeSetAutoEject( void ); // Initialize this service +void execTubeSetAutoEject( void ); // Execute the service state machine (call from ModePostTreat and ModeTreatment) + +BOOL isTubeSetAutoEjectComplete( void ); // Returns True once auto-eject finished successfully +BOOL handleAutoEjectRequest( MESSAGE_T *message); // Handle UI auto-eject confirmation request + +/**@}*/ + +#endif Index: firmware/App/Services/StateServices/TubeSetInstall.c =================================================================== diff -u --- firmware/App/Services/StateServices/TubeSetInstall.c (revision 0) +++ firmware/App/Services/StateServices/TubeSetInstall.c (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -0,0 +1,269 @@ +/************************************************************************** +* +* Copyright (c) 2025-2026 Diality Inc. - All Rights Reserved. +* +* 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 TubeSetInstall.c +* +* @author (last) Praneeth Bunne +* @date (last) 28-Apr-2026 +* +* @author (original) Praneeth Bunne +* @date (Original) 28-Apr-2026 +* +***************************************************************************/ + +#include "AlarmMgmt.h" +#include "BloodFlow.h" +#include "Messaging.h" +#include "OperationModes.h" +#include "PeristalticPump.h" +#include "Switches.h" +#include "TaskGeneral.h" +#include "TDDefs.h" +#include "Timers.h" +#include "StateServices/TubeSetInstall.h" + +/** + * @addtogroup TubeSetInstall + * @{ + */ + +// ********** private definitions ********** + +///< BP timeout interval (ms/task time) +#define BLOOD_PUMP_TIMEOUT_INTERVAL ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) + +//< Blood pump flow rate (mL/min) for Auto-Load operation +#define AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN 100U + +/// Blood pump torque threshold (mN.m) above which a tube-set jam is declared +#define INSTALL_AUTO_LOAD_TORQUE_LIMIT_MNM 9999.0F // TODO: Replace with lab characterized value + +// ********** private data ********** + +static BOOL confirmTubesetPlaced; ///< Flag indicating user has confirmed tubeset is placed +static U32 bloodPumpTimerCounter; ///< Blood Pump timer counter +static BOOL installComplete; ///< True once the service has finished successfully + +static TUBE_SET_INSTALL_STATE_T currentInstallState; ///< Current Tubing Set Install sub-state + +// ********** private function prototypes ********** + +static TUBE_SET_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ); ///< Handle Await Tubset Install Confirmation sub-state +static TUBE_SET_INSTALL_STATE_T handleAutoLoadState( void ); ///< Handle Auto-Load sub-state +static TUBE_SET_INSTALL_STATE_T handleAutoLoadBackOffState( void ); ///< Handle Auto-Load Back-off sub-state + +/*********************************************************************//** +* @brief +* The initTubeSetInstall function initializes the Tube Set Install service. +* @details Inputs: none +* @details Outputs: Resets the flags, counters and sets the initial +* Tube Set Install sub-state. +* @return none +**************************************************************************/ +void initTubeSetInstall( void ) +{ + currentInstallState = TUBE_SET_INSTALL_STATE_AWAIT_TUBE_SET_CONFIRMATION; + confirmTubesetPlaced = FALSE; + bloodPumpTimerCounter = 0; + installComplete = FALSE; +} + +/*********************************************************************//** + * @brief + * The execTubeSetInstall function executes the Tube Set Install + * state machine. + * @details Inputs: currentInstallState + * @details Outputs: currentInstallState, installComplete. Advances the + * Tube Set Install sub-state + * @return none + *************************************************************************/ +void execTubeSetInstall( void ) +{ + if( TRUE == installComplete ) + { + return; + } + + switch( currentInstallState ) + { + case TUBE_SET_INSTALL_STATE_AWAIT_TUBE_SET_CONFIRMATION: + currentInstallState = handleAwaitTubesetConfirmationState(); + break; + + case TUBE_SET_INSTALL_STATE_AUTO_LOAD: + currentInstallState = handleAutoLoadState(); + break; + + case TUBE_SET_INSTALL_STATE_AUTO_LOAD_BACK_OFF: + currentInstallState = handleAutoLoadBackOffState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TX_INSTALL_INVALID_STATE, (U32)currentInstallState ); + break; + } +} + +/*********************************************************************//** + * @brief + * The handleAwaitTubesetConfirmationState function handles the Await + * tubeset confirmation state of Tubing Set install state machine. + * Should wait for the user to confirm the tubeset is placed, and + * verifies that the blood pump door (H9) is closed. + * @details Inputs: confirmTubsetPlaced, H9_SWCH state + * @details Outputs: confirmTubesetPlaced + * return next Pre-Treatment Install sub-state + *************************************************************************/ +static TUBE_SET_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ) +{ + TUBE_SET_INSTALL_STATE_T state = TUBE_SET_INSTALL_STATE_AWAIT_TUBE_SET_CONFIRMATION; + + if ( TRUE == confirmTubesetPlaced ) + { + // Door closed required from Auto-loading onwards, set to false if not required in subsequent states + doorClosedRequired( TRUE ); + + if ( STATE_CLOSED == getSwitchState( H9_SWCH ) ) + { + confirmTubesetPlaced = FALSE; + setBloodPumpTargetFlowRate( AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + state = TUBE_SET_INSTALL_STATE_AUTO_LOAD; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAutoLoadState function handles the Auto-Load state of + * Tube Set install state. + * @details Inputs: bloodPumpTimerCounter, getMeasuredBloodPumpTorque() + * isPeristalticPumpHome() + * @details Outputs: bloodPumpTimerCounter, installComplete + * return next Pre-Treatment Install sub-state + *************************************************************************/ +static TUBE_SET_INSTALL_STATE_T handleAutoLoadState( void ) +{ + TUBE_SET_INSTALL_STATE_T state = TUBE_SET_INSTALL_STATE_AUTO_LOAD; + F32 bpTorque = getMeasuredBloodPumpTorque(); + + // Timeout check + if ( ++bloodPumpTimerCounter >= BLOOD_PUMP_TIMEOUT_INTERVAL ) + { + signalBloodPumpHardStop(); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), bloodPumpTimerCounter ); + } + else if ( bpTorque > INSTALL_AUTO_LOAD_TORQUE_LIMIT_MNM ) + { + signalBloodPumpHardStop(); + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_AUTO_LOAD_BLOOD_TUBE_SET_FAILURE, bpTorque ); + setBloodPumpTargetFlowRate( AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); + bloodPumpTimerCounter = 0; + state = TUBE_SET_INSTALL_STATE_AUTO_LOAD_BACK_OFF; + } + else if ( TRUE == isPeristalticPumpHome() ) + { + signalBloodPumpHardStop(); + bloodPumpTimerCounter = 0; + installComplete = TRUE; + state = NUM_OF_TUBE_SET_INSTALL_SUB_STATES; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAutoLoadBackOffState function handles the Auto-Load Back-Off + * state of Tube Set install state. + * @details Inputs: bloodPumpTimerCounter, isPeristalticPumpHome() + * @details Outputs: bloodPumpTimerCounter + * return next install sub-state + *************************************************************************/ +static TUBE_SET_INSTALL_STATE_T handleAutoLoadBackOffState( void ) +{ + TUBE_SET_INSTALL_STATE_T state = TUBE_SET_INSTALL_STATE_AUTO_LOAD_BACK_OFF; + + if ( bloodPumpTimerCounter >= BLOOD_PUMP_TIMEOUT_INTERVAL ) + { + signalBloodPumpHardStop(); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, isPeristalticPumpHome(), bloodPumpTimerCounter ); + } + else if ( TRUE == isPeristalticPumpHome() ) + { + clearAlarmTD( ALARM_ID_TD_AUTO_LOAD_BLOOD_TUBE_SET_FAILURE ); + + if ( FALSE == isAlarmActive( ALARM_ID_TD_AUTO_LOAD_BLOOD_TUBE_SET_FAILURE ) ) + { + signalBloodPumpHardStop(); + bloodPumpTimerCounter = 0; + state = TUBE_SET_INSTALL_STATE_AWAIT_TUBE_SET_CONFIRMATION; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The isTubeSetInstallComplete function reports whether the install + * service has finished successfully. + * @details \b Inputs: installComplete + * @details \b Outputs: none + * @return TRUE if auto-load completed and pump is at home, FALSE otherwise. + *************************************************************************/ +BOOL isTubeSetInstallComplete( void ) +{ + return installComplete; +} + +/*********************************************************************//** + * @brief + * The handleAutoLoadRequest function handles a UI request to + * confirm tubeset installation. + * @details Inputs: none + * @details Outputs: confirmTubesetPlaced + * @param message UI message which includes the user confirmation of + * tubset installation. + * @return TRUE if confirmation/rejection accepted, FALSE if not + *************************************************************************/ +BOOL handleAutoLoadRequest( MESSAGE_T *message ) +{ + BOOL result = FALSE; + BOOL modeValid = FALSE; + TD_OP_MODE_T mode = getCurrentOperationMode(); + UI_RESPONSE_PAYLOAD_T response; + + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + + if ( 0 == message->hdr.payloadLen ) + { + modeValid = ( ( MODE_PRET == mode ) || ( MODE_TREA == mode ) ? TRUE : FALSE ); + + if ( ( TRUE != modeValid ) || ( TUBE_SET_INSTALL_STATE_AWAIT_TUBE_SET_CONFIRMATION != currentInstallState ) ) + { + response.rejectionReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + } + else + { + confirmTubesetPlaced = TRUE; + result = TRUE; + } + } + 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_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08*)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); + + return result; +} + +/**@}*/ Index: firmware/App/Services/StateServices/TubeSetInstall.h =================================================================== diff -u --- firmware/App/Services/StateServices/TubeSetInstall.h (revision 0) +++ firmware/App/Services/StateServices/TubeSetInstall.h (revision b74d08ff24839ebbea51582772ed2b9588558ea0) @@ -0,0 +1,56 @@ +/************************************************************************** +* +* Copyright (c) 2025-2026 Diality Inc. - All Rights Reserved. +* +* 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 TubeSetInstall.h +* +* @author (last) Praneeth Bunne +* @date (last) 28-Apr-2026 +* +* @author (original) Praneeth Bunne +* @date (original) 28-Apr-2026 +* +***************************************************************************/ + +#ifndef __TUBE_SET_INSTALL_H__ +#define __TUBE_SET_INSTALL_H__ + +#include "TDCommon.h" +#include "TDDefs.h" + +/** + * @defgroup TubeSetInstall TubeSetInstall + * @brief The TubeSetInstall provide services to + * Pre-Treatment and Treatment modes. + * + * @addtogroup TubeSetInstall + * @{ + */ + +// ********** public definitions ********** + +/// Enumeration of Tube Set install sub-states. +enum Tube_Set_Install_States +{ + TUBE_SET_INSTALL_STATE_AWAIT_TUBE_SET_CONFIRMATION = 0, // Awaiting user confirmation that tubeset is placed. + TUBE_SET_INSTALL_STATE_AUTO_LOAD, // Auto-Load the tubeset state + TUBE_SET_INSTALL_STATE_AUTO_LOAD_BACK_OFF, // Auto-Load Back-off state + NUM_OF_TUBE_SET_INSTALL_SUB_STATES, // Num of install sub-states +}; +/// Type for tube set install states enumeration +typedef enum Tube_Set_Install_States TUBE_SET_INSTALL_STATE_T; + +// ********** public function prototypes ********** + +void initTubeSetInstall( void ); // Initialize this service +void execTubeSetInstall( void ); // Execute the service state machine (call from ModePreTreat and ModeTreatment) + +BOOL isTubeSetInstallComplete( void ); // Returns True once auto-load finished successfully +BOOL handleAutoLoadRequest( MESSAGE_T *message ); // Handle UI auto-load confirmation request + +/**@}*/ + +#endif