Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r30f049651877229042e3f8700c8596e5b9a1e0f4 -r766708fceb0bdf1af8c7897df29d4f5036bfd3db --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 30f049651877229042e3f8700c8596e5b9a1e0f4) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) @@ -15,16 +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" /** * @addtogroup HDPreTreatmentMode @@ -33,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. @@ -46,6 +47,7 @@ *************************************************************************/ void initPreTreatmentMode( void ) { + currentPreTreatmentState = PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -64,6 +66,8 @@ setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); + + currentPreTreatmentState = PRE_TREATMENT_START_STATE; } /*********************************************************************//** @@ -75,22 +79,62 @@ *************************************************************************/ U32 execPreTreatmentMode( void ) { - BOOL stop = isStopButtonPressed(); - - if ( TRUE == treatStartReqReceived ) + // 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; } - 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 ) @@ -121,4 +165,83 @@ // TODO - implement } +/*********************************************************************//** + * @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; +} + /**@}*/