@Override public Data createFromParcel(final Parcel in) { return new Data(in); }
public static Data opCode(final byte opCode) { return new Data(new byte[] { opCode }); }
public static Data opCode(final byte opCode, final byte parameter) { return new Data(new byte[] { opCode, parameter }); }
@NonNull public Data toData() { return new Data(buffer.toByteArray()); } }
public static Data from(@NonNull final String value) { return new Data(value.getBytes()); // UTF-8 }
public static Data from(@NonNull final BluetoothGattDescriptor descriptor) { return new Data(descriptor.getValue()); }
public static Data from(@NonNull final BluetoothGattCharacteristic characteristic) { return new Data(characteristic.getValue()); }
/** * Method called when packet has been sent and confirmed (when Write With Response was used), * or added to local outgoing buffer (when Write Without Response was used). * * @param device the target device. * @param data the data received in the * {@link android.bluetooth.BluetoothGattCallback#onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int)}. * @return True, if the data received are equal to data sent. */ boolean notifyPacketSent(@NonNull final BluetoothDevice device, @Nullable final byte[] data) { if (progressCallback != null) progressCallback.onPacketSent(device, data, count); count++; if (complete && valueCallback != null) valueCallback.onDataSent(device, new Data(WriteRequest.this.data)); return Arrays.equals(data, currentChunk); }
void notifyValueChanged(@NonNull final BluetoothDevice device, @Nullable final byte[] value) { // Keep a reference to the value callback, as it may change during execution final DataReceivedCallback valueCallback = this.valueCallback; // With no value callback there is no need for any merging if (valueCallback == null) return; if (dataMerger == null) { valueCallback.onDataReceived(device, new Data(value)); } else { if (progressCallback != null) progressCallback.onPacketReceived(device, value, count); if (buffer == null) buffer = new DataStream(); if (dataMerger.merge(buffer, value, count++)) { valueCallback.onDataReceived(device, buffer.toData()); buffer = null; count = 0; } // else // wait for more packets to be merged } }
void notifyValueChanged(@NonNull final BluetoothDevice device, @Nullable final byte[] value) { // Keep a reference to the value callback, as it may change during execution final DataReceivedCallback valueCallback = this.valueCallback; // With no value callback there is no need for any merging if (valueCallback == null) { return; } if (dataMerger == null) { valueCallback.onDataReceived(device, new Data(value)); } else { if (progressCallback != null) progressCallback.onPacketReceived(device, value, count); if (buffer == null) buffer = new DataStream(); if (dataMerger.merge(buffer, value, count++)) { valueCallback.onDataReceived(device, buffer.toData()); buffer = null; count = 0; } // else // wait for more packets to be merged } } }
@Test public void getValue_UINT16() { final Data data = new Data(new byte[] {(byte) 0xD0, 0x67 }); final int value = data.getIntValue(Data.FORMAT_UINT16, 0); assertEquals(26576, value); }
@Test public void getValue_UINT24() { final Data data = new Data(new byte[] { 0x03, 0x02, 0x01}); final int value = data.getIntValue(Data.FORMAT_UINT24, 0); assertEquals(0x010203, value); }
@Test public void getValue_SINT32() { final Data data = new Data(new byte[] { (byte) 0x00, (byte) 0xFD, (byte) 0xFD, (byte) 0xFE}); final int value = data.getIntValue(Data.FORMAT_UINT32, 0); assertEquals(0xfefdfd00, value); }
@Test public void write_data() { final DataStream stream = new DataStream(); final Data data1 = new Data(new byte[] { 0, 2, 4, 6, 8 }); final Data data2 = new Data(new byte[] { 1, 3, 5, 7, 9 }); stream.write(data1); stream.write(data2); assertArrayEquals(new byte[] { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9}, stream.toByteArray()); }
@Test public void getValue_UINT8() { final Data data = new Data(new byte[] {(byte) 0xC8 }); final int value = data.getIntValue(Data.FORMAT_UINT8, 0); assertEquals(200, value); }
@Test public void getValue_UINT32() { final Data data = new Data(new byte[] { 0x04, 0x03, 0x02, 0x01}); final int value = data.getIntValue(Data.FORMAT_UINT32, 0); assertEquals(0x01020304, value); }
@Test public void getValue_UINT32_big() { final Data data = new Data(new byte[] { 0x01, 0x00, 0x00, (byte) 0xF0}); final long value = data.getLongValue(Data.FORMAT_UINT32, 0); assertEquals(0xF0000001L, value); } }
@Test public void getValue_SINT8() { final Data data = new Data(new byte[] { (byte) 0x88 }); final int value = data.getIntValue(Data.FORMAT_SINT8, 0); assertEquals(-120, value); }
@Test public void getValue_SINT16() { final Data data = new Data(new byte[] { (byte) 0xD0, (byte) 0xE7 }); final int value = data.getIntValue(Data.FORMAT_SINT16, 0); assertEquals(-6192, value); }
void notifyValueChanged(final BluetoothDevice device, final byte[] value) { // Keep a reference to the value callback, as it may change during execution final DataReceivedCallback valueCallback = this.valueCallback; // With no value callback there is no need for any merging if (valueCallback == null) { return; } if (dataMerger == null) { valueCallback.onDataReceived(device, new Data(value)); } else { if (progressCallback != null) progressCallback.onPacketReceived(device, value, count); if (buffer == null) buffer = new DataStream(); if (dataMerger.merge(buffer, value, count++)) { valueCallback.onDataReceived(device, buffer.toData()); buffer = null; count = 0; } // else // wait for more packets to be merged } }