mirror of https://github.com/rusefi/rusefi-1.git
REO progress
This commit is contained in:
parent
6c75f48beb
commit
ddc96bbb25
|
@ -3,6 +3,7 @@ package com.rusefi.tune.xml;
|
||||||
import com.opensr5.ConfigurationImage;
|
import com.opensr5.ConfigurationImage;
|
||||||
import com.opensr5.ini.IniFileModel;
|
import com.opensr5.ini.IniFileModel;
|
||||||
import com.opensr5.ini.field.IniField;
|
import com.opensr5.ini.field.IniField;
|
||||||
|
import com.rusefi.config.generated.Fields;
|
||||||
import com.rusefi.ui.storage.PersistentConfiguration;
|
import com.rusefi.ui.storage.PersistentConfiguration;
|
||||||
import com.rusefi.xml.XmlUtil;
|
import com.rusefi.xml.XmlUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
@ -11,6 +12,7 @@ import javax.xml.bind.JAXBException;
|
||||||
import javax.xml.bind.annotation.*;
|
import javax.xml.bind.annotation.*;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
@XmlRootElement
|
@XmlRootElement
|
||||||
public class Msq {
|
public class Msq {
|
||||||
|
@ -25,7 +27,7 @@ public class Msq {
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static Msq toMsq(ConfigurationImage image) {
|
public static Msq valueOf(ConfigurationImage image) {
|
||||||
IniFileModel ini = IniFileModel.getInstance();
|
IniFileModel ini = IniFileModel.getInstance();
|
||||||
Msq tune = new Msq();
|
Msq tune = new Msq();
|
||||||
for (String key : ini.allIniFields.keySet())
|
for (String key : ini.allIniFields.keySet())
|
||||||
|
@ -33,6 +35,25 @@ public class Msq {
|
||||||
return tune;
|
return tune;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ConfigurationImage asImage(IniFileModel instance) {
|
||||||
|
ConfigurationImage ci = new ConfigurationImage(Fields.TOTAL_CONFIG_SIZE);
|
||||||
|
|
||||||
|
for (Constant constant : getPage().constant) {
|
||||||
|
if (constant.getName().startsWith("UNALLOCATED_SPACE")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
IniField field = instance.allIniFields.get(constant.getName());
|
||||||
|
Objects.requireNonNull(field, "Field for " + constant.getName());
|
||||||
|
System.out.println("Setting " + field);
|
||||||
|
field.setValue(ci, constant);
|
||||||
|
}
|
||||||
|
return ci;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Msq readTune(String fileName) throws Exception {
|
||||||
|
return XmlUtil.readModel(Msq.class, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
public void writeXmlFile(String outputXmlFileName) throws JAXBException, IOException {
|
public void writeXmlFile(String outputXmlFileName) throws JAXBException, IOException {
|
||||||
XmlUtil.writeXml(this, Msq.class, outputXmlFileName);
|
XmlUtil.writeXml(this, Msq.class, outputXmlFileName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,9 @@ import java.io.IOException;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
|
||||||
public class XmlUtil {
|
public class XmlUtil {
|
||||||
|
static {
|
||||||
|
XmlUtil.setParserImpl();
|
||||||
|
}
|
||||||
|
|
||||||
public static void writeXml(Object instance, Class<?> modelClass, String fileName) throws JAXBException, IOException {
|
public static void writeXml(Object instance, Class<?> modelClass, String fileName) throws JAXBException, IOException {
|
||||||
JAXBContext jaxbContext = JAXBContext.newInstance(modelClass);
|
JAXBContext jaxbContext = JAXBContext.newInstance(modelClass);
|
||||||
|
@ -37,7 +40,7 @@ public class XmlUtil {
|
||||||
/**
|
/**
|
||||||
* See https://stackoverflow.com/questions/25644023/error-unmarshalling-xml-in-java-8-secure-processing-org-xml-sax-saxnotrecognize
|
* See https://stackoverflow.com/questions/25644023/error-unmarshalling-xml-in-java-8-secure-processing-org-xml-sax-saxnotrecognize
|
||||||
*/
|
*/
|
||||||
public static void setParserImpl() {
|
private static void setParserImpl() {
|
||||||
System.setProperty("org.xml.sax.driver", "com.sun.org.apache.xerces.internal.parsers.SAXParser");
|
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.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
|
||||||
System.setProperty("javax.xml.parsers.SAXParserFactory","com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
|
System.setProperty("javax.xml.parsers.SAXParserFactory","com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
|
||||||
|
|
|
@ -345,7 +345,7 @@ public class BinaryProtocol implements BinaryProtocolCommands {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
ConfigurationImageFile.saveToFile(image, CONFIGURATION_RUSEFI_BINARY);
|
ConfigurationImageFile.saveToFile(image, CONFIGURATION_RUSEFI_BINARY);
|
||||||
Msq tune = Msq.toMsq(image);
|
Msq tune = Msq.valueOf(image);
|
||||||
tune.writeXmlFile(CONFIGURATION_RUSEFI_XML);
|
tune.writeXmlFile(CONFIGURATION_RUSEFI_XML);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Ignoring " + e);
|
System.err.println("Ignoring " + e);
|
||||||
|
|
|
@ -224,7 +224,7 @@ public class ConsoleTools {
|
||||||
ConfigurationImage image = ConfigurationImageFile.readFromFile(inputBinaryFileName);
|
ConfigurationImage image = ConfigurationImageFile.readFromFile(inputBinaryFileName);
|
||||||
System.out.println("Got " + image.getSize() + " of configuration from " + inputBinaryFileName);
|
System.out.println("Got " + image.getSize() + " of configuration from " + inputBinaryFileName);
|
||||||
|
|
||||||
Msq tune = Msq.toMsq(image);
|
Msq tune = Msq.valueOf(image);
|
||||||
tune.writeXmlFile(Msq.outputXmlFileName);
|
tune.writeXmlFile(Msq.outputXmlFileName);
|
||||||
String authToken = AuthTokenPanel.getAuthToken();
|
String authToken = AuthTokenPanel.getAuthToken();
|
||||||
System.out.println("Using " + authToken);
|
System.out.println("Using " + authToken);
|
||||||
|
|
|
@ -25,7 +25,7 @@ public class OnlineTab {
|
||||||
upload.addActionListener(new AbstractAction() {
|
upload.addActionListener(new AbstractAction() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
Msq tune = Msq.toMsq(LinkManager.connector.getBinaryProtocol().getControllerConfiguration());
|
Msq tune = Msq.valueOf(LinkManager.connector.getBinaryProtocol().getControllerConfiguration());
|
||||||
Online.uploadTune(tune, authTokenPanel, content);
|
Online.uploadTune(tune, authTokenPanel, content);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,42 +4,63 @@ import com.opensr5.ConfigurationImage;
|
||||||
import com.opensr5.ini.IniFileModel;
|
import com.opensr5.ini.IniFileModel;
|
||||||
import com.opensr5.ini.field.IniField;
|
import com.opensr5.ini.field.IniField;
|
||||||
import com.opensr5.io.ConfigurationImageFile;
|
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.tune.xml.Msq;
|
||||||
import com.rusefi.xml.XmlUtil;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
import java.nio.file.Files;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* from IDEA this unit test needs to be exectuted with "empty" working directory
|
* from IDEA this unit test needs to be executed with "empty" working directory
|
||||||
*/
|
*/
|
||||||
public class TuneReadWriteTest {
|
public class TuneReadWriteTest {
|
||||||
private static final String PATH = "ui/src/test/resources/frankenso/";
|
private static final String PATH = "ui/src/test/resources/frankenso/";
|
||||||
|
private static final String TEST_INI = PATH + "mainController.ini";
|
||||||
|
private static final String TEST_BINARY_FILE = PATH + "current_configuration.rusefi_binary";
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
IniFileModel.getInstance().readIniFile(TEST_INI);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReadTsTune() throws Exception {
|
public void testCompareBinaryToTSTune() throws Exception {
|
||||||
XmlUtil.setParserImpl();
|
Msq tsTune = Msq.readTune(PATH + "CurrentTune.msq");
|
||||||
|
|
||||||
IniFileModel.getInstance().readIniFile(PATH + "mainController.ini");
|
|
||||||
Msq tsTune = XmlUtil.readModel(Msq.class, PATH + "CurrentTune.msq");
|
|
||||||
System.out.println(tsTune);
|
System.out.println(tsTune);
|
||||||
|
|
||||||
ConfigurationImage tsBinaryData = makeBinaryTune(tsTune, IniFileModel.getInstance());
|
ConfigurationImage tsBinaryData = tsTune.asImage(IniFileModel.getInstance());
|
||||||
|
|
||||||
|
System.out.println("Reading " + TEST_BINARY_FILE);
|
||||||
|
ConfigurationImage fileBinaryData = ConfigurationImageFile.readFromFile(TEST_BINARY_FILE);
|
||||||
|
|
||||||
String binary = PATH + "current_configuration.rusefi_binary";
|
int mismatchCounter = compareImages(tsBinaryData, fileBinaryData);
|
||||||
System.out.println("Reading " + binary);
|
// todo: why one byte mismatch? since it's in floats I kind of do not care, floats are weird
|
||||||
ConfigurationImage fileBinaryData = ConfigurationImageFile.readFromFile(binary);
|
assertEquals(1, mismatchCounter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWriteAndReadTSTune() throws Exception {
|
||||||
|
ConfigurationImage originalBinaryData = ConfigurationImageFile.readFromFile(TEST_BINARY_FILE);
|
||||||
|
|
||||||
byte[] tsBinaryDataContent = tsBinaryData.getContent();
|
String fileName = Files.createTempFile("unit_test_", "xml").getFileName().toString();
|
||||||
byte[] fileBinaryDataContent = fileBinaryData.getContent();
|
|
||||||
|
// writing TS XML tune file with rusEFI code
|
||||||
|
Msq tuneFromBinary = Msq.valueOf(originalBinaryData);
|
||||||
|
tuneFromBinary.writeXmlFile(fileName);
|
||||||
|
|
||||||
|
// and now reading that XML back
|
||||||
|
Msq tuneFromFile = Msq.readTune(fileName);
|
||||||
|
|
||||||
|
ConfigurationImage binaryDataFromXml = tuneFromFile.asImage(IniFileModel.getInstance());
|
||||||
|
|
||||||
|
// assertEquals(0, compareImages(originalBinaryData, binaryDataFromXml));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int compareImages(ConfigurationImage image1, ConfigurationImage image2) {
|
||||||
|
byte[] tsBinaryDataContent = image1.getContent();
|
||||||
|
byte[] fileBinaryDataContent = image2.getContent();
|
||||||
|
|
||||||
int mismatchCounter = 0;
|
int mismatchCounter = 0;
|
||||||
|
|
||||||
|
@ -53,22 +74,6 @@ public class TuneReadWriteTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("Total mismatch count " + mismatchCounter);
|
System.out.println("Total mismatch count " + mismatchCounter);
|
||||||
// todo: why one byte mismatch? since it's in floats I kind of do not care, floats are weird
|
return mismatchCounter;
|
||||||
assertEquals(1, mismatchCounter);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConfigurationImage 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());
|
|
||||||
System.out.println("Setting " + field);
|
|
||||||
field.setValue(ci, constant);
|
|
||||||
}
|
|
||||||
return ci;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue