auto-sync

This commit is contained in:
rusEfi 2015-12-26 12:03:13 -05:00
parent 0694ad8358
commit 6d37d84abe
8 changed files with 120 additions and 45 deletions

View File

@ -85,25 +85,27 @@ typedef struct {
egt_values_s egtValues;
float rpmAcceleration;
float massAirFlowValue;
float veValue; // current volumetric efficiency
float veValue; // current volumetric efficiency, offset 112
float deltaTps;
int triggerErrorsCounter;
float currentMapAccelDelta;
float tpsAccelFuel;
float tpsAccelFuel; // offset 128
float baroCorrection;
float pedalPosition;
float injectorDutyCycle;
int knockCount;
float fuelLevel;
float fuelTankGauge;
float knockLevel;
int totalTriggerErrorCounter;
float wallFuelAmount;
float totalFuelCorrection;
floatms_t wallFuelCorrection;
float wallFuelAmount; // 160
float iatCorrection; // 164
floatms_t wallFuelCorrection; // 168
float idlePosition;
float currentTargetAfr;
float chargeAirMass;
int unused3[3];
float cltCorrection;
float runningFuel;
int unused3[1];
} TunerStudioOutputChannels;
#endif /* TUNERSTUDIO_CONFIGURATION_H_ */

View File

@ -568,7 +568,6 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
float intake = getIntakeAirTemperature(PASS_ENGINE_PARAMETER_F);
float engineLoad = getEngineLoadT(PASS_ENGINE_PARAMETER_F);
float baseFuelMs = getBaseFuel(rpm PASS_ENGINE_PARAMETER);
// header
tsOutputChannels->tsConfigVersion = TS_FILE_VERSION;
@ -595,7 +594,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
tsOutputChannels->engineLoad = engineLoad;
tsOutputChannels->rpmAcceleration = engine->rpmCalculator.getRpmAcceleration();
tsOutputChannels->currentMapAccelDelta = engine->mapAccelEnrichment.getMapEnrichment(PASS_ENGINE_PARAMETER_F) * 100 / getMap();
tsOutputChannels->tpsAccelFuel = engine->tpsAccelEnrichment.getTpsEnrichment(PASS_ENGINE_PARAMETER_F);
tsOutputChannels->tpsAccelFuel = engine->engineState.tpsAccelEnrich;
tsOutputChannels->deltaTps = engine->tpsAccelEnrichment.getDelta();
tsOutputChannels->triggerErrorsCounter = engine->triggerCentral.triggerState.totalTriggerErrorCounter;
tsOutputChannels->baroCorrection = engine->engineState.baroCorrection;
@ -603,13 +602,16 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
tsOutputChannels->knockCount = engine->knockCount;
tsOutputChannels->knockLevel = engine->knockVolts;
tsOutputChannels->injectorDutyCycle = getInjectorDutyCycle(rpm PASS_ENGINE_PARAMETER);
tsOutputChannels->fuelLevel = engine->engineState.fuelLevel;
tsOutputChannels->fuelTankGauge = engine->engineState.fuelTankGauge;
tsOutputChannels->hasFatalError = hasFirmwareError();
tsOutputChannels->totalTriggerErrorCounter = engine->triggerCentral.triggerState.totalTriggerErrorCounter;
tsOutputChannels->wallFuelAmount = wallFuel.getWallFuel(0);
tsOutputChannels->totalFuelCorrection = engine->totalFuelCorrection;
tsOutputChannels->wallFuelCorrection = engine->wallFuelCorrection;
tsOutputChannels->iatCorrection = ENGINE(engineState.iatFuelCorrection);
tsOutputChannels->cltCorrection = ENGINE(engineState.cltFuelCorrection);
tsOutputChannels->runningFuel = ENGINE(engineState.runningFuel);
tsOutputChannels->wallFuelCorrection = engine->wallFuelCorrection;
tsOutputChannels->checkEngine = hasErrorCodes();
#if EFI_PROD_CODE || defined(__DOXYGEN__)
@ -651,7 +653,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
float timing = engine->engineState.timingAdvance;
tsOutputChannels->ignitionAdvance = timing > 360 ? timing - 720 : timing;
tsOutputChannels->sparkDwell = ENGINE(engineState.sparkDwell);
tsOutputChannels->baseFuel = baseFuelMs;
tsOutputChannels->baseFuel = engine->engineState.baseFuel;
tsOutputChannels->pulseWidthMs = ENGINE(actualLastInjection);
tsOutputChannels->crankingFuelMs = getCrankingFuel(PASS_ENGINE_PARAMETER_F);
tsOutputChannels->chargeAirMass = engine->engineState.airMass;

View File

@ -43,7 +43,7 @@ void Engine::updateSlowSensors() {
if (engineConfiguration->fuelLevelSensor != EFI_ADC_NONE) {
float fuelLevelVoltage = getVoltageDivided("fuel", engineConfiguration->fuelLevelSensor);
engineState.fuelLevel = interpolate(boardConfiguration->fuelLevelEmptyTankVoltage, 0,
engineState.fuelTankGauge = interpolate(boardConfiguration->fuelLevelEmptyTankVoltage, 0,
boardConfiguration->fuelLevelFullTankVoltage, 100,
fuelLevelVoltage);
}

View File

@ -96,7 +96,7 @@ public:
/**
* that's fuel in tank - just a gauge
*/
percent_t fuelLevel;
percent_t fuelTankGauge;
ThermistorMath iatCurve;
ThermistorMath cltCurve;
@ -139,6 +139,13 @@ public:
*/
float baseFuel;
/**
* Fuel with CLT, IAT and TPS acceleration corrections.
*/
float runningFuel;
float tpsAccelEnrich;
angle_t injectionOffset;
};
@ -207,7 +214,6 @@ public:
* Fuel injection duration for current engine cycle, without wall wetting
*/
floatms_t fuelMs;
float totalFuelCorrection;
floatms_t wallFuelCorrection;
/**

View File

@ -70,8 +70,9 @@ float getRealMafFuel(float airSpeed, int rpm DECLARE_ENGINE_PARAMETER_S) {
return 1000 * fuelMassGramm / injectorFlowRate;
}
// todo: rename this method since it's now base+TPSaccel
floatms_t getBaseFuel(int rpm DECLARE_ENGINE_PARAMETER_S) {
floatms_t tpsAccelEnrich = ENGINE(tpsAccelEnrichment.getTpsEnrichment(PASS_ENGINE_PARAMETER_F));
ENGINE(engineState.tpsAccelEnrich) = ENGINE(tpsAccelEnrichment.getTpsEnrichment(PASS_ENGINE_PARAMETER_F));
if (CONFIG(algorithm) == LM_SPEED_DENSITY) {
engine->engineState.baseFuel = getSpeedDensityFuel(rpm PASS_ENGINE_PARAMETER);
@ -82,7 +83,7 @@ floatms_t getBaseFuel(int rpm DECLARE_ENGINE_PARAMETER_S) {
engine->engineState.baseFuel = engine->engineState.baseTableFuel;
}
return tpsAccelEnrich + engine->engineState.baseFuel;
return ENGINE(engineState.tpsAccelEnrich) + ENGINE(engineState.baseFuel);
}
float getinjectionOffset(int rpm DECLARE_ENGINE_PARAMETER_S) {
@ -134,9 +135,9 @@ floatms_t getRunningFuel(floatms_t baseFuel, int rpm DECLARE_ENGINE_PARAMETER_S)
float iatCorrection = ENGINE(engineState.iatFuelCorrection);
float cltCorrection = ENGINE(engineState.cltFuelCorrection);
engine->totalFuelCorrection = cltCorrection * iatCorrection;
ENGINE(engineState.runningFuel) = baseFuel * iatCorrection * cltCorrection;
return baseFuel * engine->totalFuelCorrection;
return ENGINE(engineState.runningFuel);
}
/**

View File

@ -275,5 +275,5 @@ int getRusEfiVersion(void) {
return 123; // this is here to make the compiler happy about the unused array
if (UNUSED_CCM_SIZE[0] * 0 != 0)
return 3211; // this is here to make the compiler happy about the unused array
return 20151224;
return 20151226;
}

View File

@ -66,7 +66,6 @@ public enum Sensor {
DUTY0("Duty0", SensorCategory.SNIFFING, "%", 0, 100, BackgroundColor.RED),
DUTY1("Duty1", SensorCategory.SNIFFING, "%", 0, 100, BackgroundColor.RED),
FUEL("Fuel", SensorCategory.OPERATIONS, "ms", 0, 30),
FUEL_BASE("Fuel Base", SensorCategory.OPERATIONS, "ms", 0, 30),
FUEL_IAT("F IAT", SensorCategory.OPERATIONS, "", 0, 10),
FUEL_CLT("F CLT", SensorCategory.OPERATIONS, "", 0, 10),
FUEL_LAG("F Lag", SensorCategory.OPERATIONS, "", 0, 30),
@ -86,6 +85,7 @@ public enum Sensor {
INJECTOR_3_DWELL("inj #3", SensorCategory.SNIFFING),
INJECTOR_4_DWELL("inj #4", SensorCategory.SNIFFING),
FUEL_BASE(SensorCategory.OPERATIONS, FieldType.FLOAT, 48, BackgroundColor.MUD, 0, 30, "ms"),
T_CHARGE(SensorCategory.OPERATIONS, FieldType.FLOAT, 52, BackgroundColor.MUD, 30, 140),
DWELL(SensorCategory.OPERATIONS, FieldType.FLOAT, 60, BackgroundColor.MUD, 1, 10),
CURRENT_VE(SensorCategory.OPERATIONS, FieldType.FLOAT, 112, BackgroundColor.MUD),
@ -93,11 +93,13 @@ public enum Sensor {
TPS_ACCEL_FUEL(SensorCategory.OPERATIONS, FieldType.FLOAT, 128, BackgroundColor.MUD),
Injector_duty(SensorCategory.OPERATIONS, FieldType.FLOAT, 140, BackgroundColor.MUD),
WALL_FUEL(SensorCategory.OPERATIONS, FieldType.FLOAT, 160, BackgroundColor.MUD),
temperatureFuelCorrection(SensorCategory.OPERATIONS, FieldType.FLOAT, 164, BackgroundColor.MUD, 0, 5),
iatCorrection(SensorCategory.OPERATIONS, FieldType.FLOAT, 164, BackgroundColor.MUD, 0, 5),
wallFuelCorrection(SensorCategory.OPERATIONS, FieldType.FLOAT, 168, BackgroundColor.MUD),
idlePosition(SensorCategory.OPERATIONS, FieldType.FLOAT, 172, BackgroundColor.MUD),
TARGET_AFR(SensorCategory.OPERATIONS, FieldType.FLOAT, 176, BackgroundColor.MUD),
CHARGE_AIR_MASS(SensorCategory.OPERATIONS, FieldType.FLOAT, 180, BackgroundColor.MUD),
cltCorrection(SensorCategory.OPERATIONS, FieldType.FLOAT, 184, BackgroundColor.MUD, 0, 5),
runningFuel(SensorCategory.OPERATIONS, FieldType.FLOAT, 188, BackgroundColor.MUD, 0, 15, "ms"),
INJ_1_2_DELTA("inj 1-2 delta", SensorCategory.SNIFFING),
INJ_3_4_DELTA("inj 3-4 delta", SensorCategory.SNIFFING),
@ -112,17 +114,21 @@ public enum Sensor {
private final FieldType type;
private final int offset;
Sensor(SensorCategory category, FieldType type, int offset, BackgroundColor color, double minValue, double maxValue) {
Sensor(SensorCategory category, FieldType type, int offset, BackgroundColor color, double minValue, double maxValue, String units) {
name = name();
this.type = type;
this.offset = offset;
this.category = category;
this.color = color;
units = "n/a";
this.units = units;
this.minValue = minValue;
this.maxValue = maxValue;
}
Sensor(SensorCategory category, FieldType type, int offset, BackgroundColor color, double minValue, double maxValue) {
this(category, type, offset, color, minValue, maxValue, "n/a");
}
Sensor(SensorCategory category, FieldType type, int offset, BackgroundColor color) {
this(category, type, offset, color, 0, 100);
}

View File

@ -6,6 +6,8 @@ import com.rusefi.config.Fields;
import com.rusefi.core.Sensor;
import com.rusefi.core.SensorCentral;
import com.rusefi.ui.config.ConfigField;
import com.rusefi.ui.util.UiUtils;
import org.jetbrains.annotations.NotNull;
import org.scilab.forge.jlatexmath.TeXConstants;
import org.scilab.forge.jlatexmath.TeXFormula;
import org.scilab.forge.jlatexmath.TeXIcon;
@ -16,24 +18,55 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import static com.rusefi.ui.util.LocalizedMessages.PAUSE;
public class FormulasPane {
private final JPanel content = new JPanel(new BorderLayout());
private final JPanel centerProxy = new JPanel(new BorderLayout());
private final String newLine = "\r\n \\\\ ";
private boolean isPaused;
public FormulasPane() {
content.add(centerProxy, BorderLayout.CENTER);
final JButton pauseButton = new JButton(PAUSE.getMessage());
pauseButton.setMnemonic('p');
pauseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
isPaused = !isPaused;
UiUtils.setPauseButtonText(pauseButton, isPaused);
}
});
JPanel top = new JPanel(new FlowLayout());
top.add(pauseButton);
content.add(top, BorderLayout.NORTH);
updateFormula();
new Timer(200, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateFormula();
if (!isPaused)
updateFormula();
}
}).start();
}
private void updateFormula() {
enum engine_load_mode_e {
LM_PLAIN_MAF("Plain MAF"),
LM_ALPHA_N("Alpha-N/TPS"),
LM_MAP("Plain MAP"),
LM_SPEED_DENSITY("Speed Density/MAP"),
LM_REAL_MAF("MAF");
private final String title;
engine_load_mode_e(String title) {
this.title = title;
}
}
private void updateFormula() {
BinaryProtocol bp = BinaryProtocol.instance;
if (bp == null)
return;
@ -41,8 +74,32 @@ public class FormulasPane {
if (ci == null)
return;
int algorithm = ConfigField.getValue(ci, Fields.ALGORITHM).intValue();
engine_load_mode_e algo = engine_load_mode_e.values()[algorithm];
String page;
if (algo == engine_load_mode_e.LM_SPEED_DENSITY) {
page = getSpeedDensity(ci);
} else {
page = "todo";
}
TeXFormula formula = new TeXFormula("\r\n" +
algo.title + newLine + newLine + newLine + page + "");
TeXIcon icon = formula.createTeXIcon(TeXConstants.STYLE_DISPLAY, 20);
BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
g2.setColor(Color.white);
g2.fillRect(0, 0, icon.getIconWidth(), icon.getIconHeight());
JLabel label = new JLabel(icon);
centerProxy.removeAll();
centerProxy.add(label, BorderLayout.CENTER);
}
@NotNull
private String getSpeedDensity(ConfigurationImage ci) {
String IAT = oneDecimal(Sensor.IAT);
String MAP = oneDecimal(Sensor.MAP);
String T_CHARGE = oneDecimal(Sensor.T_CHARGE);
@ -57,7 +114,7 @@ public class FormulasPane {
float displacement = (Float) ConfigField.getValue(ci, Fields.DISPLACEMENT);
int cylinderCount = (int) ConfigField.getValue(ci, Fields.CYLINDERSCOUNT);
String cylinderDisplacement = oneDecimal(displacement / cylinderCount);
String injectorFlow = oneDecimal((float)ConfigField.getValue(ci, Fields.INJECTOR_FLOW));
String injectorFlow = oneDecimal((float) ConfigField.getValue(ci, Fields.INJECTOR_FLOW));
String tCharge = "$Tcharge=f(CLT=" + oneDecimal(Sensor.CLT) + "C,IAT=" + IAT
+ "C,TPS=" + tpsStr + "\\%, RPM = " + RPM + ")=" + T_CHARGE + "C$";
@ -71,29 +128,30 @@ public class FormulasPane {
chargeAirMass +
"$";
String injTime = "$Injection_Time (ms) = \\frac{" +
String baseFuelStr = oneDecimal(Sensor.FUEL_BASE);
String baseFuel = "$Base_Fuel (ms) = \\frac{" +
"($Airmass = " + chargeAirMass + ")" +
"}{" +
"(TargetAFR (" + rpm_map + ") = " + TARGET_AFR + ")" +
" * (injectorFlow = " + injectorFlow + " cc/min)" +
"} = " + "yyy" + "ms$";
"} = " + baseFuelStr + "ms$";
String newLine = "\r\n \\\\ ";
String page = tCharge + newLine + newLine + newLine +
mCharge + newLine + newLine + newLine +
String IATcorr = oneDecimal(Sensor.iatCorrection);
String CLTcorr = oneDecimal(Sensor.cltCorrection);
String tpsAccel = oneDecimal(Sensor.TPS_ACCEL_FUEL);
String runningFuel = oneDecimal(Sensor.runningFuel);
String tempCorrections = " * cltCorr(" + CLTcorr + ") * iatCorr(" + IATcorr + ")";
String injTime = "$Fuel (ms) = " +
"(Base_Fuel (" + baseFuelStr + "ms) + Tps_Accel_Corr = (" + tpsAccel + "ms))" + tempCorrections +
" = " + runningFuel + "ms$";
return tCharge + newLine +
mCharge + newLine +
baseFuel + newLine +
injTime + newLine;
TeXFormula formula = new TeXFormula(page);
TeXIcon icon = formula.createTeXIcon(TeXConstants.STYLE_DISPLAY, 20);
BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
g2.setColor(Color.white);
g2.fillRect(0, 0, icon.getIconWidth(), icon.getIconHeight());
JLabel label = new JLabel(icon);
centerProxy.removeAll();
centerProxy.add(label, BorderLayout.CENTER);
}
private String oneDecimal(Sensor sensor) {