Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r222b05e39082f727dcfa2d144fa6e040501882f0 -r52787cd53986cfd0abb7e674bf096898e5070f9a --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 52787cd53986cfd0abb7e674bf096898e5070f9a) @@ -7,79 +7,104 @@ * * @file ModePreTreat.c * -* @author (last) Raghu Kallala -* @date (last) 08-May-2026 +* @author (last) Vijay Pamula +* @date (last) 14-Jul-2026 * * @author (original) Dara Navaei * @date (original) 25-Sep-2025 * ***************************************************************************/ +#include "AirPump.h" +#include "AirTrap.h" +#include "BloodFlow.h" #include "Buttons.h" #include "DDInterface.h" #include "ModePreTreat.h" #include "OperationModes.h" +#include "StatePreTxRecirculate.h" +#include "SyringePump.h" #include "Timers.h" +#include "TubeSetInstall.h" #include "TxParams.h" +#include "Valves.h" +#include "Valve3Way.h" /** * @addtogroup TDPreTreatmentMode * @{ */ -// ********** private definitions ********** - // ********** private data ********** static TD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current Pre-Treatment sub-state +static BOOL goToInstallStateRequested; ///< Flag indicating a request to transition to Install state. +static BOOL continueFromRecirculateRequested; ///< Flag indicating a request to transition to Patient Connection state. // ********** private function prototypes ********** -static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); ///< Handle Confirm Rx state during Pre-Treatment +static void setPreTreatStateTransition( void ); ///< Configure actuators and variables for Pre-Treatment state transitions. +static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); ///< Handle Install state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); ///< Handle Self Test Dry state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); ///< Handle Prime state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); ///< Handle Recirculate state during Pre-Treatment +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 /*********************************************************************//** * @brief * The initPreTreatmentMode function initializes the Pre-Treatment mode. * @details Inputs: none -* @details Outputs: Resets the Treatment Parameters session and sets the initial +* @details Outputs: Initializes the Treatment Parameters session and sets the initial * Pre-Treatment sub-state. * @return none **************************************************************************/ void initPreTreatmentMode( void ) { // Start a fresh Treatment Parameters session for this run. - resetTreatmentParameters(); - currentPreTreatmentState = TD_PRE_TREATMENT_CONFIRM_RX_STATE; + initTreatmentParameters(); + currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + goToInstallStateRequested = FALSE; + continueFromRecirculateRequested = FALSE; } /*********************************************************************//** * @brief * The transitionToPreTreatmentMode function prepares the system for * entry into Pre-Treatment mode. -* @details Inputs: none -* @details Outputs: Initializes mode specific state and returns the starting +* @details \b Inputs: none +* @details \b Outputs: Initializes mode specific state and returns the starting * Pre-Treatment sub-state. * @return Initial Pre-Treatment sub-state **************************************************************************/ U32 transitionToPreTreatmentMode( void ) { initPreTreatmentMode(); + initTubeSetInstall(); + // TODO: remove after implementing blood pump homing in some state + homeBloodPump(); + + // TODO: remove these homeValve() when SELF_TEST_NO_CART_STATE is implemented (homing valves is handled over there). + homeValve(H1_VALV, FALSE, FALSE); + homeValve(H19_VALV, FALSE, FALSE); + return (U32)currentPreTreatmentState; } /*********************************************************************//** * @brief * The execPreTreatmentMode function executes the Pre-Treatment * mode state machine. - * @details Inputs: stop button status and system conditions via helpers. - * @details Outputs: Advances the Pre-Treatment sub-state and + * @details \b Inputs: stop button status and system conditions via helpers. + * @details \b Outputs: Advances the Pre-Treatment sub-state and * previously received user confirmations. * @return current Pre-Treatment sub-state. *************************************************************************/ U32 execPreTreatmentMode( void ) { BOOL stop = isStopButtonPressed(); + TD_PRE_TREATMENT_MODE_STATE_T prevPreTreatmentState = currentPreTreatmentState; if ( TRUE == stop ) { @@ -89,58 +114,194 @@ // Execute mode state machine switch ( currentPreTreatmentState ) { - case TD_PRE_TREATMENT_WATER_SAMPLE_STATE: - // currentPreTreatmentState = handleWaterSampleState(); + case TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE: + currentPreTreatmentState = handleInstallState(); break; - case TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE: - // currentPreTreatmentState = handleSelfTestConsumableState(); + case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: + // currentPreTreatmentState = handleSelfTestDryState(); break; - case TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: - // currentPreTreatmentState = handleSelfTestNoCartState(); + case TD_PRE_TREATMENT_PRIME_STATE: + // currentPreTreatmentState = handlePrimeState(); break; - case TD_PRE_TREATMENT_CART_INSTALL_STATE: - // currentPreTreatmentState = handleInstallState(); + case TD_PRE_TREATMENT_CONFIRM_RX_STATE: + // Confirm Rx state + currentPreTreatmentState = handleRxState(); break; + case TD_PRE_TREATMENT_RECIRCULATE_STATE: + currentPreTreatmentState = handleRecirculateState(); + break; + + case TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: + // currentPreTreatmentState = handlePatientConnectionState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); + break; + } + + if ( prevPreTreatmentState != currentPreTreatmentState ) + { + setPreTreatStateTransition(); + } + + return (U32)currentPreTreatmentState; +} + +/*********************************************************************//** +* @brief +* The setPreTreatStateTransition function sets the actuators and variables +* for the state transition in Pre-Treatment mode. +* @details \b Inputs: currentPreTreatmentState +* @details \b Outputs: Actuate valves, pumps as desired +* @return none +**************************************************************************/ +static void setPreTreatStateTransition( void ) +{ + switch ( currentPreTreatmentState ) + { + case TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE: + // H4 and H5 are controlled by the Tube Set Install Service. + setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + stopSyringePump(); + break; + case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - // currentPreTreatmentState = handleSelfTestDryState(); + // TODO: actuator configuration break; case TD_PRE_TREATMENT_PRIME_STATE: - // currentPreTreatmentState = handlePrimeState(); + // TODO: actuator configuration break; - case TD_PRE_TREATMENT_RECIRCULATE_STATE: - // currentPreTreatmentState = handleRecirculateState(); + case TD_PRE_TREATMENT_CONFIRM_RX_STATE: + // No action required. break; - case TD_PRE_TREATMENT_CONFIRM_RX_STATE: - // Confirm Rx state - currentPreTreatmentState = handleRxState(); + case TD_PRE_TREATMENT_RECIRCULATE_STATE: + // No action required. break; case TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: - // currentPreTreatmentState = handlePatientConnectionState(); + // TODO: actuator configuration break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); break; } +} - return (U32)currentPreTreatmentState; +/*********************************************************************//** + * @brief + * The handleInstallState function calls Tube Set Install Service and + * advances to Self Test Dry state once the service signals + * completion. + * @details \b Inputs: none + * @details \b 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; + + // call tube set install service to auto-load tube set + execTubeSetInstall(); + + if ( TRUE == isTubeSetInstallComplete() ) + { + state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + } + + return state; } /*********************************************************************//** * @brief + * The handleSelfTestDryState function executes the Self Test Dry state + * of pre-treatment mode. + * @details \b Inputs: TODO fill up if any + * @details \b Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + + if ( TRUE == goToInstallStateRequested ) + { + goToInstallStateRequested = FALSE; + initTubeSetInstall(); + state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + } + + // TODO: Transition to Prime state on completion when implemented + // state = TD_PRE_TREATMENT_PRIME_STATE; + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePrimeState function executes the Prime state of + * pre-treatment mode. + * @details \b Inputs: TODO fill up if any + * @details \b Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_PRIME_STATE; + + // TODO: Transition to Recirculate state on completion when implemented + // state = TD_PRE_TREATMENT_RECIRCULATE_STATE; + + return state; +} + +/*********************************************************************//** + * @brief + * The handleRecirculateState function executes the Recirculate state of + * pre-treatment mode. + * @details \b Inputs: continueFromRecirculateRequested. + * @details \b Outputs: continueFromRecirculateRequested. + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_RECIRCULATE_STATE; + + execPreTxRecirculate(); + + if ( TRUE == continueFromRecirculateRequested ) + { + continueFromRecirculateRequested = FALSE; + + // TODO: Change to TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE + // when Patient Connection state is implemented. + // state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + + requestNewOperationMode( MODE_TREA ); + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleRxState function executes the Confirm Rx pre-treatment step. - * @details Inputs: none - * @details Outputs: Requests transition to Treatment mode when the prescription + * @details \b Inputs: none + * @details \b Outputs: Requests transition to the next Pre-Treatment state when the prescription * is valid and confirmed otherwise remains in Confirm Rx. - * @return next Pre-Treatment mode sub-state. + * @return next Pre-Treatment mode state. *************************************************************************/ static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ) { @@ -154,7 +315,7 @@ TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_CONFIRM_RX_STATE; DD_OP_MODE_T ddOpMode = getDDOpMode(); - // Valid + confirmed – move to next state: Patient Connection + // Valid + confirmed – move to next state: Recirculate State if ( ( TRUE == paramsValid ) && ( TRUE == paramsConfirmed ) ) { // TODO this command of requesting dialysate delivery will move to appropriate state in pre-treatment once implemented @@ -170,22 +331,63 @@ getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); } - // TODO: when additional Pre-Treatment states are implemented, change to TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE. - // state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; - if ( ( ddOpMode == DD_MODE_GEND ) && ( TRUE == isDialysateGoodToDeliver ) ) - { - requestNewOperationMode( MODE_TREA ); - } - } + state = TD_PRE_TREATMENT_RECIRCULATE_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePatientConnectionState function executes the Patient + * Connection state of pre-treatment mode. + * @details \b Inputs: TODO fill up if any + * @details \b Outputs: TODO fill up if any + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + + // TODO : after implementing this state, place the transition in the right place + + //requestNewOperationMode( MODE_TREA ); + return state; } /*********************************************************************//** * @brief + * The PreTxRequestTubeSetInstall function signals a request to transition + * the Pre-Treatment mode state machine to Install state. + * @details \b Inputs: none + * @details \b Outputs: goToInstallStateRequested + * @return none + *************************************************************************/ +void PreTxRequestTubeSetInstall( void ) +{ + goToInstallStateRequested = TRUE; +} + +/*********************************************************************//** + * @brief + * The PreTxRequestContinueFromRecirculate function signals a request to + * transition the Pre-Treatment mode state machine to Patient Connection state. + * @details \b Inputs: none + * @details \b Outputs: continueFromRecirculateRequested + * @return none + *************************************************************************/ +void PreTxRequestContinueFromRecirculate( void ) +{ + continueFromRecirculateRequested = TRUE; +} + +/*********************************************************************//** + * @brief * The signalAlarmActionToPreTreatmentMode function executes the given alarm action * as appropriate while in Pre-Treatment Mode. - * @details \b Inputs: none + * @details \b Inputs: currentPreTreatmentState * @details \b Outputs: given alarm action executed * @param action ID of alarm action to execute * @return none @@ -198,6 +400,13 @@ // TODO add logic once we have pre-treatment mode developed break; + case ALARM_ACTION_RESUME: + if ( TD_PRE_TREATMENT_RECIRCULATE_STATE == currentPreTreatmentState ) + { + signalResumePreTxRecirculate(); + } + break; + default: // do not handle other actions in pre-treatment mode break;