Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rc8f686ebb93d52faa7bd1cb5a69090fe3dd26990 -r0035cfb9a3fa89a8f9c3e0b589a327ed9c1d9470 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c8f686ebb93d52faa7bd1cb5a69090fe3dd26990) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 0035cfb9a3fa89a8f9c3e0b589a327ed9c1d9470) @@ -1,19 +1,19 @@ /************************************************************************** - * - * Copyright (c) 2019-2023 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) Dara Navaei - * @date (last) 03-Jan-2023 - * - * @author (original) Dara Navaei - * @date (original) 05-Nov-2019 - * - ***************************************************************************/ +* +* Copyright (c) 2019-2023 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) Dara Navaei +* @date (last) 07-Mar-2023 +* +* @author (original) Dara Navaei +* @date (original) 05-Nov-2019 +* +***************************************************************************/ #include "AlarmMgmt.h" #include "Buttons.h" @@ -39,20 +39,22 @@ // ********** private definitions ********** /// Interval (ms/task time) at which the pre-treatment state data is published on the CAN bus. -#define PRE_TREATMENT_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) +#define PRE_TREATMENT_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) /// Wait time for ui to transition on completion of a sub-mode (ms/task time). -#define SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) -/// TODO: Restore to 100 when DPi flow control is fixed. -#define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 250 ///< Patient connection sub-mode dialysate inlet pump flow rate in mL/min. +#define SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +#define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 250 ///< Patient connection sub-mode dialysate inlet pump flow rate in mL/min. +#define PRE_TREATMENT_HEATING_DIA_FLOW_ML_PER_MIN 600 ///< Pre treatment heating parameters dialysate flow in mL/min. +#define PRE_TREATMENT_FLUSH_FILL_TARGET_TEMP_C 45.0F ///< Pre treatment flush fill target temperature in C. +#define PRE_TREATMENT_NORMAL_FILL_TARGET_TEMP_C ( 37.0F + 2.0F ) ///< Pre treatment normal fill target temperature in C. -#define PRE_TREATMENT_MIN_FILL_RESERVOIR_VOLUME_ML 125 ///< Fill reservoir to this volume minimum to prep volume during development. -#define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume (in mL) to flush filter and lines. -#define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 1200 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. -#define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 600 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. -#define PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML 1500 ///< Fill reservoir to this volume minimum to prep volume during development. +#define PRE_TREATMENT_MIN_FILL_RESERVOIR_VOLUME_ML 125 ///< Fill reservoir to this volume minimum to prep volume during development. +#define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume (in mL) to flush filter and lines. +#define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 1300 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 750 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML 1500 ///< Fill reservoir to this volume minimum to prep volume during development. -#define PRE_TREATMENT_FLUSH_COUNT 2 ///< Number of flush cycles for each reservoir. +#define PRE_TREATMENT_FLUSH_COUNT 2 ///< Number of flush cycles for each reservoir. typedef struct { @@ -130,6 +132,7 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtRequestReservoirSwitchState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtWaitReservoirSwitchState( void ); static U32 getPreTreatmentFillVolume( DG_RESERVOIR_ID_T inactiveRes ); +static void setPreTreatmentHeatingParams( F32 targetTempC, U32 targetVolML, F32 targetFillFlowLPM, U32 dialysateFlowMLPM ); /*********************************************************************//** * @brief @@ -140,9 +143,9 @@ *************************************************************************/ void initPreTreatmentMode( void ) { - int reservoirIndex = 0; + U32 reservoirIndex = 0; - currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; setUFVolStatus = FALSE; patientConnectionConfirm = FALSE; @@ -193,8 +196,9 @@ initPreTreatmentMode(); - // Set the heaters specs to start heating up the water - setDialysateHeatingParams(); + // Set the heating parameters to start the heaters + setPreTreatmentHeatingParams( PRE_TREATMENT_FLUSH_FILL_TARGET_TEMP_C, PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML, + DEFAULT_TARGET_FILL_FLOW_RATE_LPM, PRE_TREATMENT_HEATING_DIA_FLOW_ML_PER_MIN ); cmdStopDGTrimmerHeater(); @@ -218,6 +222,9 @@ doorClosedRequired( FALSE, FALSE ); + // Start pre-treatment mode in sample water state + transitionToSampleWater(); + return currentPreTreatmentState; } @@ -240,16 +247,6 @@ // execute mode state machine switch ( currentPreTreatmentState ) { - case HD_PRE_TREATMENT_START_STATE: -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SAMPLE_WATER ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - transitionToSampleWater(); - } - currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; - break; - case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: currentPreTreatmentState = handleWaterSampleState(); break; @@ -511,25 +508,49 @@ /*********************************************************************//** * @brief - * The signalActionToResumeFill function sets the remaining reservior fill - * flags to resume filling while in PreTreatment Mode. + * The signalAllowDGFlushFills function sets the reservoir flush flags + * to allow reservoir flush fills to proceed when ready. * @details Inputs: none - * @details Outputs: reservoirFlags + * @details Outputs: reservoirStatus[] * @return none *************************************************************************/ -void signalActionToResumeFill( void ) +void signalAllowDGFlushFills( void ) { reservoirStatus[ DG_RESERVOIR_1 ].startFlushFill = TRUE; - reservoirStatus[ DG_RESERVOIR_1 ].startNormalFill = TRUE; reservoirStatus[ DG_RESERVOIR_2 ].startFlushFill = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalAllowDGFillRes1 function sets the reservoir 1 fill flag + * to allow reservoir 1 fill to proceed when ready. + * @details Inputs: none + * @details Outputs: reservoirStatus[] + * @return none + *************************************************************************/ +void signalAllowDGFillRes1( void ) +{ + reservoirStatus[ DG_RESERVOIR_1 ].startNormalFill = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalAllowDGFillRes2 function sets the reservoir 2 fill flag + * to allow reservoir 2 fill to proceed when ready. + * @details Inputs: none + * @details Outputs: reservoirStatus[] + * @return none + *************************************************************************/ +void signalAllowDGFillRes2( void ) +{ reservoirStatus[ DG_RESERVOIR_2 ].startNormalFill = TRUE; } /*********************************************************************//** * @brief * The getReservoirFillStatus function returns the fill complete status for * given reservoir. - * @details Inputs: reservoirFilledStatus + * @details Inputs: reservoirStatus[] * @details Outputs: none * @return TRUE if reservoir has been filled, otherwise FALSE *************************************************************************/ @@ -642,7 +663,7 @@ patientConnectionConfirm = FALSE; treatmentStartRequested = FALSE; - doorClosedRequired( FALSE, FALSE ); + doorClosedRequired( TRUE, TRUE ); for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) { @@ -651,8 +672,7 @@ signalBloodPumpHardStop(); signalDialOutPumpHardStop(); - //setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialInPumpTargetFlowRate( 250, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // TODO remove this line once the new flow control is implemented + setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); cmdStartDGTrimmerHeater(); } @@ -674,27 +694,25 @@ if ( SAMPLE_WATER_COMPLETE_STATE == getSampleWaterState() ) { - { - cmdDGSampleWater( SAMPLE_WATER_CMD_END ); + cmdDGSampleWater( SAMPLE_WATER_CMD_END ); - if ( SELF_TEST_STATUS_PASSED == getSampleWaterResult() ) + if ( SELF_TEST_STATUS_PASSED == getSampleWaterResult() ) + { + if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) { - if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) - { - state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; - cmdStartDG(); - transitionToConsumableSelfTest(); - } - else - { - cmdStopDG(); - } + state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; + cmdStartDG(); + transitionToConsumableSelfTest(); } else { - requestNewOperationMode( MODE_STAN ); + cmdStopDG(); } } + else + { + requestNewOperationMode( MODE_STAN ); + } } return state; @@ -723,7 +741,12 @@ fillReservoirOneStartRequested = TRUE; transitionToNoCartSelfTests(); } - signalActionToResumeFill(); +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) // Allow reservoir flushes now if air pump not disabled +#endif + { + signalAllowDGFlushFills(); + } } return state; @@ -897,7 +920,7 @@ * @brief * The handlePatientConnectionState function handles patient connection state * during pre-treatment mode. - * @details Inputs: none + * @details Inputs: alarmActionResumeReceived * @details Outputs: requested mode transition to treatment mode * @return current state (sub-mode) *************************************************************************/ @@ -911,6 +934,19 @@ requestNewOperationMode( MODE_TREA ); } + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); + } + else if ( TRUE == alarmActionResumeReceived ) + { + alarmActionResumeReceived = FALSE; + //setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( 250, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // TODO remove this line once the new flow control is implemented + cmdStartDGTrimmerHeater(); + } + return HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } @@ -1008,7 +1044,6 @@ PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); - DG_RESERVOIR_ID_T activeReservoir = getDGActiveReservoir(); // If DG has not started yet, start DG if ( DG_MODE_STAN == dgOpMode ) @@ -1074,33 +1109,41 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdState( void ) { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); - U32 volume = 0; - DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); + U32 dialysateFlowMLPM = ( HD_PRE_TREATMENT_RECIRCULATE_STATE == currentPreTreatmentState ? DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN : + PRE_TREATMENT_HEATING_DIA_FLOW_ML_PER_MIN ); if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { + U32 volume = 0; + // Drain both reservoirs and return to active res 2 before initial fills if ( reservoirStatus[ inactiveReservoir ].initialDrain != TRUE ) { reservoirStatus[ inactiveReservoir ].initialDrain = TRUE; state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; } - // Once both reservoirs drained and returned to active res 2, wait for pre-tx workflow - // to get to point where fills are allowed, before starting fill - // not flushed and need to fill -OR- - // flushed and need to fill after entering dry self test state - else if ( ( TRUE == reservoirStatus[ inactiveReservoir ].startFlushFill ) || - ( ( TRUE == reservoirStatus[ inactiveReservoir ].startNormalFill ) && - ( currentPreTreatmentState >= HD_PRE_TREATMENT_SELF_TEST_DRY_STATE ) ) ) - { - volume = getPreTreatmentFillVolume( inactiveReservoir ); + // Determine target fill volume for next fill + volume = getPreTreatmentFillVolume( inactiveReservoir ); + // Determine whether we can start next fill yet + if ( ( FALSE == reservoirStatus[ inactiveReservoir ].flushComplete ) && + ( TRUE == reservoirStatus[ inactiveReservoir ].startFlushFill ) ) + { cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + setPreTreatmentHeatingParams( PRE_TREATMENT_FLUSH_FILL_TARGET_TEMP_C, volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM, dialysateFlowMLPM ); state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; } + else if ( ( TRUE == reservoirStatus[ inactiveReservoir ].flushComplete ) && + ( TRUE == reservoirStatus[ inactiveReservoir ].startNormalFill ) ) + { + cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + setPreTreatmentHeatingParams( PRE_TREATMENT_NORMAL_FILL_TARGET_TEMP_C, volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM, dialysateFlowMLPM ); + state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; + } } return state; @@ -1147,8 +1190,9 @@ * The handlePreTreatmentReservoirMgmtFillCompleteState function switches * reservoir after the first one fill is complete and restart reservoir management * state machine. - * @details Inputs: DG operation mode - * @details Outputs: switch active reservoir and signal prime fill complete status + * @details Inputs: DG operation mode, reservoirStatus[] + * @details Outputs: switch active reservoir and signal prime fill complete status, + * reservoirStatus[] * @return current state of pre-treatment reservoir management *************************************************************************/ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCompleteState( void ) @@ -1157,42 +1201,28 @@ DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); + DG_RESERVOIR_ID_T activeReservoir = getDGActiveReservoir(); if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; if ( ( TRUE == reservoirStatus[ DG_RESERVOIR_1 ].flushComplete ) && - ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].flushComplete ) ) + ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].flushComplete ) ) { reservoirStatus[ inactiveReservoir ].fillComplete = TRUE; - - if ( ( TRUE == reservoirStatus[ DG_RESERVOIR_1 ].fillComplete ) && - ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].fillComplete ) ) - { - state = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; - } } else { - DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - // Start tracking flush cycles, flushComplete => don't drain again, this completes the final fill. if ( FALSE == reservoirStatus[ inactiveReservoir ].flushComplete ) { - if ( reservoirStatus[ inactiveReservoir ].flushCount > 0 ) - { - reservoirStatus[ inactiveReservoir ].flushCount -= 1; - } + reservoirStatus[ inactiveReservoir ].flushCount--; if ( 0 == reservoirStatus[ inactiveReservoir ].flushCount ) { reservoirStatus[ inactiveReservoir ].flushComplete = TRUE; } } - - rsrvrCmd.reservoirID = (U32)activeReservoir; - rsrvrCmd.useLastTrimmerHeaterDC = FALSE; - cmdSetDGActiveReservoir( &rsrvrCmd ); } } @@ -1212,17 +1242,38 @@ PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); - DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); //wait after drain or fill if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { - DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + BOOL waitBeforeSwitch = TRUE; - rsrvrCmd.reservoirID = (U32)inactiveReservoir; - rsrvrCmd.useLastTrimmerHeaterDC = TRUE; - state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; - cmdSetDGActiveReservoir( &rsrvrCmd ); + // We do not want to switch over to res 2 final fill until prime is ready for it. + if ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].fillComplete ) + { + if ( ( getPreTreatmentSubState() > HD_PRE_TREATMENT_PRIME_STATE ) || + ( ( HD_PRE_TREATMENT_PRIME_STATE == getPreTreatmentSubState() ) && + ( getPrimeState() >= HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE ) && + ( getPrimeState() < HD_PRIME_PAUSE ) ) ) + { + waitBeforeSwitch = FALSE; + } + } + else + { + waitBeforeSwitch = FALSE; + } + + if ( waitBeforeSwitch != TRUE ) + { + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = (U32)inactiveReservoir; + rsrvrCmd.useLastTrimmerHeaterDC = TRUE; + state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + cmdSetDGActiveReservoir( &rsrvrCmd ); + } } return state; @@ -1254,7 +1305,15 @@ } else { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + if ( ( TRUE == reservoirStatus[ DG_RESERVOIR_1 ].fillComplete ) && + ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].fillComplete ) ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + } + else + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } } } @@ -1265,7 +1324,7 @@ * @brief * The getPreTreatmentFillVolume function determines which volume to fill * the inactive reservoir. - * @details Inputs: reservoirStatus.flushedStatus + * @details Inputs: reservoirStatus[] * @details Outputs: none * @param DG inactive Reservoir * @return volume to fill @@ -1314,6 +1373,32 @@ return volume; } +/*********************************************************************//** + * @brief + * The setPreTreatmentHeatingParams function calculates and set the heating + * parameters to be sent to DG. + * @details Inputs: none + * @details Outputs: none + * @param targetTempC target temperature in C + * @param targetVolML target fill volume in milliliters + * @param targetFillFlowLPM target fill flow rate in L/min + * @param dialysateFlowMLPM dialysate flow in mL/min + * @return none + *************************************************************************/ +static void setPreTreatmentHeatingParams( F32 targetTempC, U32 targetVolML, F32 targetFillFlowLPM, U32 dialysateFlowMLPM ) +{ + DG_CMD_DIALYSATE_HEATING_PARAMS_T params; + F32 fillTimeMS = ( (F32)targetVolML / ( targetFillFlowLPM * ML_PER_LITER ) ) * SEC_PER_MIN * MS_PER_SECOND; + + params.trimmerTargetTemperature = targetTempC; + params.timeReservoirWait2SwitchMS = 0; + params.timeReservoirFillMS = fillTimeMS; + params.timeReservoirCycleMS = (U32)fillTimeMS; + params.dialysateFlowLPM = ( (F32)dialysateFlowMLPM ) / ML_PER_LITER; + params.usePriTargetTempEquation = FALSE; + cmdSetDGDialysateHeatingParams( params ); +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/