From f586f0d52ffe6d96e18c5509d5f56aa4bc0749e8 Mon Sep 17 00:00:00 2001 From: Thomas Kuehne Date: Fri, 8 May 2026 09:35:44 +0000 Subject: [PATCH] Garmin: add more FIT messages and field definitions --- .../devices/garmin/fit/NativeFITMessage.java | 44 ++++- .../garmin/fit/messages/FitBestEffort.java | 14 +- .../garmin/fit/messages/FitBikeProfile.java | 10 ++ .../devices/garmin/fit/messages/FitClubs.java | 80 +++++++++ .../fit/messages/FitMultisportSettings.java | 160 ++++++++++++++++++ .../fit/messages/FitRecordDataFactory.java | 3 + .../devices/garmin/fit/messages/FitSplit.java | 10 ++ .../garmin/fit/messages/FitSplitTime.java | 10 ++ .../fit/messages/FitWaypointHandling.java | 70 ++++++++ .../fit/messages/FitWorkoutSchedule.java | 10 ++ .../garmin/fit/messages/FitZonesTarget.java | 20 +++ 11 files changed, 423 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitClubs.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMultisportSettings.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWaypointHandling.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 7dfda10935..26c3edfee7 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 @@ -156,6 +156,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(40, BaseType.UINT8Z, "rear_gear_num"), new FieldDefinitionPrimitive(41, BaseType.UINT8Z, "rear_gear", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(44, BaseType.ENUM, "shimano_di2_enabled", FieldDefinitionFactory.FIELD.BOOLEAN), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); @@ -164,7 +165,9 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(1, BaseType.UINT8, "max_heart_rate"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "threshold_heart_rate"), new FieldDefinitionPrimitive(5, BaseType.ENUM, "hr_calc_type"), //1=percent_max_hr - new FieldDefinitionPrimitive(7, BaseType.ENUM, "pwr_calc_type") //1=percent_ftp + new FieldDefinitionPrimitive(7, BaseType.ENUM, "pwr_calc_type"), //1=percent_ftp + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static final NativeFITMessage HR_ZONE = new NativeFITMessage(8, "HR_ZONE", Arrays.asList( @@ -1126,8 +1129,9 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(1, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "distance", 100, 0), // m new FieldDefinitionPrimitive(3, BaseType.UINT32, "time", 1000, 0), // s - new FieldDefinitionPrimitive(4, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), - new FieldDefinitionPrimitive(5, BaseType.ENUM, "personal_record") + new FieldDefinitionPrimitive(4, BaseType.UINT32, "start_time", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(5, BaseType.ENUM, "personal_record"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); public static final NativeFITMessage PERSONAL_RECORD = new NativeFITMessage(114, "PERSONAL_RECORD", Arrays.asList( @@ -1328,6 +1332,19 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); + public static final NativeFITMessage MULTISPORT_SETTINGS = new NativeFITMessage(143, "MULTISPORT_SETTINGS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "transitions"), + new FieldDefinitionPrimitive(2, BaseType.UINT8, "number_of_activities"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "auto_pause"), + new FieldDefinitionPrimitive(4, BaseType.ENUM, "alerts"), + new FieldDefinitionPrimitive(5, BaseType.ENUM, "auto_lap"), + new FieldDefinitionPrimitive(6, BaseType.ENUM, "power_save_timeout"), + new FieldDefinitionPrimitive(7, BaseType.ENUM, "auto_scroll"), + new FieldDefinitionPrimitive(8, BaseType.ENUM, "repeat"), + new FieldDefinitionPrimitive(10, BaseType.ENUM, "sport_change") + )); + public static final NativeFITMessage MULTISPORT_ACTIVITY = new NativeFITMessage(144, "MULTISPORT_ACTIVITY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), @@ -1507,6 +1524,11 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(101, BaseType.BASE_TYPE_BYTE, "field_bits") )); + public static final NativeFITMessage CLUBS = new NativeFITMessage(173, "CLUBS", Arrays.asList( + new FieldDefinitionPrimitive(6, BaseType.UINT32, "average_distance", 100, 0), // m + new FieldDefinitionPrimitive(19, BaseType.UINT32, "max_distance", 100, 0) // m + )); + public static final NativeFITMessage OBDII_DATA = new NativeFITMessage(174, "OBDII_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "time_offset", FieldDefinitionFactory.FIELD.ARRAY), // ms @@ -1573,6 +1595,10 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static final NativeFITMessage WAYPOINT_HANDLING = new NativeFITMessage(189, "WAYPOINT_HANDLING", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "action") // 0=add_to_existing, 1=replace_existing 2=delete_all + )); + public static final NativeFITMessage GOLF_COURSE = new NativeFITMessage(190, "GOLF_COURSE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "course_id"), new FieldDefinitionPrimitive(1, BaseType.STRING, "name"), @@ -1760,7 +1786,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(9, BaseType.UINT16, "weight_display_unit"), new FieldDefinitionPrimitive(10, BaseType.UINT16, "message_index"), new FieldDefinitionPrimitive(11, BaseType.UINT16, "wkt_step_index"), - new FieldDefinitionPrimitive(254, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + new FieldDefinitionPrimitive(254, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) // this timestamp is really 254 and not the typical 253 )); public static final NativeFITMessage DIVE_SETTINGS = new NativeFITMessage(258, "DIVE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, "name"), @@ -2004,7 +2030,8 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(11, BaseType.SINT32, "end_position_lat", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(12, BaseType.SINT32, "end_position_long", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(13, BaseType.UINT32, "start_altitude", 500, 5), // m - new FieldDefinitionPrimitive(14, BaseType.UINT32, "end_altitude", 500, 5) // m + new FieldDefinitionPrimitive(14, BaseType.UINT32, "end_altitude", 500, 5), // m + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static final NativeFITMessage SPLIT = new NativeFITMessage(312, "SPLIT", Arrays.asList( @@ -2027,6 +2054,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(74, BaseType.UINT32, "start_elevation", 5, 500), // meter new FieldDefinitionPrimitive(78, BaseType.UINT32, "active_time", 1000, 0), // s new FieldDefinitionPrimitive(110, BaseType.UINT32, "total_moving_time", 1000, 0), // seconds + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); @@ -2378,7 +2406,8 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(5, BaseType.UINT8, "est_aerobic_te", 10, 0), new FieldDefinitionPrimitive(6, BaseType.UINT8, "est_anaer_te", 10, 0), new FieldDefinitionPrimitive(7, BaseType.ENUM, "sport"), - new FieldDefinitionPrimitive(9, BaseType.UINT32, "duration",1000, 0) //s + new FieldDefinitionPrimitive(9, BaseType.UINT32, "duration",1000, 0), //s + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); public static final NativeFITMessage SLEEP_DISRUPTION_SEVERITY_PERIOD = new NativeFITMessage(470, "SLEEP_DISRUPTION_SEVERITY_PERIOD", Arrays.asList( @@ -2457,6 +2486,7 @@ public class NativeFITMessage { put(140, PHYSIOLOGICAL_METRICS); put(141, EPO_STATUS); put(142, SEGMENT_LAP); + put(143, MULTISPORT_SETTINGS); put(144, MULTISPORT_ACTIVITY); put(145, MEMO_GLOB); put(147, SENSOR_SETTINGS); @@ -2475,6 +2505,7 @@ public class NativeFITMessage { put(167, THREE_D_SENSOR_CALIBRATION); put(169, VIDEO_FRAME); put(170, CONNECT_IQ_FIELD); + put(173, CLUBS); put(174, OBDII_DATA); put(177, NMEA_SENTENCE); put(178, AVIATION_ATTITUDE); @@ -2483,6 +2514,7 @@ public class NativeFITMessage { put(186, VIDEO_DESCRIPTION); put(187, VIDEO_CLIP); put(188, OHR_SETTINGS); + put(189, WAYPOINT_HANDLING); put(190, GOLF_COURSE); put(191, GOLF_STATS); put(192, SCORE); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBestEffort.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBestEffort.java index 3725aafa9b..8fd9ba4331 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBestEffort.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBestEffort.java @@ -55,7 +55,7 @@ public class FitBestEffort extends RecordData { } @Nullable - public Long getTimestamp() { + public Long getStartTime() { return getFieldByNumber(4, Long.class); } @@ -64,6 +64,11 @@ public class FitBestEffort extends RecordData { return getFieldByNumber(5, Integer.class); } + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + /** * @noinspection unused */ @@ -87,7 +92,7 @@ public class FitBestEffort extends RecordData { return this; } - public Builder setTimestamp(final Long value) { + public Builder setStartTime(final Long value) { setFieldByNumber(4, value); return this; } @@ -97,6 +102,11 @@ public class FitBestEffort extends RecordData { return this; } + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + @Override public FitBestEffort build() { return (FitBestEffort) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java index 04070ddba7..4bc5029afb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java @@ -194,6 +194,11 @@ public class FitBikeProfile extends RecordData { return getFieldByNumber(44, Boolean.class); } + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + @Nullable public Integer getMessageIndex() { return getFieldByNumber(254, Integer.class); @@ -362,6 +367,11 @@ public class FitBikeProfile 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; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitClubs.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitClubs.java new file mode 100644 index 0000000000..157f2b4618 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitClubs.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 FitClubs extends RecordData { + public FitClubs(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 173) { + throw new IllegalArgumentException("FitClubs expects native messages of " + 173 + ", got " + nativeNumber); + } + } + + @Nullable + public Double getAverageDistance() { + return getFieldByNumber(6, Double.class); + } + + @Nullable + public Double getMaxDistance() { + return getFieldByNumber(19, Double.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(173); + } + + public Builder setAverageDistance(final Double value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setMaxDistance(final Double value) { + setFieldByNumber(19, value); + return this; + } + + @Override + public FitClubs build() { + return (FitClubs) super.build(); + } + + @Override + public FitClubs build(final int localMessageType) { + return (FitClubs) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMultisportSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMultisportSettings.java new file mode 100644 index 0000000000..933692547b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMultisportSettings.java @@ -0,0 +1,160 @@ +/* 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 FitMultisportSettings extends RecordData { + public FitMultisportSettings(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 143) { + throw new IllegalArgumentException("FitMultisportSettings expects native messages of " + 143 + ", got " + nativeNumber); + } + } + + @Nullable + public String getName() { + return getFieldByNumber(0, String.class); + } + + @Nullable + public Integer getTransitions() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getNumberOfActivities() { + return getFieldByNumber(2, Integer.class); + } + + @Nullable + public Integer getAutoPause() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Integer getAlerts() { + return getFieldByNumber(4, Integer.class); + } + + @Nullable + public Integer getAutoLap() { + return getFieldByNumber(5, Integer.class); + } + + @Nullable + public Integer getPowerSaveTimeout() { + return getFieldByNumber(6, Integer.class); + } + + @Nullable + public Integer getAutoScroll() { + return getFieldByNumber(7, Integer.class); + } + + @Nullable + public Integer getRepeat() { + return getFieldByNumber(8, Integer.class); + } + + @Nullable + public Integer getSportChange() { + return getFieldByNumber(10, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(143); + } + + public Builder setName(final String value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTransitions(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setNumberOfActivities(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setAutoPause(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setAlerts(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setAutoLap(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setPowerSaveTimeout(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setAutoScroll(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setRepeat(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setSportChange(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + @Override + public FitMultisportSettings build() { + return (FitMultisportSettings) super.build(); + } + + @Override + public FitMultisportSettings build(final int localMessageType) { + return (FitMultisportSettings) 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 ebf281b696..b18654192a 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 @@ -95,6 +95,7 @@ public class FitRecordDataFactory { case 140 -> new FitPhysiologicalMetrics(recordDefinition, recordHeader); case 141 -> new FitEpoStatus(recordDefinition, recordHeader); case 142 -> new FitSegmentLap(recordDefinition, recordHeader); + case 143 -> new FitMultisportSettings(recordDefinition, recordHeader); case 144 -> new FitMultisportActivity(recordDefinition, recordHeader); case 145 -> new FitMemoGlob(recordDefinition, recordHeader); case 147 -> new FitSensorSettings(recordDefinition, recordHeader); @@ -113,6 +114,7 @@ public class FitRecordDataFactory { case 167 -> new FitThreeDSensorCalibration(recordDefinition, recordHeader); case 169 -> new FitVideoFrame(recordDefinition, recordHeader); case 170 -> new FitConnectIqField(recordDefinition, recordHeader); + case 173 -> new FitClubs(recordDefinition, recordHeader); case 174 -> new FitObdiiData(recordDefinition, recordHeader); case 177 -> new FitNmeaSentence(recordDefinition, recordHeader); case 178 -> new FitAviationAttitude(recordDefinition, recordHeader); @@ -121,6 +123,7 @@ public class FitRecordDataFactory { case 186 -> new FitVideoDescription(recordDefinition, recordHeader); case 187 -> new FitVideoClip(recordDefinition, recordHeader); case 188 -> new FitOhrSettings(recordDefinition, recordHeader); + case 189 -> new FitWaypointHandling(recordDefinition, recordHeader); case 190 -> new FitGolfCourse(recordDefinition, recordHeader); case 191 -> new FitGolfStats(recordDefinition, recordHeader); case 192 -> new FitScore(recordDefinition, recordHeader); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java index 0872e9a9a9..09032d52c3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java @@ -134,6 +134,11 @@ public class FitSplit extends RecordData { return getFieldByNumber(110, Double.class); } + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + @Nullable public Integer getMessageIndex() { return getFieldByNumber(254, Integer.class); @@ -242,6 +247,11 @@ public class FitSplit 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; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplitTime.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplitTime.java index 39a761039d..af18758f21 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplitTime.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplitTime.java @@ -94,6 +94,11 @@ public class FitSplitTime extends RecordData { return getFieldByNumber(14, Double.class); } + @Nullable + public Integer getMessageIndex() { + return getFieldByNumber(254, Integer.class); + } + /** * @noinspection unused */ @@ -157,6 +162,11 @@ public class FitSplitTime extends RecordData { return this; } + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + @Override public FitSplitTime build() { return (FitSplitTime) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWaypointHandling.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWaypointHandling.java new file mode 100644 index 0000000000..8ae338d8e2 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWaypointHandling.java @@ -0,0 +1,70 @@ +/* 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 FitWaypointHandling extends RecordData { + public FitWaypointHandling(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 189) { + throw new IllegalArgumentException("FitWaypointHandling expects native messages of " + 189 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getAction() { + return getFieldByNumber(0, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(189); + } + + public Builder setAction(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + @Override + public FitWaypointHandling build() { + return (FitWaypointHandling) super.build(); + } + + @Override + public FitWaypointHandling build(final int localMessageType) { + return (FitWaypointHandling) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSchedule.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSchedule.java index e96a519942..480c74b4a9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSchedule.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSchedule.java @@ -69,6 +69,11 @@ public class FitWorkoutSchedule extends RecordData { return getFieldByNumber(9, Double.class); } + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + /** * @noinspection unused */ @@ -107,6 +112,11 @@ public class FitWorkoutSchedule extends RecordData { return this; } + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + @Override public FitWorkoutSchedule build() { return (FitWorkoutSchedule) super.build(); 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 189268dd5a..0e3d45f0d7 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 @@ -64,6 +64,16 @@ public class FitZonesTarget extends RecordData { return getFieldByNumber(7, Integer.class); } + @Nullable + public Long getTimestamp() { + return getFieldByNumber(253, Long.class); + } + + @Nullable + public Integer getMessageIndex() { + return getFieldByNumber(254, Integer.class); + } + /** * @noinspection unused */ @@ -97,6 +107,16 @@ public class FitZonesTarget 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 FitZonesTarget build() { return (FitZonesTarget) super.build();