Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -rbf28653663700422d94ef923bf758092883fba2e -rc53dd92ec3baa363ccfbd0477db69a3017f5c067 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision bf28653663700422d94ef923bf758092883fba2e) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision c53dd92ec3baa363ccfbd0477db69a3017f5c067) @@ -8,7 +8,7 @@ * @file ModeFill.c * * @author (last) Dara Navaei -* @date (last) 17-May-2023 +* @date (last) 02-Jun-2023 * * @author (original) Leonardo Baloa * @date (original) 19-Nov-2019 @@ -216,19 +216,84 @@ *************************************************************************/ U32 transitionToFillMode( void ) { - initFillMode(); - setCurrentSubState( NO_SUB_STATE ); - // Set initial actuator states - setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + F32 targetFlowLPM = getTargetFillFlowRateLPM(); + if ( ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) || ( getPreviousOperationMode() != DG_MODE_FAUL ) ) + { + initFillMode(); + setCurrentSubState( NO_SUB_STATE ); + + // Set initial actuator states + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + } + else + { + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VPD, VALVE_STATE_OPEN_C_TO_NC ); + + switch( fillState ) + { + case DG_FILL_MODE_STATE_TEST_INLET_WATER: + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + break; + + case DG_FILL_MODE_STATE_PRIME_CONCENTRATE_LINES: + targetFlowLPM = RO_PUMP_800_ML_PER_MIN / MILLILITERS_PER_LITER; + concentratePrimingStartTime = getMSTimerCount(); + + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, CONCENTRATE_PUMP_MAX_SPEED ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, CONCENTRATE_PUMP_MAX_SPEED ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + break; + + case DG_FILL_MODE_STATE_FLUSH_BUBBLES: + case DG_FILL_MODE_STATE_TEST_BICARB_CONDUCTIVITY: + case DG_FILL_MODE_STATE_TEST_ACID_CONDUCTIVITY: + // For the above states, transition back to flush bubbles state + pumpSpeedIndex = 0; + targetFlowLPM = RO_PUMP_FLUSH_BUBBLES_FLOWS[ pumpSpeedIndex ] / MILLILITERS_PER_LITER; + flushBubblesStartTime = getMSTimerCount(); + fillState = DG_FILL_MODE_STATE_FLUSH_BUBBLES; + break; + + case DG_FILL_MODE_STATE_PRODUCE_DIALYSATE: + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + + // Do the necessary setup here before transition to Produce Dialysate State + fillStatus.isThisFirstFill = FALSE; + concentratePumpPrimeCount = 0; + break; + + case DG_FILL_MODE_STATE_DELIVER_DIALYSATE: + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); + + dialysateFillStartTime = getMSTimerCount(); + fillStatus.isThisFirstFill = FALSE; + break; + + case DG_FILL_MODE_STATE_PAUSED: + targetFlowLPM = TARGET_RO_FLOW_RATE_IN_PAUSE_L; + havePauseActuatorsBeenSet = FALSE; + break; + } + } + turnOnUVReactor( INLET_UV_REACTOR ); turnOnUVReactor( OUTLET_UV_REACTOR ); // NOTE: The target flow rate should be set prior to setting the start primary heater // because the initial guess in the heaters driver needs the target flow to calculate // the new PWMs for the main and small primary heaters - setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); + setROPumpTargetFlowRateLPM( targetFlowLPM, TARGET_RO_PRESSURE_PSI ); setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); startHeater( DG_PRIMARY_HEATER ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); @@ -853,7 +918,7 @@ DG_RESERVOIR_ID_T inactiveRsrvr = getInactiveReservoir(); F32 acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); F32 bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); - F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); + F32 inletTemperature = getTemperatureValue( TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); F32 cpi = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); F32 cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); F32 rejRatio = RO_REJECTION_RATIO_OUT_OF_RANGE_VALUE; // default 1:1 before calculation in case can't divide by zero.