public static String parse(final Data data) { final int value = data.getIntValue(Data.FORMAT_UINT8, 0); switch (value) { case 6: return "Foot"; case 5: return "Ear Lobe"; case 4: return "Hand"; case 3: return "Finger"; case 2: return "Wrist"; case 1: return "Chest"; case 0: default: return "Other"; } } }
/** * Parses the alert level. * * @param data * @return alert level in human readable format */ public static String parse(final Data data) { final int value = data.getIntValue(Data.FORMAT_UINT8, 0); switch (value) { case 0: return "No Alert"; case 1: return "Mild Alert"; case 2: return "High Alert"; default: return "Reserved value (" + value + ")"; } } }
/** * This method converts the value of the characteristic to the String. The String is then logged in the nRF logger log session * @param data the characteristic data to be parsed * @return human readable value of the characteristic */ @SuppressWarnings("UnusedAssignment") public static String parse(final Data data) { int offset = 0; final int flags = data.getIntValue(Data.FORMAT_UINT8, offset++); /* * In the template we are using the HRM values as an example. * false Heart Rate Value Format is set to UINT8. Units: beats per minute (bpm) * true Heart Rate Value Format is set to UINT16. Units: beats per minute (bpm) */ final boolean value16bit = (flags & HEART_RATE_VALUE_FORMAT) > 0; // heart rate value is 8 or 16 bit long int value = data.getIntValue(value16bit ? Data.FORMAT_UINT16 : Data.FORMAT_UINT8, offset++); // bits per minute if (value16bit) offset++; // TODO parse more data return "Template Measurement: " + value + " bpm"; } }
final boolean walking = !running; final float instantaneousSpeed = (float) data.getIntValue(Data.FORMAT_UINT16, offset) / 256.0f; // 1/256 m/s offset += 2; final int instantaneousCadence = data.getIntValue(Data.FORMAT_UINT8, offset); offset += 1; instantaneousStrideLength = (float) data.getIntValue(Data.FORMAT_UINT16, offset) / 100.0f; // 1/100 m offset += 2; totalDistance = (float) data.getIntValue(Data.FORMAT_UINT32, offset) / 10.0f;
int lastWheelEventTime = 0; if (wheelRevPresent) { wheelRevolutions = data.getIntValue(Data.FORMAT_UINT32, offset); offset += 4; lastWheelEventTime = data.getIntValue(Data.FORMAT_UINT16, offset); // 1/1024 s offset += 2; int lastCrankEventTime = 0; if (crankRevPreset) { crankRevolutions = data.getIntValue(Data.FORMAT_UINT16, offset); offset += 2; lastCrankEventTime = data.getIntValue(Data.FORMAT_UINT16, offset);
final int flags = data.getIntValue(Data.FORMAT_UINT8, offset); offset += 1; final int sequenceNumber = data.getIntValue(Data.FORMAT_UINT16, offset); builder.append("Sequence Number: ").append(sequenceNumber); offset += 2; final int timeOffset = data.getIntValue(Data.FORMAT_SINT16, offset); builder.append("\nTime Offset: ").append(timeOffset).append(" min"); offset += 2; final int typeAndLocation = data.getIntValue(Data.FORMAT_UINT8, offset + 2); final int type = (typeAndLocation & 0xF0) >> 4; // TODO this way or around? final int sampleLocation = (typeAndLocation & 0x0F); final int status = data.getIntValue(Data.FORMAT_UINT16, offset); builder.append("Status:\n").append(getStatusAnnunciation(status));
final int flags = data.getIntValue(Data.FORMAT_UINT8, offset++); final int userId = data.getIntValue(Data.FORMAT_UINT8, offset); offset += 1; builder.append("\nUser ID: ").append(userId); final int status = data.getIntValue(Data.FORMAT_UINT16, offset);
public static String parse(final Data data) { int offset = 0; final int flags = data.getIntValue(Data.FORMAT_UINT8, offset++);
@Override public void onDataReceived(@NonNull final BluetoothDevice device, @NonNull final Data data) { if (data.size() < 2) { onInvalidDataReceived(device, data); return; } // Read flags int offset = 0; final int flags = data.getIntValue(Data.FORMAT_UINT8, offset); final int hearRateType = (flags & 0x01) == 0 ? Data.FORMAT_UINT8 : Data.FORMAT_UINT16; offset += 1; // Validate packet length. The type's lower nibble is its length. if (data.size() < 1 + (hearRateType & 0x0F)) { onInvalidDataReceived(device, data); return; } final int value = data.getIntValue(hearRateType, offset); // offset += hearRateType & 0xF; // ... // Report the parsed value(s) onSampleValueReceived(device, value); } }
@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_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); }
@Override protected void onDeviceReady() { super.onDeviceReady(); // Initialization is now ready. // The service or activity has been notified with TemplateManagerCallbacks#onDeviceReady(). // TODO Do some extra logic here, of remove onDeviceReady(). // Device is ready, let's read something here. Usually there is nothing else to be done // here, as all had been done during initialization. readCharacteristic(mOptionalCharacteristic) .with((device, data) -> { // Characteristic value has been read // Let's do some magic with it. if (data.size() > 0) { final Integer value = data.getIntValue(Data.FORMAT_UINT8, 0); log(LogContract.Log.Level.APPLICATION, "Value '" + value + "' has been read!"); } else { log(Log.WARN, "Value is empty!"); } }) .enqueue(); } };
@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); }
@SuppressWarnings("ConstantConditions") @Test public void toData() { final DataStream stream = new DataStream(); stream.write(new byte[] { 0, 1, 2, 3, 4, 5, 6}); final Data data = stream.toData(); assertEquals(0x100, data.getIntValue(Data.FORMAT_UINT16, 0).intValue()); } }
/** * Reads the battery level from the device. * * @deprecated Use {@link #readCharacteristic(BluetoothGattCharacteristic)} instead. */ @SuppressWarnings("ConstantConditions") @Deprecated protected void readBatteryLevel() { Request.newReadBatteryLevelRequest().setManager(this) .with((device, data) -> { if (data.size() == 1) { final int batteryLevel = data.getIntValue(Data.FORMAT_UINT8, 0); log(Log.INFO, "Battery Level received: " + batteryLevel + "%"); mBatteryValue = batteryLevel; final BleManagerGattCallback callback = mGattCallback; if (callback != null) { callback.onBatteryValueReceived(mBluetoothGatt, batteryLevel); } mCallbacks.onBatteryValueReceived(device, batteryLevel); } }) .enqueue(); }
/** * This method enables notifications on the Battery Level characteristic. * * @deprecated Use {@link #setNotificationCallback(BluetoothGattCharacteristic)} and * {@link #enableNotifications(BluetoothGattCharacteristic)} instead. */ @SuppressWarnings("ConstantConditions") @Deprecated protected void enableBatteryLevelNotifications() { if (mBatteryLevelNotificationCallback == null) { mBatteryLevelNotificationCallback = new ValueChangedCallback() .with((device, data) -> { if (data.size() == 1) { final int batteryLevel = data.getIntValue(Data.FORMAT_UINT8, 0); mBatteryValue = batteryLevel; final BleManagerGattCallback callback = mGattCallback; if (callback != null) { callback.onBatteryValueReceived(mBluetoothGatt, batteryLevel); } mCallbacks.onBatteryValueReceived(device, batteryLevel); } }); } Request.newEnableBatteryLevelNotificationsRequest().setManager(this) .done(device -> log(Log.INFO, "Battery Level notifications enabled")) .enqueue(); }