diff --git a/java_console/.idea/libraries/jssc.xml b/java_console/.idea/libraries/jssc.xml index bff9d4bff1..339f96efde 100644 --- a/java_console/.idea/libraries/jssc.xml +++ b/java_console/.idea/libraries/jssc.xml @@ -5,7 +5,7 @@ - + \ No newline at end of file diff --git a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java index 727df0908d..45d1e19153 100644 --- a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java +++ b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java @@ -38,6 +38,7 @@ public class BinaryProtocol { // todo: fix this, this is HORRIBLE! @Deprecated public static BinaryProtocol instance; + public boolean isClosed; public BinaryProtocol(final Logger logger, SerialPort serialPort) { this.logger = logger; @@ -67,6 +68,10 @@ public class BinaryProtocol { } } + public Logger getLogger() { + return logger; + } + public void switchToBinaryProtocol() { long start = System.currentTimeMillis(); @@ -189,6 +194,9 @@ public class BinaryProtocol { int offset = 0; while (offset < image.getSize()) { + if (isClosed) + return; + int remainingSize = image.getSize() - offset; int requestSize = Math.min(remainingSize, BLOCKING_FACTOR); @@ -201,7 +209,7 @@ public class BinaryProtocol { byte[] response = exchange(packet); if (!checkResponseCode(response, RESPONSE_OK) || response.length != requestSize + 1) { - logger.error("Something is wrong, retrying..."); + logger.error("readImage: Something is wrong, retrying..."); continue; } @@ -214,13 +222,22 @@ public class BinaryProtocol { setController(image); } + /** + * Blocking sending binary packet and waiting for a response + * + * @return null in case of IO issues + */ public byte[] exchange(byte[] packet) { dropPending(); try { sendCrcPacket(packet); return receivePacket(); - } catch (SerialPortException | InterruptedException | EOFException e) { + } catch (InterruptedException e) { throw new IllegalStateException(e); + } catch (SerialPortException | EOFException e) { + logger.error("exchange failed: " + e); + isClosed = true; + return null; } } @@ -244,7 +261,7 @@ public class BinaryProtocol { while (true) { byte[] response = exchange(packet); if (!checkResponseCode(response, RESPONSE_OK) || response.length != 1) { - logger.error("Something is wrong, retrying..."); + logger.error("writeData: Something is wrong, retrying..."); continue; } break; @@ -257,6 +274,8 @@ public class BinaryProtocol { logger.info("Need to burn"); while (true) { + if (isClosed) + return; byte[] response = exchange(new byte[]{'B'}); if (!checkResponseCode(response, RESPONSE_BURN_OK) || response.length != 1) { continue; @@ -275,6 +294,8 @@ public class BinaryProtocol { public ConfigurationImage getController() { synchronized (lock) { + if (controller == null) + return null; return controller.clone(); } } @@ -287,7 +308,7 @@ public class BinaryProtocol { synchronized (cbb) { while (cbb.length() < count) { int timeout = (int) (start + TIMEOUT - System.currentTimeMillis()); - if (timeout < 0) { + if (timeout <= 0) { return true; // timeout. Sad face. } cbb.wait(timeout); @@ -343,6 +364,8 @@ public class BinaryProtocol { } public String requestText() { + if (isClosed) + return null; try { byte[] response = new byte[0]; response = exchange(new byte[]{'G'}); diff --git a/java_console/io/src/com/rusefi/io/serial/PortHolder.java b/java_console/io/src/com/rusefi/io/serial/PortHolder.java index c7ec1d5b6f..bf66ba6a37 100644 --- a/java_console/io/src/com/rusefi/io/serial/PortHolder.java +++ b/java_console/io/src/com/rusefi/io/serial/PortHolder.java @@ -26,6 +26,7 @@ public class PortHolder { private static final int BAUD_RATE = 115200; private static final int SECOND = 1000; private static final int MINUTE = 60 * SECOND; + private static final int COMMAND_TIMEOUT_SEC = 10; // seconds private static PortHolder instance = new PortHolder(); private final Object portLock = new Object(); @@ -81,17 +82,20 @@ public class PortHolder { bp.switchToBinaryProtocol(); bp.readImage(BinaryProtocol.IMAGE_SIZE); + if (bp.isClosed) + return false; Runnable textPull = new Runnable() { @Override public void run() { - while (true) { + while (!bp.isClosed) { if (LinkManager.COMMUNICATION_QUEUE.isEmpty()) { LinkManager.COMMUNICATION_EXECUTOR.submit(new Runnable() { @Override public void run() { String text = bp.requestText(); - listener.onDataArrived((text + "\r\n").getBytes()); + if (text != null) + listener.onDataArrived((text + "\r\n").getBytes()); } }); } @@ -162,9 +166,12 @@ public class PortHolder { }); try { - f.get(30, TimeUnit.SECONDS); - } catch (ExecutionException | TimeoutException e) { + f.get(COMMAND_TIMEOUT_SEC, TimeUnit.SECONDS); + } catch (ExecutionException e) { throw new IllegalStateException(e); + } catch (TimeoutException e) { + bp.getLogger().error("timeout, giving up: " + e); + return; } /** * this here to make CommandQueue happy diff --git a/java_console/lib/jssc-2.6.0-src.jar b/java_console/lib/jssc-2.6.0-src.jar deleted file mode 100644 index ca48c67ce6..0000000000 Binary files a/java_console/lib/jssc-2.6.0-src.jar and /dev/null differ diff --git a/java_console/lib/jssc-src.jar b/java_console/lib/jssc-src.jar new file mode 100644 index 0000000000..e87d8efd5b Binary files /dev/null and b/java_console/lib/jssc-src.jar differ diff --git a/java_console/lib/jssc.jar b/java_console/lib/jssc.jar index eb74f154a0..d2b5c070aa 100644 Binary files a/java_console/lib/jssc.jar and b/java_console/lib/jssc.jar differ diff --git a/java_console/ui/src/com/rusefi/TableEditor.java b/java_console/ui/src/com/rusefi/TableEditor.java index ce1352ddf0..419da37d0e 100644 --- a/java_console/ui/src/com/rusefi/TableEditor.java +++ b/java_console/ui/src/com/rusefi/TableEditor.java @@ -30,17 +30,15 @@ public class TableEditor extends JPanel { add(editor.getContent()); - - ConfigurationImage image = BinaryProtocol.instance.getController(); + BinaryProtocol instance = BinaryProtocol.instance; + if (instance == null) + throw new NullPointerException("instance"); + ConfigurationImage image = instance.getController(); ECUEditor.openImage(image.getFileContent(), SettingsManager.getSettings().getEcuDefinitionFiles().elementAt(0), "rusEfi"); - - } catch (Exception e) { throw new IllegalStateException(e); } UiUtils.trueLayout(this); - - } } \ No newline at end of file