Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r1a685471524555a374854c0c9ec8e208e71fe2df -r4d2dcd2d5ee3c7684be139b7e560b16d8c3abc06 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 1a685471524555a374854c0c9ec8e208e71fe2df) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 4d2dcd2d5ee3c7684be139b7e560b16d8c3abc06) @@ -15,16 +15,15 @@ * ***************************************************************************/ -#include "AirTrap.h" -#include "AlarmLamp.h" -#include "BloodFlow.h" -#include "DialInFlow.h" -#include "DialOutFlow.h" -#include "Buttons.h" +//#include "AirTrap.h" +//#include "BloodFlow.h" +//#include "DialInFlow.h" +//#include "DialOutFlow.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; @@ -37,9 +36,13 @@ // ********** 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 handlePrimeState( void ); +static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); /*********************************************************************//** * @brief @@ -50,6 +53,7 @@ *************************************************************************/ void initPreTreatmentMode( void ) { + currentPreTreatmentState = PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -78,37 +82,66 @@ *************************************************************************/ 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: + 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 = PRE_TREATMENT_CART_INSTALL_STATE; + break; + + case PRE_TREATMENT_CART_INSTALL_STATE: + currentPreTreatmentState = PRE_TREATMENT_SELF_TEST_DRY_STATE; + break; + + case PRE_TREATMENT_SELF_TEST_DRY_STATE: + currentPreTreatmentState = PRE_TREATMENT_PRIME_STATE; + 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: + 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 ) { BOOL result = FALSE; - if ( MODE_PRET == getCurrentOperationMode() ) + if ( ( MODE_PRET == getCurrentOperationMode() ) && ( PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) { treatStartReqReceived = TRUE; result = TRUE; @@ -118,4 +151,51 @@ return result; } +/*********************************************************************//** + * @brief + * The handlePrimeState function handles priming the blood and dialysate circuits. + * @details Inputs: none + * @details Outputs: requested mode transition to treatment mode + * @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 ) +{ +#ifndef DISABLE_UI_TREATMENT_WORKFLOW + if ( TRUE == treatStartReqReceived ) +#endif + { + requestNewOperationMode( MODE_TREA ); + } +#ifdef RM46_EVAL_BOARD_TARGET + if ( TRUE == didTimeout( start, 5000U ) ) + { + requestNewOperationMode( MODE_TREA ); + } +#endif + + return PRE_TREATMENT_PATIENT_CONNECTION_STATE; +} + /**@}*/