mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2025-01-25 16:15:55 +01:00
Xiaomi: Parse SleepSummary
This commit is contained in:
parent
e06b2e1f95
commit
f5cf21bf05
@ -56,12 +56,14 @@ public class SleepDetailsParser extends XiaomiActivityParser {
|
|||||||
final ByteBuffer buf = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
|
final ByteBuffer buf = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
|
||||||
buf.get(); // header ? 0xF0
|
buf.get(); // header ? 0xF0
|
||||||
|
|
||||||
final int isAwake = buf.get() & 0xff; // 0/1
|
final int isAwake = buf.get() & 0xff; // 0/1 - more correctly this would be !isSleepFinish
|
||||||
final int bedTime = buf.getInt();
|
final int bedTime = buf.getInt();
|
||||||
final int wakeupTime = buf.getInt();
|
final int wakeupTime = buf.getInt();
|
||||||
LOG.debug("Sleep sample: bedTime: {}, wakeupTime: {}, isAwake: {}", bedTime, wakeupTime, isAwake);
|
LOG.debug("Sleep sample: bedTime: {}, wakeupTime: {}, isAwake: {}", bedTime, wakeupTime, isAwake);
|
||||||
|
|
||||||
final XiaomiSleepTimeSample sample = new XiaomiSleepTimeSample();
|
final List<XiaomiSleepTimeSample> summaries = new ArrayList<>();
|
||||||
|
|
||||||
|
XiaomiSleepTimeSample sample = new XiaomiSleepTimeSample();
|
||||||
sample.setTimestamp(bedTime * 1000L);
|
sample.setTimestamp(bedTime * 1000L);
|
||||||
sample.setWakeupTime(wakeupTime * 1000L);
|
sample.setWakeupTime(wakeupTime * 1000L);
|
||||||
sample.setIsAwake(isAwake == 1);
|
sample.setIsAwake(isAwake == 1);
|
||||||
@ -81,7 +83,6 @@ public class SleepDetailsParser extends XiaomiActivityParser {
|
|||||||
|
|
||||||
final List<XiaomiSleepStageSample> stages = new ArrayList<>();
|
final List<XiaomiSleepStageSample> stages = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
while (buf.remaining() >= 17 && buf.getInt() == 0xFFFCFAFB) {
|
while (buf.remaining() >= 17 && buf.getInt() == 0xFFFCFAFB) {
|
||||||
final int headerLen = buf.get() & 0xFF; // this seems to always be 17
|
final int headerLen = buf.get() & 0xFF; // this seems to always be 17
|
||||||
|
|
||||||
@ -108,7 +109,40 @@ public class SleepDetailsParser extends XiaomiActivityParser {
|
|||||||
// - Summary = 16,
|
// - Summary = 16,
|
||||||
// - Stages = 17
|
// - Stages = 17
|
||||||
|
|
||||||
if (type == 17) { // Stages
|
if (type == 16) {
|
||||||
|
final int data_0 = dataBuf.get() & 0xFF;
|
||||||
|
final int sleep_index = data_0 >> 4;
|
||||||
|
final int wake_count = data_0 & 0x0F;
|
||||||
|
|
||||||
|
final int sleep_duration = dataBuf.getShort() & 0xFFFF;
|
||||||
|
final int wake_duration = dataBuf.getShort() & 0xFFFF;
|
||||||
|
final int light_duration = dataBuf.getShort() & 0xFFFF;
|
||||||
|
final int rem_duration = dataBuf.getShort() & 0xFFFF;
|
||||||
|
final int deep_duration = dataBuf.getShort() & 0xFFFF;
|
||||||
|
|
||||||
|
final int data_1 = dataBuf.get() & 0xFF;
|
||||||
|
final boolean has_rem = (data_1 >> 4) == 1;
|
||||||
|
final boolean has_stage = (data_1 >> 2) == 1;
|
||||||
|
|
||||||
|
// Could probably be an "awake" duration after sleep
|
||||||
|
final int unk_duration_minutes = dataBuf.get() & 0xFF;
|
||||||
|
|
||||||
|
if (sample == null) {
|
||||||
|
sample = new XiaomiSleepTimeSample();
|
||||||
|
}
|
||||||
|
|
||||||
|
sample.setTimestamp(bedTime * 1000L);
|
||||||
|
sample.setWakeupTime(wakeupTime * 1000L);
|
||||||
|
sample.setTotalDuration(sleep_duration);
|
||||||
|
sample.setDeepSleepDuration(deep_duration);
|
||||||
|
sample.setLightSleepDuration(light_duration);
|
||||||
|
sample.setRemSleepDuration(rem_duration);
|
||||||
|
sample.setAwakeDuration(wake_duration);
|
||||||
|
|
||||||
|
summaries.add(sample);
|
||||||
|
sample = null;
|
||||||
|
}
|
||||||
|
else if (type == 17) { // Stages
|
||||||
long currentTime = ts * 1000;
|
long currentTime = ts * 1000;
|
||||||
for (int i = 0; i < dataLen / 2; i++) {
|
for (int i = 0; i < dataLen / 2; i++) {
|
||||||
// when the change to the phase occurs
|
// when the change to the phase occurs
|
||||||
@ -133,24 +167,28 @@ public class SleepDetailsParser extends XiaomiActivityParser {
|
|||||||
final DaoSession session = handler.getDaoSession();
|
final DaoSession session = handler.getDaoSession();
|
||||||
final GBDevice gbDevice = support.getDevice();
|
final GBDevice gbDevice = support.getDevice();
|
||||||
|
|
||||||
sample.setDevice(DBHelper.getDevice(gbDevice, session));
|
|
||||||
sample.setUser(DBHelper.getUser(session));
|
|
||||||
|
|
||||||
final XiaomiSleepTimeSampleProvider sampleProvider = new XiaomiSleepTimeSampleProvider(gbDevice, session);
|
final XiaomiSleepTimeSampleProvider sampleProvider = new XiaomiSleepTimeSampleProvider(gbDevice, session);
|
||||||
|
|
||||||
// Check if there is already a later sleep sample - if so, ignore this one
|
|
||||||
// Samples for the same sleep will always have the same bedtime (timestamp), but we might get
|
for (final XiaomiSleepTimeSample summary : summaries) {
|
||||||
// multiple bedtimes until the user wakes up
|
summary.setDevice(DBHelper.getDevice(gbDevice, session));
|
||||||
final List<XiaomiSleepTimeSample> existingSamples = sampleProvider.getAllSamples(sample.getTimestamp(), sample.getTimestamp());
|
summary.setUser(DBHelper.getUser(session));
|
||||||
if (!existingSamples.isEmpty()) {
|
|
||||||
final XiaomiSleepTimeSample existingSample = existingSamples.get(0);
|
// Check if there is already a later sleep sample - if so, ignore this one
|
||||||
if (existingSample.getWakeupTime() > sample.getWakeupTime()) {
|
// Samples for the same sleep will always have the same bedtime (timestamp), but we might get
|
||||||
LOG.warn("Ignoring sleep sample - existing sample is more recent ({})", existingSample.getWakeupTime());
|
// multiple bedtimes until the user wakes up
|
||||||
return true;
|
final List<XiaomiSleepTimeSample> existingSamples = sampleProvider.getAllSamples(summary.getTimestamp(), summary.getTimestamp());
|
||||||
|
if (!existingSamples.isEmpty()) {
|
||||||
|
final XiaomiSleepTimeSample existingSample = existingSamples.get(0);
|
||||||
|
if (existingSample.getWakeupTime() > summary.getWakeupTime()) {
|
||||||
|
LOG.warn("Ignoring sleep sample - existing sample is more recent ({})", existingSample.getWakeupTime());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sampleProvider.addSample(summary);
|
||||||
}
|
}
|
||||||
|
|
||||||
sampleProvider.addSample(sample);
|
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
GB.toast(support.getContext(), "Error saving sleep sample", Toast.LENGTH_LONG, GB.ERROR);
|
GB.toast(support.getContext(), "Error saving sleep sample", Toast.LENGTH_LONG, GB.ERROR);
|
||||||
LOG.error("Error saving sleep sample", e);
|
LOG.error("Error saving sleep sample", e);
|
||||||
|
Loading…
Reference in New Issue
Block a user