2024-01-10 18:54:00 +01:00
|
|
|
/* Copyright (C) 2016-2024 Andreas Shimokawa
|
2017-03-10 14:53:19 +01:00
|
|
|
|
|
|
|
This file is part of Gadgetbridge.
|
|
|
|
|
|
|
|
Gadgetbridge is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published
|
|
|
|
by the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Gadgetbridge is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
2024-01-10 18:54:00 +01:00
|
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
2016-07-25 22:28:40 +02:00
|
|
|
package nodomain.freeyourgadget.gadgetbridge.entities;
|
|
|
|
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
|
|
|
|
|
|
|
|
public abstract class AbstractPebbleMisfitActivitySample extends AbstractActivitySample {
|
|
|
|
abstract public int getRawPebbleMisfitSample();
|
|
|
|
|
|
|
|
private transient int intensity = 0;
|
|
|
|
private transient int steps = 0;
|
|
|
|
private transient int activityKind = ActivityKind.TYPE_UNKNOWN;
|
|
|
|
|
|
|
|
private void calculate() {
|
|
|
|
int sample = getRawPebbleMisfitSample();
|
|
|
|
|
|
|
|
if (((sample & 0x83ff) == 0x0001) && ((sample & 0xff00) <= 0x4800)) {
|
|
|
|
// sleep seems to be from 0x2401 to 0x4801 (0b0IIIII0000000001) where I = intensity ?
|
|
|
|
intensity = (sample & 0x7c00) >>> 10;
|
|
|
|
// 9-18 decimal after shift
|
|
|
|
if (intensity <= 13) {
|
|
|
|
activityKind = ActivityKind.TYPE_DEEP_SLEEP;
|
|
|
|
} else {
|
|
|
|
// FIXME: this leads to too much false positives, ignore for now
|
|
|
|
//activityKind = ActivityKind.TYPE_LIGHT_SLEEP;
|
|
|
|
//intensity *= 2; // better visual distinction
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ((sample & 0x0001) == 0) { // 16-??? steps encoded in bits 1-7
|
|
|
|
steps = (sample & 0x00fe);
|
|
|
|
} else { // 0-14 steps encoded in bits 1-3, most of the time fc71 bits are set in that case
|
|
|
|
steps = (sample & 0x000e);
|
|
|
|
}
|
|
|
|
intensity = steps;
|
|
|
|
activityKind = ActivityKind.TYPE_ACTIVITY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getSteps() {
|
|
|
|
calculate();
|
|
|
|
return steps;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2016-08-07 11:45:09 +02:00
|
|
|
public int getKind() {
|
2016-07-25 22:28:40 +02:00
|
|
|
calculate();
|
|
|
|
return activityKind;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getRawIntensity() {
|
|
|
|
calculate();
|
|
|
|
return intensity;
|
|
|
|
}
|
|
|
|
}
|