mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2025-06-05 21:49:48 +02:00
added heart rate measurement base
This commit is contained in:
@@ -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_USE_ACTIVITY_HAND = "USE_ACTIVITY_HAND";
|
||||||
public static final String ITEM_LAST_HEARTBEAT = "LAST_HEARTBEAT";
|
public static final String ITEM_LAST_HEARTBEAT = "LAST_HEARTBEAT";
|
||||||
public static final String ITEM_TIMEZONE_OFFSET = "TIMEZONE_OFFSET_COUNT";
|
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 static final Logger logger = LoggerFactory.getLogger(QHybridSupport.class);
|
||||||
private final BroadcastReceiver commandReceiver;
|
private final BroadcastReceiver commandReceiver;
|
||||||
|
@@ -87,7 +87,7 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
|
|
||||||
private int lastButtonIndex = -1;
|
private int lastButtonIndex = -1;
|
||||||
|
|
||||||
Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
|
protected Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
|
||||||
|
|
||||||
public FossilWatchAdapter(QHybridSupport deviceSupport) {
|
public FossilWatchAdapter(QHybridSupport deviceSupport) {
|
||||||
super(deviceSupport);
|
super(deviceSupport);
|
||||||
@@ -442,6 +442,10 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
handleBackgroundCharacteristic(characteristic);
|
handleBackgroundCharacteristic(characteristic);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "00002a37-0000-1000-8000-00805f9b34fb": {
|
||||||
|
handleHeartRateCharacteristic(characteristic);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "3dda0002-957f-7d4a-34a6-74696673696d":
|
case "3dda0002-957f-7d4a-34a6-74696673696d":
|
||||||
case "3dda0004-957f-7d4a-34a6-74696673696d":
|
case "3dda0004-957f-7d4a-34a6-74696673696d":
|
||||||
case "3dda0005-957f-7d4a-34a6-74696673696d":
|
case "3dda0005-957f-7d4a-34a6-74696673696d":
|
||||||
@@ -484,6 +488,9 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void handleHeartRateCharacteristic(BluetoothGattCharacteristic characteristic) {
|
||||||
|
}
|
||||||
|
|
||||||
protected void handleBackgroundCharacteristic(BluetoothGattCharacteristic characteristic) {
|
protected void handleBackgroundCharacteristic(BluetoothGattCharacteristic characteristic) {
|
||||||
byte[] value = characteristic.getValue();
|
byte[] value = characteristic.getValue();
|
||||||
switch (value[1]) {
|
switch (value[1]) {
|
||||||
|
@@ -21,6 +21,7 @@ import java.util.Date;
|
|||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.Widget;
|
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.MusicSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
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.QHybridSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.RequestMtuRequest;
|
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();
|
syncSettings();
|
||||||
|
|
||||||
setTime();
|
setTime();
|
||||||
@@ -140,7 +146,7 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
|
|||||||
overwriteButtons(null);
|
overwriteButtons(null);
|
||||||
|
|
||||||
loadWidgets();
|
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
|
// 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));
|
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED));
|
||||||
@@ -154,13 +160,13 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
|
|||||||
|
|
||||||
private void loadWidgets() {
|
private void loadWidgets() {
|
||||||
CustomWidget ethWidget = new CustomWidget(0, 63);
|
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, "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));
|
ethWidget.addElement(new CustomWidgetElement(CustomWidgetElement.WidgetElementType.TYPE_TEXT, "eth", "", CustomWidgetElement.X_CENTER, CustomWidgetElement.Y_LOWER_HALF));
|
||||||
|
|
||||||
|
|
||||||
CustomWidget btcWidget = new CustomWidget(90, 63);
|
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", 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[]{
|
this.widgets = new CustomWidget[]{
|
||||||
ethWidget,
|
ethWidget,
|
||||||
btcWidget,
|
btcWidget,
|
||||||
@@ -216,10 +222,11 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
|
|||||||
// queueWrite(new FileDeleteRequest((short) 0x0700));
|
// queueWrite(new FileDeleteRequest((short) 0x0700));
|
||||||
queueWrite(new AssetFilePutRequest(
|
queueWrite(new AssetFilePutRequest(
|
||||||
widgetImages,
|
widgetImages,
|
||||||
|
(byte) 0x00,
|
||||||
this
|
this
|
||||||
));
|
));
|
||||||
|
|
||||||
queueWrite(new FileDeleteRequest((short) 0x0503));
|
// queueWrite(new FileDeleteRequest((short) 0x0503));
|
||||||
queueWrite(new ImagesSetRequest(
|
queueWrite(new ImagesSetRequest(
|
||||||
widgetImages,
|
widgetImages,
|
||||||
this
|
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
|
@Override
|
||||||
protected void handleBackgroundCharacteristic(BluetoothGattCharacteristic characteristic) {
|
protected void handleBackgroundCharacteristic(BluetoothGattCharacteristic characteristic) {
|
||||||
super.handleBackgroundCharacteristic(characteristic);
|
super.handleBackgroundCharacteristic(characteristic);
|
||||||
|
@@ -23,6 +23,7 @@ import java.nio.ByteOrder;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
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.adapter.fossil.FossilWatchAdapter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileCloseAndPutRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileCloseAndPutRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest;
|
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)0x0A, VibrationStrengthConfigItem.class);
|
||||||
itemsById.put((short)0x0C, TimeConfigItem.class);
|
itemsById.put((short)0x0C, TimeConfigItem.class);
|
||||||
itemsById.put((short)0x0D, BatteryConfigItem.class);
|
itemsById.put((short)0x0D, BatteryConfigItem.class);
|
||||||
|
itemsById.put((short)0x0E, HeartRateMeasurementModeItem.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ConfigItem[] parsePayload(byte[] data) {
|
public static ConfigItem[] parsePayload(byte[] data) {
|
||||||
@@ -228,6 +230,16 @@ public class ConfigurationPutRequest extends FilePutRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public class HeartRateMeasurementModeItem extends GenericConfigItem<Byte>{
|
||||||
|
public HeartRateMeasurementModeItem() {
|
||||||
|
this((byte)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HeartRateMeasurementModeItem(byte value) {
|
||||||
|
super((short) 14, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static public class DailyStepGoalConfigItem extends GenericConfigItem<Integer> {
|
static public class DailyStepGoalConfigItem extends GenericConfigItem<Integer> {
|
||||||
public DailyStepGoalConfigItem(){
|
public DailyStepGoalConfigItem(){
|
||||||
this(-1);
|
this(-1);
|
||||||
|
@@ -44,6 +44,8 @@ public class ConfigurationGetRequest extends FileEncryptedLookupAndGetRequest {
|
|||||||
batteryInfo.level = (short) ((ConfigurationPutRequest.BatteryConfigItem) item).getBatteryPercentage();
|
batteryInfo.level = (short) ((ConfigurationPutRequest.BatteryConfigItem) item).getBatteryPercentage();
|
||||||
batteryInfo.state = BatteryState.BATTERY_NORMAL;
|
batteryInfo.state = BatteryState.BATTERY_NORMAL;
|
||||||
getAdapter().getDeviceSupport().handleGBDeviceEvent(batteryInfo);
|
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())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user