diff --git a/src/main/java/com/rusefi/can/reader/dbc/DbcField.java b/src/main/java/com/rusefi/can/reader/dbc/DbcField.java index 51b4670..9f004a6 100644 --- a/src/main/java/com/rusefi/can/reader/dbc/DbcField.java +++ b/src/main/java/com/rusefi/can/reader/dbc/DbcField.java @@ -7,17 +7,44 @@ public class DbcField { private final int startOffset; private final int length; private final double mult; + private final double offset; private String category; private boolean isNiceName; - public DbcField(String name, int startOffset, int length, double mult, String category) { + public DbcField(String name, int startOffset, int length, double mult, double offset, String category) { this.name = name; this.startOffset = startOffset; this.length = length; this.mult = mult; + this.offset = offset; this.category = category; } + public static DbcField parseField(DbcPacket parent, String line) { + line = DbcFile.replaceSpecialWithSpaces(line); + String[] tokens = line.split(" "); + String name = tokens[1]; + int index = 1; + while (!tokens[index - 1].equals(":")) + index++; + + + if (DbcFile.debugEnabled) + System.out.println(line); + int startOffset; + try { + startOffset = Integer.parseInt(tokens[index]); + } catch (NumberFormatException e) { + throw new IllegalStateException("While " + line, e); + } + int length = Integer.parseInt(tokens[index + 1]); + + double mult = Double.parseDouble(tokens[index + 3]); + double offset = Double.parseDouble(tokens[index + 4]); + + return new DbcField(name, startOffset, length, mult, offset, parent.getName()); + } + public String getCategory() { return category; } @@ -42,6 +69,10 @@ public class DbcField { return mult; } + public double getOffset() { + return offset; + } + @Override public String toString() { return "DbcField{" + @@ -70,7 +101,7 @@ public class DbcField { } public double getValue(CANPacket packet) { - return getBitIndex(packet.getData(), startOffset, length) * mult; + return getBitIndex(packet.getData(), startOffset, length) * mult + offset; } public void rename(String niceName) { diff --git a/src/main/java/com/rusefi/can/reader/dbc/DbcFile.java b/src/main/java/com/rusefi/can/reader/dbc/DbcFile.java index 596b60a..6ac59ae 100644 --- a/src/main/java/com/rusefi/can/reader/dbc/DbcFile.java +++ b/src/main/java/com/rusefi/can/reader/dbc/DbcFile.java @@ -6,7 +6,6 @@ import com.rusefi.sensor_logs.BinaryLogEntry; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Objects; @@ -14,7 +13,7 @@ import java.util.Objects; public class DbcFile { public final LinkedHashMap packets = new LinkedHashMap<>(); - private static final boolean debugEnabled = false; + public static final boolean debugEnabled = false; private List list; @@ -60,27 +59,7 @@ public class DbcFile { } else if (line.startsWith("SG_")) { - line = replaceSpecialWithSpaces(line); - String[] tokens = line.split(" "); - String name = tokens[1]; - int index = 1; - while (!tokens[index - 1].equals(":")) - index++; - - - if (debugEnabled) - System.out.println(line); - int startOffset; - try { - startOffset = Integer.parseInt(tokens[index]); - } catch (NumberFormatException e) { - throw new IllegalStateException("While " + line, e); - } - int length = Integer.parseInt(tokens[index + 1]); - - double mult = Double.parseDouble(tokens[index + 3]); - - DbcField field = new DbcField(name, startOffset, length, mult, currentPacket.getName()); + DbcField field = DbcField.parseField(currentPacket, line); if (debugEnabled) System.out.println("Found " + field); currentPacket.add(field); @@ -109,7 +88,7 @@ public class DbcFile { packets.put(currentPacket.getId(), currentPacket); } - private String replaceSpecialWithSpaces(String line) { + public static String replaceSpecialWithSpaces(String line) { line = line.replaceAll("[|+@(,)\\[\\]]", " "); line = line.replaceAll(" +", " "); return line; diff --git a/src/test/java/com/rusefi/can/reader/impl/ParseDbcFieldTest.java b/src/test/java/com/rusefi/can/reader/impl/ParseDbcFieldTest.java new file mode 100644 index 0000000..faa9c90 --- /dev/null +++ b/src/test/java/com/rusefi/can/reader/impl/ParseDbcFieldTest.java @@ -0,0 +1,28 @@ +package com.rusefi.can.reader.impl; + +import com.rusefi.can.CANPacket; +import com.rusefi.can.reader.dbc.DbcField; +import com.rusefi.can.reader.dbc.DbcPacket; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ParseDbcFieldTest { + + private static final double EPS = 0.001; + + @Test + public void parseIat() { + String line = "SG_ Ansauglufttemperatur : 8|8@1+ (0.75,-48) [-48|142.5] \"\" XXX"; + DbcPacket parent = new DbcPacket(1, "hello"); + DbcField iatField = DbcField.parseField(parent, line); + assertEquals("Ansauglufttemperatur", iatField.getName()); + assertEquals(0.75, iatField.getMult(), EPS); + assertEquals(-48, iatField.getOffset(), EPS); + + CANPacket packet = new PcanTrcReader().readLine(" 2197) 1234.8 Rx 0380 8 00 62 FA 00 22 00 00 FA"); + assertEquals(8, packet.getData().length); + + assertEquals(25.5, iatField.getValue(packet), EPS); + } +}