From 4b7f47ba6c4c0d01f6198d037baad7f011a81953 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 15 Nov 2016 11:56:14 +0100 Subject: [PATCH] Pebble 2: add Workout system app to app manager on P2 and hexdump incoming HRM datalog --- .../AbstractAppManagerFragment.java | 16 ++++++++--- .../AppManagerFragmentInstalledApps.java | 11 +++++--- .../pebble/DatalogSessionHealthHR.java | 27 +++++++++++++++++++ .../DatalogSessionHealthOverlayData.java | 6 ++--- .../pebble/DatalogSessionHealthSleep.java | 6 ++--- .../pebble/DatalogSessionHealthSteps.java | 6 ++--- .../pebble/DatalogSessionPebbleHealth.java | 4 +-- .../devices/pebble/PebbleProtocol.java | 3 +++ .../gadgetbridge/util/PebbleUtils.java | 10 +++++++ 9 files changed, 71 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthHR.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java index bd4670c3f..451d505e6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java @@ -182,10 +182,18 @@ public abstract class AbstractAppManagerFragment extends Fragment { cachedAppList.add(new GBDeviceApp(UUID.fromString("cf1e816a-9db0-4511-bbb8-f60c48ca8fac"), "Golf (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); } */ - if (mGBDevice != null && !"aplite".equals(PebbleUtils.getPlatformName(mGBDevice.getModel()))) { - if (baseName.equals(PebbleProtocol.UUID_PEBBLE_HEALTH.toString())) { - cachedAppList.add(new GBDeviceApp(PebbleProtocol.UUID_PEBBLE_HEALTH, "Health (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); - continue; + if (mGBDevice != null) { + if (PebbleUtils.hasHealth(mGBDevice.getModel())) { + if (baseName.equals(PebbleProtocol.UUID_PEBBLE_HEALTH.toString())) { + cachedAppList.add(new GBDeviceApp(PebbleProtocol.UUID_PEBBLE_HEALTH, "Health (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); + continue; + } + } + if (PebbleUtils.hasHRM(mGBDevice.getModel())) { + if (baseName.equals(PebbleProtocol.UUID_WORKOUT.toString())) { + cachedAppList.add(new GBDeviceApp(PebbleProtocol.UUID_WORKOUT, "Workout (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); + continue; + } } } if (uuids == null) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AppManagerFragmentInstalledApps.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AppManagerFragmentInstalledApps.java index d49e9e21a..6cf8bfbbc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AppManagerFragmentInstalledApps.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AppManagerFragmentInstalledApps.java @@ -20,9 +20,14 @@ public class AppManagerFragmentInstalledApps extends AbstractAppManagerFragment systemApps.add(new GBDeviceApp(UUID.fromString("67a32d95-ef69-46d4-a0b9-854cc62f97f9"), "Alarms (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); systemApps.add(new GBDeviceApp(UUID.fromString("18e443ce-38fd-47c8-84d5-6d0c775fbe55"), "Watchfaces (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); - if (mGBDevice != null && !"aplite".equals(PebbleUtils.getPlatformName(mGBDevice.getModel()))) { - systemApps.add(new GBDeviceApp(UUID.fromString("0863fc6a-66c5-4f62-ab8a-82ed00a98b5d"), "Send Text (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); - systemApps.add(new GBDeviceApp(PebbleProtocol.UUID_PEBBLE_HEALTH, "Health (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); + if (mGBDevice != null) { + if (PebbleUtils.hasHealth(mGBDevice.getModel())) { + systemApps.add(new GBDeviceApp(UUID.fromString("0863fc6a-66c5-4f62-ab8a-82ed00a98b5d"), "Send Text (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); + systemApps.add(new GBDeviceApp(PebbleProtocol.UUID_PEBBLE_HEALTH, "Health (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); + } + if (PebbleUtils.hasHRM(mGBDevice.getModel())) { + systemApps.add(new GBDeviceApp(PebbleProtocol.UUID_WORKOUT, "Workout (System)", "Pebble Inc.", "", GBDeviceApp.Type.APP_SYSTEM)); + } } return systemApps; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthHR.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthHR.java new file mode 100644 index 000000000..2f70e1f4c --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthHR.java @@ -0,0 +1,27 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.ByteBuffer; +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.util.GB; + +class DatalogSessionHealthHR extends DatalogSessionPebbleHealth { + + private static final Logger LOG = LoggerFactory.getLogger(DatalogSessionHealthHR.class); + + DatalogSessionHealthHR(byte id, UUID uuid, int tag, byte item_type, short item_size, GBDevice device) { + super(id, uuid, tag, item_type, item_size, device); + taginfo = "(Health - HR " + tag + " )"; + } + + @Override + public boolean handleMessage(ByteBuffer datalogMessage, int length) { + LOG.info("DATALOG " + taginfo + GB.hexdump(datalogMessage.array(), datalogMessage.position(), length)); + + return isPebbleHealthEnabled(); + } +} \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthOverlayData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthOverlayData.java index 98e132611..e41d8f325 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthOverlayData.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthOverlayData.java @@ -24,7 +24,7 @@ class DatalogSessionHealthOverlayData extends DatalogSessionPebbleHealth { public DatalogSessionHealthOverlayData(byte id, UUID uuid, int tag, byte item_type, short item_size, GBDevice device) { super(id, uuid, tag, item_type, item_size, device); - taginfo = "(health - overlay data " + tag + " )"; + taginfo = "(Health - overlay data " + tag + " )"; } @Override @@ -85,7 +85,7 @@ class DatalogSessionHealthOverlayData extends DatalogSessionPebbleHealth { int durationSeconds; byte[] rawData; - public OverlayRecord(byte[] rawData) { + OverlayRecord(byte[] rawData) { this.rawData = rawData; ByteBuffer record = ByteBuffer.wrap(rawData); record.order(ByteOrder.LITTLE_ENDIAN); @@ -99,7 +99,7 @@ class DatalogSessionHealthOverlayData extends DatalogSessionPebbleHealth { this.durationSeconds = record.getInt(); } - public byte[] getRawData() { + byte[] getRawData() { if (storePebbleHealthRawRecord()) { return rawData; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java index fef497f20..d6534ef71 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSleep.java @@ -24,7 +24,7 @@ class DatalogSessionHealthSleep extends DatalogSessionPebbleHealth { public DatalogSessionHealthSleep(byte id, UUID uuid, int tag, byte item_type, short item_size, GBDevice device) { super(id, uuid, tag, item_type, item_size, device); - taginfo = "(health - sleep " + tag + " )"; + taginfo = "(Health - sleep " + tag + " )"; } @Override @@ -87,7 +87,7 @@ class DatalogSessionHealthSleep extends DatalogSessionPebbleHealth { int deepSleepSeconds; byte[] rawData; - public SleepRecord(byte[] rawData) { + SleepRecord(byte[] rawData) { this.rawData = rawData; ByteBuffer record = ByteBuffer.wrap(rawData); record.order(ByteOrder.LITTLE_ENDIAN); @@ -101,7 +101,7 @@ class DatalogSessionHealthSleep extends DatalogSessionPebbleHealth { this.deepSleepSeconds = record.getInt(); } - public byte[] getRawData() { + byte[] getRawData() { if (storePebbleHealthRawRecord()) { return rawData; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java index b5bd16786..86409d51a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionHealthSteps.java @@ -22,7 +22,7 @@ public class DatalogSessionHealthSteps extends DatalogSessionPebbleHealth { public DatalogSessionHealthSteps(byte id, UUID uuid, int tag, byte item_type, short item_size, GBDevice device) { super(id, uuid, tag, item_type, item_size, device); - taginfo = "(health - steps)"; + taginfo = "(Health - steps)"; } @Override @@ -110,7 +110,7 @@ public class DatalogSessionHealthSteps extends DatalogSessionPebbleHealth { int light_intensity; byte[] rawData; - public StepsRecord(int timestamp, short version, byte[] rawData) { + StepsRecord(int timestamp, short version, byte[] rawData) { this.timestamp = timestamp; this.rawData = rawData; ByteBuffer record = ByteBuffer.wrap(rawData); @@ -125,7 +125,7 @@ public class DatalogSessionHealthSteps extends DatalogSessionPebbleHealth { this.light_intensity = record.get() & 0xff; } - public byte[] getRawData() { + byte[] getRawData() { if (storePebbleHealthRawRecord()) { return rawData; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionPebbleHealth.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionPebbleHealth.java index 3d26bf68c..2aae2cb92 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionPebbleHealth.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/DatalogSessionPebbleHealth.java @@ -19,12 +19,12 @@ abstract class DatalogSessionPebbleHealth extends DatalogSession { return mDevice; } - protected boolean isPebbleHealthEnabled() { + boolean isPebbleHealthEnabled() { Prefs prefs = GBApplication.getPrefs(); return prefs.getBoolean("pebble_sync_health", true); } - protected boolean storePebbleHealthRawRecord() { + boolean storePebbleHealthRawRecord() { Prefs prefs = GBApplication.getPrefs(); return prefs.getBoolean("pebble_health_store_raw", true); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java index eca9afa95..34c85a6dc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java @@ -366,6 +366,7 @@ public class PebbleProtocol extends GBDeviceProtocol { private final ArrayList tmpUUIDS = new ArrayList<>(); public static final UUID UUID_PEBBLE_HEALTH = UUID.fromString("36d8c6ed-4c83-4fa1-a9e2-8f12dc941f8c"); // FIXME: store somewhere else, this is also accessed by other code + public static final UUID UUID_WORKOUT = UUID.fromString("fef82c82-7176-4e22-88de-35a3fc18d43f"); // FIXME: store somewhere else, this is also accessed by other code private static final UUID UUID_GBPEBBLE = UUID.fromString("61476764-7465-7262-6469-656775527a6c"); private static final UUID UUID_MORPHEUZ = UUID.fromString("5be44f1d-d262-4ea6-aa30-ddbec1e3cab2"); private static final UUID UUID_WHETHERNEAT = UUID.fromString("3684003b-a685-45f9-a713-abc6364ba051"); @@ -2020,6 +2021,8 @@ public class PebbleProtocol extends GBDeviceProtocol { mDatalogSessions.put(id, new DatalogSessionHealthSleep(id, uuid, log_tag, item_type, item_size, getDevice())); } else if (uuid.equals(UUID_ZERO) && log_tag == 84) { mDatalogSessions.put(id, new DatalogSessionHealthOverlayData(id, uuid, log_tag, item_type, item_size, getDevice())); + } else if (uuid.equals(UUID_ZERO) && log_tag == 85) { + mDatalogSessions.put(id, new DatalogSessionHealthHR(id, uuid, log_tag, item_type, item_size, getDevice())); } else { mDatalogSessions.put(id, new DatalogSession(id, uuid, log_tag, item_type, item_size)); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/PebbleUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/PebbleUtils.java index bd18cde22..f65978070 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/PebbleUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/PebbleUtils.java @@ -37,4 +37,14 @@ public class PebbleUtils { public static int getFwMajor(String fwString) { return fwString.charAt(1) - 48; } + + public static boolean hasHRM(String hwRev) { + String platformName = getPlatformName(hwRev); + return "diorite".equals(platformName) || "emery".equals(platformName); + } + + public static boolean hasHealth(String hwRev) { + String platformName = getPlatformName(hwRev); + return !"aplite".equals(platformName); + } }