added heart rate measurement base

This commit is contained in:
Daniel Dakhno
2020-01-09 15:35:47 +01:00
parent 30b6837012
commit ce880b69c9
5 changed files with 46 additions and 6 deletions

View File

@@ -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;

View File

@@ -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]) {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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())));
} }
} }