From 11ce2df3405053c773b3e8e29176824835a771eb Mon Sep 17 00:00:00 2001 From: rusefi Date: Thu, 4 Jun 2020 23:32:52 -0400 Subject: [PATCH] TS plugin progress --- java_console/build.xml | 2 +- .../inifile/src/com/rusefi/tune/xml/Msq.java | 4 ++- .../src/com/rusefi/ui/storage/Node.java | 0 .../ui/storage/PersistentConfiguration.java | 20 +++++++++-- java_console/shared_ui/shared_ui.iml | 2 ++ .../src/com/rusefi/tools/online/Online.java | 25 ++++++++++++++ .../src/com/rusefi/ui/AuthTokenPanel.java | 23 +++++++++---- java_console/ui/src/com/rusefi/Launcher.java | 2 ++ .../ui/src/com/rusefi/ui/OnlineTab.java | 20 +---------- .../ts_plugin/.idea/libraries/httpclient.xml | 14 ++++++++ java_tools/ts_plugin/build.xml | 9 ++--- java_tools/ts_plugin/lib/commons-logging.jar | Bin 0 -> 61829 bytes .../ts_plugin/src/com/rusefi/TsPlugin.java | 31 +++++++++++------- 13 files changed, 108 insertions(+), 44 deletions(-) rename java_console/{shared_ui => inifile}/src/com/rusefi/ui/storage/Node.java (100%) rename java_console/{shared_ui => inifile}/src/com/rusefi/ui/storage/PersistentConfiguration.java (74%) rename java_console/{ui => shared_ui}/src/com/rusefi/tools/online/Online.java (58%) create mode 100644 java_tools/ts_plugin/.idea/libraries/httpclient.xml create mode 100644 java_tools/ts_plugin/lib/commons-logging.jar diff --git a/java_console/build.xml b/java_console/build.xml index 9b1d0115b4..598a3d5063 100644 --- a/java_console/build.xml +++ b/java_console/build.xml @@ -13,7 +13,7 @@ + classpath="../java_tools/configuration_definition/lib/snakeyaml.jar:lib/jaxb-api.jar:lib/httpclient.jar:lib/httpmime.jar:lib/httpcore.jar:lib/jSerialComm.jar:lib/jcip-annotations-1.0.jar:lib/jlatexmath-1.0.6.jar:lib/swing-layout-1.0.jar:lib/jep.jar:lib/log4j.jar:lib/junit.jar:lib/jssc.jar:lib/SteelSeries-3.9.30.jar:lib/annotations.jar:lib/miglayout-4.0.jar:lib/surfaceplotter-2.0.1.jar"> diff --git a/java_console/inifile/src/com/rusefi/tune/xml/Msq.java b/java_console/inifile/src/com/rusefi/tune/xml/Msq.java index df432bedf3..b477355d4c 100644 --- a/java_console/inifile/src/com/rusefi/tune/xml/Msq.java +++ b/java_console/inifile/src/com/rusefi/tune/xml/Msq.java @@ -3,6 +3,7 @@ package com.rusefi.tune.xml; import com.opensr5.ConfigurationImage; import com.opensr5.ini.IniFileModel; import com.opensr5.ini.field.IniField; +import com.rusefi.ui.storage.PersistentConfiguration; import com.rusefi.xml.XmlUtil; import org.jetbrains.annotations.NotNull; @@ -10,11 +11,12 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.File; import java.io.IOException; @XmlRootElement public class Msq { - public static final String outputXmlFileName = "output.msq"; + public static final String outputXmlFileName = PersistentConfiguration.RUSEFI_SETTINGS_FOLDER + File.separator + "output.msq"; private final Page page = new Page(); diff --git a/java_console/shared_ui/src/com/rusefi/ui/storage/Node.java b/java_console/inifile/src/com/rusefi/ui/storage/Node.java similarity index 100% rename from java_console/shared_ui/src/com/rusefi/ui/storage/Node.java rename to java_console/inifile/src/com/rusefi/ui/storage/Node.java diff --git a/java_console/shared_ui/src/com/rusefi/ui/storage/PersistentConfiguration.java b/java_console/inifile/src/com/rusefi/ui/storage/PersistentConfiguration.java similarity index 74% rename from java_console/shared_ui/src/com/rusefi/ui/storage/PersistentConfiguration.java rename to java_console/inifile/src/com/rusefi/ui/storage/PersistentConfiguration.java index 18debeb3eb..73ad2e6a8b 100644 --- a/java_console/shared_ui/src/com/rusefi/ui/storage/PersistentConfiguration.java +++ b/java_console/inifile/src/com/rusefi/ui/storage/PersistentConfiguration.java @@ -9,7 +9,8 @@ import java.util.Map; public class PersistentConfiguration { private static final PersistentConfiguration INSTANCE = new PersistentConfiguration(); - private static final String RUSEFI_SETTINGS_FOLDER = System.getProperty("user.home") + File.separator + ".rusEFI"; + public static final String RUSEFI_SETTINGS_FOLDER = System.getProperty("user.home") + File.separator + ".rusEFI"; + private static boolean hookRegistered; static { new File(RUSEFI_SETTINGS_FOLDER).mkdirs(); @@ -25,7 +26,22 @@ public class PersistentConfiguration { } private PersistentConfiguration() { - Runtime.getRuntime().addShutdownHook(new Thread(() -> getConfig().save())); + registerShutdownHook(); + } + + /** + * Does not work under TS plugin looks like TS does a violent System.exit? + */ + public static synchronized void registerShutdownHook() { + if (hookRegistered) { + hookRegistered = true; + return; + } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + System.out.println("Shutdown hook..."); + getConfig().save(); + System.out.println("Shutdown hook!"); + })); } @SuppressWarnings("unchecked") diff --git a/java_console/shared_ui/shared_ui.iml b/java_console/shared_ui/shared_ui.iml index c17054b4e6..c51500b928 100644 --- a/java_console/shared_ui/shared_ui.iml +++ b/java_console/shared_ui/shared_ui.iml @@ -8,5 +8,7 @@ + + \ No newline at end of file diff --git a/java_console/ui/src/com/rusefi/tools/online/Online.java b/java_console/shared_ui/src/com/rusefi/tools/online/Online.java similarity index 58% rename from java_console/ui/src/com/rusefi/tools/online/Online.java rename to java_console/shared_ui/src/com/rusefi/tools/online/Online.java index fb4477f90a..869ed72a6b 100644 --- a/java_console/ui/src/com/rusefi/tools/online/Online.java +++ b/java_console/shared_ui/src/com/rusefi/tools/online/Online.java @@ -1,5 +1,7 @@ package com.rusefi.tools.online; +import com.rusefi.tune.xml.Msq; +import com.rusefi.ui.AuthTokenPanel; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -10,8 +12,12 @@ import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; +import javax.swing.*; +import javax.xml.bind.JAXBException; import java.io.*; +import static com.rusefi.ui.AuthTokenPanel.TOKEN_WARNING; + public class Online { private static final String url = "https://rusefi.com/online/upload.php"; @@ -34,4 +40,23 @@ public class Online { System.out.println(responseString); } + + public static void uploadTune(Msq tune, AuthTokenPanel authTokenPanel, JComponent parent) { + String authToken = authTokenPanel.getToken(); + if (authToken.contains(TOKEN_WARNING)) { + JOptionPane.showMessageDialog(parent, "Does not work without auth token"); + return; + } + new Thread(() -> doUpload(authToken, tune)).start(); + } + + private static void doUpload(String authToken, Msq tune) { + try { + tune.writeXmlFile(Msq.outputXmlFileName); + // todo: network upload should not happen on UI thread + upload(new File(Msq.outputXmlFileName), authToken); + } catch (JAXBException | IOException ex) { + throw new IllegalStateException(ex); + } + } } diff --git a/java_console/shared_ui/src/com/rusefi/ui/AuthTokenPanel.java b/java_console/shared_ui/src/com/rusefi/ui/AuthTokenPanel.java index 9abc83b6ce..9fbc176460 100644 --- a/java_console/shared_ui/src/com/rusefi/ui/AuthTokenPanel.java +++ b/java_console/shared_ui/src/com/rusefi/ui/AuthTokenPanel.java @@ -1,5 +1,9 @@ package com.rusefi.ui; +import com.rusefi.ui.storage.PersistentConfiguration; +import com.rusefi.ui.util.URLLabel; +import org.jetbrains.annotations.NotNull; + import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; @@ -9,6 +13,7 @@ import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; public class AuthTokenPanel { public static final String TOKEN_WARNING = "Please copy token from your forum profile"; public static final String AUTH_TOKEN = "auth_token"; + private static final String TOKEN_PROFILE_URL = "https://rusefi.com/forum/ucp.php?i=254"; private JPanel content = new JPanel(new FlowLayout(FlowLayout.LEFT)); private JTextField textField = new JTextField(); @@ -16,24 +21,30 @@ public class AuthTokenPanel { public AuthTokenPanel() { textField.setPreferredSize(new Dimension(200, 24)); - String authToken = getConfig().getRoot().getProperty(AUTH_TOKEN); - if (authToken.trim().isEmpty()) - authToken = TOKEN_WARNING; - - textField.setText(authToken); + String authToken = getAuthToken(); JButton save = new JButton("Save"); save.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { getConfig().getRoot().setProperty(AUTH_TOKEN, textField.getText()); + PersistentConfiguration.getConfig().save(); } }); - content.add(textField); content.add(save); + if (authToken.trim().isEmpty()) { + authToken = TOKEN_WARNING; + content.add(new URLLabel("Get it here", TOKEN_PROFILE_URL)); + } + textField.setText(authToken); + } + + @NotNull + public static String getAuthToken() { + return getConfig().getRoot().getProperty(AUTH_TOKEN); } public JPanel getContent() { diff --git a/java_console/ui/src/com/rusefi/Launcher.java b/java_console/ui/src/com/rusefi/Launcher.java index 8498075a31..0ac9cf07de 100644 --- a/java_console/ui/src/com/rusefi/Launcher.java +++ b/java_console/ui/src/com/rusefi/Launcher.java @@ -16,6 +16,7 @@ import com.rusefi.ui.console.MainFrame; import com.rusefi.ui.console.TabbedPanel; import com.rusefi.ui.engine.EngineSnifferPanel; import com.rusefi.ui.logview.LogViewer; +import com.rusefi.ui.storage.PersistentConfiguration; import com.rusefi.ui.util.DefaultExceptionHandler; import com.rusefi.ui.util.JustOneInstance; import jssc.SerialPortList; @@ -185,6 +186,7 @@ public class Launcher extends rusEFIVersion { System.out.println("rusEfi UI console " + CONSOLE_VERSION); System.out.println("Compiled " + new Date(ConsoleTools.classBuildTimeMillis())); System.out.println("\n\n"); + PersistentConfiguration.registerShutdownHook(); if (ConsoleTools.runTool(args)) { return; diff --git a/java_console/ui/src/com/rusefi/ui/OnlineTab.java b/java_console/ui/src/com/rusefi/ui/OnlineTab.java index 801ca8ddb9..c6ffb15bd9 100644 --- a/java_console/ui/src/com/rusefi/ui/OnlineTab.java +++ b/java_console/ui/src/com/rusefi/ui/OnlineTab.java @@ -7,15 +7,8 @@ import com.rusefi.ui.util.Misc; import org.putgemin.VerticalFlowLayout; import javax.swing.*; -import javax.xml.bind.JAXBException; -import java.awt.*; import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; - -import static com.rusefi.ui.AuthTokenPanel.TOKEN_WARNING; -import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; public class OnlineTab { @@ -32,19 +25,8 @@ public class OnlineTab { upload.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - String text = authTokenPanel.getToken(); - if (text.contains(TOKEN_WARNING)) { - JOptionPane.showMessageDialog(content, "Does not work without auth token"); - return; - } Msq tune = Msq.toMsq(LinkManager.connector.getBinaryProtocol().getControllerConfiguration()); - try { - tune.writeXmlFile(Msq.outputXmlFileName); - // todo: network upload should not happen on UI thread - Online.upload(new File(Msq.outputXmlFileName), text); - } catch (JAXBException | IOException ex) { - throw new IllegalStateException(ex); - } + Online.uploadTune(tune, authTokenPanel, content); } }); content.add(upload); diff --git a/java_tools/ts_plugin/.idea/libraries/httpclient.xml b/java_tools/ts_plugin/.idea/libraries/httpclient.xml new file mode 100644 index 0000000000..3fedad0411 --- /dev/null +++ b/java_tools/ts_plugin/.idea/libraries/httpclient.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java_tools/ts_plugin/build.xml b/java_tools/ts_plugin/build.xml index 2f46d63709..826491418e 100644 --- a/java_tools/ts_plugin/build.xml +++ b/java_tools/ts_plugin/build.xml @@ -12,7 +12,7 @@ @@ -31,7 +31,6 @@ - @@ -42,10 +41,12 @@ - + - + + + \ No newline at end of file diff --git a/java_tools/ts_plugin/lib/commons-logging.jar b/java_tools/ts_plugin/lib/commons-logging.jar new file mode 100644 index 0000000000000000000000000000000000000000..93a3b9f6db406c84e270e19b9a5e70f2e27ca513 GIT binary patch literal 61829 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

?Qscg)P&$+povC*M;449{4wvf+Lu`*i$g8 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

6R?CS7jP_?OetFBKT#*D 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 Sa`OQ?z*ER31cwkn0N{V*NK-8U literal 0 HcmV?d00001 diff --git a/java_tools/ts_plugin/src/com/rusefi/TsPlugin.java b/java_tools/ts_plugin/src/com/rusefi/TsPlugin.java index f3bb7024af..6c62a8f324 100644 --- a/java_tools/ts_plugin/src/com/rusefi/TsPlugin.java +++ b/java_tools/ts_plugin/src/com/rusefi/TsPlugin.java @@ -5,6 +5,7 @@ import com.efiAnalytics.plugin.ecu.ControllerAccess; import com.efiAnalytics.plugin.ecu.ControllerException; import com.efiAnalytics.plugin.ecu.ControllerParameter; import com.efiAnalytics.plugin.ecu.servers.ControllerParameterServer; +import com.rusefi.tools.online.Online; import com.rusefi.tune.xml.Constant; import com.rusefi.tune.xml.Msq; import com.rusefi.ui.AuthTokenPanel; @@ -14,10 +15,8 @@ import org.putgemin.VerticalFlowLayout; import javax.swing.*; import javax.xml.bind.JAXBException; -import java.io.File; +import java.awt.event.ActionEvent; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; /** * by the way TS installs stuff into %user%\.efianalytics\TunerStudio\plugins folder @@ -26,9 +25,22 @@ public class TsPlugin implements ApplicationPlugin { private ControllerAccess controllerAccess; private final JPanel content = new JPanel(new VerticalFlowLayout()); + private final AuthTokenPanel tokenPanel = new AuthTokenPanel(); + public TsPlugin() { + content.add(new JLabel("" + rusEFIVersion.CONSOLE_VERSION)); content.add(Misc.getRusEFI_online_manual()); - content.add(new AuthTokenPanel().getContent()); + content.add(tokenPanel.getContent()); + + JButton upload = new JButton("Upload"); + upload.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Msq tune = writeCurrentTune(controllerAccess); + Online.uploadTune(tune, tokenPanel, content); + } + }); + content.add(upload); } @Override @@ -55,11 +67,9 @@ public class TsPlugin implements ApplicationPlugin { public void initialize(ControllerAccess controllerAccess) { this.controllerAccess = controllerAccess; printEcuConfigurationNames(controllerAccess); - - uploadCurrentTune(controllerAccess); } - private static String uploadCurrentTune(ControllerAccess controllerAccess) { + private static Msq writeCurrentTune(ControllerAccess controllerAccess) { Msq msq = new Msq(); String configurationName = getConfigurationName(); ControllerParameterServer controllerParameterServer = controllerAccess.getControllerParameterServer(); @@ -89,10 +99,9 @@ public class TsPlugin implements ApplicationPlugin { msq.getPage().constant.add(new Constant(parameterName, cp.getUnits(), value)); } - Path tempDirWithPrefix = Files.createTempDirectory("rusefi_ts_plugin"); - String fileName = tempDirWithPrefix + File.separator + "plugin.xml"; + String fileName = Msq.outputXmlFileName; msq.writeXmlFile(fileName); - return fileName; + return msq; } catch (JAXBException | IOException | ControllerException e) { System.out.println("Error writing XML: " + e); return null; @@ -158,7 +167,7 @@ public class TsPlugin implements ApplicationPlugin { @Override public String getVersion() { - return "0.00000001"; + return Integer.toString(rusEFIVersion.CONSOLE_VERSION); } @Override