Index: firmware/App/Modes/StateTxBloodPrime.c =================================================================== diff -u -r6f876554db45a19590eaf2122ef47e33f7a7d69b -r1abc0349c736a70fb56db6895947abfbba0eee22 --- firmware/App/Modes/StateTxBloodPrime.c (.../StateTxBloodPrime.c) (revision 6f876554db45a19590eaf2122ef47e33f7a7d69b) +++ firmware/App/Modes/StateTxBloodPrime.c (.../StateTxBloodPrime.c) (revision 1abc0349c736a70fb56db6895947abfbba0eee22) @@ -70,6 +70,8 @@ static BOOL pendingPauseRequest; ///< Flag indicating UI has requested blood prime pause. static BOOL pendingResumeRequest; ///< Flag indicating UI has requested blood prime resume. static BOOL pendingFlowChangeRequest; ///< Flag indicating UI has requested blood prime flow change +static BOOL fluidBolusRequested; ///< Flag indicating fluid bolus has been requested by user. +static BOOL bolusStarted; ///< Flag indicating fluid bolus start signal has been sent. static F32 bloodPrimeRampFlowRate_mL_min; ///< Current blood pump ramp flow rate. static F32 bloodPrimeRampStep_mL; ///< Blood pump volume step size for ramping. @@ -95,9 +97,9 @@ static BLOOD_PRIME_STATE_T handleBloodPrimeRampState( void ); static BLOOD_PRIME_STATE_T handleBloodPrimeRunState( void ); static BLOOD_PRIME_STATE_T handleBloodPrimePausedState( void ); +static BLOOD_PRIME_STATE_T handleBloodPrimeFluidBolusState( void ); static void handleBloodPrimePauseTimer( void ); static void publishBloodPrimeData( void ); -static BLOOD_PRIME_STATE_T handleBloodPrimeFluidBolusState( void ); /*********************************************************************//** * @brief @@ -132,6 +134,9 @@ } bloodPrimeRampStep_mL = rampRateSpan / estRampSeconds; bloodPrimeStartMS = 0; + + fluidBolusRequested = FALSE; + bolusStarted = FALSE; } /*********************************************************************//** @@ -191,6 +196,8 @@ pendingPauseRequest = FALSE; pendingResumeRequest = FALSE; pendingFlowChangeRequest = FALSE; + fluidBolusRequested = FALSE; + bolusStarted = FALSE; } /*********************************************************************//** @@ -303,6 +310,14 @@ bloodPrimeResumeState = BLOOD_PRIME_RUN_STATE; result = BLOOD_PRIME_RUN_STATE; } + // When UI requests fluid bolus + else if ( TRUE == fluidBolusRequested ) + { + fluidBolusRequested = FALSE; + bloodPrimeResumeState = bloodPrimeState; + lastBloodPrimeFlowRate_mL_min = getTargetBloodFlowRate(); + result = BLOOD_PRIME_FLUID_BOLUS_STATE; + } else { // Continue ramping @@ -358,6 +373,18 @@ pendingFlowChangeRequest = FALSE; setBloodPumpTargetFlowRate( requestedBloodFlowRate_mL_min, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); } + // When UI requests fluid bolus + else if ( TRUE == fluidBolusRequested ) + { + fluidBolusRequested = FALSE; + bloodPrimeResumeState = bloodPrimeState; + lastBloodPrimeFlowRate_mL_min = getTargetBloodFlowRate(); + result = BLOOD_PRIME_FLUID_BOLUS_STATE; + } + else + { + // No action required. + } return result; } @@ -391,6 +418,36 @@ /*********************************************************************//** * @brief + * The handleBloodPrimeFluidBolusState function handles the fluid bolus + * state of the blood prime sub-mode. + * @details \b Inputs: bloodPrimeResumeState, lastBloodPrimeFlowRate_mL_min + * @details \b Outputs: bloodPrimeState + * @return next blood prime state + *************************************************************************/ +static BLOOD_PRIME_STATE_T handleBloodPrimeFluidBolusState( void ) +{ + BLOOD_PRIME_STATE_T result = BLOOD_PRIME_FLUID_BOLUS_STATE; + + // Start fluid bolus if not started + if ( FALSE == bolusStarted ) + { + bolusStarted = signalStartFluidBolus( lastBloodPrimeFlowRate_mL_min ); + } + // Restore actuators and return to pre-bolus sub-state upon bolus complete or abort + else if ( FALSE == isFluidBolusActive() ) + { + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); + setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); + setBloodPumpTargetFlowRate( lastBloodPrimeFlowRate_mL_min, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + bolusStarted = FALSE; + result = bloodPrimeResumeState; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getCurrentBloodPrimeState function returns the current state of the * blood prime state. * @details \b Inputs: bloodPrimeState @@ -549,52 +606,23 @@ /*********************************************************************//** * @brief - * The handleBloodPrimeFluidBolusState function handles the fluid bolus - * state of the blood prime sub-mode. - * @details \b Inputs: bloodPrimeResumeState, bloodPrimeState - * @details \b Outputs: bloodPrimeState - * @return next blood prime state - *************************************************************************/ -static BLOOD_PRIME_STATE_T handleBloodPrimeFluidBolusState( void ) -{ - BLOOD_PRIME_STATE_T state = BLOOD_PRIME_FLUID_BOLUS_STATE; - - // start fluid bolus - signalStartFluidBolus(); - - // Call fluid bolus service - execFluidBolus(); - - if ( FALSE == isFluidBolusActive() ) - { - setBloodPumpTargetFlowRate( lastBloodPrimeFlowRate_mL_min, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - // Open art/ven pinch valves - setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); - setValvePosition( H19_VALV, VALVE_POSITION_B_OPEN ); - // Return to state prior to bolus - state = bloodPrimeResumeState; - } - - return state; -} - -/*********************************************************************//** - * @brief * The bloodPrimeSetPendingFluidBolusRequest function handles a fluid bolus * request while in blood prime sub-mode. * @details \b Inputs: bloodPrimeState - * @details \b Outputs: bloodPrimeResumeState, lastBloodPrimeFlowRate_mL_min, - * bloodPrimeState - * @return none + * @details \b Outputs: fluidBolusRequested + * @return TRUE if request is accepted, FALSE if rejected. *************************************************************************/ -void signalBloodPrimeFluidBolusRequest( void ) +BOOL signalBloodPrimeFluidBolusRequest( void ) { + BOOL result = FALSE; + if ( ( BLOOD_PRIME_RAMP_STATE == bloodPrimeState ) || ( BLOOD_PRIME_RUN_STATE == bloodPrimeState ) ) { - bloodPrimeResumeState = bloodPrimeState; - lastBloodPrimeFlowRate_mL_min = (U32)getTargetBloodFlowRate(); - bloodPrimeState = BLOOD_PRIME_FLUID_BOLUS_STATE; + fluidBolusRequested = TRUE; + result = TRUE; } + + return result; } /*********************************************************************//**