Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r5c430c3ac17fc8ad836fd70b8a3b8a12af44319e -reeaab2a9a685fb18845888d91040d3aa01977f6d --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 5c430c3ac17fc8ad836fd70b8a3b8a12af44319e) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision eeaab2a9a685fb18845888d91040d3aa01977f6d) @@ -7,8 +7,8 @@ * * @file ModeDrain.c * -* @author (last) Dara Navaei -* @date (last) 21-Dec-2022 +* @author (last) Michael Garthwaite +* @date (last) 16-May-2023 * * @author (original) Leonardo Baloa * @date (original) 20-Dec-2019 @@ -39,8 +39,8 @@ // ********** private definitions ********** -#define TARGET_DRAIN_PUMP_RPM 2400 ///< Target drain pump speed (in RPM). -#define DRAIN_WEIGHT_UNCHANGE_TIMEOUT ( 2 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. +#define TARGET_DRAIN_PUMP_RPM 2200 ///< Target drain pump speed (in RPM). +#define DRAIN_WEIGHT_UNCHANGE_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. #define DRAIN_EMPTY_TARE_WAIT ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Time period to wait after drain complete and before taring load cells. @@ -55,8 +55,21 @@ #define RINSE_CONCENTRATE_LINES_WAIT ( 25 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Time period to wait for concentrate lines to rinse. #define RINSE_SPEED ( ( CONCENTRATE_PUMP_MAX_SPEED - 3.0F ) * -1.0F ) ///< Reserver the concentrate speed to rinse out concentrate lines. -#define CONCENTRATION_BOTTLE_LOW_VOLUME_ML 100.0F ///< Concentration bottle low volume in mL. +#define CONCENTRATE_BOTTLE_PRIMING_VOL_ML 73.0F ///< Concentrate bottle priming volume in mL. +#define CONCENTRATE_BOTTLE_RESERVOIOR_VOL_ML 1500.0F ///< Concentrate bottle reservoir volume in mL +#define CONCENTRATE_BOTTLE_RESERVOIOR_FILLS 3 ///< Concentrate bottle reservoir vlls. +#define BICARB_PERCENT_FILL 0.03514F ///< Bicarb volume percentage of reservoir volume. +#define ACID_PERCENT_FILL 0.02222F ///< Acid volume percentage of reservoir volume. + +///< Concentrate bottle acid low volume in mL. +static const F32 CONCENTRATE_BOTTLE_ACID_LOW_VOLUME_ML = ( CONCENTRATE_BOTTLE_PRIMING_VOL_ML + + ( CONCENTRATE_BOTTLE_RESERVOIOR_VOL_ML * CONCENTRATE_BOTTLE_RESERVOIOR_FILLS * ACID_PERCENT_FILL) ); + +///< Concentrate bottle bicarb low volume in mL. +static const F32 CONCENTRATE_BOTTLE_BICARB_LOW_VOLUME_ML = ( CONCENTRATE_BOTTLE_PRIMING_VOL_ML + + ( CONCENTRATE_BOTTLE_RESERVOIOR_VOL_ML * CONCENTRATE_BOTTLE_RESERVOIOR_FILLS * BICARB_PERCENT_FILL) ); + // ********** private data ********** static DG_DRAIN_STATE_T drainState; ///< Currently active drain state. @@ -100,6 +113,7 @@ { // re-initialize each time we transition to drain mode initDrainMode(); + setCurrentSubState( NO_SUB_STATE ); DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); @@ -122,9 +136,13 @@ // 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( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); - setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); - startHeater( DG_PRIMARY_HEATER ); + if ( FALSE == isHeaterOn( DG_PRIMARY_HEATER ) ) + { + setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); + startHeater( DG_PRIMARY_HEATER ); + } + setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); return drainState; @@ -232,7 +250,7 @@ DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); // if we have reached our target drain to volume (by weight) or cannot drain anymore, we are done draining - go back to generation idle mode - if ( TRUE == hasTargetDrainVolumeBeenReached( inactiveReservoir, DRAIN_WEIGHT_UNCHANGE_TIMEOUT ) ) + if ( TRUE == hasTargetDrainVolumeBeenReached( inactiveReservoir, DRAIN_WEIGHT_UNCHANGE_TIMEOUT_MS ) ) { DG_ACID_CONCENTRATES_RECORD_T acid; F32 acidBottleVolML; @@ -246,7 +264,6 @@ acidBottleVolML = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidFullBottleVolumeML; bicarbBottleVolML = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbStartVolumeML; - if ( DG_RESERVOIR_1 == inactiveReservoir ) { setValveState( VRD1, VALVE_STATE_CLOSED ); @@ -261,14 +278,14 @@ #endif { // Detect empty bottles using integrated volumes - if ( ( acidBottleVolML - getChemicalUsedVolumeML( ACID ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) // || // SRSDG 437 + if ( ( acidBottleVolML - getChemicalUsedVolumeML( ACID ) ) <= CONCENTRATE_BOTTLE_ACID_LOW_VOLUME_ML ) // SRSDG 836 { resetChemicalUsedVolumeML( ACID ); setThisFisrtFillFlag( TRUE ); // indicates bottles need prime activateAlarmNoData( ALARM_ID_DG_ACID_BOTTLE_LOW_VOLUME ); } - if ( ( bicarbBottleVolML - getChemicalUsedVolumeML( BICARB ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) // || // SRSDG 438 + if ( ( bicarbBottleVolML - getChemicalUsedVolumeML( BICARB ) ) <= CONCENTRATE_BOTTLE_BICARB_LOW_VOLUME_ML ) // SRSDG 837 { resetChemicalUsedVolumeML( BICARB ); setThisFisrtFillFlag( TRUE );