Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rf7b149d8b8c9ea6ac58e4739101693d251d7a355 -r2b3e0e31be725bca3d859240cbf8efd19fcb009f --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision f7b149d8b8c9ea6ac58e4739101693d251d7a355) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 2b3e0e31be725bca3d859240cbf8efd19fcb009f) @@ -19,6 +19,7 @@ #include "FPGA.h" #include "ModePreTreat.h" #include "OperationModes.h" +#include "PreTreatmentRecirc.h" #include "Prime.h" #include "SelfTests.h" #include "SystemCommMessages.h" @@ -30,13 +31,9 @@ // ********** 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 BOOL treatStartReqReceived = FALSE; ///< Flag indicates user requests treatment begin. -static BOOL patientConnectionStartReqReceived = FALSE; ///< Flag indicates user requests patient connection. static BOOL alarmActionStopReceived = FALSE; ///< Flag indicates alarm action stop received. static BOOL alarmActionResumeReceived = FALSE; ///< Flag indicates alarm action resume received. @@ -52,7 +49,6 @@ static HD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); -static HD_PRE_TREATMENT_MODE_STATE_T handleRecirculateStartState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePretreatmentPauseState( void ); @@ -67,7 +63,6 @@ void initPreTreatmentMode( void ) { treatStartReqReceived = FALSE; - patientConnectionStartReqReceived = FALSE; alarmActionStopReceived = FALSE; alarmActionResumeReceived = FALSE; currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; @@ -130,10 +125,6 @@ currentPreTreatmentState = handlePrimeState(); break; - case HD_PRE_TREATMENT_RECIRCULATE_START_STATE: - currentPreTreatmentState = handleRecirculateStartState(); - break; - case HD_PRE_TREATMENT_RECIRCULATE_STATE: currentPreTreatmentState = handleRecirculateState(); break; @@ -382,40 +373,16 @@ if ( TRUE == isPrimeCompleted() ) { - state = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; + state = HD_PRE_TREATMENT_RECIRCULATE_STATE; activateAlarmNoData( ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY ); + transitionToPreTreatmentRecirc(); } return state; } /*********************************************************************//** * @brief - * The handleRecirculateStartState function change valves and heater settings - * for recirculation state during pre-treatment mode. - * @details Inputs: none - * @details Outputs: controlled valves and pumps - * @return current state (sub-mode) - *************************************************************************/ -static HD_PRE_TREATMENT_MODE_STATE_T handleRecirculateStartState( 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(); - - return HD_PRE_TREATMENT_RECIRCULATE_STATE; -} - -/*********************************************************************//** - * @brief * The handleRecirculateState function handles blood and dialysate circuits * recirculation state during pre-treatment mode. * @details Inputs: none @@ -426,25 +393,11 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_RECIRCULATE_STATE; - // TODO Add handler to UI interaction - patientConnectionStartReqReceived = TRUE; - - if ( TRUE == patientConnectionStartReqReceived ) + if ( TRUE == isPatientConnectionRequested() ) { state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } - if ( TRUE == alarmActionStopReceived ) - { - signalDialOutPumpHardStop(); - signalDialInPumpHardStop(); - signalBloodPumpHardStop(); - cmdStopDGTrimmerHeater(); - - state = HD_PRE_TREATMENT_PAUSE_STATE; - resumePreTreatmentState = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; - } - return state; } Index: firmware/App/Modes/PreTreatmentRecirc.c =================================================================== diff -u --- firmware/App/Modes/PreTreatmentRecirc.c (revision 0) +++ firmware/App/Modes/PreTreatmentRecirc.c (revision 2b3e0e31be725bca3d859240cbf8efd19fcb009f) @@ -0,0 +1,168 @@ +/************************************************************************** +* +* 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. + +/// Wet self-tests state machine. +typedef enum Pre_Treatment_Recirc_State +{ + PRE_TREATMENT_RECIRC_START_STATE = 0, ///< Pre-treatment recirculate start state. + PRE_TREATMENT_RECIRC_STATE, ///< Pre-treatment recirculate state. + NUM_OF_PRE_TREATMENT_RECIRC_STATES ///< Number of pre-treatment recirculate states. +} PRE_TREATMENT_RECIRC_STATE_T; + +// ********** private data ********** + +static PRE_TREATMENT_RECIRC_STATE_T currentPreTreatmentRecircState; ///< Current state of the pre-treatment recirculate state machine. + +// ********** private function prototypes ********** + +static PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateStartState( void ); +static PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateState( 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_START_STATE; +} + +/*********************************************************************//** + * @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(); +} + +/*********************************************************************//** + * @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_START_STATE: + currentPreTreatmentRecircState = handlePreTreatmentRecirculateStartState(); + break; + + case PRE_TREATMENT_RECIRC_STATE: + currentPreTreatmentRecircState = handlePreTreatmentRecirculateState(); + break; + + default: + currentPreTreatmentRecircState = PRE_TREATMENT_RECIRC_START_STATE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, (U32)currentPreTreatmentRecircState ); + break; + } +} + +/*********************************************************************//** + * @brief + * The isPatientConnectionRequested function returns the status of patient connection request. + * @details Inputs: none + * @details Outputs: none + * @return TRUE if patient connection requested, otherwise FALSE + *************************************************************************/ +BOOL isPatientConnectionRequested( void ) +{ + // TODO Add handler to UI interaction + return TRUE; +} + +/*********************************************************************//** + * @brief + * The handlePreTreatmentRecirculateStartState function changes valves and + * heater settings for pre-treatment recirculate sub-mode. + * @details Inputs: none + * @details Outputs: controlled valves and pumps + * @return current state (sub-mode) + *************************************************************************/ +static PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateStartState( 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(); + + return PRE_TREATMENT_RECIRC_STATE; +} + +/*********************************************************************//** + * @brief + * The handleRecirculateState 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 PRE_TREATMENT_RECIRC_STATE_T handlePreTreatmentRecirculateState( void ) +{ + PRE_TREATMENT_RECIRC_STATE_T state = PRE_TREATMENT_RECIRC_STATE; + +// if ( TRUE == alarmActionStopReceived ) +// { +// signalDialOutPumpHardStop(); +// signalDialInPumpHardStop(); +// signalBloodPumpHardStop(); +// cmdStopDGTrimmerHeater(); +// +// state = HD_PRE_TREATMENT_PAUSE_STATE; +// resumePreTreatmentState = HD_PRE_TREATMENT_RECIRCULATE_START_STATE; +// } + + return state; +} + +/**@}*/ Index: firmware/App/Modes/PreTreatmentRecirc.h =================================================================== diff -u --- firmware/App/Modes/PreTreatmentRecirc.h (revision 0) +++ firmware/App/Modes/PreTreatmentRecirc.h (revision 2b3e0e31be725bca3d859240cbf8efd19fcb009f) @@ -0,0 +1,45 @@ +/************************************************************************** +* +* Copyright (c) 2019-2021 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.h +* +* @author (last) Quang Nguyen +* @date (last) 08-Feb-2021 +* +* @author (original) Quang Nguyen +* @date (original) 08-Feb-2021 +* +***************************************************************************/ + +#ifndef __PRE_TREATMENT_RECIRC_H__ +#define __PRE_TREATMENT_RECIRC_H__ + +#include "HDCommon.h" +#include "HDDefs.h" + +/** + * @defgroup PreTreatmentRecirc PreTreatmentRecirc + * @brief PreTreatmentRecirc module. This module handles the execution for pre-treatment recirculate sub-mode. + * This module will recirculate dialysate for up to 2 hours. + * + * @addtogroup PreTreatmentRecirc + * @{ + */ + +// ********** public definitions ********** + +// ********** public function prototypes ********** + +void initPreTreatmentRecirc( void ); +void transitionToPreTreatmentRecirc(); +void execPreTreatmentRecirc( void ); + +BOOL isPatientConnectionRequested( void ); + +/**@}*/ + +#endif