Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r04ef70c52160801f0c5e121f8cdab829e2271f42 -r08fdaaf70ab5133cbe7d019905f745074a756027 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 04ef70c52160801f0c5e121f8cdab829e2271f42) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 08fdaaf70ab5133cbe7d019905f745074a756027) @@ -8,7 +8,7 @@ * @file ModePreTreat.c * * @author (last) Vijay Pamula -* @date (last) 31-Jul-2026 +* @date (last) 12-Aug-2026 * * @author (original) Dara Navaei * @date (original) 25-Sep-2025 @@ -19,12 +19,14 @@ #include "AirTrap.h" #include "BloodFlow.h" #include "Buttons.h" +#include "DrySelfTests.h" #include "DDInterface.h" #include "Messaging.h" #include "ModePreTreat.h" #include "OperationModes.h" #include "PinchValve.h" #include "Prime.h" +#include "TaskGeneral.h" #include "StatePreTxHeparinSetup.h" #include "StatePreTxRecirculate.h" #include "SyringePump.h" @@ -42,6 +44,8 @@ // ********** private definitions ********** +#define SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) + /// Interval (ms/task time) at which the Pre-Treatment state data is published on the CAN bus. #define PRE_TREATMENT_STATE_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) @@ -50,21 +54,42 @@ // ********** 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 Confirm Rx state. -static BOOL continueFromHeparinSetupRequested; ///< Flag indicating a request to transition to Patient Connection state. -static BOOL treatmentStartRequested; ///< Flag indicating the UI requested treatment start. -static U32 preTreatmentStateBroadcastTimerCtr; ///< Pre-Treatment state data broadcast timer counter. -static OVERRIDE_U32_T preTreatmentStatePublishInterval; ///< Pre-Treatment state data publication interval override. +//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 alarmActionResumeReceived; ///< Flag indicates alarm action resume received. +//static BOOL tubeSetInstallRequested; ///< Request to re-enter install flow (mid-treatment / failure) +//static U32 submodeCompleteTransitionTimeCounter; ///< Sub-mode completed transition wait time counter. +//static BOOL continueFromRecirculateRequested; ///< Flag indicating a request to transition to Patient Connection state. +//static BOOL treatmentStartRequested; ///< Flag indicating the UI requested treatment start. +//static U32 preTreatmentStateBroadcastTimerCtr; ///< Pre-Treatment state data broadcast timer counter. +//static OVERRIDE_U32_T preTreatmentStatePublishInterval; ///< Pre-Treatment state data publication interval override. +// +//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 Confirm Rx state. +//static BOOL continueFromHeparinSetupRequested; ///< Flag indicating a request to transition to Patient Connection state. +//static BOOL treatmentStartRequested; ///< Flag indicating the UI requested treatment start. +//static U32 preTreatmentStateBroadcastTimerCtr; ///< Pre-Treatment state data broadcast timer counter. +//static OVERRIDE_U32_T preTreatmentStatePublishInterval; ///< Pre-Treatment state data publication interval override. +static TD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; +static BOOL goToInstallStateRequested; +static BOOL alarmActionResumeReceived; +static U32 submodeCompleteTransitionTimeCounter; +static BOOL continueFromRecirculateRequested; +static BOOL continueFromHeparinSetupRequested; +static BOOL treatmentStartRequested; +static U32 preTreatmentStateBroadcastTimerCtr; +static OVERRIDE_U32_T preTreatmentStatePublishInterval; + + static BOOL resumePreTxAlarmResponseRequest; ///< Flag indicates user has requested PreTx resume. // ********** private function prototypes ********** 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 handleDrySelfTestState( 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 @@ -82,26 +107,56 @@ **************************************************************************/ void initPreTreatmentMode( void ) { - // Start a fresh Treatment Parameters session for this run. initTreatmentParameters(); - initPreTxHeparinSetup(); - - currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; goToInstallStateRequested = FALSE; + alarmActionResumeReceived = FALSE; continueFromRecirculateRequested = FALSE; continueFromHeparinSetupRequested = FALSE; treatmentStartRequested = FALSE; + submodeCompleteTransitionTimeCounter = 0; preTreatmentStateBroadcastTimerCtr = PRE_TREATMENT_STATE_DATA_PUB_INITIAL_OFFSET; - preTreatmentStatePublishInterval = (OVERRIDE_U32_T) { PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, 0 }; + initPreTxHeparinSetup(); + initDrySelfTests(); } + +//void initPreTreatmentMode( void ) +//{ +// // Start a fresh Treatment Parameters session for this run. +// initTreatmentParameters(); +// currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; +// goToInstallStateRequested = FALSE; +// continueFromRecirculateRequested = FALSE; +// treatmentStartRequested = FALSE; +// initPreTxHeparinSetup(); +// initDrySelfTests(); +// +// currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; +// goToInstallStateRequested = FALSE; +// continueFromRecirculateRequested = FALSE; +// continueFromHeparinSetupRequested = FALSE; +// treatmentStartRequested = FALSE; +// preTreatmentStateBroadcastTimerCtr = PRE_TREATMENT_STATE_DATA_PUB_INITIAL_OFFSET; +// alarmActionResumeReceived = FALSE; +// submodeCompleteTransitionTimeCounter = 0; +// +// preTreatmentStatePublishInterval = (OVERRIDE_U32_T) +// { +// PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, +// PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, +// PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, +// 0 +// }; +//} + /*********************************************************************//** * @brief * The transitionToPreTreatmentMode function prepares the system for @@ -153,15 +208,14 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - currentPreTreatmentState = handleSelfTestDryState(); + currentPreTreatmentState = handleDrySelfTestState(); break; case TD_PRE_TREATMENT_PRIME_STATE: currentPreTreatmentState = handlePrimeState(); break; case TD_PRE_TREATMENT_CONFIRM_RX_STATE: - // Confirm Rx state currentPreTreatmentState = handleRxState(); break; @@ -188,13 +242,25 @@ { setPreTreatStateTransition(); } - publishPreTreatmentStates(); return (U32)currentPreTreatmentState; } /*********************************************************************//** + * @brief + * The getPreTreatmentSubState function gets the current + * pre-treatment mode state. + * @details \b Inputs: currentPreTreatmentState + * @details \b Outputs: none + * @return currentPreTreatmentState + *************************************************************************/ +TD_PRE_TREATMENT_MODE_STATE_T getPreTreatmentSubState( void ) +{ + return currentPreTreatmentState; +} + +/*********************************************************************//** * @brief * The setPreTreatStateTransition function sets the actuators and variables * for the state transition in Pre-Treatment mode. @@ -217,7 +283,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - // TODO: actuator configuration + transitionToDrySelfTests(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -261,7 +327,6 @@ } /*********************************************************************//** - * @brief * The handleInstallState function calls Tube Set Install Service and * advances to Self Test Dry state once the service signals * completion. @@ -286,16 +351,24 @@ /*********************************************************************//** * @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. + * The handleDrySelfTestState function performs dry self-test. + * @details \b Inputs: none + * @details \b Outputs: transition to prime state on user request + * @return current state (sub-mode) *************************************************************************/ -static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +static TD_PRE_TREATMENT_MODE_STATE_T handleDrySelfTestState( void ) { TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + if ( TRUE == alarmActionResumeReceived ) + { + alarmActionResumeReceived = FALSE; + signalResumeDrySelfTests(); + } + + execDrySelfTests(); + + // Handle install request to failure path if ( TRUE == goToInstallStateRequested ) { goToInstallStateRequested = FALSE; @@ -305,6 +378,15 @@ setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); state = TD_PRE_TREATMENT_PRIME_STATE; + if ( DRY_SELF_TESTS_COMPLETE_STATE == getDrySelfTestsState() ) + { + if ( submodeCompleteTransitionTimeCounter++ >= SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ) + { + submodeCompleteTransitionTimeCounter = 0; + state = TD_PRE_TREATMENT_CONFIRM_RX_STATE; + //transitionToPrime(); + } + } return state; } @@ -575,9 +657,12 @@ break; case ALARM_ACTION_RESUME: - resumePreTxAlarmResponseRequest = TRUE; - if ( TD_PRE_TREATMENT_RECIRCULATE_STATE == currentPreTreatmentState ) - { + if ( TD_PRE_TREATMENT_SELF_TEST_DRY_STATE == currentPreTreatmentState ) + { + signalResumeDrySelfTests(); + } + else if ( TD_PRE_TREATMENT_RECIRCULATE_STATE == currentPreTreatmentState ) + { signalResumePreTxRecirculate(); } else if ( TD_PRE_TREATMENT_HEPARIN_SETUP_STATE == currentPreTreatmentState ) @@ -586,10 +671,24 @@ } else { - // No action required. + // No action required. } break; +// if ( TD_PRE_TREATMENT_RECIRCULATE_STATE == currentPreTreatmentState ) +// { +// signalResumePreTxRecirculate(); +// } +// else if ( TD_PRE_TREATMENT_HEPARIN_SETUP_STATE == currentPreTreatmentState ) +// { +// signalResumePreTxHeparinSetup(); +// } +// else +// { +// // No action required. +// } +// break; + case ALARM_ACTION_ACK: if ( ( TD_PRE_TREATMENT_HEPARIN_SETUP_STATE == currentPreTreatmentState ) && ( TRUE == isPreTxHeparinAwaitingSyringeLoadConfirmation() ) && @@ -637,7 +736,7 @@ payload.mSubMode = (U32)currentPreTreatmentState; payload.mInstallState = (U32)getTubeSetInstallState(); - payload.mSelfTestDryState = 0; + payload.mSelfTestDryState = getDrySelfTestsState(); payload.mPrimeState = 0; payload.mRecirculateState = getPreTxRecirculateState(); payload.mConfirmRxState = 0;