auto-sync

This commit is contained in:
rusEfi 2016-01-20 00:01:29 -05:00
parent 0f8d0c47c5
commit 61e77787a7
4 changed files with 161 additions and 53 deletions

View File

@ -2,6 +2,9 @@ package com.rusefi.config;
import com.rusefi.core.Pair;
import java.util.HashMap;
import java.util.Map;
/**
* @see Fields
*/
@ -12,6 +15,8 @@ public class Field {
private static final String FLOAT_VALUE_PREFIX = "float @";
public static final int NO_BIT_OFFSET = -1;
public final static Map<String, Field> VALUES = new HashMap<>();
private final String name;
private final int offset;
private final FieldType type;
@ -38,6 +43,10 @@ public class Field {
this.options = options;
}
public String getName() {
return name;
}
public String setCommand() {
if (type == FieldType.BIT)
return "set_bit " + getOffset() + " " + bitOffset;
@ -115,7 +124,7 @@ public class Field {
}
private static void register(Field field) {
VALUES.put(field.name, field);
}
public static Field create(String name, int offset, FieldType type, int bitOffset) {

View File

@ -1,80 +1,151 @@
package com.rusefi.ui;
import com.rusefi.config.Fields;
import com.rusefi.ui.config.BitConfigField;
import com.rusefi.ui.config.ConfigField;
import com.rusefi.ui.config.EnumConfigField;
import com.rusefi.config.Field;
import com.rusefi.config.FieldType;
import com.rusefi.ui.config.*;
import com.rusefi.ui.util.UiUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
public class SettingsTab {
public static final String WRITECONFIG = "writeconfig";
private final JPanel panel = new JPanel(new GridLayout(8, 3));
private final JPanel content = new JPanel(new BorderLayout());
private final JPanel panel = new JPanel(new GridLayout(1, 3));
private final JButton dialog = new JButton();
private final JPanel dialogBody = new JPanel();
public SettingsTab() {
UiUtils.showLoadingMessage(content);
}
}
public Component createPane() {
return content;
}
public void showContent() {
final Map<String, DialogModel> dialogs = IniFileModel.getinstance().getDialogs();
if (dialogs.isEmpty()) {
// todo: show error label
return;
}
content.removeAll();
panel.removeAll();
panel.add(UiUtils.wrap(new EnumConfigField(Fields.ALGORITHM, "algorithm").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGER_TYPE, "trigger type").getContent()));
panel.add(new BitConfigField(Fields.USEONLYFRONTFORTRIGGER, "Only Front").getContent());
panel.add(new BitConfigField(Fields.ISPRINTTRIGGERSYNCHDETAILS, "gap info").getContent());
panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGERINPUTPINS1, "trigger #1 input").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGERINPUTPINS2, "trigger #2 input").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGERINPUTPINS3, "trigger #3 input").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.INJECTIONPINS1, "injector #1").getContent()));
String firstDialog = new ArrayList<>(dialogs.keySet()).get(0);
dialog.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Component c = (Component) e.getSource();
panel.add(UiUtils.wrap(new BitConfigField(Fields.ISSDCARDENABLED, "SD card enabled").getContent()));
panel.add(UiUtils.wrap(new BitConfigField(Fields.USELCDSCREEN, "Use LCD").getContent()));
final JPopupMenu menu = new JPopupMenu();
panel.add(UiUtils.wrap(new EnumConfigField(Fields.HIP9011INTHOLDPIN, "int/hold pin").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.HIP9011INTHOLDPINMODE, "int/hold pin mode").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.HIP9011GAIN, "k gain").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.KNOCKDETECTIONWINDOWSTART, "kw start").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.KNOCKDETECTIONWINDOWEND, "kw end").getContent()));
for (final String name : dialogs.keySet()) {
JMenuItem item = new JMenuItem(name);
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectDialog(name);
}
});
menu.add(item);
}
menu.show(c, -1, c.getHeight());
}
});
panel.add(UiUtils.wrap(new EnumConfigField(Fields.IGNITIONPINS1, "ign #1").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.IGNITIONPINS3, "ign #3").getContent()));
selectDialog(firstDialog);
panel.add(UiUtils.wrap(new EnumConfigField(Fields.AFR_HWCHANNEL, "AFR channel").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.MAFADCCHANNEL, "MAF channel").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.MAP_SENSOR_HWCHANNEL, "MAP channel").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.TPSADCCHANNEL, "TPS channel").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.PEDALPOSITIONCHANNEL, "Pedal channel").getContent()));
panel.add(UiUtils.wrap(dialog));
panel.add(UiUtils.wrap(new BitConfigField(Fields.ISCANENABLED, "CAN enabled").getContent()));
panel.add(UiUtils.wrap(new BitConfigField(Fields.CANREADENABLED, "CAN read").getContent()));
panel.add(UiUtils.wrap(new BitConfigField(Fields.CANWRITEENABLED, "CAN write").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.CANTXPIN, "CAN TX").getContent()));
panel.add(UiUtils.wrap(new EnumConfigField(Fields.CANRXPIN, "CAN RX").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.ALGORITHM, "algorithm").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGER_TYPE, "trigger type").getContent()));
// panel.add(new BitConfigField(Fields.USEONLYFRONTFORTRIGGER, "Only Front").getContent());
// panel.add(new BitConfigField(Fields.ISPRINTTRIGGERSYNCHDETAILS, "gap info").getContent());
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGERINPUTPINS1, "trigger #1 input").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGERINPUTPINS2, "trigger #2 input").getContent()));
//// panel.add(UiUtils.wrap(new EnumConfigField(Fields.TRIGGERINPUTPINS3, "trigger #3 input").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.INJECTIONPINS1, "injector #1").getContent()));
//
// panel.add(UiUtils.wrap(new BitConfigField(Fields.ISSDCARDENABLED, "SD card enabled").getContent()));
// panel.add(UiUtils.wrap(new BitConfigField(Fields.USELCDSCREEN, "Use LCD").getContent()));
//
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.HIP9011INTHOLDPIN, "int/hold pin").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.HIP9011INTHOLDPINMODE, "int/hold pin mode").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.HIP9011GAIN, "k gain").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.KNOCKDETECTIONWINDOWSTART, "kw start").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.KNOCKDETECTIONWINDOWEND, "kw end").getContent()));
//
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.IGNITIONPINS1, "ign #1").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.IGNITIONPINS3, "ign #3").getContent()));
//
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.AFR_HWCHANNEL, "AFR channel").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.MAFADCCHANNEL, "MAF channel").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.MAP_SENSOR_HWCHANNEL, "MAP channel").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.TPSADCCHANNEL, "TPS channel").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.PEDALPOSITIONCHANNEL, "Pedal channel").getContent()));
//
// panel.add(UiUtils.wrap(new BitConfigField(Fields.ISCANENABLED, "CAN enabled").getContent()));
// panel.add(UiUtils.wrap(new BitConfigField(Fields.CANREADENABLED, "CAN read").getContent()));
// panel.add(UiUtils.wrap(new BitConfigField(Fields.CANWRITEENABLED, "CAN write").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.CANTXPIN, "CAN TX").getContent()));
// panel.add(UiUtils.wrap(new EnumConfigField(Fields.CANRXPIN, "CAN RX").getContent()));
//
//
// panel.add(UiUtils.wrap(new ConfigField(Fields.GLOBALFUELCORRECTION, "fuel corr").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.GLOBALTRIGGERANGLEOFFSET, "trig offset").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.CRANKING_BASEFUEL, "Cranking Fuel").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.IGNITIONOFFSET, "Ignition offset").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.CRANKINGTIMINGANGLE, "Cranking timing").getContent()));
//
// panel.add(UiUtils.wrap(new ConfigField(Fields.ADDEDTOWALLCOEF, "Added to wall").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.SUCKEDOFFCOEF, "Sucked off wall").getContent()));
//// panel.add(UiUtils.wrap(new ConfigField(Fields.TPSACCELENRICHMENTTHRESHOLD, "TPS accel threshold").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.TPSACCELENRICHMENTMULTIPLIER, "TPS accel coef").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.GLOBALFUELCORRECTION, "fuel corr").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.GLOBALTRIGGERANGLEOFFSET, "trig offset").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.CRANKING_BASEFUEL, "Cranking Fuel").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.IGNITIONOFFSET, "Ignition offset").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.CRANKINGTIMINGANGLE, "Cranking timing").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.ADDEDTOWALLCOEF, "Added to wall").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.SUCKEDOFFCOEF, "Sucked off wall").getContent()));
// panel.add(UiUtils.wrap(new ConfigField(Fields.TPSACCELENRICHMENTTHRESHOLD, "TPS accel threshold").getContent()));
panel.add(UiUtils.wrap(new ConfigField(Fields.TPSACCELENRICHMENTMULTIPLIER, "TPS accel coef").getContent()));
panel.add(dialogBody);
panel.add(UiUtils.wrap(RecentCommands.createButton(new AtomicBoolean(), WRITECONFIG)));
content.add(panel);
UiUtils.trueLayout(content);
}
private void selectDialog(String name) {
dialog.setText(name);
dialogBody.removeAll();
DialogModel m = IniFileModel.getinstance().getDialogs().get(name);
dialogBody.setLayout(new GridLayout(m.getFields().size(), 1));
for (DialogModel.Field f : m.getFields()) {
if (f.getKey() == null)
continue;
Field field = Field.VALUES.get(f.getKey().toUpperCase());
if (field == null)
throw new NullPointerException("No field for " + f.getKey());
System.out.println(field);
JComponent control;
if (field.getType() == FieldType.BIT) {
control = new BitConfigField(field, f.getUiName()).getContent();
} else if (field.getOptions() != null) {
control = new EnumConfigField(field, f.getUiName()).getContent();
} else {
control = new ConfigField(field, f.getUiName()).getContent();
}
dialogBody.add(control);
}
UiUtils.trueLayout(dialogBody);
}
}

View File

@ -10,15 +10,15 @@ import java.util.List;
public class DialogModel {
private final String key;
private final String uiName;
private final List<String> fields;
private final List<Field> fields;
public DialogModel(String key, String uiName, List<String> fields) {
public DialogModel(String key, String uiName, List<Field> fields) {
this.key = key;
this.uiName = uiName;
this.fields = new ArrayList<>(fields);
}
public List<String> getFields() {
public List<Field> getFields() {
return fields;
}
@ -30,4 +30,30 @@ public class DialogModel {
", fields=" + fields.size() +
'}';
}
public static class Field {
private final String key;
private final String uiName;
public Field(String key, String uiName) {
this.key = key;
this.uiName = uiName;
}
public String getKey() {
return key;
}
public String getUiName() {
return uiName;
}
@Override
public String toString() {
return "Field{" +
"key='" + key + '\'' +
", uiName='" + uiName + '\'' +
'}';
}
}
}

View File

@ -1,5 +1,7 @@
package com.rusefi.ui.config;
import com.rusefi.config.Field;
import java.io.*;
import java.util.*;
@ -14,7 +16,7 @@ public class IniFileModel {
private final static IniFileModel INSTANCE = new IniFileModel();
private String dialogId;
private String dialogUiName;
private List<String> fields = new ArrayList<>();
private List<DialogModel.Field> fields = new ArrayList<>();
private Map<String, DialogModel> dialogs = new TreeMap<>();
public static void main(String[] args) {
@ -85,12 +87,12 @@ public class IniFileModel {
private void handleField(LinkedList<String> list) {
list.removeFirst(); // "field"
String label = list.isEmpty() ? "" : list.removeFirst();
String uiLabel = list.isEmpty() ? "" : list.removeFirst();
String name = list.isEmpty() ? null : list.removeFirst();
String key = list.isEmpty() ? null : list.removeFirst();
fields.add(label);
System.out.println("Field label=[" + label + "] : name=[" + name + "]");
fields.add(new DialogModel.Field(key, uiLabel));
System.out.println("Field label=[" + uiLabel + "] : key=[" + key + "]");
}
private void handleDialog(LinkedList<String> list) {