From b5a637c9392fa6f22841088e0f759dd43ad12af2 Mon Sep 17 00:00:00 2001 From: rusefi Date: Sat, 13 Jun 2020 02:29:42 -0400 Subject: [PATCH] REO progress --- .../com/opensr5/ini/field/EnumIniField.java | 17 +++++++++++- .../src/com/opensr5/ini/field/IniField.java | 5 ++++ .../inifile/src/com/rusefi/xml/XmlUtil.java | 9 +++++++ .../java/com/rusefi/ui/TuneReadWriteTest.java | 27 ++++++++++++++++--- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/java_console/inifile/src/com/opensr5/ini/field/EnumIniField.java b/java_console/inifile/src/com/opensr5/ini/field/EnumIniField.java index 9ce42f10fc..598ae98a37 100644 --- a/java_console/inifile/src/com/opensr5/ini/field/EnumIniField.java +++ b/java_console/inifile/src/com/opensr5/ini/field/EnumIniField.java @@ -2,7 +2,9 @@ package com.opensr5.ini.field; import com.opensr5.ConfigurationImage; import com.rusefi.config.FieldType; +import com.rusefi.tune.xml.Constant; +import javax.management.ObjectName; import java.util.LinkedList; import java.util.List; @@ -46,13 +48,26 @@ public class EnumIniField extends IniField { return enums.get(ordinal); } + private static boolean isQuoted(String q) { + final int len = q.length(); + return (len >= 2 && q.charAt(0) == '"' && q.charAt(len - 1) == '"'); + } + + @Override + public void setValue(ConfigurationImage image, Constant constant) { + String v = constant.getValue(); + int ordinal = enums.indexOf(isQuoted(v) ? ObjectName.unquote(v) : v); + if (ordinal == -1) + throw new IllegalArgumentException("Not found " + v); + } + public static boolean getBit(int ordinal, int bitPosition) { return getBitRange(ordinal, bitPosition, 0) == 1; } public static int getBitRange(int ordinal, int bitPosition, int bitSize) { ordinal = ordinal >> bitPosition; - ordinal = ordinal & ((1 << (bitSize + 1)) - 1); + ordinal = ordinal & ((1 << (bitSize + 1)) - 1); return ordinal; } diff --git a/java_console/inifile/src/com/opensr5/ini/field/IniField.java b/java_console/inifile/src/com/opensr5/ini/field/IniField.java index 02cb6d9320..8e23f1c1fb 100644 --- a/java_console/inifile/src/com/opensr5/ini/field/IniField.java +++ b/java_console/inifile/src/com/opensr5/ini/field/IniField.java @@ -1,6 +1,7 @@ package com.opensr5.ini.field; import com.opensr5.ConfigurationImage; +import com.rusefi.tune.xml.Constant; public class IniField { private final String name; @@ -26,4 +27,8 @@ public class IniField { public String getValue(ConfigurationImage image) { return null; } + + public void setValue(ConfigurationImage image, Constant constant) { +// throw new UnsupportedOperationException("On " + getClass()); + } } diff --git a/java_console/inifile/src/com/rusefi/xml/XmlUtil.java b/java_console/inifile/src/com/rusefi/xml/XmlUtil.java index 8a13b26ac5..a354e225c1 100644 --- a/java_console/inifile/src/com/rusefi/xml/XmlUtil.java +++ b/java_console/inifile/src/com/rusefi/xml/XmlUtil.java @@ -33,4 +33,13 @@ public class XmlUtil { Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); return (T) jaxbUnmarshaller.unmarshal(xmlFile); } + + /** + * See https://stackoverflow.com/questions/25644023/error-unmarshalling-xml-in-java-8-secure-processing-org-xml-sax-saxnotrecognize + */ + public static void setParserImpl() { + System.setProperty("org.xml.sax.driver", "com.sun.org.apache.xerces.internal.parsers.SAXParser"); + System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); + System.setProperty("javax.xml.parsers.SAXParserFactory","com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); + } } diff --git a/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java b/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java index 4db54e2e54..797b6b79af 100644 --- a/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java +++ b/java_console/ui/src/test/java/com/rusefi/ui/TuneReadWriteTest.java @@ -1,12 +1,16 @@ package com.rusefi.ui; +import com.opensr5.ConfigurationImage; import com.opensr5.ini.IniFileModel; +import com.opensr5.ini.field.IniField; import com.opensr5.io.ConfigurationImageFile; +import com.rusefi.config.generated.Fields; +import com.rusefi.tune.xml.Constant; import com.rusefi.tune.xml.Msq; import com.rusefi.xml.XmlUtil; import org.junit.Test; -import java.io.IOException; +import java.util.Objects; /** * from IDEA this unit test needs to be exectuted with "empty" working directory @@ -16,13 +20,30 @@ public class TuneReadWriteTest { @Test public void testReadTsTune() throws Exception { + XmlUtil.setParserImpl(); + IniFileModel.getInstance().readIniFile(PATH + "mainController.ini"); -// Msq tsTune = XmlUtil.readModel(Msq.class, PATH + "CurrentTune.msq"); -// System.out.println(tsTune); + Msq tsTune = XmlUtil.readModel(Msq.class, PATH + "CurrentTune.msq"); + System.out.println(tsTune); + + makeBinaryTune(tsTune, IniFileModel.getInstance()); String binary = PATH + "current_configuration.rusefi_binary"; System.out.println("Reading " + binary); ConfigurationImageFile.readFromFile(binary); } + + private void makeBinaryTune(Msq tsTune, IniFileModel instance) { + ConfigurationImage ci = new ConfigurationImage(Fields.TOTAL_CONFIG_SIZE); + + for (Constant constant : tsTune.getPage().constant) { + if (constant.getName().startsWith("UNALLOCATED_SPACE")) { + continue; + } + IniField field = instance.allIniFields.get(constant.getName()); + Objects.requireNonNull(field, "Field for " + constant.getName()); + field.setValue(ci, constant); + } + } }