Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 -red39129abdca4ec343369d83494530b23621e052 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision ed39129abdca4ec343369d83494530b23621e052) @@ -40,32 +40,35 @@ // ********** private definitions ********** -#define HEATERS_MAX_DUTY_CYCLE 1.00F ///< Heaters max duty cycle (100%). -#define HEATERS_MIN_DUTY_CYCLE 0.00F ///< Heaters minimum duty cycle (0.00%). +#define HEATERS_MAX_DUTY_CYCLE 1.00F ///< Heaters max duty cycle (100%) or ON state +#define HEATERS_MIN_DUTY_CYCLE 0.00F ///< Heaters minimum duty cycle (0.00%) or OFF state +#define D5_HEAT_ON 1.00F ///< Primary heater ON control #define HEATERS_DISINFECT_DUTY_CYCLE 0.80F ///< Heaters disinfect cycle. #define HEATERS_DISINFECT_TRANSFER_DUTY_CYCLE 0.60F ///< Heaters disinfect transfer duty cycle. #define HEATERS_DISINFECT_TEMPERATURE_DRIFT_C 3.0F ///< Heaters disinfect temperature drift in C. #define HEATERS_ZERO_DELTA_TEMP_C 0.0F ///< Heaters zero delta temperature in C. #define HEATERS_DUTY_CYCLE_CONVERSION_FACTOR 100.0F ///< Heaters duty cycle 0: OFF, 100: 100% duty cycle. +#define D45_HEAT_GAIN 10.0F ///< Trimmer heater gain for testing. -#define PRIMARY_HEATER_P_COEFFICIENT 1.0F ///< P Term for primary heater control. -#define PRIMARY_HEATER_I_COEFFICIENT 1.0F ///< I Term for primary heater control. -#define TRIMMER_HEATER_P_COEFFICIENT 1.0F ///< P Term for trimmer heater control. -#define TRIMMER_HEATER_I_COEFFICIENT 1.0F ///< I Term for trimmer heater control. +#define D5_HEAT_P_COEFFICIENT 1.0F ///< P Term for primary heater control. +#define D5_HEAT_I_COEFFICIENT 1.0F ///< I Term for primary heater control. +#define D45_HEAT_P_COEFFICIENT 1.0F ///< P Term for trimmer heater control. +#define D45_HEAT_I_COEFFICIENT 1.0F ///< I Term for trimmer heater control. #define HEATERS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Heaters data publish interval. +#define HEATER_TEMP_CONTROL_TOLERANCE 2.0F ///< Primary Heater temp tolerance for ON/Off control #define HEATER_TARGET_TEMPERATURE_MIN 10.0F ///< Minimum allowed target temperature for the heaters. #define HEATER_TARGET_TEMPERATURE_MAX 90.0F ///< Maximum allowed target temperature for the heaters. -#define PRIMARY_HEATER_ON_NO_FLUID_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Primary heater on with no flow time out in milliseconds. -#define TRIMMER_HEATER_ON_NO_FLUID_TIMEOUT_MS ( 12 * MS_PER_SECOND ) ///< Trimmer heater on with no flow time out in milliseconds. +#define D5_HEAT_ON_NO_FLUID_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Primary heater on with no flow time out in milliseconds. +#define D45_HEAT_ON_NO_FLUID_TIMEOUT_MS ( 12 * MS_PER_SECOND ) ///< Trimmer heater on with no flow time out in milliseconds. #define HEATERS_MAX_OPERATING_VOLTAGE_V 24.0F ///< Heaters max operating voltage in volts. #define HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Heaters voltage out of range time out in milliseconds. #define HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL 0.2F ///< Heaters max voltage out of range tolerance. -#define TRIMMER_HEATER_INITIAL_CONTROL_INTERVAL_COUNT ( ( 5 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater initial control interval count. -#define TRIMMER_HEATER_CONTROL_INTERVAL_COUNT ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater control interval count. -#define PRIMARY_HEATER_CONTROL_INTERVAL_COUNT ( ( 1 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Primary heater control interval count. +#define D45_HEAT_INITIAL_CONTROL_INTERVAL_COUNT ( ( 5 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater initial control interval count. +#define D45_HEAT_CONTROL_INTERVAL_COUNT ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater control interval count. +#define D5_HEAT_CONTROL_INTERVAL_COUNT ( ( 1 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Primary heater control interval count. #define DATA_PUBLISH_COUNTER_START_COUNT 70 ///< Data publish counter start count. @@ -74,11 +77,9 @@ /// Heaters data structure typedef struct { - F32 targetTempC; ///< Heater target temperature. HEATERS_STATE_T state; ///< Heater state. BOOL startHeaterSignal; ///< Heater start indication flag. BOOL heaterOnState; ///< Heater on/off status flag. - OVERRIDE_F32_T dutyCycle; ///< Heater duty cycle. F32 targetFlowLPM; ///< Heater target flow in L/min to calculate the duty cycle. F32 nomTargetFlowLPM; ///< Heater nominal target flow in L/min. BOOL hasTargetTempChanged; ///< Heater target temperature change flag indicator. @@ -96,6 +97,8 @@ } HEATER_START_CMD_PAYLOAD_T; static HEATER_STATUS_T heatersStatus[ NUM_OF_DD_HEATERS ]; ///< Heaters status. +static OVERRIDE_F32_T targetTempC[ NUM_OF_DD_HEATERS ]; ///< Heater target temperature. +static OVERRIDE_F32_T control[ NUM_OF_DD_HEATERS ]; ///< Heater control ( Primary : On/Off, Trimmer : Dutycycle). static U32 dataPublicationTimerCounter; ///< Data publication timer counter. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. @@ -106,8 +109,8 @@ static HEATERS_STATE_T handleHeaterStateControlToTarget( DD_HEATERS_T heater ); static HEATERS_STATE_T handleHeaterStateControlToDisinfectTarget( DD_HEATERS_T heater ); -static void setHeaterDutyCycle( DD_HEATERS_T heater ); -static F32 getHeaterDutyCycle( DD_HEATERS_T heater ); +static void setHeaterControl( DD_HEATERS_T heater ); +static F32 getHeaterControl( DD_HEATERS_T heater ); static void publishHeatersData( void ); //static void monitorHeatersVoltage( void ); @@ -126,35 +129,39 @@ for ( heater = DD_HEATERS_FIRST; heater < NUM_OF_DD_HEATERS; heater++ ) { - heatersStatus[ heater ].targetTempC = 0.0F; + targetTempC[ heater ].data = 0.0F; + targetTempC[ heater ].ovData = 0.0F; + targetTempC[ heater ].ovInitData = 0.0F; + targetTempC[ heater ].override = OVERRIDE_RESET; heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; heatersStatus[ heater ].startHeaterSignal = FALSE; heatersStatus[ heater ].heaterOnState = FALSE; - heatersStatus[ heater ].dutyCycle.data = HEATERS_MIN_DUTY_CYCLE; - heatersStatus[ heater ].dutyCycle.ovData = HEATERS_MIN_DUTY_CYCLE; - heatersStatus[ heater ].dutyCycle.ovInitData = HEATERS_MIN_DUTY_CYCLE; - heatersStatus[ heater ].dutyCycle.override = OVERRIDE_RESET; + control[ heater ].data = HEATERS_MIN_DUTY_CYCLE; + control[ heater ].ovData = HEATERS_MIN_DUTY_CYCLE; + control[ heater ].ovInitData = HEATERS_MIN_DUTY_CYCLE; + control[ heater ].override = OVERRIDE_RESET; heatersStatus[ heater ].targetFlowLPM = 0.0F; heatersStatus[ heater ].nomTargetFlowLPM = 0.0F; heatersStatus[ heater ].hasTargetTempChanged = FALSE; heatersStatus[ heater ].controlIntervalCounter = 0; heatersStatus[ heater ].isThisFirstControl = TRUE; heatersStatus[ heater ].prevDiaTargetFlowLPM = 0.0F; + setHeaterControl( heater ); } // Initialize the primary controller PI controller - initializePIController( PI_CONTROLLER_ID_PRIMARY_HEATER, HEATERS_MIN_DUTY_CYCLE, PRIMARY_HEATER_P_COEFFICIENT, PRIMARY_HEATER_I_COEFFICIENT, + initializePIController( PI_CONTROLLER_ID_D5_HEAT, HEATERS_MIN_DUTY_CYCLE, D5_HEAT_P_COEFFICIENT, D5_HEAT_I_COEFFICIENT, HEATERS_MIN_DUTY_CYCLE, HEATERS_MAX_DUTY_CYCLE ); // Initialize the trimmer heater PI controller - initializePIController( PI_CONTROLLER_ID_TRIMMER_HEATER, HEATERS_MIN_DUTY_CYCLE, TRIMMER_HEATER_P_COEFFICIENT, TRIMMER_HEATER_I_COEFFICIENT, + initializePIController( PI_CONTROLLER_ID_D45_HEAT, HEATERS_MIN_DUTY_CYCLE, D45_HEAT_P_COEFFICIENT, D45_HEAT_I_COEFFICIENT, HEATERS_MIN_DUTY_CYCLE, HEATERS_MAX_DUTY_CYCLE ); // Initialize the persistent alarms - //initPersistentAlarm( ALARM_ID_DD_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, 0, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); - //initPersistentAlarm( ALARM_ID_DD_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, 0, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_PRIMARY_HEATER_IS_ON, 0, PRIMARY_HEATER_ON_NO_FLUID_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_TRIMMER_HEATER_IS_ON, 0, TRIMMER_HEATER_ON_NO_FLUID_TIMEOUT_MS ); + //initPersistentAlarm( ALARM_ID_DD_D5_HEAT_VOLTAGE_OUT_OF_RANGE, 0, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); + //initPersistentAlarm( ALARM_ID_DD_D45_HEAT_VOLTAGE_OUT_OF_RANGE, 0, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D5_HEAT_IS_ON, 0, D5_HEAT_ON_NO_FLUID_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D45_HEAT_IS_ON, 0, D45_HEAT_ON_NO_FLUID_TIMEOUT_MS ); } /*********************************************************************//** @@ -182,7 +189,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; + targetTempC[ heater ].data = targetTemperature; heatersStatus[ heater ].hasTargetTempChanged = TRUE; result = TRUE; } @@ -200,13 +207,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( &targetTempC[ heater ] ); + + return targetTemp; } /*********************************************************************//** @@ -230,26 +239,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; } /*********************************************************************//** @@ -268,11 +272,11 @@ { heatersStatus[ heater ].startHeaterSignal = FALSE; heatersStatus[ heater ].heaterOnState = FALSE; - heatersStatus[ heater ].dutyCycle.data = HEATERS_MIN_DUTY_CYCLE; + control[ heater ].data = HEATERS_MIN_DUTY_CYCLE; heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; // update duty cycle - setHeaterDutyCycle( heater ); + setHeaterControl( heater ); } else { @@ -295,13 +299,6 @@ for ( heater = DD_HEATERS_FIRST; heater < NUM_OF_DD_HEATERS; heater++ ) { - // Check if the heater is requested to be off - if ( FALSE == heatersStatus[ heater ].heaterOnState ) - { - // stop the heater - stopHeater( heater ); - } - switch( heatersStatus[ heater ].state ) { case HEATER_EXEC_STATE_OFF: @@ -326,6 +323,12 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_INVALID_EXEC_STATE, heater ); break; } + // Check if the heater is requested to be off + if ( FALSE == heatersStatus[ heater ].heaterOnState ) + { + // stop the heater + stopHeater( heater ); + } } } @@ -354,14 +357,14 @@ switch ( heater ) { - case DD_PRIMARY_HEATER: - alarm = ALARM_ID_DD_FLUID_TOO_LOW_WHILE_PRIMARY_HEATER_IS_ON; - isLevelLow = ( ( getLevelStatus( FLOATER_1 ) != 0 )? FALSE : TRUE ); + case D5_HEAT: + alarm = ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D5_HEAT_IS_ON; + isLevelLow = ( ( getLevelStatus( D6_LEVL ) != 0 )? FALSE : TRUE ); break; - case DD_TRIMMER_HEATER: - alarm = ALARM_ID_DD_FLUID_TOO_LOW_WHILE_TRIMMER_HEATER_IS_ON; - isLevelLow = ( ( getLevelStatus( SPENT_DIALYSATE_LEVEL ) != 0 )? FALSE : TRUE ); + case D45_HEAT: + alarm = ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D45_HEAT_IS_ON; + isLevelLow = ( ( getLevelStatus( D46_LEVL ) != 0 )? FALSE : TRUE ); break; default: @@ -373,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 ( D5_HEAT == heater ) + { + checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D5_HEAT_IS_ON, FALSE, 0.0F, 0.0F ); + } + else + { + checkPersistentAlarm( ALARM_ID_DD_FLUID_TOO_LOW_WHILE_D45_HEAT_IS_ON, FALSE, 0.0F, 0.0F ); + } } } @@ -422,23 +431,41 @@ static HEATERS_STATE_T handleHeaterStateRampToTarget( DD_HEATERS_T heater ) { HEATERS_STATE_T state = HEATER_EXEC_STATE_RAMP_TO_TARGET; - F32 dutyCycle = 0.0F; + F32 ctrl = 0.0F; DD_OP_MODE_T opMode = getCurrentOperationMode(); + F32 targetTemperature = getHeaterTargetTemperature( heater ); - if ( DD_MODE_HEAT != opMode ) + if ( D5_HEAT == heater ) { - dutyCycle = ( ( heatersStatus[ heater ].targetTempC / HEATER_TARGET_TEMPERATURE_MAX ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; - state = HEATER_EXEC_STATE_CONTROL_TO_TARGET; + if ( DD_MODE_HEAT != opMode ) + { + control[ heater ].data = D5_HEAT_ON; + state = HEATER_EXEC_STATE_CONTROL_TO_TARGET; + } + else + { + // TODO : Calculate required duty cycle + state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; + } } else { - // TODO : Calculate required duty cycle - state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; + if ( DD_MODE_HEAT != opMode ) + { + ctrl = ( ( targetTemperature / HEATER_TARGET_TEMPERATURE_MAX ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; + state = HEATER_EXEC_STATE_CONTROL_TO_TARGET; + } + else + { + // TODO : Calculate required duty cycle + state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; + } + + // Update the duty cycle + control[ heater ].data = ctrl; } - // Update the duty cycle - heatersStatus[ heater ].dutyCycle.data = dutyCycle; - setHeaterDutyCycle( heater ); + setHeaterControl( heater ); return state; } @@ -456,22 +483,43 @@ 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 dutyCycle = 0.0F; + F32 ctrl = 0.0F; - if( ++heatersStatus[ heater ].controlIntervalCounter > PRIMARY_HEATER_CONTROL_INTERVAL_COUNT ) + if( ++heatersStatus[ heater ].controlIntervalCounter > D5_HEAT_CONTROL_INTERVAL_COUNT ) { switch ( heater ) { - case DD_PRIMARY_HEATER: - measuredTemperature = getTemperatureValue( (U32)TEMPSENSORS_HYDRAULICS_PRIMARY_HEATER ); - dutyCycle = runPIController( PI_CONTROLLER_ID_PRIMARY_HEATER, targetTemperature, measuredTemperature ); + case D5_HEAT: + measuredTemperature = getTemperatureValue( (U32)D4_TEMP ); + if ( measuredTemperature >= targetTemperature ) + { + // Turn off heater + control[ heater ].data = HEATERS_MIN_DUTY_CYCLE; + } + else + { + // Turn On heater + control[ heater ].data = D5_HEAT_ON; + } + + //control = runPIController( PI_CONTROLLER_ID_D5_HEAT, targetTemperature, measuredTemperature ); break; - case DD_TRIMMER_HEATER: - measuredTemperature = getTemperatureValue( (U32)TEMPSENSORS_TRIMMER_HEATER ); - dutyCycle = runPIController( PI_CONTROLLER_ID_TRIMMER_HEATER, targetTemperature, measuredTemperature ); + case D45_HEAT: + measuredTemperature = getTemperatureValue( (U32)D50_TEMP ); + //control = runPIController( PI_CONTROLLER_ID_D45_HEAT, targetTemperature, measuredTemperature ); + if ( targetTemperature > 0.0F ) + { + ctrl = HEATERS_MAX_DUTY_CYCLE - ( measuredTemperature / targetTemperature ); + ctrl = ( ctrl < 0.0F ? HEATERS_MIN_DUTY_CYCLE: ctrl * D45_HEAT_GAIN ); + //Apply dutycycle limit + ctrl = MIN( ctrl, HEATERS_MAX_DUTY_CYCLE ); + ctrl = MAX( ctrl, HEATERS_MIN_DUTY_CYCLE ); + } + + control[ heater ].data = ( ctrl * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; break; default: @@ -480,10 +528,9 @@ } heatersStatus[ heater ].hasTargetTempChanged = FALSE; - heatersStatus[ heater ].dutyCycle.data = ( dutyCycle * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; heatersStatus[ heater ].controlIntervalCounter = 0; - setHeaterDutyCycle( heater ); + setHeaterControl( heater ); } return state; @@ -505,37 +552,38 @@ //TODO : update dutycycle for the heat disinfect state - setHeaterDutyCycle( DD_TRIMMER_HEATER ); - setHeaterDutyCycle( DD_PRIMARY_HEATER ); + setHeaterControl( D45_HEAT ); + setHeaterControl( D5_HEAT ); return state; } /*********************************************************************//** * @brief - * The setHeaterDutyCycle function sets the duty cycle of a heater. - * @details \b Inputs: dutyCycle + * The setHeaterControl function sets the duty cycle of a heater. + * @details \b Inputs: control * @details \b Outputs: FPGA heater control * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid heater ID * is selected. * @param heater: The heater Id that its duty cycle is set * @return none *************************************************************************/ -static void setHeaterDutyCycle( DD_HEATERS_T heater ) +static void setHeaterControl( DD_HEATERS_T heater ) { if ( heater < NUM_OF_DD_HEATERS ) { - F32 duty; + F32 control; - duty = getHeaterDutyCycle( heater ); + control = getHeaterControl( heater ); - if ( DD_PRIMARY_HEATER == heater ) + if ( D5_HEAT == heater ) { - setFPGAPrimaryHeaterPWMControl( (U08)duty ); + BOOL heaterCntrl = (BOOL)control; + setFPGACPrimaryHeaterOnOffControl( heaterCntrl ); } else { - setFPGATrimmerHeaterPWMControl( (U08)duty ); + setFPGATrimmerHeaterPWMControl( (U08)control ); } } else @@ -546,15 +594,15 @@ /*********************************************************************//** * @brief - * The getHeaterDutyCycle function returns the heater's duty cycle. + * The getHeaterControl function returns the heater's duty cycle. * @details \b Inputs: heaterStatus * @details \b Outputs: none * @param heater: The heater Id to get the duty cycle. * @return PWM duty cycle for the given heater *************************************************************************/ -static F32 getHeaterDutyCycle( DD_HEATERS_T heater ) +static F32 getHeaterControl( DD_HEATERS_T heater ) { - F32 duty = getF32OverrideValue( &heatersStatus[ heater ].dutyCycle ); + F32 duty = getF32OverrideValue( &control[ heater ] ); return duty; } @@ -564,9 +612,9 @@ * The monitorHeatersVoltage function monitors the heaters' voltages * @details \b Inputs: Voltage range * @details \b Outputs: none - * @details \b Alarms: ALARM_ID_DD_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE when + * @details \b Alarms: ALARM_ID_DD_MAIN_D5_HEAT_VOLTAGE_OUT_OF_RANGE when * primary heater voltage found out of range. - * @details \b Alarms: ALARM_ID_DD_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE when + * @details \b Alarms: ALARM_ID_D45_HEAT_VOLTAGE_OUT_OF_RANGE when * trimmer heater voltage found out of range. * @return none *************************************************************************/ @@ -576,8 +624,8 @@ // F32 trimmerVoltage = getMonitoredLineLevel( MONITORED_LINE_24V_GND_TRIM_HTR_V ); // // // Voltage to PWM is reverse. If PWM = 0 -> V = 24V -// F32 mainPriDC = getHeaterDutyCycle( DD_PRIMARY_HEATER ); -// F32 trimmerDC = getHeaterDutyCycle( DD_TRIMMER_HEATER ); +// F32 mainPriDC = getHeaterControl( D5_HEAT ); +// F32 trimmerDC = getHeaterControl( D45_HEAT ); // // // The expected voltage is the inverse of the duty cycle // F32 mainPriExpectedVoltage = HEATERS_MAX_OPERATING_VOLTAGE_V * ( 1.0F - mainPriDC ); @@ -587,15 +635,15 @@ // BOOL isTrimmerOut = FALSE; // // // If the system is DVT, check the FPGA persistent alarm of the main primary heater's voltage ADC -// checkFPGAPersistentAlarms( FPGA_PERS_ERROR_MAIN_PRIMARY_HEATER_VOLTAGE_ADC, getFPGAHeaterGateADCReadCount() ); +// checkFPGAPersistentAlarms( FPGA_PERS_ERROR_MAIN_D5_HEAT_VOLTAGE_ADC, getFPGAHeaterGateADCReadCount() ); // // isMainPriOut = ( fabs( mainPriExpectedVoltage - mainPriVoltage ) > HEATERS_VOLTAGE_TOLERANCE_V ? TRUE : FALSE ); // isTrimmerOut = ( fabs( trimmerExpectedVoltage - trimmerVoltage ) > HEATERS_VOLTAGE_TOLERANCE_V ? TRUE : FALSE ); // // if ( getCurrentOperationMode() != DD_MODE_INIT ) // { -// checkPersistentAlarm( ALARM_ID_DD_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isMainPriOut, mainPriDC, HEATERS_VOLTAGE_TOLERANCE_V ); -// checkPersistentAlarm( ALARM_ID_DD_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmerDC, HEATERS_VOLTAGE_TOLERANCE_V ); +// checkPersistentAlarm( ALARM_ID_DD_MAIN_D5_HEAT_VOLTAGE_OUT_OF_RANGE, isMainPriOut, mainPriDC, HEATERS_VOLTAGE_TOLERANCE_V ); +// checkPersistentAlarm( ALARM_ID_D45_HEAT_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmerDC, HEATERS_VOLTAGE_TOLERANCE_V ); // } //} @@ -615,14 +663,14 @@ { HEATERS_DATA_T data; - data.mainPrimayHeaterDC = getHeaterDutyCycle( DD_PRIMARY_HEATER ) * FRACTION_TO_PERCENT_FACTOR; - data.trimmerHeaterDC = getHeaterDutyCycle( DD_TRIMMER_HEATER ) * FRACTION_TO_PERCENT_FACTOR; - data.primaryTargetTemp = heatersStatus[ DD_PRIMARY_HEATER ].targetTempC; - data.trimmerTargetTemp = heatersStatus[ DD_TRIMMER_HEATER ].targetTempC; - data.primaryHeaterState = heatersStatus[ DD_PRIMARY_HEATER ].state; - data.trimmerHeaterState = heatersStatus[ DD_TRIMMER_HEATER ].state; - data.primaryControlCounter = heatersStatus[ DD_PRIMARY_HEATER ].controlIntervalCounter; - data.trimmerControlCounter = heatersStatus[ DD_TRIMMER_HEATER ].controlIntervalCounter; + data.d5_HeaterDC = getHeaterControl( D5_HEAT ); + data.d45_HeaterDC = getHeaterControl( D45_HEAT ); + data.d5_HeaterTargetTemp = getHeaterTargetTemperature( D5_HEAT ); + data.d45_HeaterTargetTemp = getHeaterTargetTemperature( D45_HEAT ); + data.d5_HeaterState = heatersStatus[ D5_HEAT ].state; + data.d45_HeaterState = heatersStatus[ D45_HEAT ].state; + data.d5_HeaterControlCounter = heatersStatus[ D5_HEAT ].controlIntervalCounter; + data.d45_HeaterControlCounter = heatersStatus[ D45_HEAT ].controlIntervalCounter; dataPublicationTimerCounter = 0; @@ -665,13 +713,30 @@ *************************************************************************/ BOOL testHeaterDutyCycleOverride( MESSAGE_T *message ) { - BOOL result = f32ArrayOverride( message, &heatersStatus[0].dutyCycle, NUM_OF_DD_HEATERS - 1 ); + BOOL result = f32ArrayOverride( message, &control[ 0 ], NUM_OF_DD_HEATERS - 1 ); return result; } /*********************************************************************//** * @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, &targetTempC[ 0 ], 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