Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r19d00df76fc906db9e514b10f259c39958ff25bb -rf38051e1882be3e774f10ba924343a6ce1334890 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 19d00df76fc906db9e514b10f259c39958ff25bb) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision f38051e1882be3e774f10ba924343a6ce1334890) @@ -25,6 +25,7 @@ #include "Heaters.h" #include "InternalADC.h" #include "MessageSupport.h" +#include "ModeFill.h" #include "OperationModes.h" #include "PIControllers.h" #include "ROPump.h" @@ -81,7 +82,7 @@ typedef enum Heaters_Exec_States { - HEATER_EXEC_STATE_NOT_RUNNING = 0, ///< Heater exec state not running. + HEATER_EXEC_STATE_OFF = 0, ///< Heater exec state off. HEATER_EXEC_STATE_RAMP_TO_TARGET, ///< Heater exec state ramp to target. HEATER_EXEC_STATE_CONTROL_TO_TARGET, ///< Heater exec state control to target. NUM_OF_HEATERS_STATE, ///< Number of heaters state. @@ -90,8 +91,8 @@ /// Heaters data structure typedef struct { - F32 targetTemp; ///< Heater target temperature. - F32 originalTargetTemp; ///< Heater original target temperature set by user. + F32 targetTemp; // TODO do we need this anymore? ///< Heater target temperature. + F32 originalTargetTemp; ///< Heater original target temperature set by user. HEATERS_STATE_T state; ///< Heater state. TEMPERATURE_SENSORS_T feedbackSensor; ///< Heater feedback sensor for controlling. U32 controlTimerCounter; // TODO remove? Maybe use in heat disinfect ///< Heater control timer counter. @@ -102,9 +103,7 @@ U32 heaterOnWithNoFlowTimer; // TODO remove ///< Heater on with no flow timer. BOOL isFlowBelowMin; ///< Heater flow below minimum flag indicator. BOOL hasTargetTempChanged; ///< Heater target temperature change flag indicator. - BOOL isThisFirstFill; ///< Heater the first fill flag indicator. - PI_CONTROLLER_ID_T controllerID; ///< Heater PI controller ID TODO remove this? U32 tempOutOfRangeTimer; ///< Heater temperature out of range timer TODO remove once the mechanical thermal cutoff was implemented BOOL isHeaterTempOutOfRange; ///< Heater temperature out of range flag indicator TODO remove once the mechanical thermal cutoff was implemented @@ -118,7 +117,7 @@ // ********** private function prototypes ********** -static HEATERS_STATE_T handleHeaterStateNotRunning( DG_HEATERS_T heater ); +static HEATERS_STATE_T handleHeaterStateOff( DG_HEATERS_T heater ); static HEATERS_STATE_T handleHeaterStateRampToTarget( DG_HEATERS_T heater ); static HEATERS_STATE_T handleHeaterStateControlToTarget( DG_HEATERS_T heater ); @@ -159,14 +158,13 @@ heatersStatus[ heater ].startHeaterSignal = FALSE; heatersStatus[ heater ].tempOutOfRangeTimer = 0; heatersStatus[ heater ].isHeaterTempOutOfRange = FALSE; - heatersStatus[ heater ].state = HEATER_EXEC_STATE_NOT_RUNNING; + heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; heatersStatus[ heater ].targetTemp = 0.0; heatersStatus[ heater ].originalTargetTemp = 0.0; heatersStatus[ heater ].dutycycle = 0.0; heatersStatus[ heater ].targetROFlow = 0.0; heatersStatus[ heater ].controllerID = ( DG_PRIMARY_HEATER == heater ? 4 : PI_CONTROLLER_ID_TRIMMER_HEATER ); // TODO remove or refactor? heatersStatus[ heater ].hasTargetTempChanged = FALSE; - heatersStatus[ heater ].isThisFirstFill = TRUE; } // Initialize the PI controller for the trimmer heater @@ -282,8 +280,8 @@ switch( state ) { - case HEATER_EXEC_STATE_NOT_RUNNING: - heatersStatus[ heater ].state = handleHeaterStateNotRunning( heater ); + case HEATER_EXEC_STATE_OFF: + heatersStatus[ heater ].state = handleHeaterStateOff( heater ); break; case HEATER_EXEC_STATE_RAMP_TO_TARGET: @@ -297,7 +295,7 @@ default: // The heater is in an unknown state. Turn it off and switch to not running state stopHeater( heater ); - heatersStatus[ heater ].state = HEATER_EXEC_STATE_NOT_RUNNING; + heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_INVALID_EXEC_STATE, heater ); break; } @@ -411,46 +409,21 @@ /*********************************************************************//** * @brief - * The handleHeaterStateNotRunning function handles the heater not running state. + * The handleHeaterStateOff function handles the heater not running state. * @details Inputs: heaterStatus * @details Outputs: heaterStatus * @param heater: The heater Id that its not running state is handled * @return next state of the state machine *************************************************************************/ -static HEATERS_STATE_T handleHeaterStateNotRunning( DG_HEATERS_T heater ) +static HEATERS_STATE_T handleHeaterStateOff( DG_HEATERS_T heater ) { - HEATERS_STATE_T state = HEATER_EXEC_STATE_NOT_RUNNING; + HEATERS_STATE_T state = HEATER_EXEC_STATE_OFF; if ( TRUE == heatersStatus[ heater ].startHeaterSignal ) { heatersStatus[ heater ].isHeaterOn = TRUE; heatersStatus[ heater ].startHeaterSignal = FALSE; - heatersStatus[ heater ].targetROFlow = getTargetROPumpFlowRate(); - /*f ( ( DG_MODE_DRAI == getCurrentOperationMode() ) || ( DG_MODE_GENE == getCurrentOperationMode() ) ) - { - heatersStatus[ heater ].targetTemp = MAXIMUM_IDLE_DRAIN_TARGET_TEMPERATURE; - } - else - { - // Heaters control work with target temperature internally. Original target temperature is set by the user using the APIs - heatersStatus[ heater ].targetTemp = heatersStatus[ heater ].originalTargetTemp; - } - - // If the operation mode is heat disinfect and the heater is primary heater, change the feedback sensor to THd - if ( ( DG_MODE_HEAT == getCurrentOperationMode() ) && ( DG_PRIMARY_HEATER == heater ) ) - { - heatersStatus[ heater ].feedbackSensor = TEMPSENSORS_HEAT_DISINFECT; // TODO do we need this? - } - - TEMPERATURE_SENSORS_T sensor = heatersStatus[ heater ].feedbackSensor; - F32 feedbackTemperature = getTemperatureValue( (U32)sensor ); - F32 targetTemperature = heatersStatus[ heater ].targetTemp; - - // If the target temperature is greater than the feedback temperature the duty cycle is 100% otherwise, 0% - F32 duty = ( targetTemperature > feedbackTemperature ? HEATERS_MAX_DUTY_CYCLE : HEATERS_MIN_DUTY_CYCLE ); - setHeaterDutyCycle( heater, duty );*/ - // Turn on the heater state = HEATER_EXEC_STATE_RAMP_TO_TARGET; } @@ -469,34 +442,29 @@ *************************************************************************/ static HEATERS_STATE_T handleHeaterStateRampToTarget( DG_HEATERS_T heater ) { - F32 dutyCycle = 0.0; - HEATERS_STATE_T state = HEATER_EXEC_STATE_RAMP_TO_TARGET; + F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_HEAT_DISINFECT ); + F32 targetFlow = 0.0; + F32 targetTemperature = heatersStatus[ heater ].originalTargetTemp; + F32 dutyCycle = 0.0; - F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_HEAT_DISINFECT ); - F32 feedbackTemperature = getTemperatureValue( (U32)heatersStatus[ heater ].feedbackSensor ); - F32 targetFlow = getTargetROPumpFlowRate(); - BOOL isItHandOffTime = FALSE; - if ( DG_MODE_FILL == getCurrentOperationMode() ) { - F32 flow; - F32 targetTemperature = heatersStatus[ heater ].originalTargetTemp; + // Get the previous fill's average flow rate + targetFlow = getAverageFillFlowRate(); + dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow ); + } + else if ( ( DG_MODE_GENE == getCurrentOperationMode() ) || ( DG_MODE_DRAI == getCurrentOperationMode() ) ) + { + targetFlow = getTargetROPumpFlowRate(); + } - if ( TRUE == heatersStatus[ heater ].isThisFirstFill ) - { - flow = targetFlow; - heatersStatus[ heater ].isThisFirstFill = FALSE; - } - //dutyCycle = calculatePrimaryHeaterDutyCycle( 39.0, inletTemperature, 0.8 ); - //heatersStatus[ heater ].targetTemp = heatersStatus[ heater ].originalTargetTemp; - } + // TODO For testing only remove //dutyCycle = calculatePrimaryHeaterDutyCycle( 39.0, inletTemperature, 0.8 ); //heatersStatus[ heater ].targetTemp = heatersStatus[ heater ].originalTargetTemp; // TODO for testing only remove - isItHandOffTime = TRUE; /*if ( heatersStatus[ heater ].initialDutyCycle - 0.0 < NEARLY_ZERO ) @@ -590,7 +558,7 @@ } }*/ - if ( TRUE == isItHandOffTime ) + if ( TRUE /*== isItHandOffTime*/ ) { setHeaterDutyCycle( heater, dutyCycle ); @@ -602,7 +570,7 @@ if ( FALSE == heatersStatus[ heater ].isHeaterOn ) { setHeaterDutyCycle( heater, HEATERS_MIN_DUTY_CYCLE ); - state = HEATER_EXEC_STATE_NOT_RUNNING; + state = HEATER_EXEC_STATE_OFF; } return state; @@ -662,7 +630,7 @@ if ( FALSE == heatersStatus[ heater ].isHeaterOn ) { setHeaterDutyCycle( heater, HEATERS_MIN_DUTY_CYCLE ); - state = HEATER_EXEC_STATE_NOT_RUNNING; + state = HEATER_EXEC_STATE_OFF; } return state;