Garmin: Map FTP, training readiness and endurance score fit fields

This commit is contained in:
José Rebelo
2026-01-21 13:36:01 +00:00
parent e2c375eaf3
commit f5ec50cebe
5 changed files with 824 additions and 20 deletions
@@ -296,12 +296,12 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(92, BaseType.UINT8, "avg_fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(93, BaseType.UINT8, "max_fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(94, BaseType.UINT8, "total_fractional_cycles", 128, 0), // cycles
new FieldDefinitionPrimitive(95, BaseType.UINT16, "avg_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(96, BaseType.UINT16, "min_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(97, BaseType.UINT16, "max_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(98, BaseType.UINT16, "avg_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(99, BaseType.UINT16, "min_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(100, BaseType.UINT16, "max_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(95, BaseType.UINT16, "avg_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // g/dL
new FieldDefinitionPrimitive(96, BaseType.UINT16, "min_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // g/dL
new FieldDefinitionPrimitive(97, BaseType.UINT16, "max_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // g/dL
new FieldDefinitionPrimitive(98, BaseType.UINT16, "avg_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // %
new FieldDefinitionPrimitive(99, BaseType.UINT16, "min_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // %
new FieldDefinitionPrimitive(100, BaseType.UINT16, "max_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // %
new FieldDefinitionPrimitive(101, BaseType.UINT8, "avg_left_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(102, BaseType.UINT8, "avg_right_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(103, BaseType.UINT8, "avg_left_pedal_smoothness", 2, 0), // %
@@ -437,7 +437,7 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(54, BaseType.SINT16, "avg_neg_vertical_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(55, BaseType.SINT16, "max_pos_vertical_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(56, BaseType.SINT16, "max_neg_vertical_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(57, BaseType.UINT32, "time_in_hr_zone", FieldDefinitionFactory.FIELD.ARRAY,1000, 0), // s
new FieldDefinitionPrimitive(57, BaseType.UINT32, "time_in_hr_zone", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(58, BaseType.UINT32, "time_in_speed_zone", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(59, BaseType.UINT32, "time_in_cadence_zone", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(60, BaseType.UINT32, "time_in_power_zone", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
@@ -456,12 +456,12 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(81, BaseType.UINT8, "max_fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(82, BaseType.UINT8, "total_fractional_cycles", 128, 0), // cycles
new FieldDefinitionPrimitive(83, BaseType.UINT16, "player_score"),
new FieldDefinitionPrimitive(84, BaseType.UINT16, "avg_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(85, BaseType.UINT16, "min_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(86, BaseType.UINT16, "max_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(87, BaseType.UINT16, "avg_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(88, BaseType.UINT16, "min_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(89, BaseType.UINT16, "max_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(84, BaseType.UINT16, "avg_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // g/dL
new FieldDefinitionPrimitive(85, BaseType.UINT16, "min_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // g/dL
new FieldDefinitionPrimitive(86, BaseType.UINT16, "max_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // g/dL
new FieldDefinitionPrimitive(87, BaseType.UINT16, "avg_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // %
new FieldDefinitionPrimitive(88, BaseType.UINT16, "min_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // %
new FieldDefinitionPrimitive(89, BaseType.UINT16, "max_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // %
new FieldDefinitionPrimitive(91, BaseType.UINT8, "avg_left_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(92, BaseType.UINT8, "avg_right_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(93, BaseType.UINT8, "avg_left_pedal_smoothness", 2, 0), // %
@@ -522,10 +522,10 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(6, BaseType.UINT16, "speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(7, BaseType.UINT16, "power"), // watt
new FieldDefinitionPrimitive(8, BaseType.BASE_TYPE_BYTE, 3, "compressed_speed_distance", FieldDefinitionFactory.FIELD.ARRAY, 1, 0), // 12 bit: speed|distance with scale 100|16
new FieldDefinitionPrimitive(9, BaseType.SINT16,"grade", 100, 0), // %
new FieldDefinitionPrimitive(10, BaseType.UINT8,"resistance"),
new FieldDefinitionPrimitive(11, BaseType.SINT32,"time_from_course", 1000, 0), // s
new FieldDefinitionPrimitive(12, BaseType.UINT8,"cycle_length", 100, 0), // m
new FieldDefinitionPrimitive(9, BaseType.SINT16, "grade", 100, 0), // %
new FieldDefinitionPrimitive(10, BaseType.UINT8, "resistance"),
new FieldDefinitionPrimitive(11, BaseType.SINT32, "time_from_course", 1000, 0), // s
new FieldDefinitionPrimitive(12, BaseType.UINT8, "cycle_length", 100, 0), // m
new FieldDefinitionPrimitive(13, BaseType.SINT8, "temperature", 1, 0), // C
new FieldDefinitionPrimitive(17, BaseType.UINT8, "speed_1s", FieldDefinitionFactory.FIELD.ARRAY, 16, 0), // m/s
new FieldDefinitionPrimitive(18, BaseType.UINT8, "cycles"),
@@ -1205,7 +1205,7 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(2, BaseType.SINT32, "position_long", FieldDefinitionFactory.FIELD.COORDINATE),
new FieldDefinitionPrimitive(3, BaseType.UINT32, "distance", 100, 0), // m
new FieldDefinitionPrimitive(4, BaseType.UINT16, "altitude", 5, 500), // m
new FieldDefinitionPrimitive(5, BaseType.UINT32, 6,"leader_time", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(5, BaseType.UINT32, 6, "leader_time", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(6, BaseType.UINT32, "enhanced_altitude", 5, 500), // m
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
@@ -1756,8 +1756,8 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(10, BaseType.UINT8, "avg_heart_rate"), // bpm
new FieldDefinitionPrimitive(11, BaseType.UINT8, "max_heart_rate"), // bpm
new FieldDefinitionPrimitive(12, BaseType.SINT32, "avg_vert_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(13, BaseType.UINT32, "total_calories"), // kcal
new FieldDefinitionPrimitive(77, BaseType.UINT32, "total_moving_time", 1000, 0), // s
new FieldDefinitionPrimitive(13, BaseType.UINT32, "total_calories"), // kcal
new FieldDefinitionPrimitive(77, BaseType.UINT32, "total_moving_time", 1000, 0), // s
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP),
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
@@ -1847,6 +1847,57 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(16, BaseType.ENUM, "unk_16")
));
// Source: #5709
public static GlobalFITMessage FUNCTIONAL_METRICS = new GlobalFITMessage(356, "FUNCTIONAL_METRICS", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT8, "unknown_0"),
new FieldDefinitionPrimitive(2, BaseType.UINT32, "unknown_2"),
new FieldDefinitionPrimitive(3, BaseType.UINT32, "unknown_3"),
new FieldDefinitionPrimitive(4, BaseType.UINT16, "functional_threshold_power"), // W
new FieldDefinitionPrimitive(5, BaseType.UINT8, "unknown_5"),
new FieldDefinitionPrimitive(6, BaseType.UINT8, "unknown_6"),
new FieldDefinitionPrimitive(7, BaseType.UINT16, "unknown_7"),
new FieldDefinitionPrimitive(8, BaseType.UINT8, "unknown_8"),
new FieldDefinitionPrimitive(9, BaseType.UINT8, "unknown_9"),
new FieldDefinitionPrimitive(10, BaseType.UINT16, "unknown_10"),
new FieldDefinitionPrimitive(11, BaseType.ENUM, "unknown_11"),
new FieldDefinitionPrimitive(12, BaseType.ENUM, "unknown_12"),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
// Source: #5710
public static GlobalFITMessage TRAINING_READINESS = new GlobalFITMessage(369, "TRAINING_READINESS", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT8, "training_readiness"),
new FieldDefinitionPrimitive(1, BaseType.ENUM, "level"), // 4 high, 5 prime
new FieldDefinitionPrimitive(2, BaseType.ENUM, "unknown_2"),
new FieldDefinitionPrimitive(3, BaseType.ENUM, "unknown_3"),
new FieldDefinitionPrimitive(4, BaseType.UINT8, "unknown_4"),
new FieldDefinitionPrimitive(5, BaseType.UINT8, "unknown_5"),
new FieldDefinitionPrimitive(6, BaseType.ENUM, "unknown_6"),
new FieldDefinitionPrimitive(7, BaseType.UINT16, "unknown_7"),
new FieldDefinitionPrimitive(8, BaseType.UINT8, "unknown_8"),
new FieldDefinitionPrimitive(9, BaseType.ENUM, "unknown_9"),
new FieldDefinitionPrimitive(10, BaseType.UINT8, "unknown_10"),
new FieldDefinitionPrimitive(11, BaseType.ENUM, "unknown_11"),
new FieldDefinitionPrimitive(12, BaseType.UINT8, "unknown_12"),
new FieldDefinitionPrimitive(13, BaseType.ENUM, "unknown_13"),
new FieldDefinitionPrimitive(14, BaseType.UINT8, "unknown_14"),
new FieldDefinitionPrimitive(15, BaseType.ENUM, "unknown_15"),
new FieldDefinitionPrimitive(16, BaseType.UINT8, "unknown_16"),
new FieldDefinitionPrimitive(17, BaseType.ENUM, "unknown_17"),
new FieldDefinitionPrimitive(18, BaseType.ENUM, "unknown_18"),
new FieldDefinitionPrimitive(19, BaseType.ENUM, "unknown_19"),
new FieldDefinitionPrimitive(20, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone
new FieldDefinitionPrimitive(21, BaseType.UINT16, "unknown_21"),
new FieldDefinitionPrimitive(22, BaseType.UINT16, "unknown_22"),
new FieldDefinitionPrimitive(25, BaseType.ENUM, "unknown_25"),
new FieldDefinitionPrimitive(26, BaseType.ENUM, "unknown_26"),
new FieldDefinitionPrimitive(27, BaseType.ENUM, "unknown_27"),
new FieldDefinitionPrimitive(28, BaseType.ENUM, "unknown_28"),
new FieldDefinitionPrimitive(29, BaseType.ENUM, "unknown_29"),
new FieldDefinitionPrimitive(30, BaseType.ENUM, "unknown_30"),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage HRV_SUMMARY = new GlobalFITMessage(370, "HRV_SUMMARY", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT16, "weekly_average", 128, 0), // milliseconds, scaled by 128
new FieldDefinitionPrimitive(1, BaseType.UINT16, "last_night_average", 128, 0), // milliseconds, scaled by 128
@@ -1962,6 +2013,23 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
// Source: #5708
public static GlobalFITMessage ENDURANCE_SCORE = new GlobalFITMessage(403, "ENDURANCE_SCORE", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT16, "endurance_score"),
new FieldDefinitionPrimitive(1, BaseType.ENUM, "level"), // 6 superior 7 elite
new FieldDefinitionPrimitive(2, BaseType.ENUM, "unknown_2"),
// Matches the boundaries from https://www8.garmin.com/manuals/webhelp/GUID-C001C335-A8EC-4A41-AB0E-BAC434259F92/EN-US/GUID-573861DC-64B1-4120-847F-A944BA683DBA.html
new FieldDefinitionPrimitive(3, BaseType.UINT16, "lower_bound_intermediate"),
new FieldDefinitionPrimitive(4, BaseType.UINT16, "lower_bound_trained"),
new FieldDefinitionPrimitive(5, BaseType.UINT16, "lower_bound_well_trained"),
new FieldDefinitionPrimitive(6, BaseType.UINT16, "lower_bound_expert"),
new FieldDefinitionPrimitive(7, BaseType.UINT16, "lower_bound_superior"),
new FieldDefinitionPrimitive(8, BaseType.UINT16, "lower_bound_elite"),
new FieldDefinitionPrimitive(9, BaseType.UINT16, "unknown_9"),
new FieldDefinitionPrimitive(10, BaseType.UINT16, "unknown_10"),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage HSA_WRIST_TEMPERATURE_DATA = new GlobalFITMessage(409, "HSA_WRIST_TEMPERATURE_DATA", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // s
new FieldDefinitionPrimitive(1, BaseType.UINT16, "value", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // °C
@@ -2105,6 +2173,8 @@ public class GlobalFITMessage {
put(337, ECG_RAW_SAMPLE);
put(338, ECG_SMOOTH_SAMPLE);
put(346, SLEEP_STATS);
put(356, FUNCTIONAL_METRICS);
put(369, TRAINING_READINESS);
put(370, HRV_SUMMARY);
put(371, HRV_VALUE);
put(372, RAW_BBI);
@@ -2119,6 +2189,7 @@ public class GlobalFITMessage {
put(394, CPE_STATUS);
put(397, SKIN_TEMP_RAW);
put(398, SKIN_TEMP_OVERNIGHT);
put(403, ENDURANCE_SCORE);
put(409, HSA_WRIST_TEMPERATURE_DATA);
put(412, NAP);
}};
@@ -0,0 +1,180 @@
/* 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 <https://www.gnu.org/licenses/>. */
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 FitEnduranceScore extends RecordData {
public FitEnduranceScore(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 403) {
throw new IllegalArgumentException("FitEnduranceScore expects global messages of " + 403 + ", got " + globalNumber);
}
}
@Nullable
public Integer getEnduranceScore() {
return getFieldByNumber(0, Integer.class);
}
@Nullable
public Integer getLevel() {
return getFieldByNumber(1, Integer.class);
}
@Nullable
public Integer getUnknown2() {
return getFieldByNumber(2, Integer.class);
}
@Nullable
public Integer getLowerBoundIntermediate() {
return getFieldByNumber(3, Integer.class);
}
@Nullable
public Integer getLowerBoundTrained() {
return getFieldByNumber(4, Integer.class);
}
@Nullable
public Integer getLowerBoundWellTrained() {
return getFieldByNumber(5, Integer.class);
}
@Nullable
public Integer getLowerBoundExpert() {
return getFieldByNumber(6, Integer.class);
}
@Nullable
public Integer getLowerBoundSuperior() {
return getFieldByNumber(7, Integer.class);
}
@Nullable
public Integer getLowerBoundElite() {
return getFieldByNumber(8, Integer.class);
}
@Nullable
public Integer getUnknown9() {
return getFieldByNumber(9, Integer.class);
}
@Nullable
public Integer getUnknown10() {
return getFieldByNumber(10, Integer.class);
}
@Nullable
public Long getTimestamp() {
return getFieldByNumber(253, Long.class);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(403);
}
public Builder setEnduranceScore(final Integer value) {
setFieldByNumber(0, value);
return this;
}
public Builder setLevel(final Integer value) {
setFieldByNumber(1, value);
return this;
}
public Builder setUnknown2(final Integer value) {
setFieldByNumber(2, value);
return this;
}
public Builder setLowerBoundIntermediate(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setLowerBoundTrained(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setLowerBoundWellTrained(final Integer value) {
setFieldByNumber(5, value);
return this;
}
public Builder setLowerBoundExpert(final Integer value) {
setFieldByNumber(6, value);
return this;
}
public Builder setLowerBoundSuperior(final Integer value) {
setFieldByNumber(7, value);
return this;
}
public Builder setLowerBoundElite(final Integer value) {
setFieldByNumber(8, value);
return this;
}
public Builder setUnknown9(final Integer value) {
setFieldByNumber(9, value);
return this;
}
public Builder setUnknown10(final Integer value) {
setFieldByNumber(10, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitEnduranceScore build() {
return (FitEnduranceScore) super.build();
}
@Override
public FitEnduranceScore build(final int localMessageType) {
return (FitEnduranceScore) super.build(localMessageType);
}
}
}
@@ -0,0 +1,190 @@
/* 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 <https://www.gnu.org/licenses/>. */
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 FitFunctionalMetrics extends RecordData {
public FitFunctionalMetrics(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 356) {
throw new IllegalArgumentException("FitFunctionalMetrics expects global messages of " + 356 + ", got " + globalNumber);
}
}
@Nullable
public Integer getUnknown0() {
return getFieldByNumber(0, Integer.class);
}
@Nullable
public Long getUnknown2() {
return getFieldByNumber(2, Long.class);
}
@Nullable
public Long getUnknown3() {
return getFieldByNumber(3, Long.class);
}
@Nullable
public Integer getFunctionalThresholdPower() {
return getFieldByNumber(4, Integer.class);
}
@Nullable
public Integer getUnknown5() {
return getFieldByNumber(5, Integer.class);
}
@Nullable
public Integer getUnknown6() {
return getFieldByNumber(6, Integer.class);
}
@Nullable
public Integer getUnknown7() {
return getFieldByNumber(7, Integer.class);
}
@Nullable
public Integer getUnknown8() {
return getFieldByNumber(8, Integer.class);
}
@Nullable
public Integer getUnknown9() {
return getFieldByNumber(9, Integer.class);
}
@Nullable
public Integer getUnknown10() {
return getFieldByNumber(10, Integer.class);
}
@Nullable
public Integer getUnknown11() {
return getFieldByNumber(11, Integer.class);
}
@Nullable
public Integer getUnknown12() {
return getFieldByNumber(12, Integer.class);
}
@Nullable
public Long getTimestamp() {
return getFieldByNumber(253, Long.class);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(356);
}
public Builder setUnknown0(final Integer value) {
setFieldByNumber(0, value);
return this;
}
public Builder setUnknown2(final Long value) {
setFieldByNumber(2, value);
return this;
}
public Builder setUnknown3(final Long value) {
setFieldByNumber(3, value);
return this;
}
public Builder setFunctionalThresholdPower(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setUnknown5(final Integer value) {
setFieldByNumber(5, value);
return this;
}
public Builder setUnknown6(final Integer value) {
setFieldByNumber(6, value);
return this;
}
public Builder setUnknown7(final Integer value) {
setFieldByNumber(7, value);
return this;
}
public Builder setUnknown8(final Integer value) {
setFieldByNumber(8, value);
return this;
}
public Builder setUnknown9(final Integer value) {
setFieldByNumber(9, value);
return this;
}
public Builder setUnknown10(final Integer value) {
setFieldByNumber(10, value);
return this;
}
public Builder setUnknown11(final Integer value) {
setFieldByNumber(11, value);
return this;
}
public Builder setUnknown12(final Integer value) {
setFieldByNumber(12, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitFunctionalMetrics build() {
return (FitFunctionalMetrics) super.build();
}
@Override
public FitFunctionalMetrics build(final int localMessageType) {
return (FitFunctionalMetrics) super.build(localMessageType);
}
}
}
@@ -156,6 +156,8 @@ public class FitRecordDataFactory {
case 337 -> new FitEcgRawSample(recordDefinition, recordHeader);
case 338 -> new FitEcgSmoothSample(recordDefinition, recordHeader);
case 346 -> new FitSleepStats(recordDefinition, recordHeader);
case 356 -> new FitFunctionalMetrics(recordDefinition, recordHeader);
case 369 -> new FitTrainingReadiness(recordDefinition, recordHeader);
case 370 -> new FitHrvSummary(recordDefinition, recordHeader);
case 371 -> new FitHrvValue(recordDefinition, recordHeader);
case 372 -> new FitRawBbi(recordDefinition, recordHeader);
@@ -170,6 +172,7 @@ public class FitRecordDataFactory {
case 394 -> new FitCpeStatus(recordDefinition, recordHeader);
case 397 -> new FitSkinTempRaw(recordDefinition, recordHeader);
case 398 -> new FitSkinTempOvernight(recordDefinition, recordHeader);
case 403 -> new FitEnduranceScore(recordDefinition, recordHeader);
case 409 -> new FitHsaWristTemperatureData(recordDefinition, recordHeader);
case 412 -> new FitNap(recordDefinition, recordHeader);
default -> new RecordData(recordDefinition, recordHeader);
@@ -0,0 +1,360 @@
/* 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 <https://www.gnu.org/licenses/>. */
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 FitTrainingReadiness extends RecordData {
public FitTrainingReadiness(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 369) {
throw new IllegalArgumentException("FitTrainingReadiness expects global messages of " + 369 + ", got " + globalNumber);
}
}
@Nullable
public Integer getTrainingReadiness() {
return getFieldByNumber(0, Integer.class);
}
@Nullable
public Integer getLevel() {
return getFieldByNumber(1, Integer.class);
}
@Nullable
public Integer getUnknown2() {
return getFieldByNumber(2, Integer.class);
}
@Nullable
public Integer getUnknown3() {
return getFieldByNumber(3, Integer.class);
}
@Nullable
public Integer getUnknown4() {
return getFieldByNumber(4, Integer.class);
}
@Nullable
public Integer getUnknown5() {
return getFieldByNumber(5, Integer.class);
}
@Nullable
public Integer getUnknown6() {
return getFieldByNumber(6, Integer.class);
}
@Nullable
public Integer getUnknown7() {
return getFieldByNumber(7, Integer.class);
}
@Nullable
public Integer getUnknown8() {
return getFieldByNumber(8, Integer.class);
}
@Nullable
public Integer getUnknown9() {
return getFieldByNumber(9, Integer.class);
}
@Nullable
public Integer getUnknown10() {
return getFieldByNumber(10, Integer.class);
}
@Nullable
public Integer getUnknown11() {
return getFieldByNumber(11, Integer.class);
}
@Nullable
public Integer getUnknown12() {
return getFieldByNumber(12, Integer.class);
}
@Nullable
public Integer getUnknown13() {
return getFieldByNumber(13, Integer.class);
}
@Nullable
public Integer getUnknown14() {
return getFieldByNumber(14, Integer.class);
}
@Nullable
public Integer getUnknown15() {
return getFieldByNumber(15, Integer.class);
}
@Nullable
public Integer getUnknown16() {
return getFieldByNumber(16, Integer.class);
}
@Nullable
public Integer getUnknown17() {
return getFieldByNumber(17, Integer.class);
}
@Nullable
public Integer getUnknown18() {
return getFieldByNumber(18, Integer.class);
}
@Nullable
public Integer getUnknown19() {
return getFieldByNumber(19, Integer.class);
}
@Nullable
public Long getLocalTimestamp() {
return getFieldByNumber(20, Long.class);
}
@Nullable
public Integer getUnknown21() {
return getFieldByNumber(21, Integer.class);
}
@Nullable
public Integer getUnknown22() {
return getFieldByNumber(22, Integer.class);
}
@Nullable
public Integer getUnknown25() {
return getFieldByNumber(25, Integer.class);
}
@Nullable
public Integer getUnknown26() {
return getFieldByNumber(26, Integer.class);
}
@Nullable
public Integer getUnknown27() {
return getFieldByNumber(27, Integer.class);
}
@Nullable
public Integer getUnknown28() {
return getFieldByNumber(28, Integer.class);
}
@Nullable
public Integer getUnknown29() {
return getFieldByNumber(29, Integer.class);
}
@Nullable
public Integer getUnknown30() {
return getFieldByNumber(30, Integer.class);
}
@Nullable
public Long getTimestamp() {
return getFieldByNumber(253, Long.class);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(369);
}
public Builder setTrainingReadiness(final Integer value) {
setFieldByNumber(0, value);
return this;
}
public Builder setLevel(final Integer value) {
setFieldByNumber(1, value);
return this;
}
public Builder setUnknown2(final Integer value) {
setFieldByNumber(2, value);
return this;
}
public Builder setUnknown3(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setUnknown4(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setUnknown5(final Integer value) {
setFieldByNumber(5, value);
return this;
}
public Builder setUnknown6(final Integer value) {
setFieldByNumber(6, value);
return this;
}
public Builder setUnknown7(final Integer value) {
setFieldByNumber(7, value);
return this;
}
public Builder setUnknown8(final Integer value) {
setFieldByNumber(8, value);
return this;
}
public Builder setUnknown9(final Integer value) {
setFieldByNumber(9, value);
return this;
}
public Builder setUnknown10(final Integer value) {
setFieldByNumber(10, value);
return this;
}
public Builder setUnknown11(final Integer value) {
setFieldByNumber(11, value);
return this;
}
public Builder setUnknown12(final Integer value) {
setFieldByNumber(12, value);
return this;
}
public Builder setUnknown13(final Integer value) {
setFieldByNumber(13, value);
return this;
}
public Builder setUnknown14(final Integer value) {
setFieldByNumber(14, value);
return this;
}
public Builder setUnknown15(final Integer value) {
setFieldByNumber(15, value);
return this;
}
public Builder setUnknown16(final Integer value) {
setFieldByNumber(16, value);
return this;
}
public Builder setUnknown17(final Integer value) {
setFieldByNumber(17, value);
return this;
}
public Builder setUnknown18(final Integer value) {
setFieldByNumber(18, value);
return this;
}
public Builder setUnknown19(final Integer value) {
setFieldByNumber(19, value);
return this;
}
public Builder setLocalTimestamp(final Long value) {
setFieldByNumber(20, value);
return this;
}
public Builder setUnknown21(final Integer value) {
setFieldByNumber(21, value);
return this;
}
public Builder setUnknown22(final Integer value) {
setFieldByNumber(22, value);
return this;
}
public Builder setUnknown25(final Integer value) {
setFieldByNumber(25, value);
return this;
}
public Builder setUnknown26(final Integer value) {
setFieldByNumber(26, value);
return this;
}
public Builder setUnknown27(final Integer value) {
setFieldByNumber(27, value);
return this;
}
public Builder setUnknown28(final Integer value) {
setFieldByNumber(28, value);
return this;
}
public Builder setUnknown29(final Integer value) {
setFieldByNumber(29, value);
return this;
}
public Builder setUnknown30(final Integer value) {
setFieldByNumber(30, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitTrainingReadiness build() {
return (FitTrainingReadiness) super.build();
}
@Override
public FitTrainingReadiness build(final int localMessageType) {
return (FitTrainingReadiness) super.build(localMessageType);
}
}
}