diff --git a/reader/src/main/java/com/rusefi/can/reader/impl/AutoFormatReader.java b/reader/src/main/java/com/rusefi/can/reader/impl/AutoFormatReader.java index 1785dfb..f298bea 100644 --- a/reader/src/main/java/com/rusefi/can/reader/impl/AutoFormatReader.java +++ b/reader/src/main/java/com/rusefi/can/reader/impl/AutoFormatReader.java @@ -26,10 +26,15 @@ public class AutoFormatReader implements CANLineReader { @Override public List readFile(String fileName) throws IOException { String firstLine = Files.lines(Paths.get(fileName)).findFirst().get(); - if (!firstLine.contains(PcanTrcReader2_0.FILEVERSION) && !firstLine.contains(CanHackerReader.HEADER)) + if (!firstLine.contains(PcanTrcReader2_0.FILEVERSION) + && !firstLine.contains(CanHackerReader.HEADER) + && !firstLine.contains(BusMasterReader.HEADER) + ) throw new IllegalStateException(PcanTrcReader2_0.FILEVERSION + " expected in first line"); if (firstLine.contains(CanHackerReader.HEADER)) { delegate = CanHackerReader.INSTANCE; + } else if (firstLine.contains(BusMasterReader.HEADER)) { + delegate = BusMasterReader.INSTANCE; } else if (firstLine.contains("1.1")) { delegate = PcanTrcReader1_1.INSTANCE; } else if (firstLine.contains("2.0")) { @@ -37,7 +42,11 @@ public class AutoFormatReader implements CANLineReader { } else { throw new IllegalStateException("Unsupported version in " + firstLine); } - return delegate.readFile(fileName); + try { + return delegate.readFile(fileName); + } catch (Throwable e) { + throw new IllegalStateException("While " + fileName, e); + } } @Override diff --git a/reader/src/main/java/com/rusefi/can/reader/impl/BusMasterReader.java b/reader/src/main/java/com/rusefi/can/reader/impl/BusMasterReader.java new file mode 100644 index 0000000..b8fdb4a --- /dev/null +++ b/reader/src/main/java/com/rusefi/can/reader/impl/BusMasterReader.java @@ -0,0 +1,45 @@ +package com.rusefi.can.reader.impl; + +import com.rusefi.can.CANPacket; +import com.rusefi.can.reader.CANLineReader; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +public enum BusMasterReader implements CANLineReader { + INSTANCE; + + public static final CharSequence HEADER = "BUSMASTER Ver 3"; + final String FORMAT = "HH:mm:ss:SSS"; + DateFormat formatter = new SimpleDateFormat(FORMAT); + + @Override + public CANPacket readLine(String line, String fileName, int lineIndex) { + if (line.startsWith("***")) + return null; + String trimmed = line.trim(); + if (trimmed.isEmpty()) + return null; + String[] tokens = trimmed.split("\\s+"); + if (tokens.length < 7) + throw new IllegalStateException("Unexpected " + Arrays.toString(tokens)); + String hexId = tokens[3]; + String lenghtString = tokens[5]; + + int sid = Integer.parseInt(hexId.substring(2), 16); + int size = Integer.parseInt(lenghtString); + + long timeStamp; + byte[] data = CANLineReader.readHexArray(tokens, 6, size); + try { + Date date = formatter.parse(tokens[0]); + timeStamp = date.getTime(); + } catch (ParseException e) { + throw new RuntimeException(e); + } + return new CANPacket(timeStamp, sid, data); + } +} diff --git a/reader/src/test/java/com/rusefi/can/RallySandbox.java b/reader/src/test/java/com/rusefi/can/RallySandbox.java new file mode 100644 index 0000000..34ab6d9 --- /dev/null +++ b/reader/src/test/java/com/rusefi/can/RallySandbox.java @@ -0,0 +1,13 @@ +package com.rusefi.can; + +import java.io.IOException; + +public class RallySandbox { + public static void main(String[] args) throws IOException { + Launcher.main(new String[]{ + "C:\\stuff\\rusefi_documentation\\OEM-Docs\\Mitsubishi\\2009-rallyart", + Launcher.FILENAME_SUFFIX_PROPERTY, + ".log", + }); + } +} diff --git a/reader/src/test/java/com/rusefi/can/reader/impl/BusMasterReaderTest.java b/reader/src/test/java/com/rusefi/can/reader/impl/BusMasterReaderTest.java new file mode 100644 index 0000000..3e6bce6 --- /dev/null +++ b/reader/src/test/java/com/rusefi/can/reader/impl/BusMasterReaderTest.java @@ -0,0 +1,22 @@ +package com.rusefi.can.reader.impl; + +import com.rusefi.can.CANPacket; +import org.junit.Test; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; + +import static org.junit.Assert.assertEquals; + +public class BusMasterReaderTest { + @Test + public void test() throws IOException { + String line = "21:27:52:3456 Rx 1 0x309 s 7 47 D8 7F D4 A8 00 05 "; + BufferedReader reader = new BufferedReader(new StringReader(line)); + CANPacket packet = BusMasterReader.INSTANCE.readLine(reader.readLine()); + assertEquals(packet.getData().length, 7); + assertEquals(packet.getData()[0], 0x47); + assertEquals(packet.getData()[6], 0x05); + } +}