Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r1a685471524555a374854c0c9ec8e208e71fe2df -r8128289dea98878d92bf170fde1c7145f858baa5 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 1a685471524555a374854c0c9ec8e208e71fe2df) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8128289dea98878d92bf170fde1c7145f858baa5) @@ -15,20 +15,10 @@ * ***************************************************************************/ -#include "AirTrap.h" -#include "AlarmLamp.h" -#include "BloodFlow.h" -#include "DialInFlow.h" -#include "DialOutFlow.h" -#include "Buttons.h" +#include "ModePreTreat.h" #include "OperationModes.h" +#include "Prime.h" #include "SystemCommMessages.h" -#include "ModePreTreat.h" -#include "SystemCommMessages.h" -#ifdef RM46_EVAL_BOARD_TARGET - #include "Timers.h" - static U32 start; -#endif /** * @addtogroup HDPreTreatmentMode @@ -37,10 +27,17 @@ // ********** private data ********** -static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. +static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. +static PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. + // ********** private function prototypes ********** +static PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ); +static PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); +static PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); +static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); + /*********************************************************************//** * @brief * The initPreTreatmentMode function initializes the Pre-Treatment Mode module. @@ -50,6 +47,7 @@ *************************************************************************/ void initPreTreatmentMode( void ) { + currentPreTreatmentState = PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -63,10 +61,7 @@ void transitionToPreTreatmentMode( void ) { treatStartReqReceived = FALSE; - -#ifdef RM46_EVAL_BOARD_TARGET - start = getMSTimerCount(); -#endif + currentPreTreatmentState = PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -78,30 +73,62 @@ *************************************************************************/ U32 execPreTreatmentMode( void ) { - BOOL stop = isStopButtonPressed(); - -#ifndef DISABLE_UI_TREATMENT_WORKFLOW - if ( TRUE == treatStartReqReceived ) -#endif + // execute mode state machine + switch ( currentPreTreatmentState ) { - requestNewOperationMode( MODE_TREA ); + case PRE_TREATMENT_START_STATE: + cmdStartDG(); + cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); + currentPreTreatmentState = PRE_TREATMENT_WATER_SAMPLE_STATE; + break; + + case PRE_TREATMENT_WATER_SAMPLE_STATE: + currentPreTreatmentState = PRE_TREATMENT_SELF_TEST_NO_CART_STATE; + break; + + case PRE_TREATMENT_SELF_TEST_NO_CART_STATE: + currentPreTreatmentState = handleSelfTestNoCartState(); + break; + + case PRE_TREATMENT_CART_INSTALL_STATE: + currentPreTreatmentState = PRE_TREATMENT_SELF_TEST_DRY_STATE; + break; + + case PRE_TREATMENT_SELF_TEST_DRY_STATE: + currentPreTreatmentState = handleSelfTestDryState(); + break; + + case PRE_TREATMENT_PRIME_STATE: + currentPreTreatmentState = handlePrimeState(); + break; + + case PRE_TREATMENT_SELF_TEST_WET_STATE: + currentPreTreatmentState = PRE_TREATMENT_RECIRC_STATE; + break; + + case PRE_TREATMENT_RECIRC_STATE: + currentPreTreatmentState = PRE_TREATMENT_PATIENT_CONNECTION_STATE; + break; + + case PRE_TREATMENT_PATIENT_CONNECTION_STATE: + currentPreTreatmentState = handlePatientConnectionState(); + break; + + default: + currentPreTreatmentState = PRE_TREATMENT_START_STATE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); + break; } -#ifdef RM46_EVAL_BOARD_TARGET - if ( TRUE == didTimeout( start, 5000U ) ) - { - requestNewOperationMode( MODE_TREA ); - } -#endif - return 0; // TODO - return current state + return (U32)currentPreTreatmentState; } /*********************************************************************//** * @brief * The signalUserBeginningTreatment function handles user start of a * treatment. * @details Inputs: none - * @details Outputs: requested mode transition to treatment mode + * @details Outputs: treatStartReqReceived, send response to treatment start * @return TRUE if signal accepted, FALSE if not *************************************************************************/ BOOL signalUserBeginningTreatment( void ) @@ -118,4 +145,83 @@ return result; } +/*********************************************************************//** + * @brief + * The handleSelfTestNoCartState function handles self-test with no cartrige. + * @details Inputs: none + * @details Outputs: home blood pump and dialysate pumps + * @return current state (sub-mode) + *************************************************************************/ +static PRE_TREATMENT_MODE_STATE_T handleSelfTestNoCartState( void ) +{ + // TODO: Prompt user to close door + + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); + + // TODO: Prompt user to open door + + return PRE_TREATMENT_CART_INSTALL_STATE; +} + +/*********************************************************************//** + * @brief + * The handleSelfTestDryState function handles dry self-test. + * @details Inputs: none + * @details Outputs: transition to prime sub-mode when blood pump finished homing + * @return current state (sub-mode) + *************************************************************************/ +static PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +{ + PRE_TREATMENT_MODE_STATE_T state = PRE_TREATMENT_CART_INSTALL_STATE; + + if ( FALSE == isBloodPumpRunning() ) + { + transitionToPrime(); + state = PRE_TREATMENT_PRIME_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePrimeState function handles priming the blood and dialysate circuits. + * @details Inputs: none + * @details Outputs: transition to self test wet state after priming passed + * @return current state (sub-mode) + *************************************************************************/ +static PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) +{ + PRE_TREATMENT_MODE_STATE_T state = PRE_TREATMENT_PRIME_STATE; + + execPrime(); + + if ( TRUE == isPrimingPassed() ) + { + state = PRE_TREATMENT_SELF_TEST_WET_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePatientConnectionState function handles patient connection state + * during pre-treatment mode. + * @details Inputs: none + * @details Outputs: requested mode transition to treatment mode + * @return current state (sub-mode) + *************************************************************************/ +static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) +{ + if ( TRUE == treatStartReqReceived ) + { + requestNewOperationMode( MODE_TREA ); + } + + return PRE_TREATMENT_PATIENT_CONNECTION_STATE; +} + /**@}*/