refactoring: extracting logging stuff

This commit is contained in:
rusefillc 2022-02-11 08:50:29 -05:00
parent 5fc5bb40bd
commit ad9cc4c219
2 changed files with 124 additions and 105 deletions

View File

@ -2,37 +2,26 @@ package com.rusefi.binaryprotocol;
import com.devexperts.logging.Logging; import com.devexperts.logging.Logging;
import com.opensr5.ConfigurationImage; import com.opensr5.ConfigurationImage;
import com.opensr5.Logger;
import com.opensr5.io.ConfigurationImageFile; import com.opensr5.io.ConfigurationImageFile;
import com.opensr5.io.DataListener; import com.opensr5.io.DataListener;
import com.rusefi.ConfigurationImageDiff; import com.rusefi.ConfigurationImageDiff;
import com.rusefi.NamedThreadFactory; import com.rusefi.NamedThreadFactory;
import com.rusefi.SignatureHelper; import com.rusefi.SignatureHelper;
import com.rusefi.Timeouts; import com.rusefi.Timeouts;
import com.rusefi.composite.CompositeEvent;
import com.rusefi.composite.CompositeParser;
import com.rusefi.config.generated.Fields; import com.rusefi.config.generated.Fields;
import com.rusefi.core.Pair; import com.rusefi.core.Pair;
import com.rusefi.core.Sensor;
import com.rusefi.core.SensorCentral; import com.rusefi.core.SensorCentral;
import com.rusefi.io.*; import com.rusefi.io.*;
import com.rusefi.io.commands.GetOutputsCommand; import com.rusefi.io.commands.GetOutputsCommand;
import com.rusefi.io.commands.HelloCommand; import com.rusefi.io.commands.HelloCommand;
import com.rusefi.stream.LogicdataStreamFile;
import com.rusefi.stream.StreamFile;
import com.rusefi.stream.TSHighSpeedLog;
import com.rusefi.stream.VcdStreamFile;
import com.rusefi.tune.xml.Msq; import com.rusefi.tune.xml.Msq;
import com.rusefi.ui.livedocs.LiveDocsRegistry; import com.rusefi.ui.livedocs.LiveDocsRegistry;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*; import java.util.concurrent.*;
import static com.devexperts.logging.Logging.getLogging; import static com.devexperts.logging.Logging.getLogging;
@ -55,7 +44,6 @@ public class BinaryProtocol {
private static final String USE_PLAIN_PROTOCOL_PROPERTY = "protocol.plain"; private static final String USE_PLAIN_PROTOCOL_PROPERTY = "protocol.plain";
private static final String CONFIGURATION_RUSEFI_BINARY = "current_configuration.rusefi_binary"; private static final String CONFIGURATION_RUSEFI_BINARY = "current_configuration.rusefi_binary";
private static final String CONFIGURATION_RUSEFI_XML = "current_configuration.msq"; private static final String CONFIGURATION_RUSEFI_XML = "current_configuration.msq";
private static final int HIGH_RPM_DELAY = Integer.getInteger("high_speed_logger_time", 10);
/** /**
* This properly allows to switch to non-CRC32 mode * This properly allows to switch to non-CRC32 mode
* todo: finish this feature, assuming we even need it. * todo: finish this feature, assuming we even need it.
@ -73,16 +61,7 @@ public class BinaryProtocol {
// todo: this ioLock needs better documentation! // todo: this ioLock needs better documentation!
private final Object ioLock = new Object(); private final Object ioLock = new Object();
public static final int COMPOSITE_OFF_RPM = Integer.getInteger("high_speed_logger_rpm", 300); BinaryProtocolLogger binaryProtocolLogger;
/**
* Composite logging turns off after 10 seconds of RPM above 300
*/
private boolean needCompositeLogger;
private boolean isCompositeLoggerEnabled;
private long lastLowRpmTime = System.currentTimeMillis();
private final List<StreamFile> compositeLogs = new ArrayList<>();
public static boolean DISABLE_LOCAL_CACHE; public static boolean DISABLE_LOCAL_CACHE;
public static String findCommand(byte command) { public static String findCommand(byte command) {
@ -114,16 +93,6 @@ public class BinaryProtocol {
} }
} }
private void createCompositesIfNeeded() {
if (!compositeLogs.isEmpty())
return;
compositeLogs.addAll(Arrays.asList(
new VcdStreamFile(getFileName("rusEFI_trigger_log_", ".vcd")),
new LogicdataStreamFile(getFileName("rusEFI_trigger_log_", ".logicdata")),
new TSHighSpeedLog(getFileName("rusEFI_trigger_log_"))
));
}
public IoStream getStream() { public IoStream getStream() {
return stream; return stream;
} }
@ -132,17 +101,6 @@ public class BinaryProtocol {
public CommunicationLoggingListener communicationLoggingListener; public CommunicationLoggingListener communicationLoggingListener;
public byte[] getCurrentOutputs() {
return state.getCurrentOutputs();
}
public void setCurrentOutputs(byte[] currentOutputs) {
state.setCurrentOutputs(currentOutputs);
}
private SensorCentral.SensorListener rpmListener;
private final Thread hook = new Thread(() -> closeComposites(), "BinaryProtocol::hook");
public BinaryProtocol(LinkManager linkManager, IoStream stream) { public BinaryProtocol(LinkManager linkManager, IoStream stream) {
this.linkManager = linkManager; this.linkManager = linkManager;
@ -156,16 +114,8 @@ public class BinaryProtocol {
}; };
incomingData = stream.getDataBuffer(); incomingData = stream.getDataBuffer();
Runtime.getRuntime().addShutdownHook(hook); binaryProtocolLogger = new BinaryProtocolLogger(linkManager);
needCompositeLogger = linkManager.getCompositeLogicEnabled(); binaryProtocolLogger.needCompositeLogger = linkManager.getCompositeLogicEnabled();
rpmListener = value -> {
if (value <= COMPOSITE_OFF_RPM) {
needCompositeLogger = linkManager.getCompositeLogicEnabled();
lastLowRpmTime = System.currentTimeMillis();
} else if (System.currentTimeMillis() - lastLowRpmTime > HIGH_RPM_DELAY * Timeouts.SECOND) {
needCompositeLogger = false;
}
};
} }
public static void sleep(long millis) { public static void sleep(long millis) {
@ -176,16 +126,6 @@ public class BinaryProtocol {
} }
} }
@NotNull
public static String getFileName(String prefix) {
return getFileName(prefix, ".csv");
}
@NotNull
public static String getFileName(String prefix, String fileType) {
return Logger.DIR + prefix + Logger.getDate() + fileType;
}
public void doSend(final String command, boolean fireEvent) throws InterruptedException { public void doSend(final String command, boolean fireEvent) throws InterruptedException {
log.info("Sending [" + command + "]"); log.info("Sending [" + command + "]");
if (fireEvent && LinkManager.LOG_LEVEL.isDebugEnabled()) { if (fireEvent && LinkManager.LOG_LEVEL.isDebugEnabled()) {
@ -240,12 +180,12 @@ public class BinaryProtocol {
if (isClosed) if (isClosed)
return false; return false;
startTextPullThread(listener); startPullThread(listener);
SensorCentral.getInstance().addListener(Sensor.RPM, rpmListener); binaryProtocolLogger.start();
return true; return true;
} }
private void startTextPullThread(final DataListener listener) { private void startPullThread(final DataListener textListener) {
if (!linkManager.COMMUNICATION_QUEUE.isEmpty()) { if (!linkManager.COMMUNICATION_QUEUE.isEmpty()) {
log.info("Current queue: " + linkManager.COMMUNICATION_QUEUE.size()); log.info("Current queue: " + linkManager.COMMUNICATION_QUEUE.size());
} }
@ -260,10 +200,10 @@ public class BinaryProtocol {
public void run() { public void run() {
if (requestOutputChannels()) if (requestOutputChannels())
HeartBeatListeners.onDataArrived(); HeartBeatListeners.onDataArrived();
compositeLogic(); binaryProtocolLogger.compositeLogic(BinaryProtocol.this);
String text = requestPendingMessages(); String text = requestPendingMessages();
if (text != null) if (text != null)
listener.onDataArrived((text + "\r\n").getBytes()); textListener.onDataArrived((text + "\r\n").getBytes());
LiveDocsRegistry.LiveDataProvider liveDataProvider = LiveDocsRegistry.getLiveDataProvider(BinaryProtocol.this); LiveDocsRegistry.LiveDataProvider liveDataProvider = LiveDocsRegistry.getLiveDataProvider(BinaryProtocol.this);
LiveDocsRegistry.INSTANCE.refresh(liveDataProvider); LiveDocsRegistry.INSTANCE.refresh(liveDataProvider);
} }
@ -278,23 +218,6 @@ public class BinaryProtocol {
tr.start(); tr.start();
} }
private void compositeLogic() {
if (needCompositeLogger) {
getComposite();
} else if (isCompositeLoggerEnabled) {
executeCommand(Fields.TS_SET_LOGGER_SWITCH, new byte[] { Fields.TS_COMPOSITE_DISABLE }, "disable composite");
isCompositeLoggerEnabled = false;
closeComposites();
}
}
private void closeComposites() {
for (StreamFile composite : compositeLogs) {
composite.close();
}
compositeLogs.clear();
}
private void dropPending() { private void dropPending() {
synchronized (ioLock) { synchronized (ioLock) {
if (isClosed) if (isClosed)
@ -523,10 +446,8 @@ public class BinaryProtocol {
if (isClosed) if (isClosed)
return; return;
isClosed = true; isClosed = true;
SensorCentral.getInstance().removeListener(Sensor.RPM, rpmListener); binaryProtocolLogger.close();
stream.close(); stream.close();
closeComposites();
Runtime.getRuntime().removeShutdownHook(hook);
} }
public void writeData(byte[] content, int contentOffset, int ecuOffset, int size) { public void writeData(byte[] content, int contentOffset, int ecuOffset, int size) {
@ -621,23 +542,6 @@ public class BinaryProtocol {
} }
} }
public void getComposite() {
if (isClosed)
return;
// 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(Fields.TS_GET_COMPOSITE_BUFFER_DONE_DIFFERENTLY, "composite log", true);
if (checkResponseCode(response, (byte) Fields.TS_RESPONSE_OK)) {
List<CompositeEvent> events = CompositeParser.parse(response);
createCompositesIfNeeded();
for (StreamFile composite : compositeLogs)
composite.append(events);
}
}
public boolean requestOutputChannels() { public boolean requestOutputChannels() {
if (isClosed) if (isClosed)
return false; return false;

View File

@ -0,0 +1,115 @@
package com.rusefi.binaryprotocol;
import com.opensr5.Logger;
import com.rusefi.Timeouts;
import com.rusefi.composite.CompositeEvent;
import com.rusefi.composite.CompositeParser;
import com.rusefi.config.generated.Fields;
import com.rusefi.core.Sensor;
import com.rusefi.core.SensorCentral;
import com.rusefi.io.LinkManager;
import com.rusefi.stream.LogicdataStreamFile;
import com.rusefi.stream.StreamFile;
import com.rusefi.stream.TSHighSpeedLog;
import com.rusefi.stream.VcdStreamFile;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.rusefi.binaryprotocol.IoHelper.checkResponseCode;
public class BinaryProtocolLogger {
private static final int HIGH_RPM_DELAY = Integer.getInteger("high_speed_logger_time", 10);
public static final int COMPOSITE_OFF_RPM = Integer.getInteger("high_speed_logger_rpm", 300);
/**
* Composite logging turns off after 10 seconds of RPM above 300
*/
public boolean needCompositeLogger;
private boolean isCompositeLoggerEnabled;
private long lastLowRpmTime = System.currentTimeMillis();
private final List<StreamFile> compositeLogs = new ArrayList<>();
private final SensorCentral.SensorListener rpmListener;
private final Thread hook = new Thread(() -> closeComposites(), "BinaryProtocol::hook");
public BinaryProtocolLogger(LinkManager linkManager) {
rpmListener = value -> {
if (value <= COMPOSITE_OFF_RPM) {
needCompositeLogger = linkManager.getCompositeLogicEnabled();
lastLowRpmTime = System.currentTimeMillis();
} else if (System.currentTimeMillis() - lastLowRpmTime > HIGH_RPM_DELAY * Timeouts.SECOND) {
needCompositeLogger = false;
}
};
Runtime.getRuntime().addShutdownHook(hook);
}
private void createCompositesIfNeeded() {
if (!compositeLogs.isEmpty())
return;
compositeLogs.addAll(Arrays.asList(
new VcdStreamFile(getFileName("rusEFI_trigger_log_", ".vcd")),
new LogicdataStreamFile(getFileName("rusEFI_trigger_log_", ".logicdata")),
new TSHighSpeedLog(getFileName("rusEFI_trigger_log_"))
));
}
@NotNull
public static String getFileName(String prefix) {
return getFileName(prefix, ".csv");
}
@NotNull
public static String getFileName(String prefix, String fileType) {
return Logger.DIR + prefix + Logger.getDate() + fileType;
}
public void compositeLogic(BinaryProtocol binaryProtocol) {
if (needCompositeLogger) {
getComposite(binaryProtocol);
} else if (isCompositeLoggerEnabled) {
binaryProtocol.executeCommand(Fields.TS_SET_LOGGER_SWITCH, new byte[]{Fields.TS_COMPOSITE_DISABLE}, "disable composite");
isCompositeLoggerEnabled = false;
closeComposites();
}
}
private void closeComposites() {
for (StreamFile composite : compositeLogs) {
composite.close();
}
compositeLogs.clear();
}
private void getComposite(BinaryProtocol binaryProtocol) {
if (binaryProtocol.isClosed)
return;
// 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 = binaryProtocol.executeCommand(Fields.TS_GET_COMPOSITE_BUFFER_DONE_DIFFERENTLY, "composite log", true);
if (checkResponseCode(response, (byte) Fields.TS_RESPONSE_OK)) {
List<CompositeEvent> events = CompositeParser.parse(response);
createCompositesIfNeeded();
for (StreamFile composite : compositeLogs)
composite.append(events);
}
}
public void start() {
SensorCentral.getInstance().addListener(Sensor.RPM, rpmListener);
}
public void close() {
SensorCentral.getInstance().removeListener(Sensor.RPM, rpmListener);
closeComposites();
Runtime.getRuntime().removeShutdownHook(hook);
}
}