Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
weliem committed Sep 7, 2021
2 parents 7e78fda + cb6de7b commit c19b60a
Show file tree
Hide file tree
Showing 2 changed files with 184 additions and 0 deletions.
41 changes: 41 additions & 0 deletions blessed/src/main/java/com/welie/blessed/BluetoothBytesParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ public class BluetoothBytesParser {
*/
public static final int FORMAT_UINT16 = 0x12;

/**
* Characteristic value format type uint24
*/
public static final int FORMAT_UINT24 = 0x13;

/**
* Characteristic value format type uint32
*/
Expand All @@ -75,6 +80,11 @@ public class BluetoothBytesParser {
*/
public static final int FORMAT_SINT16 = 0x22;

/**
* Characteristic value format type sint24
*/
public static final int FORMAT_SINT24 = 0x23;

/**
* Characteristic value format type sint32
*/
Expand Down Expand Up @@ -282,6 +292,14 @@ public Integer getIntValue(final int formatType, final int offset, final ByteOrd
else
return unsignedBytesToInt(mValue[offset + 1], mValue[offset]);

case FORMAT_UINT24:
if (byteOrder == LITTLE_ENDIAN)
return unsignedBytesToInt(mValue[offset], mValue[offset + 1],
mValue[offset + 2], (byte) 0);
else
return unsignedBytesToInt(mValue[offset + 2], mValue[offset + 1],
mValue[offset], (byte) 0);

case FORMAT_UINT32:
if (byteOrder == LITTLE_ENDIAN)
return unsignedBytesToInt(mValue[offset], mValue[offset + 1],
Expand All @@ -301,6 +319,14 @@ public Integer getIntValue(final int formatType, final int offset, final ByteOrd
return unsignedToSigned(unsignedBytesToInt(mValue[offset + 1],
mValue[offset]), 16);

case FORMAT_SINT24:
if (byteOrder == LITTLE_ENDIAN)
return unsignedToSigned(unsignedBytesToInt(mValue[offset],
mValue[offset + 1], mValue[offset + 2], (byte) 0), 24);
else
return unsignedToSigned(unsignedBytesToInt(mValue[offset + 2],
mValue[offset + 1], mValue[offset], (byte) 0), 24);

case FORMAT_SINT32:
if (byteOrder == LITTLE_ENDIAN)
return unsignedToSigned(unsignedBytesToInt(mValue[offset],
Expand Down Expand Up @@ -516,6 +542,21 @@ public void setIntValue(final int value, final int formatType, final int offset)
}
break;

case FORMAT_SINT24:
newValue = intToSignedBits(newValue, 24);
// Fall-through intended
case FORMAT_UINT24:
if (internalByteOrder == LITTLE_ENDIAN) {
mValue[newOffset++] = (byte) (newValue & 0xFF);
mValue[newOffset++] = (byte) ((newValue >> 8) & 0xFF);
mValue[newOffset] = (byte) ((newValue >> 16) & 0xFF);
} else {
mValue[newOffset++] = (byte) ((newValue >> 16) & 0xFF);
mValue[newOffset++] = (byte) ((newValue >> 8) & 0xFF);
mValue[newOffset] = (byte) (newValue & 0xFF);
}
break;

case FORMAT_SINT32:
newValue = intToSignedBits(newValue, 32);
// Fall-through intended
Expand Down
143 changes: 143 additions & 0 deletions blessed/src/test/java/com/welie/blessed/BluetoothBytesParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
import static com.welie.blessed.BluetoothBytesParser.FORMAT_FLOAT;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_SFLOAT;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_SINT16;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_SINT24;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_SINT32;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_SINT8;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_UINT16;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_UINT24;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_UINT32;
import static com.welie.blessed.BluetoothBytesParser.FORMAT_UINT8;
import static java.nio.ByteOrder.BIG_ENDIAN;
Expand Down Expand Up @@ -181,6 +183,82 @@ public void parseSINT16_BigEndianTest() {
assertEquals(1020, (int) parser.getIntValue(FORMAT_SINT16, BIG_ENDIAN));
}

@Test
public void parseUINT24_LittleEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(new byte[]{1, 2, 3, 4, 5, 6});

// Read using offsets
assertEquals(0x030201, (int) parser.getIntValue(FORMAT_UINT24, 0, LITTLE_ENDIAN));
assertEquals(0x040302, (int) parser.getIntValue(FORMAT_UINT24, 1, LITTLE_ENDIAN));
assertEquals(0x050403, (int) parser.getIntValue(FORMAT_UINT24, 2, LITTLE_ENDIAN));

// Read using auto-advance offsets
assertEquals(0x030201, (int) parser.getIntValue(FORMAT_UINT24));
assertEquals(0x060504, (int) parser.getIntValue(FORMAT_UINT24));

// Read using auto-advance and byte order
parser.setOffset(0);
assertEquals(0x030201, (int) parser.getIntValue(FORMAT_UINT24, LITTLE_ENDIAN));
assertEquals(0x060504, (int) parser.getIntValue(FORMAT_UINT24, LITTLE_ENDIAN));
}

@Test
public void parseUINT24_BigEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(new byte[]{1, 2, 3, 4, 5, 6}, BIG_ENDIAN);

// Read using offsets
assertEquals(0x010203, (int) parser.getIntValue(FORMAT_UINT24, 0, BIG_ENDIAN));
assertEquals(0x020304, (int) parser.getIntValue(FORMAT_UINT24, 1, BIG_ENDIAN));
assertEquals(0x030405, (int) parser.getIntValue(FORMAT_UINT24, 2, BIG_ENDIAN));

// Read using auto-advance offsets
assertEquals(0x010203, (int) parser.getIntValue(FORMAT_UINT24));
assertEquals(0x040506, (int) parser.getIntValue(FORMAT_UINT24));

// Read using auto-advance and byte order
parser.setOffset(0);
assertEquals(0x010203, (int) parser.getIntValue(FORMAT_UINT24, BIG_ENDIAN));
assertEquals(0x040506, (int) parser.getIntValue(FORMAT_UINT24, BIG_ENDIAN));
}

@Test
public void parseSINT24_LittleEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(new byte[]{1, -2, 3, -4, 5, -6});

// Read using offsets
assertEquals(0x03FE01, (int) parser.getIntValue(FORMAT_SINT24, 0, LITTLE_ENDIAN));
assertEquals(0xFC03FE - 0xFFFFFF - 1, (int) parser.getIntValue(FORMAT_SINT24, 1, LITTLE_ENDIAN));
assertEquals(0x05FC03, (int) parser.getIntValue(FORMAT_SINT24, 2, LITTLE_ENDIAN));

// Read using auto-advance offsets
assertEquals(0x03FE01, (int) parser.getIntValue(FORMAT_SINT24));
assertEquals(0xFA05FC - 0xFFFFFF - 1, (int) parser.getIntValue(FORMAT_SINT24));

// Read using auto-advance and byte order
parser.setOffset(0);
assertEquals(0x03FE01, (int) parser.getIntValue(FORMAT_SINT24, LITTLE_ENDIAN));
assertEquals(0xFA05FC - 0xFFFFFF - 1, (int) parser.getIntValue(FORMAT_SINT24, LITTLE_ENDIAN));
}

@Test
public void parseSINT24_BigEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(new byte[]{1, -2, 3, -4, 5, -6}, BIG_ENDIAN);

// Read using offsets
assertEquals(0x01FE03, (int) parser.getIntValue(FORMAT_SINT24, 0, BIG_ENDIAN));
assertEquals(0xFE03FC - 0xFFFFFF - 1, (int) parser.getIntValue(FORMAT_SINT24, 1, BIG_ENDIAN));
assertEquals(0x03FC05, (int) parser.getIntValue(FORMAT_SINT24, 2, BIG_ENDIAN));

// Read using auto-advance offsets
assertEquals(0x01FE03, (int) parser.getIntValue(FORMAT_SINT24));
assertEquals(0xFC05FA - 0xFFFFFF - 1, (int) parser.getIntValue(FORMAT_SINT24));

// Read using auto-advance and byte order
parser.setOffset(0);
assertEquals(0x01FE03, (int) parser.getIntValue(FORMAT_SINT24, BIG_ENDIAN));
assertEquals(0xFC05FA - 0xFFFFFF - 1, (int) parser.getIntValue(FORMAT_SINT24, BIG_ENDIAN));
}

@Test
public void parseUINT32_LittleEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(new byte[]{1, 2, 3, 4, 5, 6, 7, 8});
Expand Down Expand Up @@ -558,6 +636,71 @@ public void setSINT16_BigEndianTest() {
assertEquals(5678, (int)parser.getIntValue(FORMAT_SINT16));
}

@Test
public void setUINT24_LittleEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(LITTLE_ENDIAN);
parser.setIntValue(0x010203, FORMAT_UINT24);
assertEquals(0x010203, (int) parser.getIntValue(FORMAT_UINT24, 0, LITTLE_ENDIAN));

// Add 2 values after each other
parser = new BluetoothBytesParser(LITTLE_ENDIAN);
parser.setIntValue(0x010203, FORMAT_UINT24);
parser.setIntValue(0x040506, FORMAT_UINT24);
assertEquals(6, parser.getValue().length);
parser.setOffset(0);
assertEquals(0x010203, (int)parser.getIntValue(FORMAT_UINT24));
assertEquals(0x040506, (int)parser.getIntValue(FORMAT_UINT24));
}

@Test
public void setUINT24_BigEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(BIG_ENDIAN);
parser.setIntValue(0x010203, FORMAT_UINT24);
assertEquals(0x010203, (int) parser.getIntValue(FORMAT_UINT24, 0, BIG_ENDIAN));

// Add 2 values after each other
parser = new BluetoothBytesParser(BIG_ENDIAN);
parser.setIntValue(0x010203, FORMAT_UINT24);
parser.setIntValue(0x040506, FORMAT_UINT24);
assertEquals(6, parser.getValue().length);
parser.setOffset(0);
assertEquals(0x010203, (int)parser.getIntValue(FORMAT_UINT24));
assertEquals(0x040506, (int)parser.getIntValue(FORMAT_UINT24));
}

@Test
public void setSINT24_LittleEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(LITTLE_ENDIAN);
parser.setIntValue(-0x010203, FORMAT_SINT24);
assertEquals(-0x010203, (int) parser.getIntValue(FORMAT_SINT24, 0, LITTLE_ENDIAN));

// Add 2 values after each other
parser = new BluetoothBytesParser(LITTLE_ENDIAN);
parser.setIntValue(-0x010203, FORMAT_SINT24);
parser.setIntValue(0x040506, FORMAT_SINT24);
assertEquals(6, parser.getValue().length);

parser.setOffset(0);
assertEquals(-0x010203, (int)parser.getIntValue(FORMAT_SINT24));
assertEquals(0x040506, (int)parser.getIntValue(FORMAT_SINT24));
}

@Test
public void setSINT24_BigEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(BIG_ENDIAN);
parser.setIntValue(-0x010203, FORMAT_SINT24);
assertEquals(-0x010203, (int) parser.getIntValue(FORMAT_SINT24, 0, BIG_ENDIAN));

// Add 2 values after each other
parser = new BluetoothBytesParser(BIG_ENDIAN);
parser.setIntValue(-0x010203, FORMAT_SINT24);
parser.setIntValue(0x040506, FORMAT_SINT24);
assertEquals(6, parser.getValue().length);
parser.setOffset(0);
assertEquals(-0x010203, (int)parser.getIntValue(FORMAT_SINT24));
assertEquals(0x040506, (int)parser.getIntValue(FORMAT_SINT24));
}

@Test
public void setUINT32_LittleEndianTest() {
BluetoothBytesParser parser = new BluetoothBytesParser(LITTLE_ENDIAN);
Expand Down

0 comments on commit c19b60a

Please sign in to comment.