diff --git a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java index cfcf245e17..70c01cba66 100644 --- a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java +++ b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java @@ -28,6 +28,7 @@ import java.io.EOFException; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; @@ -81,9 +82,15 @@ public class BinaryProtocol implements BinaryProtocolCommands { private boolean isCompositeLoggerEnabled; private long lastLowRpmTime = System.currentTimeMillis(); - private List compositeLogs = Arrays.asList(new VcdStreamFile(getFileName("rusEFI_trigger_log_")), - new TSHighSpeedLog(getFileName("rusEFI_trigger_log_")), - new LogicdataStreamFile(getFileName("rusEFI_trigger_log_", ".logicdata"))); + private List compositeLogs = new ArrayList<>(); + + private void createCompositesIfNeeded() { + if (!compositeLogs.isEmpty()) + return; + compositeLogs.addAll(Arrays.asList(new VcdStreamFile(getFileName("rusEFI_trigger_log_")), + new TSHighSpeedLog(getFileName("rusEFI_trigger_log_")), + new LogicdataStreamFile(getFileName("rusEFI_trigger_log_", ".logicdata")))); + } public boolean isClosed; /** @@ -101,11 +108,14 @@ public class BinaryProtocol implements BinaryProtocolCommands { } }; + private final Thread hook = new Thread(() -> closeComposites()); + protected BinaryProtocol(final Logger logger, IoStream stream) { this.logger = logger; this.stream = stream; incomingData = createDataBuffer(stream, logger); + Runtime.getRuntime().addShutdownHook(hook); } public static IncomingDataBuffer createDataBuffer(IoStream stream, Logger logger) { @@ -222,11 +232,17 @@ public class BinaryProtocol implements BinaryProtocolCommands { packet[1] = Fields.TS_COMPOSITE_DISABLE; executeCommand(packet, "disable composite"); isCompositeLoggerEnabled = false; - for (StreamFile composite : compositeLogs) - composite.close(); + closeComposites(); } } + private void closeComposites() { + for (StreamFile composite : compositeLogs) { + composite.close(); + } + compositeLogs.clear(); + } + public Logger getLogger() { return logger; } @@ -397,6 +413,8 @@ public class BinaryProtocol implements BinaryProtocolCommands { isClosed = true; SensorCentral.getInstance().removeListener(Sensor.RPM, rpmListener); stream.close(); + closeComposites(); + Runtime.getRuntime().removeShutdownHook(hook); } public void writeData(byte[] content, Integer offset, int size, Logger logger) throws SerialPortException, EOFException, InterruptedException { @@ -521,6 +539,7 @@ public class BinaryProtocol implements BinaryProtocolCommands { byte[] response = executeCommand(packet, "composite log", true); if (checkResponseCode(response, RESPONSE_OK)) { List events = CompositeParser.parse(response); + createCompositesIfNeeded(); for (StreamFile composite : compositeLogs) composite.append(events); } diff --git a/java_console/models/src/com/rusefi/stream/LogicdataStreamFile.java b/java_console/models/src/com/rusefi/stream/LogicdataStreamFile.java index fd5169bf5a..ad17a98634 100644 --- a/java_console/models/src/com/rusefi/stream/LogicdataStreamFile.java +++ b/java_console/models/src/com/rusefi/stream/LogicdataStreamFile.java @@ -344,6 +344,8 @@ public class LogicdataStreamFile extends StreamFile { @Override protected void writeFooter() throws IOException { + if (stream == null) + return; write(BLOCK); for (int i = 0; i < numChannels; i++) { writeId(i, 1); diff --git a/java_console/models/src/com/rusefi/stream/StreamFile.java b/java_console/models/src/com/rusefi/stream/StreamFile.java index 6f9b12d9d3..ead11ef30d 100644 --- a/java_console/models/src/com/rusefi/stream/StreamFile.java +++ b/java_console/models/src/com/rusefi/stream/StreamFile.java @@ -32,14 +32,15 @@ public abstract class StreamFile { } catch (IOException e) { // ignoring this one } + writer = null; } - writer = null; if (stream != null) { try { stream.close(); } catch (IOException e) { // ignoring this one } + stream = null; } } diff --git a/java_console/models/src/com/rusefi/stream/TSHighSpeedLog.java b/java_console/models/src/com/rusefi/stream/TSHighSpeedLog.java index 42fbec54c1..3171f0c9c5 100644 --- a/java_console/models/src/com/rusefi/stream/TSHighSpeedLog.java +++ b/java_console/models/src/com/rusefi/stream/TSHighSpeedLog.java @@ -42,6 +42,7 @@ public class TSHighSpeedLog extends StreamFile { @Override protected void writeFooter() throws IOException { - writer.write("MARK 028\n"); + if (writer != null) + writer.write("MARK 028\n"); } }