packet decoding
This commit is contained in:
parent
10fc23535c
commit
9dfe9cde8d
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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