mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Garmin: Map FTP, training readiness and endurance score fit fields
This commit is contained in:
+91
-20
@@ -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);
|
||||
}};
|
||||
|
||||
+180
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+190
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -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);
|
||||
|
||||
+360
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user