packet decoding
This commit is contained in:
parent
10fc23535c
commit
9dfe9cde8d
|
@ -11,6 +11,10 @@ public class CANPacket {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getTwoBytes(int index) {
|
||||||
|
return getUnsigned(index + 1) * 256 + getUnsigned(index);
|
||||||
|
}
|
||||||
|
|
||||||
public double getTimeStamp() {
|
public double getTimeStamp() {
|
||||||
return timeStamp;
|
return timeStamp;
|
||||||
}
|
}
|
||||||
|
@ -22,4 +26,8 @@ public class CANPacket {
|
||||||
public byte[] getData() {
|
public byte[] getData() {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getUnsigned(int i) {
|
||||||
|
return Byte.toUnsignedInt(data[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.rusefi.can;
|
||||||
|
|
||||||
|
public enum SensorType {
|
||||||
|
RPM,
|
||||||
|
CLT,
|
||||||
|
PPS,
|
||||||
|
MAP,
|
||||||
|
FUEL_AMOUNT,
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue