Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r78842b478a83315eda5d877a99b16f3b899b7727 -r8116b493a8085f28f85e5a9e8ead7e18d0dc77a8 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 78842b478a83315eda5d877a99b16f3b899b7727) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 8116b493a8085f28f85e5a9e8ead7e18d0dc77a8) @@ -76,7 +76,7 @@ /// Heaters data structure typedef struct { - F32 targetTempC; ///< Heater target temperature. + OVERRIDE_F32_T targetTempC; ///< Heater target temperature. HEATERS_STATE_T state; ///< Heater state. BOOL startHeaterSignal; ///< Heater start indication flag. BOOL heaterOnState; ///< Heater on/off status flag. @@ -128,7 +128,10 @@ for ( heater = DD_HEATERS_FIRST; heater < NUM_OF_DD_HEATERS; heater++ ) { - heatersStatus[ heater ].targetTempC = 0.0F; + heatersStatus[ heater ].targetTempC.data = 0.0F; + heatersStatus[ heater ].targetTempC.ovData = 0.0F; + heatersStatus[ heater ].targetTempC.ovInitData = 0.0F; + heatersStatus[ heater ].targetTempC.override = OVERRIDE_RESET; heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; heatersStatus[ heater ].startHeaterSignal = FALSE; heatersStatus[ heater ].heaterOnState = FALSE; @@ -142,6 +145,7 @@ heatersStatus[ heater ].controlIntervalCounter = 0; heatersStatus[ heater ].isThisFirstControl = TRUE; heatersStatus[ heater ].prevDiaTargetFlowLPM = 0.0F; + setHeaterControl( heater ); } // Initialize the primary controller PI controller @@ -184,7 +188,7 @@ // Check if the requested temperature is within the allowed range if ( ( targetTemperature >= HEATER_TARGET_TEMPERATURE_MIN ) && ( targetTemperature <= HEATER_TARGET_TEMPERATURE_MAX ) ) { - heatersStatus[ heater ].targetTempC = targetTemperature; + heatersStatus[ heater ].targetTempC.data = targetTemperature; heatersStatus[ heater ].hasTargetTempChanged = TRUE; result = TRUE; } @@ -202,13 +206,15 @@ * The getHeaterTargetTemperature function returns the given heater target * temperature. * @details \b Inputs: none - * @details \b Outputs: heaterStatus + * @details \b Outputs: targetTempC * @param heater: heater ID to get heater target temperature. * @return the given heater target temperature *************************************************************************/ F32 getHeaterTargetTemperature( DD_HEATERS_T heater ) { - return heatersStatus[ heater ].targetTempC; + F32 targetTemp = getF32OverrideValue( &heatersStatus[ heater ].targetTempC ); + + return targetTemp; } /*********************************************************************//** @@ -232,26 +238,21 @@ * @details \b Outputs: startHeaterSignal * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid heater ID passed * @param heater: heater ID to set the heater start signal. - * @return status TRUE when heater start flag set otherwise, FALSE + * @return None *************************************************************************/ -BOOL startHeater( DD_HEATERS_T heater ) +void startHeater( DD_HEATERS_T heater ) { - BOOL status = FALSE; - if( heater < NUM_OF_DD_HEATERS ) { if ( HEATER_EXEC_STATE_OFF == heatersStatus[ heater ].state ) { heatersStatus[ heater ].startHeaterSignal = TRUE; - status = TRUE; } } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_INVALID_HEATER_ID_SELECTED, heater ) } - - return status; } /*********************************************************************//** @@ -375,8 +376,14 @@ } else { - checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_PRIMARY_HEATER_IS_ON, FALSE, 0.0F, 0.0F ); - checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_TRIMMER_HEATER_IS_ON, FALSE, 0.0F, 0.0F ); + if ( DD_PRIMARY_HEATER == heater ) + { + checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_PRIMARY_HEATER_IS_ON, FALSE, 0.0F, 0.0F ); + } + else + { + checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_TRIMMER_HEATER_IS_ON, FALSE, 0.0F, 0.0F ); + } } } @@ -426,6 +433,7 @@ HEATERS_STATE_T state = HEATER_EXEC_STATE_RAMP_TO_TARGET; F32 control = 0.0F; DD_OP_MODE_T opMode = getCurrentOperationMode(); + F32 targetTemperature = getHeaterTargetTemperature( heater ); if ( DD_PRIMARY_HEATER == heater ) { @@ -444,7 +452,7 @@ { if ( DD_MODE_HEAT != opMode ) { - control = ( ( heatersStatus[ heater ].targetTempC / HEATER_TARGET_TEMPERATURE_MAX ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; + control = ( ( targetTemperature / HEATER_TARGET_TEMPERATURE_MAX ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; state = HEATER_EXEC_STATE_CONTROL_TO_TARGET; } else @@ -475,18 +483,17 @@ static HEATERS_STATE_T handleHeaterStateControlToTarget( DD_HEATERS_T heater ) { HEATERS_STATE_T state = HEATER_EXEC_STATE_CONTROL_TO_TARGET; - F32 targetTemperature = heatersStatus[ heater ].targetTempC; + F32 targetTemperature = getHeaterTargetTemperature( heater ); F32 measuredTemperature = 0.0F; - F32 control = 0.0F; + F32 control = 0.0F; if( ++heatersStatus[ heater ].controlIntervalCounter > PRIMARY_HEATER_CONTROL_INTERVAL_COUNT ) { switch ( heater ) { case DD_PRIMARY_HEATER: measuredTemperature = getTemperatureValue( (U32)TEMPSENSORS_HYDRAULICS_PRIMARY_HEATER ); - if ( ( measuredTemperature >= ( targetTemperature - HEATER_TEMP_CONTROL_TOLERANCE ) ) && - ( measuredTemperature <= ( targetTemperature + HEATER_TEMP_CONTROL_TOLERANCE ) ) ) + if ( measuredTemperature >= targetTemperature ) { // Turn off heater heatersStatus[ heater ].control.data = HEATERS_MIN_DUTY_CYCLE; @@ -506,7 +513,7 @@ if ( targetTemperature > 0.0F ) { control = HEATERS_MAX_DUTY_CYCLE - ( measuredTemperature / targetTemperature ); - control = control < 0.0 ? HEATERS_MIN_DUTY_CYCLE: control; + control = control < 0.0F ? HEATERS_MIN_DUTY_CYCLE: control; } heatersStatus[ heater ].control.data = ( control * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; @@ -654,8 +661,8 @@ data.mainPrimayHeaterDC = getHeaterControl( DD_PRIMARY_HEATER ); data.trimmerHeaterDC = getHeaterControl( DD_TRIMMER_HEATER ); - data.primaryTargetTemp = heatersStatus[ DD_PRIMARY_HEATER ].targetTempC; - data.trimmerTargetTemp = heatersStatus[ DD_TRIMMER_HEATER ].targetTempC; + data.primaryTargetTemp = getHeaterTargetTemperature( DD_PRIMARY_HEATER ); + data.trimmerTargetTemp = getHeaterTargetTemperature( DD_TRIMMER_HEATER ); data.primaryHeaterState = heatersStatus[ DD_PRIMARY_HEATER ].state; data.trimmerHeaterState = heatersStatus[ DD_TRIMMER_HEATER ].state; data.primaryControlCounter = heatersStatus[ DD_PRIMARY_HEATER ].controlIntervalCounter; @@ -709,6 +716,23 @@ /*********************************************************************//** * @brief + * The testHeaterTargetTemperatureOverride function overrides the specified heater's + * target temperature. + * @details \b Inputs: targetTempC + * @details \b Outputs: targetTempC + * @param message Override message from Dialin which includes an ID of + * the heater to override and the target temperature of the heater. + * @return TRUE if the override was successful otherwise FALSE + *************************************************************************/ +BOOL testHeaterTargetTemperatureOverride( MESSAGE_T *message ) +{ + BOOL result = f32ArrayOverride( message, &heatersStatus[0].targetTempC, NUM_OF_DD_HEATERS - 1 ); + + return result; +} + +/*********************************************************************//** + * @brief * The testHeaterStartStopOverride function starts/stops a given heater * at mentioned temperature. * @details \b Inputs: tester logged in