1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-08-16 04:12:28 +02:00

HPlus: Fix intensity calculation without continuous connectivity

This commit is contained in:
João Paulo Barraca 2017-05-19 10:39:21 +01:00
parent 1d79c9d93d
commit 845869e25e
3 changed files with 53 additions and 32 deletions

View File

@ -141,6 +141,51 @@ public class HPlusHealthSampleProvider extends AbstractSampleProvider<HPlusHealt
List<HPlusHealthActivityOverlay> overlayRecords = qb.build().list(); List<HPlusHealthActivityOverlay> 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<HPlusHealthActivitySample>() {
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 //Todays sample steps will come from the Day Slots messages
//Historical steps will be provided by Day Summaries messages //Historical steps will be provided by Day Summaries messages
//This will allow both week and current day results to be consistent //This will allow both week and current day results to be consistent
@ -180,35 +225,8 @@ public class HPlusHealthSampleProvider extends AbstractSampleProvider<HPlusHealt
if(lastSample != null) if(lastSample != null)
lastSample.setSteps(Math.max(stepsTodayCount, stepsTodayMax)); lastSample.setSteps(Math.max(stepsTodayCount, stepsTodayMax));
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());
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)
sample.setRawIntensity(10);
sample.setRawKind(overlay.getRawKind());
}
}
}
detachFromSession(); detachFromSession();
Collections.sort(samples, new Comparator<HPlusHealthActivitySample>() {
public int compare(HPlusHealthActivitySample one, HPlusHealthActivitySample other) {
return one.getTimestamp() - other.getTimestamp();
}
});
return samples; return samples;
} }

View File

@ -39,23 +39,23 @@ public class HPlusDataRecordDaySlot extends HPlusDataRecord {
/** /**
* Number of steps * Number of steps
*/ */
public int steps; public int steps = ActivitySample.NOT_MEASURED;
/** /**
* Number of seconds without activity (TBC) * Number of seconds without activity (TBC)
*/ */
public int secondsInactive; public int secondsInactive = ActivitySample.NOT_MEASURED;
/** /**
* Average Heart Rate in Beats Per Minute * Average Heart Rate in Beats Per Minute
*/ */
public int heartRate; public int heartRate = ActivitySample.NOT_MEASURED;
private int age = 0; private int age = 0;
/** /**
* Raw intensity calculated from calories * Raw intensity calculated from calories
*/ */
public int intensity; public int intensity = ActivitySample.NOT_MEASURED;
public HPlusDataRecordDaySlot(byte[] data, int age) { public HPlusDataRecordDaySlot(byte[] data, int age) {
super(data, TYPE_DAY_SLOT); super(data, TYPE_DAY_SLOT);
@ -85,6 +85,8 @@ public class HPlusDataRecordDaySlot extends HPlusDataRecord {
timestamp = (int) (slotTime.getTimeInMillis() / 1000L); timestamp = (int) (slotTime.getTimeInMillis() / 1000L);
this.age = age; this.age = age;
intensity = (int) ((100*heartRate)/(208-0.7*age));
} }
public String toString(){ public String toString(){

View File

@ -41,6 +41,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusConstants; 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.devices.hplus.HPlusHealthSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.entities.HPlusHealthActivityOverlay; import nodomain.freeyourgadget.gadgetbridge.entities.HPlusHealthActivityOverlay;
@ -300,9 +301,9 @@ class HPlusHandlerThread extends GBDeviceIoThread {
sample.setRawHPlusHealthData(storedRecord.getRawData()); sample.setRawHPlusHealthData(storedRecord.getRawData());
sample.setSteps(storedRecord.steps); sample.setSteps(storedRecord.steps);
sample.setRawIntensity(storedRecord.intensity);
sample.setHeartRate(storedRecord.heartRate); sample.setHeartRate(storedRecord.heartRate);
sample.setRawKind(storedRecord.type); sample.setRawKind(storedRecord.type);
sample.setRawIntensity(record.intensity);
sample.setProvider(provider); sample.setProvider(provider);
samples.add(sample); samples.add(sample);
} }