/************************************************************************** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModePreTreat.c * * @author (last) Sean Nash * @date (last) 06-Oct-2020 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 * ***************************************************************************/ #include "ModePreTreat.h" #include "OperationModes.h" #include "Prime.h" #include "SystemCommMessages.h" /** * @addtogroup HDPreTreatmentMode * @{ */ // ********** private data ********** 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 handlePrimeState( void ); static PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); /*********************************************************************//** * @brief * The initPreTreatmentMode function initializes the Pre-Treatment Mode module. * @details Inputs: none * @details Outputs: Pre-Treatment Mode module initialized. * @return none *************************************************************************/ void initPreTreatmentMode( void ) { currentPreTreatmentState = PRE_TREATMENT_START_STATE; } /*********************************************************************//** * @brief * The transitionToPreTreatmentMode function prepares for transition to * pre-treatment mode. * @details Inputs: none * @details Outputs: none * @return none *************************************************************************/ void transitionToPreTreatmentMode( void ) { treatStartReqReceived = FALSE; currentPreTreatmentState = PRE_TREATMENT_START_STATE; } /*********************************************************************//** * @brief * The execFaultMode function executes the Pre-Treatment Mode state machine. * @details Inputs: none * @details Outputs: none * @return current state (sub-mode) *************************************************************************/ U32 execPreTreatmentMode( void ) { // execute mode state machine switch ( currentPreTreatmentState ) { 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 = handleSelfTestNoCartState(); 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: 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 (U32)currentPreTreatmentState; } /*********************************************************************//** * @brief * The signalUserBeginningTreatment function handles user start of a * treatment. * @details Inputs: none * @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() ) && ( PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) { treatStartReqReceived = TRUE; result = TRUE; } sendTreatmentStartResponseMsg( result, 0 ); // TODO - provide reason code if rejected return result; } /*********************************************************************//** * @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 handleSelfTestNoCartState( void ) { cmdStartDG(); cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); // TODO: Prompt user to close door homeBloodPump(); homeDialInPump(); homeDialOutPump(); // TODO: Prompt user to open door return PRE_TREATMENT_CART_INSTALL_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 ) { #ifndef DISABLE_UI_TREATMENT_WORKFLOW if ( TRUE == treatStartReqReceived ) #endif { requestNewOperationMode( MODE_TREA ); } return PRE_TREATMENT_PATIENT_CONNECTION_STATE; } /**@}*/