Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -53,20 +53,20 @@ #define ROP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. #define ROP_RAMP_UP_CONTROL_INTERVAL ( 500 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. -#define ROP_P_COEFFICIENT 0.25 ///< P term for RO pump pressure control. -#define ROP_I_COEFFICIENT 0.25 ///< I term for RO pump pressure control. +#define ROP_RAMP_UP_P_COEFFICIENT 0.22 ///< P term for RO pump ramp up to flow control. +#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.25 ///< P term for RO pump flow control. +#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.25 ///< I term for RO pump flow control. +#define ROP_MAX_PRESSURE_P_COEFFICIENT 0.01 ///< P term for RO pump max pressure control. +#define ROP_MAX_PRESSURE_I_COEFFICIENT 0.01 ///< I term for RO pump max pressure control. #define ROP_FLOW_TARGET_TOLERANCE 0.03 ///< Tolerance in between the target flow rate and the actual flow rate in percentage. -#define ROP_RAMP_DOWN_DUTY_CYCLE_RATIO 0.01 ///< Pump ramp down duty cycle ratio when the pressure higher than max defined. +#define ROP_RAMP_DOWN_DUTY_CYCLE_RATIO 0.03 ///< Pump ramp down duty cycle ratio when the pressure higher than max defined. #define FLOW_SENSOR_ZERO_READING 0xFFFF ///< Flow sensor reading indicates zero flow (or flow lower than can be detected by sensor). #define FLOW_SAMPLES_TO_AVERAGE ( 250 / TASK_PRIORITY_INTERVAL ) ///< Averaging flow data over 250 ms intervals. #define FLOW_AVERAGE_MULTIPLIER ( 1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing. -/// The time in counts to check the flow and make sure it is in range. -#define FLOW_VERIFICATION_COUNTER_TARGET ( 2 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) //TODO remove - #define RO_FLOW_ADC_TO_LPM_FACTOR 5555 ///< Conversion factor from ADC counts to LPM (liters/min) for RO flow rate (multiply this by inverse of FPGA reading). #define ROP_FLOW_TO_PWM_SLOPE 0.1 ///< Slope of flow to PWM line equation. @@ -87,66 +87,62 @@ #define MAX_ALLOWED_RAMP_UP_TIME ( 10 * MS_PER_SECOND ) ///< Maximum allowed ramp up time to a flow rate in ms. #define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< Conversion factor from target PSI to PWM duty cycle estimate. #define SAFETY_SHUTDOWN_TIMEOUT ( 3 * MS_PER_SECOND ) ///< RO pump safety shutdown activation timeout in ms. -#define ROP_FLOW_STABILIZE_TIME ( 3 * MS_PER_SECOND ) ///< Time required for RO flow to stabilize. TODO remove -#define ROP_MAX_RAMP_UP_RETRY 5 ///< Maximum ramp up retires before alarm. -// ************ New defines for pump control ****************// - - /// Enumeration of RO pump states. typedef enum ROPump_States { - RO_PUMP_OFF_STATE = 0, ///< RO pump off state - RO_PUMP_RAMP_UP_STATE, ///< RO pump ramp up to target flow rate state - RO_PUMP_CONTROL_TO_TARGET_STATE, ///< RO pump control to target pressure state - RO_PUMP_OPEN_LOOP_STATE, ///< RO pump open loop state - NUM_OF_RO_PUMP_STATES ///< Number of RO pump states + RO_PUMP_OFF_STATE = 0, ///< RO pump off state. + RO_PUMP_RAMP_UP_TO_TARGET_FLOW_STATE, ///< RO pump ramp up to target flow rate state. + RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE, ///< RO pump control to target flow state. + RO_PUMP_CONTROL_TO_MAX_PRESSURE_STATE, ///< RO pump control to max pressure state. + RO_PUMP_OPEN_LOOP_STATE, ///< RO pump open loop state. + NUM_OF_RO_PUMP_STATES ///< Number of RO pump states. } RO_PUMP_STATE_T; /// Enumeration of RO pump self-test states. typedef enum ROPump_Self_Test_States { - RO_PUMP_SELF_TEST_STATE_START = 0, ///< RO pump self-test start state - RO_PUMP_TEST_STATE_IN_PROGRESS, ///< RO pump self-tests in progress state - RO_PUMP_TEST_STATE_COMPLETE, ///< RO pump self-tests completed state - NUM_OF_RO_PUMP_SELF_TEST_STATES ///< Number of RO pump self-test states + RO_PUMP_SELF_TEST_STATE_START = 0, ///< RO pump self-test start state. + RO_PUMP_TEST_STATE_IN_PROGRESS, ///< RO pump self-tests in progress state. + RO_PUMP_TEST_STATE_COMPLETE, ///< RO pump self-tests completed state. + NUM_OF_RO_PUMP_SELF_TEST_STATES ///< Number of RO pump self-test states. } RO_PUMP_SELF_TEST_STATE_T; // ********** private data ********** -static RO_PUMP_STATE_T roPumpState = RO_PUMP_OFF_STATE; ///< current state of RO pump controller state machine. -static U32 roPumpDataPublicationTimerCounter = 0; ///< used to schedule RO pump data publication to CAN bus. -static BOOL isROPumpOn = FALSE; ///< RO pump is currently running. -static F32 roPumpPWMDutyCyclePct = 0.0; ///< initial RO pump PWM duty cycle. -static F32 roPumpDutyCyclePctSet = 0.0; ///< currently set RO pump PWM duty cycle. -static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode. -static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode. +static RO_PUMP_STATE_T roPumpState = RO_PUMP_OFF_STATE; ///< current state of RO pump controller state machine. +static U32 roPumpDataPublicationTimerCounter = 0; ///< used to schedule RO pump data publication to CAN bus. +static BOOL isROPumpOn = FALSE; ///< RO pump is currently running. +static F32 roPumpPWMDutyCyclePct = 0.0; ///< initial RO pump PWM duty cycle. +static F32 roPumpDutyCyclePctSet = 0.0; ///< currently set RO pump PWM duty cycle. +static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode. +static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode. -static F32 targetROPumpFlowRate = 0.0; ///< Target RO flow rate (in L/min). -static F32 targetROPumpPressure = 0; ///< Target RO pressure (in PSI). +static F32 targetROPumpFlowRate = 0.0; ///< Target RO flow rate (in L/min). +static F32 targetROPumpMaxPressure = 0.0; ///< Target RO max allowed pressure (in PSI). static OVERRIDE_U32_T roPumpDataPublishInterval = { RO_PUMP_DATA_PUB_INTERVAL, RO_PUMP_DATA_PUB_INTERVAL, - 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus. -static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in L/min). + 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus. +static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in L/min). -static U32 roControlTimerCounter = 0; ///< determines when to perform control on RO pump. -static F32 roPumpOpenLoopTargetDutyCycle = 0; ///< Target RO pump open loop PWM. +static U32 roControlTimerCounter = 0; ///< determines when to perform control on RO pump. +static F32 roPumpOpenLoopTargetDutyCycle = 0; ///< Target RO pump open loop PWM. /* TODO These variables are used for POST. POST has not been implemented yet -static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< Current RO pump self test state. -static U32 roPumpSelfTestTimerCount = 0; ///< Timer counter for RO pump self test. +static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< Current RO pump self test state. +static U32 roPumpSelfTestTimerCount = 0; ///< Timer counter for RO pump self test. */ -static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging. -static U32 flowFilterCounter = 0; ///< Flow filtering counter. -static U32 rampUpRetryCount = 0; ///< Number of ramp up retries. +static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging. +static U32 flowFilterCounter = 0; ///< Flow filtering counter. // ********** private function prototypes ********** static RO_PUMP_STATE_T handleROPumpOffState( void ); -static RO_PUMP_STATE_T handleROPumpRampUpState( void ); -static RO_PUMP_STATE_T handleROPumpControlToTargetState( void ); +static RO_PUMP_STATE_T handleROPumpRampUpToTargetFlowState( void ); +static RO_PUMP_STATE_T handleROPumpControlToTargetFlowState( void ); +static RO_PUMP_STATE_T handleROPumpControlToMaxPressureState( void ); static RO_PUMP_STATE_T handleROPumpOpenLoopState( void ); static void setROPumpTargetDutyCycle( F32 duty ); @@ -169,10 +165,14 @@ { stopROPump(); - // Initialize RO pump PI controller - initializePIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_DUTY_CYCLE, ROP_P_COEFFICIENT, ROP_I_COEFFICIENT, + // Initialize RO pump PI controller to flow + initializePIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_PUMP_DUTY_CYCLE, ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE ); + // Initialize RO pump PI controller t maximum pressure + initializePIController( PI_CONTROLLER_ID_RO_PUMP_MAX_PRES, MIN_RO_PUMP_DUTY_CYCLE, ROP_MAX_PRESSURE_P_COEFFICIENT, ROP_MAX_PRESSURE_I_COEFFICIENT, + MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE ); + // Initialize the persistent alarm for flow out of upper and lower range /*initPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_UPPER_RANGE, ALARM_ID_FLOW_RATE_OUT_OF_UPPER_RANGE, TRUE, FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL, FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL ); @@ -197,7 +197,6 @@ measuredFlowReadingsSum = 0; flowFilterCounter = 0; roPumpDataPublicationTimerCounter = 0; - rampUpRetryCount = 0; roPumpState = RO_PUMP_OFF_STATE; roPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; roPumpControlModeSet = roPumpControlMode; @@ -228,11 +227,13 @@ { // For now maximum allowed pressure is inserted into the target pressure override // if the target flow rate exceeded the max pressure, it will set the maximum pressure - targetROPumpPressure = maxPressure; - targetROPumpFlowRate = roFlowRate; - roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; + targetROPumpMaxPressure = maxPressure; + targetROPumpFlowRate = roFlowRate; + roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; + roPumpState = RO_PUMP_RAMP_UP_TO_TARGET_FLOW_STATE; // Get the initial guess of the duty cycle - roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( roFlowRate ); + roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( roFlowRate ); + roControlTimerCounter = 0; result = TRUE; } // Requested max pressure is out of range @@ -271,8 +272,8 @@ roPumpOpenLoopTargetDutyCycle = 0.0; roControlTimerCounter = 0; isROPumpOn = FALSE; - targetROPumpPressure = 0; - resetPIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_DUTY_CYCLE ); + targetROPumpMaxPressure = 0; + resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_PUMP_DUTY_CYCLE ); } /*********************************************************************//** @@ -320,7 +321,7 @@ // To monitor the flow, the control mode must be in closed loop and the pump should be control to target state, // meaning, it is controlling to a certain pressure - if ( roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP && roPumpState == RO_PUMP_CONTROL_TO_TARGET_STATE ) + /*if ( roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP && roPumpState == RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE ) { F32 const currentFlow = getMeasuredROFlowRate(); F32 const targetFlow = getTargetROPumpFlowRate(); @@ -346,7 +347,7 @@ { activateSafetyShutdown(); } - } + }*/ // Publish RO pump data on interval publishROPumpData(); @@ -367,14 +368,18 @@ roPumpState = handleROPumpOffState(); break; - case RO_PUMP_RAMP_UP_STATE: - roPumpState = handleROPumpRampUpState(); + case RO_PUMP_RAMP_UP_TO_TARGET_FLOW_STATE: + roPumpState = handleROPumpRampUpToTargetFlowState(); break; - case RO_PUMP_CONTROL_TO_TARGET_STATE: - roPumpState = handleROPumpControlToTargetState(); + case RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE: + roPumpState = handleROPumpControlToTargetFlowState(); break; + case RO_PUMP_CONTROL_TO_MAX_PRESSURE_STATE: + roPumpState = handleROPumpControlToMaxPressureState(); + break; + case RO_PUMP_OPEN_LOOP_STATE: roPumpState = handleROPumpOpenLoopState(); break; @@ -427,7 +432,7 @@ *************************************************************************/ static RO_PUMP_STATE_T handleROPumpOffState( void ) { - RO_PUMP_STATE_T result = RO_PUMP_OFF_STATE; + RO_PUMP_STATE_T state = RO_PUMP_OFF_STATE; // If there is a flow, transition to the PI controller to get the corresponding pressure of that flow if ( getTargetROPumpFlowRate() > 0 && roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP ) @@ -437,33 +442,33 @@ isROPumpOn = TRUE; roPumpDutyCyclePctSet = ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() ); setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet ); - result = RO_PUMP_RAMP_UP_STATE; + state = RO_PUMP_RAMP_UP_TO_TARGET_FLOW_STATE; } // If the target duty cycle is greater than zero (minimum is 10%) and the mode has been set to open // loop, set the duty cycle if ( roPumpOpenLoopTargetDutyCycle > 0 && roPumpControlMode == PUMP_CONTROL_MODE_OPEN_LOOP ) { setROPumpControlSignalDutyCycle( roPumpOpenLoopTargetDutyCycle ); isROPumpOn = TRUE; - result = RO_PUMP_OPEN_LOOP_STATE; + state = RO_PUMP_OPEN_LOOP_STATE; } - return result; + return state; } /*********************************************************************//** * @brief - * The handleROPumpRampUpState function handles the RO pump ramp up state - * of the controller state machine. + * The handleROPumpRampUpToTargetFlowState function handles the RO pump + * ramp up to flow state of the controller state machine. * @details Inputs: roControlTimerCounter, roPumpPWMDutyCyclePctSet, * rampUp2FlowTimeoutCounter * @details Outputs: roControlTimerCounter, roPumpPWMDutyCyclePctSet, * rampUp2FlowTimeoutCounter * @return next state of the controller state machine *************************************************************************/ -static RO_PUMP_STATE_T handleROPumpRampUpState( void ) +static RO_PUMP_STATE_T handleROPumpRampUpToTargetFlowState( void ) { - RO_PUMP_STATE_T result = RO_PUMP_RAMP_UP_STATE; + RO_PUMP_STATE_T state = RO_PUMP_RAMP_UP_TO_TARGET_FLOW_STATE; // Get the current pressure from the sensor F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); @@ -492,76 +497,117 @@ // be reset to the corresponding pressure of the target flow rate. if ( ( actualPressure > targetPressure ) || ( ( targetPressure - actualPressure ) < MAX_PRESSURE_TARGET_TOLERANCE ) ) { - resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpDutyCyclePctSet ); - result = RO_PUMP_CONTROL_TO_TARGET_STATE; + resetPIController( PI_CONTROLLER_ID_RO_PUMP_MAX_PRES, roPumpDutyCyclePctSet ); + state = RO_PUMP_CONTROL_TO_MAX_PRESSURE_STATE; } // else if ( TRUE == isFlowOutOfRange ) { - roPumpDutyCyclePctSet += ( targetFlowRate - actualFlowRate ) * 0.5; - //roPumpDutyCyclePctSet = ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() ); + roPumpDutyCyclePctSet += ( targetFlowRate - actualFlowRate ) * ROP_RAMP_UP_P_COEFFICIENT; + // If the duty cycle is out of the define range for the RO pump, set the boundaries + roPumpDutyCyclePctSet = roPumpDutyCyclePctSet < MIN_RO_PUMP_DUTY_CYCLE ? MIN_RO_PUMP_DUTY_CYCLE : roPumpDutyCyclePctSet; + roPumpDutyCyclePctSet = roPumpDutyCyclePctSet > MAX_RO_PUMP_DUTY_CYCLE ? MAX_RO_PUMP_DUTY_CYCLE : roPumpDutyCyclePctSet; + setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet ); } // Reached to the target flow go to the next state else { - resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpDutyCyclePctSet ); - result = RO_PUMP_CONTROL_TO_TARGET_STATE; + resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet ); + state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } roControlTimerCounter = 0; } - /*if ( TRUE == setupROPumpControl ) - { - //resetPersistentAlarmTimer( ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT ); - result = RO_PUMP_CONTROL_SETUP_STATE; - }*/ - - return result; + return state; } /*********************************************************************//** * @brief - * The handleROPumpControlToTargetState function handles the control to - * target state of the RO pump controller state machine. + * The handleROPumpControlToTargetFlowState function handles the control to + * target flow state of the RO pump controller state machine. * @details Inputs: roPumpPWMDutyCyclePctSet, roControlTimerCounter, * roPumpControlModeSet * @details Outputs: roPumpPWMDutyCyclePctSet, roControlTimerCounter * @return next state of the controller state machine *************************************************************************/ -static RO_PUMP_STATE_T handleROPumpControlToTargetState( void ) +static RO_PUMP_STATE_T handleROPumpControlToTargetFlowState( void ) { - RO_PUMP_STATE_T result = RO_PUMP_CONTROL_TO_TARGET_STATE; + RO_PUMP_STATE_T state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; // Control at set interval - if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL && roPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) + if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL && roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP ) { // Get the pressure to use it for setting the control F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); - if ( actualPressure >= targetROPumpPressure ) + + + if ( actualPressure >= targetROPumpMaxPressure ) { + resetPIController( PI_CONTROLLER_ID_RO_PUMP_MAX_PRES, roPumpDutyCyclePctSet ); + state = RO_PUMP_CONTROL_TO_MAX_PRESSURE_STATE; + } + else + { + roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpFlowRate(), getMeasuredROFlowRate() ); + } + + setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet ); + + roControlTimerCounter = 0; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleROPumpControlToMaxPressureState function handles the control + * to max pressure state of the RO pump controller state machine. + * @details Inputs: roPumpPWMDutyCyclePctSet, roControlTimerCounter, + * roPumpControlModeSet + * @details Outputs: roPumpPWMDutyCyclePctSet, roControlTimerCounter + * @return next state of the controller state machine + *************************************************************************/ +static RO_PUMP_STATE_T handleROPumpControlToMaxPressureState( void ) +{ + RO_PUMP_STATE_T state = RO_PUMP_CONTROL_TO_MAX_PRESSURE_STATE; + + // Get the pressure to use it for setting the control + F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); + + // Control at set interval + if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL && roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP ) + { + if ( actualPressure > targetROPumpMaxPressure ) + { roPumpDutyCyclePctSet -= ROP_RAMP_DOWN_DUTY_CYCLE_RATIO; - resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpDutyCyclePctSet ); + resetPIController( PI_CONTROLLER_ID_RO_PUMP_MAX_PRES, roPumpDutyCyclePctSet ); } else { - roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP, getTargetROPumpFlowRate(), getMeasuredROFlowRate() ); + roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_MAX_PRES, getTargetROPumpFlowRate(), getMeasuredROFlowRate() ); } setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet ); roControlTimerCounter = 0; } - /*if ( TRUE == setupROPumpControl ) + // Check if the actual pressure is out of tolerance from max pressure. + // If it is out, go back to ramp up state and to try to reach to target flow again + if ( ( targetROPumpMaxPressure - actualPressure ) > MAX_PRESSURE_TARGET_TOLERANCE ) { - result = RO_PUMP_CONTROL_SETUP_STATE; - }*/ + state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; - return result; + roControlTimerCounter = 0; + } + + return state; } + /*********************************************************************//** * @brief * The handleROPumpOpenLoopState function handles the open loop state of @@ -684,7 +730,7 @@ *************************************************************************/ F32 getTargetROPumpPressure( void ) { - return targetROPumpPressure; + return targetROPumpMaxPressure; } /*********************************************************************//** @@ -805,7 +851,7 @@ // Make sure the requested pressure is in range if ( value >= MIN_ALLOWED_PRESSURE_PSI && value <= MAX_ALLOWED_PRESSURE_PSI ) { - targetROPumpPressure = value; + targetROPumpMaxPressure = value; result = TRUE; } } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -54,19 +54,19 @@ #define DRAIN_WEIGH_UNCHANGE_TIMEOUT ( 2 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. // Flush drain path state defines -#define FLUSH_DRAIN_WAIT_TIME_MS ( 60 * MS_PER_SECOND ) ///< Flush Drain path wait time in milliseconds. +#define FLUSH_DRAIN_WAIT_TIME_MS ( 1 * MS_PER_SECOND ) ///< Flush Drain path wait time in milliseconds. TODo original time was 60 seconds #define MIN_INLET_TEMPERATURE_C 25.0 ///< Minimum water inlet temperature in C. #define MIN_INLET_CONDUCTIVITY_US_PER_CM 0.0 ///< Minimum water inlet conductivity in uS/cm #define MAX_INLET_CONDUCTIVITY_US_PER_CM 2000.0 ///< Maximum water inlet conductivity in us/cm // Flush circulation path state defines -#define RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM 0.8 ///< RO pump target flow rate during flush/fill in L/min. +#define RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM 0.6 ///< RO pump target flow rate during flush/fill in L/min. TODO original flow was 0.8 #define MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI 130 ///< Maximum RO pump pressure during flush/fill states in psi. -#define FLUSH_CICRCULATION_WAIT_TIME_MS ( 30 * MS_PER_SECOND ) ///< Flush/rinse circulation path wait time in milliseconds. +#define FLUSH_CICRCULATION_WAIT_TIME_MS ( 30 * MS_PER_SECOND ) ///< Flush/rinse circulation path wait time in milliseconds. TODO original time was 30 seconds #define MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C 3.0 ///< Maximum flush circulation temperature difference tolerance in C. // Flush and drain R1 and R2 -#define RSRVRS_FULL_VOL_ML 2200.0 ///< Reservoirs 1 & 2 full volume in mL. +#define RSRVRS_FULL_VOL_ML 1900.0 ///< Reservoirs 1 & 2 full volume in mL. #define RSRVRS_PARTIAL_FILL_VOL_ML 500.0 ///< Reservoirs 1 & 2 partial volume in mL. #define RSRVRS_FILL_UP_TIMEOUT_MS ( 5 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 full fill up timeout in ms. #define RSRVRS_500ML_FILL_UP_TIMEOUT_MS ( 2 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 partial fill up timeout in ms. @@ -88,14 +88,6 @@ // Rinse R1 to R2 #define ROF_MIN_LOW_PRESSURE_TEMPERATURE_C 45.0 ///< RO filter minimum temperature that the pressure must be no more than 30psi in C. -/// Name of reservoirs -typedef enum rsrvrs -{ - R1 = 0, ///< Reservoir 1 - R2, ///< Reservoir 2 - NUM_OF_RSRVRS ///< Number of reservoirs -} RSRVRS_T; //TODO remove - /// TODO remove? typedef enum rsvrs_status { @@ -151,7 +143,7 @@ static void resetActuators( void ); static void setModeToFailed( DG_HEAT_DISINFECT_STATE_T state ); -static BOOL isRsrvrFull( RSRVRS_T r, F32 targetVol, U32 timeout, DG_HEAT_DISINFECT_STATE_T state ); +static BOOL isRsrvrFull( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout, DG_HEAT_DISINFECT_STATE_T state ); static BOOL isRsrvrEmpty( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout, DG_HEAT_DISINFECT_STATE_T failedState ); static BOOL isStateHeatDisinfectComplete( DG_HEAT_DISINFECT_STATE_T state ); static void publishHeatDisinfectData( void ); @@ -364,7 +356,8 @@ { // Close VPi to prevent wasting water setValveState( VPI, VALVE_STATE_CLOSED ); - + // Request a tare for reservoir 1 + tareReservoir(); // Set the actuators to drain R1 setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); @@ -408,6 +401,8 @@ else { // Set the actuators to drain R2. + // Request a tare for reservoir 2 + tareReservoir(); // NOTE: Drain pump is already on and VDr is already on drain state setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); stateTimer = getMSTimerCount(); @@ -442,6 +437,7 @@ else { stateTrialCounter = 0; + signalDrainPumpHardStop(); setValveState( VPI, VALVE_STATE_OPEN ); stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN; @@ -467,10 +463,10 @@ if ( didTimeout( stateTimer, FLUSH_DRAIN_WAIT_TIME_MS ) ) { // If the inlet temperature and conductivity are in range, move onto the next state - if ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) > MIN_INLET_TEMPERATURE_C /*&& + if ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) > 15 /*MIN_INLET_TEMPERATURE_C && TODO bring the code back getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) > MIN_INLET_CONDUCTIVITY_US_PER_CM*/ ) { - setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); + setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setROPumpTargetFlowRate( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); stateTimer = getMSTimerCount(); stateTrialCounter = 0; @@ -511,9 +507,9 @@ F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); F32 TD1Temp = getTemperatureValue( TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ); F32 TD2Temp = getTemperatureValue( TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); - F32 avgTemp = ( TPmTemp + TPoTemp + TD1Temp + TD2Temp ) / 4.0; + F32 avgTemp = ( /*TPmTemp +*/ TPoTemp + TD1Temp + TD2Temp ) / 3.0; //TODO add TPm once we have the sensor in change the average count to 4.0 - BOOL isTPmOut = fabs( TPmTemp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C; + BOOL isTPmOut = FALSE; //fabs( TPmTemp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C; TODO uncomment this when BOOL isTPoOut = fabs( TPoTemp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C; BOOL isTD1Out = fabs( TD1Temp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C; BOOL isTD2Out = fabs( TD2Temp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C; @@ -568,17 +564,17 @@ *************************************************************************/ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFlushR1AndR2State( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_CIRCULATION; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_R1_AND_R2; // If R1 is not full, keep monitoring for R1 level and timeout - if ( FALSE == isR1Full ) + if ( isR1Full != TRUE ) { - isR1Full = isRsrvrFull( R1, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); + isR1Full = isRsrvrFull( DG_RESERVOIR_1, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); } // Once R1 is full, keep monitoring for R2 level and timeout if( isR1Full ) { - isR2Full = isRsrvrFull( R2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); + isR2Full = isRsrvrFull( DG_RESERVOIR_2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); // Once R2 is full (to 500mL in this case), transition to the next state if ( isR2Full ) @@ -590,6 +586,9 @@ setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); stateTimer = getMSTimerCount(); + // Set both reservoirs to full status to FALSE + isR2Full = FALSE; + isR1Full = FALSE; state = DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1; } } @@ -607,26 +606,24 @@ *************************************************************************/ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFlushR2AndDrainR1State( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_CIRCULATION; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1; // If reservoir 1 is empty, turn off the drain pump - if ( FALSE == isR1Full ) + if ( isRsrvrEmpty( DG_RESERVOIR_1, DRAIN_WEIGH_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS, state ) ) { - isR1Full = isRsrvrEmpty( DG_RESERVOIR_1, DRAIN_WEIGH_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS, state ); - // Done with draining R1 signalDrainPumpHardStop(); } // First reservoir 2 must be completely full - if ( FALSE == isR2Full ) + if ( isR2Full != TRUE ) { - isR2Full = isRsrvrFull( R2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); + isR2Full = isRsrvrFull( DG_RESERVOIR_2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); } // Once R2 is full, R1 must be partially full - else + if( isR2Full ) { - isR1Full = isRsrvrFull( R1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); + isR1Full = isRsrvrFull( DG_RESERVOIR_1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); // Once R1 is partially full, transition to the next state if ( isR1Full ) @@ -663,7 +660,7 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R2; // If reservoir 2 is empty, set the drain valve to drain R1 - if (isRsrvrEmpty( DG_RESERVOIR_2, DRAIN_WEIGH_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS, state ) ) + if ( isRsrvrEmpty( DG_RESERVOIR_2, DRAIN_WEIGH_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS, state ) ) { setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); // Start the timer for drain timeout @@ -689,10 +686,16 @@ // If reservoir 1 is empty, set the state to fill water state if ( isRsrvrEmpty( DG_RESERVOIR_1, DRAIN_WEIGH_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS, state ) ) { + // Done with draining the reservoirs + signalDrainPumpHardStop(); + + // Prepare for filling the reservoirs and heating the water setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); // Turn on the RO pump setROPumpTargetFlowRate( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); @@ -722,14 +725,14 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; // First reservoir 1 must be full - if ( FALSE == isR1Full ) + if ( isRsrvrFull( DG_RESERVOIR_1, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ) ) { - isR1Full = isRsrvrFull( R1, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); + isR1Full = TRUE; } // Once reservoir 1 is full, check the status of reservoir 2 since the water overflows to reservoir 2 - else + if ( isR1Full ) { - isR2Full = isRsrvrFull( R2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); + isR2Full = isRsrvrFull( DG_RESERVOIR_2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); // Once reservoir 2 is full, set the actuators for recirculation if ( isR2Full ) @@ -811,7 +814,7 @@ // So waiting for R1 to get to the level of defined partially full BOOL isR1PartiallyFull = fabs( getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ) - RSRVRS_PARTIAL_FILL_VOL_ML ) < RSRVRS_MAX_TARGET_VOL_CHANGE_ML; - if ( isRsrvrFull( R2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ) && isR1PartiallyFull ) + if ( isRsrvrFull( DG_RESERVOIR_2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ) && isR1PartiallyFull ) { // Get the current volumes to be monitored during R2 to R1 heat disinfect state R1HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); @@ -953,12 +956,12 @@ if ( FALSE == isR1Full ) { // Since reservoir 1 is being filled up at a lower flow rate, the timeout is twice as long as a normal fill up - isR1Full = isRsrvrFull( R1, RSRVRS_FULL_VOL_ML, 2 * RSRVRS_FILL_UP_TIMEOUT_MS, state ); + isR1Full = isRsrvrFull( DG_RESERVOIR_1, RSRVRS_FULL_VOL_ML, 2 * RSRVRS_FILL_UP_TIMEOUT_MS, state ); } else { // Since reservoir 2 is being filled up at a lower flow rate, the timeout is longer than a normal fill up - isR2Full = isRsrvrFull( R2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); + isR2Full = isRsrvrFull( DG_RESERVOIR_2, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); if ( isR2Full ) { @@ -1002,11 +1005,11 @@ { if ( FALSE == isR2Full ) { - isR2Full = isRsrvrFull( R2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); + isR2Full = isRsrvrFull( DG_RESERVOIR_2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ); } else { - isR1Full = isRsrvrFull( R1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); + isR1Full = isRsrvrFull( DG_RESERVOIR_1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, state ); if ( isR1Full ) { @@ -1123,16 +1126,16 @@ * @param state is the state that called this function * @return none *************************************************************************/ -static BOOL isRsrvrFull( RSRVRS_T r, F32 targetVol, U32 timeout, DG_HEAT_DISINFECT_STATE_T state ) +static BOOL isRsrvrFull( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout, DG_HEAT_DISINFECT_STATE_T state ) { BOOL rsrvrStatus = FALSE; F32 volume = 0.0; - if ( r == R1 ) + if ( r == DG_RESERVOIR_1 ) { volume = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); } - else if ( r == R2 ) + else if ( r == DG_RESERVOIR_2 ) { volume = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); } @@ -1147,7 +1150,7 @@ else if ( didTimeout( stateTimer, timeout ) ) { // Fill timed out - setModeToFailed( state ); + //setModeToFailed( state ); //TODO un-comment } return rsrvrStatus; Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -41,13 +41,13 @@ // ********** public function prototypes ********** -void initHeatDisinfectMode( void ); // initialize this module -void transitionToHeatDisinfectMode( void ); // prepares for transition to heat disinfect mode -U32 execHeatDisinfectMode( void ); // execute the heat disinfect mode state machine (call from OperationModes) +void initHeatDisinfectMode( void ); // Initialize this module +void transitionToHeatDisinfectMode( void ); // Prepares for transition to heat disinfect mode +U32 execHeatDisinfectMode( void ); // Execute the heat disinfect mode state machine (call from OperationModes) -DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ); // get the current state of the heat disinfect mode. +DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ); // get the current state of the heat disinfect mode. -void stopDGHeatDisinfect( void ); +void stopDGHeatDisinfect( void ); // Stop DG heat disinfect /**@}*/ Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -87,7 +87,7 @@ setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setROPumpTargetFlowRate( TARGET_RO_FLOW_RATE_L, 50 /*TARGET_RO_PRESSURE_PSI*/ ); + setROPumpTargetFlowRate( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); signalDrainPumpHardStop(); startPrimaryHeater(); Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -65,6 +65,7 @@ { 0.0, 0.0, 3000, 300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_BIDIRECTIONAL }, // PI_CONTROLLER_ID_DRAIN_PUMP { 0.0, 0.0, 1.39, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_PRIMARY_HEATER { 0.0, 0.0, 0.50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_TRIMMER_HEATER + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_RO_PUMP_MAX_PRES }; /*********************************************************************//** Index: firmware/App/Services/PIControllers.h =================================================================== diff -u -rc20d71064bad67c2db392c6383bb410e8a7dfa2a -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision c20d71064bad67c2db392c6383bb410e8a7dfa2a) +++ firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -33,10 +33,11 @@ /// Enumeration of PI controllers. typedef enum ControllerList { - PI_CONTROLLER_ID_RO_PUMP = 0, ///< RO Pump controller + PI_CONTROLLER_ID_RO_PUMP_FLOW = 0, ///< RO Pump controller to flow PI_CONTROLLER_ID_DRAIN_PUMP, ///< Drain Pump controller PI_CONTROLLER_ID_PRIMARY_HEATER, ///< Primary Heater controller PI_CONTROLLER_ID_TRIMMER_HEATER, ///< Trimmer Heater controller + PI_CONTROLLER_ID_RO_PUMP_MAX_PRES, ///< RO pump controller to maximum pressure NUM_OF_PI_CONTROLLERS_IDS ///< Number of PI controllers } PI_CONTROLLER_ID_T; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -343,6 +343,18 @@ } sendCommandResponseMsg( &cmdResponse ); +} + +/*********************************************************************//** + * @brief + * The tareReservoir function set the tare load cell variable to TRUE. + * @details Inputs: none + * @details Outputs: none + * @return none + *************************************************************************/ +void tareReservoir( void ) +{ + tareLoadCellRequest = TRUE; } /*********************************************************************//** Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r484b185f0cf4b2ea0ba9de331573952b1b5124b4 -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 484b185f0cf4b2ea0ba9de331573952b1b5124b4) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) @@ -60,7 +60,9 @@ void startFillCmd( U32 fillToVolMl ); // handle fill command from HD void stopFillCmd( void ); // handle stop fill command from HD void startDrainCmd( DRAIN_CMD_T drainCmd ); // handle drain command from HD -void stopDrainCmd( void ); // handle stop drain command from HD +void stopDrainCmd( void ); // handle stop drain command from HD + +void tareReservoir( void ); DG_RESERVOIR_ID_T getInactiveReservoir( void ); F32 getReservoirWeight( DG_RESERVOIR_ID_T reservoirId );