Index: firmware/App/Modes/StateTxPaused.c =================================================================== diff -u -r6f876554db45a19590eaf2122ef47e33f7a7d69b -r1abc0349c736a70fb56db6895947abfbba0eee22 --- firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision 6f876554db45a19590eaf2122ef47e33f7a7d69b) +++ firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision 1abc0349c736a70fb56db6895947abfbba0eee22) @@ -50,6 +50,8 @@ static U32 treatmentPausedPublishTimerCtr; ///< Timer counter (in GP task intervals) counts time to next treatment paused status broadcast. static OVERRIDE_U32_T treatmentPausedPublishInterval; ///< Interval (in task intervals) at which to publish treatment paused state data to CAN bus. static TREATMENT_PAUSED_STATE_T pauseBolusResumeState; ///< Treatment pause sub-state prior to bolus. +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 ********** @@ -81,6 +83,9 @@ treatmentPausedPublishInterval.ovData = TREATMENT_PAUSED_DATA_PUBLISH_INTERVAL; treatmentPausedPublishInterval.ovInitData = TREATMENT_PAUSED_DATA_PUBLISH_INTERVAL; treatmentPausedPublishInterval.override = OVERRIDE_RESET; + + fluidBolusRequested = FALSE; + bolusStarted = FALSE; } /*********************************************************************//** @@ -132,6 +137,9 @@ // coming back to stop state via non-alarm path, so no audio - just want alarm for its options signalAlarmSilence( ALARM_SILENCE_CMD_CANCEL ); } + + // Set if bolus is permitted or not. + setBolusPermitted( isBolusAllowedByActiveAlarms() ); } /*********************************************************************//** @@ -147,6 +155,13 @@ { TREATMENT_PAUSED_STATE_T priorSubState = currentTxPausedState; + if ( TRUE == fluidBolusRequested ) + { + fluidBolusRequested = FALSE; + pauseBolusResumeState = currentTxPausedState; + currentTxPausedState = TREATMENT_PAUSED_FLUID_BOLUS_STATE; + } + switch ( currentTxPausedState ) { case TREATMENT_PAUSED_RECIRC_STATE: @@ -300,31 +315,35 @@ * 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 - * @details \b Outputs: currentTxPausedState + * @details \b Inputs: bolusStarted + * @details \b Outputs: currentTxPausedState, bolusStarted * @return next treatment paused state. *************************************************************************/ static TREATMENT_PAUSED_STATE_T handleTreatmentPausedFluidBolusState( void ) { TREATMENT_PAUSED_STATE_T state = TREATMENT_PAUSED_FLUID_BOLUS_STATE; - // Signal start - signalStartFluidBolus(); - - // Monitor permitted alarms every tick - if ( ( TRUE == isFluidBolusActive() ) && ( FALSE == areAllActiveAlarmsPermittedForBolus() ) ) + // Start fluid bolus if not started + if ( FALSE == bolusStarted ) { - signalAbortFluidBolus(); + bolusStarted = signalStartFluidBolus( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ) ); } - - // Run the bolus service every tick - execFluidBolus(); - - // Bolus complete or aborted — return to appropriate paused recirc sub-state - if ( FALSE == isFluidBolusActive() ) + else { - state = pauseBolusResumeState; - transitionToTxPausedState( 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() ) + { + bolusStarted = FALSE; + state = pauseBolusResumeState; + transitionToTxPausedState( state ); + } } return state; @@ -333,21 +352,19 @@ /*********************************************************************//** * @brief * The signalPauseFluidBolusRequest function handles a fluid bolus request - * while in the Treatment Paused state. Transitions to the fluid bolus - * sub-state only from recirc sub-states where the blood pump is running. - * Not allowed from no-recirc or dialysate-only recirc sub-states since - * the blood pump is stopped in those states. - * @details \b Inputs: currentTxPausedState - * @details \b Outputs: currentTxPausedState - * @return none + * while in the Treatment Paused state. + * @details \b Inputs: none + * @details \b Outputs: fluidBolusRequested + * @return TRUE if request is accepted, FALSE if rejected. *************************************************************************/ -void signalPauseTreatFluidBolusRequest( void ) +BOOL signalPauseTreatFluidBolusRequest( void ) { - if ( ( TREATMENT_PAUSED_RECIRC_STATE == currentTxPausedState ) || ( TREATMENT_PAUSED_RECIRC_BLOOD_ONLY_STATE == currentTxPausedState ) ) - { - pauseBolusResumeState = currentTxPausedState; - currentTxPausedState = TREATMENT_PAUSED_FLUID_BOLUS_STATE; - } + BOOL result = FALSE; + + fluidBolusRequested = TRUE; + result = TRUE; + + return result; } /*********************************************************************//** @@ -529,6 +546,9 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, (U32)newState ) break; } + + // Set if bolus is permitted or not. + setBolusPermitted( isBolusAllowedByActiveAlarms() ); } /*********************************************************************//**