playing with CAN232

This commit is contained in:
rusefillc 2023-07-08 21:17:48 -04:00
parent 811e292030
commit 46164b1184
3 changed files with 149 additions and 0 deletions

View File

@ -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<Integer, Long> 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<Integer, Long> 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();
}
}

View File

@ -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) +
'}';
}
}

View File

@ -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);
}
}