From da29766fd0d7b720a9e7553eb18ce672d7588b48 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 4 Sep 2022 19:11:31 +0200 Subject: [PATCH] BLE: BluetoothConnectionManager supports multiple BLE services per sensor type (e.g., cadence). Part of #1352. --- .../sensors/BluetoothConnectionManager.java | 32 ++++++++++++++----- .../opentracks/sensors/BluetoothUtils.java | 6 ++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothConnectionManager.java b/src/main/java/de/dennisguse/opentracks/sensors/BluetoothConnectionManager.java index 823d24c66..20138971c 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothConnectionManager.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/BluetoothConnectionManager.java @@ -30,6 +30,8 @@ import android.util.Log; import androidx.annotation.NonNull; +import java.util.List; + import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.sensors.sensorData.SensorData; import de.dennisguse.opentracks.sensors.sensorData.SensorDataHeartRate; @@ -44,7 +46,7 @@ public abstract class BluetoothConnectionManager { private final SensorDataObserver observer; - private final ServiceMeasurementUUID sensor; + private final List serviceMeasurementUUIDs; private BluetoothGatt bluetoothGatt; private final BluetoothGattCallback connectCallback = new BluetoothGattCallback() { @@ -73,15 +75,24 @@ public abstract class BluetoothConnectionManager { @Override public void onServicesDiscovered(@NonNull BluetoothGatt gatt, int status) { - BluetoothGattService service = gatt.getService(sensor.getServiceUUID()); - if (service == null) { - Log.e(TAG, "Could not get service for address=" + gatt.getDevice().getAddress() + " serviceUUID=" + sensor); + BluetoothGattService gattService = null; + ServiceMeasurementUUID serviceMeasurement = null; + for (ServiceMeasurementUUID s : serviceMeasurementUUIDs) { + gattService = gatt.getService(s.getServiceUUID()); + if (gattService != null) { + serviceMeasurement = s; + break; + } + } + + if (gattService == null) { + Log.e(TAG, "Could not get gattService for address=" + gatt.getDevice().getAddress() + " serviceUUID=" + serviceMeasurement); return; } - BluetoothGattCharacteristic characteristic = service.getCharacteristic(sensor.getMeasurementUUID()); + BluetoothGattCharacteristic characteristic = gattService.getCharacteristic(serviceMeasurement.getMeasurementUUID()); if (characteristic == null) { - Log.e(TAG, "Could not get BluetoothCharacteristic for address=" + gatt.getDevice().getAddress() + " serviceUUID=" + sensor + " characteristicUUID=" + sensor.getMeasurementUUID()); + Log.e(TAG, "Could not get BluetoothCharacteristic for address=" + gatt.getDevice().getAddress() + " serviceUUID=" + serviceMeasurement.getServiceUUID() + " characteristicUUID=" + serviceMeasurement.getMeasurementUUID()); return; } gatt.setCharacteristicNotification(characteristic, true); @@ -115,7 +126,12 @@ public abstract class BluetoothConnectionManager { }; BluetoothConnectionManager(ServiceMeasurementUUID serviceUUUID, SensorDataObserver observer) { - this.sensor = serviceUUUID; + this.serviceMeasurementUUIDs = List.of(serviceUUUID); + this.observer = observer; + } + + BluetoothConnectionManager(List serviceUUUID, SensorDataObserver observer) { + this.serviceMeasurementUUIDs = serviceUUUID; this.observer = observer; } @@ -169,7 +185,7 @@ public abstract class BluetoothConnectionManager { public static class HeartRateConnectionManager extends BluetoothConnectionManager { HeartRateConnectionManager(@NonNull SensorDataObserver observer) { - super(BluetoothUtils.HEARTRATE, observer); + super(BluetoothUtils.HEART_RATE_SUPPORTING_DEVICES, observer); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothUtils.java b/src/main/java/de/dennisguse/opentracks/sensors/BluetoothUtils.java index 1450b4842..d94fd0cc4 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/BluetoothUtils.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/BluetoothUtils.java @@ -52,6 +52,7 @@ public class BluetoothUtils { new UUID(0x2A3700001000L, 0x800000805f9b34fbL) ); + // Used for device discovery in preferences public static final List HEART_RATE_SUPPORTING_DEVICES = Collections.unmodifiableList(Arrays.asList( HEARTRATE, //Devices that support HEART_RATE_SERVICE_UUID, but do not announce HEART_RATE_SERVICE_UUID in there BLE announcement messages (during device discovery). @@ -71,6 +72,11 @@ public class BluetoothUtils { new UUID(0x2A5B00001000L, 0x800000805f9b34fbL) ); + public static final List CYCLING_CADENCE = List.of( + CYCLING_POWER, + CYCLING_SPEED_CADENCE + ); + public static final ServiceMeasurementUUID RUNNING_SPEED_CADENCE = new ServiceMeasurementUUID( new UUID(0x181400001000L, 0x800000805f9b34fbL), new UUID(0x2A5300001000L, 0x800000805f9b34fbL)