can-log-tools/reader/src/main/java/com/rusefi/can/CANPacket.java

92 lines
2.3 KiB
Java

package com.rusefi.can;
import com.rusefi.util.BitMathUtil;
public class CANPacket {
private final double timeStamp;
private final int id;
private final byte[] data;
public CANPacket(double timeStamp, int id, byte[] data) {
this.timeStamp = timeStamp;
this.id = id;
this.data = data;
}
public StringBuilder asLua(String arrayName) {
StringBuilder result = new StringBuilder();
result.append(arrayName + " = {");
byte[] data = getData();
// System.out.println(String.format("Got ECU 0x%x", getId()) + " " + data.length);
for (int index = 0; index < data.length; index++) {
if (index > 0)
result.append(", ");
result.append(String.format("0x%02x", data[index]));
}
result.append("}\n");
return result;
}
/**
* @param index, starting from zero
*/
public int getTwoBytesByByteIndex(int index) {
return getByBitIndex(index * 8, 16);
}
public int getByBitIndex(int bitIndex, int bitWidth) {
int byteIndex = bitIndex / 8;
int shift = bitIndex - byteIndex * 8;
int value = getUnsigned(byteIndex);
if (shift + bitIndex > 8) {
value = value + getUnsigned(byteIndex + 1) * 256;
}
return value >> shift & BitMathUtil.mask(bitWidth);
}
public double getTimeStamp() {
return timeStamp;
}
public int getId() {
return id;
}
public byte[] getData() {
return data;
}
public int getUnsigned(int i) {
return Byte.toUnsignedInt(data[i]);
}
public void assertThat(String msg, PackerAssertion assertion) {
if (!assertion.test(this))
throw new IllegalStateException("Not " + msg + " " + Utils.bytesToHexWithSpaces(data));
}
public int getUnsignedInt(int index) {
return Byte.toUnsignedInt(data[index]);
}
public Object getBytesAsString() {
StringBuilder result = new StringBuilder();
for (int index = 0; index < data.length; index++) {
if (index > 0)
result.append(" ");
result.append(String.format("0x%02x", data[index]));
}
return result;
}
public interface PackerAssertion {
boolean test(CANPacket packet);
}
}