Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rfff7eb3560421130e0cd4788f84bce0a8ee7ff44 -rbbd48b033ef7307a30815e490eb28825c7afcc2b --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision fff7eb3560421130e0cd4788f84bce0a8ee7ff44) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision bbd48b033ef7307a30815e490eb28825c7afcc2b) @@ -8,24 +8,28 @@ * @file ModePreTreat.c * * @author (last) Vijay Pamula -* @date (last) 12-Jun-2026 +* @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 "HemoDiaFiltration.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 @@ -40,15 +44,13 @@ // ********** private function prototypes ********** -static TD_PRE_TREATMENT_MODE_STATE_T handleWaterSampleState( void ); ///< Handle Water Sample state during Pre-Treatment -static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestConsumableState( void ); ///< Handle Self Test Consumable state during Pre-Treatment -static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); ///< Handle Self Test No Cart state during Pre-Treatment -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 +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 @@ -103,6 +105,7 @@ U32 execPreTreatmentMode( void ) { BOOL stop = isStopButtonPressed(); + TD_PRE_TREATMENT_MODE_STATE_T prevPreTreatmentState = currentPreTreatmentState; if ( TRUE == stop ) { @@ -112,18 +115,6 @@ // Execute mode state machine switch ( currentPreTreatmentState ) { - case TD_PRE_TREATMENT_WATER_SAMPLE_STATE: - // currentPreTreatmentState = handleWaterSampleState(); - break; - - case TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE: - // currentPreTreatmentState = handleSelfTestConsumableState(); - break; - - case TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE: - // currentPreTreatmentState = handleSelfTestNoCartState(); - break; - case TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE: currentPreTreatmentState = handleInstallState(); break; @@ -154,61 +145,60 @@ break; } + if ( prevPreTreatmentState != currentPreTreatmentState ) + { + setPreTreatStateTransition(); + } + return (U32)currentPreTreatmentState; } /*********************************************************************//** - * @brief - * The handleWaterSampleState function executes the Water Sample 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 handleWaterSampleState( void ) +* @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 ) { - TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_WATER_SAMPLE_STATE; + 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; - // TODO: Transition to Self test consumable state on completion when implemented - // state = TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; + case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: + // TODO: actuator configuration + break; - return state; -} + case TD_PRE_TREATMENT_PRIME_STATE: + // TODO: actuator configuration + break; -/*********************************************************************//** - * @brief - * The handleSelfTestConsumableState function executes the Self Test - * Consumable 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 handleSelfTestConsumableState( void ) -{ - TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; + case TD_PRE_TREATMENT_CONFIRM_RX_STATE: + // No action required. + break; - // TODO: Transition to Self test no cart state on completion when implemented - // state = TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + case TD_PRE_TREATMENT_RECIRCULATE_STATE: + // No action required. + break; - return state; -} + case TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE: + // TODO: actuator configuration + break; -/*********************************************************************//** - * @brief - * The handleSelfTestNoCartState function executes the Self Test No Cart - * 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 handleSelfTestNoCartState( void ) -{ - TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE; - - // TODO: Transition to Tubing set install state on completion when implemented - // state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; - - return state; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); + break; + } } /*********************************************************************//** Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rfff7eb3560421130e0cd4788f84bce0a8ee7ff44 -rbbd48b033ef7307a30815e490eb28825c7afcc2b --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision fff7eb3560421130e0cd4788f84bce0a8ee7ff44) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision bbd48b033ef7307a30815e490eb28825c7afcc2b) @@ -7,8 +7,8 @@ * * @file ModeTreatment.c * -* @author (last) Praneeth Bunne -* @date (last) 04-Jun-2026 +* @author (last) Vijay Pamula +* @date (last) 26-Jun-2026 * * @author (original) Sean Nash * @date (original) 21-Apr-2025 @@ -218,8 +218,8 @@ getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); // Read back limits for transmit to UI. respRecord.artPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); - respRecord.venPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); - respRecord.venPresLimitAsymmetricmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); + respRecord.venPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_VEN_PRES_HIGH_LIMIT_WINDOW ); + respRecord.venPresLimitAsymmetricmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_VEN_PRES_LOW_LIMIT_WINDOW ); respRecord.tmpPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_TMP_PRES_LIMIT_WINDOW ); // Send response sendPressureLimitsChangeResponse( &respRecord ); Index: firmware/App/Modes/StateTxPaused.c =================================================================== diff -u -rfff7eb3560421130e0cd4788f84bce0a8ee7ff44 -rbbd48b033ef7307a30815e490eb28825c7afcc2b --- firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision fff7eb3560421130e0cd4788f84bce0a8ee7ff44) +++ firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision bbd48b033ef7307a30815e490eb28825c7afcc2b) @@ -8,7 +8,7 @@ * @file StateTxPaused.c * * @author (last) Praneeth Bunne -* @date (last) 29-May-2026 +* @date (last) 26-Jun-2026 * * @author (original) Sean Nash * @date (original) 21-Apr-2025 @@ -23,13 +23,15 @@ #include "FluidBolus.h" #include "HemoDiaFiltration.h" #include "Messaging.h" +#include "ModeStandby.h" #include "ModeTreatment.h" //#include "NVDataMgmt.h" #include "OperationModes.h" #include "RotaryValve.h" #include "StateTxPaused.h" #include "Switches.h" #include "TaskGeneral.h" +#include "TubeSetInstall.h" #include "TxParams.h" #include "Valves.h" #include "Valve3Way.h" @@ -66,6 +68,8 @@ static void transitionToTxPausedState( TREATMENT_PAUSED_STATE_T newState ); static void publishTreatmentPausedData( void ); +static BOOL isFluidBolusPermitted( void ); + /*********************************************************************//** * @brief * The initTreatmentPaused function initializes the Treatment Paused State unit. @@ -299,26 +303,15 @@ /*********************************************************************//** * @brief * The handleTreatmentPausedFluidBolusState function handles the fluid - * bolus sub-state of the Treatment Paused state machine. Entered either - * when an alarm fires during an active bolus in a calling state, or when - * the user requests a new bolus from the paused state. - * Monitors the permitted alarm set every tick — aborts the bolus if a - * non-permitted alarm becomes active. - * @details \b Inputs: none + * bolus sub-state of the Treatment Paused state machine. + * @details \b Inputs: pauseBolusResumeState * @details \b Outputs: currentTxPausedState * @return next treatment paused state. *************************************************************************/ static TREATMENT_PAUSED_STATE_T handleTreatmentPausedFluidBolusState( void ) { TREATMENT_PAUSED_STATE_T result = TREATMENT_PAUSED_FLUID_BOLUS_STATE; - // Monitor permitted alarms every tick - if ( ( TRUE == isFluidBolusActive() ) && ( FALSE == isBolusAllowedByActiveAlarms() ) ) - { - signalAbortFluidBolus(); - setBolusPermitted( FALSE ); - } - // Return to pre-bolus sub-state upon bolus complete or abort if ( FALSE == isFluidBolusActive() ) { @@ -333,15 +326,15 @@ * The signalPauseFluidBolusRequest function handles a fluid bolus request * while in the Treatment Paused state. Bolus request is rejected while in * Recover blood detect state. - * @details \b Inputs: currentTxPausedState + * @details \b Inputs: none * @details \b Outputs: fluidBolusRequested * @return TRUE if request is accepted, FALSE if rejected. *************************************************************************/ BOOL signalPauseTreatFluidBolusRequest( void ) { BOOL result = FALSE; - if ( TREATMENT_PAUSED_RECOVER_BLOOD_DETECT_STATE != currentTxPausedState ) + if ( TRUE == isFluidBolusPermitted() ) { fluidBolusRequested = TRUE; result = TRUE; @@ -352,6 +345,26 @@ /*********************************************************************//** * @brief + * The isFluidBolusPermitted function determines whether a fluid bolus + * is currently permitted or not. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if bolus is permitted, FALSE otherwise. + *************************************************************************/ +static BOOL isFluidBolusPermitted( void ) +{ + BOOL result = FALSE; + + if ( FLUID_TYPE_SALINE == getFluidType() ) + { + result = ( TRUE != isBloodRecircBlocked() ) ? TRUE : FALSE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The handleTreatmentPausedBloodSittingTimer function handles the no re-circ * blood timer. It should only be called when Blood is NOT circulating. * Increments and checks for warning and alarm timeouts. @@ -543,7 +556,7 @@ } // Set if bolus is permitted or not. - setBolusPermitted( isBolusAllowedByActiveAlarms() ); + setBolusPermitted( isFluidBolusPermitted() ); } /*********************************************************************//** Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -rfff7eb3560421130e0cd4788f84bce0a8ee7ff44 -rbbd48b033ef7307a30815e490eb28825c7afcc2b --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision fff7eb3560421130e0cd4788f84bce0a8ee7ff44) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision bbd48b033ef7307a30815e490eb28825c7afcc2b) @@ -7,8 +7,8 @@ * * @file AlarmMgmtSWFaults.h * -* @author (last) Vijay Pamula -* @date (last) 12-Jun-2026 +* @author (last) Praneeth Bunne +* @date (last) 02-Jul-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -197,6 +197,8 @@ SW_FAULT_ID_MODE_POST_TX_AUTO_EJECT_INVALID_STATE = 166, SW_FAULT_ID_INVALID_FLUID_BOLUS_STATE = 167, SW_FAULT_ID_PRE_TX_RECIRC_INVALID_STATE = 168, + SW_FAULT_ID_TD_VALVES_INVALID_VALVE2 = 169, + SW_FAULT_ID_INVALID_TUBE_SET_TYPE = 170, SW_FAULT_ID_HDF_INVALID_EXEC_STATE = 169, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -rfff7eb3560421130e0cd4788f84bce0a8ee7ff44 -rbbd48b033ef7307a30815e490eb28825c7afcc2b --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision fff7eb3560421130e0cd4788f84bce0a8ee7ff44) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision bbd48b033ef7307a30815e490eb28825c7afcc2b) @@ -7,8 +7,8 @@ * * @file DDInterface.c * -* @author (last) Praneeth Bunne -* @date (last) 27-May-2026 +* @author (last) Varshini Nagabooshanam +* @date (last) 15-Jun-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024