Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r3ad3d957a31c79b3ff1e0da924627185d56fa642 -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 3ad3d957a31c79b3ff1e0da924627185d56fa642) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -8,7 +8,7 @@ * @file ModePreTreat.c * * @author (last) Vijay Pamula -* @date (last) 12-Aug-2026 +* @date (last) 17-Aug-2026 * * @author (original) Dara Navaei * @date (original) 25-Sep-2025 @@ -19,6 +19,7 @@ #include "AirTrap.h" #include "BloodFlow.h" #include "Buttons.h" +#include "DrySelfTests.h" #include "DDInterface.h" #include "Messaging.h" #include "ModePreTreat.h" @@ -42,6 +43,9 @@ // ********** private definitions ********** +/// Number of task cycles to delay UI transition after sub-mode completion. +#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 ) @@ -57,7 +61,9 @@ 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 alarmActionResumeReceived; ///< Flag indicates alarm action resume received. +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 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. @@ -66,14 +72,13 @@ static U32 lowQdTransitionStartTime; ///< Start time of the low Qd transition. static BOOL defaultQdApplied; ///< Flag indicating default Qd has been applied while Rx is unavailable. static BOOL preTreatmentRxUpdated; ///< Flag indicating a new or updated Rx was received. - static BOOL resumePreTxAlarmResponseRequest; ///< Flag indicates user has requested PreTx resume. // ********** private function prototypes ********** static void setPreTreatStateTransition( void ); static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); -static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); +static TD_PRE_TREATMENT_MODE_STATE_T handleDrySelfTestState( void ); static TD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); static TD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); @@ -101,6 +106,7 @@ continueFromRecirculateRequested = FALSE; continueFromHeparinSetupRequested = FALSE; treatmentStartRequested = FALSE; + submodeCompleteTransitionTimeCounter = 0; lowQdTransitionActive = FALSE; lowQdTransitionStartTime = 0U; defaultQdApplied = FALSE; @@ -114,6 +120,7 @@ PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, 0 }; + initDrySelfTests(); } /*********************************************************************//** @@ -167,7 +174,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - currentPreTreatmentState = handleSelfTestDryState(); + currentPreTreatmentState = handleDrySelfTestState(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -235,7 +242,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - // TODO: actuator configuration + transitionToDrySelfTests(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -304,26 +311,43 @@ /*********************************************************************//** * @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 executes the Dry Self-Test + * pre-treatment sub-mode. + * @details \b Inputs: alarmActionResumeReceived, + * goToInstallStateRequested, submodeCompleteTransitionTimeCounter, + * @details \b Outputs: alarmActionResumeReceived, + * goToInstallStateRequested, submodeCompleteTransitionTimeCounter + * @return current Pre-Treatment state *************************************************************************/ -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(); if ( TRUE == goToInstallStateRequested ) { goToInstallStateRequested = FALSE; - initTubeSetInstall(); + state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; } + else if ( DRY_SELF_TESTS_COMPLETE_STATE == getDrySelfTestsState() ) + { + if ( submodeCompleteTransitionTimeCounter++ >= SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ) + { + submodeCompleteTransitionTimeCounter = 0; + state = TD_PRE_TREATMENT_PRIME_STATE; + } + } + else + { + submodeCompleteTransitionTimeCounter = 0; + } - setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); - state = TD_PRE_TREATMENT_PRIME_STATE; - return state; } @@ -611,29 +635,29 @@ *************************************************************************/ BOOL handleStartTreatmentRequest( MESSAGE_T *message ) { - TD_OP_MODE_T mode = getCurrentOperationMode(); - TD_PRE_TREATMENT_MODE_STATE_T preTxState = currentPreTreatmentState; - U32 payloadLen = message->hdr.payloadLen; - BOOL accepted = FALSE; - UI_RESPONSE_PAYLOAD_T response; + TD_OP_MODE_T mode = getCurrentOperationMode(); + TD_PRE_TREATMENT_MODE_STATE_T preTxState = currentPreTreatmentState; + U32 payloadLen = message->hdr.payloadLen; + BOOL accepted = FALSE; + UI_RESPONSE_PAYLOAD_T response; - response.accepted = FALSE; - response.rejectionReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; + response.accepted = FALSE; + response.rejectionReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; - if ( ( 0U == payloadLen ) && ( MODE_PRET == mode ) && + if ( ( 0U == payloadLen ) && ( MODE_PRET == mode ) && ( TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == preTxState ) ) - { - treatmentStartRequested = TRUE; - accepted = TRUE; - response.accepted = TRUE; - response.rejectionReason = REQUEST_REJECT_REASON_NONE; - } + { + treatmentStartRequested = TRUE; + accepted = TRUE; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + } - sendMessage( MSG_ID_TD_START_TREATMENT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, + sendMessage( MSG_ID_TD_START_TREATMENT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); - return accepted; + return accepted; } /*********************************************************************//** @@ -691,9 +715,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 ) @@ -754,6 +781,7 @@ payload.mSubMode = (U32)currentPreTreatmentState; payload.mInstallState = (U32)getTubeSetInstallState(); payload.mSelfTestDryState = 0; + payload.mSelfTestDryState = getDrySelfTestsState(); payload.mPrimeState = 0; payload.mRecirculateState = getPreTxRecirculateState(); payload.mConfirmRxState = 0;