From 845869e25e0f31460607d08364e5fe225eb66499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joa=CC=83o=20Paulo=20Barraca?= Date: Fri, 19 May 2017 10:39:21 +0100 Subject: [PATCH] HPlus: Fix intensity calculation without continuous connectivity --- .../hplus/HPlusHealthSampleProvider.java | 72 ++++++++++++------- .../devices/hplus/HPlusDataRecordDaySlot.java | 10 +-- .../devices/hplus/HPlusHandlerThread.java | 3 +- 3 files changed, 53 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusHealthSampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusHealthSampleProvider.java index 82c1b7f69..adda8dc43 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusHealthSampleProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusHealthSampleProvider.java @@ -141,6 +141,51 @@ public class HPlusHealthSampleProvider extends AbstractSampleProvider overlayRecords = qb.build().list(); + + + //Apply Overlays + for (HPlusHealthActivityOverlay overlay : overlayRecords) { + + //Create fake events to improve activity counters if there are no events around the overlay + //timestamp boundaries + //Insert one before, one at the beginning, one at the end, and one 1s after. + insertVirtualItem(samples, Math.max(overlay.getTimestampFrom() - 1, timestamp_from), overlay.getDeviceId(), overlay.getUserId()); + insertVirtualItem(samples, Math.max(overlay.getTimestampFrom(), timestamp_from), overlay.getDeviceId(), overlay.getUserId()); + insertVirtualItem(samples, Math.min(overlay.getTimestampTo() - 1, timestamp_to - 1), overlay.getDeviceId(), overlay.getUserId()); + insertVirtualItem(samples, Math.min(overlay.getTimestampTo(), timestamp_to), overlay.getDeviceId(), overlay.getUserId()); + } + + Collections.sort(samples, new Comparator() { + public int compare(HPlusHealthActivitySample one, HPlusHealthActivitySample other) { + return one.getTimestamp() - other.getTimestamp(); + } + }); + + //Apply Overlays + for (HPlusHealthActivityOverlay overlay : overlayRecords) { + + long nonSleepTimeEnd = 0; + for (HPlusHealthActivitySample sample : samples) { + + if (sample.getTimestamp() >= overlay.getTimestampFrom() && sample.getTimestamp() < overlay.getTimestampTo()) { + if(overlay.getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP || overlay.getRawKind() == ActivityKind.TYPE_DEEP_SLEEP) { + if(sample.getRawKind() == HPlusDataRecord.TYPE_DAY_SLOT && sample.getSteps() > 0){ + nonSleepTimeEnd = sample.getTimestamp() + 10 * 60; // 10 minutes + continue; + }else if(sample.getRawKind() == HPlusDataRecord.TYPE_REALTIME && sample.getTimestamp() <= nonSleepTimeEnd){ + continue; + } + + sample.setRawKind(overlay.getRawKind()); + sample.setRawIntensity(10); + } + } + } + } + + + + //Fix Step counters //Todays sample steps will come from the Day Slots messages //Historical steps will be provided by Day Summaries messages //This will allow both week and current day results to be consistent @@ -180,35 +225,8 @@ public class HPlusHealthSampleProvider extends AbstractSampleProvider= overlay.getTimestampFrom() && sample.getTimestamp() < overlay.getTimestampTo()) { - if(overlay.getRawKind() == ActivityKind.TYPE_LIGHT_SLEEP || overlay.getRawKind() == ActivityKind.TYPE_DEEP_SLEEP) - sample.setRawIntensity(10); - - sample.setRawKind(overlay.getRawKind()); - } - } - } - detachFromSession(); - Collections.sort(samples, new Comparator() { - public int compare(HPlusHealthActivitySample one, HPlusHealthActivitySample other) { - return one.getTimestamp() - other.getTimestamp(); - } - }); - return samples; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusDataRecordDaySlot.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusDataRecordDaySlot.java index 94c8d6c8f..f72b483e7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusDataRecordDaySlot.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusDataRecordDaySlot.java @@ -39,23 +39,23 @@ public class HPlusDataRecordDaySlot extends HPlusDataRecord { /** * Number of steps */ - public int steps; + public int steps = ActivitySample.NOT_MEASURED; /** * Number of seconds without activity (TBC) */ - public int secondsInactive; + public int secondsInactive = ActivitySample.NOT_MEASURED; /** * Average Heart Rate in Beats Per Minute */ - public int heartRate; + public int heartRate = ActivitySample.NOT_MEASURED; private int age = 0; /** * Raw intensity calculated from calories */ - public int intensity; + public int intensity = ActivitySample.NOT_MEASURED; public HPlusDataRecordDaySlot(byte[] data, int age) { super(data, TYPE_DAY_SLOT); @@ -85,6 +85,8 @@ public class HPlusDataRecordDaySlot extends HPlusDataRecord { timestamp = (int) (slotTime.getTimeInMillis() / 1000L); this.age = age; + + intensity = (int) ((100*heartRate)/(208-0.7*age)); } public String toString(){ diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusHandlerThread.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusHandlerThread.java index 3f767a475..f96423c67 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusHandlerThread.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusHandlerThread.java @@ -41,6 +41,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBException; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusConstants; +import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusHealthSampleProvider; import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.entities.HPlusHealthActivityOverlay; @@ -300,9 +301,9 @@ class HPlusHandlerThread extends GBDeviceIoThread { sample.setRawHPlusHealthData(storedRecord.getRawData()); sample.setSteps(storedRecord.steps); + sample.setRawIntensity(storedRecord.intensity); sample.setHeartRate(storedRecord.heartRate); sample.setRawKind(storedRecord.type); - sample.setRawIntensity(record.intensity); sample.setProvider(provider); samples.add(sample); }