diff --git a/MafScaling.jar b/MafScaling.jar index d8b45c3..99c833c 100644 Binary files a/MafScaling.jar and b/MafScaling.jar differ diff --git a/src/com/vgi/mafscaling/MafIatColumnsFiltersSelection.java b/src/com/vgi/mafscaling/MafIatColumnsFiltersSelection.java index d57eee1..6d9add7 100644 --- a/src/com/vgi/mafscaling/MafIatColumnsFiltersSelection.java +++ b/src/com/vgi/mafscaling/MafIatColumnsFiltersSelection.java @@ -30,25 +30,27 @@ public MafIatColumnsFiltersSelection(boolean isPolfTableSet) { } protected int getWindowHeight() { - return 750; + return 850; } protected int getColSelectionGridHeight() { - return 10; + return 13; } protected void addColSelection() { addTimeColSelection(); + addRPMColSelection(); + addLoadColSelection(); addThrottleAngleColSelection(); addAFLearningColSelection(); addAFCorrectionColSelection(); addMAFVoltageColSelection(); addStockAFRColSelection(); addWidebandAFRColSelection(); - addCommandedAFRColSelection(); addIATColSelection(); addMAFColSelection(); addClOlStatusColSelection(); + addCommandedAFRColSelection(); } protected void addFilterSelection() { @@ -64,6 +66,8 @@ protected void addFilterSelection() { minAfrFilter.setText(String.valueOf(Config.getMIAfrMinimumValue())); addDvDtMaximumFilter(); maxDvdtFilter.setText(String.valueOf(Config.getMIDvDtMaximumValue())); + addWOTEnrichmentMinimumFilter(); + wotEnrichmentField.setText(String.valueOf(Config.getWOTEnrichmentValue())); addWideBandAFRRowOffsetFilter(); wbo2RowOffsetField.setText(String.valueOf(Config.getWBO2RowOffset())); addCellHitCountMinimumFilter(); @@ -84,6 +88,26 @@ protected boolean validate(StringBuffer error) { boolean ret = true; String value; String colName; + + // Engine Speed + value = rpmName.getText().trim(); + colName = rpmLabelText; + if (value.isEmpty()) { + ret = false; + error.append("\"").append(colName).append("\" column must be specified\n"); + } + else + Config.setRpmColumnName(value); + + // Engine Load + value = loadName.getText().trim(); + colName = loadLabelText; + if (value.isEmpty()) { + ret = false; + error.append("\"").append(colName).append("\" column must be specified\n"); + } + else + Config.setLoadColumnName(value); // AFR Learning value = afLearningName.getText().trim(); @@ -174,16 +198,23 @@ protected boolean validate(StringBuffer error) { } else Config.setWidebandAfrColumnName(value); - + // Commanded AFR value = commAfrName.getText().trim(); colName = commAfrLabelText; - if (value.isEmpty()) { - ret = false; - error.append("\"").append(colName).append("\" column must be specified if \"Primary Open Loop Fueling\" table is not set.\n"); - } - else + if (isPolfTableSet) { + if (value.isEmpty()) + value = Config.NO_NAME; Config.setCommandedAfrColumnName(value); + } + else { + if (value.isEmpty()) { + ret = false; + error.append("\"").append(colName).append("\" column must be specified if \"Primary Open Loop Fueling\" table is not set.\n"); + } + else + Config.setCommandedAfrColumnName(value); + } // MAF value = mafName.getText().trim(); @@ -220,6 +251,9 @@ protected boolean validate(StringBuffer error) { // dV/dt filter Config.setMIDvDtMaximumValue(Double.valueOf(maxDvdtFilter.getText())); + // WOT Enrichment + Config.setWOTEnrichmentValue(Double.valueOf(wotEnrichmentField.getText())); + // WBO2 Row Offset Config.setWBO2RowOffset(Integer.valueOf(wbo2RowOffsetField.getText())); @@ -240,6 +274,8 @@ else if ("maxdvdt".equals(e.getActionCommand())) maxDvdtFilter.setText(Config.DefaultDvDtMaximum); else if ("minhitcnt".equals(e.getActionCommand())) minCellHitCountFilter.setText(Config.DefaultMIMinCellHitCount); + else if ("wotenrich".equals(e.getActionCommand())) + wotEnrichmentField.setText(Config.DefaultWOTEnrichment); else if ("wbo2offset".equals(e.getActionCommand())) wbo2RowOffsetField.setText(Config.DefaultWBO2RowOffset); else if ("corrapply".equals(e.getActionCommand())) diff --git a/src/com/vgi/mafscaling/MafIatComp.java b/src/com/vgi/mafscaling/MafIatComp.java index 865c868..1fc7988 100644 --- a/src/com/vgi/mafscaling/MafIatComp.java +++ b/src/com/vgi/mafscaling/MafIatComp.java @@ -119,6 +119,7 @@ public class MafIatComp extends JTabbedPane implements ActionListener, IMafChart private double afrMin = Config.getMIAfrMinimumValue(); private double afrMax = Config.getMIAfrMaximumValue(); private double dvDtMax = Config.getMIDvDtMaximumValue(); + private double minWotEnrichment = Config.getWOTEnrichmentValue(); private int logClOlStatusColIdx = -1; private int logThrottleAngleColIdx = -1; @@ -126,6 +127,8 @@ public class MafIatComp extends JTabbedPane implements ActionListener, IMafChart private int logAfCorrectionColIdx = -1; private int logAfrColIdx = -1; private int logWBAfrColIdx = -1; + private int logRpmColIdx = -1; + private int logLoadColIdx = -1; private int logCommandedAfrCol = -1; private int logTimeColIdx = -1; private int logMafvColIdx = -1; @@ -142,6 +145,7 @@ public class MafIatComp extends JTabbedPane implements ActionListener, IMafChart private ChartPanel chartPanel = null; private JScrollPane dataScrollPane = null; + private PrimaryOpenLoopFuelingTable polfTable = null; private ExcelAdapter mpExcelAdapter = null; private ExcelAdapter excelAdapter = new ExcelAdapter(); private ArrayList errCorrArray = new ArrayList(); @@ -160,8 +164,9 @@ public class MafIatComp extends JTabbedPane implements ActionListener, IMafChart private ArrayList yAxisArray = null; private ArrayList> savedNewMafIatTable = new ArrayList>(); - public MafIatComp(int tabPlacement) { + public MafIatComp(int tabPlacement, PrimaryOpenLoopFuelingTable table) { super(tabPlacement); + polfTable = table; initialize(); } @@ -208,16 +213,25 @@ private void createDataTab() { dataPanel.add(cntlPanel, gbl_ctrlPanel); GridBagLayout gbl_cntlPanel = new GridBagLayout(); - gbl_cntlPanel.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0}; + gbl_cntlPanel.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0, 0}; gbl_cntlPanel.rowHeights = new int[]{0}; - gbl_cntlPanel.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; + gbl_cntlPanel.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; gbl_cntlPanel.rowWeights = new double[]{0}; cntlPanel.setLayout(gbl_cntlPanel); + JButton btnOpFuelingButton = new JButton("POL Fueling"); + GridBagConstraints gbc_btnOpFuelingButton = new GridBagConstraints(); + gbc_btnOpFuelingButton.insets = new Insets(0, 0, 5, 5); + gbc_btnOpFuelingButton.gridx = 0; + gbc_btnOpFuelingButton.gridy = 0; + btnOpFuelingButton.setActionCommand("fueling"); + btnOpFuelingButton.addActionListener(this); + cntlPanel.add(btnOpFuelingButton, gbc_btnOpFuelingButton); + JButton btnLoadDataButton = new JButton("Load Log"); GridBagConstraints gbc_btnLoadDataButton = new GridBagConstraints(); gbc_btnLoadDataButton.insets = new Insets(0, 0, 5, 5); - gbc_btnLoadDataButton.gridx = 0; + gbc_btnLoadDataButton.gridx = 1; gbc_btnLoadDataButton.gridy = 0; btnLoadDataButton.setActionCommand("loadlog"); btnLoadDataButton.addActionListener(this); @@ -227,7 +241,7 @@ private void createDataTab() { GridBagConstraints gbc_btnMafIatClearButton = new GridBagConstraints(); gbc_btnMafIatClearButton.anchor = GridBagConstraints.PAGE_START; gbc_btnMafIatClearButton.insets = new Insets(0, 0, 5, 5); - gbc_btnMafIatClearButton.gridx = 1; + gbc_btnMafIatClearButton.gridx = 2; gbc_btnMafIatClearButton.gridy = 0; btnMafIatClearButton.setActionCommand("clearmp"); btnMafIatClearButton.addActionListener(this); @@ -236,7 +250,7 @@ private void createDataTab() { JButton btnRunClearButton = new JButton("Clear Run Data"); GridBagConstraints gbc_btnRunClearButton = new GridBagConstraints(); gbc_btnRunClearButton.insets = new Insets(0, 0, 5, 5); - gbc_btnRunClearButton.gridx = 2; + gbc_btnRunClearButton.gridx = 3; gbc_btnRunClearButton.gridy = 0; btnRunClearButton.setActionCommand("clearlog"); btnRunClearButton.addActionListener(this); @@ -245,7 +259,7 @@ private void createDataTab() { JButton btnAllClearButton = new JButton("Clear All"); GridBagConstraints gbc_btnAllClearButton = new GridBagConstraints(); gbc_btnAllClearButton.insets = new Insets(0, 0, 5, 5); - gbc_btnAllClearButton.gridx = 3; + gbc_btnAllClearButton.gridx = 4; gbc_btnAllClearButton.gridy = 0; btnAllClearButton.setActionCommand("clearall"); btnAllClearButton.addActionListener(this); @@ -254,7 +268,7 @@ private void createDataTab() { JCheckBox hideLogTableCheckBox = new JCheckBox("Hide Log Table"); GridBagConstraints gbc_hideLogTableCheckBox = new GridBagConstraints(); gbc_hideLogTableCheckBox.insets = new Insets(0, 0, 3, 3); - gbc_hideLogTableCheckBox.gridx = 4; + gbc_hideLogTableCheckBox.gridx = 5; gbc_hideLogTableCheckBox.gridy = 0; hideLogTableCheckBox.setActionCommand("hidelogtable"); hideLogTableCheckBox.addActionListener(this); @@ -263,7 +277,7 @@ private void createDataTab() { compareTableCheckBox = new JCheckBox("Compare Tables"); GridBagConstraints gbc_compareTableCheckBox = new GridBagConstraints(); gbc_compareTableCheckBox.insets = new Insets(0, 0, 3, 3); - gbc_compareTableCheckBox.gridx = 5; + gbc_compareTableCheckBox.gridx = 6; gbc_compareTableCheckBox.gridy = 0; compareTableCheckBox.setActionCommand("comparetables"); compareTableCheckBox.addActionListener(this); @@ -273,7 +287,7 @@ private void createDataTab() { GridBagConstraints gbc_btnGoButton = new GridBagConstraints(); gbc_btnGoButton.anchor = GridBagConstraints.EAST; gbc_btnGoButton.insets = new Insets(0, 0, 5, 0); - gbc_btnGoButton.gridx = 6; + gbc_btnGoButton.gridx = 7; gbc_btnGoButton.gridy = 0; btnGoButton.setActionCommand("go"); btnGoButton.addActionListener(this); @@ -737,7 +751,7 @@ private int getLogTableEmptyRow() { return 0; } - private boolean getColumnsFilters(String[] elements) { + private boolean getColumnsFilters(String[] elements, boolean isPolSet) { boolean ret = true; ArrayList columns = new ArrayList(Arrays.asList(elements)); String logClOlStatusColName = Config.getClOlStatusColumnName(); @@ -751,6 +765,8 @@ private boolean getColumnsFilters(String[] elements) { String logIatColName = Config.getIatColumnName(); String logMafColName = Config.getMassAirflowColumnName(); String logCommandedAfrColName = Config.getCommandedAfrColumnName(); + String logRpmColName = Config.getRpmColumnName(); + String logLoadColName = Config.getLoadColumnName(); logClOlStatusColIdx = columns.indexOf(logClOlStatusColName); logThrottleAngleColIdx = columns.indexOf(logThrottleAngleColName); logAfLearningColIdx = columns.indexOf(logAfLearningColName); @@ -762,17 +778,21 @@ private boolean getColumnsFilters(String[] elements) { logMafvColIdx = columns.indexOf(logMafvColName); logIatColIdx = columns.indexOf(logIatColName); logMafColIdx = columns.indexOf(logMafColName); + logRpmColIdx = columns.indexOf(logRpmColName); + logLoadColIdx = columns.indexOf(logLoadColName); if (logClOlStatusColIdx == -1) { Config.setClOlStatusColumnName(Config.NO_NAME); ret = false; } if (logThrottleAngleColIdx == -1){ Config.setThrottleAngleColumnName(Config.NO_NAME);ret = false; } if (logAfLearningColIdx == -1) { Config.setAfLearningColumnName(Config.NO_NAME); ret = false; } if (logAfCorrectionColIdx == -1) { Config.setAfCorrectionColumnName(Config.NO_NAME); ret = false; } if (logWBAfrColIdx == -1) { Config.setWidebandAfrColumnName(Config.NO_NAME); ret = false; } if (logAfrColIdx == -1) { Config.setAfrColumnName(Config.NO_NAME); ret = false; } - if (logCommandedAfrCol == -1) { Config.setCommandedAfrColumnName(Config.NO_NAME); ret = false; } if (logTimeColIdx == -1) { Config.setTimeColumnName(Config.NO_NAME); ret = false; } if (logMafvColIdx == -1) { Config.setMafVoltageColumnName(Config.NO_NAME); ret = false; } if (logIatColIdx == -1) { Config.setIatColumnName(Config.NO_NAME); ret = false; } if (logMafColIdx == -1) { Config.setMassAirflowColumnName(Config.NO_NAME); ret = false; } + if (logRpmColIdx == -1) { Config.setRpmColumnName(Config.NO_NAME); ret = false; } + if (logLoadColIdx == -1) { Config.setLoadColumnName(Config.NO_NAME); ret = false; } + if (logCommandedAfrCol == -1) { Config.setCommandedAfrColumnName(Config.NO_NAME); if (!isPolSet) ret = false; } isMafIatInRatio = Config.getIsMafIatInRatio(); afrRowOffset = Config.getWBO2RowOffset(); corrApplied = Config.getMICorrectionAppliedValue(); @@ -782,12 +802,14 @@ private boolean getColumnsFilters(String[] elements) { afrMin = Config.getMIAfrMinimumValue(); afrMax = Config.getMIAfrMaximumValue(); dvDtMax = Config.getMIDvDtMaximumValue(); + minWotEnrichment = Config.getWOTEnrichmentValue(); return ret; } private void loadLogFile() { if (JFileChooser.APPROVE_OPTION != fileChooser.showOpenDialog(this)) return; + boolean isPolSet = polfTable.isSet(); File[] files = fileChooser.getSelectedFiles(); for (File file : files) { BufferedReader br = null; @@ -797,21 +819,23 @@ private void loadLogFile() { String line = br.readLine(); if (line != null) { String [] elements = line.split(",", -1); - getColumnsFilters(elements); + getColumnsFilters(elements, false); boolean resetColumns = false; if (logThrottleAngleColIdx >= 0 || logAfLearningColIdx >= 0 || logAfCorrectionColIdx >= 0 || logWBAfrColIdx >= 0 || logAfrColIdx >= 0 || logCommandedAfrCol >= 0 || logTimeColIdx >=0 || - logMafvColIdx >= 0 || logIatColIdx >= 0 || logMafColIdx >= 0 || logClOlStatusColIdx >= 0) { + logMafvColIdx >= 0 || logIatColIdx >= 0 || logMafColIdx >= 0 || logClOlStatusColIdx >= 0 || + logRpmColIdx >= 0 || logLoadColIdx >= 0) { if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(null, "Would you like to reset column names or filter values?", "Columns/Filters Reset", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE)) resetColumns = true; } - if (resetColumns || logThrottleAngleColIdx < 0 || logAfLearningColIdx < 0 || logAfCorrectionColIdx < 0 || - logWBAfrColIdx < 0 || logAfrColIdx < 0 || logCommandedAfrCol < 0 || logTimeColIdx < 0 || - logMafvColIdx < 0 || logIatColIdx < 0 || logMafColIdx < 0 || logClOlStatusColIdx < 0) { - ColumnsFiltersSelection selectionWindow = new MafIatColumnsFiltersSelection(false); - if (!selectionWindow.getUserSettings(elements) || !getColumnsFilters(elements)) + if (resetColumns || logThrottleAngleColIdx < 0 || logAfLearningColIdx < 0 || + logAfCorrectionColIdx < 0 || logWBAfrColIdx < 0 || logAfrColIdx < 0 || logTimeColIdx < 0 || + logMafvColIdx < 0 || logIatColIdx < 0 || logMafColIdx < 0 || logClOlStatusColIdx < 0 || + logRpmColIdx < 0 || logLoadColIdx < 0 || (logCommandedAfrCol < 0 && !isPolSet)) { + ColumnsFiltersSelection selectionWindow = new MafIatColumnsFiltersSelection(isPolSet); + if (!selectionWindow.getUserSettings(elements) || !getColumnsFilters(elements, isPolSet)) return; } @@ -825,6 +849,8 @@ private void loadLogFile() { double pThrottle = 0; double ppThrottle = 0; double afr = 0; + double rpm = 0; + double load = 0; double corr = 0; double cmdafr = 0; double trims = 0; @@ -883,7 +909,16 @@ else if (row <= 2 || Math.abs(ppThrottle - throttle) <= thrtlMaxChange2) { } else { afr = Double.valueOf(afrflds[logWBAfrColIdx]); - cmdafr = Double.valueOf(flds[logCommandedAfrCol]); + rpm = Double.valueOf(flds[logRpmColIdx]); + load = Double.valueOf(flds[logLoadColIdx]); + if (logCommandedAfrCol >= 0) + cmdafr = Double.valueOf(flds[logCommandedAfrCol]); + else if (isPolSet) + cmdafr = Utils.calculateCommandedAfr(rpm, load, minWotEnrichment, polfTable); + else { + JOptionPane.showMessageDialog(null, "Please set either \"Commanded AFR\" column or \"Primary Open Loop Fueling\" table", "Error", JOptionPane.ERROR_MESSAGE); + return; + } corr = (afr / ((100.0 - trims) / 100.0)) / cmdafr; } iat = Double.valueOf(flds[logIatColIdx]); @@ -1363,6 +1398,9 @@ else if ("clearall".equals(e.getActionCommand())) { else if ("go".equals(e.getActionCommand())) { calculateIATComp(); } + else if ("fueling".equals(e.getActionCommand())) { + polfTable.getSetUserFueling(); + } else if ("loadlog".equals(e.getActionCommand())) { loadLogFile(); } diff --git a/src/com/vgi/mafscaling/MafScaling.java b/src/com/vgi/mafscaling/MafScaling.java index ffd8977..b9a5de1 100644 --- a/src/com/vgi/mafscaling/MafScaling.java +++ b/src/com/vgi/mafscaling/MafScaling.java @@ -31,7 +31,7 @@ public class MafScaling { private static final Logger logger = Logger.getLogger(MafScaling.class); - private static final String Title = "MAF Scaling - v1.6.0"; + private static final String Title = "MAF Scaling - v1.6.1"; private static final String OLTabName = "Open Loop"; private static final String CLTabName = "Closed Loop"; private static final String RTabName = "Rescale"; @@ -119,7 +119,7 @@ public void windowClosing(WindowEvent e) { lc.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); tabbedPane.add(lc, LCTabName); - JTabbedPane mi = new MafIatComp(JTabbedPane.LEFT); + JTabbedPane mi = new MafIatComp(JTabbedPane.LEFT, pofFuelingTable); mi.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); tabbedPane.add(mi, MITabName); diff --git a/src/com/vgi/mafscaling/mafiat_comp.properties b/src/com/vgi/mafscaling/mafiat_comp.properties index 0269b52..ad9936a 100644 --- a/src/com/vgi/mafscaling/mafiat_comp.properties +++ b/src/com/vgi/mafscaling/mafiat_comp.properties @@ -35,9 +35,17 @@ This tool addition is a port of Kodename47's spreadsheet.\ Depending on what tuning program you use have a look at "MAF (IAT) Compensation" table and see in what units X-Axis (IAT) is defined in
\ you will need to log in the same exactly units what the table X-Axis specifies.

\
    \ -
  1. Log "Time%", "Throttle Angle %", "IAT" (see the note above), "AFR Learning (LTFT)", "AFR Correction (STFT)", "MAF Voltage", "Wideband AFR", "Commanded AFR", "Mass Airflow", and "CL/OL Status". \ +
  2. Log "Time%", "Engine Speed", "Engine Load", "Throttle Angle %", "IAT" (see the note above), "AFR Learning (LTFT)", "AFR Correction (STFT)", "MAF Voltage", "Wideband AFR", "Mass Airflow", "CL/OL Status", and "Commanded AFR" if your logging tool has it. \
  3. Open your tune in RomRaider.
  4. \
  5. Expand "Mass Airflow /Engine Load" tables group and copy "MAF Compensation (IAT)" table by clicking "Edit"->"Copy Table" into the first cell of "Current MAF IAT compensation table" table on the tool.
  6. \ +
  7. \If you did not log "Commanded Afr", click "POL Fueling" button to set open loop fueling data.
    \ +
      \ +
    • Open your tune in RomRaider.
    • \ +
    • Expand "Fueling - Primary Open Loop" tables group and copy "Primary Open Loop Fueling" table by clicking "Edit"->"Copy Table" into the first cell of "Primary Open Loop Fueling" table on the tool.
    • \ +
    • Click "Validate" button to make sure all is fine (validation is done on setting the table as default and saving it or on submitting the table so it's not required).
    • \ +
    • Most likely the "Primary Open Loop Fueling" table will stay the same, so for auto-loading next time you can click on "Set Default" and save this table in a new file. If you do have another tune with a different "Primary Open Loop Fueling" table, you can click on "Clear" to clear out table, then paste data from second "Primary Open Loop Fueling" table, click on "Set Default" and save this table in a new file. To switch between different Primary Open Loop Fueling tables saved in files click on "Clear" to clear table, then click on "Load" to load data from file, then click on "Set Default" so that next time it will be loaded automatically.
    • \ +
    \ +
  8. \
  9. Click on "Load Log" button, select your log file(s), select asked columns from log file AND set desired filters values. Once the log file is processed you should see data populated in the table with calculated AFR Correction and dV/dt. At this point you may review the charts of the data
  10. \
  11. Click on "GO" button at the top bar right corner to generate new MAF IAT Compensation data table.
  12. \
  13. Copy the data to your "MAF Compensation (IAT)" table.
  14. \