Index: firmware/App/Modes/StateTxDialysis.c =================================================================== diff -u -re9e339870c5ed01230963f00d400331ab879c91f -r1abc0349c736a70fb56db6895947abfbba0eee22 --- firmware/App/Modes/StateTxDialysis.c (.../StateTxDialysis.c) (revision e9e339870c5ed01230963f00d400331ab879c91f) +++ firmware/App/Modes/StateTxDialysis.c (.../StateTxDialysis.c) (revision 1abc0349c736a70fb56db6895947abfbba0eee22) @@ -8,7 +8,7 @@ * @file StateTxDialysis.c * * @author (last) Raghu Kallala -* @date (last) 17-Apr-2026 +* @date (last) 04-May-2026 * * @author (original) Sean Nash * @date (original) 21-Apr-2025 @@ -20,6 +20,7 @@ #include "BloodFlow.h" #include "Buttons.h" #include "DDInterface.h" +#include "FluidBolus.h" #include "Messaging.h" #include "ModeTreatment.h" //#include "NVDataMgmt.h" @@ -40,23 +41,27 @@ // ********** private data ********** static DIALYSIS_STATE_T currentDialysisState; ///< Current state of the dialysis sub-mode state machine. +static DIALYSIS_STATE_T dialysisResumeState; ///< Dialysis sub-state prior to fluid bolus. static U32 setBloodFlowRate; ///< Currently set blood flow rate (from prescription). static U32 setDialysateFlowRate; ///< Currently set dialysate flow rate (from prescription). static F32 setUFVolumeL; ///< Currently set total ultrafiltration volume (in L) for treatment (from prescription). -static F32 setUFRateLHr; ///< Currently set ultrafiltration rate (in L/hr from prescription). +static F32 setUFRateMlMin; ///< Currently set ultrafiltration rate (in mL/min from prescription). static OVERRIDE_F32_T measUFVolumeL; ///< Current total measured volume (in L) for ultrafiltration . static BOOL ufPauseRequested; ///< Flag indicates UF pause has been requested by user. static BOOL ufResumeRequested; ///< Flag indicates UF resume has been requested by user. static BOOL autoResumeUF; ///< Flag indicates UF should be auto-resumed after saline bolus completes. +static BOOL fluidBolusRequested; ///< Flag indicating fluid bolus has been requested by user. +static BOOL bolusStarted; ///< Flag indicating fluid bolus start signal has been sent. // ********** private function prototypes ********** static void transitionToDialysisState( DIALYSIS_STATE_T newState ); static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ); static DIALYSIS_STATE_T handleDialysisUltrafiltrationPausedState( void ); +static DIALYSIS_STATE_T handleDialysisFluidBolusState( void ); static void updateUFVolume( void ); @@ -72,6 +77,7 @@ void initDialysis( void ) { currentDialysisState = DIALYSIS_UF_STATE; + dialysisResumeState = DIALYSIS_UF_STATE; measUFVolumeL.data = 0.0F; measUFVolumeL.ovData = 0.0F; @@ -81,11 +87,13 @@ setBloodFlowRate = 0; setDialysateFlowRate = 0; setUFVolumeL = 0.0F; - setUFRateLHr = 0.0F; + setUFRateMlMin = 0.0F; ufPauseRequested = FALSE; ufResumeRequested = FALSE; autoResumeUF = FALSE; + fluidBolusRequested = FALSE; + bolusStarted = FALSE; } /*********************************************************************//** @@ -115,7 +123,7 @@ setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); // Set actuators as appropriate for state - cmdStartGenerateDialysate( setDialysateFlowRate, setUFRateLHr, dialTemp, FALSE, + cmdStartGenerateDialysate( setDialysateFlowRate, setUFRateMlMin, dialTemp, FALSE, acidConvFactor, bicarbConvFactor, sodium, bicarbonate ); transitionToDialysisState( currentDialysisState ); @@ -141,7 +149,7 @@ setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); // set arterial valve to pump blood from patient setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); // set venous valve to open, allowing blood to return to patient setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - cmdChangeQuf( setUFRateLHr ); + cmdChangeQuf( setUFRateMlMin ); // Start auto-control of air trap valve startAirTrapControl(); @@ -160,6 +168,13 @@ startAirTrapControl(); break; + case DIALYSIS_UF_FLUID_BOLUS_STATE: + // State prior to bolus + dialysisResumeState = currentDialysisState; + cmdBypassDialyzer( TRUE ); + cmdChangeQuf( 0.0F ); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TX_DIALYSIS_INVALID_STATE1, (U32)newState ) break; @@ -219,17 +234,17 @@ * The setDialysisDDParams function sets the dialysate rate and ultrafiltration * volume and rate parameters. * @details \b Inputs: none - * @details \b Outputs: setDialysateFlowRate, setUFVolumeL, setUFRateLHr + * @details \b Outputs: setDialysateFlowRate, setUFVolumeL, setUFRateMlMin * @param qd target dialysate flow rate (in mL/min) - * @param ufVol target ultrafiltration volume (in L) - * @param quf target ultrafiltration flow rate (in L/hr) + * @param ufVol target ultrafiltration volume (in mL) + * @param quf target ultrafiltration flow rate (in mL/min) * @return none *************************************************************************/ void setDialysisDDParams( U32 qd, F32 ufVol, F32 quf ) { setDialysateFlowRate = qd; setUFVolumeL = ufVol; - setUFRateLHr = quf; + setUFRateMlMin = quf; } /*********************************************************************//** @@ -238,7 +253,7 @@ * ultrafiltration. * @details \b Message \b Sent: MSG_ID_TD_UF_PAUSE_RESUME_RESPONSE * @details \b Message \b Sent: UF_START_PAUSE_EVENT / UF_START_RESUME_EVENT - * @details \b Inputs: currentDialysisState, setUFRateLHr + * @details \b Inputs: currentDialysisState, setUFRateMlMin * @details \b Outputs: ufPauseRequested, ufResumeRequested * @param message Message from UI which includes a flag indicating whether * to pause or resume ultrafiltration. @@ -267,9 +282,9 @@ { ufResumeRequested = TRUE; response.accepted = TRUE; - if ( setUFRateLHr > 0.0 ) + if ( setUFRateMlMin > 0.0 ) { - //sendTreatmentLogEventData( UF_START_RESUME_EVENT, 0.0, setUFRateLHr ); + //sendTreatmentLogEventData( UF_START_RESUME_EVENT, 0.0, setUFRateMlMin ); } } else @@ -295,9 +310,9 @@ { ufPauseRequested = TRUE; response.accepted = TRUE; - if ( setUFRateLHr > 0.0 ) + if ( setUFRateMlMin > 0.0 ) { - //sendTreatmentLogEventData( UF_PAUSE_EVENT, setUFRateLHr, 0.0 ); + //sendTreatmentLogEventData( UF_PAUSE_EVENT, setUFRateMlMin, 0.0 ); } } else @@ -369,6 +384,10 @@ currentDialysisState = handleDialysisUltrafiltrationPausedState(); break; + case DIALYSIS_UF_FLUID_BOLUS_STATE: + currentDialysisState = handleDialysisFluidBolusState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TX_DIALYSIS_INVALID_STATE1, (U32)currentDialysisState ) break; @@ -388,8 +407,8 @@ * @brief * The handleDialysisUltrafiltrationState function handles the ultrafiltration * state of the Dialysis state machine. - * @details \b Inputs: ufPauseRequested - * @details \b Outputs: ufPauseRequested + * @details \b Inputs: ufPauseRequested, fluidBolusRequested + * @details \b Outputs: ufPauseRequested, fluidBolusRequested * @return next Dialysis state. *************************************************************************/ static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ) @@ -402,6 +421,17 @@ transitionToDialysisState( DIALYSIS_UF_PAUSED_STATE ); result = DIALYSIS_UF_PAUSED_STATE; } + // When UI requests fluid bolus + else if ( TRUE == fluidBolusRequested ) + { + fluidBolusRequested = FALSE; + transitionToDialysisState( DIALYSIS_UF_FLUID_BOLUS_STATE ); + result = DIALYSIS_UF_FLUID_BOLUS_STATE; + } + else + { + // No action required. + } return result; } @@ -430,6 +460,36 @@ /*********************************************************************//** * @brief + * The handleDialysisFluidBolusState function handles the fluid bolus + * sub-state of the Dialysis state machine. Signals the fluid bolus + * service to start. + * @details \b Inputs: dialysisResumeState, bolusStarted + * @details \b Outputs: bolusStarted + * @return next dialysis state. + *************************************************************************/ +static DIALYSIS_STATE_T handleDialysisFluidBolusState( void ) +{ + DIALYSIS_STATE_T result = DIALYSIS_UF_FLUID_BOLUS_STATE; + + // Start fluid bolus if not started + if ( FALSE == bolusStarted ) + { + bolusStarted = signalStartFluidBolus( setBloodFlowRate ); + } + // Restore actuators and return to pre-bolus sub-state upon bolus complete or abort + else if ( FALSE == isFluidBolusActive() ) + { + cmdBypassDialyzer( FALSE ); + transitionToDialysisState( dialysisResumeState ); + bolusStarted = FALSE; + result = dialysisResumeState; + } + + return result; +} + +/*********************************************************************//** + * @brief * The updateUFVolume function updates the total measured ultrafiltration * volume based on set rate and whether or not DD is currently running * the ultrafiltration pump. @@ -443,4 +503,26 @@ measUFVolumeL.data = 0.0F; // TODO } +/*********************************************************************//** + * @brief + * The signalDialysisFluidBolusRequest function signals a fluid bolus + * request to the Dialysis sub-mode. + * @details \b Inputs: currentDialysisState + * @details \b Outputs: fluidBolusRequested + * @return TRUE if request is accepted, FALSE if rejected. + *************************************************************************/ +BOOL signalDialysisFluidBolusRequest( void ) +{ + BOOL result = FALSE; + + // Only allow from UF state + if ( DIALYSIS_UF_STATE == currentDialysisState ) + { + fluidBolusRequested = TRUE; + result = TRUE; + } + + return result; +} + /**@}*/