Index: firmware/App/Modes/StateTxPaused.c =================================================================== diff -u -r6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543 -r6f876554db45a19590eaf2122ef47e33f7a7d69b --- firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision 6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543) +++ firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision 6f876554db45a19590eaf2122ef47e33f7a7d69b) @@ -20,6 +20,7 @@ #include "Buttons.h" #include "Common.h" #include "DDInterface.h" +#include "FluidBolus.h" #include "Messaging.h" #include "ModeTreatment.h" //#include "NVDataMgmt.h" @@ -48,6 +49,7 @@ static U32 bloodSittingTimerCtr; ///< Timer counter tracks time in this mode while blood is sitting. 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. // ********** private function prototypes ********** @@ -56,6 +58,7 @@ static TREATMENT_PAUSED_STATE_T handleTreatmentPausedBloodRecircState( void ); static TREATMENT_PAUSED_STATE_T handleTreatmentPausedNoRecircState( void ); static TREATMENT_PAUSED_STATE_T handleTreatmentPausedRecoverBloodDetectState( void ); +static TREATMENT_PAUSED_STATE_T handleTreatmentPausedFluidBolusState( void ); static void handleTreatmentPausedBloodSittingTimer( void ); static TREATMENT_PAUSED_STATE_T handleTreatmentPausedAlarmsAndSignals( TREATMENT_PAUSED_STATE_T state ); static void transitionToTxPausedState( TREATMENT_PAUSED_STATE_T newState ); @@ -112,9 +115,6 @@ // TODO figure out the code // signalInitiatePressureStabilization( USE_NORMAL_STABILIZATION_PERIOD ); - // Reset saline bolus state in case alarm interrupted one -// resetSalineBolus(); - // Reset blood leak zeroing params // resetBloodLeakZeroingVariables(); @@ -169,6 +169,10 @@ currentTxPausedState = handleTreatmentPausedRecoverBloodDetectState(); break; + case TREATMENT_PAUSED_FLUID_BOLUS_STATE: + currentTxPausedState = handleTreatmentPausedFluidBolusState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, currentTxPausedState ); break; @@ -290,6 +294,64 @@ /*********************************************************************//** * @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 + * @details \b Outputs: currentTxPausedState + * @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() ) ) + { + signalAbortFluidBolus(); + } + + // Run the bolus service every tick + execFluidBolus(); + + // Bolus complete or aborted — return to appropriate paused recirc sub-state + if ( FALSE == isFluidBolusActive() ) + { + state = pauseBolusResumeState; + transitionToTxPausedState( state ); + } + + return state; +} + +/*********************************************************************//** + * @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 + *************************************************************************/ +void signalPauseTreatFluidBolusRequest( void ) +{ + if ( ( TREATMENT_PAUSED_RECIRC_STATE == currentTxPausedState ) || ( TREATMENT_PAUSED_RECIRC_BLOOD_ONLY_STATE == currentTxPausedState ) ) + { + pauseBolusResumeState = currentTxPausedState; + currentTxPausedState = TREATMENT_PAUSED_FLUID_BOLUS_STATE; + } +} + +/*********************************************************************//** + * @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.