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