can-log-tools/reader/src/main/java/com/rusefi/can/analysis/CanToMegaLogViewer.java

102 lines
3.9 KiB
Java

package com.rusefi.can.analysis;
import com.rusefi.can.CANPacket;
import com.rusefi.can.Launcher;
import com.rusefi.can.reader.dbc.DbcFile;
import com.rusefi.mlv.LoggingContext;
import com.rusefi.mlv.LoggingStrategy;
import com.rusefi.sensor_logs.BinaryLogEntry;
import com.rusefi.sensor_logs.BinarySensorLog;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CanToMegaLogViewer {
public static void createMegaLogViewer(String reportDestinationFolder, List<CANPacket> canPackets, String simpleFileName) throws IOException {
if (Launcher.dbcFileName != null) {
DbcFile dbc = DbcFile.readFromFile(Launcher.dbcFileName);
String outputFileName = reportDestinationFolder + File.separator + simpleFileName + ".by_dbc.mlg";
LoggingStrategy.writeLog(dbc, canPackets, outputFileName);
}
writeByIds(reportDestinationFolder, canPackets, simpleFileName);
}
private static void writeByIds(String reportDestinationFolder, List<CANPacket> canPackets, String simpleFileName) {
List<BinaryLogEntry> entries = new ArrayList<>();
Set<ByteRateOfChange.ByteId> byteIds = new HashSet<>();
Set<Integer> SIDs = new HashSet<>();
for (CANPacket packet : canPackets) {
SIDs.add(packet.getId());
for (int byteIndex = 0; byteIndex < packet.getData().length; byteIndex++) {
ByteRateOfChange.ByteId key = new ByteRateOfChange.ByteId(packet.getId(), byteIndex);
byteIds.add(key);
}
}
for (ByteRateOfChange.ByteId key : byteIds) {
entries.add(BinaryLogEntry.createFloatLogEntry(key.getLogKey(), Integer.toBinaryString(key.sid)));
}
for (Integer sid : SIDs) {
for (int i = 0; i < 7; i++) {
{
String twoBytesKey = getTwoBytesKeyM(sid, i);
entries.add(BinaryLogEntry.createFloatLogEntry(twoBytesKey, Integer.toBinaryString(sid)));
}
{
String twoBytesKey = getTwoBytesKeyL(sid, i);
entries.add(BinaryLogEntry.createFloatLogEntry(twoBytesKey, Integer.toBinaryString(sid)));
}
}
}
LoggingContext context = new LoggingContext();
BinarySensorLog<BinaryLogEntry> log = context.getBinaryLogEntryBinarySensorLog(entries, reportDestinationFolder + File.separator + simpleFileName + LoggingStrategy.MLG);
context.writeLogContent(canPackets, log, packetContent -> {
byte[] bytes = packetContent.getData();
for (int i = 0; i < bytes.length; i++) {
int value = bytes[i] & 0xFF;
int sid = packetContent.getId();
{
String name = new ByteRateOfChange.ByteId(sid, i).getLogKey();
context.currentSnapshot.put(name, (double) value);
}
{
if (i < bytes.length - 1) {
int value2 = bytes[i + 1] & 0xFF;
{
String name = getTwoBytesKeyM(sid, i);
context.currentSnapshot.put(name, (double) value2 * 256 + value);
}
{
String name = getTwoBytesKeyL(sid, i);
context.currentSnapshot.put(name, (double) value2 + value * 256);
}
}
}
}
return true;
});
}
private static String getTwoBytesKeyM(Integer sid, int i) {
return ByteRateOfChange.dualSid(sid) + "__" + i + "_" + (i + 1);
}
private static String getTwoBytesKeyL(Integer sid, int i) {
return ByteRateOfChange.dualSid(sid) + "__" + (i + 1) + "_" + i;
}
}