diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java index 8ea0e8fc0..9c0ffe960 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/QHybridSupport.java @@ -110,6 +110,7 @@ public class QHybridSupport extends QHybridBaseSupport { public static final String ITEM_USE_ACTIVITY_HAND = "USE_ACTIVITY_HAND"; public static final String ITEM_LAST_HEARTBEAT = "LAST_HEARTBEAT"; public static final String ITEM_TIMEZONE_OFFSET = "TIMEZONE_OFFSET_COUNT"; + public static final String ITEM_HEART_RATE_MEASUREMENT_MODE = "HEART_RATE_MEASUREMENT_MODE"; private static final Logger logger = LoggerFactory.getLogger(QHybridSupport.class); private final BroadcastReceiver commandReceiver; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java index e4d2c1e98..b5f1c54a9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java @@ -87,7 +87,7 @@ public class FossilWatchAdapter extends WatchAdapter { private int lastButtonIndex = -1; - Logger logger = LoggerFactory.getLogger(getClass().getSimpleName()); + protected Logger logger = LoggerFactory.getLogger(getClass().getSimpleName()); public FossilWatchAdapter(QHybridSupport deviceSupport) { super(deviceSupport); @@ -442,6 +442,10 @@ public class FossilWatchAdapter extends WatchAdapter { handleBackgroundCharacteristic(characteristic); break; } + case "00002a37-0000-1000-8000-00805f9b34fb": { + handleHeartRateCharacteristic(characteristic); + break; + } case "3dda0002-957f-7d4a-34a6-74696673696d": case "3dda0004-957f-7d4a-34a6-74696673696d": case "3dda0005-957f-7d4a-34a6-74696673696d": @@ -484,6 +488,9 @@ public class FossilWatchAdapter extends WatchAdapter { return true; } + public void handleHeartRateCharacteristic(BluetoothGattCharacteristic characteristic) { + } + protected void handleBackgroundCharacteristic(BluetoothGattCharacteristic characteristic) { byte[] value = characteristic.getValue(); switch (value[1]) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java index c613ab9b6..d9c8ae8bf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil_hr/FossilHRWatchAdapter.java @@ -21,6 +21,7 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.Random; import java.util.TimeZone; +import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.Widget; @@ -31,6 +32,7 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec; import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; +import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.RequestMtuRequest; @@ -133,6 +135,10 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter { )); }*/ + // no effect + // negotiateSymmetricKey(); + // queueWrite(new ConfigurationPutRequest(new nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest.HeartRateMeasurementModeItem((byte) 2), this)); + syncSettings(); setTime(); @@ -140,7 +146,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter { overwriteButtons(null); loadWidgets(); - renderWidgets(); + // renderWidgets(); // dunno if there is any point in doing this at start since when no watch is connected the QHybridSupport will not receive any intents anyway queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED)); @@ -154,13 +160,13 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter { private void loadWidgets() { CustomWidget ethWidget = new CustomWidget(0, 63); - ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "date", "-", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF)); - ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "eth", "-", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF)); + ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "date", "wtf", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF)); + ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "eth", "", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF)); CustomWidget btcWidget = new CustomWidget(90, 63); btcWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "", "BTC", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_UPPER_HALF)); - btcWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "btc", "wtf", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF)); + btcWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "btc", "", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF)); this.widgets = new CustomWidget[]{ ethWidget, btcWidget, @@ -216,10 +222,11 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter { // queueWrite(new FileDeleteRequest((short) 0x0700)); queueWrite(new AssetFilePutRequest( widgetImages, + (byte) 0x00, this )); - queueWrite(new FileDeleteRequest((short) 0x0503)); + // queueWrite(new FileDeleteRequest((short) 0x0503)); queueWrite(new ImagesSetRequest( widgetImages, this @@ -394,6 +401,17 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter { } } + @Override + public void handleHeartRateCharacteristic(BluetoothGattCharacteristic characteristic) { + super.handleHeartRateCharacteristic(characteristic); + + byte[] value = characteristic.getValue(); + + int heartRate = value[1]; + + logger.debug("heart rate: " + heartRate); + } + @Override protected void handleBackgroundCharacteristic(BluetoothGattCharacteristic characteristic) { super.handleBackgroundCharacteristic(characteristic); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/configuration/ConfigurationPutRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/configuration/ConfigurationPutRequest.java index 56c9f8f9c..98ccebf7a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/configuration/ConfigurationPutRequest.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil/configuration/ConfigurationPutRequest.java @@ -23,6 +23,7 @@ import java.nio.ByteOrder; import java.util.ArrayList; import java.util.HashMap; +import nodomain.freeyourgadget.gadgetbridge.model.GenericItem; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileCloseAndPutRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest; @@ -37,6 +38,7 @@ public class ConfigurationPutRequest extends FilePutRequest { itemsById.put((short)0x0A, VibrationStrengthConfigItem.class); itemsById.put((short)0x0C, TimeConfigItem.class); itemsById.put((short)0x0D, BatteryConfigItem.class); + itemsById.put((short)0x0E, HeartRateMeasurementModeItem.class); } public static ConfigItem[] parsePayload(byte[] data) { @@ -228,6 +230,16 @@ public class ConfigurationPutRequest extends FilePutRequest { } } + static public class HeartRateMeasurementModeItem extends GenericConfigItem{ + public HeartRateMeasurementModeItem() { + this((byte)-1); + } + + public HeartRateMeasurementModeItem(byte value) { + super((short) 14, value); + } + } + static public class DailyStepGoalConfigItem extends GenericConfigItem { public DailyStepGoalConfigItem(){ this(-1); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil_hr/configuration/ConfigurationGetRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil_hr/configuration/ConfigurationGetRequest.java index c36ae3e92..63bb0cde4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil_hr/configuration/ConfigurationGetRequest.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/fossil_hr/configuration/ConfigurationGetRequest.java @@ -44,6 +44,8 @@ public class ConfigurationGetRequest extends FileEncryptedLookupAndGetRequest { batteryInfo.level = (short) ((ConfigurationPutRequest.BatteryConfigItem) item).getBatteryPercentage(); batteryInfo.state = BatteryState.BATTERY_NORMAL; getAdapter().getDeviceSupport().handleGBDeviceEvent(batteryInfo); + }else if(item instanceof ConfigurationPutRequest.HeartRateMeasurementModeItem){ + device.addDeviceInfo(new GenericItem(QHybridSupport.ITEM_HEART_RATE_MEASUREMENT_MODE, String.valueOf(((ConfigurationPutRequest.HeartRateMeasurementModeItem) item).getValue()))); } }