From 78a244f25efdcb13a28e12df727ed4dcb23cfa22 Mon Sep 17 00:00:00 2001 From: rusefi Date: Sun, 16 Aug 2020 00:17:31 -0400 Subject: [PATCH] usability --- .../src/main/java/com/rusefi/app/rusEFI.java | 3 +- .../com/rusefi/proxy/NetworkConnector.java | 43 +++++++++++++------ .../com/rusefi/server/SessionDetails.java | 17 ++++++-- .../src/test/java/com/rusefi/TestHelper.java | 3 +- .../rusefi/tools/NetworkConnectorStartup.java | 3 +- .../test/java/com/rusefi/FullServerTest.java | 5 ++- .../rusefi/proxy/NetworkConnectorTest.java | 2 +- .../main/java/com/rusefi/server/Backend.java | 1 + .../com/rusefi/server/SessionDetailsTest.java | 5 ++- .../com/rusefi/ts_plugin/BroadcastTab.java | 2 +- 10 files changed, 58 insertions(+), 26 deletions(-) diff --git a/android/app/src/main/java/com/rusefi/app/rusEFI.java b/android/app/src/main/java/com/rusefi/app/rusEFI.java index ca0f5632eb..f484a7f20b 100644 --- a/android/app/src/main/java/com/rusefi/app/rusEFI.java +++ b/android/app/src/main/java/com/rusefi/app/rusEFI.java @@ -244,7 +244,8 @@ public class rusEFI extends Activity { mResultView.post(() -> mResultView.append("On connection established\n")); NetworkConnectorContext context = new NetworkConnectorContext(); - new NetworkConnector().start(getAuthToken(), context, new NetworkConnector.ReconnectListener() { + new NetworkConnector().start(NetworkConnector.Implementation.Android, + getAuthToken(), context, new NetworkConnector.ReconnectListener() { @Override public void onReconnect() { diff --git a/java_console/io/src/main/java/com/rusefi/proxy/NetworkConnector.java b/java_console/io/src/main/java/com/rusefi/proxy/NetworkConnector.java index 7cc9e13a80..2045e8e849 100644 --- a/java_console/io/src/main/java/com/rusefi/proxy/NetworkConnector.java +++ b/java_console/io/src/main/java/com/rusefi/proxy/NetworkConnector.java @@ -39,11 +39,11 @@ public class NetworkConnector implements Closeable { private final static Logging log = Logging.getLogging(NetworkConnector.class); private boolean isClosed; - public NetworkConnectorResult start(String authToken, String controllerPort, NetworkConnectorContext context) { - return start(authToken, controllerPort, context, ReconnectListener.VOID); + public NetworkConnectorResult start(Implementation implementation, String authToken, String controllerPort, NetworkConnectorContext context) { + return start(implementation, authToken, controllerPort, context, ReconnectListener.VOID); } - public NetworkConnectorResult start(String authToken, String controllerPort, NetworkConnectorContext context, ReconnectListener reconnectListener) { + public NetworkConnectorResult start(Implementation implementation, String authToken, String controllerPort, NetworkConnectorContext context, ReconnectListener reconnectListener) { LinkManager controllerConnector = new LinkManager() .setCompositeLogicEnabled(false) .setNeedPullData(false); @@ -67,10 +67,10 @@ public class NetworkConnector implements Closeable { return NetworkConnectorResult.ERROR; } - return start(authToken, context, reconnectListener, controllerConnector); + return start(implementation, authToken, context, reconnectListener, controllerConnector); } - public NetworkConnectorResult start(String authToken, NetworkConnectorContext context, ReconnectListener reconnectListener, LinkManager linkManager) { + public NetworkConnectorResult start(Implementation implementation, String authToken, NetworkConnectorContext context, ReconnectListener reconnectListener, LinkManager linkManager) { ControllerInfo controllerInfo; try { controllerInfo = getControllerInfo(linkManager, linkManager.getConnector().getBinaryProtocol().getStream()); @@ -87,13 +87,14 @@ public class NetworkConnector implements Closeable { proxyReconnectSemaphore.acquire(); try { - start(context.serverPortForControllers(), linkManager, authToken, (String message) -> { - log.error(message + " Disconnect from proxy server detected, now sleeping " + context.reconnectDelay() + " seconds"); - sleep(context.reconnectDelay() * Timeouts.SECOND); - log.debug("Releasing semaphore"); - proxyReconnectSemaphore.release(); - reconnectListener.onReconnect(); - }, vehicleToken, controllerInfo, context); + start(implementation, + context.serverPortForControllers(), linkManager, authToken, (String message) -> { + log.error(message + " Disconnect from proxy server detected, now sleeping " + context.reconnectDelay() + " seconds"); + sleep(context.reconnectDelay() * Timeouts.SECOND); + log.debug("Releasing semaphore"); + proxyReconnectSemaphore.release(); + reconnectListener.onReconnect(); + }, vehicleToken, controllerInfo, context); } catch (IOException e) { log.error("IO error", e); } @@ -107,10 +108,10 @@ public class NetworkConnector implements Closeable { } @NotNull - private static SessionDetails start(int serverPortForControllers, LinkManager linkManager, String authToken, final TcpIoStream.DisconnectListener disconnectListener, int oneTimeToken, ControllerInfo controllerInfo, final NetworkConnectorContext context) throws IOException { + private static SessionDetails start(Implementation implementation, int serverPortForControllers, LinkManager linkManager, String authToken, final TcpIoStream.DisconnectListener disconnectListener, int oneTimeToken, ControllerInfo controllerInfo, final NetworkConnectorContext context) throws IOException { IoStream targetEcuSocket = linkManager.getConnector().getBinaryProtocol().getStream(); - SessionDetails deviceSessionDetails = new SessionDetails(controllerInfo, authToken, oneTimeToken, rusEFIVersion.CONSOLE_VERSION); + SessionDetails deviceSessionDetails = new SessionDetails(implementation, controllerInfo, authToken, oneTimeToken, rusEFIVersion.CONSOLE_VERSION); Socket socket; try { @@ -201,4 +202,18 @@ public class NetworkConnector implements Closeable { void onReconnect(); } + public enum Implementation { + Android, + Plugin, + SBC, + Unknown; + + public static Implementation find(String name) { + for (Implementation implementation : values()) { + if (implementation.name().equalsIgnoreCase(name)) + return implementation; + } + return Unknown; + } + } } diff --git a/java_console/io/src/main/java/com/rusefi/server/SessionDetails.java b/java_console/io/src/main/java/com/rusefi/server/SessionDetails.java index 591c4aae5f..c3d07b8e4d 100644 --- a/java_console/io/src/main/java/com/rusefi/server/SessionDetails.java +++ b/java_console/io/src/main/java/com/rusefi/server/SessionDetails.java @@ -1,5 +1,6 @@ package com.rusefi.server; +import com.rusefi.proxy.NetworkConnector; import com.rusefi.tools.online.HttpUtil; import org.json.simple.JSONObject; @@ -13,6 +14,8 @@ public class SessionDetails { public static final String VEHICLE_TOKEN = "vehicleToken"; public static final String AUTH_TOKEN = "authToken"; public static final String CONNECTOR_VERSION = "connectorVersion"; + public static final String IMPLEMENTATION = "implementation"; + private static final String CONTROLLER = "controller"; private static final String HARDCODED_ONE_TIME_CODE = System.getProperty("ONE_TIME_CODE"); @@ -20,9 +23,11 @@ public class SessionDetails { private final int vehicleToken; private final String authToken; + private final NetworkConnector.Implementation implementation; private final int consoleVersion; - public SessionDetails(ControllerInfo controllerInfo, String authToken, int oneTimeCode, int consoleVersion) { + public SessionDetails(NetworkConnector.Implementation implementation, ControllerInfo controllerInfo, String authToken, int oneTimeCode, int consoleVersion) { + this.implementation = Objects.requireNonNull(implementation); this.consoleVersion = consoleVersion; Objects.requireNonNull(controllerInfo); Objects.requireNonNull(authToken); @@ -35,6 +40,10 @@ public class SessionDetails { return HARDCODED_ONE_TIME_CODE == null ? new Random().nextInt(100000) : Integer.parseInt(HARDCODED_ONE_TIME_CODE); } + public NetworkConnector.Implementation getImplementation() { + return implementation; + } + public int getOneTimeToken() { return vehicleToken; } @@ -57,6 +66,7 @@ public class SessionDetails { jsonObject.put(VEHICLE_TOKEN, vehicleToken); jsonObject.put(AUTH_TOKEN, authToken); jsonObject.put(CONNECTOR_VERSION, consoleVersion); + jsonObject.put(IMPLEMENTATION, implementation.name()); return jsonObject.toJSONString(); } @@ -66,10 +76,11 @@ public class SessionDetails { String authToken = (String) jsonObject.get(AUTH_TOKEN); long oneTimeCode = (Long)jsonObject.get(VEHICLE_TOKEN); long connectorVersion = (long) jsonObject.get(CONNECTOR_VERSION); + NetworkConnector.Implementation implementation = NetworkConnector.Implementation.find((String) jsonObject.get(IMPLEMENTATION)); - ControllerInfo controllerInfo = ControllerInfo.valueOf((String) jsonObject.get(CONTROLLER)); + ControllerInfo controllerInfo = ControllerInfo.valueOf((String) jsonObject.get(CONTROLLER)); - return new SessionDetails(controllerInfo, authToken, (int) oneTimeCode, (int) connectorVersion); + return new SessionDetails(implementation, controllerInfo, authToken, (int) oneTimeCode, (int) connectorVersion); } @Override diff --git a/java_console/io/src/test/java/com/rusefi/TestHelper.java b/java_console/io/src/test/java/com/rusefi/TestHelper.java index 198751ff36..3b65c18833 100644 --- a/java_console/io/src/test/java/com/rusefi/TestHelper.java +++ b/java_console/io/src/test/java/com/rusefi/TestHelper.java @@ -11,6 +11,7 @@ import com.rusefi.io.LinkConnector; import com.rusefi.io.LinkManager; import com.rusefi.io.tcp.BinaryProtocolServer; import com.rusefi.io.tcp.TcpIoStream; +import com.rusefi.proxy.NetworkConnector; import com.rusefi.server.ControllerInfo; import com.rusefi.server.SessionDetails; import com.rusefi.server.rusEFISSLContext; @@ -99,7 +100,7 @@ public class TestHelper { public static SessionDetails createTestSession(String authToken, String signature) { ControllerInfo ci = new ControllerInfo("vehicle", "make", "code", signature); - return new SessionDetails(ci, authToken, SessionDetails.createOneTimeCode(), rusEFIVersion.CONSOLE_VERSION); + return new SessionDetails(NetworkConnector.Implementation.Unknown, ci, authToken, SessionDetails.createOneTimeCode(), rusEFIVersion.CONSOLE_VERSION); } public static void assertLatch(String message, CountDownLatch reconnectCounter) throws InterruptedException { diff --git a/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java b/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java index c98b29f468..91dec800ca 100644 --- a/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java +++ b/java_console/ui/src/main/java/com/rusefi/tools/NetworkConnectorStartup.java @@ -24,7 +24,8 @@ public class NetworkConnectorStartup { NetworkConnectorContext connectorContext = new NetworkConnectorContext(); - NetworkConnector.NetworkConnectorResult networkConnectorResult = new NetworkConnector().start(authToken, autoDetectedPort, connectorContext); + NetworkConnector.NetworkConnectorResult networkConnectorResult = new NetworkConnector().start(NetworkConnector.Implementation.SBC, + authToken, autoDetectedPort, connectorContext); log.info("Running with oneTimeToken=" + networkConnectorResult.getOneTimeToken()); } } diff --git a/java_console/ui/src/test/java/com/rusefi/FullServerTest.java b/java_console/ui/src/test/java/com/rusefi/FullServerTest.java index e602e846d2..252409267f 100644 --- a/java_console/ui/src/test/java/com/rusefi/FullServerTest.java +++ b/java_console/ui/src/test/java/com/rusefi/FullServerTest.java @@ -110,12 +110,13 @@ public class FullServerTest { }; // start "rusEFI network connector" to connect controller with backend since in real life controller has only local serial port it does not have network - NetworkConnector.NetworkConnectorResult networkConnectorResult = networkConnector.start(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, networkConnectorContext, NetworkConnector.ReconnectListener.VOID); + NetworkConnector.NetworkConnectorResult networkConnectorResult = networkConnector.start(NetworkConnector.Implementation.Unknown, + TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, networkConnectorContext, NetworkConnector.ReconnectListener.VOID); ControllerInfo controllerInfo = networkConnectorResult.getControllerInfo(); TestHelper.assertLatch("controllerRegistered", controllerRegistered); - SessionDetails authenticatorSessionDetails = new SessionDetails(controllerInfo, TEST_TOKEN_3, networkConnectorResult.getOneTimeToken(), rusEFIVersion.CONSOLE_VERSION); + SessionDetails authenticatorSessionDetails = new SessionDetails(NetworkConnector.Implementation.Unknown, controllerInfo, TEST_TOKEN_3, networkConnectorResult.getOneTimeToken(), rusEFIVersion.CONSOLE_VERSION); ApplicationRequest applicationRequest = new ApplicationRequest(authenticatorSessionDetails, userDetailsResolver.apply(TestHelper.TEST_TOKEN_1)); // start authenticator diff --git a/java_console/ui/src/test/java/com/rusefi/proxy/NetworkConnectorTest.java b/java_console/ui/src/test/java/com/rusefi/proxy/NetworkConnectorTest.java index 3555bf8dd0..573edd7a59 100644 --- a/java_console/ui/src/test/java/com/rusefi/proxy/NetworkConnectorTest.java +++ b/java_console/ui/src/test/java/com/rusefi/proxy/NetworkConnectorTest.java @@ -76,7 +76,7 @@ public class NetworkConnectorTest { } }; NetworkConnector networkConnector = new NetworkConnector(); - networkConnector.start(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, connectorContext, reconnectListener); + networkConnector.start(NetworkConnector.Implementation.Unknown, TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, connectorContext, reconnectListener); assertLatch(reconnectCounter); diff --git a/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java b/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java index dcf9ee59bc..4e2ccc4fb5 100644 --- a/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java +++ b/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java @@ -317,6 +317,7 @@ public class Backend implements Closeable { .add(ControllerInfo.VEHICLE_NAME, controllerInfo.getVehicleName()) .add(ControllerInfo.ENGINE_MAKE, controllerInfo.getEngineMake()) .add(ControllerInfo.ENGINE_CODE, controllerInfo.getEngineCode()) + .add(SessionDetails.IMPLEMENTATION, sessionDetails.getImplementation().name()) .add(SessionDetails.CONNECTOR_VERSION, sessionDetails.getConsoleVersion()); objectBuilder = addStreamStats(objectBuilder, client.getStream()); if (owner != null) { diff --git a/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java b/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java index bd1939b80a..c7f48d8705 100644 --- a/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java +++ b/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java @@ -1,6 +1,7 @@ package com.rusefi.server; import com.rusefi.TestHelper; +import com.rusefi.proxy.NetworkConnector; import com.rusefi.rusEFIVersion; import org.junit.Test; @@ -10,7 +11,7 @@ public class SessionDetailsTest { @Test public void testSerialization() { - SessionDetails sd = new SessionDetails(TestHelper.CONTROLLER_INFO, "auth", 123, rusEFIVersion.CONSOLE_VERSION); + SessionDetails sd = new SessionDetails(NetworkConnector.Implementation.Unknown, TestHelper.CONTROLLER_INFO, "auth", 123, rusEFIVersion.CONSOLE_VERSION); String json = sd.toJson(); SessionDetails fromJson = SessionDetails.valueOf(json); @@ -19,7 +20,7 @@ public class SessionDetailsTest { @Test public void testApplicationRequest() { - SessionDetails sd = new SessionDetails(TestHelper.CONTROLLER_INFO, "auth", 123, rusEFIVersion.CONSOLE_VERSION); + SessionDetails sd = new SessionDetails(NetworkConnector.Implementation.Unknown, TestHelper.CONTROLLER_INFO, "auth", 123, rusEFIVersion.CONSOLE_VERSION); ApplicationRequest ar = new ApplicationRequest(sd, new UserDetails("", 321)); String json = ar.toJson(); diff --git a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/BroadcastTab.java b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/BroadcastTab.java index 7aed73e71c..a56e28c77e 100644 --- a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/BroadcastTab.java +++ b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/BroadcastTab.java @@ -113,7 +113,7 @@ public class BroadcastTab { new Thread(() -> { networkConnector = new NetworkConnector(); - NetworkConnector.NetworkConnectorResult networkConnectorResult = networkConnector.start(authToken, autoDetectedPort, connectorContext); + NetworkConnector.NetworkConnectorResult networkConnectorResult = networkConnector.start(NetworkConnector.Implementation.Plugin, authToken, autoDetectedPort, connectorContext); SwingUtilities.invokeLater(() -> status.setText("One time password to connect to this ECU: " + networkConnectorResult.getOneTimeToken()));