From 135842de07bbc449d1130c3048984fd9c5fc630f Mon Sep 17 00:00:00 2001 From: Thomas Kuehne Date: Fri, 19 Jun 2026 21:22:59 +0000 Subject: [PATCH] Garmin: decode more fit fields Message 318 contains solar charging information that could be used as a proxy for sunlight intensity (#5874). --- .../devices/garmin/fit/NativeFITMessage.java | 96 +++++- .../fit/messages/FitAcclimatization.java | 80 +++++ .../fit/messages/FitDeviceSettings.java | 290 ++++++++++++++++++ .../garmin/fit/messages/FitDeviceUsed.java | 10 + .../devices/garmin/fit/messages/FitFiles.java | 90 ++++++ .../garmin/fit/messages/FitGnssMonitor.java | 80 +++++ .../devices/garmin/fit/messages/FitLap.java | 54 ++-- .../garmin/fit/messages/FitMetricsInfo.java | 90 ++++++ .../fit/messages/FitMonitorAltitude.java | 80 +++++ .../garmin/fit/messages/FitMonitoring.java | 20 ++ .../fit/messages/FitMonitoringAltitude.java | 80 +++++ .../fit/messages/FitPersonalRecord.java | 20 ++ .../fit/messages/FitRacePrediction.java | 120 ++++++++ .../fit/messages/FitRacePredictions.java | 120 ++++++++ .../fit/messages/FitRecordDataFactory.java | 6 + .../fit/messages/FitSensorSettings.java | 20 ++ .../garmin/fit/messages/FitSleepDemand.java | 90 ++++++ .../garmin/fit/messages/FitSleepNeed.java | 90 ++++++ .../garmin/fit/messages/FitSolarCharge.java | 100 ++++++ .../devices/garmin/fit/messages/FitSport.java | 10 + .../garmin/fit/messages/FitUserProfile.java | 20 ++ 21 files changed, 1538 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAcclimatization.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFiles.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGnssMonitor.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetricsInfo.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitorAltitude.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoringAltitude.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePrediction.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePredictions.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepDemand.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepNeed.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSolarCharge.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/NativeFITMessage.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/NativeFITMessage.java index 49e0bdc583..ef776ab288 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/NativeFITMessage.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/NativeFITMessage.java @@ -42,22 +42,40 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(0, BaseType.UINT8, "active_time_zone"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "utc_offset"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "time_offset", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "summer_time_mode"), new FieldDefinitionPrimitive(4, BaseType.ENUM, "time_mode", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(5, BaseType.SINT8, "time_zone_offset", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(8, BaseType.UINT16, "alarms_time", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(9, BaseType.ENUM, "alarms_unk5", FieldDefinitionFactory.FIELD.ARRAY), // [5, 5] + new FieldDefinitionPrimitive(11, BaseType.ENUM, "message_tones"), new FieldDefinitionPrimitive(12, BaseType.ENUM, "backlight_mode"), + new FieldDefinitionPrimitive(13, BaseType.UINT8, "backlight_timeout"), // s + new FieldDefinitionPrimitive(14, BaseType.UINT8, "backlight"), // % + new FieldDefinitionPrimitive(15, BaseType.UINT8, "contrast"), // % + new FieldDefinitionPrimitive(21, BaseType.ENUM, "gnss_mode"), + new FieldDefinitionPrimitive(23, BaseType.ENUM, "map_orientation"), + new FieldDefinitionPrimitive(25, BaseType.ENUM, "map_locations"), + new FieldDefinitionPrimitive(26, BaseType.ENUM, "timezone"), // mapping ? new FieldDefinitionPrimitive(28, BaseType.ENUM, "alarms_enabled", FieldDefinitionFactory.FIELD.ARRAY), // [1,1] + new FieldDefinitionPrimitive(30, BaseType.ENUM, "map_auto_zoom"), + new FieldDefinitionPrimitive(35, BaseType.ENUM, "start_of_week"), new FieldDefinitionPrimitive(36, BaseType.ENUM, "activity_tracker_enabled"), + new FieldDefinitionPrimitive(38, BaseType.ENUM, "wifi_auto_upload_enabled"), new FieldDefinitionPrimitive(39, BaseType.UINT32, "clock_time"), new FieldDefinitionPrimitive(40, BaseType.UINT16, "pages_enabled", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(42, BaseType.ENUM, "auto_max_hr"), + new FieldDefinitionPrimitive(45, BaseType.ENUM, "auto_goal"), new FieldDefinitionPrimitive(46, BaseType.ENUM, "move_alert_enabled"), new FieldDefinitionPrimitive(47, BaseType.ENUM, "date_mode"), + new FieldDefinitionPrimitive(53, BaseType.ENUM, "off_course_warning"), new FieldDefinitionPrimitive(55, BaseType.ENUM, "display_orientation"), new FieldDefinitionPrimitive(56, BaseType.ENUM, "mounting_side"), new FieldDefinitionPrimitive(57, BaseType.UINT16, "default_page", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(58, BaseType.UINT16, "autosync_min_steps"), new FieldDefinitionPrimitive(59, BaseType.UINT16, "autosync_min_time"), + new FieldDefinitionPrimitive(75, BaseType.ENUM, "course_segments"), + new FieldDefinitionPrimitive(76, BaseType.ENUM, "map_show_track"), + new FieldDefinitionPrimitive(77, BaseType.ENUM, "map_track_color"), new FieldDefinitionPrimitive(80, BaseType.ENUM, "lactate_threshold_autodetect_enabled"), new FieldDefinitionPrimitive(86, BaseType.ENUM, "ble_auto_upload_enabled"), new FieldDefinitionPrimitive(89, BaseType.ENUM, "auto_sync_frequency"), @@ -65,8 +83,19 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(92, BaseType.UINT32Z, "alarms_repeat", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(94, BaseType.UINT8, "number_of_screens"), new FieldDefinitionPrimitive(95, BaseType.ENUM, "smart_notification_display_orientation"), + new FieldDefinitionPrimitive(101, BaseType.ENUM, "goal_notification"), + new FieldDefinitionPrimitive(117, BaseType.ENUM, "map_show_details"), new FieldDefinitionPrimitive(134, BaseType.ENUM, "tap_interface"), - new FieldDefinitionPrimitive(174, BaseType.ENUM, "tap_sensitivity") + new FieldDefinitionPrimitive(144, BaseType.ENUM, "activity_true_up"), + new FieldDefinitionPrimitive(148, BaseType.ENUM, "map_show_contour"), + new FieldDefinitionPrimitive(164, BaseType.UINT8, "hr_low_alert_limit"), // BPM + new FieldDefinitionPrimitive(174, BaseType.ENUM, "tap_sensitivity"), + new FieldDefinitionPrimitive(177, BaseType.UINT8, "sleep_backlight_brightness"), // % + new FieldDefinitionPrimitive(178, BaseType.UINT8, "sleep_backlight_timeout"), // s + new FieldDefinitionPrimitive(189, BaseType.ENUM, "screen_brightness"), + new FieldDefinitionPrimitive(192, BaseType.ENUM, "touch_enabled"), + new FieldDefinitionPrimitive(217, BaseType.ENUM, "gnss_default_mode"), + new FieldDefinitionPrimitive(237, BaseType.ENUM, "stress_alert") )); public static final NativeFITMessage USER_PROFILE = new NativeFITMessage(3, "USER_PROFILE", Arrays.asList( @@ -101,6 +130,8 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(41, BaseType.UINT32, "time_last_lthr_update"), new FieldDefinitionPrimitive(47, BaseType.ENUM, "depth_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), new FieldDefinitionPrimitive(49, BaseType.UINT32, "dive_count"), + new FieldDefinitionPrimitive(53, BaseType.UINT8, "moderate_activity"), + new FieldDefinitionPrimitive(54, BaseType.UINT8, "vigorous_activity"), new FieldDefinitionPrimitive(62, BaseType.ENUM, "gender_x"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); @@ -193,6 +224,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), new FieldDefinitionPrimitive(3, BaseType.STRING, 24, "name"), + new FieldDefinitionPrimitive(10, BaseType.UINT8, 3, "color"), new FieldDefinitionPrimitive(15, BaseType.ENUM, "popularity_routing"), new FieldDefinitionPrimitive(17, BaseType.ENUM, "navigation_prompt"), new FieldDefinitionPrimitive(18, BaseType.ENUM, "sharp_bend_warnings"), @@ -504,10 +536,10 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(24, BaseType.ENUM, "lap_trigger"), // 0 manual new FieldDefinitionPrimitive(25, BaseType.ENUM, "sport"), // 5 swimming new FieldDefinitionPrimitive(26, BaseType.UINT8, "event_group"), - new FieldDefinitionPrimitive(25, BaseType.SINT32, "nec_lat", FieldDefinitionFactory.FIELD.COORDINATE), - new FieldDefinitionPrimitive(26, BaseType.SINT32, "nec_long", FieldDefinitionFactory.FIELD.COORDINATE), - new FieldDefinitionPrimitive(27, BaseType.SINT32, "swc_lat", FieldDefinitionFactory.FIELD.COORDINATE), - new FieldDefinitionPrimitive(28, BaseType.SINT32, "swc_long", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(27, BaseType.SINT32, "nec_lat", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(28, BaseType.SINT32, "nec_long", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(29, BaseType.SINT32, "swc_lat", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(30, BaseType.SINT32, "swc_long", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(32, BaseType.UINT16, "num_lengths"), new FieldDefinitionPrimitive(33, BaseType.UINT16, "normalized_power"), // watt new FieldDefinitionPrimitive(34, BaseType.UINT16, "left_right_balance"), @@ -601,6 +633,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(152, BaseType.UINT8, "execution_score"), new FieldDefinitionPrimitive(153, BaseType.FLOAT32, "avg_grit"), new FieldDefinitionPrimitive(154, BaseType.FLOAT32, "avg_flow"), + new FieldDefinitionPrimitive(155, BaseType.UINT16, "calories"), // kcal new FieldDefinitionPrimitive(156, BaseType.UINT8, "total_fractional_ascent", 100, 0), // m new FieldDefinitionPrimitive(157, BaseType.UINT8, "total_fractional_descent", 100, 0), // m new FieldDefinitionPrimitive(158, BaseType.UINT16, "avg_core_temperature", 100, 0), // °C @@ -743,6 +776,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(2, BaseType.UINT8, "cadence"), new FieldDefinitionPrimitive(3, BaseType.UINT8, "elevation"), new FieldDefinitionPrimitive(4, BaseType.UINT8, "heart_rate"), + new FieldDefinitionPrimitive(5, BaseType.ENUM, "calorie"), new FieldDefinitionPrimitive(6, BaseType.UINT8, "power"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); @@ -981,6 +1015,8 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(34, BaseType.UINT16, "vigorous_activity_minutes"), new FieldDefinitionPrimitive(35, BaseType.UINT32, "total_ascent", 1000, 0), // m new FieldDefinitionPrimitive(36, BaseType.UINT32, "total_descent", 1000, 0), // m + new FieldDefinitionPrimitive(37, BaseType.UINT16, "moderate_activity"), // min + new FieldDefinitionPrimitive(38, BaseType.UINT16, "vigorous_activity"), // min new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); @@ -1138,7 +1174,9 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(0, BaseType.ENUM, "metric"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "distance", 100, 0), // m - new FieldDefinitionPrimitive(5, BaseType.UINT32, "record") + new FieldDefinitionPrimitive(5, BaseType.UINT32, "record"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static final NativeFITMessage CONNECTIVITY = new NativeFITMessage(127, "CONNECTIVITY", Arrays.asList( @@ -1203,6 +1241,12 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static final NativeFITMessage FILES = new NativeFITMessage(138, "FILES", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.STRING, 30, "directory"), + new FieldDefinitionPrimitive(2, BaseType.STRING, 30, "file"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + // https://github.com/GoldenCheetah/GoldenCheetah/blob/71e3928bc614f3209d9977d90cc50b942999b855/src/FileIO/FitRideFile.cpp#L1998 public static final NativeFITMessage PHYSIOLOGICAL_METRICS = new NativeFITMessage(140, "PHYSIOLOGICAL_METRICS", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.UINT8, "new_hr_max"), // BPM @@ -1369,8 +1413,10 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(21, BaseType.UINT16, "wheel_size_auto"), // mm new FieldDefinitionPrimitive(32, BaseType.UINT16, "product"), new FieldDefinitionPrimitive(33, BaseType.UINT16, "manufacturer"), + new FieldDefinitionPrimitive(34, BaseType.UINT16, "firmware_version"), new FieldDefinitionPrimitive(45, BaseType.ENUM, "use_for_speed"), new FieldDefinitionPrimitive(46, BaseType.ENUM, "use_for_distance"), + new FieldDefinitionPrimitive(50, BaseType.UINT8, 6, "bluetooth_address"), new FieldDefinitionPrimitive(51, BaseType.ENUM, "connection_type"), new FieldDefinitionPrimitive(52, BaseType.ENUM, "sensor_type"), new FieldDefinitionPrimitive(91, BaseType.STRING, "product_name"), @@ -1932,6 +1978,16 @@ public class NativeFITMessage { )); + public static final NativeFITMessage MONITORING_ALTITUDE = new NativeFITMessage(279, "MONITORING_ALTITUDE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32, "altitude", 5, 500), // m + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static final NativeFITMessage ACCLIMATIZATION = new NativeFITMessage(281, "ACCLIMATIZATION", Arrays.asList( + new FieldDefinitionPrimitive(11, BaseType.UINT16, "altitude"), // m + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static final NativeFITMessage JUMP = new NativeFITMessage(285, "JUMP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.FLOAT32, "distance"), // m new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "heigh"), // m @@ -2100,6 +2156,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static final NativeFITMessage SOLAR_CHARGE = new NativeFITMessage(318, "SOLAR_CHARGE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "percent"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "status"), + new FieldDefinitionPrimitive(3, BaseType.UINT32, "gain"), // ms + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static final NativeFITMessage TANK_UPDATE = new NativeFITMessage(319, "TANK_UPDATE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "sensor"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "pressure", 100, 0), // bar @@ -2148,6 +2211,15 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(0, BaseType.FLOAT32, "value") )); + public static final NativeFITMessage RACE_PREDICTION = new NativeFITMessage(339, "RACE_PREDICTION", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32, "local_timestamp"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "time_5k"), // s + new FieldDefinitionPrimitive(2, BaseType.UINT16, "time_10k"), // s + new FieldDefinitionPrimitive(3, BaseType.UINT16, "time_half_marathon"), // s + new FieldDefinitionPrimitive(4, BaseType.UINT16, "time_full_marathon"), // s + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static final NativeFITMessage SLEEP_STATS = new NativeFITMessage(346, "SLEEP_STATS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "combined_awake_score"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "awake_time_score"), @@ -2388,6 +2460,12 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static final NativeFITMessage SLEEP_DEMAND = new NativeFITMessage(410, "SLEEP_DEMAND", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "normal"), // min + new FieldDefinitionPrimitive(1, BaseType.UINT16, "demand"), // min + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static final NativeFITMessage NAP = new NativeFITMessage(412, "NAP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "start_timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(1, BaseType.SINT16, "start_tz_offset"), // min @@ -2483,6 +2561,7 @@ public class NativeFITMessage { put(129, WEATHER_ALERT); put(131, CADENCE_ZONE); put(132, HR); + put(138, FILES); put(140, PHYSIOLOGICAL_METRICS); put(141, EPO_STATUS); put(142, SEGMENT_LAP); @@ -2544,6 +2623,8 @@ public class NativeFITMessage { put(274, SLEEP_DATA_RAW); put(268, DIVE_SUMMARY); put(275, SLEEP_STAGE); + put(279, MONITORING_ALTITUDE); + put(281, ACCLIMATIZATION); put(285, JUMP); put(289, AAD_ACCEL_FEATURES); put(290, BEAT_INTERVALS); @@ -2562,6 +2643,7 @@ public class NativeFITMessage { put(314, HSA_BODY_BATTERY_DATA); put(315, HSA_EVENT); put(317, CLIMB_PRO); + put(318, SOLAR_CHARGE); put(319, TANK_UPDATE); put(321, POWER_MODE); put(323, TANK_SUMMARY); @@ -2569,6 +2651,7 @@ public class NativeFITMessage { put(336, ECG_SUMMARY); put(337, ECG_RAW_SAMPLE); put(338, ECG_SMOOTH_SAMPLE); + put(339, RACE_PREDICTION); put(346, SLEEP_STATS); put(356, FUNCTIONAL_METRICS); put(358, RACE_EVENT); @@ -2591,6 +2674,7 @@ public class NativeFITMessage { put(402, HILL_SCORE); put(403, ENDURANCE_SCORE); put(409, HSA_WRIST_TEMPERATURE_DATA); + put(410, SLEEP_DEMAND); put(412, NAP); put(428, WORKOUT_SCHEDULE); put(470, SLEEP_DISRUPTION_SEVERITY_PERIOD); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAcclimatization.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAcclimatization.java new file mode 100644 index 0000000000..2abce64d8d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAcclimatization.java @@ -0,0 +1,80 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitAcclimatization extends RecordData { + public FitAcclimatization(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 281) { + throw new IllegalArgumentException("FitAcclimatization expects native messages of " + 281 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getAltitude() { + return getFieldByNumber(11, Integer.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(281); + } + + public Builder setAltitude(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitAcclimatization build() { + return (FitAcclimatization) super.build(); + } + + @Override + public FitAcclimatization build(final int localMessageType) { + return (FitAcclimatization) super.build(localMessageType); + } + } +} 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 69c4d5829e..c7d835da73 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 @@ -54,6 +54,11 @@ public class FitDeviceSettings extends RecordData { return getArrayFieldByNumber(2, Number.class); } + @Nullable + public Integer getSummerTimeMode() { + return getFieldByNumber(3, Integer.class); + } + @Nullable public Number[] getTimeMode() { return getArrayFieldByNumber(4, Number.class); @@ -74,21 +79,76 @@ public class FitDeviceSettings extends RecordData { return getArrayFieldByNumber(9, Number.class); } + @Nullable + public Integer getMessageTones() { + return getFieldByNumber(11, Integer.class); + } + @Nullable public Integer getBacklightMode() { return getFieldByNumber(12, Integer.class); } + @Nullable + public Integer getBacklightTimeout() { + return getFieldByNumber(13, Integer.class); + } + + @Nullable + public Integer getBacklight() { + return getFieldByNumber(14, Integer.class); + } + + @Nullable + public Integer getContrast() { + return getFieldByNumber(15, Integer.class); + } + + @Nullable + public Integer getGnssMode() { + return getFieldByNumber(21, Integer.class); + } + + @Nullable + public Integer getMapOrientation() { + return getFieldByNumber(23, Integer.class); + } + + @Nullable + public Integer getMapLocations() { + return getFieldByNumber(25, Integer.class); + } + + @Nullable + public Integer getTimezone() { + return getFieldByNumber(26, Integer.class); + } + @Nullable public Number[] getAlarmsEnabled() { return getArrayFieldByNumber(28, Number.class); } + @Nullable + public Integer getMapAutoZoom() { + return getFieldByNumber(30, Integer.class); + } + + @Nullable + public Integer getStartOfWeek() { + return getFieldByNumber(35, Integer.class); + } + @Nullable public Integer getActivityTrackerEnabled() { return getFieldByNumber(36, Integer.class); } + @Nullable + public Integer getWifiAutoUploadEnabled() { + return getFieldByNumber(38, Integer.class); + } + @Nullable public Long getClockTime() { return getFieldByNumber(39, Long.class); @@ -99,6 +159,16 @@ public class FitDeviceSettings extends RecordData { return getArrayFieldByNumber(40, Number.class); } + @Nullable + public Integer getAutoMaxHr() { + return getFieldByNumber(42, Integer.class); + } + + @Nullable + public Integer getAutoGoal() { + return getFieldByNumber(45, Integer.class); + } + @Nullable public Integer getMoveAlertEnabled() { return getFieldByNumber(46, Integer.class); @@ -109,6 +179,11 @@ public class FitDeviceSettings extends RecordData { return getFieldByNumber(47, Integer.class); } + @Nullable + public Integer getOffCourseWarning() { + return getFieldByNumber(53, Integer.class); + } + @Nullable public Integer getDisplayOrientation() { return getFieldByNumber(55, Integer.class); @@ -134,6 +209,21 @@ public class FitDeviceSettings extends RecordData { return getFieldByNumber(59, Integer.class); } + @Nullable + public Integer getCourseSegments() { + return getFieldByNumber(75, Integer.class); + } + + @Nullable + public Integer getMapShowTrack() { + return getFieldByNumber(76, Integer.class); + } + + @Nullable + public Integer getMapTrackColor() { + return getFieldByNumber(77, Integer.class); + } + @Nullable public Integer getLactateThresholdAutodetectEnabled() { return getFieldByNumber(80, Integer.class); @@ -169,16 +259,71 @@ public class FitDeviceSettings extends RecordData { return getFieldByNumber(95, Integer.class); } + @Nullable + public Integer getGoalNotification() { + return getFieldByNumber(101, Integer.class); + } + + @Nullable + public Integer getMapShowDetails() { + return getFieldByNumber(117, Integer.class); + } + @Nullable public Integer getTapInterface() { return getFieldByNumber(134, Integer.class); } + @Nullable + public Integer getActivityTrueUp() { + return getFieldByNumber(144, Integer.class); + } + + @Nullable + public Integer getMapShowContour() { + return getFieldByNumber(148, Integer.class); + } + + @Nullable + public Integer getHrLowAlertLimit() { + return getFieldByNumber(164, Integer.class); + } + @Nullable public Integer getTapSensitivity() { return getFieldByNumber(174, Integer.class); } + @Nullable + public Integer getSleepBacklightBrightness() { + return getFieldByNumber(177, Integer.class); + } + + @Nullable + public Integer getSleepBacklightTimeout() { + return getFieldByNumber(178, Integer.class); + } + + @Nullable + public Integer getScreenBrightness() { + return getFieldByNumber(189, Integer.class); + } + + @Nullable + public Integer getTouchEnabled() { + return getFieldByNumber(192, Integer.class); + } + + @Nullable + public Integer getGnssDefaultMode() { + return getFieldByNumber(217, Integer.class); + } + + @Nullable + public Integer getStressAlert() { + return getFieldByNumber(237, Integer.class); + } + /** * @noinspection unused */ @@ -202,6 +347,11 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setSummerTimeMode(final Integer value) { + setFieldByNumber(3, value); + return this; + } + public Builder setTimeMode(final Number[] value) { setFieldByNumber(4, (Object[]) value); return this; @@ -222,21 +372,76 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setMessageTones(final Integer value) { + setFieldByNumber(11, value); + return this; + } + public Builder setBacklightMode(final Integer value) { setFieldByNumber(12, value); return this; } + public Builder setBacklightTimeout(final Integer value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setBacklight(final Integer value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setContrast(final Integer value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setGnssMode(final Integer value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setMapOrientation(final Integer value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setMapLocations(final Integer value) { + setFieldByNumber(25, value); + return this; + } + + public Builder setTimezone(final Integer value) { + setFieldByNumber(26, value); + return this; + } + public Builder setAlarmsEnabled(final Number[] value) { setFieldByNumber(28, (Object[]) value); return this; } + public Builder setMapAutoZoom(final Integer value) { + setFieldByNumber(30, value); + return this; + } + + public Builder setStartOfWeek(final Integer value) { + setFieldByNumber(35, value); + return this; + } + public Builder setActivityTrackerEnabled(final Integer value) { setFieldByNumber(36, value); return this; } + public Builder setWifiAutoUploadEnabled(final Integer value) { + setFieldByNumber(38, value); + return this; + } + public Builder setClockTime(final Long value) { setFieldByNumber(39, value); return this; @@ -247,6 +452,16 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setAutoMaxHr(final Integer value) { + setFieldByNumber(42, value); + return this; + } + + public Builder setAutoGoal(final Integer value) { + setFieldByNumber(45, value); + return this; + } + public Builder setMoveAlertEnabled(final Integer value) { setFieldByNumber(46, value); return this; @@ -257,6 +472,11 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setOffCourseWarning(final Integer value) { + setFieldByNumber(53, value); + return this; + } + public Builder setDisplayOrientation(final Integer value) { setFieldByNumber(55, value); return this; @@ -282,6 +502,21 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setCourseSegments(final Integer value) { + setFieldByNumber(75, value); + return this; + } + + public Builder setMapShowTrack(final Integer value) { + setFieldByNumber(76, value); + return this; + } + + public Builder setMapTrackColor(final Integer value) { + setFieldByNumber(77, value); + return this; + } + public Builder setLactateThresholdAutodetectEnabled(final Integer value) { setFieldByNumber(80, value); return this; @@ -317,16 +552,71 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setGoalNotification(final Integer value) { + setFieldByNumber(101, value); + return this; + } + + public Builder setMapShowDetails(final Integer value) { + setFieldByNumber(117, value); + return this; + } + public Builder setTapInterface(final Integer value) { setFieldByNumber(134, value); return this; } + public Builder setActivityTrueUp(final Integer value) { + setFieldByNumber(144, value); + return this; + } + + public Builder setMapShowContour(final Integer value) { + setFieldByNumber(148, value); + return this; + } + + public Builder setHrLowAlertLimit(final Integer value) { + setFieldByNumber(164, value); + return this; + } + public Builder setTapSensitivity(final Integer value) { setFieldByNumber(174, value); return this; } + public Builder setSleepBacklightBrightness(final Integer value) { + setFieldByNumber(177, value); + return this; + } + + public Builder setSleepBacklightTimeout(final Integer value) { + setFieldByNumber(178, value); + return this; + } + + public Builder setScreenBrightness(final Integer value) { + setFieldByNumber(189, value); + return this; + } + + public Builder setTouchEnabled(final Integer value) { + setFieldByNumber(192, value); + return this; + } + + public Builder setGnssDefaultMode(final Integer value) { + setFieldByNumber(217, value); + return this; + } + + public Builder setStressAlert(final Integer value) { + setFieldByNumber(237, value); + return this; + } + @Override public FitDeviceSettings build() { return (FitDeviceSettings) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java index eb1a3e8bbf..3e19919291 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java @@ -64,6 +64,11 @@ public class FitDeviceUsed extends RecordData { return getFieldByNumber(4, Integer.class); } + @Nullable + public Integer getCalorie() { + return getFieldByNumber(5, Integer.class); + } + @Nullable public Integer getPower() { return getFieldByNumber(6, Integer.class); @@ -107,6 +112,11 @@ public class FitDeviceUsed extends RecordData { return this; } + public Builder setCalorie(final Integer value) { + setFieldByNumber(5, value); + return this; + } + public Builder setPower(final Integer value) { setFieldByNumber(6, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFiles.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFiles.java new file mode 100644 index 0000000000..980bd10520 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFiles.java @@ -0,0 +1,90 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitFiles extends RecordData { + public FitFiles(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 138) { + throw new IllegalArgumentException("FitFiles expects native messages of " + 138 + ", got " + nativeNumber); + } + } + + @Nullable + public String getDirectory() { + return getFieldByNumber(1, String.class); + } + + @Nullable + public String getFile() { + return getFieldByNumber(2, String.class); + } + + @Nullable + public Integer getMessageIndex() { + return getFieldByNumber(254, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(138); + } + + public Builder setDirectory(final String value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setFile(final String value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitFiles build() { + return (FitFiles) super.build(); + } + + @Override + public FitFiles build(final int localMessageType) { + return (FitFiles) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGnssMonitor.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGnssMonitor.java new file mode 100644 index 0000000000..519091013e --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGnssMonitor.java @@ -0,0 +1,80 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitGnssMonitor extends RecordData { + public FitGnssMonitor(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 325) { + throw new IllegalArgumentException("FitGnssMonitor expects native messages of " + 325 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getTracked() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(325); + } + + public Builder setTracked(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitGnssMonitor build() { + return (FitGnssMonitor) super.build(); + } + + @Override + public FitGnssMonitor build(final int localMessageType) { + return (FitGnssMonitor) super.build(localMessageType); + } + } +} 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 index aa589e0515..9238caf79c 100644 --- 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 @@ -177,24 +177,24 @@ public class FitLap extends RecordData { @Nullable public Double getNecLat() { - return getFieldByNumber(25, Double.class); - } - - @Nullable - public Double getNecLong() { - return getFieldByNumber(26, Double.class); - } - - @Nullable - public Double getSwcLat() { return getFieldByNumber(27, Double.class); } @Nullable - public Double getSwcLong() { + public Double getNecLong() { return getFieldByNumber(28, Double.class); } + @Nullable + public Double getSwcLat() { + return getFieldByNumber(29, Double.class); + } + + @Nullable + public Double getSwcLong() { + return getFieldByNumber(30, Double.class); + } + @Nullable public Integer getNumLengths() { return getFieldByNumber(32, Integer.class); @@ -660,6 +660,11 @@ public class FitLap extends RecordData { return getFieldByNumber(154, Float.class); } + @Nullable + public Integer getCalories() { + return getFieldByNumber(155, Integer.class); + } + @Nullable public Float getTotalFractionalAscent() { return getFieldByNumber(156, Float.class); @@ -874,25 +879,25 @@ public class FitLap extends RecordData { } public Builder setNecLat(final Double value) { - setFieldByNumber(25, value); - return this; - } - - public Builder setNecLong(final Double value) { - setFieldByNumber(26, value); - return this; - } - - public Builder setSwcLat(final Double value) { setFieldByNumber(27, value); return this; } - public Builder setSwcLong(final Double value) { + public Builder setNecLong(final Double value) { setFieldByNumber(28, value); return this; } + public Builder setSwcLat(final Double value) { + setFieldByNumber(29, value); + return this; + } + + public Builder setSwcLong(final Double value) { + setFieldByNumber(30, value); + return this; + } + public Builder setNumLengths(final Integer value) { setFieldByNumber(32, value); return this; @@ -1358,6 +1363,11 @@ public class FitLap extends RecordData { return this; } + public Builder setCalories(final Integer value) { + setFieldByNumber(155, value); + return this; + } + public Builder setTotalFractionalAscent(final Float value) { setFieldByNumber(156, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetricsInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetricsInfo.java new file mode 100644 index 0000000000..ee3cd0cc97 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetricsInfo.java @@ -0,0 +1,90 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitMetricsInfo extends RecordData { + public FitMetricsInfo(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 241) { + throw new IllegalArgumentException("FitMetricsInfo expects native messages of " + 241 + ", got " + nativeNumber); + } + } + + @Nullable + public Long getLocalTimestamp() { + return getFieldByNumber(0, Long.class); + } + + @Nullable + public Integer getTrainingPaused() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(241); + } + + public Builder setLocalTimestamp(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTrainingPaused(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitMetricsInfo build() { + return (FitMetricsInfo) super.build(); + } + + @Override + public FitMetricsInfo build(final int localMessageType) { + return (FitMetricsInfo) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitorAltitude.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitorAltitude.java new file mode 100644 index 0000000000..38f973e46f --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitorAltitude.java @@ -0,0 +1,80 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitMonitorAltitude extends RecordData { + public FitMonitorAltitude(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 279) { + throw new IllegalArgumentException("FitMonitorAltitude expects native messages of " + 279 + ", got " + nativeNumber); + } + } + + @Nullable + public Double getAltitude() { + return getFieldByNumber(0, Double.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(279); + } + + public Builder setAltitude(final Double value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitMonitorAltitude build() { + return (FitMonitorAltitude) super.build(); + } + + @Override + public FitMonitorAltitude build(final int localMessageType) { + return (FitMonitorAltitude) super.build(localMessageType); + } + } +} 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 23e1929553..d5733c348d 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 @@ -192,6 +192,16 @@ public class FitMonitoring extends RecordData { return getFieldByNumber(36, Double.class); } + @Nullable + public Integer getModerateActivity() { + return getFieldByNumber(37, Integer.class); + } + + @Nullable + public Integer getVigorousActivity() { + return getFieldByNumber(38, Integer.class); + } + @Nullable public Long getTimestamp() { return getFieldByNumber(253, Long.class); @@ -355,6 +365,16 @@ public class FitMonitoring extends RecordData { return this; } + public Builder setModerateActivity(final Integer value) { + setFieldByNumber(37, value); + return this; + } + + public Builder setVigorousActivity(final Integer value) { + setFieldByNumber(38, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoringAltitude.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoringAltitude.java new file mode 100644 index 0000000000..ddc651d155 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoringAltitude.java @@ -0,0 +1,80 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitMonitoringAltitude extends RecordData { + public FitMonitoringAltitude(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 279) { + throw new IllegalArgumentException("FitMonitoringAltitude expects native messages of " + 279 + ", got " + nativeNumber); + } + } + + @Nullable + public Double getAltitude() { + return getFieldByNumber(0, Double.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(279); + } + + public Builder setAltitude(final Double value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitMonitoringAltitude build() { + return (FitMonitoringAltitude) super.build(); + } + + @Override + public FitMonitoringAltitude build(final int localMessageType) { + return (FitMonitoringAltitude) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPersonalRecord.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPersonalRecord.java index 388aa208ce..c8e479e7e0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPersonalRecord.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPersonalRecord.java @@ -59,6 +59,16 @@ public class FitPersonalRecord extends RecordData { return getFieldByNumber(5, Long.class); } + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + @Nullable + public Integer getMessageIndex() { + return getFieldByNumber(254, Integer.class); + } + /** * @noinspection unused */ @@ -87,6 +97,16 @@ public class FitPersonalRecord extends RecordData { return this; } + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + @Override public FitPersonalRecord build() { return (FitPersonalRecord) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePrediction.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePrediction.java new file mode 100644 index 0000000000..a4d9d5dfdb --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePrediction.java @@ -0,0 +1,120 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitRacePrediction extends RecordData { + public FitRacePrediction(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 339) { + throw new IllegalArgumentException("FitRacePrediction expects native messages of " + 339 + ", got " + nativeNumber); + } + } + + @Nullable + public Long getLocalTimestamp() { + return getFieldByNumber(0, Long.class); + } + + @Nullable + public Integer getTime5k() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getTime10k() { + return getFieldByNumber(2, Integer.class); + } + + @Nullable + public Integer getTimeHalfMarathon() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Integer getTimeFullMarathon() { + return getFieldByNumber(4, Integer.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(339); + } + + public Builder setLocalTimestamp(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTime5k(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTime10k(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTimeHalfMarathon(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimeFullMarathon(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitRacePrediction build() { + return (FitRacePrediction) super.build(); + } + + @Override + public FitRacePrediction build(final int localMessageType) { + return (FitRacePrediction) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePredictions.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePredictions.java new file mode 100644 index 0000000000..342d0c74f0 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRacePredictions.java @@ -0,0 +1,120 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitRacePredictions extends RecordData { + public FitRacePredictions(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 339) { + throw new IllegalArgumentException("FitRacePredictions expects native messages of " + 339 + ", got " + nativeNumber); + } + } + + @Nullable + public Long getLocalTimestamp() { + return getFieldByNumber(0, Long.class); + } + + @Nullable + public Integer getTime5k() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getTime10k() { + return getFieldByNumber(2, Integer.class); + } + + @Nullable + public Integer getTimeHalfMarathon() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Integer getTimeFullMarathon() { + return getFieldByNumber(4, Integer.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(339); + } + + public Builder setLocalTimestamp(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTime5k(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTime10k(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTimeHalfMarathon(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimeFullMarathon(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitRacePredictions build() { + return (FitRacePredictions) super.build(); + } + + @Override + public FitRacePredictions build(final int localMessageType) { + return (FitRacePredictions) super.build(localMessageType); + } + } +} 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 b18654192a..db937f0724 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 @@ -92,6 +92,7 @@ public class FitRecordDataFactory { case 129 -> new FitWeatherAlert(recordDefinition, recordHeader); case 131 -> new FitCadenceZone(recordDefinition, recordHeader); case 132 -> new FitHr(recordDefinition, recordHeader); + case 138 -> new FitFiles(recordDefinition, recordHeader); case 140 -> new FitPhysiologicalMetrics(recordDefinition, recordHeader); case 141 -> new FitEpoStatus(recordDefinition, recordHeader); case 142 -> new FitSegmentLap(recordDefinition, recordHeader); @@ -153,6 +154,8 @@ public class FitRecordDataFactory { case 273 -> new FitSleepDataInfo(recordDefinition, recordHeader); case 274 -> new FitSleepDataRaw(recordDefinition, recordHeader); case 275 -> new FitSleepStage(recordDefinition, recordHeader); + case 279 -> new FitMonitoringAltitude(recordDefinition, recordHeader); + case 281 -> new FitAcclimatization(recordDefinition, recordHeader); case 285 -> new FitJump(recordDefinition, recordHeader); case 289 -> new FitAadAccelFeatures(recordDefinition, recordHeader); case 290 -> new FitBeatIntervals(recordDefinition, recordHeader); @@ -171,6 +174,7 @@ public class FitRecordDataFactory { case 314 -> new FitHsaBodyBatteryData(recordDefinition, recordHeader); case 315 -> new FitHsaEvent(recordDefinition, recordHeader); case 317 -> new FitClimbPro(recordDefinition, recordHeader); + case 318 -> new FitSolarCharge(recordDefinition, recordHeader); case 319 -> new FitTankUpdate(recordDefinition, recordHeader); case 321 -> new FitPowerMode(recordDefinition, recordHeader); case 323 -> new FitTankSummary(recordDefinition, recordHeader); @@ -178,6 +182,7 @@ public class FitRecordDataFactory { case 336 -> new FitEcgSummary(recordDefinition, recordHeader); case 337 -> new FitEcgRawSample(recordDefinition, recordHeader); case 338 -> new FitEcgSmoothSample(recordDefinition, recordHeader); + case 339 -> new FitRacePrediction(recordDefinition, recordHeader); case 346 -> new FitSleepStats(recordDefinition, recordHeader); case 356 -> new FitFunctionalMetrics(recordDefinition, recordHeader); case 358 -> new FitRaceEvent(recordDefinition, recordHeader); @@ -200,6 +205,7 @@ public class FitRecordDataFactory { case 402 -> new FitHillScore(recordDefinition, recordHeader); case 403 -> new FitEnduranceScore(recordDefinition, recordHeader); case 409 -> new FitHsaWristTemperatureData(recordDefinition, recordHeader); + case 410 -> new FitSleepDemand(recordDefinition, recordHeader); case 412 -> new FitNap(recordDefinition, recordHeader); case 428 -> new FitWorkoutSchedule(recordDefinition, recordHeader); case 470 -> new FitSleepDisruptionSeverityPeriod(recordDefinition, recordHeader); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java index 8c59d40145..31e21a0cd9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java @@ -74,6 +74,11 @@ public class FitSensorSettings extends RecordData { return getFieldByNumber(33, Integer.class); } + @Nullable + public Integer getFirmwareVersion() { + return getFieldByNumber(34, Integer.class); + } + @Nullable public Integer getUseForSpeed() { return getFieldByNumber(45, Integer.class); @@ -84,6 +89,11 @@ public class FitSensorSettings extends RecordData { return getFieldByNumber(46, Integer.class); } + @Nullable + public Integer getBluetoothAddress() { + return getFieldByNumber(50, Integer.class); + } + @Nullable public Integer getConnectionType() { return getFieldByNumber(51, Integer.class); @@ -147,6 +157,11 @@ public class FitSensorSettings extends RecordData { return this; } + public Builder setFirmwareVersion(final Integer value) { + setFieldByNumber(34, value); + return this; + } + public Builder setUseForSpeed(final Integer value) { setFieldByNumber(45, value); return this; @@ -157,6 +172,11 @@ public class FitSensorSettings extends RecordData { return this; } + public Builder setBluetoothAddress(final Integer value) { + setFieldByNumber(50, value); + return this; + } + public Builder setConnectionType(final Integer value) { setFieldByNumber(51, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepDemand.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepDemand.java new file mode 100644 index 0000000000..684a251511 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepDemand.java @@ -0,0 +1,90 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitSleepDemand extends RecordData { + public FitSleepDemand(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 410) { + throw new IllegalArgumentException("FitSleepDemand expects native messages of " + 410 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getNormal() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Integer getDemand() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(410); + } + + public Builder setNormal(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDemand(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitSleepDemand build() { + return (FitSleepDemand) super.build(); + } + + @Override + public FitSleepDemand build(final int localMessageType) { + return (FitSleepDemand) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepNeed.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepNeed.java new file mode 100644 index 0000000000..c7fe8773f0 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepNeed.java @@ -0,0 +1,90 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitSleepNeed extends RecordData { + public FitSleepNeed(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 410) { + throw new IllegalArgumentException("FitSleepNeed expects native messages of " + 410 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getNormal() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Integer getNeed() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(410); + } + + public Builder setNormal(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setNeed(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitSleepNeed build() { + return (FitSleepNeed) super.build(); + } + + @Override + public FitSleepNeed build(final int localMessageType) { + return (FitSleepNeed) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSolarCharge.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSolarCharge.java new file mode 100644 index 0000000000..ac7b62aba8 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSolarCharge.java @@ -0,0 +1,100 @@ +/* Copyright (C) 2026 Freeyourgadget + + 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 + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +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 {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitSolarCharge extends RecordData { + public FitSolarCharge(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 318) { + throw new IllegalArgumentException("FitSolarCharge expects native messages of " + 318 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getPercent() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Integer getStatus() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Long getGain() { + return getFieldByNumber(3, Long.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(318); + } + + public Builder setPercent(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setStatus(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setGain(final Long value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitSolarCharge build() { + return (FitSolarCharge) super.build(); + } + + @Override + public FitSolarCharge build(final int localMessageType) { + return (FitSolarCharge) super.build(localMessageType); + } + } +} 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 eb41d52820..5b6623cebf 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 @@ -54,6 +54,11 @@ public class FitSport extends RecordData { return getFieldByNumber(3, String.class); } + @Nullable + public Integer getColor() { + return getFieldByNumber(10, Integer.class); + } + @Nullable public Integer getPopularityRouting() { return getFieldByNumber(15, Integer.class); @@ -112,6 +117,11 @@ public class FitSport extends RecordData { return this; } + public Builder setColor(final Integer value) { + setFieldByNumber(10, value); + return this; + } + public Builder setPopularityRouting(final Integer value) { setFieldByNumber(15, value); return this; 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 3ad134b00f..dd07e74fbf 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 @@ -196,6 +196,16 @@ public class FitUserProfile extends RecordData { return getFieldByNumber(49, Long.class); } + @Nullable + public Integer getModerateActivity() { + return getFieldByNumber(53, Integer.class); + } + + @Nullable + public Integer getVigorousActivity() { + return getFieldByNumber(54, Integer.class); + } + @Nullable public Integer getGenderX() { return getFieldByNumber(62, Integer.class); @@ -369,6 +379,16 @@ public class FitUserProfile extends RecordData { return this; } + public Builder setModerateActivity(final Integer value) { + setFieldByNumber(53, value); + return this; + } + + public Builder setVigorousActivity(final Integer value) { + setFieldByNumber(54, value); + return this; + } + public Builder setGenderX(final Integer value) { setFieldByNumber(62, value); return this;