/************************************************************************** * * 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 PreTreatmentRecirc.c * * @author (last) Quang Nguyen * @date (last) 08-Feb-2021 * * @author (original) Quang Nguyen * @date (original) 08-Feb-2021 * ***************************************************************************/ #include "DialInFlow.h" #include "DialOutFlow.h" #include "BloodFlow.h" #include "DGInterface.h" #include "PreTreatmentRecirc.h" #include "Valves.h" /** * @addtogroup PreTreatmentRecirc * @{ */ // ********** private definitions ********** #define BLOOD_PUMP_RECIRC_FLOW_RATE 100 ///< Blood pump flow rate during recirculation in mL/min. #define DIALYSATE_PUMP_RECIRC_FLOW_RATE 100 ///< Dialysate pump flow rate during recirculation in mL/min. // ********** private data ********** static HD_PRE_TREATMENT_RECIRC_STATE_T currentPreTreatmentRecircState; ///< Current state of the pre-treatment recirculate state machine. static BOOL recircResumeRequested; ///< Flag indicates alarm requesting to resume pre-treatment recirculate. // ********** private function prototypes ********** static void resetPreTreatmentRecircFlags( void ); static void setupPreTreatmentRecirculate( void ); static HD_PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateState( void ); static HD_PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateStoppedState( void ); /*********************************************************************//** * @brief * The initPreTreatmentRecirc function initializes the PreTreatmentRecirc module. * @details Inputs: none * @details Outputs: PreTreatmentRecirc module initialized. * @return none *************************************************************************/ void initPreTreatmentRecirc( void ) { currentPreTreatmentRecircState = PRE_TREATMENT_RECIRC_STATE; resetPreTreatmentRecircFlags(); } /*********************************************************************//** * @brief * The transitionToPreTreatmentRecirc function resets anything required before * the start of pre-treatment recirculate sub-mode. * @details Inputs: none * @details Outputs: PreTreatmentRecirc module re-initialized. * @return none *************************************************************************/ void transitionToPreTreatmentRecirc( void ) { initPreTreatmentRecirc(); setupPreTreatmentRecirculate(); } /*********************************************************************//** * @brief * The execPreTreatmentRecirc function executes the pre-treatment recirculate state machine. * @details Inputs: currentPreTreatmentRecircState * @details Outputs: currentPreTreatmentRecircState * @return none *************************************************************************/ void execPreTreatmentRecirc( void ) { // execute pre-treatment recirculate state machine switch ( currentPreTreatmentRecircState ) { case PRE_TREATMENT_RECIRC_STATE: currentPreTreatmentRecircState = handlePreTreatmentRecirculateState(); break; case PRE_TREATMENT_RECIRC_STOPPED_STATE: currentPreTreatmentRecircState = handlePreTreatmentRecirculateStoppedState(); break; default: currentPreTreatmentRecircState = PRE_TREATMENT_RECIRC_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_RECIRC_STATE, (U32)currentPreTreatmentRecircState ); break; } // All flags should be handled by now, reset in case flags not handle in current state resetPreTreatmentRecircFlags(); } /*********************************************************************//** * @brief * The getPreTreatmentRecircState function returns the current state of * pre-treatment re-circulate sub-mode. * @details Inputs: currentPreTreatmentRecircState * @details Outputs: none * @return current pre-treatment re-circ state *************************************************************************/ U32 getPreTreatmentRecircState( void ) { return currentPreTreatmentRecircState; } /*********************************************************************//** * @brief * The signalResumePreTreatmentRecirc function signals the pre-treatment * recirculate sub-mode to resume. * @details Inputs: none * @details Outputs: recircResumepRequested * @return none *************************************************************************/ void signalResumePreTreatmentRecirc( void ) { recircResumeRequested = TRUE; } /*********************************************************************//** * @brief * The resetPreTreatmentRecircFlags function resets all pre-treatment recirculate * signal flags. * @details Inputs: none * @details Outputs: signal flags set to FALSE * @return none *************************************************************************/ static void resetPreTreatmentRecircFlags( void ) { recircResumeRequested = FALSE; } /*********************************************************************//** * @brief * The setupPreTreatmentRecirculate function setups valves and * heater settings for pre-treatment recirculate sub-mode. * @details Inputs: none * @details Outputs: controlled valves and pumps * @return none *************************************************************************/ static void setupPreTreatmentRecirculate( void ) { setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_B_OPEN ); setValvePosition( VBV, VALVE_POSITION_B_OPEN ); setValveAirTrap( STATE_CLOSED ); cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); cmdStartDGTrimmerHeater(); setBloodPumpTargetFlowRate( BLOOD_PUMP_RECIRC_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( DIALYSATE_PUMP_RECIRC_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); signalDialOutPumpHardStop(); } /*********************************************************************//** * @brief * The handlePreTreatmentRecirculateState function handles blood and dialysate circuits * recirculation state during pre-treatment recirculate sub-mode. * @details Inputs: none * @details Outputs: controlled valves and pumps * @return current state (sub-mode) *************************************************************************/ static HD_PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateState( void ) { HD_PRE_TREATMENT_RECIRC_STATE_T state = PRE_TREATMENT_RECIRC_STATE; if ( TRUE == doesAlarmStatusIndicateStop() ) { signalDialOutPumpHardStop(); signalDialInPumpHardStop(); signalBloodPumpHardStop(); cmdStopDGTrimmerHeater(); state = PRE_TREATMENT_RECIRC_STOPPED_STATE; } return state; } /*********************************************************************//** * @brief * The handlePreTreatmentRecirculateStoppedState function handles stopped state * for pre-treatment recirculate sub-mode. * @details Inputs: alarmActionResumeReceived * @details Outputs: resume re-circulation * @return current state (sub-mode) *************************************************************************/ static HD_PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateStoppedState( void ) { HD_PRE_TREATMENT_RECIRC_STATE_T state = PRE_TREATMENT_RECIRC_STOPPED_STATE; if ( TRUE == recircResumeRequested ) { recircResumeRequested = FALSE; state = PRE_TREATMENT_RECIRC_STATE; setupPreTreatmentRecirculate(); } return state; } /**@}*/