diff --git a/java_console/.gitignore b/java_console/.gitignore index 1b13cb9418..fb75628849 100644 --- a/java_console/.gitignore +++ b/java_console/.gitignore @@ -2,6 +2,7 @@ logs/ rusefi_console_properties.xml output.c currenttune.msq +output.msq rusefi.ini openocd DfuSe diff --git a/java_console/inifile/src/com/opensr5/ini/IniFileModel.java b/java_console/inifile/src/com/opensr5/ini/IniFileModel.java index 244e2357bf..63a9478a2a 100644 --- a/java_console/inifile/src/com/opensr5/ini/IniFileModel.java +++ b/java_console/inifile/src/com/opensr5/ini/IniFileModel.java @@ -1,9 +1,6 @@ package com.opensr5.ini; -import com.opensr5.ini.field.ArrayIniField; -import com.opensr5.ini.field.EnumIniField; -import com.opensr5.ini.field.IniField; -import com.opensr5.ini.field.ScalarIniField; +import com.opensr5.ini.field.*; import org.jetbrains.annotations.Nullable; import java.io.*; @@ -141,6 +138,7 @@ public class IniFileModel { if (list.get(1).equals(FIELD_TYPE_SCALAR)) { registerField(ScalarIniField.parse(list)); } else if (list.get(1).equals(FIELD_TYPE_STRING)) { + registerField(StringIniField.parse(list)); } else if (list.get(1).equals(FIELD_TYPE_ARRAY)) { registerField(ArrayIniField.parse(list)); } else if (list.get(1).equals(FIELD_TYPE_BITS)) { diff --git a/java_console/inifile/src/com/opensr5/ini/field/StringIniField.java b/java_console/inifile/src/com/opensr5/ini/field/StringIniField.java new file mode 100644 index 0000000000..aa872a1c8c --- /dev/null +++ b/java_console/inifile/src/com/opensr5/ini/field/StringIniField.java @@ -0,0 +1,30 @@ +package com.opensr5.ini.field; + +import com.opensr5.ConfigurationImage; + +import java.util.LinkedList; + +public class StringIniField extends IniField { + private final int size; + + public StringIniField(String name, int offset, int size) { + super(name, offset); + this.size = size; + } + + @Override + public String getValue(ConfigurationImage image) { + String value = new String(image.getContent(), getOffset(), size); + value = value.trim(); + return value; + } + + public static IniField parse(LinkedList list) { + String name = list.get(0); + int offset = Integer.parseInt(list.get(3)); + if (!list.get(2).equalsIgnoreCase("ASCII")) + throw new IllegalStateException("Do not understand " + name + " at " + offset); + int size = Integer.parseInt(list.get(4)); + return new StringIniField(name, offset, size); + } +} diff --git a/java_console/ui/src/com/rusefi/tools/ConsoleTools.java b/java_console/ui/src/com/rusefi/tools/ConsoleTools.java index e3f79b0a77..5b5a06d8b4 100644 --- a/java_console/ui/src/com/rusefi/tools/ConsoleTools.java +++ b/java_console/ui/src/com/rusefi/tools/ConsoleTools.java @@ -15,12 +15,14 @@ import com.rusefi.io.IoStream; import com.rusefi.io.LinkManager; import com.rusefi.io.serial.SerialIoStreamJSerialComm; import com.rusefi.maintenance.ExecHelper; +import com.rusefi.tools.online.Online; import com.rusefi.tune.xml.Constant; import com.rusefi.tune.xml.Msq; import com.rusefi.xml.XmlUtil; import org.jetbrains.annotations.Nullable; import javax.xml.bind.JAXBException; +import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Map; @@ -208,9 +210,9 @@ public class ConsoleTools { System.err.println("Binary file input expected"); System.exit(-1); } - String fileName = args[1]; - ConfigurationImage image = ConfigurationImageFile.readFromFile(fileName); - System.out.println("Got " + image.getSize() + " of configuration from " + fileName); + String inputBinaryFileName = args[1]; + ConfigurationImage image = ConfigurationImageFile.readFromFile(inputBinaryFileName); + System.out.println("Got " + image.getSize() + " of configuration from " + inputBinaryFileName); IniFileModel ini = IniFileModel.getInstance(Launcher.INI_FILE_PATH); @@ -219,8 +221,9 @@ public class ConsoleTools { // handle(tune, ini, "injector_battLagCorrBins"); - - XmlUtil.writeXml(tune, Msq.class, "a.msq"); + String outputXmlFile = "output.msq"; + XmlUtil.writeXml(tune, Msq.class, outputXmlFile); + Online.upload(new File(outputXmlFile), "x"); } private static void handle(Msq tune, IniFileModel ini, String key, ConfigurationImage image) { diff --git a/java_console/ui/src/com/rusefi/tools/online/Online.java b/java_console/ui/src/com/rusefi/tools/online/Online.java new file mode 100644 index 0000000000..0e9b49b9fb --- /dev/null +++ b/java_console/ui/src/com/rusefi/tools/online/Online.java @@ -0,0 +1,52 @@ +package com.rusefi.tools.online; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; + +public class Online { + static final String charset = "UTF-8"; + static final String url = "https://rusefi.com/online/upload.php"; + static String CRLF = "\r\n"; // Line separator required by multipart/form-data. + + public static void upload(File xmlFile, String authTokenValue) throws IOException { + String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value. + + URLConnection connection = new URL(url).openConnection(); + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); + + try ( + OutputStream output = connection.getOutputStream(); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true); + ) { + sendParameter(boundary, writer, "auth_token", authTokenValue); + + // Send text file. + writer.append("--" + boundary).append(CRLF); + writer.append("Content-Disposition: form-data; name=\"textFile\"; filename=\"" + xmlFile.getName() + "\"").append(CRLF); + writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); // Text file itself must be saved in this charset! + writer.append(CRLF).flush(); + Files.copy(xmlFile.toPath(), output); + output.flush(); // Important before continuing with writer! + writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary. + + // End of multipart/form-data. + writer.append("--" + boundary + "--").append(CRLF).flush(); + } + + + int responseCode = ((HttpURLConnection) connection).getResponseCode(); + System.out.println(responseCode); // Should be 200 + } + + private static void sendParameter(String boundary, PrintWriter writer, String parameterName, String value) { + // Send normal param. + writer.append("--" + boundary).append(CRLF); + writer.append("Content-Disposition: form-data; name=\"" + parameterName +"\"").append(CRLF); + writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); + writer.append(CRLF).append(value).append(CRLF).flush(); + } +} diff --git a/java_console/ui/src/com/rusefi/tune/xml/Msq.java b/java_console/ui/src/com/rusefi/tune/xml/Msq.java index 21971b1c7c..5284f17629 100644 --- a/java_console/ui/src/com/rusefi/tune/xml/Msq.java +++ b/java_console/ui/src/com/rusefi/tune/xml/Msq.java @@ -8,6 +8,12 @@ import javax.xml.bind.annotation.XmlRootElement; public class Msq { private final Page page = new Page(); + private final VersionInfo versionInfo; + + public Msq() { + versionInfo = new VersionInfo("rusEFI+2020"); + } + @XmlAttribute public String getXmlns() { return "http://www.msefi.com/:msq"; @@ -20,7 +26,7 @@ public class Msq { @XmlElement public VersionInfo getVersionInfo() { - return new VersionInfo(); + return versionInfo; } @XmlElement diff --git a/java_console/ui/src/com/rusefi/tune/xml/VersionInfo.java b/java_console/ui/src/com/rusefi/tune/xml/VersionInfo.java index 9da3ddcb5f..b7477f641a 100644 --- a/java_console/ui/src/com/rusefi/tune/xml/VersionInfo.java +++ b/java_console/ui/src/com/rusefi/tune/xml/VersionInfo.java @@ -5,6 +5,12 @@ import com.rusefi.config.generated.Fields; import javax.xml.bind.annotation.XmlAttribute; public class VersionInfo { + private final String firmwareInfo; + + public VersionInfo(String firmwareInfo) { + this.firmwareInfo = firmwareInfo; + } + @XmlAttribute public String getVersion() { return "5.0"; @@ -12,7 +18,7 @@ public class VersionInfo { @XmlAttribute public String getFirmwareInfo() { - return "rusEFI+v20200513%4022811"; + return firmwareInfo; } @XmlAttribute