Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r99011bfb443632a788f3afe395c9c63a797bde9d -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 99011bfb443632a788f3afe395c9c63a797bde9d) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -51,14 +51,20 @@ #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. -#define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< conversion factor from target PSI to PWM duty cycle estimate TODO - this is a place holder for real conversion +#define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) //TODO remove ///< conversion factor from target PSI to PWM duty cycle estimate TODO - this is a place holder for real conversion #define RO_FLOW_ADC_TO_LPM_FACTOR 10909.0909 ///< 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_DC(flow) ((F32)(flow / 1000)) //TODO dara ///< Initial conversion factor from target flow rate to PWM duty cycle estimate +#define ROP_RAMP_UP_P_COEFFICIENT 0.009 //TODO dara +#define ROP_RAMP_UP_I_COEFFICIENT 0.00 //TODO dara +#define ROP_FLOW_TARGET_TOLERANCE 20U //TODO dara ///< Tolerance in between the target flow rate and the actual flow rate in mL + /// 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. NUM_OF_RO_PUMP_STATES ///< Number of RO pump states. } RO_PUMP_STATE_T; @@ -89,9 +95,11 @@ static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode. static OVERRIDE_U32_T roPumpDataPublishInterval = { 0, 0, 0, 0 }; ///< interval (in ms) at which to publish RO flow data to CAN bus. -static OVERRIDE_U32_T targetROPumpPressure = { 0, 0, 0, 0 }; ///< Target RO pressure (in PSI). +static OVERRIDE_U32_T targetROPumpPressure = { 0, 0, 0, 0 }; ///< Target RO pressure (in PSI). //TODO remove +static OVERRIDE_U32_T targetROPumpFlowRate = { 0, 0, 0, 0 }; ///< Target RO flow rate (in LPM_) // TODO dara static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in LPM). static F32 measuredROPumpPressure = 0.0; ///< measured RO pressure (in PSI). +static F32 tgtROPumpPressure = 0.0; // TODO dara static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging. static U32 flowFilterCounter = 0; ///< used to schedule flow filtering. @@ -104,6 +112,7 @@ // ********** 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 void setROPumpControlSignalPWM( F32 newPWM ); static void stopROPump( void ); @@ -126,6 +135,11 @@ initializePIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_PWM_DUTY_CYCLE, ROP_P_COEFFICIENT, ROP_I_COEFFICIENT, MIN_RO_PUMP_PWM_DUTY_CYCLE, MAX_RO_PUMP_PWM_DUTY_CYCLE ); + + // Initialize the P controller during ramp up + initializePIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE, + ROP_RAMP_UP_P_COEFFICIENT, ROP_RAMP_UP_I_COEFFICIENT, + MIN_RO_PUMP_PWM_DUTY_CYCLE, MAX_RO_PUMP_PWM_DUTY_CYCLE ); } /*********************************************************************//** @@ -161,6 +175,24 @@ return result; } +BOOL setROPumpTargetFlowRate( U32 roFlowRate, PUMP_CONTROL_MODE_T mode ) +{ + BOOL result = FALSE; + + if ( roFlowRate < MAX_RO_FLOWRATE && roFlowRate >= MIN_RO_FLOWRATE ) + { + targetROPumpFlowRate.data = roFlowRate; + roPumpControlMode = mode; + roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( roFlowRate ); + } + else // requested pressure out of range + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, roFlowRate ) // TODO - replace 1st param with s/w fault enum + } + + return result; +} + /*********************************************************************//** * @brief * The signalROPumpHardStop function stops the RO pump immediately. @@ -176,6 +208,7 @@ roPumpState = RO_PUMP_OFF_STATE; roPumpPWMDutyCyclePct = 0.0; roControlTimerCounter = 0; + isROPumpOn = FALSE; resetPIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); } @@ -229,6 +262,10 @@ roPumpState = handleROPumpOffState(); break; + case RO_PUMP_RAMP_UP_STATE: + roPumpState = handleROPumpRampUpState(); + break; + case RO_PUMP_CONTROL_TO_TARGET_STATE: roPumpState = handleROPumpControlToTargetState(); break; @@ -277,8 +314,23 @@ #endif #endif + // If there is a + if ( getTargetROPumpFlowRate() > 0 ) + { + roPumpControlModeSet = roPumpControlMode; + // set initial PWM duty cycle + roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; + setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); + // reset controller + resetPIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, roPumpPWMDutyCyclePctSet ); + // set pump to on + isROPumpOn = TRUE; + result = RO_PUMP_RAMP_UP_STATE; + } + + // TODO remove // if we've been given a pressure, transition to control to target state - if ( getTargetROPumpPressure() > 0 ) + /*if ( getTargetROPumpPressure() > 0 ) { roPumpControlModeSet = roPumpControlMode; // set initial PWM duty cycle @@ -289,6 +341,49 @@ // set pump to on isROPumpOn = TRUE; result = RO_PUMP_CONTROL_TO_TARGET_STATE; + }*/ + + return result; +} + +static RO_PUMP_STATE_T handleROPumpRampUpState( void ) +{ + RO_PUMP_STATE_T result = RO_PUMP_RAMP_UP_STATE; + + // control at set interval + if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) + { + F32 targetFlowRate = targetROPumpFlowRate.data; + + if ( OVERRIDE_KEY == targetROPumpFlowRate.override ) + { + targetFlowRate = targetROPumpFlowRate.ovData; + } + + F32 actualFlowRate = (F32)getMeasuredROFlowRate(); + + if ( fabs( actualFlowRate - targetFlowRate ) > ROP_FLOW_TARGET_TOLERANCE ) + { + F32 newPWM = runPIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, targetFlowRate, actualFlowRate ); + roPumpPWMDutyCyclePctSet = newPWM; + setROPumpControlSignalPWM( newPWM ); + } + else + { + // Reset the P controller for the flow rate + resetPIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); + tgtROPumpPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); + + roPumpControlModeSet = roPumpControlMode; + // set initial PWM duty cycle + roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; + setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); + // reset controller + resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpPWMDutyCyclePctSet ); + + result = RO_PUMP_CONTROL_TO_TARGET_STATE; + } + roControlTimerCounter = 0; } return result; @@ -312,7 +407,7 @@ { if ( roPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) { - F32 tgtPres = (F32)getTargetROPumpPressure(); + F32 tgtPres = tgtROPumpPressure; F32 actPres = measuredROPumpPressure; F32 newPWM; @@ -397,13 +492,14 @@ * Outputs : none * @return the current target RO pressure (in PSI). *************************************************************************/ -U32 getTargetROPumpPressure( void ) +//U32 getTargetROPumpPressure( void ) +U32 getTargetROPumpFlowRate( void ) { - U32 result = targetROPumpPressure.data; + U32 result = targetROPumpFlowRate.data; - if ( OVERRIDE_KEY == targetROPumpPressure.override ) + if ( OVERRIDE_KEY == targetROPumpFlowRate.override ) { - result = targetROPumpPressure.ovData; + result = targetROPumpFlowRate.ovData; } return result; @@ -444,10 +540,11 @@ // publish RO pump data on interval if ( ++roPumpDataPublicationTimerCounter >= getPublishROPumpDataInterval() ) { - U32 presStPt = getTargetROPumpPressure(); + //U32 presStPt = getTargetROPumpPressure(); + F32 targetPressure = tgtROPumpPressure; F32 measFlow = getMeasuredROFlowRate(); F32 pumpPWMPctDutyCycle = roPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; - broadcastROPumpData( presStPt, measFlow, pumpPWMPctDutyCycle ); + broadcastROPumpData( targetPressure, measFlow, pumpPWMPctDutyCycle ); roPumpDataPublicationTimerCounter = 0; } } @@ -551,6 +648,37 @@ return result; } +BOOL testSetTargetROPumpFlowRateOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetROPumpFlowRate.ovInitData = targetROPumpFlowRate.data; // backup current target pressure + targetROPumpFlowRate.ovData = value; + targetROPumpFlowRate.override = OVERRIDE_KEY; + result = setROPumpTargetFlowRate( value, roPumpControlMode ); + } + + return result; +} + +BOOL testResetTargetROPumpFlowRateOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetROPumpFlowRate.data = targetROPumpFlowRate.ovInitData; // restore pre-override target pressure + targetROPumpFlowRate.override = OVERRIDE_RESET; + targetROPumpFlowRate.ovInitData = 0; + targetROPumpFlowRate.ovData = 0; + result = setROPumpTargetFlowRate( targetROPumpFlowRate.data, roPumpControlMode ); + } + + return result; +} + /*********************************************************************//** * @brief * The testResetTargetROPumpPressureOverride function resets the override of the \n Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r99011bfb443632a788f3afe395c9c63a797bde9d -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 99011bfb443632a788f3afe395c9c63a797bde9d) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -29,29 +29,38 @@ // ********** public definitions ********** -#define MAX_RO_PRESSURE 140 ///< Maximum target RO outlet pressure (in PSI). -#define MIN_RO_PRESSURE 100 ///< Minimum target RO outlet pressure (in PSI). +#define MAX_RO_PRESSURE 140 ///< Maximum target RO outlet pressure (in PSI). //TODO remove +#define MIN_RO_PRESSURE 100 ///< Minimum target RO outlet pressure (in PSI). //TODO remove +#define MAX_RO_FLOWRATE 2000 +#define MIN_RO_FLOWRATE 300 + // ********** public function prototypes ********** void initROPump( void ); void execROPumpMonitor( void ); void execROPumpController( void ); -BOOL setROPumpTargetPressure( U32 roPressure, PUMP_CONTROL_MODE_T mode ); +BOOL setROPumpTargetPressure( U32 roPressure, PUMP_CONTROL_MODE_T mode ); //TODO remove + +BOOL setROPumpTargetFlowRate( U32 roFlowRate, PUMP_CONTROL_MODE_T mode ); void signalROPumpHardStop( void ); BOOL isReverseOsmosisPumpOn( void ); SELF_TEST_STATUS_T execROPumpTest( void ); -DATA_GET_PROTOTYPE( U32, getTargetROPumpPressure ); +DATA_GET_PROTOTYPE( U32, getTargetROPumpFlowRate ); //TODO change DATA_GET_PROTOTYPE( F32, getMeasuredROFlowRate ); BOOL testSetROPumpDataPublishIntervalOverride( U32 value ); BOOL testResetROPumpDataPublishIntervalOverride( void ); -BOOL testSetTargetROPumpPressureOverride( U32 value ); -BOOL testResetTargetROPumpPressureOverride( void ); +BOOL testSetTargetROPumpPressureOverride( U32 value ); //TODO remove +BOOL testResetTargetROPumpPressureOverride( void ); //TODO remove + +BOOL testSetTargetROPumpFlowRateOverride( U32 value ); +BOOL testResetTargetROPumpFlowRateOverride( void ); + BOOL testSetMeasuredROFlowRateOverride( F32 value ); BOOL testResetMeasuredROFlowRateOverride( void ); Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -rd838fbaa8507b883fa112e69137e86fc9fb2cb6f -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision d838fbaa8507b883fa112e69137e86fc9fb2cb6f) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -83,7 +83,7 @@ #define HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient #define HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF 0.0625 ///< Heaters cold junction temperature sensors ADC to temperature conversion coefficient -#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL (5000 / TASK_PRIORITY_INTERVAL) ///< Temperature sensors publish data time interval +#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL (500 / TASK_PRIORITY_INTERVAL) ///< Temperature sensors publish data time interval #define K_THERMOCOUPLE_TEMP_2_MILLI_VOLT_CONVERSION_COEFF 0.041276 ///< K thermocouple temperature to millivolt conversion coefficient Index: firmware/App/Controllers/UVReactors.c =================================================================== diff -u -rcab7c64f095b7ed9061cc537ce48d82eb4464d92 -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Controllers/UVReactors.c (.../UVReactors.c) (revision cab7c64f095b7ed9061cc537ce48d82eb4464d92) +++ firmware/App/Controllers/UVReactors.c (.../UVReactors.c) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -10,13 +10,28 @@ #include "Common.h" +SELF_TEST_STATUS_T execUVReactorsSelfTest( void ) +{ + +} + +void execUVReactos( void ) +{ + +} + BOOL startInletUVReactor() { + BOOL status = TRUE; + return status; } + BOOL startOutletUVReactor() { + BOOL status = TRUE; + return status; } void stopInletUVReactor() Index: firmware/App/Controllers/UVReactors.h =================================================================== diff -u -rcab7c64f095b7ed9061cc537ce48d82eb4464d92 -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Controllers/UVReactors.h (.../UVReactors.h) (revision cab7c64f095b7ed9061cc537ce48d82eb4464d92) +++ firmware/App/Controllers/UVReactors.h (.../UVReactors.h) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -10,11 +10,25 @@ #include "Common.h" -BOOL startInletUVReactor(); -BOOL startOutletUVReactor(); +/** + * @defgroup UV Reactors UV Reactors + * @brief UV reactors driver module. + * Controls the inlet and outlet UV reactors + * + * @addtogroup UV Reactors + * @{ + */ -void stopInletUVReactor(); -void stopOutletUVReactor(); +SELF_TEST_STATUS_T execUVReactorsSelfTest( void ); +void execUVReactos( void ); -#endif /* APP_CONTROLLERS_UVREACTORS_H_ */ +BOOL startInletUVReactor( void ); +BOOL startOutletUVReactor( void ); + +void stopInletUVReactor( void ); +void stopOutletUVReactor( void ); + +// TODO publications + +#endif /* UVREACTORS_H_ */ Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -rcab7c64f095b7ed9061cc537ce48d82eb4464d92 -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision cab7c64f095b7ed9061cc537ce48d82eb4464d92) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -25,57 +25,42 @@ #include "TemperatureSensors.h" #include "UVReactors.h" +//TODO control composition pumps + /** * @addtogroup DGHeatDisinfectMode * @{ */ // ********** private definitions ********** -#define HEAT_DISINFECTION_TARGET_TEMP 85U ///< Heat disinfection target temperature -#define HEAT_DISINFECTION_OVERALL_TIME 60U ///< Heat disinfection overall time in minutes +#define HEAT_DISINFECTION_TARGET_TEMP 85U ///< Heat disinfection target temperature +#define HEAT_DISINFECTION_OVERALL_TIME 60U ///< Heat disinfection overall time in minutes #define HEAT_DISINFECTION_RECIRC_PATH_TIME 5U -#define HEAT_DISINFECTION_FLUSH_TIME 3U +#define HEAT_DISINFECTION_FLUSH_TIME 3U -#define DRAIN_PUMP_TARGET_RPM 600U -#define RO_PUMP_TARGET_PRESSURE 110U -#define TURN_ON TRUE -#define TURN_OFF FALSE +#define DRAIN_PUMP_TARGET_RPM 2800U +#define RO_PUMP_TARGET_PRESSURE 110U // ********** private data ********** -#pragma pack(push, 1) -typedef struct -{ - VALVE_STATE_NAMES_T valvesStates [ NUM_OF_VALVES ]; - U32 ROPumpTargetPressure; - BOOL compositionPump1; - BOOL compositionPump2; - U32 drainPumpTargetRPM; - BOOL inletUVReactor; - BOOL outletUVReactor; - BOOL primaryHeater; - BOOL trimmerHeater; -} ACTUATORS_STATE_T; -#pragma pack(pop) - static DG_HEAT_DISINFECT_STATE_T heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; ///< Currently active heat disinfect state. -static ACTUATORS_STATE_T actuatorsState; -static BOOL hasTemperatureReachedToTarget; -static U32 heatDisinfectElapsedTime; +static BOOL hasTemperatureReachedToTarget; +static U32 heatDisinfectElapsedTime; // ********** private function prototypes ********** -static BOOL setActuators(); +static void setActuatorsToStop( void ); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart(); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate(); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFlush(); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath(); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2(); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1(); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath(); -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs(); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWater( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectHeatWater( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ); +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs( void ); /*********************************************************************//** * @brief @@ -92,7 +77,8 @@ /*********************************************************************//** * @brief - * The transitionToHeatDisinfectMode function prepares for transition to heat disinfect mode. + * The transitionToHeatDisinfectMode function prepares for transition + * to heat disinfect mode. * @details * Inputs : none * Outputs : none @@ -101,11 +87,13 @@ void transitionToHeatDisinfectMode( void ) { initHeatDisinfectMode(); + setActuatorsToStop(); } /*********************************************************************//** * @brief - * The execHeatDisinfectMode function executes the heat disinfect Mode state machine. + * The execHeatDisinfectMode function executes the heat disinfect Mode + * state machine. * @details * Inputs : none * Outputs : none @@ -124,10 +112,14 @@ heatDisinfectionState = handleHeatDisinfectEvacuateDialysate(); break; - case DG_HEAT_DISINFECT_STATE_FLUSH: - heatDisinfectionState = handleHeatDisinfectFlush(); + case DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER: + heatDisinfectionState = handleHeatDisinfectFillWithWater(); break; + case DG_HEAT_DISINFECT_STATE_HEAT_WATER: + heatDisinfectionState = handleHeatDisinfectHeatWater(); + break; + case DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH: heatDisinfectionState = handleHeatDisinfectRecirculationPath(); break; @@ -171,145 +163,142 @@ return heatDisinfectionState; } +/*********************************************************************//** + * @brief + * The startDGHeatDisinfect function starts heat disinfect mode. + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ +void startDGHeatDisinfect( void ) +{ + // make sure DG is not in the middle of something and it is in standby + // + transitionToHeatDisinfectMode(); // Call request start heat disinfect +} + +/*********************************************************************//** + * @brief + * The stopDGHeatDisinfect function stops heat disinfect mode. + * @details + * Inputs : heatDisinfectionState + * Outputs : heatDisinfectionState + * @return none + *************************************************************************/ +void stopDGHeatDisinfect( void ) +{ + heatDisinfectionState = DG_HEAT_DISINFECT_STATE_START; // request standby mode + setActuatorsToStop(); // Not needed +} + // ********** private function definitions ********** -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart() +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStart( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_START; - actuatorsState.valvesStates [ VRF ] = VALVE_STATE_R1_C_TO_NC; - actuatorsState.valvesStates [ VRI ] = VALVE_STATE_R2_C_TO_NC; - actuatorsState.valvesStates [ VRD ] = VALVE_STATE_R1_C_TO_NC; - actuatorsState.valvesStates [ VRO ] = VALVE_STATE_R2_C_TO_NC; - actuatorsState.valvesStates [ VPO ] = VALVE_STATE_FILL_C_TO_NC; - actuatorsState.valvesStates [ VBF ] = VALVE_STATE_CLOSED; - actuatorsState.valvesStates [ VRC ] = VALVE_STATE_RECIRC_C_TO_NC; - actuatorsState.valvesStates [ VDR ] = VALVE_STATE_RECIRC_C_TO_NC; - actuatorsState.valvesStates [ VPI ] = VALVE_STATE_CLOSED; - actuatorsState.valvesStates [ VSP ] = VALVE_STATE_CLOSED; - actuatorsState.valvesStates [ VR1 ] = 0; - actuatorsState.valvesStates [ VR2 ] = 0; - actuatorsState.valvesStates [ VPD ] = VALVE_STATE_DRAIN_C_TO_NC; - actuatorsState.compositionPump1 = TURN_OFF; - actuatorsState.compositionPump2 = TURN_OFF; - actuatorsState.drainPumpTargetRPM = 0; - actuatorsState.inletUVReactor = TURN_OFF; - actuatorsState.outletUVReactor= TURN_OFF; - actuatorsState.ROPumpTargetPressure = 0; - actuatorsState.primaryHeater = TURN_OFF; - actuatorsState.trimmerHeater = TURN_OFF; + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRC, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); - setActuators(); + setROPumpTargetPressure( 0, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDrainPumpTargetSpeed( 0 ); + stopInletUVReactor(); + stopOutletUVReactor(); + stopPrimaryHeater(); + stopTrimmerHeater(); return state; } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate() +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacuateDialysate( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE; return state; } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFlush() +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWater( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; return state; } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath() + +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectHeatWater( void ) { + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; + + return state; + +} + +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectRecirculationPath( void ) +{ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; return state; } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2() +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir1To2( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2; return state; } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1() +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1; return state; - } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath() +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; return state; - - } -static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs() +static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDeprimeReservoirs( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DEPRIME_RESERVOIRS; return state; } -BOOL setActuators() +static void setActuatorsToStop( void ) { - BOOL status = TRUE; - U08 i; + setValveState ( VRF, VALVE_STATE_R1_C_TO_NC ); + setValveState ( VRI, VALVE_STATE_R2_C_TO_NC ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState ( VPO, VALVE_STATE_FILL_C_TO_NC ); + setValveState ( VBF, VALVE_STATE_CLOSED ); + setValveState ( VRC, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VDR, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VPI, VALVE_STATE_CLOSED ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_DRAIN_C_TO_NC ); - for ( i = 0; i < NUM_OF_VALVES; i++ ) - { - status = setValveState ( i, actuatorsState.valvesStates [ i ] ); - } + //TODO composition pumps - status = setROPumpTargetPressure( actuatorsState.ROPumpTargetPressure, PUMP_CONTROL_MODE_CLOSED_LOOP ); - - status = setDrainPumpTargetSpeed( actuatorsState.drainPumpTargetRPM ); - - // TODO composite pumps - - if ( actuatorsState.inletUVReactor ) - { - status = startInletUVReactor (); - } - else - { - stopInletUVReactor (); - } - - if ( actuatorsState.outletUVReactor ) - { - status = startOutletUVReactor (); - } - else - { - stopOutletUVReactor (); - } - - if ( actuatorsState.primaryHeater ) - { - setPrimaryHeaterTargetTemperature ( HEAT_DISINFECTION_TARGET_TEMP ); - status = startPrimaryHeater (); - } - else - { - stopPrimaryHeater (); - } - - if ( actuatorsState.trimmerHeater ) - { - setTrimmerHeaterTargetTemperature ( HEAT_DISINFECTION_TARGET_TEMP ); - status = startTrimmerHeater (); - } - else - { - stopTrimmerHeater(); - } - - return status; + setROPumpTargetPressure( 0, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDrainPumpTargetSpeed( 0 ); + stopInletUVReactor(); + stopOutletUVReactor(); + stopPrimaryHeater(); + stopTrimmerHeater(); } /**@}*/ Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -r4efb2d1786c717ca6cf4b1bc992cec8e16820bff -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 4efb2d1786c717ca6cf4b1bc992cec8e16820bff) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -23,7 +23,7 @@ /** * @defgroup DGHeatDisinfectMode DGHeatDisinfectMode * @brief Heat disinfection mode module. Manages the state machine for the - * heat disinfection mode. + * heat disinfect mode. * * @addtogroup DGHeatDisinfectMode * @{ @@ -39,6 +39,9 @@ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ); // get the current state of the heat disinfect mode. +void startDGHeatDisinfect( void ); +void stopDGHeatDisinfect( void ); + /**@}*/ #endif Index: firmware/App/Services/PIControllers.h =================================================================== diff -u -rab6ac1bb140201e5737d594b3456038ea9e4725f -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision ab6ac1bb140201e5737d594b3456038ea9e4725f) +++ firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -33,6 +33,7 @@ typedef enum ControllerList { PI_CONTROLLER_ID_RO_PUMP = 0, ///< RO Pump controller. + P_CONTROLLER_ID_RO_PUMP_RAMP_UP, ///< RO Pump controller during ramp up time PI_CONTROLLER_ID_PRIMARY_HEATER, ///< Primary Heater controller. PI_CONTROLLER_ID_TRIMMER_HEATER, ///< Trimmer Heater controller. NUM_OF_PI_CONTROLLERS_IDS ///< Number of PI controllers. Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -rd838fbaa8507b883fa112e69137e86fc9fb2cb6f -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision d838fbaa8507b883fa112e69137e86fc9fb2cb6f) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -1012,6 +1012,10 @@ handleStartStopTrimmerHeaterCmd( message ); break; + case MSG_ID_DG_START_STOP_HEAT_DISINFECT: + handleStartStopDGHeatDisinfect( message ); + break; + case MSG_ID_DG_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r388a6f1cf7661a973b0b08c2eeb4de30522c1e88 -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 388a6f1cf7661a973b0b08c2eeb4de30522c1e88) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -36,6 +36,7 @@ #include "Utilities.h" #include "Valves.h" #include "WatchdogMgmt.h" +#include "ModeHeatDisinfect.h" // ********** private definitions ********** @@ -967,6 +968,42 @@ } /************************************************************************* + * @brief + * The handleStartStopDGHeatDisinfect function handles a request start or + * stop DG heat disifect + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return result + *************************************************************************/ +BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + BOOL startingDGHeatDisinfect; + + memcpy( &startingDGHeatDisinfect, message->payload, sizeof(U32) ); + + if ( TRUE == startingDGHeatDisinfect ) + { + startDGHeatDisinfect(); + result = TRUE; + } + else + { + stopDGHeatDisinfect(); + result = TRUE; + } + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); + + return result; +} + +/************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -1184,8 +1221,10 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpSetPointOverrideRequest, testSetTargetROPumpPressureOverride, testResetTargetROPumpPressureOverride ) +//DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpSetPointOverrideRequest, testSetTargetROPumpPressureOverride, testResetTargetROPumpPressureOverride ) //Todo remove +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpSetPointOverrideRequest, testSetTargetROPumpFlowRateOverride, testResetTargetROPumpFlowRateOverride ) + /************************************************************************* * @brief * The handleTestROMeasuredFlowOverrideRequest function handles a request to \n Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rd838fbaa8507b883fa112e69137e86fc9fb2cb6f -r1e044a958c655d09fed725cfbc9808319b642d13 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision d838fbaa8507b883fa112e69137e86fc9fb2cb6f) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 1e044a958c655d09fed725cfbc9808319b642d13) @@ -156,8 +156,11 @@ void handleTestDGSafetyShutdownOverrideRequest( MESSAGE_T *message ); // MSG_ID_START_STOP_PRIMARY_HEATER -BOOL handleStartStopPrimaryHeater( MESSAGE_T * message ); +BOOL handleStartStopPrimaryHeater( MESSAGE_T *message ); +// MSG_ID_START_STOP_DG_HEAT_DISINFECT +BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ); + #ifdef CAN_TEST // MSG_ID_DG_CAN_TEST_1_LARGE_FREQ void broadcastCANTest1LargeFrequentMessage();