Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r3f032347c774cab541bd9efb143fa874f65d25e9 -r6bb89ac52fecee7db9dc69a3eb727cad0a66370e --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 3f032347c774cab541bd9efb143fa874f65d25e9) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 6bb89ac52fecee7db9dc69a3eb727cad0a66370e) @@ -20,8 +20,8 @@ #include "DDInterface.h" #include "ModePreTreat.h" #include "OperationModes.h" -#include "StatePreTxRecirculate.h" #include "StatePreTxHeparinSetup.h" +#include "StatePreTxRecirculate.h" #include "Timers.h" #include "TubeSetInstall.h" #include "TxParams.h" @@ -64,6 +64,8 @@ { // Start a fresh Treatment Parameters session for this run. initTreatmentParameters(); + initPreTxHeparinSetup(); + currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; goToInstallStateRequested = FALSE; continueFromRecirculateRequested = FALSE; @@ -349,6 +351,8 @@ { BOOL paramsValid = getValidTreatParamsReceived(); BOOL paramsConfirmed = getTreatParamsConfirmed(); + BOOL heparinIsPrescribed = ( ( getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ) > 0.0F ) || + ( getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ) > 0.0F ) ); BOOL isDialysateGoodToDeliver = TRUE; // TODO replace TRUE with getDialysateGoodToDeliverStatus() when we are ready F32 bicarbConvFactor = BICARBONATE_CONVERSION_FACTOR; F32 presUFVolumeL = 0.0F; @@ -357,7 +361,7 @@ TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_CONFIRM_RX_STATE; DD_OP_MODE_T ddOpMode = getDDOpMode(); - // Valid + confirmed – move to next state: Recirculate State + // Valid + confirmed – move to Heparin Setup or Patient Connection. if ( ( TRUE == paramsValid ) && ( TRUE == paramsConfirmed ) ) { // TODO this command of requesting dialysate delivery will move to appropriate state in pre-treatment once implemented @@ -373,11 +377,18 @@ getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); } + if ( TRUE == heparinIsPrescribed ) + { + transitionToPreTxHeparinSetup(); + state = TD_PRE_TREATMENT_HEPARIN_SETUP_STATE; + } + else + { + state = TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; + } + } - state = TD_PRE_TREATMENT_RECIRCULATE_STATE; - } - - return state; + return state; } /*********************************************************************//** @@ -463,7 +474,6 @@ else if ( TD_PRE_TREATMENT_HEPARIN_SETUP_STATE == currentPreTreatmentState ) { signalResumePreTxHeparinSetup(); - signalPreTxHeparinSyringeLoadConfirmed(); } break; Index: firmware/App/Modes/StatePreTxHeparinSetup.c =================================================================== diff -u -r3f032347c774cab541bd9efb143fa874f65d25e9 -r6bb89ac52fecee7db9dc69a3eb727cad0a66370e --- firmware/App/Modes/StatePreTxHeparinSetup.c (.../StatePreTxHeparinSetup.c) (revision 3f032347c774cab541bd9efb143fa874f65d25e9) +++ firmware/App/Modes/StatePreTxHeparinSetup.c (.../StatePreTxHeparinSetup.c) (revision 6bb89ac52fecee7db9dc69a3eb727cad0a66370e) @@ -30,6 +30,19 @@ // ********** private definitions ********** +/// Enumeration of Pre-Treatment Heparin Setup sub-states. +typedef enum +{ + PRE_TX_HEPARIN_SETUP_PRELOAD_STATE = 0, ///< Preload heparin syringe state. + PRE_TX_HEPARIN_SETUP_AWAIT_SYRINGE_LOAD_CONFIRMATION_STATE, ///< Await syringe load confirmation state. + PRE_TX_HEPARIN_SETUP_SEEK_STATE, ///< Seek syringe plunger state. + PRE_TX_HEPARIN_SETUP_PRIME_STATE, ///< Prime heparin line state. + PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE, ///< Heparin setup occlusion check state. + PRE_TX_HEPARIN_SETUP_BOLUS_STATE, ///< Deliver heparin bolus state. + PRE_TX_HEPARIN_SETUP_PAUSED_STATE, ///< Paused state. + NUM_OF_PRE_TX_HEPARIN_SETUP_STATES ///< Number of pre-treatment heparin setup substates. +} PRE_TX_HEPARIN_SETUP_STATE_T; + // ********** private data ********** static PRE_TX_HEPARIN_SETUP_STATE_T currentPreTxHeparinSetupState; ///< Current state of the pre-treatment heparin setup state machine. @@ -40,24 +53,17 @@ // ********** private function prototypes ********** -static void resetPreTxHeparinSetupFlags( void ); ///< Reset all pre-treatment heparin setup signal flags. +static void resetPreTxHeparinSetupFlags( void ); +static void setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_STATE_T state ); -static void setupPreTxHeparinPreload( void ); ///< Configure actuators for pre-treatment heparin preload state. -static void setupPreTxHeparinAwaitSyringeLoadConfirmation( void ); ///< Configure actuators for awaiting syringe load confirmation state. -static void setupPreTxHeparinSeek( void ); ///< Configure actuators for pre-treatment heparin seek state. -static void setupPreTxHeparinPrime( void ); ///< Configure actuators for pre-treatment heparin prime state. -static void setupPreTxHeparinOcclusionCheck( void ); ///< Configure actuators for pre-treatment heparin occlusion check state. -static void setupPreTxHeparinBolus( void ); ///< Configure actuators for pre-treatment heparin bolus state. -static void setupPreTxHeparinPaused( void ); ///< Configure actuators for pre-treatment heparin paused state. +static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinPreloadState( void ); +static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinAwaitSyringeLoadConfirmationState( void ); +static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinSeekState( void ); +static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinPrimeState( void ); +static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinOcclusionCheckState( void ); +static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinBolusState( void ); +static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinPausedState( void ); -static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinPreloadState( void ); ///< Handle pre-treatment heparin preload state. -static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinAwaitSyringeLoadConfirmationState( void ); ///< Handle awaiting syringe load confirmation state. -static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinSeekState( void ); ///< Handle pre-treatment heparin seek state. -static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinPrimeState( void ); ///< Handle pre-treatment heparin prime state. -static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinOcclusionCheckState( void ); ///< Handle pre-treatment heparin occlusion check state. -static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinBolusState( void ); ///< Handle pre-treatment heparin bolus state. -static PRE_TX_HEPARIN_SETUP_STATE_T handlePreTxHeparinPausedState( void ); ///< Handle pre-treatment heparin paused state. - /*********************************************************************//** * @brief * The initPreTxHeparinSetup function initializes the pre-treatment @@ -84,10 +90,6 @@ *************************************************************************/ void transitionToPreTxHeparinSetup( void ) { - initPreTxHeparinSetup(); - - setupPreTxHeparinPreload(); - setCurrentSubState( (U32)currentPreTxHeparinSetupState ); } @@ -203,97 +205,46 @@ /*********************************************************************//** * @brief - * The setupPreTxHeparinPreload function configures the syringe pump for - * pre-treatment heparin preload. - * @details Inputs: none - * @details Outputs: Syringe pump preload requested. + * The setupPreTxHeparinState function configures the syringe pump for the + * specified pre-treatment heparin setup state. + * @details Inputs: state + * @details Outputs: Syringe pump configured for the specified state. * @return none *************************************************************************/ -static void setupPreTxHeparinPreload( void ) +static void setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_STATE_T state ) { stopSyringePump(); - resetPreLoadStatus(); - (void)preloadSyringePlunger(); -} -/*********************************************************************//** - * @brief - * The setupPreTxHeparinAwaitSyringeLoadConfirmation function configures - * the syringe pump while waiting for syringe load confirmation. - * @details Inputs: none - * @details Outputs: Syringe pump stopped. - * @return none - *************************************************************************/ -static void setupPreTxHeparinAwaitSyringeLoadConfirmation( void ) -{ - stopSyringePump(); -} + switch ( state ) + { + case PRE_TX_HEPARIN_SETUP_PRELOAD_STATE: + resetPreLoadStatus(); + preloadSyringePlunger(); + break; -/*********************************************************************//** - * @brief - * The setupPreTxHeparinSeek function configures the syringe pump for seek. - * @details Inputs: none - * @details Outputs: Syringe pump seek requested. - * @return none - *************************************************************************/ -static void setupPreTxHeparinSeek( void ) -{ - stopSyringePump(); - (void)seekSyringePlunger(); -} + case PRE_TX_HEPARIN_SETUP_SEEK_STATE: + seekSyringePlunger(); + break; -/*********************************************************************//** - * @brief - * The setupPreTxHeparinPrime function configures the syringe pump for - * heparin line prime. - * @details Inputs: none - * @details Outputs: Syringe pump prime requested. - * @return none - *************************************************************************/ -static void setupPreTxHeparinPrime( void ) -{ - stopSyringePump(); - (void)primeSyringePump(); -} + case PRE_TX_HEPARIN_SETUP_PRIME_STATE: + primeSyringePump(); + break; -/*********************************************************************//** - * @brief - * The setupPreTxHeparinOcclusionCheck function configures the syringe pump - * for the occlusion check state. - * @details Inputs: none - * @details Outputs: Syringe pump stopped. - * @return none - *************************************************************************/ -static void setupPreTxHeparinOcclusionCheck( void ) -{ - stopSyringePump(); -} + case PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE: + // No additional setup required. + break; -/*********************************************************************//** - * @brief - * The setupPreTxHeparinBolus function configures the syringe pump for - * heparin bolus delivery. - * @details Inputs: none - * @details Outputs: Syringe pump bolus requested. - * @return none - *************************************************************************/ -static void setupPreTxHeparinBolus( void ) -{ - stopSyringePump(); - (void)startHeparinBolus(); -} + case PRE_TX_HEPARIN_SETUP_BOLUS_STATE: + startHeparinBolus(); + break; -/*********************************************************************//** - * @brief - * The setupPreTxHeparinPaused function configures the syringe pump for the - * paused state. - * @details Inputs: none - * @details Outputs: Syringe pump stopped. - * @return none - *************************************************************************/ -static void setupPreTxHeparinPaused( void ) -{ - stopSyringePump(); + case PRE_TX_HEPARIN_SETUP_PAUSED_STATE: + // Syringe pump already stopped above. + break; + + default: + break; + } } /*********************************************************************//** @@ -310,16 +261,15 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_PRELOAD_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } else if ( ( FALSE == isSyringePumpRunning() ) && ( FALSE == isSyringePumpPreLoaded() ) ) { - setupPreTxHeparinPreload(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PRELOAD_STATE ); } else if ( TRUE == isSyringePumpPreLoaded() ) { - setupPreTxHeparinAwaitSyringeLoadConfirmation(); state = PRE_TX_HEPARIN_SETUP_AWAIT_SYRINGE_LOAD_CONFIRMATION_STATE; } @@ -341,12 +291,12 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_AWAIT_SYRINGE_LOAD_CONFIRMATION_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } else if ( TRUE == syringeLoadConfirmed ) { - setupPreTxHeparinSeek(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_SEEK_STATE ); state = PRE_TX_HEPARIN_SETUP_SEEK_STATE; } @@ -369,22 +319,20 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_SEEK_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } else if ( TRUE == isSyringePlungerFound() ) { if ( TRUE == isSyringeVolumeAdequate() ) { - setupPreTxHeparinPrime(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PRIME_STATE ); state = PRE_TX_HEPARIN_SETUP_PRIME_STATE; } else { - // Syringe plunger was found, but available heparin volume is not enough for treatment. - activateAlarmNoData( ALARM_ID_TD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ); interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_SEEK_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } } @@ -406,12 +354,12 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_PRIME_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } else if ( TRUE == isSyringePumpPrimed() ) { - setupPreTxHeparinOcclusionCheck(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE ); state = PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE; } @@ -435,15 +383,15 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } else if ( FALSE == checkForSyringeOcclusion( FALSE ) ) { // Occlusion check passed. Continue to bolus if prescribed; otherwise continue to Patient Connection. if ( getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ) > 0.0F ) { - setupPreTxHeparinBolus(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_BOLUS_STATE ); state = PRE_TX_HEPARIN_SETUP_BOLUS_STATE; } else @@ -455,7 +403,7 @@ { // Occlusion check failed. Alarm is handled by checkForSyringeOcclusion(). interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } @@ -476,7 +424,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { interruptedPreTxHeparinSetupState = PRE_TX_HEPARIN_SETUP_BOLUS_STATE; - setupPreTxHeparinPaused(); + setupPreTxHeparinState( PRE_TX_HEPARIN_SETUP_PAUSED_STATE ); state = PRE_TX_HEPARIN_SETUP_PAUSED_STATE; } else if ( TRUE == isSyringePumpStopped() ) @@ -500,6 +448,8 @@ if ( TRUE == heparinSetupResumeRequested ) { + // Resume from Preload, Await Syringe Load Confirmation, or Seek by + // retracting the syringe and restarting the preload sequence. if ( ( PRE_TX_HEPARIN_SETUP_PRELOAD_STATE == interruptedPreTxHeparinSetupState ) || ( PRE_TX_HEPARIN_SETUP_AWAIT_SYRINGE_LOAD_CONFIRMATION_STATE == interruptedPreTxHeparinSetupState ) || ( PRE_TX_HEPARIN_SETUP_SEEK_STATE == interruptedPreTxHeparinSetupState ) ) @@ -509,20 +459,15 @@ } else { + // Resume from the interrupted state after the alarm is cleared. state = interruptedPreTxHeparinSetupState; switch ( state ) { case PRE_TX_HEPARIN_SETUP_PRIME_STATE: - setupPreTxHeparinPrime(); - break; - case PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE: - setupPreTxHeparinOcclusionCheck(); - break; - case PRE_TX_HEPARIN_SETUP_BOLUS_STATE: - setupPreTxHeparinBolus(); + setupPreTxHeparinState( state ); break; default: Index: firmware/App/Modes/StatePreTxHeparinSetup.h =================================================================== diff -u -r3f032347c774cab541bd9efb143fa874f65d25e9 -r6bb89ac52fecee7db9dc69a3eb727cad0a66370e --- firmware/App/Modes/StatePreTxHeparinSetup.h (.../StatePreTxHeparinSetup.h) (revision 3f032347c774cab541bd9efb143fa874f65d25e9) +++ firmware/App/Modes/StatePreTxHeparinSetup.h (.../StatePreTxHeparinSetup.h) (revision 6bb89ac52fecee7db9dc69a3eb727cad0a66370e) @@ -33,18 +33,6 @@ // ********** public definitions ********** -/// Enumeration of Pre-Treatment HeparinSetup sub-states. -typedef enum -{ - PRE_TX_HEPARIN_SETUP_PRELOAD_STATE = 0, ///< Preload heparin syringe state. - PRE_TX_HEPARIN_SETUP_AWAIT_SYRINGE_LOAD_CONFIRMATION_STATE, ///< Await syringe load confirmation state. - PRE_TX_HEPARIN_SETUP_SEEK_STATE, ///< Seek syringe plunger state. - PRE_TX_HEPARIN_SETUP_PRIME_STATE, ///< Prime heparin line state. - PRE_TX_HEPARIN_SETUP_OCCLUSION_CHECK_STATE, ///< Heparin setup occlusion check state. - PRE_TX_HEPARIN_SETUP_BOLUS_STATE, ///< Deliver heparin bolus state. - PRE_TX_HEPARIN_SETUP_PAUSED_STATE, ///< Paused state. - NUM_OF_PRE_TX_HEPARIN_SETUP_STATES ///< Number of pre-treatment heparin setup substates. -} PRE_TX_HEPARIN_SETUP_STATE_T; // ********** public function prototypes **********