From 562457f0992c9062efc3b2d01ed685a8d6ff63b4 Mon Sep 17 00:00:00 2001 From: rusefi Date: Sat, 30 May 2020 13:01:59 -0400 Subject: [PATCH] sweet usability --- .../rusefi/binaryprotocol/BinaryProtocol.java | 47 +++++++++-- .../logging/src/com/rusefi/FileLog.java | 4 +- .../com/rusefi/binaryprotocol/StreamFile.java | 11 +++ .../rusefi/binaryprotocol/VcdStreamFile.java | 83 +++++++++++++++++++ .../com/rusefi/composite/CompositeParser.java | 41 +-------- .../ui/src/com/rusefi/SensorLogger.java | 2 +- 6 files changed, 141 insertions(+), 47 deletions(-) create mode 100644 java_console/models/src/com/rusefi/binaryprotocol/StreamFile.java create mode 100644 java_console/models/src/com/rusefi/binaryprotocol/VcdStreamFile.java diff --git a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java index 89be55b1c1..0c73ef7128 100644 --- a/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java +++ b/java_console/io/src/com/rusefi/binaryprotocol/BinaryProtocol.java @@ -67,12 +67,32 @@ public class BinaryProtocol implements BinaryProtocolCommands { private final Object imageLock = new Object(); private ConfigurationImage controller; + private static final int COMPOSITE_OFF_RPM = 300; + + /** + * Composite logging turns off after 10 seconds of RPM above 300 + */ + private boolean needCompositeLogger = true; + private boolean isCompositeLoggerEnabled; + private long lastLowRpmTime = System.currentTimeMillis(); + + private VcdStreamFile composite = new VcdStreamFile(); + public boolean isClosed; /** * Snapshot of current gauges status * @see BinaryProtocolCommands#COMMAND_OUTPUTS */ public byte[] currentOutputs; + private SensorCentral.SensorListener rpmListener = value -> { + if (value <= COMPOSITE_OFF_RPM) { + needCompositeLogger = true; + lastLowRpmTime = System.currentTimeMillis(); + } else if (System.currentTimeMillis() - lastLowRpmTime > 10 * Timeouts.SECOND) { + FileLog.MAIN.logLine("Time to turn off composite logging"); + needCompositeLogger = false; + } + }; protected BinaryProtocol(final Logger logger, IoStream stream) { this.logger = logger; @@ -134,6 +154,7 @@ public class BinaryProtocol implements BinaryProtocolCommands { return false; startTextPullThread(listener); + SensorCentral.getInstance().addListener(Sensor.RPM, rpmListener); return true; } @@ -152,7 +173,7 @@ public class BinaryProtocol implements BinaryProtocolCommands { public void run() { if (requestOutputChannels()) ConnectionWatchdog.onDataArrived(); -// getComposite(); + compositeLogic(); String text = requestPendingMessages(); if (text != null) listener.onDataArrived((text + "\r\n").getBytes()); @@ -170,6 +191,19 @@ public class BinaryProtocol implements BinaryProtocolCommands { tr.start(); } + private void compositeLogic() { + if (needCompositeLogger) { + getComposite(); + } else if (isCompositeLoggerEnabled) { + byte packet[] = new byte[2]; + packet[0] = Fields.TS_SET_LOGGER_SWITCH; + packet[1] = Fields.TS_COMPOSITE_DISABLE; + executeCommand(packet, "disable composite"); + isCompositeLoggerEnabled = false; + composite.close(); + } + } + public Logger getLogger() { return logger; } @@ -338,6 +372,7 @@ public class BinaryProtocol implements BinaryProtocolCommands { if (isClosed) return; isClosed = true; + SensorCentral.getInstance().removeListener(Sensor.RPM, rpmListener); stream.close(); } @@ -443,7 +478,6 @@ public class BinaryProtocol implements BinaryProtocolCommands { byte[] response = executeCommand(new byte[]{Fields.TS_GET_TEXT}, "text", true); if (response != null && response.length == 1) Thread.sleep(100); - // System.out.println(result); return new String(response, 1, response.length - 1); } catch (InterruptedException e) { FileLog.MAIN.log(e); @@ -457,15 +491,14 @@ public class BinaryProtocol implements BinaryProtocolCommands { byte packet[] = new byte[1]; packet[0] = Fields.TS_GET_COMPOSITE_BUFFER_DONE_DIFFERENTLY; + // get command would enable composite logging in controller but we need to turn it off from our end + // todo: actually if console gets disconnected composite logging might end up enabled in controller? + isCompositeLoggerEnabled = true; byte[] response = executeCommand(packet, "composite log", true); if (checkResponseCode(response, RESPONSE_OK)) { List events = CompositeParser.parse(response); - try { - CompositeParser.writeVCD(events, new FileWriter("rusEFI.vcd")); - } catch (IOException e) { - throw new IllegalStateException(e); - } + composite.append(events); } } diff --git a/java_console/logging/src/com/rusefi/FileLog.java b/java_console/logging/src/com/rusefi/FileLog.java index 1c596cf5ef..0e384e30af 100644 --- a/java_console/logging/src/com/rusefi/FileLog.java +++ b/java_console/logging/src/com/rusefi/FileLog.java @@ -22,6 +22,7 @@ public enum FileLog { public static final String LOG_INFO_TEXT = "Writing logs to '" + DIR + "'"; public static final String OS_VERSION = "os.version"; public static final String DATE_PATTERN = "yyyy-MM-dd_HH_mm_ss_SSS"; + private static final String WIKI_URL = "https://github.com/rusefi/rusefi/wiki/rusEFI-logs-folder"; public static String currentLogName; public static final String END_OF_TIMESTAND_TAG = ": "; public static final Logger LOGGER = new Logger() { @@ -62,8 +63,7 @@ public enum FileLog { private static void writeReadmeFile() { LazyFile file = new LazyFile(DIR + "README.html"); - file.write("
" + - "More info online
"); + file.write("
" + "More info online
"); try { file.close(); } catch (IOException e) { diff --git a/java_console/models/src/com/rusefi/binaryprotocol/StreamFile.java b/java_console/models/src/com/rusefi/binaryprotocol/StreamFile.java new file mode 100644 index 0000000000..9da9a46a40 --- /dev/null +++ b/java_console/models/src/com/rusefi/binaryprotocol/StreamFile.java @@ -0,0 +1,11 @@ +package com.rusefi.binaryprotocol; + +import com.rusefi.composite.CompositeEvent; + +import java.util.List; + +public interface StreamFile { + void append(List events); + + void close(); +} diff --git a/java_console/models/src/com/rusefi/binaryprotocol/VcdStreamFile.java b/java_console/models/src/com/rusefi/binaryprotocol/VcdStreamFile.java new file mode 100644 index 0000000000..c836e69dfd --- /dev/null +++ b/java_console/models/src/com/rusefi/binaryprotocol/VcdStreamFile.java @@ -0,0 +1,83 @@ +package com.rusefi.binaryprotocol; + +import com.rusefi.FileLog; +import com.rusefi.composite.CompositeEvent; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.Date; +import java.util.List; + +/** + * https://en.wikipedia.org/wiki/Value_change_dump + * + * @see FileLog#WIKI_URL + */ +public class VcdStreamFile implements StreamFile { + private static final String TAG_PRIMARY = "t"; + private static final String TAG_SECONDARY = "s"; + private static final String TAG_TRG = "r"; + private static final String TAG_SYNC = "y"; + + private FileWriter writer; + + public static void writeHeader(Writer writer, Date date) throws IOException { + writer.write("$date\n"); + writer.write("\t" + date + "\n"); + writer.write("$end\n" + + "$version\n" + + " 1.0\n" + + "$end\n" + + "$timescale\n" + + " 1ps\n" + + "$end\n" + + "$scope module test $end\n" + + "$var wire 1 " + TAG_PRIMARY + " PRI_TRG $end\n" + + "$var wire 1 " + TAG_SECONDARY + " SEC_TRG $end\n" + + "$var wire 1 " + TAG_TRG + " TRG $end\n" + + "$var wire 1 " + TAG_SYNC + " SYNC $end\n" + + "$upscope $end\n" + + "$enddefinitions $end\n" + + "$dumpvars\n"); + } + + public static void appendEvents(List events, Writer writer) throws IOException { + for (CompositeEvent event : events) { + writer.write("#" + event.getTimestamp() + "\n"); + writer.write(event.isPrimaryTriggerAsInt() + TAG_PRIMARY + "\n"); + writer.write(event.isSecondaryTriggerAsInt() + TAG_SECONDARY + "\n"); + writer.write(event.isTrgAsInt() + TAG_TRG + "\n"); + writer.write(event.isSyncAsInt() + TAG_SYNC + "\n"); + + } + writer.flush(); + } + + + @Override + public void append(List events) { + try { + if (writer == null) { + String fileName = FileLog.DIR + "rusEFI_trigger_log_" + FileLog.getDate() + ".vcd"; + writer = new FileWriter(fileName); + writeHeader(writer, new Date()); + } + appendEvents(events, writer); + } catch (IOException e) { + // ignoring this one + } + } + + @Override + public void close() { + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + // ignoring this one + } + } + writer = null; + } +} diff --git a/java_console/models/src/com/rusefi/composite/CompositeParser.java b/java_console/models/src/com/rusefi/composite/CompositeParser.java index ac0e0f7bce..83a33984c4 100644 --- a/java_console/models/src/com/rusefi/composite/CompositeParser.java +++ b/java_console/models/src/com/rusefi/composite/CompositeParser.java @@ -1,11 +1,11 @@ package com.rusefi.composite; import com.opensr5.ini.field.EnumIniField; +import com.rusefi.binaryprotocol.VcdStreamFile; import com.rusefi.config.generated.Fields; import java.io.FileWriter; import java.io.IOException; -import java.io.StringWriter; import java.io.Writer; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -15,11 +15,6 @@ import java.util.List; public class CompositeParser { - public static final String TAG_PRIMARY = "t"; - public static final String TAG_SECONDARY = "s"; - public static final String TAG_TRG = "r"; - public static final String TAG_SYNC = "y"; - public static List parse(byte[] response) { ByteBuffer byteBuffer = ByteBuffer.wrap(response); byteBuffer.order(ByteOrder.BIG_ENDIAN); @@ -46,40 +41,12 @@ public class CompositeParser { return events; } - /** - * https://en.wikipedia.org/wiki/Value_change_dump - */ public static void writeVCD(List events, Writer writer, Date date) throws IOException { - writer.write("$date\n"); - writer.write("\t" + date + "\n"); - writer.write("$end\n" + - "$version\n" + - " 1.0\n" + - "$end\n" + - "$timescale\n" + - " 1ps\n" + - "$end\n" + - "$scope module test $end\n" + - "$var wire 1 " + TAG_PRIMARY + " PRI_TRG $end\n" + - "$var wire 1 " + TAG_SECONDARY + " SEC_TRG $end\n" + - "$var wire 1 " + TAG_TRG + " TRG $end\n" + - "$var wire 1 " + TAG_SYNC + " SYNC $end\n" + - "$upscope $end\n" + - "$enddefinitions $end\n" + - "$dumpvars\n"); - - for (CompositeEvent event : events) { - writer.write("#" + event.getTimestamp() + "\n"); - writer.write(event.isPrimaryTriggerAsInt() + TAG_PRIMARY + "\n"); - writer.write(event.isSecondaryTriggerAsInt() + TAG_SECONDARY + "\n"); - writer.write(event.isTrgAsInt() + TAG_TRG + "\n"); - writer.write(event.isSyncAsInt() + TAG_SYNC + "\n"); - - } - writer.flush(); + VcdStreamFile.writeHeader(writer, date); + VcdStreamFile.appendEvents(events, writer); } public static void writeVCD(List events, FileWriter fileWriter) throws IOException { - writeVCD(events, fileWriter, new Date()); + writeVCD(events, fileWriter, new Date()); } } diff --git a/java_console/ui/src/com/rusefi/SensorLogger.java b/java_console/ui/src/com/rusefi/SensorLogger.java index 4e90817d0a..7d19d67e8b 100644 --- a/java_console/ui/src/com/rusefi/SensorLogger.java +++ b/java_console/ui/src/com/rusefi/SensorLogger.java @@ -139,7 +139,7 @@ public class SensorLogger { private static void startSensorLogFile() { FileLog.createFolderIfNeeded(); - String fileName = FileLog.DIR + "rusEFI_" + FileLog.getDate() + ".msl"; + String fileName = FileLog.DIR + "rusEFI_gauges_" + FileLog.getDate() + ".msl"; fileStartTime = System.currentTimeMillis(); try {