1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2025-01-13 03:07:32 +01:00

makibes hr3.

fixed step counting (needs multi-day testing).
fixed signed byte to int conversion.
This commit is contained in:
Cre3per 2019-10-08 15:23:46 +02:00 committed by Andreas Shimokawa
parent fdffe813f2
commit ec88a7d8e5

View File

@ -2,9 +2,6 @@
// TODO: by GB, not by makibes hr3 support. Charging the watch or attempting to pair might also // TODO: by GB, not by makibes hr3 support. Charging the watch or attempting to pair might also
// TODO: help. This needs further research. // TODO: help. This needs further research.
// TODO: Where can I view today's steps in GB?
// TODO: GB accumulates all step samples, even if they're part of the same day.
// TODO: All the commands that aren't supported by GB should be added to device specific settings. // TODO: All the commands that aren't supported by GB should be added to device specific settings.
// TODO: It'd be cool if we could change the language. There's no official way to do so, but the // TODO: It'd be cool if we could change the language. There's no official way to do so, but the
@ -25,6 +22,7 @@ import android.os.VibrationEffect;
import android.os.Vibrator; import android.os.Vibrator;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -35,6 +33,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
@ -102,6 +101,7 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
/** /**
* Called whenever data is received to postpone the removing of the progress notification. * Called whenever data is received to postpone the removing of the progress notification.
*
* @param start Start showing the notification * @param start Start showing the notification
*/ */
private void fetch(boolean start) { private void fetch(boolean start) {
@ -119,6 +119,52 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
return false; return false;
} }
/**
*
* @param timeStamp seconds
*/
private void getDayStartEnd(int timeStamp, Calendar start, Calendar end) {
final int DAY = (24 * 60 * 60);
int timeStampStart = ((timeStamp / DAY) * DAY);
int timeStampEnd = (timeStampStart + DAY);
start.setTimeInMillis(timeStampStart * 1000l);
end.setTimeInMillis(timeStampEnd * 1000l);
}
/**
* @param timeStamp Time stamp at some point during the requested day.
*/
private int getStepsOnDay(int timeStamp) {
try (DBHandler dbHandler = GBApplication.acquireDB()) {
Calendar dayStart = new GregorianCalendar();
Calendar dayEnd = new GregorianCalendar();
this.getDayStartEnd(timeStamp, dayStart, dayEnd);
MakibesHR3SampleProvider provider = new MakibesHR3SampleProvider(this.getDevice(), dbHandler.getDaoSession());
List<MakibesHR3ActivitySample> samples = provider.getAllActivitySamples(
(int) (dayStart.getTimeInMillis() / 1000l),
(int) (dayEnd.getTimeInMillis() / 1000l));
int totalSteps = 0;
for (MakibesHR3ActivitySample sample : samples) {
totalSteps += sample.getSteps();
}
return totalSteps;
} catch (Exception ex) {
LOG.error(ex.getMessage());
return 0;
}
}
public MakibesHR3ActivitySample createActivitySample(Device device, User user, int timestampInSeconds, SampleProvider provider) { public MakibesHR3ActivitySample createActivitySample(Device device, User user, int timestampInSeconds, SampleProvider provider) {
MakibesHR3ActivitySample sample = new MakibesHR3ActivitySample(); MakibesHR3ActivitySample sample = new MakibesHR3ActivitySample();
sample.setDevice(device); sample.setDevice(device);
@ -596,13 +642,7 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
private void onReceiveFitness(int steps) { private void onReceiveFitness(int steps) {
LOG.info("steps: " + steps); LOG.info("steps: " + steps);
MakibesHR3ActivitySample sample = new MakibesHR3ActivitySample(); this.onReceiveStepsSample(steps);
sample.setSteps(steps);
sample.setTimestamp((int) (System.currentTimeMillis() / 1000));
sample.setRawKind(ActivityKind.TYPE_ACTIVITY);
this.addGBActivitySample(sample);
} }
private void onReceiveHeartRate(int heartRate) { private void onReceiveHeartRate(int heartRate) {
@ -646,24 +686,41 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
this.addGBActivitySample(sample); this.addGBActivitySample(sample);
} }
private void onReceiveStepsSample(int timeStamp, int steps) {
MakibesHR3ActivitySample sample = new MakibesHR3ActivitySample();
// We need to subtract the day's total step count thus far.
int dayStepCount = this.getStepsOnDay(timeStamp);
int newSteps = (steps - dayStepCount);
if (newSteps > 0) {
LOG.debug("adding " + newSteps + " steps");
sample.setSteps(steps - dayStepCount);
sample.setTimestamp(timeStamp);
sample.setRawKind(ActivityKind.TYPE_ACTIVITY);
this.addGBActivitySample(sample);
}
}
/** /**
* The time is the start of the measurement. Each measurement lasts 1h. * The time is the start of the measurement. Each measurement lasts 1h.
*/ */
private void onReceiveStepsSample(int year, int month, int day, int hour, int minute, int steps) { private void onReceiveStepsSample(int year, int month, int day, int hour, int minute, int steps) {
LOG.debug("received steps sample " + year + "-" + month + "-" + day + " " + hour + ":" + minute + " " + steps); LOG.debug("received steps sample " + year + "-" + month + "-" + day + " " + hour + ":" + minute + " " + steps);
MakibesHR3ActivitySample sample = new MakibesHR3ActivitySample();
Calendar calendar = new GregorianCalendar(year, month - 1, day, hour + 1, minute); Calendar calendar = new GregorianCalendar(year, month - 1, day, hour + 1, minute);
int timeStamp = (int) (calendar.getTimeInMillis() / 1000); int timeStamp = (int) (calendar.getTimeInMillis() / 1000);
sample.setSteps(steps); this.onReceiveStepsSample(timeStamp, steps);
sample.setTimestamp(timeStamp); }
sample.setRawKind(ActivityKind.TYPE_ACTIVITY); private void onReceiveStepsSample(int steps) {
this.onReceiveStepsSample((int) (Calendar.getInstance().getTimeInMillis() / 1000l), steps);
this.addGBActivitySample(sample);
} }
@Override @Override
@ -704,7 +761,7 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
if (arguments.length == 2) { if (arguments.length == 2) {
GBDeviceEventBatteryInfo batteryInfo = new GBDeviceEventBatteryInfo(); GBDeviceEventBatteryInfo batteryInfo = new GBDeviceEventBatteryInfo();
batteryInfo.level = (short) arguments[1]; batteryInfo.level = (short) (arguments[1] & 0xff);
batteryInfo.state = ((arguments[0] == 0x01) ? BatteryState.BATTERY_CHARGING : BatteryState.BATTERY_NORMAL); batteryInfo.state = ((arguments[0] == 0x01) ? BatteryState.BATTERY_CHARGING : BatteryState.BATTERY_NORMAL);
this.handleGBDeviceEvent(batteryInfo); this.handleGBDeviceEvent(batteryInfo);
@ -712,24 +769,25 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
break; break;
case MakibesHR3Constants.RPRT_SOFTWARE: case MakibesHR3Constants.RPRT_SOFTWARE:
if (arguments.length == 11) { if (arguments.length == 11) {
this.getDevice().setFirmwareVersion(((int) arguments[0]) + "." + ((int) arguments[1])); this.getDevice().setFirmwareVersion(((int) (arguments[0] & 0xff)) + "." + (arguments[1] & 0xff));
} }
break; break;
default: // Non-80 reports default: // Non-80 reports
if (Arrays.equals(report, MakibesHR3Constants.RPRT_FITNESS)) { if (Arrays.equals(report, MakibesHR3Constants.RPRT_FITNESS)) {
int steps = (arguments[1] & 0xff) * 0x100 + (arguments[2] & 0xff);
this.onReceiveFitness( this.onReceiveFitness(
(int) arguments[1] * 0xff + arguments[2] steps
); );
} else if (Arrays.equals(report, MakibesHR3Constants.RPRT_HEART_RATE_SAMPLE)) { } else if (Arrays.equals(report, MakibesHR3Constants.RPRT_HEART_RATE_SAMPLE)) {
this.onReceiveHeartRateSample( this.onReceiveHeartRateSample(
arguments[0] + 2000, arguments[1], arguments[2], (arguments[0] & 0xff) + 2000, (arguments[1] & 0xff), (arguments[2] & 0xff),
arguments[3], arguments[4], (arguments[3] & 0xff), (arguments[4] & 0xff),
arguments[5]); (arguments[5] & 0xff));
} else if (Arrays.equals(report, MakibesHR3Constants.RPRT_STEPS_SAMPLE)) { } else if (Arrays.equals(report, MakibesHR3Constants.RPRT_STEPS_SAMPLE)) {
this.onReceiveStepsSample( this.onReceiveStepsSample(
arguments[0] + 2000, arguments[1], arguments[2], (arguments[0] & 0xff) + 2000, (arguments[1] & 0xff), (arguments[2] & 0xff),
arguments[3], 0, (arguments[3] & 0xff), 0,
(arguments[5] * 0xff) + arguments[6]); ((arguments[5] & 0xff) * 0x100) + (arguments[6] & 0xff));
} }
break; break;
} }
@ -862,13 +920,12 @@ public class MakibesHR3DeviceSupport extends AbstractBTLEDeviceSupport implement
MakibesHR3ActivitySample latestSample = provider.getLatestActivitySample(); MakibesHR3ActivitySample latestSample = provider.getLatestActivitySample();
if (latestSample == null) { if (true || latestSample == null) {
this.requestFitness(transaction, this.requestFitness(transaction,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0); 0, 0, 0, 0, 0);
} else { } else {
// getInstance is unnecessary, we're overriding. Calendar calendar = new GregorianCalendar();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(latestSample.getTimestamp() * 1000l)); calendar.setTime(new Date(latestSample.getTimestamp() * 1000l));
int year = calendar.get(Calendar.YEAR); int year = calendar.get(Calendar.YEAR);