/*
* Open-Source tuning tools
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.vgi.mafscaling;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
public class VEColumnsFiltersSelection extends ColumnsFiltersSelection {
private JScrollPane pane = null;
JPanel selectionPanel = null;
private String[] columns = null;
private boolean isOl = true;
public boolean getUserSettings(String[] cols) {
columns = cols;
createScrollPane();
final JComboBox<String> clOlSelection = new JComboBox<String>(new String [] { "Open Loop", "Closed Loop" });
clOlSelection.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
isOl = (clOlSelection.getSelectedIndex() == 0? true: false);
selectionPanel.remove(columnsPanel);
selectionPanel.remove(filtersPanel);
createColumnsPanel(columns);
createFiltersPanel();
selectionPanel.add(columnsPanel);
selectionPanel.add(filtersPanel);
selectionPanel.revalidate();
selectionPanel.repaint();
pane.setPreferredSize(new Dimension(windowWidth, windowHeight));
SwingUtilities.invokeLater(new Runnable() { public void run() { pane.getVerticalScrollBar().setValue(0); } });
}
}
});
JComponent[] inputs = new JComponent[] {clOlSelection, pane};
// bring scroll pane to the start
SwingUtilities.invokeLater(new Runnable() { public void run() { pane.getVerticalScrollBar().setValue(0); } });
do {
if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(null, inputs, "Columns / Filters Settings", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE))
return false;
}
while (!validate());
return true;
}
protected void createScrollPane() {
createColumnsPanel(columns);
createFiltersPanel();
selectionPanel = new JPanel();
selectionPanel.setLayout(new BoxLayout(selectionPanel, BoxLayout.Y_AXIS));
selectionPanel.add(columnsPanel);
selectionPanel.add(filtersPanel);
selectionPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
pane = new JScrollPane(selectionPanel);
pane.setPreferredSize(new Dimension(windowWidth, windowHeight));
pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
}
protected void addColSelection() {
if (isOl) {
addWidebandAFRColSelection();
}
else {
addStockAFRColSelection();
addAFCorrectionColSelection();
addAFLearningColSelection();
}
addRPMColSelection();
addIATColSelection();
addThrottleAngleColSelection();
addManifoldPressureColSelection();
addFFBColSelection();
addClOlStatusColSelection();
addMAFColSelection();
addVEFlowColSelection();
}
protected void addFilterSelection() {
addThrottleChangeMaximumFilter();
thrtlChangeMaxFilter.setValue(Config.getVEThrottleChangeMaxValue());
if (isOl) {
addThrottleMinimumFilter();
thrtlMinimumFilter.setValue(Config.getVEThrottleMinimumValue());
addAFRMaximumFilter();
maxAfrFilter.setText(String.valueOf(Config.getVEOlAfrMaximumValue()));
}
else {
addAFRMaximumFilter();
maxAfrFilter.setText(String.valueOf(Config.getVEClAfrMaximumValue()));
addAFRMinimumFilter();
minAfrFilter.setText(String.valueOf(Config.getVEAfrMinimumValue()));
}
addCLOLStatusFilter();
clolStatusFilter.setValue(Config.getVEClOlStatusValue());
addIATMaximumFilter();
maxIatFilter.setText(String.valueOf(Config.getVEIatMaximumValue()));
addRPMMinimumFilter();
minRPMFilter.setText(String.valueOf(Config.getVERPMMinimumValue()));
addManifoldPressureMinimumFilter();
minMPFilter.setText(String.valueOf(Config.getVEMPMinimumValue()));
addFFBMaximumFilter();
maxFFBFilter.setText(String.valueOf(Config.getFFBMaximumValue()));
addFFBMinimumFilter();
minFFBFilter.setText(String.valueOf(Config.getFFBMinimumValue()));
if (isOl) {
addWideBandAFRRowOffsetFilter();
wbo2RowOffsetField.setText(String.valueOf(Config.getWBO2RowOffset()));
}
addCellHitCountMinimumFilter();
minCellHitCountFilter.setText(String.valueOf(Config.getVEMinCellHitCount()));
addCorrectionAppliedValue();
correctionAppliedValue.setValue(Config.getVECorrectionAppliedValue());
for (Component c : filtersPanel.getComponents()) {
if (c instanceof JEditorPane) {
JEditorPane label = (JEditorPane)c;
if (label.getText().startsWith("Remove data where Throttle Input is below"))
label.setText(label.getText() + " (*** works with AFR Maximum filter)");
else if (isOl && label.getText().startsWith("Remove data where AFR is above"))
label.setText(label.getText() + "(*** works with Throttle Input Minimum filter)");
else if (label.getText().startsWith("Remove data where RPM is below"))
label.setText(label.getText() + " (hint: check min RPM in SD table (y-axis)");
else if (label.getText().startsWith("Remove data where Manifold Pressure is below"))
label.setText(label.getText() + " (hint: check min MP in SD table (x-axis)");
else if (label.getText().equals(clolStatusLabelText))
label.setText(clolStatusLabelText + " *");
}
}
}
protected boolean validate(StringBuffer error) {
boolean ret = true;
String value;
String colName;
Config.veOpenLoop(isOl);
if (isOl) {
// Wideband AFR
value = wbAfrName.getText().trim();
colName = wbAfrLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setWidebandAfrColumnName(value);
}
else {
// Stock AFR
value = stockAfrName.getText().trim();
colName = stockAfrLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setAfrColumnName(value);
// AFR Learning
value = afLearningName.getText().trim();
colName = afLearningLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setAfLearningColumnName(value);
// AFR Correction
value = afCorrectionName.getText().trim();
colName = afCorrectionLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setAfCorrectionColumnName(value);
}
// 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);
// Intake Air Temperature
value = iatName.getText().trim();
colName = iatLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setIatColumnName(value);
// Throttle Angle
value = thrtlAngleName.getText().trim();
colName = thrtlAngleLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setThrottleAngleColumnName(value);
// MP
value = mpName.getText().trim();
colName = mpLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setMpColumnName(value);
// FFB
value = ffbName.getText().trim();
colName = ffbLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setFinalFuelingBaseColumnName(value);
// CL/OL Status
value = clolStatusName.getText().trim();
colName = clolStatusLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setClOlStatusColumnName(value);
// MAF
value = mafName.getText().trim();
colName = mafLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setMassAirflowColumnName(value);
// VE Flow
value = veFlowName.getText().trim();
colName = veFlowLabelText;
if (value.isEmpty()) {
ret = false;
error.append("\"").append(colName).append("\" column must be specified\n");
}
else
Config.setVEFlowColumnName(value);
// Throttle Change % Maximum
Config.setVEThrottleChangeMaxValue(Integer.valueOf(thrtlChangeMaxFilter.getValue().toString()));
if (isOl) {
// Throttle Minimum Input
Config.setVEThrottleMinimumValue(Integer.valueOf(thrtlMinimumFilter.getText()));
// AFR Maximum
Config.setVEOlAfrMaximumValue(Double.valueOf(maxAfrFilter.getText()));
// WBO2 Row Offset
Config.setWBO2RowOffset(Integer.valueOf(wbo2RowOffsetField.getText()));
}
else {
// AFR Maximum
Config.setVEClAfrMaximumValue(Double.valueOf(maxAfrFilter.getText()));
// AFR Minimum
Config.setVEAfrMinimumValue(Double.valueOf(minAfrFilter.getText()));
}
// CL/OL Status
Config.setVEClOlStatusValue(Integer.valueOf(clolStatusFilter.getValue().toString()));
// IAT filter
Config.setVEIatMaximumValue(Double.valueOf(maxIatFilter.getText()));
// RPM Minimum
Config.setVERPMMinimumValue(Integer.valueOf(minRPMFilter.getText()));
// MP Minimum
Config.setVEMPMinimumValue(Double.valueOf(minMPFilter.getText()));
// FFB filters
Config.setFFBMaximumValue(Double.valueOf(maxFFBFilter.getText()));
Config.setFFBMinimumValue(Double.valueOf(minFFBFilter.getText()));
// Minimum Cell Hit Count Filter
Config.setVEMinCellHitCount(Integer.valueOf(minCellHitCountFilter.getText()));
// Correction applied
Config.setVECorrectionAppliedValue(Integer.valueOf(correctionAppliedValue.getValue().toString()));
return ret;
}
protected boolean processDefaultButton(ActionEvent e) {
if ("thrtlchange".equals(e.getActionCommand()))
thrtlChangeMaxFilter.setValue(Integer.valueOf(Config.DefaultVEThrottleChangeMax));
else if ("minrpm".equals(e.getActionCommand()))
minRPMFilter.setText(Config.DefaultRPMMinimum);
else if ("minmp".equals(e.getActionCommand()))
minMPFilter.setText(Config.DefaultMPMinimum);
else if ("maxiat".equals(e.getActionCommand()))
maxIatFilter.setText(Config.DefaultVEIATMaximum);
else if ("maxffb".equals(e.getActionCommand()))
maxFFBFilter.setText(Config.DefaultFFBMaximum);
else if ("minffb".equals(e.getActionCommand()))
minFFBFilter.setText(Config.DefaultFFBMinimum);
else if ("clolstatus".equals(e.getActionCommand()))
clolStatusFilter.setValue(Integer.valueOf(Config.DefaultClOlStatusValue));
else if ("minthrtl".equals(e.getActionCommand()))
thrtlMinimumFilter.setValue(Integer.valueOf(Config.DefaultVEThrottleMinimum));
else if ("maxafr".equals(e.getActionCommand())) {
if (isOl)
maxAfrFilter.setText(Config.DefaultVEOlAfrMaximum);
else
maxAfrFilter.setText(Config.DefaultVEClAfrMaximum);
}
else if ("minafr".equals(e.getActionCommand()))
minAfrFilter.setText(Config.DefaultVEAfrMinimum);
else if ("wbo2offset".equals(e.getActionCommand()))
wbo2RowOffsetField.setText(Config.DefaultWBO2RowOffset);
else if ("minhitcnt".equals(e.getActionCommand()))
minCellHitCountFilter.setText(Config.DefaultVEMinCellHitCount);
else if ("corrapply".equals(e.getActionCommand()))
correctionAppliedValue.setValue(Integer.valueOf(Config.DefaultCorrectionAppliedValue));
else
return false;
return true;
}
}