From db62eb21d34fd4148ab9418b1131c0314b5dd2ad Mon Sep 17 00:00:00 2001 From: rusefi Date: Sat, 16 May 2020 23:49:20 -0400 Subject: [PATCH] XML tune export progress --- .../src/com/opensr5/ConfigurationImage.java | 0 .../src/com/opensr5/ini/IniFileModel.java | 14 ++++- .../com/opensr5/ini/field/BitIniField.java | 35 ++++++++++++ .../src/com/opensr5/ini/field/IniField.java | 29 ++++++++++ .../com/opensr5/ini/field/ScalarIniField.java | 43 +++++++++++++++ .../opensr5/ini/test/IniFileReaderTest.java | 2 +- .../src/com/rusefi/config/Field.java | 48 ---------------- .../src/com/rusefi/config/FieldType.java | 17 ++++++ .../src/com/rusefi/core/Pair.java | 0 .../rusefi/config/FieldCommandResponse.java | 55 +++++++++++++++++++ .../src/com/rusefi/config/test/FieldTest.java | 7 ++- .../ui/src/com/rusefi/tools/ConsoleTools.java | 19 ++++--- .../ui/src/com/rusefi/tune/xml/Constant.java | 11 +++- .../com/rusefi/ui/config/BitConfigField.java | 3 +- .../src/com/rusefi/ui/config/ConfigField.java | 5 +- .../com/rusefi/ui/config/EnumConfigField.java | 5 +- 16 files changed, 226 insertions(+), 67 deletions(-) rename java_console/{opensr5 => inifile}/src/com/opensr5/ConfigurationImage.java (100%) create mode 100644 java_console/inifile/src/com/opensr5/ini/field/BitIniField.java create mode 100644 java_console/inifile/src/com/opensr5/ini/field/IniField.java create mode 100644 java_console/inifile/src/com/opensr5/ini/field/ScalarIniField.java rename java_console/{models => inifile}/src/com/rusefi/config/Field.java (71%) rename java_console/{models => inifile}/src/com/rusefi/config/FieldType.java (68%) rename java_console/{models => inifile}/src/com/rusefi/core/Pair.java (100%) create mode 100644 java_console/models/src/com/rusefi/config/FieldCommandResponse.java diff --git a/java_console/opensr5/src/com/opensr5/ConfigurationImage.java b/java_console/inifile/src/com/opensr5/ConfigurationImage.java similarity index 100% rename from java_console/opensr5/src/com/opensr5/ConfigurationImage.java rename to java_console/inifile/src/com/opensr5/ConfigurationImage.java diff --git a/java_console/inifile/src/com/opensr5/ini/IniFileModel.java b/java_console/inifile/src/com/opensr5/ini/IniFileModel.java index 0304652832..7c5d827328 100644 --- a/java_console/inifile/src/com/opensr5/ini/IniFileModel.java +++ b/java_console/inifile/src/com/opensr5/ini/IniFileModel.java @@ -1,5 +1,8 @@ package com.opensr5.ini; +import com.opensr5.ini.field.BitIniField; +import com.opensr5.ini.field.IniField; +import com.opensr5.ini.field.ScalarIniField; import org.jetbrains.annotations.Nullable; import java.io.*; @@ -25,6 +28,7 @@ public class IniFileModel { private Map allFields = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); // this is only used while reading model - TODO extract reader private List fieldsOfCurrentDialog = new ArrayList<>(); + public Map allIniFields = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); public Map tooltips = new TreeMap<>(); @@ -134,17 +138,23 @@ public class IniFileModel { private void handleFieldDefinition(LinkedList list) { if (list.get(1).equals(FIELD_TYPE_SCALAR)) { - + ScalarIniField field = ScalarIniField.parse(list); + registerField(field); } else if (list.get(1).equals(FIELD_TYPE_STRING)) { } else if (list.get(1).equals(FIELD_TYPE_ARRAY)) { } else if (list.get(1).equals(FIELD_TYPE_BITS)) { - + BitIniField field = BitIniField.parse(list); + registerField(field); } else { throw new IllegalStateException("Unexpected " + list); } } + private void registerField(IniField field) { + allIniFields.put(field.getName(), field); + } + private void handleField(LinkedList list) { list.removeFirst(); // "field" diff --git a/java_console/inifile/src/com/opensr5/ini/field/BitIniField.java b/java_console/inifile/src/com/opensr5/ini/field/BitIniField.java new file mode 100644 index 0000000000..d72011b759 --- /dev/null +++ b/java_console/inifile/src/com/opensr5/ini/field/BitIniField.java @@ -0,0 +1,35 @@ +package com.opensr5.ini.field; + +import com.rusefi.config.FieldType; + +import java.util.LinkedList; +import java.util.List; + +public class BitIniField extends IniField { + private final FieldType type; + private final List enums; + + public BitIniField(String name, int offset, FieldType type, List enums) { + super(name, offset); + this.type = type; + this.enums = enums; + } + + public FieldType getType() { + return type; + } + + public List getEnums() { + return enums; + } + + public static BitIniField parse(LinkedList list) { + String name = list.get(0); + FieldType type = FieldType.parseTs(list.get(2)); + int offset = Integer.parseInt(list.get(3)); + + List enums = list.subList(5, list.size() - 1); + + return new BitIniField(name, offset, type, enums); + } +} diff --git a/java_console/inifile/src/com/opensr5/ini/field/IniField.java b/java_console/inifile/src/com/opensr5/ini/field/IniField.java new file mode 100644 index 0000000000..02cb6d9320 --- /dev/null +++ b/java_console/inifile/src/com/opensr5/ini/field/IniField.java @@ -0,0 +1,29 @@ +package com.opensr5.ini.field; + +import com.opensr5.ConfigurationImage; + +public class IniField { + private final String name; + private final int offset; + + public IniField(String name, int offset) { + this.name = name; + this.offset = offset; + } + + public String getName() { + return name; + } + + public String getUnits() { + return null; + } + + public int getOffset() { + return offset; + } + + public String getValue(ConfigurationImage image) { + return null; + } +} diff --git a/java_console/inifile/src/com/opensr5/ini/field/ScalarIniField.java b/java_console/inifile/src/com/opensr5/ini/field/ScalarIniField.java new file mode 100644 index 0000000000..b17cbb07c4 --- /dev/null +++ b/java_console/inifile/src/com/opensr5/ini/field/ScalarIniField.java @@ -0,0 +1,43 @@ +package com.opensr5.ini.field; + +import com.opensr5.ConfigurationImage; +import com.rusefi.config.Field; +import com.rusefi.config.FieldType; + +import java.util.LinkedList; + +public class ScalarIniField extends IniField { + private final String unit; + private final FieldType type; + + public ScalarIniField(String name, int offset, String unit, FieldType type) { + super(name, offset); + this.unit = unit; + this.type = type; + } + + @Override + public String getUnits() { + return unit; + } + + public FieldType getType() { + return type; + } + + @Override + public String getValue(ConfigurationImage image) { + Field f = new Field(getName(), getOffset(), getType()); + return f.getValue(image).toString(); + } + + public static ScalarIniField parse(LinkedList list) { + String name = list.get(0); + FieldType type = FieldType.parseTs(list.get(2)); + int offset = Integer.parseInt(list.get(3)); + + String unit = list.get(4); + + return new ScalarIniField(name, offset, unit, type); + } +} diff --git a/java_console/inifile/src/com/opensr5/ini/test/IniFileReaderTest.java b/java_console/inifile/src/com/opensr5/ini/test/IniFileReaderTest.java index aca56d903b..2a2a81c186 100644 --- a/java_console/inifile/src/com/opensr5/ini/test/IniFileReaderTest.java +++ b/java_console/inifile/src/com/opensr5/ini/test/IniFileReaderTest.java @@ -96,7 +96,7 @@ public class IniFileReaderTest { RawIniFile lines = IniFileReader.read(new ByteArrayInputStream(string.getBytes())); IniFileModel model = new IniFileModel().readIniFile(lines); - assertEquals(0, model.getAllFields().size()); + assertEquals(2, model.allIniFields.size()); } diff --git a/java_console/models/src/com/rusefi/config/Field.java b/java_console/inifile/src/com/rusefi/config/Field.java similarity index 71% rename from java_console/models/src/com/rusefi/config/Field.java rename to java_console/inifile/src/com/rusefi/config/Field.java index eca0f4f4ca..90c4190aa2 100644 --- a/java_console/models/src/com/rusefi/config/Field.java +++ b/java_console/inifile/src/com/rusefi/config/Field.java @@ -1,8 +1,6 @@ package com.rusefi.config; import com.opensr5.ConfigurationImage; -import com.rusefi.config.generated.Fields; -import com.rusefi.core.Pair; import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; @@ -15,9 +13,6 @@ import static com.rusefi.config.FieldType.*; */ public class Field { - private static final String BIT_VALUE_PREFIX = "bit" + Fields.CONSOLE_DATA_PROTOCOL_TAG; - private static final String INT_VALUE_PREFIX = INT_TYPE_STRING + Fields.CONSOLE_DATA_PROTOCOL_TAG; - private static final String FLOAT_VALUE_PREFIX = FLOAT_TYPE_STRING + Fields.CONSOLE_DATA_PROTOCOL_TAG; public static final int NO_BIT_OFFSET = -1; private static final int FIELD_PRECISION = 3; @@ -125,49 +120,6 @@ public class Field { return type; } - public static boolean isIntValueMessage(String message) { - return message.startsWith(INT_VALUE_PREFIX) || message.startsWith(BYTE_TYPE_STRING) || message.startsWith(SHORT_TYPE_STRING); - } - - public static boolean isBitValueMessage(String message) { - return message.startsWith(BIT_VALUE_PREFIX); - } - - public static boolean isFloatValueMessage(String message) { - return message.startsWith(FLOAT_VALUE_PREFIX); - } - - public static Pair parseResponse(String message) { - try { - int atPosition = message.indexOf(Fields.CONSOLE_DATA_PROTOCOL_TAG); - if (atPosition == -1) - return null; - String firstToken = message.substring(0, atPosition); - if (firstToken.equals(INT_TYPE_STRING) || firstToken.equals(BYTE_TYPE_STRING) || firstToken.equals(SHORT_TYPE_STRING)) { - message = message.substring(atPosition + Fields.CONSOLE_DATA_PROTOCOL_TAG.length()); - String[] a = message.split(" is "); - if (a.length != 2) - return null; - int index = Integer.parseInt(a[0]); - int value = Integer.parseInt(a[1]); - return new Pair<>(index, value); - } - if (isFloatValueMessage(message)) { - message = message.substring(FLOAT_VALUE_PREFIX.length()); - String[] a = message.split(" is "); - if (a.length != 2) - return null; - int index = Integer.parseInt(a[0]); - double value = Double.parseDouble(a[1]); - return new Pair<>(index, value); - } - return null; - } catch (NumberFormatException e) { - return null; - } - - } - @Override public String toString() { return "Field{" + diff --git a/java_console/models/src/com/rusefi/config/FieldType.java b/java_console/inifile/src/com/rusefi/config/FieldType.java similarity index 68% rename from java_console/models/src/com/rusefi/config/FieldType.java rename to java_console/inifile/src/com/rusefi/config/FieldType.java index cbcf4f11a4..4c7630e53e 100644 --- a/java_console/models/src/com/rusefi/config/FieldType.java +++ b/java_console/inifile/src/com/rusefi/config/FieldType.java @@ -13,6 +13,7 @@ public enum FieldType { BIT(/*bits are stored in 4 byte packs */4), FLOAT(4); + // todo: this is used for text protocol parsing - constant should be reused between firmware and console public static final String INT_TYPE_STRING = "int"; public static final String FLOAT_TYPE_STRING = "float"; public static final String BYTE_TYPE_STRING = "byte"; @@ -44,6 +45,22 @@ public enum FieldType { } } + public static FieldType parseTs(String type) { + if (type.equalsIgnoreCase("f32")) + return FLOAT; + if (type.equalsIgnoreCase("s32") || type.equalsIgnoreCase("u32")) + return INT; + if (type.equalsIgnoreCase("s16")) + return INT16; + if (type.equalsIgnoreCase("u16")) + return UINT16; + if (type.equalsIgnoreCase("s08")) + return INT8; + if (type.equalsIgnoreCase("u08")) + return UINT8; + throw new IllegalStateException(type); + } + public String getLoadCommand() { return "get_" + getTypeForCommand(); } diff --git a/java_console/models/src/com/rusefi/core/Pair.java b/java_console/inifile/src/com/rusefi/core/Pair.java similarity index 100% rename from java_console/models/src/com/rusefi/core/Pair.java rename to java_console/inifile/src/com/rusefi/core/Pair.java diff --git a/java_console/models/src/com/rusefi/config/FieldCommandResponse.java b/java_console/models/src/com/rusefi/config/FieldCommandResponse.java new file mode 100644 index 0000000000..837b3069b8 --- /dev/null +++ b/java_console/models/src/com/rusefi/config/FieldCommandResponse.java @@ -0,0 +1,55 @@ +package com.rusefi.config; + +import com.rusefi.config.generated.Fields; +import com.rusefi.core.Pair; + +import static com.rusefi.config.FieldType.*; + +public class FieldCommandResponse { + private static final String BIT_VALUE_PREFIX = "bit" + Fields.CONSOLE_DATA_PROTOCOL_TAG; + private static final String INT_VALUE_PREFIX = INT_TYPE_STRING + Fields.CONSOLE_DATA_PROTOCOL_TAG; + private static final String FLOAT_VALUE_PREFIX = FLOAT_TYPE_STRING + Fields.CONSOLE_DATA_PROTOCOL_TAG; + + public static Pair parseResponse(String message) { + try { + int atPosition = message.indexOf(Fields.CONSOLE_DATA_PROTOCOL_TAG); + if (atPosition == -1) + return null; + String firstToken = message.substring(0, atPosition); + if (firstToken.equals(INT_TYPE_STRING) || firstToken.equals(BYTE_TYPE_STRING) || firstToken.equals(SHORT_TYPE_STRING)) { + message = message.substring(atPosition + Fields.CONSOLE_DATA_PROTOCOL_TAG.length()); + String[] a = message.split(" is "); + if (a.length != 2) + return null; + int index = Integer.parseInt(a[0]); + int value = Integer.parseInt(a[1]); + return new Pair<>(index, value); + } + if (isFloatValueMessage(message)) { + message = message.substring(FLOAT_VALUE_PREFIX.length()); + String[] a = message.split(" is "); + if (a.length != 2) + return null; + int index = Integer.parseInt(a[0]); + double value = Double.parseDouble(a[1]); + return new Pair<>(index, value); + } + return null; + } catch (NumberFormatException e) { + return null; + } + + } + + public static boolean isIntValueMessage(String message) { + return message.startsWith(INT_VALUE_PREFIX) || message.startsWith(BYTE_TYPE_STRING) || message.startsWith(SHORT_TYPE_STRING); + } + + public static boolean isBitValueMessage(String message) { + return message.startsWith(BIT_VALUE_PREFIX); + } + + public static boolean isFloatValueMessage(String message) { + return message.startsWith(FLOAT_VALUE_PREFIX); + } +} diff --git a/java_console/models/src/com/rusefi/config/test/FieldTest.java b/java_console/models/src/com/rusefi/config/test/FieldTest.java index 8943f6b31a..70d5952834 100644 --- a/java_console/models/src/com/rusefi/config/test/FieldTest.java +++ b/java_console/models/src/com/rusefi/config/test/FieldTest.java @@ -1,6 +1,7 @@ package com.rusefi.config.test; import com.rusefi.config.Field; +import com.rusefi.config.FieldCommandResponse; import com.rusefi.core.Pair; import org.junit.Test; @@ -12,16 +13,16 @@ public class FieldTest { @Test public void testParse() { { - assertNull(Field.parseResponse("notint @768 is 21")); + assertNull(FieldCommandResponse.parseResponse("notint @768 is 21")); } { - Pair p = Field.parseResponse("int @768 is 21"); + Pair p = FieldCommandResponse.parseResponse("int @768 is 21"); assertNotNull(p); assertEquals(new Integer(768), p.first); assertEquals(21, p.second); } { - Pair p = Field.parseResponse("float @808 is 1.00"); + Pair p = FieldCommandResponse.parseResponse("float @808 is 1.00"); assertNotNull(p); assertEquals(new Integer(808), p.first); assertEquals(1.0, p.second); diff --git a/java_console/ui/src/com/rusefi/tools/ConsoleTools.java b/java_console/ui/src/com/rusefi/tools/ConsoleTools.java index d6448a49a9..27d0d831ab 100644 --- a/java_console/ui/src/com/rusefi/tools/ConsoleTools.java +++ b/java_console/ui/src/com/rusefi/tools/ConsoleTools.java @@ -2,8 +2,8 @@ package com.rusefi.tools; import com.fathzer.soft.javaluator.DoubleEvaluator; import com.opensr5.ConfigurationImage; -import com.opensr5.ini.DialogModel; import com.opensr5.ini.IniFileModel; +import com.opensr5.ini.field.IniField; import com.opensr5.io.ConfigurationImageFile; import com.rusefi.*; import com.rusefi.autodetect.PortDetector; @@ -214,20 +214,25 @@ public class ConsoleTools { IniFileModel ini = IniFileModel.getInstance(Launcher.INI_FILE_PATH); - handle(tune, ini, "tpsMin"); + handle(tune, ini, "tpsMin", image); + handle(tune, ini, "tpsMax", image); + handle(tune, ini, "primingSquirtDurationMs", image); // handle(tune, ini, "injector_battLagCorrBins"); XmlUtil.writeXml(tune, Msq.class, "a.xml"); } - private static void handle(Msq tune, IniFileModel ini, String key) { - DialogModel.Field field = ini.getField(key); - tune.getPage().constants.add(prepareConstant(field)); + private static void handle(Msq tune, IniFileModel ini, String key, ConfigurationImage image) { + IniField field = ini.allIniFields.get(key); + tune.getPage().constants.add(prepareConstant(field, image)); } - private static Constant prepareConstant(DialogModel.Field field) { - return new Constant(field.getKey(), null); + private static Constant prepareConstant(IniField field, ConfigurationImage image) { + + String value = field.getValue(image); + + return new Constant(field.getName(), field.getUnits(), value); } interface ConsoleTool { diff --git a/java_console/ui/src/com/rusefi/tune/xml/Constant.java b/java_console/ui/src/com/rusefi/tune/xml/Constant.java index 97ebb34204..cd10a1bd2a 100644 --- a/java_console/ui/src/com/rusefi/tune/xml/Constant.java +++ b/java_console/ui/src/com/rusefi/tune/xml/Constant.java @@ -1,14 +1,17 @@ package com.rusefi.tune.xml; import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlValue; public class Constant { private final String name; private final String units; + private final String value; - public Constant(String name, String units) { + public Constant(String name, String units, String value) { this.name = name; this.units = units; + this.value = value; } @XmlAttribute @@ -20,4 +23,10 @@ public class Constant { public String getUnits() { return units; } + + @XmlValue + public String getValue() { + return value; + } + } diff --git a/java_console/ui/src/com/rusefi/ui/config/BitConfigField.java b/java_console/ui/src/com/rusefi/ui/config/BitConfigField.java index 76c9b19676..a711bc89a2 100644 --- a/java_console/ui/src/com/rusefi/ui/config/BitConfigField.java +++ b/java_console/ui/src/com/rusefi/ui/config/BitConfigField.java @@ -2,6 +2,7 @@ package com.rusefi.ui.config; import com.opensr5.ConfigurationImage; import com.rusefi.config.Field; +import com.rusefi.config.FieldCommandResponse; import com.rusefi.config.generated.Fields; import com.rusefi.core.MessagesCentral; @@ -21,7 +22,7 @@ public class BitConfigField extends BaseConfigField { MessagesCentral.getInstance().addListener(new MessagesCentral.MessageListener() { @Override public void onMessage(Class clazz, String message) { - if (Field.isBitValueMessage(message)) { + if (FieldCommandResponse.isBitValueMessage(message)) { String expectedPrefix = "bit" + Fields.CONSOLE_DATA_PROTOCOL_TAG + field.getOffset() + "/" + field.getBitOffset() + " is "; if (message.startsWith(expectedPrefix) && message.length() == expectedPrefix.length() + 1) { diff --git a/java_console/ui/src/com/rusefi/ui/config/ConfigField.java b/java_console/ui/src/com/rusefi/ui/config/ConfigField.java index f3a60c9c2d..cb12cab272 100644 --- a/java_console/ui/src/com/rusefi/ui/config/ConfigField.java +++ b/java_console/ui/src/com/rusefi/ui/config/ConfigField.java @@ -2,6 +2,7 @@ package com.rusefi.ui.config; import com.opensr5.ConfigurationImage; import com.rusefi.config.Field; +import com.rusefi.config.FieldCommandResponse; import com.rusefi.core.MessagesCentral; import com.rusefi.core.Pair; import com.rusefi.ui.util.JTextFieldWithWidth; @@ -24,8 +25,8 @@ public class ConfigField extends BaseConfigField { MessagesCentral.getInstance().addListener(new MessagesCentral.MessageListener() { @Override public void onMessage(Class clazz, String message) { - if (Field.isIntValueMessage(message) || Field.isFloatValueMessage(message)) { - Pair p = Field.parseResponse(message); + if (FieldCommandResponse.isIntValueMessage(message) || FieldCommandResponse.isFloatValueMessage(message)) { + Pair p = FieldCommandResponse.parseResponse(message); if (p != null && p.first == field.getOffset()) { Object value = p.second; setValue(value); diff --git a/java_console/ui/src/com/rusefi/ui/config/EnumConfigField.java b/java_console/ui/src/com/rusefi/ui/config/EnumConfigField.java index 399855e347..d58abb22ac 100644 --- a/java_console/ui/src/com/rusefi/ui/config/EnumConfigField.java +++ b/java_console/ui/src/com/rusefi/ui/config/EnumConfigField.java @@ -2,6 +2,7 @@ package com.rusefi.ui.config; import com.opensr5.ConfigurationImage; import com.rusefi.config.Field; +import com.rusefi.config.FieldCommandResponse; import com.rusefi.config.FieldType; import com.rusefi.core.MessagesCentral; import com.rusefi.core.Pair; @@ -37,8 +38,8 @@ public class EnumConfigField extends BaseConfigField { MessagesCentral.getInstance().addListener(new MessagesCentral.MessageListener() { @Override public void onMessage(Class clazz, String message) { - if (Field.isIntValueMessage(message)) { - Pair p = Field.parseResponse(message); + if (FieldCommandResponse.isIntValueMessage(message)) { + Pair p = FieldCommandResponse.parseResponse(message); if (p != null && p.first == field.getOffset()) { int ordinal = (Integer) p.second; setValue(ordinal);