From 0152a3636a5791c0f685abcd0c95f8a18fef6e97 Mon Sep 17 00:00:00 2001 From: Daniel Dakhno Date: Wed, 10 May 2023 15:51:14 +0200 Subject: [PATCH] Bicycle sensor: added basic support classes --- .../coordinator/BicycleSensorCoordinator.java | 114 ++++++++++++++++++ .../gadgetbridge/model/DeviceType.java | 1 + .../service/DeviceSupportFactory.java | 3 + .../support/BicycleSensorBaseSupport.java | 18 +++ .../support/BicycleSensorSupport.java | 54 +++++++++ .../gadgetbridge/util/DeviceHelper.java | 2 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 193 insertions(+) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bicycle_sensor/coordinator/BicycleSensorCoordinator.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorBaseSupport.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorSupport.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bicycle_sensor/coordinator/BicycleSensorCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bicycle_sensor/coordinator/BicycleSensorCoordinator.java new file mode 100644 index 000000000..7f2cc8cd0 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bicycle_sensor/coordinator/BicycleSensorCoordinator.java @@ -0,0 +1,114 @@ +package nodomain.freeyourgadget.gadgetbridge.devices.bicycle_sensor.coordinator; + +import android.app.Activity; +import android.content.Context; +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.GBException; +import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; +import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; +import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; +import nodomain.freeyourgadget.gadgetbridge.entities.Device; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate; +import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; +import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; +import nodomain.freeyourgadget.gadgetbridge.service.devices.bicycle_sensor.support.BicycleSensorSupport; + +public class BicycleSensorCoordinator extends AbstractBLEDeviceCoordinator { + @Override + protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException { + + } + + @NonNull + @Override + public DeviceType getSupportedType(GBDeviceCandidate candidate) { + if(candidate.supportsService(BicycleSensorSupport.UUID_BICYCLE_SENSOR_SERVICE)){ + return getDeviceType(); + } + return DeviceType.UNKNOWN; + } + + @Override + public DeviceType getDeviceType() { + return DeviceType.BICYCLE_SENSOR; + } + + @Nullable + @Override + public Class getPairingActivity() { + return null; + } + + @Override + public boolean supportsActivityDataFetching() { + return false; + } + + @Override + public boolean supportsActivityTracking() { + return false; + } + + @Override + public SampleProvider getSampleProvider(GBDevice device, DaoSession session) { + return null; + } + + @Override + public InstallHandler findInstallHandler(Uri uri, Context context) { + return null; + } + + @Override + public boolean supportsScreenshots() { + return false; + } + + @Override + public int getAlarmSlotCount() { + return 0; + } + + @Override + public boolean supportsSmartWakeup(GBDevice device) { + return false; + } + + @Override + public String getManufacturer() { + return "Unknown"; + } + + @Override + public boolean supportsAppsManagement() { + return false; + } + + @Override + public Class getAppsManagementActivity() { + return null; + } + + @Override + public boolean supportsCalendarEvents() { + return false; + } + + @Override + public boolean supportsRealtimeData() { + return true; + } + + @Override + public boolean supportsFindDevice() { + return false; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java index a7a32614c..d0272251a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java @@ -133,6 +133,7 @@ public enum DeviceType { SUPER_CARS(530, R.drawable.ic_device_supercars, R.drawable.ic_device_supercars_disabled, R.string.devicetype_super_cars), ASTEROIDOS(540, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_asteroidos), SOFLOW_SO6(550, R.drawable.ic_device_vesc, R.drawable.ic_device_vesc_disabled, R.string.devicetype_soflow_s06), + BICYCLE_SENSOR(560, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.device_name_bicycle_sensor), TEST(1000, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_test); private final int key; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java index d5ba1829b..390acf622 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java @@ -34,6 +34,7 @@ import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.asteroidos.AsteroidOSDeviceSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.bicycle_sensor.support.BicycleSensorSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.binary_sensor.BinarySensorSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.fitpro.FitProDeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.banglejs.BangleJSDeviceSupport; @@ -370,6 +371,8 @@ public class DeviceSupportFactory { return new ServiceDeviceSupport(new AsteroidOSDeviceSupport()); case SOFLOW_SO6: return new ServiceDeviceSupport(new SoFlowSupport()); + case BICYCLE_SENSOR: + return new ServiceDeviceSupport(new BicycleSensorSupport()); } return null; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorBaseSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorBaseSupport.java new file mode 100644 index 000000000..a2b2d1576 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorBaseSupport.java @@ -0,0 +1,18 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.bicycle_sensor.support; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.binary_sensor.BinarySensorSupport; + +public class BicycleSensorBaseSupport extends AbstractBTLEDeviceSupport { + public BicycleSensorBaseSupport(Logger logger) { + super(logger); + } + + @Override + public boolean useAutoConnect() { + return false; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorSupport.java new file mode 100644 index 000000000..daca74575 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bicycle_sensor/support/BicycleSensorSupport.java @@ -0,0 +1,54 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.bicycle_sensor.support; + +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.NotifyAction; +import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction; + +public class BicycleSensorSupport extends BicycleSensorBaseSupport{ + public final static UUID UUID_BICYCLE_SENSOR_SERVICE = + UUID.fromString("00001816-0000-1000-8000-00805f9b34fb"); + public final static UUID UUID_BICYCLE_SENSOR_CSC_MEASUREMENT = + UUID.fromString("00002a5b-0000-1000-8000-00805f9b34fb"); + + private static final Logger logger = LoggerFactory.getLogger(BicycleSensorSupport.class); + + public BicycleSensorSupport() { + super(logger); + } + + @Override + protected TransactionBuilder initializeDevice(TransactionBuilder builder) { + builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext())); + + BluetoothGattCharacteristic measurementCharacteristic = + getCharacteristic(UUID_BICYCLE_SENSOR_CSC_MEASUREMENT); + + builder.add(new NotifyAction(measurementCharacteristic, true)); + + builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZED, getContext())); + + return builder; + } + + private void handleMeasurementCharacteristic(BluetoothGattCharacteristic characteristic){ + logger.debug(characteristic.getUuid().toString()); + } + + @Override + public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { + if(characteristic.getUuid().equals(UUID_BICYCLE_SENSOR_CSC_MEASUREMENT)){ + handleMeasurementCharacteristic(characteristic); + return true; + } + return false; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java index 02806f8ac..b4cc8607c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java @@ -44,6 +44,7 @@ import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.asteroidos.AsteroidOSDeviceCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.bicycle_sensor.coordinator.BicycleSensorCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgtr3pro.AmazfitGTR3ProCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgts4.AmazfitGTS4Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitgts4mini.AmazfitGTS4MiniCoordinator; @@ -371,6 +372,7 @@ public class DeviceHelper { result.add(new SuperCarsCoordinator()); result.add(new AsteroidOSDeviceCoordinator()); result.add(new SoFlowCoordinator()); + result.add(new BicycleSensorCoordinator()); return result; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ef1103b6a..376d209f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2089,4 +2089,5 @@ Pairing with watch failed Skipping on-device confirmation Confirmation timeout, continuing + Bicycle sensor