mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-27 12:26:48 +01:00
Garmin: Parse skin temperature messages
This commit is contained in:
parent
8c949ff6ab
commit
b331c53763
@ -188,7 +188,7 @@ public class GlobalFITMessage {
|
||||
));
|
||||
|
||||
public static GlobalFITMessage MONITORING_INFO = new GlobalFITMessage(103, "MONITORING_INFO", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT32, "timestamp_in_tz"), // garmin timestamp, but in user timezone
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone
|
||||
new FieldDefinitionPrimitive(1, BaseType.ENUM, "activity_type", FieldDefinitionFactory.FIELD.ARRAY), // 6 walking, 1 running, 13 ?
|
||||
new FieldDefinitionPrimitive(3, BaseType.UINT16, "steps_to_distance", FieldDefinitionFactory.FIELD.ARRAY, 5000, 0), // same size as activity_type?
|
||||
new FieldDefinitionPrimitive(4, BaseType.UINT16, "steps_to_calories", FieldDefinitionFactory.FIELD.ARRAY, 5000, 0), // same size as activity_type?
|
||||
@ -251,6 +251,11 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(4, BaseType.UINT32, "enhanced_speed")
|
||||
));
|
||||
|
||||
public static GlobalFITMessage TIMESTAMP_CORRELATION = new GlobalFITMessage(162, "TIMESTAMP_CORRELATION", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(3, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage FIELD_DESCRIPTION = new GlobalFITMessage(206, "FIELD_DESCRIPTION", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT8, "developer_data_index"),
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT8, "field_definition_number"),
|
||||
@ -307,7 +312,7 @@ public class GlobalFITMessage {
|
||||
public static GlobalFITMessage SLEEP_DATA_INFO = new GlobalFITMessage(273, "SLEEP_DATA_INFO", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT8, "unk0"), // 2
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_length"), // 60, sample time?
|
||||
new FieldDefinitionPrimitive(2, BaseType.UINT32, "timestamp_in_tz"), // garmin timestamp, but in user timezone
|
||||
new FieldDefinitionPrimitive(2, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone
|
||||
new FieldDefinitionPrimitive(3, BaseType.ENUM, "unk3"), // 1
|
||||
new FieldDefinitionPrimitive(4, BaseType.STRING, "version"), // matches ETE in settings
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
@ -346,6 +351,19 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage SKIN_TEMP_RAW = new GlobalFITMessage(397, "SKIN_TEMP_RAW", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "deviation"),
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage SKIN_TEMP_OVERNIGHT = new GlobalFITMessage(398, "SKIN_TEMP_OVERNIGHT", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone
|
||||
new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "average_deviation"),
|
||||
new FieldDefinitionPrimitive(2, BaseType.FLOAT32, "average_7_day_deviation"),
|
||||
new FieldDefinitionPrimitive(3, BaseType.UINT8, "unk3"),
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static Map<Integer, GlobalFITMessage> KNOWN_MESSAGES = new HashMap<Integer, GlobalFITMessage>() {{
|
||||
put(0, FILE_ID);
|
||||
put(2, DEVICE_SETTINGS);
|
||||
@ -367,6 +385,7 @@ public class GlobalFITMessage {
|
||||
put(140, PHYSIOLOGICAL_METRICS);
|
||||
put(159, WATCHFACE_SETTINGS);
|
||||
put(160, GPS_METADATA);
|
||||
put(162, TIMESTAMP_CORRELATION);
|
||||
put(206, FIELD_DESCRIPTION);
|
||||
put(207, DEVELOPER_DATA);
|
||||
put(216, TIME_IN_ZONE);
|
||||
@ -381,6 +400,8 @@ public class GlobalFITMessage {
|
||||
put(346, SLEEP_STATS);
|
||||
put(370, HRV_SUMMARY);
|
||||
put(371, HRV_VALUE);
|
||||
put(397, SKIN_TEMP_RAW);
|
||||
put(398, SKIN_TEMP_OVERNIGHT);
|
||||
}};
|
||||
private final int number;
|
||||
private final String name;
|
||||
|
@ -21,7 +21,7 @@ public class FitMonitoringInfo extends RecordData {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestampInTz() {
|
||||
public Long getLocalTimestamp() {
|
||||
return (Long) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
|
@ -55,6 +55,8 @@ public class FitRecordDataFactory {
|
||||
return new FitWatchfaceSettings(recordDefinition, recordHeader);
|
||||
case 160:
|
||||
return new FitGpsMetadata(recordDefinition, recordHeader);
|
||||
case 162:
|
||||
return new FitTimestampCorrelation(recordDefinition, recordHeader);
|
||||
case 206:
|
||||
return new FitFieldDescription(recordDefinition, recordHeader);
|
||||
case 207:
|
||||
@ -83,6 +85,10 @@ public class FitRecordDataFactory {
|
||||
return new FitHrvSummary(recordDefinition, recordHeader);
|
||||
case 371:
|
||||
return new FitHrvValue(recordDefinition, recordHeader);
|
||||
case 397:
|
||||
return new FitSkinTempRaw(recordDefinition, recordHeader);
|
||||
case 398:
|
||||
return new FitSkinTempOvernight(recordDefinition, recordHeader);
|
||||
}
|
||||
|
||||
return new RecordData(recordDefinition, recordHeader);
|
||||
|
@ -0,0 +1,47 @@
|
||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
|
||||
|
||||
//
|
||||
// WARNING: This class was auto-generated, please avoid modifying it directly.
|
||||
// See nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen
|
||||
//
|
||||
public class FitSkinTempOvernight extends RecordData {
|
||||
public FitSkinTempOvernight(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 398) {
|
||||
throw new IllegalArgumentException("FitSkinTempOvernight expects global messages of " + 398 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getLocalTimestamp() {
|
||||
return (Long) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Float getAverageDeviation() {
|
||||
return (Float) getFieldByNumber(1);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Float getAverage7DayDeviation() {
|
||||
return (Float) getFieldByNumber(2);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getUnk3() {
|
||||
return (Integer) getFieldByNumber(3);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestamp() {
|
||||
return (Long) getFieldByNumber(253);
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
|
||||
|
||||
//
|
||||
// WARNING: This class was auto-generated, please avoid modifying it directly.
|
||||
// See nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen
|
||||
//
|
||||
public class FitSkinTempRaw extends RecordData {
|
||||
public FitSkinTempRaw(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 397) {
|
||||
throw new IllegalArgumentException("FitSkinTempRaw expects global messages of " + 397 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Float getDeviation() {
|
||||
return (Float) getFieldByNumber(1);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestamp() {
|
||||
return (Long) getFieldByNumber(253);
|
||||
}
|
||||
}
|
@ -31,7 +31,7 @@ public class FitSleepDataInfo extends RecordData {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestampInTz() {
|
||||
public Long getLocalTimestamp() {
|
||||
return (Long) getFieldByNumber(2);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,32 @@
|
||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
|
||||
|
||||
//
|
||||
// WARNING: This class was auto-generated, please avoid modifying it directly.
|
||||
// See nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen
|
||||
//
|
||||
public class FitTimestampCorrelation extends RecordData {
|
||||
public FitTimestampCorrelation(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 162) {
|
||||
throw new IllegalArgumentException("FitTimestampCorrelation expects global messages of " + 162 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getLocalTimestamp() {
|
||||
return (Long) getFieldByNumber(3);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestamp() {
|
||||
return (Long) getFieldByNumber(253);
|
||||
}
|
||||
}
|
@ -8,7 +8,6 @@ import java.nio.ByteOrder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.communicator.CobsCoDec;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FieldDefinition;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitFile;
|
||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.GlobalFITMessage;
|
||||
|
@ -0,0 +1,16 @@
|
||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
public class FitImporterTest {
|
||||
@Test
|
||||
@Ignore("helper test for development, remove this while debugging")
|
||||
public void localTest() throws IOException {
|
||||
final FitImporter fitImporter = new FitImporter( null, null);
|
||||
fitImporter.importFile(new File("/storage/SKIN_TEMP.fit"));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user