From 585268fce468c6fd68e45df0adc5564cd32d6417 Mon Sep 17 00:00:00 2001 From: rusefi Date: Thu, 30 Jul 2020 21:07:50 -0400 Subject: [PATCH] UI to show bytes flow --- .../rusefi/io/serial/AbstractIoStream.java | 4 ++- .../rusefi/io/serial/StreamStatistics.java | 7 ++++ .../proxy/client/LocalApplicationProxy.java | 10 +++--- .../java/com/rusefi/ts_plugin/RemoteTab.java | 36 +++++++++++++++---- .../rusefi/ts_plugin/StreamStatusControl.java | 23 ++++++++++++ 5 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 java_console/io/src/main/java/com/rusefi/io/serial/StreamStatistics.java create mode 100644 java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/StreamStatusControl.java diff --git a/java_console/io/src/main/java/com/rusefi/io/serial/AbstractIoStream.java b/java_console/io/src/main/java/com/rusefi/io/serial/AbstractIoStream.java index c2240afe90..385cea143d 100644 --- a/java_console/io/src/main/java/com/rusefi/io/serial/AbstractIoStream.java +++ b/java_console/io/src/main/java/com/rusefi/io/serial/AbstractIoStream.java @@ -5,7 +5,7 @@ import com.rusefi.io.IoStream; import java.io.IOException; import java.util.concurrent.atomic.AtomicInteger; -public abstract class AbstractIoStream implements IoStream { +public abstract class AbstractIoStream implements IoStream, StreamStatistics { private boolean isClosed; protected StreamStats streamStats = new StreamStats(); @@ -64,10 +64,12 @@ public abstract class AbstractIoStream implements IoStream { } } + @Override public int getBytesIn() { return streamStats.totalBytesArrived.get(); } + @Override public int getBytesOut() { return bytesOut.get(); } diff --git a/java_console/io/src/main/java/com/rusefi/io/serial/StreamStatistics.java b/java_console/io/src/main/java/com/rusefi/io/serial/StreamStatistics.java new file mode 100644 index 0000000000..74a55bafa7 --- /dev/null +++ b/java_console/io/src/main/java/com/rusefi/io/serial/StreamStatistics.java @@ -0,0 +1,7 @@ +package com.rusefi.io.serial; + +public interface StreamStatistics { + int getBytesIn(); + + int getBytesOut(); +} diff --git a/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java index 40839a3e98..ee7e11f27f 100644 --- a/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java +++ b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java @@ -5,6 +5,8 @@ import com.rusefi.NamedThreadFactory; import com.rusefi.io.IoStream; import com.rusefi.io.commands.GetOutputsCommand; import com.rusefi.io.commands.HelloCommand; +import com.rusefi.io.serial.AbstractIoStream; +import com.rusefi.io.serial.StreamStatistics; import com.rusefi.io.tcp.BinaryProtocolProxy; import com.rusefi.io.tcp.ServerSocketReference; import com.rusefi.io.tcp.TcpIoStream; @@ -52,7 +54,7 @@ public class LocalApplicationProxy implements Closeable { if (!version.contains(ProxyClient.BACKEND_VERSION)) throw new IOException("Unexpected backend version " + version + " while we want " + ProxyClient.BACKEND_VERSION); - IoStream authenticatorToProxyStream = new TcpIoStream("authenticatorToProxyStream ", rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, context.serverPortForRemoteApplications()), disconnectListener); + AbstractIoStream authenticatorToProxyStream = new TcpIoStream("authenticatorToProxyStream ", rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, context.serverPortForRemoteApplications()), disconnectListener); LocalApplicationProxy.sendHello(authenticatorToProxyStream, applicationRequest); AtomicInteger relayCommandCounter = new AtomicInteger(); @@ -87,7 +89,7 @@ public class LocalApplicationProxy implements Closeable { ServerSocketReference serverHolder = BinaryProtocolProxy.createProxy(authenticatorToProxyStream, context.authenticatorPort(), relayCommandCounter); LocalApplicationProxy localApplicationProxy = new LocalApplicationProxy(applicationRequest, serverHolder, authenticatorToProxyStream); - connectionListener.onConnected(localApplicationProxy); + connectionListener.onConnected(localApplicationProxy, authenticatorToProxyStream); return serverHolder; } @@ -112,9 +114,9 @@ public class LocalApplicationProxy implements Closeable { } public interface ConnectionListener { - ConnectionListener VOID = localApplicationProxy -> { + ConnectionListener VOID = (localApplicationProxy, authenticatorToProxyStream) -> { }; - void onConnected(LocalApplicationProxy localApplicationProxy); + void onConnected(LocalApplicationProxy localApplicationProxy, StreamStatistics authenticatorToProxyStream); } } diff --git a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java index dc72f0ca29..6bb3c80a72 100644 --- a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java +++ b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java @@ -2,7 +2,9 @@ package com.rusefi.ts_plugin; import com.rusefi.NamedThreadFactory; import com.rusefi.SignatureHelper; +import com.rusefi.Timeouts; import com.rusefi.autoupdate.AutoupdateUtil; +import com.rusefi.io.serial.StreamStatistics; import com.rusefi.io.tcp.ServerSocketReference; import com.rusefi.io.tcp.TcpIoStream; import com.rusefi.proxy.client.LocalApplicationProxy; @@ -20,6 +22,8 @@ import org.putgemin.VerticalFlowLayout; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.IOException; import java.util.List; import java.util.concurrent.Executor; @@ -50,6 +54,8 @@ public class RemoteTab { }; + private StreamStatusControl streamStatusControl = null; + private final JButton disconnect = new JButton("Disconnect"); private final Executor listDownloadExecutor = Executors.newSingleThreadExecutor(new NamedThreadFactory("online list downloader")); @@ -67,6 +73,15 @@ public class RemoteTab { }); + Timer timer = new Timer(Timeouts.SECOND, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (streamStatusControl != null) + streamStatusControl.update(); + } + }); + timer.start(); + JTextField applicationPort = new JTextField() { @Override public Dimension getPreferredSize() { @@ -101,7 +116,7 @@ public class RemoteTab { if (currentState == null) { requestListDownload(); } else { - setConnectedStatus(currentState.getApplicationRequest().getTargetUser()); + setConnectedStatus(currentState.getApplicationRequest().getTargetUser(), null); } } @@ -172,12 +187,12 @@ public class RemoteTab { RemoteTabController.INSTANCE.setState(RemoteTabController.State.CONNECTING); setStatus("Connecting to " + publicSession.getUserDetails().getUserName()); - LocalApplicationProxy.ConnectionListener connectionListener = localApplicationProxy -> { + LocalApplicationProxy.ConnectionListener connectionListener = (localApplicationProxy, authenticatorToProxyStream) -> { RemoteTabController.INSTANCE.setConnected(localApplicationProxy); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - setConnectedStatus(publicSession.getUserDetails()); + setConnectedStatus(publicSession.getUserDetails(), authenticatorToProxyStream); } }); }; @@ -187,17 +202,24 @@ public class RemoteTab { }, "Authenticator").start(); } - private void setConnectedStatus(UserDetails userDetails) { + private void setConnectedStatus(UserDetails userDetails, StreamStatistics authenticatorToProxyStream) { + if (authenticatorToProxyStream != null) { + streamStatusControl = new StreamStatusControl(authenticatorToProxyStream); + } + setStatus("Connected to " + userDetails.getUserName(), new JLabel("You can now connect your TunerStudio to IP address localhost and port " + getLocalPort()), - disconnect); + disconnect, streamStatusControl == null ? null : streamStatusControl.getContent()); } private void setStatus(String text, JComponent... extra) { list.removeAll(); list.add(new JLabel(text)); - for (JComponent component : extra) - list.add(component); + for (JComponent component : extra) { + if (component != null) { + list.add(component); + } + } AutoupdateUtil.trueLayout(list); } diff --git a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/StreamStatusControl.java b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/StreamStatusControl.java new file mode 100644 index 0000000000..06d4b478c2 --- /dev/null +++ b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/StreamStatusControl.java @@ -0,0 +1,23 @@ +package com.rusefi.ts_plugin; + +import com.rusefi.io.serial.StreamStatistics; + +import javax.swing.*; + +public class StreamStatusControl { + private final StreamStatistics authenticatorToProxyStream; + + private final JLabel content = new JLabel(); + + public StreamStatusControl(StreamStatistics statistics) { + this.authenticatorToProxyStream = statistics; + } + + public void update() { + content.setText("In " + authenticatorToProxyStream.getBytesIn() + " Out " + authenticatorToProxyStream.getBytesOut()); + } + + public JComponent getContent() { + return content; + } +}