Index: firmware/App/Modes/StateTxPaused.c =================================================================== diff -u -r6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543 -r83163b27c604072469c28623ba0e4ed9786e294a --- firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision 6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543) +++ firmware/App/Modes/StateTxPaused.c (.../StateTxPaused.c) (revision 83163b27c604072469c28623ba0e4ed9786e294a) @@ -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,8 @@ 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. +static BOOL fluidBolusRequested; ///< Flag indicating fluid bolus has been requested by user. // ********** private function prototypes ********** @@ -56,6 +59,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 ); @@ -78,6 +82,8 @@ treatmentPausedPublishInterval.ovData = TREATMENT_PAUSED_DATA_PUBLISH_INTERVAL; treatmentPausedPublishInterval.ovInitData = TREATMENT_PAUSED_DATA_PUBLISH_INTERVAL; treatmentPausedPublishInterval.override = OVERRIDE_RESET; + + fluidBolusRequested = FALSE; } /*********************************************************************//** @@ -112,9 +118,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 +172,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 +297,60 @@ /*********************************************************************//** * @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 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() ) + { + result = handleTreatmentPausedAlarmsAndSignals( pauseBolusResumeState ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * 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 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 ) + { + fluidBolusRequested = TRUE; + result = TRUE; + } + + 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. @@ -337,8 +398,8 @@ TREATMENT_PAUSED_STATE_T result = state; BOOL bloodRecircBlocked = isBloodRecircBlocked(); BOOL dialysateRecircBlocked = isDialysateRecircBlocked(); - BOOL bldAlarmsStatus = FALSE; //( ( TRUE == isAlarmActive( ALARM_ID_HD_BLOOD_LEAK_RECOVERING_PLEASE_WAIT ) ) && - // ( FALSE == isAlarmActive( ALARM_ID_HD_BLOOD_LEAK_DETECTED ) ? TRUE : FALSE ) ); // TODO un-comment when BLD is coming up + BOOL bldAlarmsStatus = ( ( TRUE == isAlarmActive( ALARM_ID_DD_BLOOD_LEAK_RECOVERING_PLEASE_WAIT ) ) && + ( FALSE == isAlarmActive( ALARM_ID_DD_BLOOD_LEAK_DETECTED ) ? TRUE : FALSE ) ); if ( TRUE == bldAlarmsStatus ) { @@ -350,28 +411,40 @@ } else { + // Handle fluid bolus request from any paused sub-state + if ( TRUE == fluidBolusRequested ) + { + fluidBolusRequested = FALSE; + // State prior to bolus + pauseBolusResumeState = state; + // Start fluid bolus if not started + signalStartFluidBolus( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ) ); + result = TREATMENT_PAUSED_FLUID_BOLUS_STATE; + } // Both unblocked and not in recirculate both state - if ( ( TREATMENT_PAUSED_NO_RECIRC_STATE != state ) && ( FALSE == dialysateRecircBlocked ) && ( FALSE == bloodRecircBlocked ) ) + else if ( ( TREATMENT_PAUSED_NO_RECIRC_STATE != state ) && ( FALSE == dialysateRecircBlocked ) && + ( FALSE == bloodRecircBlocked ) && ( FALSE == isFluidBolusActive() ) ) { result = TREATMENT_PAUSED_RECIRC_STATE; transitionToTxPausedState( result ); } // Both blocked and not in stopped state - else if ( ( TREATMENT_PAUSED_NO_RECIRC_STATE != state ) && ( TRUE == dialysateRecircBlocked ) && ( TRUE == bloodRecircBlocked ) ) + else if ( ( TREATMENT_PAUSED_NO_RECIRC_STATE != state ) && ( TRUE == dialysateRecircBlocked ) && + ( TRUE == bloodRecircBlocked ) && ( FALSE == isFluidBolusActive() ) ) { result = TREATMENT_PAUSED_NO_RECIRC_STATE; transitionToTxPausedState( result ); } // Dialysate recirculation blocked and not in blood recirc state else if ( ( TREATMENT_PAUSED_RECIRC_BLOOD_ONLY_STATE != state ) && ( TRUE == dialysateRecircBlocked ) && - ( FALSE == bloodRecircBlocked ) ) + ( FALSE == bloodRecircBlocked ) && ( FALSE == isFluidBolusActive() ) ) { result = TREATMENT_PAUSED_RECIRC_BLOOD_ONLY_STATE; transitionToTxPausedState( result ); } // Blood recirculation blocked and not in dialysate recirc state else if ( ( TREATMENT_PAUSED_RECIRC_DIALYSATE_ONLY_STATE != state ) && ( TRUE == bloodRecircBlocked ) && - ( FALSE == dialysateRecircBlocked ) ) + ( FALSE == dialysateRecircBlocked ) && ( FALSE == isFluidBolusActive() ) ) { result = TREATMENT_PAUSED_RECIRC_DIALYSATE_ONLY_STATE; transitionToTxPausedState( result ); @@ -467,6 +540,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() ); } /*********************************************************************//**