From 46164b1184207c86dc6786f35fff3286939add2f Mon Sep 17 00:00:00 2001 From: rusefillc Date: Sat, 8 Jul 2023 21:17:48 -0400 Subject: [PATCH] playing with CAN232 --- .../java/com/rusefi/can232/Can232Sandbox.java | 88 +++++++++++++++++++ .../java/com/rusefi/can232/CanPacket.java | 44 ++++++++++ .../com/rusefi/can232/Can232ParsingTest.java | 17 ++++ 3 files changed, 149 insertions(+) create mode 100644 java_console/io/src/main/java/com/rusefi/can232/Can232Sandbox.java create mode 100644 java_console/io/src/main/java/com/rusefi/can232/CanPacket.java create mode 100644 java_console/io/src/test/java/com/rusefi/can232/Can232ParsingTest.java diff --git a/java_console/io/src/main/java/com/rusefi/can232/Can232Sandbox.java b/java_console/io/src/main/java/com/rusefi/can232/Can232Sandbox.java new file mode 100644 index 0000000000..100c8840d0 --- /dev/null +++ b/java_console/io/src/main/java/com/rusefi/can232/Can232Sandbox.java @@ -0,0 +1,88 @@ +package com.rusefi.can232; + +import com.rusefi.io.IoStream; +import com.rusefi.io.serial.BufferedSerialIoStream; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class Can232Sandbox { + private final static Function integerLongFunction = integer -> 0L; + + private static final int MAX_VERSION_LENGTH = 256; + + public static void main(String[] args) throws IOException { + IoStream stream = BufferedSerialIoStream.openPort("COM20"); + + + String s = getVersion(stream); + if (s.length() > 3) + System.out.println("Looks like legit version [" + s + "]"); + writeCan232Command(stream, "S6"); // 500K + writeCan232Command(stream, "O"); // open + + while (true) { + Map previousTimestamp = new HashMap<>(); + + System.out.println("Requesting All"); +// writeCan232Command(stream, "A"); // get all + + int c = 0; + while (true) { + + + StringBuilder response = readCan232Response(stream); + + if (response.charAt(0) == 'T') { + CanPacket p = CanPacket.parse(response.toString()); + + Long previousTime = previousTimestamp.computeIfAbsent(p.getId(), integerLongFunction); + long now = System.currentTimeMillis(); + + long period = now - previousTime; + + System.out.println(new Date() + ": T id=" + p + " " + c++ + " period " + period); + + previousTimestamp.put(p.getId(), now); + } else { + throw new IllegalStateException(response.toString()); + } + + System.out.println("Got " + response); + } + } + + + } + + @NotNull + private static String getVersion(IoStream stream) throws IOException { + writeCan232Command(stream, "V"); + + StringBuilder sb = readCan232Response(stream); + return sb.toString(); + } + + @NotNull + private static StringBuilder readCan232Response(IoStream stream) throws IOException { + StringBuilder sb = new StringBuilder(); + while (sb.length() < MAX_VERSION_LENGTH) { + char c = (char) stream.getDataBuffer().readByte(); + if (c == '\r') { + break; + } + sb.append(c); + } + return sb; + } + + private static void writeCan232Command(IoStream stream, String command) throws IOException { + byte[] bytes = (command + "\r").getBytes(); + stream.write(bytes); + stream.flush(); + } +} diff --git a/java_console/io/src/main/java/com/rusefi/can232/CanPacket.java b/java_console/io/src/main/java/com/rusefi/can232/CanPacket.java new file mode 100644 index 0000000000..7762441c68 --- /dev/null +++ b/java_console/io/src/main/java/com/rusefi/can232/CanPacket.java @@ -0,0 +1,44 @@ +package com.rusefi.can232; + +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; + +public class CanPacket { + private final int id; + private final byte[] payload; + + public CanPacket(int id, byte[] payload) { + this.id = id; + this.payload = payload; + } + + @NotNull + static CanPacket parse(String string) { + String extId = string.substring(1, 9); + String len = string.substring(9, 10); + String payloadString = string.substring(10); + + int id = Integer.parseInt(extId, 16); + byte[] payload = new byte[Integer.parseInt(len)]; + + CanPacket p = new CanPacket(id, payload); + return p; + } + + public int getId() { + return id; + } + + public byte[] getPayload() { + return payload; + } + + @Override + public String toString() { + return "CanPacket{" + + "id=" + String.format("%x", id) + + ", payload=" + Arrays.toString(payload) + + '}'; + } +} diff --git a/java_console/io/src/test/java/com/rusefi/can232/Can232ParsingTest.java b/java_console/io/src/test/java/com/rusefi/can232/Can232ParsingTest.java new file mode 100644 index 0000000000..24f1c6fefc --- /dev/null +++ b/java_console/io/src/test/java/com/rusefi/can232/Can232ParsingTest.java @@ -0,0 +1,17 @@ +package com.rusefi.can232; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class Can232ParsingTest { + @Test + public void extT() { + String string = "T0EF5000020200"; + + CanPacket p = CanPacket.parse(string); + + assertEquals(0xEF50000, p.getId()); + assertEquals(2, p.getPayload().length); + } +}