Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r3f325a9fe7cbfb660a3ddf274d471d635266c586 -r3f0d1433b3481160bf554aaf7371708380211a36 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 3f325a9fe7cbfb660a3ddf274d471d635266c586) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 3f0d1433b3481160bf554aaf7371708380211a36) @@ -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 @@ -25,6 +25,7 @@ #include "ModePreTreat.h" #include "OperationModes.h" #include "TaskGeneral.h" +#include "StatePreTxHeparinSetup.h" #include "StatePreTxRecirculate.h" #include "SyringePump.h" #include "TaskGeneral.h" @@ -51,23 +52,35 @@ // ********** 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 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 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; ///< 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. -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; + // ********** private function prototypes ********** static void setPreTreatStateTransition( void ); ///< Configure actuators and variables for Pre-Treatment state transitions. @@ -76,6 +89,7 @@ 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 handleHeparinSetupState( void ); ///< Handle Heparin Setup state during Pre-Treatment. static TD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); ///< Handle Patient Connection state during Pre-Treatment static void publishPreTreatmentStates( void ); ///< Publish Pre-Treatment states to the UI. @@ -89,23 +103,56 @@ **************************************************************************/ 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; + 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 @@ -172,6 +219,10 @@ currentPreTreatmentState = handleRecirculateState(); break; + case TD_PRE_TREATMENT_HEPARIN_SETUP_STATE: + currentPreTreatmentState = handleHeparinSetupState(); + break; + case TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: currentPreTreatmentState = handlePatientConnectionState(); break; @@ -183,6 +234,12 @@ break; } + if ( prevPreTreatmentState != currentPreTreatmentState ) + { + setPreTreatStateTransition(); + } + publishPreTreatmentStates(); + return (U32)currentPreTreatmentState; } @@ -222,7 +279,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - // TODO: actuator configuration + transitionToDrySelfTests(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -233,6 +290,10 @@ // No action required. break; + case TD_PRE_TREATMENT_HEPARIN_SETUP_STATE: + // Heparin Setup transition is already handled in handleRxState(). + break; + case TD_PRE_TREATMENT_RECIRCULATE_STATE: // No action required. break; @@ -271,12 +332,12 @@ { TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; - // call tube set install service to auto-load tube set + // Call Tube Set Install Service to auto-load the tube set. execTubeSetInstall(); if ( TRUE == isTubeSetInstallComplete() ) { - state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE ; } return state; @@ -302,10 +363,11 @@ execDrySelfTests(); // Handle install request to failure path - if ( TRUE == tubeSetInstallRequested ) + if ( TRUE == goToInstallStateRequested ) { - tubeSetInstallRequested = FALSE; -// state = TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + goToInstallStateRequested = FALSE; + initTubeSetInstall(); + state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; } if ( DRY_SELF_TESTS_COMPLETE_STATE == getDrySelfTestsState() ) @@ -364,6 +426,29 @@ /*********************************************************************//** * @brief + * The handleHeparinSetupState function executes the Heparin Setup state of + * pre-treatment mode. + * @details \b Inputs: continueFromHeparinSetupRequested. + * @details \b Outputs: continueFromHeparinSetupRequested + * @return next Pre-Treatment mode state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleHeparinSetupState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_HEPARIN_SETUP_STATE; + + execPreTxHeparinSetup(); + + if ( TRUE == continueFromHeparinSetupRequested ) + { + continueFromHeparinSetupRequested = FALSE; + state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleRxState function executes the Confirm Rx pre-treatment step. * @details \b Inputs: none * @details \b Outputs: Requests transition to the next Pre-Treatment state when the prescription @@ -374,6 +459,8 @@ { BOOL paramsValid = getValidTreatParamsReceived(); BOOL paramsConfirmed = getTreatParamsConfirmed(); + BOOL heparinIsPrescribed = ( ( getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ) > 0.0F ) || + ( getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ) > 0.0F ) ) ? TRUE : FALSE; BOOL isDialysateGoodToDeliver = TRUE; // TODO replace TRUE with getDialysateGoodToDeliverStatus() when we are ready F32 bicarbConvFactor = BICARBONATE_CONVERSION_FACTOR; F32 presUFVolumeL = 0.0F; @@ -382,10 +469,9 @@ 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: Recirculate State + // Valid + confirmed – move to Heparin Setup or Patient Connection. if ( ( TRUE == paramsValid ) && ( TRUE == paramsConfirmed ) ) { - // TODO this command of requesting dialysate delivery will move to appropriate state in pre-treatment once implemented if ( ( ddOpMode == DD_MODE_PREG ) && ( ddSubMode == DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND ) ) { presUFVolumeL = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); @@ -398,11 +484,18 @@ getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); } + if ( TRUE == heparinIsPrescribed ) + { + transitionToPreTxHeparinSetup(); + state = TD_PRE_TREATMENT_HEPARIN_SETUP_STATE; + } + else + { + state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + } + } - state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; - } - - return state; + return state; } /*********************************************************************//** @@ -455,92 +548,142 @@ /*********************************************************************//** * @brief - * The handleStartTreatmentRequest function handles the UI request to - * start treatment. - * @details \b Message \b Received: MSG_ID_UI_START_TREATMENT_REQUEST. - * @details \b Message \b Sent: MSG_ID_TD_START_TREATMENT_RESPONSE. - * @details \b Inputs: current operation mode and Pre-Treatment state. - * @details \b Outputs: treatmentStartRequested. - * @param message Pointer to the received Start Treatment request message. - * @return TRUE if the request was accepted, otherwise FALSE. + * The PreTxRequestContinueFromHeparinSetupRequested function signals a request to + * transition the Pre-Treatment mode state machine to Patient Connection state. + * @details \b Inputs: none + * @details \b Outputs: continueFromHeparinSetupRequested + * @return none *************************************************************************/ +void PreTxRequestContinueFromHeparinSetupRequested( void ) +{ + continueFromHeparinSetupRequested = TRUE; +} + +/*********************************************************************//** +* @brief +* The handleStartTreatmentRequest function handles the UI request to +* start treatment. +* @details \b Message \b Received: MSG_ID_UI_START_TREATMENT_REQUEST. +* @details \b Message \b Sent: MSG_ID_TD_START_TREATMENT_RESPONSE. +* @details \b Inputs: current operation mode and Pre-Treatment state. +* @details \b Outputs: treatmentStartRequested. +* @param message Pointer to the received Start Treatment request message. +* @return TRUE if the request was accepted, otherwise FALSE. +*************************************************************************/ 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 ) && - ( TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == preTxState ) ) + 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, - (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); + 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; } /*********************************************************************//** - * @brief - * The signalPreTreatmentBackoutToStandby function handles a request to - * back out of Pre-Treatment to Standby. - * @details \b Inputs: current operation mode, currentPreTreatmentState, - * and Tube Set Install state. - * @details \b Outputs: Requests Standby Mode when backout is allowed. - * @return TRUE if the request is accepted, otherwise FALSE. - *************************************************************************/ +* @brief +* The signalPreTreatmentBackoutToStandby function handles a request to +* back out of Pre-Treatment to Standby. +* @details \b Inputs: current operation mode, currentPreTreatmentState, +* and Tube Set Install state. +* @details \b Outputs: Requests Standby Mode when backout is allowed. +* @return TRUE if the request is accepted, otherwise FALSE. +*************************************************************************/ BOOL signalPreTreatmentBackoutToStandby( void ) { - BOOL accepted = FALSE; + BOOL accepted = FALSE; - if ( ( MODE_PRET == getCurrentOperationMode() ) && - ( TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE == currentPreTreatmentState ) && - ( TRUE == isTubeSetInstallAwaitingConfirmation() ) ) - { - requestNewOperationMode( MODE_STAN ); - accepted = TRUE; - } + if ( ( MODE_PRET == getCurrentOperationMode() ) && + ( TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE == currentPreTreatmentState ) && + ( TRUE == isTubeSetInstallAwaitingConfirmation() ) ) + { + requestNewOperationMode( MODE_STAN ); + accepted = TRUE; + } - return accepted; + return accepted; } /*********************************************************************//** * @brief * The signalAlarmActionToPreTreatmentMode function executes the given alarm action * as appropriate while in Pre-Treatment Mode. - * @details \b Inputs: currentPreTreatmentState - * @details \b Outputs: given alarm action executed - * @param action ID of alarm action to execute + * @details \b Inputs: currentPreTreatmentState and current Heparin Setup sub-state. + * @details \b Outputs: Alarm action handled for the active Pre-Treatment state. + * @param action ID of alarm action to execute. * @return none *************************************************************************/ void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ) { switch ( action ) { case ALARM_ACTION_STOP: - // TODO add logic once we have pre-treatment mode developed + // TODO add logic once we have pre-treatment mode developed. break; case ALARM_ACTION_RESUME: - 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(); - } - break; + } + else if ( TD_PRE_TREATMENT_HEPARIN_SETUP_STATE == currentPreTreatmentState ) + { + signalResumePreTxHeparinSetup(); + } + else + { + // 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() ) && + ( FALSE == isAlarmActive( ALARM_ID_TD_PRE_TX_HEPARIN_LOAD_SYRINGE ) ) ) + { + // OK on the Load Syringe clear-only alarm confirms that + // the syringe was loaded and resumes the paused state. + signalResumePreTxHeparinSetup(); + } + break; + default: - // do not handle other actions in pre-treatment mode + // Do not handle other actions in Pre-Treatment mode. break; } } @@ -564,7 +707,7 @@ payload.mSubMode = (U32)currentPreTreatmentState; payload.mInstallState = (U32)getTubeSetInstallState(); - payload.mSelfTestDryState = 0; + payload.mSelfTestDryState = getDrySelfTestsState(); payload.mPrimeState = 0; payload.mRecirculateState = getPreTxRecirculateState(); payload.mConfirmRxState = 0;