packet decoding

This commit is contained in:
rusefillc 2022-02-03 00:03:56 -05:00
parent 10fc23535c
commit 9dfe9cde8d
10 changed files with 181 additions and 0 deletions

View File

@ -11,6 +11,10 @@ public class CANPacket {
this.data = data;
}
public int getTwoBytes(int index) {
return getUnsigned(index + 1) * 256 + getUnsigned(index);
}
public double getTimeStamp() {
return timeStamp;
}
@ -22,4 +26,8 @@ public class CANPacket {
public byte[] getData() {
return data;
}
public int getUnsigned(int i) {
return Byte.toUnsignedInt(data[i]);
}
}

View File

@ -0,0 +1,20 @@
package com.rusefi.can;
public class PacketPayload {
private final double timeStamp;
private final SensorValue[] values;
public PacketPayload(double timeStamp, SensorValue... values) {
this.timeStamp = timeStamp;
this.values = values;
}
public double getTimeStamp() {
return timeStamp;
}
public SensorValue[] getValues() {
return values;
}
}

View File

@ -0,0 +1,9 @@
package com.rusefi.can;
public enum SensorType {
RPM,
CLT,
PPS,
MAP,
FUEL_AMOUNT,
}

View File

@ -0,0 +1,19 @@
package com.rusefi.can;
public class SensorValue {
private final SensorType type;
private final double value;
public SensorValue(SensorType type, double value) {
this.type = type;
this.value = value;
}
public SensorType getType() {
return type;
}
public double getValue() {
return value;
}
}

View File

@ -0,0 +1,14 @@
package com.rusefi.can.decoders;
public abstract class AbstractPacketDecoder implements PacketDecoder {
private final int id;
public AbstractPacketDecoder(int id) {
this.id = id;
}
@Override
public int getId() {
return id;
}
}

View File

@ -0,0 +1,10 @@
package com.rusefi.can.decoders;
import com.rusefi.can.CANPacket;
import com.rusefi.can.PacketPayload;
public interface PacketDecoder {
PacketPayload decode(CANPacket packet);
int getId();
}

View File

@ -0,0 +1,21 @@
package com.rusefi.can.decoders.bmw;
import com.rusefi.can.CANPacket;
import com.rusefi.can.PacketPayload;
import com.rusefi.can.SensorType;
import com.rusefi.can.SensorValue;
import com.rusefi.can.decoders.AbstractPacketDecoder;
public class Bmw0AA extends AbstractPacketDecoder {
public Bmw0AA() {
super(0xAA);
}
@Override
public PacketPayload decode(CANPacket packet) {
SensorValue pedal = new SensorValue(SensorType.PPS, packet.getUnsigned(3) * 0.39063);
SensorValue rpm = new SensorValue(SensorType.RPM, packet.getTwoBytes(4) * 0.25);
return new PacketPayload(packet.getTimeStamp(), pedal, rpm);
}
}

View File

@ -0,0 +1,21 @@
package com.rusefi.can.decoders.bmw;
import com.rusefi.can.CANPacket;
import com.rusefi.can.PacketPayload;
import com.rusefi.can.SensorType;
import com.rusefi.can.SensorValue;
import com.rusefi.can.decoders.AbstractPacketDecoder;
public class Bmw1D0 extends AbstractPacketDecoder {
public Bmw1D0() {
super(0x1d0);
}
@Override
public PacketPayload decode(CANPacket packet) {
SensorValue clt = new SensorValue(SensorType.CLT, packet.getUnsigned(0) - 48);
SensorValue map = new SensorValue(SensorType.MAP, packet.getUnsigned(3) * 0.2 + 59.8);
SensorValue fuel = new SensorValue(SensorType.FUEL_AMOUNT, packet.getTwoBytes(4));
return new PacketPayload(packet.getTimeStamp(), clt, map, fuel);
}
}

View File

@ -0,0 +1,22 @@
package com.rusefi.can.decoders.bmw;
import com.rusefi.can.decoders.PacketDecoder;
import java.util.HashMap;
import java.util.Map;
public class BmwRegistry {
BmwRegistry INSTANCE = new BmwRegistry();
public Map<Integer, PacketDecoder> decoderMap = new HashMap<>();
public BmwRegistry() {
register(new Bmw0AA());
register(new Bmw1D0());
}
private void register(PacketDecoder decoder) {
decoderMap.put(decoder.getId(), decoder);
}
}

View File

@ -0,0 +1,37 @@
package com.rusefi.can;
import com.rusefi.can.decoders.bmw.Bmw0AA;
import com.rusefi.can.decoders.bmw.Bmw1D0;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class BmwE65DecoderTest {
@Test
public void decodeRpm() {
CANPacket packetAA = new CANPacket(1,
0xAA,
new byte[]{0x39, 0x47, 0x02, 0x00, (byte) 0x87, 0x0A, (byte) 0x80, 0x33});
PacketPayload payload = new Bmw0AA().decode(packetAA);
assertEquals(2, payload.getValues().length);
assertValue(SensorType.PPS, 0.0, payload.getValues()[0]);
assertValue(SensorType.RPM, 673.75, payload.getValues()[1]);
}
@Test
public void decodeClt() {
CANPacket packet1D0 = new CANPacket(1,
0x1D0, new byte[]{0x62, 0x41, (byte) 0xBB, (byte) 0xC6, 0x7B, 0x5F, 0x3D, (byte) 0x88});
PacketPayload payload = new Bmw1D0().decode(packet1D0);
assertEquals(3, payload.getValues().length);
assertValue(SensorType.CLT, 50.0, payload.getValues()[0]);
assertValue(SensorType.MAP, 99.4, payload.getValues()[1]);
assertValue(SensorType.FUEL_AMOUNT, 24443, payload.getValues()[2]);
}
private void assertValue(SensorType expectedType, double v, SensorValue value) {
assertEquals(expectedType, value.getType());
assertEquals(v, value.getValue(), 0.01);
}
}