Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r9cc5da6947aa143a10f95519eb7f366c1b095d61 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 9cc5da6947aa143a10f95519eb7f366c1b095d61) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -21,13 +21,15 @@ #include "mibspi.h" #include "DrainPump.h" +#include "FlowSensors.h" #include "FPGA.h" #include "MessageSupport.h" #include "NVDataMgmt.h" #include "OperationModes.h" #include "PersistentAlarm.h" #include "PIControllers.h" #include "Pressures.h" +#include "ROPump.h" #include "SafetyShutdown.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -48,7 +50,12 @@ #define DRAIN_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the Drain Pump data is published on the CAN bus. -#define DRP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the Drain pump is controlled. +#define DRP_CONTROL_INTERVAL ( 200 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the Drain pump is controlled. +#define DRP_CONTROL_MAX_ALLOWED_PPO_PSI 30.0F ///< Drain pump maximum allowed PPo pressure in psi. +#define DRP_CONTROL_MAX_ALLOWED_PDR_PSI 40.0F ///< Drain pump maximum allowed PDr pressure in psi. +#define DRP_CONTROL_PSI_TO_DAC_P_TERM 1 ///< Drain pump psi to DAC conversion. +#define DRP_CONTROL_PRES_TO_MAX_THRESHOLD_PSI 1.0F ///< Drain pump pressure to maximum pressure threshold in psi. +#define DRP_CONTROL_MIN_DAC_CHANGE 1 ///< Drain pump minimum DAC change #define RPM_2_DAC_SLOPE 0.0547F ///< RPM to DAC conversion slope. #define RPM_2_DAC_INTERCEPT 2.9968F ///< RPM to DAC conversion intercept. @@ -61,9 +68,6 @@ #define DRAIN_PUMP_P_COEFFICIENT 0.5F ///< P term for drain pump delta pressure control. #define DRAIN_PUMP_I_COEFFICIENT 1.0F ///< I term for drain pump delta pressure control. -#define MIN_ALLOWED_TARGET_OUTLET_PRESSURE -15.0F ///< Minimum allowed outlet pressure for closed loop control. -#define MAX_ALLOWED_TARGET_OUTLET_PRESSURE 15.0F ///< Maximum allowed outlet pressure for closed loop control. - #define MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE 100 ///< Maximum allowed RPM out of range from target RPM in open loop. #define OPEN_LOOP_RPM_OUT_OF_RANGE_TIME_OUT ( 10 * MS_PER_SECOND ) ///< Open loop RPM out of range time out in ms. @@ -114,8 +118,8 @@ DRAIN_PUMP_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish drain pump data to CAN bus. static U32 targetDrainPumpRPM; ///< Target drain pump RPM. -static F32 targetDrainPumpOutletPressure; ///< Target outlet pressure for the drain pump. -static U32 drainControlTimerCounter; ///< Determines when to perform control on drain pump. +static F32 targetDrainPumpOutletFlowLPM; ///< Target outlet pressure for the drain pump. +static U32 drainControlTimerCtr; ///< Determines when to perform control on drain pump. static BOOL hasClosedLoopBeenRequested; ///< Closed loop pump control flag. static OVERRIDE_U32_T drainPumpMeasuredRPM = { 0, 0, 0, 0 }; ///< Measured drain pump RPM from feedback. static OVERRIDE_F32_T drainPumpMeasuredCurrentA = { 0.0F, 0.0F, 0.0F, 0 }; ///< Measured drain pump current feedback. @@ -126,6 +130,7 @@ static U32 pendingDrainPumpCmdCountDown; ///< Delayed (pending) drain pump command count down timer (in task intervals). static DG_DRAIN_LINE_VOLUME_T drainLineVolumeRecord; ///< Drain line volume record. static DG_DRAIN_PUMP_CAL_RECORD_T drainPumpCalRecord; ///< Drain pump calibration record. +static BOOL isDrainPumpControlInFlowMode; ///< Drain pump flag to indicate whether the drain pump in flow control or not. /// ADC to RPM conversion coefficient or RPM to ADC conversion. static const F32 RPM_CONVERSION_COEFF = (F32) SEC_PER_MIN / ( 2.0F * TOGGLE_PERIOD_RESOLUTION_SECONDS * ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION ); @@ -147,10 +152,10 @@ * @details Inputs: none * @details Outputs: drainPumpState, drainPumpDAC, drainPumpDACSet, * drainPumpControlMode, drainPumpControlModeSet, targetDrainPumpRPM, - * targetDrainPumpOutletPressure, drainControlTimerCounter, + * targetDrainPumpOutletFlowLPM, drainControlTimerCtr, * pendingDrainPumpCmd, pendingDrainPumpCmdTarget, pendingDrainPumpCmdCountDown, * hasClosedLoopBeenRequested, signalNewRPMRequest, - * drainPumpDataPublicationTimerCounter, + * drainPumpDataPublicationTimerCounter, isDrainPumpControlInFlowMode * @return none *************************************************************************/ void initDrainPump( void ) @@ -163,14 +168,15 @@ drainPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; drainPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; targetDrainPumpRPM = 0; - targetDrainPumpOutletPressure = 0.0F; - drainControlTimerCounter = 0; + targetDrainPumpOutletFlowLPM = 0.0F; + drainControlTimerCtr = 0; pendingDrainPumpCmd = DRAIN_PUMP_OFF_STATE; pendingDrainPumpCmdTarget = 0.0F; pendingDrainPumpCmdCountDown = 0; hasClosedLoopBeenRequested = FALSE; signalNewRPMRequest = FALSE; drainPumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + isDrainPumpControlInFlowMode = TRUE; // Initialize the drain pump PI controller initializePIController( PI_CONTROLLER_ID_DRAIN_PUMP, DRAIN_PUMP_MIN_DAC, DRAIN_PUMP_P_COEFFICIENT, DRAIN_PUMP_I_COEFFICIENT, @@ -252,72 +258,41 @@ /*********************************************************************//** * @brief - * The setDrainPumpTargetOutletPressure function sets the drain pump to start - * with given target PDr pressure. - * @details Inputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, - * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet - * @details Outputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, - * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet - * @param pressure new target drain pump outlet pressure + * The setDrainPumpTargetOutletFlowLPM function sets the drain pump target flow + * rate in L/min. + * @details Inputs: none + * @details Outputs: targetDrainPumpOutletFlowFMP, hasClosedLoopBeenRequested, + * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet, + * isDrainPumpControlInFlowMode + * @param flow new target flow in L/min * @return TRUE if new target speed is set, FALSE if not *************************************************************************/ -BOOL setDrainPumpTargetOutletPressure( F32 pressure ) +BOOL setDrainPumpTargetOutletFlowLPM( F32 flow ) { BOOL result = FALSE; // Check the delta pressure is in range - if ( ( pressure >= MIN_ALLOWED_TARGET_OUTLET_PRESSURE ) && ( pressure <= MAX_ALLOWED_TARGET_OUTLET_PRESSURE ) ) + if ( ( flow >= MIN_RO_FLOWRATE_LPM ) && ( flow <= MAX_RO_FLOWRATE_LPM ) ) { // Set all the variables for closed loop mode - targetDrainPumpOutletPressure = pressure; - hasClosedLoopBeenRequested = TRUE; - drainPumpDAC = DRAIN_PUMP_MIN_DAC; - drainPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; - drainPumpControlModeSet = drainPumpControlMode; - result = TRUE; + targetDrainPumpOutletFlowLPM = flow; + hasClosedLoopBeenRequested = TRUE; + drainPumpDAC = DRAIN_PUMP_MIN_DAC; + drainPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; + drainPumpControlModeSet = drainPumpControlMode; + result = TRUE; + isDrainPumpControlInFlowMode = TRUE; } else { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DRAIN_PUMP_INVALID_DELTA_PRESSURE_SELECTED, pressure ) + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DRAIN_PUMP_TARGET_FLOW_LPM_SELECTED, flow ) } return result; } /*********************************************************************//** * @brief - * The setDrainPumpTargetOutletPressureDelayed function sets the drain pump - * to start with given target PDr pressure after given delay. - * @details Inputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, - * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet - * @details Outputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, - * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet - * @param pressure new target drain pump outlet pressure - * @param delayMS delay duration (in ms) before drain pump started - * @return TRUE if new target speed is set, FALSE if not - *************************************************************************/ -BOOL setDrainPumpTargetOutletPressureDelayed( F32 pressure, U32 delayMs ) -{ - BOOL result = FALSE; - - // Check the delta pressure is in range - if ( ( pressure >= MIN_ALLOWED_TARGET_OUTLET_PRESSURE ) && ( pressure <= MAX_ALLOWED_TARGET_OUTLET_PRESSURE ) ) - { - pendingDrainPumpCmd = DRAIN_PUMP_CONTROL_TO_TARGET_STATE; - pendingDrainPumpCmdTarget = pressure; - pendingDrainPumpCmdCountDown = delayMs / TASK_GENERAL_INTERVAL; - result = TRUE; - } - else - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DRAIN_PUMP_INVALID_DELTA_PRESSURE_SELECTED, pressure ) - } - - return result; -} - -/*********************************************************************//** - * @brief * The signalDrainPumpHardStop function stops the Drain pump immediately. * @details Inputs: none * @details Outputs: targetDrainPumpRPM, drainPumpState, drainPumpControlMode, @@ -334,7 +309,7 @@ hasClosedLoopBeenRequested = FALSE; drainPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; drainPumpControlModeSet = drainPumpControlMode; - drainControlTimerCounter = 0; + drainControlTimerCtr = 0; pendingDrainPumpCmd = DRAIN_PUMP_OFF_STATE; pendingDrainPumpCmdTarget = 0.0; pendingDrainPumpCmdCountDown = 0; @@ -480,7 +455,7 @@ { if ( DRAIN_PUMP_CONTROL_TO_TARGET_STATE == pendingDrainPumpCmd ) { - targetDrainPumpOutletPressure = pendingDrainPumpCmdTarget; + targetDrainPumpOutletFlowLPM = pendingDrainPumpCmdTarget; hasClosedLoopBeenRequested = TRUE; drainPumpDAC = DRAIN_PUMP_MIN_DAC; drainPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; @@ -583,15 +558,15 @@ /*********************************************************************//** * @brief - * The getTargetDrainPumpOutletPressure function gets the current target - * drain pump delta pressure. + * The targetDrainPumpOutletFlowLPM function gets the current target + * drain pump flow in L/min. * @details Inputs: targetDrainPumpOutletPressure * @details Outputs: none - * @return the current target drain pump outlet pressure. + * @return the current target drain pump flow in L/min *************************************************************************/ -F32 getDrainPumpTargetOutletPressure( void ) +F32 getDrainPumpTargetOutletFlowLPM( void ) { - return targetDrainPumpOutletPressure; + return targetDrainPumpOutletFlowLPM; } /*********************************************************************//** @@ -667,25 +642,68 @@ * @brief * The handleDrainPumpControlToTargetState function handles the control to * target state of the drain pump controller state machine. - * @details Inputs: drainControlTimerCounter, drainPumpDACSet - * @details Outputs: drainControlTimerCounter, drainPumpDACSet + * @details Inputs: drainControlTimerCtr + * @details Outputs: drainControlTimerCtr, drainPumpDACSet * @return next state of the controller state machine *************************************************************************/ static DRAIN_PUMP_STATE_T handleDrainPumpControlToTargetState( void ) { DRAIN_PUMP_STATE_T state = DRAIN_PUMP_CONTROL_TO_TARGET_STATE; // control at set interval - if ( ++drainControlTimerCounter >= DRP_CONTROL_INTERVAL ) + if ( ++drainControlTimerCtr >= DRP_CONTROL_INTERVAL ) { - F32 outletDrainPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); - F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, getDrainPumpTargetOutletPressure(), outletDrainPressure ); + U32 tempDACSet; + F32 drainPumpOutletPressurePSI = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); + F32 roPumpOutletPressurePSI = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); - // The PI controller sends the DAC out and it is rounded to the nearest offset and is fed to the FPGA - drainPumpDACSet = (U32)( dac + FLOAT_TO_INT_ROUNDUP_OFFSET ); - setFPGADrainPumpSpeed( drainPumpDACSet ); + if ( TRUE == isDrainPumpControlInFlowMode ) + { + // If the flow control flag is on, Control to flow + F32 targetROFlowLPM = getDrainPumpTargetOutletFlowLPM(); + F32 msrdROFlowLPM = getMeasuredFlowRateLPM( RO_FLOW_SENSOR ); + F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, targetROFlowLPM, msrdROFlowLPM ); + drainPumpDACSet = (U32)( dac + FLOAT_TO_INT_ROUNDUP_OFFSET ); - drainControlTimerCounter = 0; + if ( ( drainPumpOutletPressurePSI > DRP_CONTROL_MAX_ALLOWED_PDR_PSI ) || ( roPumpOutletPressurePSI > DRP_CONTROL_MAX_ALLOWED_PPO_PSI ) ) + { + // If either of the pressure sensors are above range, transition to control to pressure + isDrainPumpControlInFlowMode = FALSE; + } + } + else + { + // Get the status of the current pressure readings with respect to their maximum pressures + // Get the maximum of the pressure difference of PPo and PDr + F32 pdrSubPSI = drainPumpOutletPressurePSI - DRP_CONTROL_MAX_ALLOWED_PDR_PSI; + F32 ppoSubPSI = roPumpOutletPressurePSI - DRP_CONTROL_MAX_ALLOWED_PPO_PSI; + F32 maxPresPSI = MAX( pdrSubPSI, ppoSubPSI ); + + if ( ( pdrSubPSI > NEARLY_ZERO ) || ( ppoSubPSI > NEARLY_ZERO ) ) + { + // If either of the pressure values are greater than the maximum pressure, recalculate the DAC by the maximum pressure difference + // If the calculated DAC value turned out to be 0, set it to 1 so it changes at least by 1 DAC + tempDACSet = (U32)( ( maxPresPSI * DRP_CONTROL_PSI_TO_DAC_P_TERM ) + FLOAT_TO_INT_ROUNDUP_OFFSET ); + drainPumpDACSet -= ( tempDACSet > 0.0F ? tempDACSet : DRP_CONTROL_MIN_DAC_CHANGE ); + } + else if ( ( fabs(pdrSubPSI) > DRP_CONTROL_PRES_TO_MAX_THRESHOLD_PSI ) && ( fabs(ppoSubPSI) > DRP_CONTROL_PRES_TO_MAX_THRESHOLD_PSI ) ) + { + // If both of the DACs turned out to be less than their maximum pressure limits by more than the specified value, recalculate the + // DAC. Using fabs for the subtraction means both pressure subtractions are negative so they are below their limits. + // In the calculations use fabs for max pressure because it is negative so it will end of subtracting DAC but it should be adding + tempDACSet = (U32)( ( fabs(maxPresPSI) * DRP_CONTROL_PSI_TO_DAC_P_TERM ) + FLOAT_TO_INT_ROUNDUP_OFFSET ); + drainPumpDACSet += ( tempDACSet > 0.0F ? tempDACSet : DRP_CONTROL_MIN_DAC_CHANGE ); + } + } + + // Check the DAC to make sure it is not out the min and max ranges of the drain pump + tempDACSet = drainPumpDACSet; + tempDACSet = MIN( tempDACSet, DRAIN_PUMP_MAX_DAC ); + tempDACSet = MAX( tempDACSet, DRAIN_PUMP_MIN_DAC ); + drainPumpDACSet = tempDACSet; + + drainControlTimerCtr = 0; + setFPGADrainPumpSpeed( drainPumpDACSet ); } return state; @@ -750,7 +768,7 @@ drainPumpData.pumpDACSet = drainPumpDACSet; drainPumpData.drainPumpState = (U32)drainPumpState; drainPumpData.drainPumpRPM = getDrainPumpMeasuredRPM(); - drainPumpData.trgtOutletPrsr = targetDrainPumpOutletPressure; + drainPumpData.trgtOutletPrsr = targetDrainPumpOutletFlowLPM; drainPumpData.drainPumpCurrentA = getDrainPumpMeasuredCurrentA(); drainPumpData.drainPumpDirection = getDrainPumpMeasuredDirection(); @@ -815,7 +833,7 @@ drainPumpDataPublishInterval.ovData = intvl; drainPumpDataPublishInterval.override = OVERRIDE_KEY; - result = TRUE; + result = TRUE; } return result; @@ -837,7 +855,7 @@ { drainPumpDataPublishInterval.override = OVERRIDE_RESET; drainPumpDataPublishInterval.ovData = drainPumpDataPublishInterval.ovInitData; - result = TRUE; + result = TRUE; } return result; @@ -874,23 +892,23 @@ /*********************************************************************//** * @brief - * The testSetTargetDrainPumpDeltaPressureOverride function overrides - * the target drain pump delta pressure. + * The testSetTargetDrainPumpOutletFlowLPM function overrides + * the target drain pump outlet flow in L/min/ * @details Inputs: none * @details Outputs: none - * @param value override target drain pump delta pressure + * @param value of flow in L/min * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetTargetDrainPumpOutletPressure( F32 value ) +BOOL testSetTargetDrainPumpOutletFlowLPM( F32 value ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { // Check if delta pressure is in range - if ( ( value >= MIN_ALLOWED_TARGET_OUTLET_PRESSURE ) && ( value <= MAX_ALLOWED_TARGET_OUTLET_PRESSURE ) ) + if ( ( value >= MIN_RO_FLOWRATE_LPM ) && ( value <= MAX_RO_FLOWRATE_LPM ) ) { - result = setDrainPumpTargetOutletPressure( value ); + result = setDrainPumpTargetOutletFlowLPM( value ); } } Index: firmware/App/Controllers/DrainPump.h =================================================================== diff -u -r9cc5da6947aa143a10f95519eb7f366c1b095d61 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision 9cc5da6947aa143a10f95519eb7f366c1b095d61) +++ firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -59,14 +59,13 @@ BOOL setDrainPumpTargetRPM( U32 rpm ); BOOL setDrainPumpTargetRPMDelayed( U32 rpm, U32 delayMs ); -BOOL setDrainPumpTargetOutletPressure( F32 pressure ); -BOOL setDrainPumpTargetOutletPressureDelayed( F32 pressure, U32 delayMs ); +BOOL setDrainPumpTargetOutletFlowLPM( F32 flow ); +F32 getDrainPumpTargetOutletFlowLPM( void ); void signalDrainPumpHardStop( void ); U32 getDrainPumpTargetRPM( void ); U32 getDrainPumpMeasuredRPM( void ); -F32 getDrainPumpTargetOutletPressure( void ); BOOL isDrainPumpOn( void ); @@ -76,7 +75,7 @@ BOOL testResetDrainPumpDataPublishIntervalOverride( void ); BOOL testSetTargetDrainPumpRPM( U32 value ); -BOOL testSetTargetDrainPumpOutletPressure( F32 value ); +BOOL testSetTargetDrainPumpOutletFlowLPM( F32 value ); BOOL testSetDrainPumpMeasuredRPMOverride( U32 value ); BOOL testResetDrainPumpMeasuredRPMOverride( void ); Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r3a371ac06b79d024d7fe1607f003031eb9322ba4 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 3a371ac06b79d024d7fe1607f003031eb9322ba4) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -88,7 +88,7 @@ HEATERS_STATE_T state; ///< Heater state. BOOL startHeaterSignal; ///< Heater start indication flag. BOOL isHeaterOn; ///< Heater on/off status flag. - F32 dutyCycle; ///< Heater duty cycle. + OVERRIDE_F32_T dutyCycle; ///< Heater duty cycle. F32 targetFlow; ///< Heater target flow. BOOL hasTargetTempChanged; ///< Heater target temperature change flag indicator. F32 heaterEstGain; ///< Heater estimation gain during the run. @@ -116,6 +116,7 @@ static F32 calculatePrimaryHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); static F32 calculateTrimmerHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); static BOOL haveHeaterControlConditionsChanged( DG_HEATERS_T heater ); +static F32 getHeaterDutyCycle( DG_HEATERS_T heater ); static void setMainPrimaryHeaterPWM( F32 pwm ); static void setSmallPrimaryHeaterPWM( F32 pwm ); @@ -142,7 +143,10 @@ heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; heatersStatus[ heater ].startHeaterSignal = FALSE; heatersStatus[ heater ].isHeaterOn = FALSE; - heatersStatus[ heater ].dutyCycle = 0.0F; + heatersStatus[ heater ].dutyCycle.data = 0.0F; + heatersStatus[ heater ].dutyCycle.ovData = 0.0F; + heatersStatus[ heater ].dutyCycle.ovInitData = 0.0F; + heatersStatus[ heater ].dutyCycle.override = 0; heatersStatus[ heater ].targetFlow = 0.0F; heatersStatus[ heater ].hasTargetTempChanged = FALSE; heatersStatus[ heater ].heaterEstGain = HEATERS_NEUTRAL_EST_GAIN; @@ -413,7 +417,7 @@ #endif { F32 heaterEstGain = heatersStatus[ heater ].heaterEstGain; - F32 heaterDutyCycle = heatersStatus[ heater ].dutyCycle; + F32 heaterDutyCycle = heatersStatus[ heater ].dutyCycle.data; F32 lastFillTemperature = getAvgFillTemperature(); F32 primaryTargetTemperature = heatersStatus[ heater ].targetTemp; BOOL isTempUnderTarget = ( lastFillTemperature < primaryTargetTemperature ? TRUE : FALSE ); @@ -630,7 +634,7 @@ } else { - dutyCycle = heatersStatus[ heater ].dutyCycle; + dutyCycle = heatersStatus[ heater ].dutyCycle.data; } state = HEATER_EXEC_STATE_TRIMMER_CONTROL_TO_TARGET; @@ -702,7 +706,7 @@ F32 targetFlowLPM = heatersStatus[ heater ].targetFlow; F32 dutyCycle = calculateTrimmerHeaterDutyCycle( targetTemperature, outletRedundantTemperature, targetFlowLPM, TRUE ); - tempDutyCycle = heatersStatus[ heater ].dutyCycle + dutyCycle; + tempDutyCycle = heatersStatus[ heater ].dutyCycle.data + dutyCycle; tempDutyCycle = MIN( tempDutyCycle, HEATERS_MAX_DUTY_CYCLE ); tempDutyCycle = MAX( tempDutyCycle, HEATERS_MIN_DUTY_CYCLE ); @@ -725,17 +729,20 @@ { if ( heater < NUM_OF_DG_HEATERS ) { + F32 duty; + + heatersStatus[ heater ].dutyCycle.data = pwm; + duty = getHeaterDutyCycle( heater ); + if ( DG_PRIMARY_HEATER == heater ) { - setMainPrimaryHeaterPWM( pwm ); - setSmallPrimaryHeaterPWM( pwm ); + setMainPrimaryHeaterPWM( duty ); + setSmallPrimaryHeaterPWM( duty ); } else if ( DG_TRIMMER_HEATER == heater ) { - setTrimmerHeaterPWM( pwm ); + setTrimmerHeaterPWM( duty ); } - - heatersStatus[ heater ].dutyCycle = pwm; } else { @@ -831,6 +838,20 @@ /*********************************************************************//** * @brief + * The getHeaterDutyCycle function returns the heater's duty cycle. + * @details Inputs: heaterStatus + * @param heater: The heater Id that its on state is handled + * @return duty cycle + *************************************************************************/ +static F32 getHeaterDutyCycle( DG_HEATERS_T heater ) +{ + F32 duty = getF32OverrideValue( &heatersStatus[ heater ].dutyCycle ); + + return duty; +} + +/*********************************************************************//** + * @brief * The setMainPrimaryHeaterPWM function sets the PWM of the main primary heater. * @details Inputs: none * @details Outputs: Sets the PWM duty cycle for the main primary heater @@ -908,9 +929,9 @@ // The duty cycle of the primary heater is divided into 2 parts and is applied to main // and small primary heaters. So they are always the same. - data.mainPrimayHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; - data.smallPrimaryHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; - data.trimmerHeaterDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; + data.mainPrimayHeaterDC = getHeaterDutyCycle( DG_PRIMARY_HEATER ) * FRACTION_TO_PERCENT_FACTOR; + data.smallPrimaryHeaterDC = getHeaterDutyCycle( DG_PRIMARY_HEATER ) * FRACTION_TO_PERCENT_FACTOR; + data.trimmerHeaterDC = getHeaterDutyCycle( DG_TRIMMER_HEATER ) * FRACTION_TO_PERCENT_FACTOR; data.primaryTargetTemp = heatersStatus[ DG_PRIMARY_HEATER ].targetTemp; data.trimmerTargetTemp = heatersStatus[ DG_TRIMMER_HEATER ].targetTemp; data.primaryHeaterState = heatersStatus[ DG_PRIMARY_HEATER ].state; @@ -939,9 +960,9 @@ F32 trimmerVoltage = getMonitoredLineLevel( MONITORED_LINE_24V_GND_TRIM_HTR_V ); // Voltage to PWM is reverse. If PWM = 0 -> V = 24V - F32 mainPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle; - F32 smallPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle; - F32 trimmerDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle; + F32 mainPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data; + F32 smallPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data; + F32 trimmerDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data; // The expected voltage is the inverse of the duty cycle F32 mainPriExpectedVoltage = HEATERS_MAX_OPERATING_VOLTAGE_V * ( 1.0F - mainPriDC ); @@ -997,11 +1018,58 @@ /*********************************************************************//** * @brief + * The testSetHeaterDutyCycleOverride function overrides the specified heater's + * duty cycle. + * @details Inputs: heatersStatus + * @details Outputs: heatersStatus + * @return TRUE if the override was successful otherwise FALSE + *************************************************************************/ +BOOL testSetHeaterDutyCycleOverride( U32 heater, F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + if ( ( value >= HEATERS_MIN_DUTY_CYCLE ) && ( value <= HEATERS_MAX_DUTY_CYCLE ) ) + { + result = TRUE; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovData = value; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetHeaterDutyCycleOverride function resets the heater's + * duty cycle overridden value. + * @details Inputs: heatersStatus + * @details Outputs: heatersStatus + * @return TRUE if the reset was successful otherwise, FALSE + *************************************************************************/ +BOOL testResetHeaterDutyCycleOverride( U32 heater ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.override = OVERRIDE_RESET; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovData = heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The testSetHeatersPublishIntervalOverride function overrides the heaters * publish data time interval. * @details Inputs: heatersDataPublishInterval * @details Outputs: heatersDataPublishInterval - * @return result + * @return TRUE if the override was successful otherwise *************************************************************************/ BOOL testSetHeatersPublishIntervalOverride( U32 value ) { @@ -1025,7 +1093,7 @@ * publish time interval to its previous time interval. * @details Inputs: heatersDataPublishInterval * @details Outputs: heatersDataPublishInterval - * @return result + * @return TRUE if the reset was successful otherwise, FALSE *************************************************************************/ BOOL testResetHeatersPublishIntervalOverride( void ) { Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -r9cc5da6947aa143a10f95519eb7f366c1b095d61 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 9cc5da6947aa143a10f95519eb7f366c1b095d61) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -70,6 +70,9 @@ void setTrimmerHeaterUseLastDutyCycleStatus( BOOL status ); +BOOL testSetHeaterDutyCycleOverride( U32 heater, F32 value ); +BOOL testResetHeaterDutyCycleOverride( U32 heater ); + BOOL testSetHeatersPublishIntervalOverride( U32 value ); BOOL testResetHeatersPublishIntervalOverride( void ); Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r81769c6bea6ed32d70698fb03ad5823de1814b27 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 81769c6bea6ed32d70698fb03ad5823de1814b27) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -155,7 +155,6 @@ static RO_PUMP_STATE_T handleROPumpOpenLoopState( void ); static F32 roPumpFlowToPWM( RO_PI_FLOW_PROFILES_T profileID, F32 targetFlow ); -static void setROPumpTargetDutyCycle( F32 duty ); static void setROPumpControlSignalDutyCycle( F32 dutyCycle ); static void stopROPump( void ); static void publishROPumpData( void ); @@ -309,6 +308,40 @@ /*********************************************************************//** * @brief + * The setROPumpTargetDutyCycle function sets the duty cycle that the + * pump should run. + * @details Inputs: roPumpOpenLoopTargetDutyCycle, roPumpPWMDutyCyclePct, + * roPumpPWMDutyCyclePctSet, roPumpControlMode + * @details Outputs: roPumpOpenLoopTargetDutyCycle, roPumpPWMDutyCyclePct, + * roPumpPWMDutyCyclePctSet, roPumpControlMode + * @param: duty which is the duty cycle + * @return none + *************************************************************************/ +BOOL setROPumpTargetDutyCycle( F32 duty ) +{ + BOOL status = FALSE; + + if ( ( duty >= MIN_RO_PUMP_DUTY_CYCLE ) && ( duty <= MAX_RO_PUMP_DUTY_CYCLE ) ) + { + roPumpOpenLoopTargetDutyCycle = duty; + roPumpPWMDutyCyclePct = roPumpOpenLoopTargetDutyCycle; + roPumpDutyCyclePctSet = roPumpPWMDutyCyclePct; + roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; + status = TRUE; + + // Set the new duty cycle of the pump + setROPumpControlSignalDutyCycle( roPumpOpenLoopTargetDutyCycle ); + } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_INVALID_RO_PUMP_DUTY_CYCLE_SELECTED, duty ) + } + + return status; +} + +/*********************************************************************//** + * @brief * The signalROPumpHardStop function stops the RO pump immediately and * resets all the variables associated with the RO pump run. * @details Inputs: targetROPumpFlowRate, roPumpState, roPumpPWMDutyCyclePct, @@ -327,7 +360,7 @@ roPumpPWMDutyCyclePct = 0.0F; roPumpOpenLoopTargetDutyCycle = 0.0F; roControlTimerCounter = 0; - isROPumpOn = FALSE; + //isROPumpOn = FALSE; // TODo remove targetROPumpMaxPressure = 0; pendingROPumpCmdMaxPressure = 0.0F; pendingROPumpCmdTargetFlow = 0.0F; @@ -577,6 +610,7 @@ static RO_PUMP_STATE_T handleROPumpOffState( void ) { RO_PUMP_STATE_T state = RO_PUMP_OFF_STATE; + isROPumpOn = FALSE; // If there is a flow, transition to the PI controller to get the corresponding pressure of that flow if ( ( getTargetROPumpFlowRateLPM() > 0.0F ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) @@ -713,28 +747,6 @@ /*********************************************************************//** * @brief - * The setROPumpTargetDutyCycle function sets the duty cycle that the - * pump should run. - * @details Inputs: roPumpOpenLoopTargetDutyCycle, roPumpPWMDutyCyclePct, - * roPumpPWMDutyCyclePctSet, roPumpControlMode - * @details Outputs: roPumpOpenLoopTargetDutyCycle, roPumpPWMDutyCyclePct, - * roPumpPWMDutyCyclePctSet, roPumpControlMode - * @param: duty which is the duty cycle - * @return none - *************************************************************************/ -static void setROPumpTargetDutyCycle( F32 duty ) -{ - roPumpOpenLoopTargetDutyCycle = duty; - roPumpPWMDutyCyclePct = roPumpOpenLoopTargetDutyCycle; - roPumpDutyCyclePctSet = roPumpPWMDutyCyclePct; - roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; - - // Set the new duty cycle of the pump - setROPumpControlSignalDutyCycle( roPumpOpenLoopTargetDutyCycle ); -} - -/*********************************************************************//** - * @brief * The setROPumpControlSignalDutyCycle function sets the duty cycle for the * RO pump to a given duty cycle. * @details Inputs: none @@ -988,7 +1000,7 @@ if ( TRUE == isTestingActivated() ) { // Check if duty cycle is within range - if ( value >= MIN_RO_PUMP_DUTY_CYCLE && value <= MAX_RO_PUMP_DUTY_CYCLE ) + if ( ( value >= MIN_RO_PUMP_DUTY_CYCLE ) && ( value <= MAX_RO_PUMP_DUTY_CYCLE ) ) { setROPumpTargetDutyCycle( value ); result = TRUE; Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r5e8f96e11c797bddeddfc009c87f20df3b7a8664 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 5e8f96e11c797bddeddfc009c87f20df3b7a8664) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -65,6 +65,7 @@ BOOL setROPumpTargetFlowRateLPM( F32 roFlowRate, U32 maxPressure ); BOOL setROPumpTargetFlowRateDelayed( F32 roFlowRate, U32 maxPressure, U32 delayMs ); +BOOL setROPumpTargetDutyCycle( F32 duty ); void signalROPumpHardStop( void ); Index: firmware/App/Drivers/CPLD.h =================================================================== diff -u -rd3926e5817813a9588b77f6c382940176a5feedc -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Drivers/CPLD.h (.../CPLD.h) (revision d3926e5817813a9588b77f6c382940176a5feedc) +++ firmware/App/Drivers/CPLD.h (.../CPLD.h) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -42,13 +42,15 @@ NUM_OF_CPLD_CLEAN_LED_COLORS ///< Number of CPLD Clean LED colors } CPLD_CLEAN_LED_COLORS_T; +#pragma pack(push,1) typedef struct { U08 wdog; ///< Watchdog status (Expired True or False) U08 audio; ///< Audio Alarm status (On / Off) U08 fault_led; ///< Fault LED (On / Off) U08 clean_led; ///< Clean / Disinfect LED (CPLD_CLEAN_LED_COLORS_T) } CPLD_STATUS_T; +#pragma pack(pop) // ********** public function prototypes ********** Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r81769c6bea6ed32d70698fb03ad5823de1814b27 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 81769c6bea6ed32d70698fb03ad5823de1814b27) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -88,15 +88,14 @@ #define HEAT_DISINFECT_TARGET_RO_FLOW_LPM 1.3F ///< Heat disinfect target RO flow rate in L/min. #define HEAT_DISINFECT_TARGET_RO_FLOW_TRANSFER_LPM 0.8F ///< Heat disinfect target RO flow rate in L/min when transferring between reservoirs. #define HEAT_DISINFECT_MAX_RO_PRESSURE_PSI 30 ///< Heat disinfect maximum RO pressure in psi. -#define HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI 12.0F ///< Heat disinfect target drain outlet pressure in psi. -#define HEAT_DISINFECT_TARGET_DRAIN_FILL_R2_PSI 9.0F ///< Heat disinfect target drain R2 fill outplet pressure in PSI #define HEAT_DISINFECT_TIME_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. #define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 4 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. #define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 0.5F * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disinfect. TODO change this to 5 seconds #define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 250.0F // TODO temporary change. Change back to 100 ///< Reservoirs 1 & 2 maximum allowed volume change when full during heat disinfect. #define POST_HEAT_DISINFECT_WAIT_TIME_MS ( 3 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect final wait time before flushing the system in milliseconds. #define HEAT_DISINFECT_MAX_TEMP_GRADIENT_C 15.0F ///< Heat disinfect maximum allowed temperature gradient in between hottest and coldest sensors. #define HEAT_DISINFECT_TEMP_GRAD_OUT_RANGE_TIME_MS ( 0.16 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect temperature gradient out of range timeout in milliseconds. +#define HEAT_DISINFECT_TARGET_RO_PUMP_DC 0.4F ///< Heat disinfect target RO pump duty cycle // Mix drain R1 and R2 #define RSRVRS_MIX_DRAIN_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 mix drain timeout in ms. @@ -953,14 +952,10 @@ setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VDR, VALVE_STATE_RECIRC_C_TO_NC ); setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); - + signalROPumpHardStop(); // Set the drain pump to control mode - setDrainPumpTargetOutletPressure( HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI ); + setDrainPumpTargetOutletFlowLPM( HEAT_DISINFECT_TARGET_RO_FLOW_LPM ); - // Set the RO flow to maximum pressure of 30psi since it is the maximum pressure on the RO filter - // at inlet temperature > 45 C - setROPumpTargetFlowRateLPM( HEAT_DISINFECT_TARGET_RO_FLOW_LPM, HEAT_DISINFECT_MAX_RO_PRESSURE_PSI ); - // Start the trimmer heater since we are recirculating water and there is flow in the shunt line setHeaterTargetTemperature( DG_TRIMMER_HEATER, HEAT_DISINFECT_TARGET_TEMPERATURE_C ); startHeater( DG_TRIMMER_HEATER ); @@ -970,20 +965,20 @@ R1HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); R2HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); - stateTimer = getMSTimerCount(); + stateTimer = getMSTimerCount(); rsrvrsVolMonitorTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2; + state = DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -1006,6 +1001,11 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2; HEAT_DISINFECT_STATUS_T status = getHeatDisinfectStatus(); + if ( FALSE == isROPumpRunning() ) + { + setROPumpTargetDutyCycle( HEAT_DISINFECT_TARGET_RO_PUMP_DC ); + } + switch ( status ) { case HEAT_DISINFECT_RSRVRS_LEAK_TIMEOUT: @@ -1028,12 +1028,8 @@ setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - // Set the RO flow to maximum pressure of 30psi since it is the maximum pressure on the RO filter - // at inlet temperature > 45 C - setROPumpTargetFlowRateLPM( HEAT_DISINFECT_TARGET_RO_FLOW_TRANSFER_LPM, HEAT_DISINFECT_MAX_RO_PRESSURE_PSI ); - // Set the drain pump to control mode - setDrainPumpTargetOutletPressure( HEAT_DISINFECT_TARGET_DRAIN_FILL_R2_PSI ); + setDrainPumpTargetOutletFlowLPM( HEAT_DISINFECT_TARGET_RO_FLOW_TRANSFER_LPM ); // Turn off trimmer heater for transition stopHeater( DG_TRIMMER_HEATER ); @@ -1093,12 +1089,8 @@ R2HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); // Set the drain pump to control mode - setDrainPumpTargetOutletPressure( HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI ); + setDrainPumpTargetOutletFlowLPM( HEAT_DISINFECT_TARGET_RO_FLOW_LPM ); - // Set the RO flow to maximum pressure of 30psi since it is the maximum pressure on the RO filter - // at inlet temperature > 45 C - setROPumpTargetFlowRateLPM( HEAT_DISINFECT_TARGET_RO_FLOW_LPM, HEAT_DISINFECT_MAX_RO_PRESSURE_PSI ); - // Start the trimmer heater since we are recirculating water and there is flow in the shunt line setHeaterTargetTemperature( DG_TRIMMER_HEATER, HEAT_DISINFECT_TARGET_TEMPERATURE_C ); startHeater( DG_TRIMMER_HEATER ); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -receb190a5d66fdbee779478ac8bb50a846ed9241 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision eceb190a5d66fdbee779478ac8bb50a846ed9241) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -100,7 +100,7 @@ SW_FAULT_ID_DRAIN_PUMP_INVALID_EXEC_STATE, SW_FAULT_ID_UV_REACTORS_INVALID_REACTOR_SELECTD, SW_FAULT_ID_RO_PUMP_INVALID_PRESSURE_SELECTED, // 70 - SW_FAULT_ID_DRAIN_PUMP_INVALID_DELTA_PRESSURE_SELECTED, + SW_FAULT_ID_DRAIN_PUMP_TARGET_FLOW_LPM_SELECTED, SW_FAULT_ID_INVALID_TEMPERATURE_SENSOR_SELECTED, SW_FAULT_ID_DRAIN_PUMP_INVALID_RPM_SELECTED, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, @@ -147,6 +147,7 @@ SW_FAULT_ID_DG_CHEM_DISINFECT_FLUSH_INVALID_EXEC_STATE, SW_FAULT_ID_INVALID_PI_PROFILE_SELECTED, SW_FAULT_ID_PI_CTRL_INVALID_STEP_LIMIT, + SW_FAULT_ID_DG_INVALID_RO_PUMP_DUTY_CYCLE_SELECTED, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -receb190a5d66fdbee779478ac8bb50a846ed9241 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision eceb190a5d66fdbee779478ac8bb50a846ed9241) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -1040,8 +1040,8 @@ handleTestMonitoredVoltageOverrideRequest( message ); break; - case MSG_ID_DRAIN_PUMP_TARGET_OUTLET_PRESSURE: - handleSetDrainPumpTargetOutletPressure( message ); + case MSG_ID_DRAIN_PUMP_TARGET_OUTLET_FLOW: + handleSetDrainPumpTargetOutletFlowLPM( message ); break; case MSG_ID_DG_SWITCHES_STATUS_OVERRIDE: @@ -1260,6 +1260,10 @@ handleTestDGFillModeBroadcastOverrideRequest( message ); break; + case MSG_ID_DG_HEATERS_DUTY_CYCLE_OVERRIDE: + handleTestDGHeatersDutyCycleOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rf0487091f8a986c03e0152e12610b87363b356c9 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision f0487091f8a986c03e0152e12610b87363b356c9) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -2311,14 +2311,14 @@ /************************************************************************* * @brief - * The handleSetDrainPumpTargetOutletPressure function handles a - * request to set the drain pump outlet pressure. + * The handleSetDrainPumpTargetOutletFlowLPM function handles a + * request to set the drain pump outlet flow in L/min. * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleSetDrainPumpTargetOutletPressure( MESSAGE_T *message ) +void handleSetDrainPumpTargetOutletFlowLPM( MESSAGE_T *message ) { BOOL result = 0; @@ -2329,7 +2329,7 @@ memcpy( &payLoad, message->payload, sizeof( F32 ) ); - result = testSetTargetDrainPumpOutletPressure( payLoad ); + result = testSetTargetDrainPumpOutletFlowLPM( payLoad ); } /* respond to request */ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); @@ -4247,6 +4247,7 @@ // respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } + /*********************************************************************//** * @brief * The handleTestDGFillIntegratedVolumeOverrideRequest function handles a request @@ -4279,4 +4280,36 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** + * @brief + * The handleTestDGHeatersDutyCycleOverrideRequest function handles a request + * to override the heaters duty cycle + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDGHeatersDutyCycleOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetHeaterDutyCycleOverride( payload.index, payload.state.f32 ); + } + else + { + result = testResetHeaterDutyCycleOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -receb190a5d66fdbee779478ac8bb50a846ed9241 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision eceb190a5d66fdbee779478ac8bb50a846ed9241) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -230,7 +230,7 @@ void handleTestDGSafetyShutdownOverrideRequest( MESSAGE_T *message ); // MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE -void handleSetDrainPumpTargetOutletPressure( MESSAGE_T *message ); +void handleSetDrainPumpTargetOutletFlowLPM( MESSAGE_T *message ); // MSG_ID_DG_SWITCHES_STATUS_OVERRIDE void handleSetSwitchesStatusOverrideRequest( MESSAGE_T *message ); @@ -448,6 +448,9 @@ // MSG_ID_DG_DIALYSATE_FILL_INTEGRATED_VOLUME_OVERRIDE void handleTestDGFillIntegratedVolumeOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DG_HEATERS_DUTY_CYCLE_OVERRIDE +void handleTestDGHeatersDutyCycleOverrideRequest( MESSAGE_T *message ); + /**@}*/ #endif