mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2025-01-25 16:15:55 +01:00
HPlus: Fix intensity calculation without continuous connectivity
This commit is contained in:
parent
1d79c9d93d
commit
845869e25e
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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(){
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user