mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2025-06-05 21:49:48 +02:00
Mi Band 4: decode swim info (not used yet)
After swimming a lot on the sofa and desk this seems right and in line with the data displayed on the band swimming styles I got so far are breast and freestyle. Others are probably missing. Might be correct for Cor also (I don't have one)
This commit is contained in:
@@ -141,7 +141,7 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((byte) (lastPacketCounter + 1) == value[0] ) {
|
if ((byte) (lastPacketCounter + 1) == value[0]) {
|
||||||
lastPacketCounter++;
|
lastPacketCounter++;
|
||||||
bufferActivityData(value);
|
bufferActivityData(value);
|
||||||
} else {
|
} else {
|
||||||
@@ -154,6 +154,7 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation {
|
|||||||
/**
|
/**
|
||||||
* Buffers the given activity summary data. If the total size is reached,
|
* Buffers the given activity summary data. If the total size is reached,
|
||||||
* it is converted to an object and saved in the database.
|
* it is converted to an object and saved in the database.
|
||||||
|
*
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@@ -166,7 +167,7 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation {
|
|||||||
ByteBuffer buffer = ByteBuffer.wrap(stream.toByteArray()).order(ByteOrder.LITTLE_ENDIAN);
|
ByteBuffer buffer = ByteBuffer.wrap(stream.toByteArray()).order(ByteOrder.LITTLE_ENDIAN);
|
||||||
// summary.setVersion(BLETypeConversions.toUnsigned(buffer.getShort()));
|
// summary.setVersion(BLETypeConversions.toUnsigned(buffer.getShort()));
|
||||||
short version = buffer.getShort(); // version
|
short version = buffer.getShort(); // version
|
||||||
LOG.debug("Got sport summary version " + version);
|
LOG.debug("Got sport summary version " + version + "total bytes=" + buffer.capacity());
|
||||||
int activityKind = ActivityKind.TYPE_UNKNOWN;
|
int activityKind = ActivityKind.TYPE_UNKNOWN;
|
||||||
try {
|
try {
|
||||||
int rawKind = BLETypeConversions.toUnsigned(buffer.getShort());
|
int rawKind = BLETypeConversions.toUnsigned(buffer.getShort());
|
||||||
@@ -216,21 +217,53 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation {
|
|||||||
float maxPace = buffer.getFloat(); // format?
|
float maxPace = buffer.getFloat(); // format?
|
||||||
float totalStride = buffer.getFloat();
|
float totalStride = buffer.getFloat();
|
||||||
|
|
||||||
buffer.getInt(); // unknown
|
|
||||||
buffer.getInt(); // unknown
|
|
||||||
buffer.getInt(); // unknown
|
buffer.getInt(); // unknown
|
||||||
|
|
||||||
|
if (activityKind == ActivityKind.TYPE_SWIMMING) {
|
||||||
|
// 28 bytes
|
||||||
|
float averageStrokeDistance = buffer.getFloat();
|
||||||
|
float averageStrokesPerSecond = buffer.getFloat();
|
||||||
|
float averageLapPace = buffer.getFloat();
|
||||||
|
short strokes = buffer.getShort();
|
||||||
|
short swolfIndex = buffer.getShort();
|
||||||
|
byte swimStyle = buffer.get();
|
||||||
|
byte laps = buffer.get();
|
||||||
|
buffer.getInt(); // unknown
|
||||||
|
buffer.getInt(); // unknown
|
||||||
|
buffer.getShort(); // unknown
|
||||||
|
|
||||||
|
LOG.debug("unused swim data:" +
|
||||||
|
"\naverageStrokeDistance=" + averageStrokeDistance +
|
||||||
|
"\naverageStrokesPerSecond=" + averageStrokesPerSecond +
|
||||||
|
"\naverageLapPace" + averageLapPace +
|
||||||
|
"\nstrokes=" + strokes +
|
||||||
|
"\nswolfIndex=" + swolfIndex +
|
||||||
|
"\nswimStyle=" + swimStyle + // 1 = breast, 2 = freestyle
|
||||||
|
"\nlaps=" + laps +
|
||||||
|
""
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// 28 bytes
|
||||||
|
buffer.getInt(); // unknown
|
||||||
|
buffer.getInt(); // unknown
|
||||||
int ascentSeconds = buffer.getInt() / 1000; //ms?
|
int ascentSeconds = buffer.getInt() / 1000; //ms?
|
||||||
buffer.getInt(); // unknown;
|
buffer.getInt(); // unknown;
|
||||||
int descentSeconds = buffer.getInt() / 1000; //ms?
|
int descentSeconds = buffer.getInt() / 1000; //ms?
|
||||||
buffer.getInt(); // unknown;
|
buffer.getInt(); // unknown;
|
||||||
int flatSeconds = buffer.getInt() / 1000; // ms?
|
int flatSeconds = buffer.getInt() / 1000; // ms?
|
||||||
int averageHR = buffer.getShort();
|
LOG.debug("unused non-swim data:" +
|
||||||
int averagePaceSeconds = buffer.getShort();
|
"\nascentSeconds=" + ascentSeconds +
|
||||||
int averageStride = buffer.getShort();
|
"\ndescentSeconds=" + descentSeconds +
|
||||||
buffer.getShort(); // unknown
|
"\nflatSeconds=" + flatSeconds +
|
||||||
|
""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
LOG.debug("unused data:" +
|
short averageHR = buffer.getShort();
|
||||||
|
short averageKMPaceSeconds = buffer.getShort();
|
||||||
|
short averageStride = buffer.getShort();
|
||||||
|
|
||||||
|
LOG.debug("unused common:" +
|
||||||
"\ndistanceMeters=" + distanceMeters +
|
"\ndistanceMeters=" + distanceMeters +
|
||||||
"\nascentMeters=" + ascentMeters +
|
"\nascentMeters=" + ascentMeters +
|
||||||
"\ndescentMeters=" + descentMeters +
|
"\ndescentMeters=" + descentMeters +
|
||||||
@@ -247,11 +280,8 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation {
|
|||||||
"\nminPace=" + minPace +
|
"\nminPace=" + minPace +
|
||||||
"\nmaxPace=" + maxPace +
|
"\nmaxPace=" + maxPace +
|
||||||
"\ntotalStride=" + totalStride +
|
"\ntotalStride=" + totalStride +
|
||||||
"\nascentSeconds=" + ascentSeconds +
|
|
||||||
"\ndescentSeconds=" + descentSeconds +
|
|
||||||
"\nflatSeconds=" + flatSeconds +
|
|
||||||
"\naverageHR=" + averageHR +
|
"\naverageHR=" + averageHR +
|
||||||
"\naveragePaceSeconds=" + averagePaceSeconds +
|
"\naverageKMPaceSeconds=" + averageKMPaceSeconds +
|
||||||
"\naverageStride=" + averageStride +
|
"\naverageStride=" + averageStride +
|
||||||
""
|
""
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user