From bdd698b7d3ac402f8eea9419105ca682cc1d4c2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Wed, 1 May 2024 22:16:02 +0100 Subject: [PATCH] Garmin: Map more global fit messages * Events * Goals * Gps Metadata * Laps * Record * Respiration rate * Sessions * SpO2 * Time in Zone --- .../devices/garmin/fit/GlobalFITMessage.java | 128 ++++++++++++++---- .../garmin/fit/codegen/FitCodeGen.java | 31 ++++- .../garmin/fit/messages/FitAlarmSettings.java | 2 +- .../garmin/fit/messages/FitConnectivity.java | 2 +- .../garmin/fit/messages/FitDeveloperData.java | 2 +- .../garmin/fit/messages/FitDeviceInfo.java | 2 +- .../fit/messages/FitDeviceSettings.java | 2 +- .../devices/garmin/fit/messages/FitEvent.java | 47 +++++++ .../fit/messages/FitFieldDescription.java | 2 +- .../garmin/fit/messages/FitFileCreator.java | 2 +- .../devices/garmin/fit/messages/FitGoals.java | 4 +- .../garmin/fit/messages/FitGpsMetadata.java | 32 +++++ .../devices/garmin/fit/messages/FitLap.java | 27 ++++ .../garmin/fit/messages/FitMonitoring.java | 25 +++- .../garmin/fit/messages/FitRecord.java | 37 ++++- .../fit/messages/FitRecordDataFactory.java | 14 ++ .../fit/messages/FitRespirationRate.java | 32 +++++ .../garmin/fit/messages/FitSession.java | 87 ++++++++++++ .../garmin/fit/messages/FitSleepStage.java | 2 +- .../garmin/fit/messages/FitSleepStats.java | 2 +- .../devices/garmin/fit/messages/FitSpo2.java | 42 ++++++ .../devices/garmin/fit/messages/FitSport.java | 2 +- .../garmin/fit/messages/FitStressLevel.java | 2 +- .../garmin/fit/messages/FitTimeInZone.java | 67 +++++++++ .../garmin/fit/messages/FitUserProfile.java | 7 +- .../fit/messages/FitWatchfaceSettings.java | 2 +- .../garmin/fit/messages/FitWeather.java | 2 +- .../garmin/fit/messages/FitZonesTarget.java | 2 +- 28 files changed, 556 insertions(+), 52 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsMetadata.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRespirationRate.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpo2.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java index ec12a427d..d604ecc6a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java @@ -21,6 +21,7 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(6, BaseType.UINT16, "manufacturer_partner"), new FieldDefinitionPrimitive(8, BaseType.STRING, 20, "product_name") )); + public static GlobalFITMessage DEVICE_SETTINGS = new GlobalFITMessage(2, "DEVICE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "active_time_zone"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "utc_offset"), @@ -39,6 +40,7 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(86, BaseType.ENUM, "ble_auto_upload_enabled"), new FieldDefinitionPrimitive(90, BaseType.UINT32, "auto_activity_detect") )); + public static GlobalFITMessage USER_PROFILE = new GlobalFITMessage(3, "USER_PROFILE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, 8, "friendly_name"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "gender"), @@ -64,6 +66,7 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(31, BaseType.UINT16, "user_running_step_length"), new FieldDefinitionPrimitive(32, BaseType.UINT16, "user_walking_step_length") )); + public static GlobalFITMessage ZONES_TARGET = new GlobalFITMessage(7, "ZONES_TARGET", Arrays.asList( new FieldDefinitionPrimitive(3, BaseType.UINT16, "functional_threshold_power"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "max_heart_rate"), @@ -71,6 +74,7 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(5, BaseType.ENUM, "hr_calc_type"), //1=percent_max_hr new FieldDefinitionPrimitive(7, BaseType.ENUM, "pwr_calc_type") //1=percent_ftp )); + public static GlobalFITMessage SPORT = new GlobalFITMessage(12, "SPORT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), @@ -83,10 +87,46 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(11, BaseType.ENUM, "source", FieldDefinitionFactory.FIELD.GOAL_SOURCE) )); - public static GlobalFITMessage RECORD = new GlobalFITMessage(20, "RECORD", Arrays.asList( - new FieldDefinitionPrimitive(3, BaseType.UINT8, "heart_rate"), + public static GlobalFITMessage SESSION = new GlobalFITMessage(18, "SESSION", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), // 9 lap + new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), // 1 stop + new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time"), + new FieldDefinitionPrimitive(3, BaseType.SINT32, "start_latitude"), + new FieldDefinitionPrimitive(4, BaseType.SINT32, "start_longitude"), + new FieldDefinitionPrimitive(7, BaseType.UINT32, "total_elapsed_time"), // with pauses + new FieldDefinitionPrimitive(8, BaseType.UINT32, "total_timer_time"), // no pauses + new FieldDefinitionPrimitive(9, BaseType.UINT32, "total_distance"), + new FieldDefinitionPrimitive(11, BaseType.UINT16, "total_calories"), + new FieldDefinitionPrimitive(22, BaseType.UINT16, "total_ascent"), + new FieldDefinitionPrimitive(23, BaseType.UINT16, "total_descent"), + new FieldDefinitionPrimitive(110, BaseType.STRING, 64, "sport_profile_name"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + + public static GlobalFITMessage LAP = new GlobalFITMessage(19, "LAP", Arrays.asList( + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage RECORD = new GlobalFITMessage(20, "RECORD", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.SINT32, "latitude"), + new FieldDefinitionPrimitive(1, BaseType.SINT32, "longitude"), + new FieldDefinitionPrimitive(3, BaseType.UINT8, "heart_rate"), + new FieldDefinitionPrimitive(5, BaseType.UINT32, "distance", 100, 0), // m + new FieldDefinitionPrimitive(73, BaseType.UINT32, "enhanced_speed"), // mm/s + new FieldDefinitionPrimitive(78, BaseType.UINT32, "enhanced_altitude"), // dm + new FieldDefinitionPrimitive(136, BaseType.UINT8, "wrist_heart_rate"), + new FieldDefinitionPrimitive(143, BaseType.UINT8, "body_battery"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage EVENT = new GlobalFITMessage(21, "EVENT", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), // 0 timer, 74 sleep + new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), // sleep: 0 start 1 stop, timer: 0 start 4 stop all + new FieldDefinitionPrimitive(3, BaseType.UINT32, "data"), // in sleep they're timestamps in garmin epoch? in timer, 0 for manual + new FieldDefinitionPrimitive(4, BaseType.UINT8, "event_group"), // 0? + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage DEVICE_INFO = new GlobalFITMessage(23, "DEVICE_INFO", Arrays.asList( new FieldDefinitionPrimitive(2, BaseType.UINT16, "manufacturer"), new FieldDefinitionPrimitive(3, BaseType.UINT32Z, "serial_number"), @@ -94,10 +134,12 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(5, BaseType.UINT16, "software_version"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage FILE_CREATOR = new GlobalFITMessage(49, "FILE_CREATOR", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "software_version"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "hardware_version") )); + public static GlobalFITMessage MONITORING = new GlobalFITMessage(55, "MONITORING", Arrays.asList( new FieldDefinitionPrimitive(2, BaseType.UINT32, "distance"), new FieldDefinitionPrimitive(3, BaseType.UINT32, "cycles"), @@ -110,6 +152,7 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(27, BaseType.UINT8, "heart_rate"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage CONNECTIVITY = new GlobalFITMessage(127, "CONNECTIVITY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "bluetooth_enabled"), new FieldDefinitionPrimitive(3, BaseType.STRING, 20, "name"), @@ -143,11 +186,17 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(17, BaseType.ENUM, "air_quality"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage WATCHFACE_SETTINGS = new GlobalFITMessage(159, "WATCHFACE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "mode"), //1=analog new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "layout") )); + public static GlobalFITMessage GPS_METADATA = new GlobalFITMessage(160, "GPS_METADATA", Arrays.asList( + new FieldDefinitionPrimitive(3, BaseType.UINT32, "enhanced_altitude"), + new FieldDefinitionPrimitive(4, BaseType.UINT32, "enhanced_speed") + )); + 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"), @@ -155,23 +204,50 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(3, BaseType.STRING, 64, "field_name"), new FieldDefinitionPrimitive(8, BaseType.STRING, 16, "units") )); + public static GlobalFITMessage DEVELOPER_DATA = new GlobalFITMessage(207, "DEVELOPER_DATA", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, 16, "application_id"), new FieldDefinitionPrimitive(3, BaseType.UINT8, "developer_data_index") )); - // UNK_216(216, null), //activity + + public static GlobalFITMessage TIME_IN_ZONE = new GlobalFITMessage(216, "TIME_IN_ZONE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "reference_message"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "reference_index"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "time_in_zone"), // seconds + new FieldDefinitionPrimitive(6, BaseType.UINT8, "hr_zone_high_boundary"), // bpm + new FieldDefinitionPrimitive(10, BaseType.ENUM, "hr_calc_type"), // 1 percent max hr + new FieldDefinitionPrimitive(11, BaseType.UINT8, "max_heart_rate"), + new FieldDefinitionPrimitive(12, BaseType.UINT8, "resting_heart_rate"), + new FieldDefinitionPrimitive(13, BaseType.UINT8, "threshold_heart_rate"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage ALARM_SETTINGS = new GlobalFITMessage(222, "ALARM_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ALARM) )); + public static GlobalFITMessage STRESS_LEVEL = new GlobalFITMessage(227, "STRESS_LEVEL", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.SINT16, "stress_level_value"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "stress_level_time", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage SPO2 = new GlobalFITMessage(269, "SPO2", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8, "reading_spo2"), + new FieldDefinitionPrimitive(1, BaseType.UINT8, "reading_confidence"), + new FieldDefinitionPrimitive(2, BaseType.UINT8, "mode"), // 3 periodic + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage SLEEP_STAGE = new GlobalFITMessage(275, "SLEEP_STAGE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sleep_stage", FieldDefinitionFactory.FIELD.SLEEP_STAGE), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + + public static GlobalFITMessage RESPIRATION_RATE = new GlobalFITMessage(297, "RESPIRATION_RATE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.SINT16, "respiration_rate"), // breaths / min, scaled by 100 + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage SLEEP_STATS = new GlobalFITMessage(346, "SLEEP_STATS", Arrays.asList( )); @@ -182,18 +258,25 @@ public class GlobalFITMessage { put(7, ZONES_TARGET); put(12, SPORT); put(15, GOALS); + put(18, SESSION); + put(19, LAP); put(20, RECORD); + put(21, EVENT); put(23, DEVICE_INFO); put(49, FILE_CREATOR); put(55, MONITORING); put(127, CONNECTIVITY); put(128, WEATHER); put(159, WATCHFACE_SETTINGS); + put(160, GPS_METADATA); put(206, FIELD_DESCRIPTION); put(207, DEVELOPER_DATA); + put(216, TIME_IN_ZONE); put(222, ALARM_SETTINGS); put(227, STRESS_LEVEL); + put(269, SPO2); put(275, SLEEP_STAGE); + put(297, RESPIRATION_RATE); put(346, SLEEP_STATS); }}; private final int number; @@ -237,32 +320,21 @@ public class GlobalFITMessage { for (FieldDefinitionPrimitive fieldDefinitionPrimitive : fieldDefinitionPrimitives) { if (fieldDefinitionPrimitive.number == id) { - subset.add(FieldDefinitionFactory.create(fieldDefinitionPrimitive.number, fieldDefinitionPrimitive.size, fieldDefinitionPrimitive.type, fieldDefinitionPrimitive.baseType, fieldDefinitionPrimitive.name, fieldDefinitionPrimitive.scale, fieldDefinitionPrimitive.offset)); + subset.add(FieldDefinitionFactory.create( + fieldDefinitionPrimitive.number, + fieldDefinitionPrimitive.size, + fieldDefinitionPrimitive.type, + fieldDefinitionPrimitive.baseType, + fieldDefinitionPrimitive.name, + fieldDefinitionPrimitive.scale, + fieldDefinitionPrimitive.offset + )); } } } return subset; } - @Nullable - public FieldDefinition getFieldDefinition(String name) { - for (FieldDefinitionPrimitive fieldDefinitionPrimitive : - fieldDefinitionPrimitives) { - if (fieldDefinitionPrimitive.name.equals(name)) { - return FieldDefinitionFactory.create( - fieldDefinitionPrimitive.number, - fieldDefinitionPrimitive.size, - fieldDefinitionPrimitive.type, - fieldDefinitionPrimitive.baseType, - fieldDefinitionPrimitive.name, - fieldDefinitionPrimitive.scale, - fieldDefinitionPrimitive.offset - ); - } - } - return null; - } - @Nullable public FieldDefinition getFieldDefinition(int id, int size) { if (null == fieldDefinitionPrimitives) @@ -270,7 +342,15 @@ public class GlobalFITMessage { for (GlobalFITMessage.FieldDefinitionPrimitive fieldDefinitionPrimitive : fieldDefinitionPrimitives) { if (fieldDefinitionPrimitive.number == id) { - return FieldDefinitionFactory.create(fieldDefinitionPrimitive.number, size, fieldDefinitionPrimitive.type, fieldDefinitionPrimitive.baseType, fieldDefinitionPrimitive.name, fieldDefinitionPrimitive.scale, fieldDefinitionPrimitive.offset); + return FieldDefinitionFactory.create( + fieldDefinitionPrimitive.number, + size, + fieldDefinitionPrimitive.type, + fieldDefinitionPrimitive.baseType, + fieldDefinitionPrimitive.name, + fieldDefinitionPrimitive.scale, + fieldDefinitionPrimitive.offset + ); } } return null; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/codegen/FitCodeGen.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/codegen/FitCodeGen.java index ec83d6ea5..0a36285f8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/codegen/FitCodeGen.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/codegen/FitCodeGen.java @@ -16,8 +16,12 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.GlobalFITMessage; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; @@ -97,9 +101,12 @@ public class FitCodeGen { imports.add(RecordDefinition.class.getCanonicalName()); imports.add(RecordHeader.class.getCanonicalName()); //imports.add(GBToStringBuilder.class.getCanonicalName()); + imports.addAll(getImports(outputFile)); Collections.sort(imports); + final Set uniqueImports =new LinkedHashSet<>(imports); + for (final GlobalFITMessage.FieldDefinitionPrimitive primitive : globalFITMessage.getFieldDefinitionPrimitives()) { final Class fieldType = getFieldType(primitive); if (!Objects.requireNonNull(fieldType.getCanonicalName()).startsWith("java.lang")) { @@ -119,7 +126,7 @@ public class FitCodeGen { sb.append("\n"); boolean anyImport = false; - for (final String i : imports) { + for (final String i : uniqueImports) { if (i.startsWith("androidx")) { sb.append("import ").append(i).append(";\n"); anyImport = true; @@ -130,7 +137,7 @@ public class FitCodeGen { sb.append("\n"); anyImport = false; } - for (final String i : imports) { + for (final String i : uniqueImports) { if (i.startsWith("nodomain.freeyourgadget")) { sb.append("import ").append(i).append(";\n"); anyImport = true; @@ -141,7 +148,7 @@ public class FitCodeGen { sb.append("\n"); anyImport = false; } - for (final String i : imports) { + for (final String i : uniqueImports) { if (!i.startsWith("androidx") && !i.startsWith("nodomain.freeyourgadget")) { sb.append("import ").append(i).append(";\n"); anyImport = true; @@ -161,7 +168,7 @@ public class FitCodeGen { sb.append("\n"); sb.append(" final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();\n"); sb.append(" if (globalNumber != ").append(globalFITMessage.getNumber()).append(") {\n"); - sb.append(" throw new IllegalArgumentException(\"FitFileId expects global messages of \" + ").append(globalFITMessage.getNumber()).append(" + \", got \" + globalNumber);\n"); + sb.append(" throw new IllegalArgumentException(\"").append(className).append(" expects global messages of \" + ").append(globalFITMessage.getNumber()).append(" + \", got \" + globalNumber);\n"); sb.append(" }\n"); sb.append(" }\n"); @@ -294,4 +301,20 @@ public class FitCodeGen { return ""; } + + public List getImports(final File file) throws IOException { + if (file.exists()) { + final String fileContents = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8); + final List imports = new ArrayList<>(); + + final Matcher m = Pattern.compile("import (.+);") + .matcher(fileContents); + while (m.find()) { + imports.add(m.group(1)); + } + return imports; + } + + return Collections.emptyList(); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java index aa60939ef..05b37173c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java @@ -18,7 +18,7 @@ public class FitAlarmSettings extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 222) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 222 + ", got " + globalNumber); + throw new IllegalArgumentException("FitAlarmSettings expects global messages of " + 222 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java index da48a0934..676fe9b6c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java @@ -16,7 +16,7 @@ public class FitConnectivity extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 127) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 127 + ", got " + globalNumber); + throw new IllegalArgumentException("FitConnectivity expects global messages of " + 127 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java index 50ae99dee..2cf5ab79f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java @@ -16,7 +16,7 @@ public class FitDeveloperData extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 207) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 207 + ", got " + globalNumber); + throw new IllegalArgumentException("FitDeveloperData expects global messages of " + 207 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java index 04cfd9777..4c3174093 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java @@ -16,7 +16,7 @@ public class FitDeviceInfo extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 23) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 23 + ", got " + globalNumber); + throw new IllegalArgumentException("FitDeviceInfo expects global messages of " + 23 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java index 3598f8876..4d2b5da20 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java @@ -16,7 +16,7 @@ public class FitDeviceSettings extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 2) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 2 + ", got " + globalNumber); + throw new IllegalArgumentException("FitDeviceSettings expects global messages of " + 2 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java new file mode 100644 index 000000000..ba9288a4e --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java @@ -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 FitEvent extends RecordData { + public FitEvent(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 21) { + throw new IllegalArgumentException("FitEvent expects global messages of " + 21 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getEvent() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getEventType() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getData() { + return (Long) getFieldByNumber(3); + } + + @Nullable + public Integer getEventGroup() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java index 00e69072e..755c8dc2c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java @@ -16,7 +16,7 @@ public class FitFieldDescription extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 206) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 206 + ", got " + globalNumber); + throw new IllegalArgumentException("FitFieldDescription expects global messages of " + 206 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFileCreator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFileCreator.java index b97f9b3e8..508775ef2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFileCreator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFileCreator.java @@ -16,7 +16,7 @@ public class FitFileCreator extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 49) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 49 + ", got " + globalNumber); + throw new IllegalArgumentException("FitFileCreator expects global messages of " + 49 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java index 35170fa7a..e7ebf54c2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java @@ -5,8 +5,8 @@ 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; -import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionGoalType.Type; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionGoalSource.Source; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionGoalType.Type; // // WARNING: This class was auto-generated, please avoid modifying it directly. @@ -18,7 +18,7 @@ public class FitGoals extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 15) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 15 + ", got " + globalNumber); + throw new IllegalArgumentException("FitGoals expects global messages of " + 15 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsMetadata.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsMetadata.java new file mode 100644 index 000000000..922940e13 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsMetadata.java @@ -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 FitGpsMetadata extends RecordData { + public FitGpsMetadata(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 160) { + throw new IllegalArgumentException("FitGpsMetadata expects global messages of " + 160 + ", got " + globalNumber); + } + } + + @Nullable + public Long getEnhancedAltitude() { + return (Long) getFieldByNumber(3); + } + + @Nullable + public Long getEnhancedSpeed() { + return (Long) getFieldByNumber(4); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java new file mode 100644 index 000000000..43a889892 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java @@ -0,0 +1,27 @@ +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 FitLap extends RecordData { + public FitLap(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 19) { + throw new IllegalArgumentException("FitLap expects global messages of " + 19 + ", got " + globalNumber); + } + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java index 42a96d3d9..956ced2e2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java @@ -16,7 +16,7 @@ public class FitMonitoring extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 55) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 55 + ", got " + globalNumber); + throw new IllegalArgumentException("FitMonitoring expects global messages of " + 55 + ", got " + globalNumber); } } @@ -81,4 +81,27 @@ public class FitMonitoring extends RecordData { } return computedTimestamp; } + + public Integer getComputedActivityType() { + final Integer activityType = getActivityType(); + if (activityType != null) { + return activityType; + } + + final Integer currentActivityTypeIntensity = getCurrentActivityTypeIntensity(); + if (currentActivityTypeIntensity != null) { + return currentActivityTypeIntensity & 0x1F; + } + + return null; + } + + public Integer getComputedIntensity() { + final Integer currentActivityTypeIntensity = getCurrentActivityTypeIntensity(); + if (currentActivityTypeIntensity != null) { + return (currentActivityTypeIntensity >> 5) & 0x7; + } + + return null; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java index c9a16f52f..8b786bf32 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java @@ -16,15 +16,50 @@ public class FitRecord extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 20) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 20 + ", got " + globalNumber); + throw new IllegalArgumentException("FitRecord expects global messages of " + 20 + ", got " + globalNumber); } } + @Nullable + public Long getLatitude() { + return (Long) getFieldByNumber(0); + } + + @Nullable + public Long getLongitude() { + return (Long) getFieldByNumber(1); + } + @Nullable public Integer getHeartRate() { return (Integer) getFieldByNumber(3); } + @Nullable + public Long getDistance() { + return (Long) getFieldByNumber(5); + } + + @Nullable + public Long getEnhancedSpeed() { + return (Long) getFieldByNumber(73); + } + + @Nullable + public Long getEnhancedAltitude() { + return (Long) getFieldByNumber(78); + } + + @Nullable + public Integer getWristHeartRate() { + return (Integer) getFieldByNumber(136); + } + + @Nullable + public Integer getBodyBattery() { + return (Integer) getFieldByNumber(143); + } + @Nullable public Long getTimestamp() { return (Long) getFieldByNumber(253); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java index 459148397..2ee6b976b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java @@ -27,8 +27,14 @@ public class FitRecordDataFactory { return new FitSport(recordDefinition, recordHeader); case 15: return new FitGoals(recordDefinition, recordHeader); + case 18: + return new FitSession(recordDefinition, recordHeader); + case 19: + return new FitLap(recordDefinition, recordHeader); case 20: return new FitRecord(recordDefinition, recordHeader); + case 21: + return new FitEvent(recordDefinition, recordHeader); case 23: return new FitDeviceInfo(recordDefinition, recordHeader); case 49: @@ -41,16 +47,24 @@ public class FitRecordDataFactory { return new FitWeather(recordDefinition, recordHeader); case 159: return new FitWatchfaceSettings(recordDefinition, recordHeader); + case 160: + return new FitGpsMetadata(recordDefinition, recordHeader); case 206: return new FitFieldDescription(recordDefinition, recordHeader); case 207: return new FitDeveloperData(recordDefinition, recordHeader); + case 216: + return new FitTimeInZone(recordDefinition, recordHeader); case 222: return new FitAlarmSettings(recordDefinition, recordHeader); case 227: return new FitStressLevel(recordDefinition, recordHeader); + case 269: + return new FitSpo2(recordDefinition, recordHeader); case 275: return new FitSleepStage(recordDefinition, recordHeader); + case 297: + return new FitRespirationRate(recordDefinition, recordHeader); case 346: return new FitSleepStats(recordDefinition, recordHeader); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRespirationRate.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRespirationRate.java new file mode 100644 index 000000000..a7cf47d20 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRespirationRate.java @@ -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 FitRespirationRate extends RecordData { + public FitRespirationRate(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 297) { + throw new IllegalArgumentException("FitRespirationRate expects global messages of " + 297 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getRespirationRate() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java new file mode 100644 index 000000000..592e8d554 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java @@ -0,0 +1,87 @@ +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 FitSession extends RecordData { + public FitSession(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 18) { + throw new IllegalArgumentException("FitSession expects global messages of " + 18 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getEvent() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getEventType() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getStartTime() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Long getStartLatitude() { + return (Long) getFieldByNumber(3); + } + + @Nullable + public Long getStartLongitude() { + return (Long) getFieldByNumber(4); + } + + @Nullable + public Long getTotalElapsedTime() { + return (Long) getFieldByNumber(7); + } + + @Nullable + public Long getTotalTimerTime() { + return (Long) getFieldByNumber(8); + } + + @Nullable + public Long getTotalDistance() { + return (Long) getFieldByNumber(9); + } + + @Nullable + public Integer getTotalCalories() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Integer getTotalAscent() { + return (Integer) getFieldByNumber(22); + } + + @Nullable + public Integer getTotalDescent() { + return (Integer) getFieldByNumber(23); + } + + @Nullable + public String getSportProfileName() { + return (String) getFieldByNumber(110); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStage.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStage.java index c04143b9d..038137f6f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStage.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStage.java @@ -17,7 +17,7 @@ public class FitSleepStage extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 275) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 275 + ", got " + globalNumber); + throw new IllegalArgumentException("FitSleepStage expects global messages of " + 275 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStats.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStats.java index 0cb76a090..5d70a4aab 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStats.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepStats.java @@ -16,7 +16,7 @@ public class FitSleepStats extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 346) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 346 + ", got " + globalNumber); + throw new IllegalArgumentException("FitSleepStats expects global messages of " + 346 + ", got " + globalNumber); } } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpo2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpo2.java new file mode 100644 index 000000000..4c89e01ec --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpo2.java @@ -0,0 +1,42 @@ +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 FitSpo2 extends RecordData { + public FitSpo2(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 269) { + throw new IllegalArgumentException("FitSpo2 expects global messages of " + 269 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getReadingSpo2() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getReadingConfidence() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getMode() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java index cf154ee0f..8fc2526c5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java @@ -16,7 +16,7 @@ public class FitSport extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 12) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 12 + ", got " + globalNumber); + throw new IllegalArgumentException("FitSport expects global messages of " + 12 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitStressLevel.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitStressLevel.java index 24b07ff5e..a2bb12153 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitStressLevel.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitStressLevel.java @@ -32,7 +32,7 @@ public class FitStressLevel extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 227) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 227 + ", got " + globalNumber); + throw new IllegalArgumentException("FitStressLevel expects global messages of " + 227 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java new file mode 100644 index 000000000..d5b80024a --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java @@ -0,0 +1,67 @@ +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 FitTimeInZone extends RecordData { + public FitTimeInZone(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 216) { + throw new IllegalArgumentException("FitTimeInZone expects global messages of " + 216 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getReferenceMessage() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getReferenceIndex() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getTimeInZone() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Integer getHrZoneHighBoundary() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Integer getHrCalcType() { + return (Integer) getFieldByNumber(10); + } + + @Nullable + public Integer getMaxHeartRate() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Integer getRestingHeartRate() { + return (Integer) getFieldByNumber(12); + } + + @Nullable + public Integer getThresholdHeartRate() { + return (Integer) getFieldByNumber(13); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java index 27cdebde9..6954f5d25 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java @@ -7,11 +7,6 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDef import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionLanguage.Language; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionMeasurementSystem.Type; -import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionMeasurementSystem.Type; -import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionMeasurementSystem.Type; -import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionMeasurementSystem.Type; -import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionMeasurementSystem.Type; -import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionMeasurementSystem.Type; // // WARNING: This class was auto-generated, please avoid modifying it directly. @@ -23,7 +18,7 @@ public class FitUserProfile extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 3) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 3 + ", got " + globalNumber); + throw new IllegalArgumentException("FitUserProfile expects global messages of " + 3 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java index 7b80b36ad..830ca7779 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java @@ -16,7 +16,7 @@ public class FitWatchfaceSettings extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 159) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 159 + ", got " + globalNumber); + throw new IllegalArgumentException("FitWatchfaceSettings expects global messages of " + 159 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeather.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeather.java index aa0bd8b03..95f42d432 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeather.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeather.java @@ -19,7 +19,7 @@ public class FitWeather extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 128) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 128 + ", got " + globalNumber); + throw new IllegalArgumentException("FitWeather expects global messages of " + 128 + ", got " + globalNumber); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitZonesTarget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitZonesTarget.java index 0b317aae6..c7b1a1208 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitZonesTarget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitZonesTarget.java @@ -16,7 +16,7 @@ public class FitZonesTarget extends RecordData { final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); if (globalNumber != 7) { - throw new IllegalArgumentException("FitFileId expects global messages of " + 7 + ", got " + globalNumber); + throw new IllegalArgumentException("FitZonesTarget expects global messages of " + 7 + ", got " + globalNumber); } }