Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543 -r5a29e093e8a11f971c312cab5f6e7fedae2953db --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -15,9 +15,14 @@ * ***************************************************************************/ +#include "BloodFlow.h" #include "Buttons.h" +#include "Messaging.h" #include "ModePreTreat.h" #include "OperationModes.h" +#include "PeristalticPump.h" +#include "TaskGeneral.h" +#include "TDDefs.h" #include "Timers.h" #include "TxParams.h" @@ -28,13 +33,27 @@ // ********** private definitions ********** +///< Auto-Load timeout interval (ms/task time) +#define AUTO_LOAD_TIMEOUT_INTERVAL ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) + +//< Blood pump flow rate (mL/min) for Auto-Load operation +#define AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN 100U + // ********** private data ********** +static BOOL confirmTubesetPlaced; ///< Flag indicating user has confirmed tubeset is placed +static U32 autoLoadTimerCounter; ///< Auto-Load operation timer counter +static BOOL autoLoadHomePosCleared; ///< Flag indicating blood pump rotor has left home position during auto-load + static TD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current Pre-Treatment sub-state +static PRE_TX_INSTALL_STATE_T currentPreTxInstallState; ///< Current Pre-Treatment Install sub-state // ********** private function prototypes ********** static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); ///< Handle Confirm Rx state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); ///< Handle Install state during Pre-Treatment +static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ); ///< Handle Await Tubset Install Confirmation sub-state +static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ); ///< Handle Auto-Load sub-state /*********************************************************************//** * @brief @@ -48,7 +67,11 @@ { // Start a fresh Treatment Parameters session for this run. resetTreatmentParameters(); - currentPreTreatmentState = TD_PRE_TREATMENT_CONFIRM_RX_STATE; + currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + currentPreTxInstallState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; + confirmTubesetPlaced = FALSE; + autoLoadTimerCounter = 0; + autoLoadHomePosCleared = FALSE; } /*********************************************************************//** @@ -100,8 +123,8 @@ // currentPreTreatmentState = handleSelfTestNoCartState(); break; - case TD_PRE_TREATMENT_CART_INSTALL_STATE: - // currentPreTreatmentState = handleInstallState(); + case TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE: + currentPreTreatmentState = handleInstallState(); break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: @@ -158,4 +181,132 @@ return state; } +/*********************************************************************//** + * @brief + * The handleInstallState function executes the Pre-Treatment Install + * state machine. + * @details Inputs: currentPreTxInstallState + * @details Outputs: Advances the Pre-Treatment Install sub-state and + * next Pre-Treatment top-level state when install is complete. + * @return current Pre-Treatment sub-state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + + switch(currentPreTxInstallState) + { + case PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION: + currentPreTxInstallState = handleAwaitTubesetConfirmationState(); + break; + + case PRE_TX_INSTALL_STATE_AUTO_LOAD: + currentPreTxInstallState = handleAutoLoadState(); + + if ( NUM_OF_PRE_TX_INSTALL_SUB_STATES == currentPreTxInstallState ) + { + state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + } + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTxInstallState ); + break; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAwaitTubesetConfirmationState function handles the Await + * tubeset confirmation state of Pre-Treatement mode install state + * machine. Should wait for the user to confirm the tubeset is placed. + * @details Inputs: confirmTubsetPlaced + * @details Outputs: confirmTubsetPlaced, autoLoadHomePosCleared + * returns next Pre-Treatment install sub-state + *************************************************************************/ +static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ) +{ + PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; + + if ( TRUE == confirmTubesetPlaced ) + { + confirmTubesetPlaced = FALSE; + autoLoadHomePosCleared = FALSE; + subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; + } + + return subState; +} + +/*********************************************************************//** + * @brief + * The handleAutoLoadState function handles the Auto-Load state of + * Pre-Treatement mode install state. + * @details Inputs: autoLoadHomePosCleared, autoLoadTimerCounter + * @details Outputs: autoLoadHomePosCleared, autoLoadTimerCounter + * returns next Pre-Treatment install sub-state + *************************************************************************/ +static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ) +{ + PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; + + // Set H4 to 100 mL/min forward + setBloodPumpTargetFlowRate( AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + + // Timeout check + if ( ++autoLoadTimerCounter >= AUTO_LOAD_TIMEOUT_INTERVAL ) + { + signalBloodPumpHardStop(); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, autoLoadHomePosCleared, isPeristalticPumpHome() ); + requestNewOperationMode( MODE_FAUL ); + } + else + { + if ( FALSE == autoLoadHomePosCleared ) + { + if ( FALSE == isPeristalticPumpHome() ) + { + autoLoadHomePosCleared = TRUE; + } + } + else if ( TRUE == isPeristalticPumpHome() ) + { + signalBloodPumpHardStop(); + subState = NUM_OF_PRE_TX_INSTALL_SUB_STATES; + } + } + + return subState; +} + +/*********************************************************************//** + * @brief + * The signalUserConfirmTubesetInstallation function sets the user + * confirmation flag signaling user has confirmed tubset installation + * @details Inputs: none + * @details Outputs: confirmTubesetPlaced + * @param message confirmation message from UI which includes the user + * confirmation of tubset installation. + * @return TRUE if confirmation/rejection accepted, FALSE if not + *************************************************************************/ +BOOL signalUserConfirmTubesetInstallation( MESSAGE_T *message ) +{ + BOOL confirmed = FALSE; + BOOL result = FALSE; + + if ( sizeof( BOOL ) == message->hdr.payloadLen ) + { + memcpy( &confirmed, message->payload, sizeof( BOOL ) ); + if( TRUE == confirmed ) + { + confirmTubesetPlaced = TRUE; + result = TRUE; + } + } + + return result; +} + /**@}*/