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();