diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java index ccf0a88227..09483e6257 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java @@ -1068,7 +1068,7 @@ public class GarminSupport extends AbstractBTLESingleDeviceSupport implements IC .setEnabled(alarm.getEnabled() ? 1 : 0) .setSound(soundCode) .setBacklight(alarm.getBacklight() ? 1 : 0) - .setSomeTimestamp((long) currentTime) + .setTimeCreated((long) currentTime) .setUnknown7(0) .setLabel(label) .setMessageIndex(numberEnabledAlarms); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitDebug.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitDebug.java index 36f67bd63d..3ba40192ca 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitDebug.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitDebug.java @@ -33,9 +33,16 @@ */ package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit; +import static nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.NativeFITMessage.KNOWN_MESSAGES; + public final class FitDebug { /// format a native number (Native FIT message number) for logging public static String mesgNumLookup(int nativeMessageNumber) { + final NativeFITMessage fit = KNOWN_MESSAGES.getOrDefault(nativeMessageNumber, null); + if (fit != null) { + return fit.getNumber() + "_" + fit.name(); + } + return switch (nativeMessageNumber) { case 0 -> "0_file_id"; case 1 -> "1_capabilities"; 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 545a82df0d..78719df49c 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 @@ -15,7 +15,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.baseTypes * @noinspection ArraysAsListWithZeroOrOneArgument */ public class NativeFITMessage { - public static NativeFITMessage FILE_ID = new NativeFITMessage(0, "FILE_ID", Arrays.asList( + public static final NativeFITMessage FILE_ID = new NativeFITMessage(0, "FILE_ID", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "type", FieldDefinitionFactory.FIELD.FILE_TYPE), new FieldDefinitionPrimitive(1, BaseType.UINT16, "manufacturer"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "product"), @@ -26,14 +26,14 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(8, BaseType.STRING, 20, "product_name") )); - public static NativeFITMessage CAPABILITIES = new NativeFITMessage(1, "CAPABILITIES", Arrays.asList( + public static final NativeFITMessage CAPABILITIES = new NativeFITMessage(1, "CAPABILITIES", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8Z, "languages", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(1, BaseType.UINT8Z, "sports", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(21, BaseType.UINT32Z, "workouts_supported"), new FieldDefinitionPrimitive(23, BaseType.UINT32Z, "connectivity_supported") )); - public static NativeFITMessage DEVICE_SETTINGS = new NativeFITMessage(2, "DEVICE_SETTINGS", Arrays.asList( + public static final NativeFITMessage DEVICE_SETTINGS = new NativeFITMessage(2, "DEVICE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "active_time_zone"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "utc_offset"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "time_offset", FieldDefinitionFactory.FIELD.ARRAY), @@ -64,7 +64,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(174, BaseType.ENUM, "tap_sensitivity") )); - public static NativeFITMessage USER_PROFILE = new NativeFITMessage(3, "USER_PROFILE", Arrays.asList( + public static final NativeFITMessage USER_PROFILE = new NativeFITMessage(3, "USER_PROFILE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, 8, "friendly_name"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "gender"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "age"), @@ -92,7 +92,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(30, BaseType.ENUM, "height_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), new FieldDefinitionPrimitive(31, BaseType.UINT16, "user_running_step_length"), new FieldDefinitionPrimitive(32, BaseType.UINT16, "user_walking_step_length"), - new FieldDefinitionPrimitive(37, BaseType.UINT16, "ltspeed", 10, 0), // km/h + new FieldDefinitionPrimitive(37, BaseType.UINT16, "lactate_threshold_speed", 10, 0), // km/h new FieldDefinitionPrimitive(41, BaseType.UINT32, "time_last_lthr_update"), new FieldDefinitionPrimitive(47, BaseType.ENUM, "depth_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), new FieldDefinitionPrimitive(49, BaseType.UINT32, "dive_count"), @@ -100,7 +100,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage HRM_PROFILE = new NativeFITMessage(4, "HRM_PROFILE", Arrays.asList( + public static final NativeFITMessage HRM_PROFILE = new NativeFITMessage(4, "HRM_PROFILE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled", FieldDefinitionFactory.FIELD.BOOLEAN), new FieldDefinitionPrimitive(1, BaseType.UINT16Z, "hrm_ant_id"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "log_hrv"), @@ -108,7 +108,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SDM_PROFILE = new NativeFITMessage(5, "SDM_PROFILE", Arrays.asList( + public static final NativeFITMessage SDM_PROFILE = new NativeFITMessage(5, "SDM_PROFILE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled", FieldDefinitionFactory.FIELD.BOOLEAN), new FieldDefinitionPrimitive(1, BaseType.UINT16Z, "sdm_ant_id"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "sdm_cal_factor", 10, 0), // % @@ -119,7 +119,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage BIKE_PROFILE = new NativeFITMessage(6, "BIKE_PROFILE", Arrays.asList( + public static final NativeFITMessage BIKE_PROFILE = new NativeFITMessage(6, "BIKE_PROFILE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, "name"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "sub_sport"), @@ -154,7 +154,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage ZONES_TARGET = new NativeFITMessage(7, "ZONES_TARGET", Arrays.asList( + public static final NativeFITMessage ZONES_TARGET = new NativeFITMessage(7, "ZONES_TARGET", Arrays.asList( new FieldDefinitionPrimitive(3, BaseType.UINT16, "functional_threshold_power"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "max_heart_rate"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "threshold_heart_rate"), @@ -162,39 +162,93 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(7, BaseType.ENUM, "pwr_calc_type") //1=percent_ftp )); - public static NativeFITMessage HR_ZONE = new NativeFITMessage(8, "HR_ZONE", Arrays.asList( + public static final NativeFITMessage HR_ZONE = new NativeFITMessage(8, "HR_ZONE", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.UINT8, "high_bpm"), new FieldDefinitionPrimitive(2, BaseType.STRING, "name"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage POWER_ZONE = new NativeFITMessage(9, "POWER_ZONE", Arrays.asList( + public static final NativeFITMessage POWER_ZONE = new NativeFITMessage(9, "POWER_ZONE", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.UINT16, "high_value"), // watt new FieldDefinitionPrimitive(2, BaseType.STRING, "name"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage MET_ZONE = new NativeFITMessage(10, "MET_ZONE", Arrays.asList( + public static final NativeFITMessage MET_ZONE = new NativeFITMessage(10, "MET_ZONE", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.UINT8, "high_bpm"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "calories", 10, 0), // kcal/min new FieldDefinitionPrimitive(3, BaseType.UINT8, "fat_calories", 10, 0), // kcal/min new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SPORT = new NativeFITMessage(12, "SPORT", Arrays.asList( + public static final NativeFITMessage SPORT = new NativeFITMessage(12, "SPORT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), - new FieldDefinitionPrimitive(3, BaseType.STRING, 24, "name") + new FieldDefinitionPrimitive(3, BaseType.STRING, 24, "name"), + new FieldDefinitionPrimitive(15, BaseType.ENUM, "popularity_routing"), + new FieldDefinitionPrimitive(17, BaseType.ENUM, "navigation_prompt"), + new FieldDefinitionPrimitive(18, BaseType.ENUM, "sharp_bend_warnings"), + new FieldDefinitionPrimitive(21, BaseType.ENUM, "workout_videos"), + new FieldDefinitionPrimitive(22, BaseType.ENUM, "high_traffic_road_warnings"), + new FieldDefinitionPrimitive(23, BaseType.ENUM, "road_hazard_warnings"), + new FieldDefinitionPrimitive(24, BaseType.ENUM, "unpaved_road_warnings") )); - public static NativeFITMessage TRAINING_SETTINGS = new NativeFITMessage(13, "TRAINING_SETTINGS", Arrays.asList( + public static final NativeFITMessage TRAINING_SETTINGS = new NativeFITMessage(13, "TRAINING_SETTINGS", Arrays.asList( + new FieldDefinitionPrimitive(2, BaseType.UINT16, "virtual_partner_pace", 1000, 0), // m/s + new FieldDefinitionPrimitive(3, BaseType.ENUM, "auto_lap_mode"), + new FieldDefinitionPrimitive(4, BaseType.UINT32, "auto_lap_distance", 100, 0), // m + new FieldDefinitionPrimitive(7, BaseType.ENUM, "auto_pause"), + new FieldDefinitionPrimitive(8, BaseType.UINT16, "auto_pause_threshold", 1000, 0), // m/s + new FieldDefinitionPrimitive(12, BaseType.ENUM, "power_averaging"), + new FieldDefinitionPrimitive(15, BaseType.ENUM, "auto_scroll"), + new FieldDefinitionPrimitive(18, BaseType.ENUM, "timer_start_prompt"), + new FieldDefinitionPrimitive(22, BaseType.UINT16, "pool_length", 100, 0), // m + new FieldDefinitionPrimitive(25, BaseType.ENUM, "auto_sleep"), + new FieldDefinitionPrimitive(27, BaseType.ENUM, "satellites"), new FieldDefinitionPrimitive(31, BaseType.UINT32, "target_distance", 100, 0), // m new FieldDefinitionPrimitive(32, BaseType.UINT16, "target_speed", 1000, 0), // m/s new FieldDefinitionPrimitive(33, BaseType.UINT32, "target_time", 1, 0), // s + new FieldDefinitionPrimitive(35, BaseType.ENUM, "speed_3_d"), + new FieldDefinitionPrimitive(36, BaseType.ENUM, "distance_3_d"), + new FieldDefinitionPrimitive(37, BaseType.ENUM, "auto_climb"), + new FieldDefinitionPrimitive(40, BaseType.ENUM, "auto_climb_invert_colors"), + new FieldDefinitionPrimitive(41, BaseType.SINT32, "auto_climb_vertical_speed"), // 27.778 m/h? + new FieldDefinitionPrimitive(42, BaseType.UINT8, "auto_climb_mode_switch"), + new FieldDefinitionPrimitive(46, BaseType.ENUM, "lap_key"), + new FieldDefinitionPrimitive(50, BaseType.ENUM, "workout_target_alerts"), + new FieldDefinitionPrimitive(51, BaseType.ENUM, "timer_start_auto"), + new FieldDefinitionPrimitive(52, BaseType.UINT16, "timer_start_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(52, BaseType.ENUM, "segment_alerts"), + new FieldDefinitionPrimitive(57, BaseType.ENUM, "countdown_start"), + new FieldDefinitionPrimitive(63, BaseType.ENUM, "climb_pro"), + new FieldDefinitionPrimitive(67, BaseType.ENUM, "track_consumption"), + new FieldDefinitionPrimitive(69, BaseType.UINT16, "bottle_size"), + new FieldDefinitionPrimitive(70, BaseType.ENUM, "volume"), + new FieldDefinitionPrimitive(80, BaseType.UINT16, "minimum_ride_duration"), + new FieldDefinitionPrimitive(86, BaseType.UINT8, "lane_number"), + new FieldDefinitionPrimitive(87, BaseType.ENUM, "broadcast_heart_rate"), + new FieldDefinitionPrimitive(93, BaseType.ENUM, "self_evaluation"), + new FieldDefinitionPrimitive(102, BaseType.ENUM, "speed_pro"), + new FieldDefinitionPrimitive(103, BaseType.ENUM, "touch"), + new FieldDefinitionPrimitive(106, BaseType.ENUM, "record_temperature"), + new FieldDefinitionPrimitive(109, BaseType.ENUM, "running_power_mode"), + new FieldDefinitionPrimitive(110, BaseType.ENUM, "account_for_wind"), + new FieldDefinitionPrimitive(111, BaseType.ENUM, "climb_pro_mode"), + new FieldDefinitionPrimitive(117, BaseType.ENUM, "climb_detection"), + new FieldDefinitionPrimitive(119, BaseType.ENUM, "climb_pro_terrain"), new FieldDefinitionPrimitive(153, BaseType.UINT32, "precise_target_speed", 1000000, 0) // m/s )); - public static NativeFITMessage GOALS = new NativeFITMessage(15, "GOALS", Arrays.asList( + public static final NativeFITMessage DATA_SCREEN = new NativeFITMessage(14, "DATA_SCREEN", Arrays.asList( + new FieldDefinitionPrimitive(3, BaseType.UINT8, "nr_fields"), + new FieldDefinitionPrimitive(7, BaseType.UINT16, "data_fields"), + new FieldDefinitionPrimitive(8, BaseType.ENUM, "layout"), + new FieldDefinitionPrimitive(9, BaseType.UINT8, "position"), + new FieldDefinitionPrimitive(10, BaseType.ENUM, "screen_type") + )); + + public static final NativeFITMessage GOALS = new NativeFITMessage(15, "GOALS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_date"), @@ -210,7 +264,23 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SESSION = new NativeFITMessage(18, "SESSION", Arrays.asList( + public static final NativeFITMessage ALERT = new NativeFITMessage(16, "ALERT", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.ENUM, "metric"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "value"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "status"), + new FieldDefinitionPrimitive(4, BaseType.STRING, "message"), + new FieldDefinitionPrimitive(5, BaseType.ENUM, "repeat") + )); + + public static final NativeFITMessage RANGE_ALERT = new NativeFITMessage(17, "RANGE_ALERT", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.ENUM, "metric"), + new FieldDefinitionPrimitive(2, BaseType.ENUM, "low_status"), + new FieldDefinitionPrimitive(3, BaseType.UINT16, "low_value"), + new FieldDefinitionPrimitive(4, BaseType.ENUM, "high_status"), + new FieldDefinitionPrimitive(5, BaseType.UINT16, "high_value") + )); + + public static final NativeFITMessage SESSION = new NativeFITMessage(18, "SESSION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), // 8 session 9 lap new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), // 1 stop new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time", FieldDefinitionFactory.FIELD.TIMESTAMP), @@ -365,7 +435,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(185, BaseType.UINT8, "execution_score"), // % new FieldDefinitionPrimitive(186, BaseType.FLOAT32, "avg_grit"), new FieldDefinitionPrimitive(187, BaseType.FLOAT32, "avg_flow"), - new FieldDefinitionPrimitive(188, BaseType.ENUM, "primary_benefit"), // 1 recovery + new FieldDefinitionPrimitive(188, BaseType.ENUM, "primary_benefit"), // 0=no_benefit, 1=recovery, 2=base, 3=tempo, 4=threshold, 5=vo2_max, 6=anaerobic, 7=sprint new FieldDefinitionPrimitive(192, BaseType.UINT8, "workout_feel"), // 0, bad 1 - 100 good new FieldDefinitionPrimitive(193, BaseType.UINT8, "workout_rpe"), // 0, very weak effort 1 - 10 maximum effort (encoded as 10 - 100) new FieldDefinitionPrimitive(194, BaseType.UINT8, "avg_spo2"), @@ -398,7 +468,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage LAP = new NativeFITMessage(19, "LAP", Arrays.asList( + public static final NativeFITMessage LAP = new NativeFITMessage(19, "LAP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), // 9 lap new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), // 1 stop new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time", FieldDefinitionFactory.FIELD.TIMESTAMP), @@ -527,11 +597,18 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(158, BaseType.UINT16, "avg_core_temperature", 100, 0), // °C new FieldDefinitionPrimitive(159, BaseType.UINT16, "min_core_temperature", 100, 0), // °C new FieldDefinitionPrimitive(160, BaseType.UINT16, "max_core_temperature", 100, 0), // °C + new FieldDefinitionPrimitive(161, BaseType.UINT32, "grade_adjusted_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(163, BaseType.UINT8, "unpaved"), // % + new FieldDefinitionPrimitive(164, BaseType.UINT16, "step_speed_loss_distance", 100, 0), // cm/s + new FieldDefinitionPrimitive(165, BaseType.UINT16, "step_speed_loss_percentage", 100, 0), // % + new FieldDefinitionPrimitive(166, BaseType.SINT32, "avg_force", 1000, 0), // N + new FieldDefinitionPrimitive(167, BaseType.SINT32, "max_force", 1000, 0), // N + new FieldDefinitionPrimitive(168, BaseType.SINT32, "normalized_force", 1000, 0), // N new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage RECORD = new NativeFITMessage(20, "RECORD", Arrays.asList( + public static final NativeFITMessage RECORD = new NativeFITMessage(20, "RECORD", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.SINT32, "latitude", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(1, BaseType.SINT32, "longitude", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(2, BaseType.UINT16, "altitude", 5, 500), // m @@ -629,7 +706,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage EVENT = new NativeFITMessage(21, "EVENT", Arrays.asList( + public static final NativeFITMessage EVENT = new NativeFITMessage(21, "EVENT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), // 0 timer, 74 sleep new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), // sleep: 0 start 1 stop, timer: 0 start 4 stop all new FieldDefinitionPrimitive(2, BaseType.UINT16, "data16"), @@ -651,7 +728,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage DEVICE_USED = new NativeFITMessage(22, "DEVICE_USED", Arrays.asList( + public static final NativeFITMessage DEVICE_USED = new NativeFITMessage(22, "DEVICE_USED", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "speed"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "distance"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "cadence"), @@ -661,7 +738,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage DEVICE_INFO = new NativeFITMessage(23, "DEVICE_INFO", Arrays.asList( + public static final NativeFITMessage DEVICE_INFO = new NativeFITMessage(23, "DEVICE_INFO", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "device_index"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "device_type"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "manufacturer"), @@ -684,19 +761,24 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage WORKOUT = new NativeFITMessage(26, "WORKOUT", Arrays.asList( + public static final NativeFITMessage WORKOUT = new NativeFITMessage(26, "WORKOUT", Arrays.asList( new FieldDefinitionPrimitive(4, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(5, BaseType.UINT32Z, "capabilities"), new FieldDefinitionPrimitive(6, BaseType.UINT16, "num_valid_steps"), new FieldDefinitionPrimitive(8, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(9, BaseType.ENUM, "duration_type"), + new FieldDefinitionPrimitive(10, BaseType.UINT32, "duration_value"), new FieldDefinitionPrimitive(11, BaseType.ENUM, "sub_sport"), new FieldDefinitionPrimitive(14, BaseType.UINT16, "pool_length", 100, 0), // m new FieldDefinitionPrimitive(15, BaseType.ENUM, "pool_length_unit"), new FieldDefinitionPrimitive(17, BaseType.STRING, "notes"), + new FieldDefinitionPrimitive(20, BaseType.UINT16, "workout_index"), + new FieldDefinitionPrimitive(21, BaseType.UINT32, "time", 1000, 0), //s + new FieldDefinitionPrimitive(22, BaseType.UINT32, "distance", 100, 0), // m new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage WORKOUT_STEP = new NativeFITMessage(27, "WORKOUT_STEP", Arrays.asList( + public static final NativeFITMessage WORKOUT_STEP = new NativeFITMessage(27, "WORKOUT_STEP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, "wkt_step_name"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "duration_type"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "duration_value"), @@ -711,14 +793,16 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(11, BaseType.UINT16, "exercise_name"), new FieldDefinitionPrimitive(12, BaseType.UINT16, "exercise_weight", 100, 0), // kg new FieldDefinitionPrimitive(13, BaseType.UINT16, "weight_display_unit"), + new FieldDefinitionPrimitive(18, BaseType.ENUM, "skip_last_recover"), new FieldDefinitionPrimitive(19, BaseType.ENUM, "secondary_target_type"), new FieldDefinitionPrimitive(20, BaseType.UINT32, "secondary_target_value"), new FieldDefinitionPrimitive(21, BaseType.UINT32, "secondary_custom_target_value_low"), new FieldDefinitionPrimitive(22, BaseType.UINT32, "secondary_custom_target_value_high"), + new FieldDefinitionPrimitive(31, BaseType.UINT16, "workout_index"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SCHEDULE = new NativeFITMessage(28, "SCHEDULE", Arrays.asList( + public static final NativeFITMessage SCHEDULE = new NativeFITMessage(28, "SCHEDULE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "manufacturer"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "product"), new FieldDefinitionPrimitive(2, BaseType.UINT32Z, "serial_number"), @@ -728,7 +812,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(6, BaseType.UINT32, "scheduled_time") )); - public static NativeFITMessage LOCATION = new NativeFITMessage(29, "LOCATION", Arrays.asList( + public static final NativeFITMessage LOCATION = new NativeFITMessage(29, "LOCATION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, 32, "name"), new FieldDefinitionPrimitive(1, BaseType.SINT32, "position_lat", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(2, BaseType.SINT32, "position_long", FieldDefinitionFactory.FIELD.COORDINATE), @@ -740,7 +824,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage WEIGHT_SCALE = new NativeFITMessage(30, "WEIGHT_SCALE", Arrays.asList( + public static final NativeFITMessage WEIGHT_SCALE = new NativeFITMessage(30, "WEIGHT_SCALE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "weight", 100, 0), // kg new FieldDefinitionPrimitive(1, BaseType.UINT16, "percent_fat", 100, 0), // % new FieldDefinitionPrimitive(2, BaseType.UINT16, "percent_hydration", 100, 0), // % @@ -757,14 +841,14 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage COURSE = new NativeFITMessage(31, "COURSE", Arrays.asList( + public static final NativeFITMessage COURSE = new NativeFITMessage(31, "COURSE", Arrays.asList( new FieldDefinitionPrimitive(4, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(5, BaseType.STRING, 16, "name"), new FieldDefinitionPrimitive(6, BaseType.UINT32Z, "capabilities"), new FieldDefinitionPrimitive(7, BaseType.ENUM, "sub_sport") )); - public static NativeFITMessage COURSE_POINT = new NativeFITMessage(32, "COURSE_POINT", Arrays.asList( + public static final NativeFITMessage COURSE_POINT = new NativeFITMessage(32, "COURSE_POINT", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(2, BaseType.SINT32, "position_lat", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(3, BaseType.SINT32, "position_long", FieldDefinitionFactory.FIELD.COORDINATE), @@ -775,7 +859,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage TOTALS = new NativeFITMessage(33, "TOTALS", Arrays.asList( + public static final NativeFITMessage TOTALS = new NativeFITMessage(33, "TOTALS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "timer_time"), // s new FieldDefinitionPrimitive(1, BaseType.UINT32, "distance"), // m new FieldDefinitionPrimitive(2, BaseType.UINT32, "calories"), // kcal @@ -789,7 +873,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage ACTIVITY = new NativeFITMessage(34, "ACTIVITY", Arrays.asList( + public static final NativeFITMessage ACTIVITY = new NativeFITMessage(34, "ACTIVITY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "total_timer_time"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "num_sessions"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "type"), // 0 manual @@ -800,13 +884,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SOFTWARE = new NativeFITMessage(35, "SOFTWARE", Arrays.asList( + public static final NativeFITMessage SOFTWARE = new NativeFITMessage(35, "SOFTWARE", Arrays.asList( new FieldDefinitionPrimitive(3, BaseType.UINT16, "version", 100, 0), new FieldDefinitionPrimitive(5, BaseType.STRING, "part_number"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage FILE_CAPABILITIES = new NativeFITMessage(37, "FILE_CAPABILITIES", Arrays.asList( + public static final NativeFITMessage FILE_CAPABILITIES = new NativeFITMessage(37, "FILE_CAPABILITIES", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "type"), new FieldDefinitionPrimitive(1, BaseType.UINT8Z, "flags"), new FieldDefinitionPrimitive(2, BaseType.STRING, 16, "directory"), @@ -815,7 +899,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage MESG_CAPABILITIES = new NativeFITMessage(38, "MESG_CAPABILITIES", Arrays.asList( + public static final NativeFITMessage MESG_CAPABILITIES = new NativeFITMessage(38, "MESG_CAPABILITIES", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "file"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "mesg_num"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "count_type"), @@ -824,7 +908,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage FIELD_CAPABILITIES = new NativeFITMessage(39, "FIELD_CAPABILITIES", Arrays.asList( + public static final NativeFITMessage FIELD_CAPABILITIES = new NativeFITMessage(39, "FIELD_CAPABILITIES", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "file"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "mesg_num"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "field_num"), @@ -832,12 +916,12 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage FILE_CREATOR = new NativeFITMessage(49, "FILE_CREATOR", Arrays.asList( + public static final NativeFITMessage FILE_CREATOR = new NativeFITMessage(49, "FILE_CREATOR", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "software_version"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "hardware_version") )); - public static NativeFITMessage BLOOD_PRESSURE = new NativeFITMessage(51, "BLOOD_PRESSURE", Arrays.asList( + public static final NativeFITMessage BLOOD_PRESSURE = new NativeFITMessage(51, "BLOOD_PRESSURE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "systolic_pressure"), // mmHg new FieldDefinitionPrimitive(1, BaseType.UINT16, "diastolic_pressure"), // mmHg new FieldDefinitionPrimitive(2, BaseType.UINT16, "mean_arterial_pressure"), // mmHg @@ -851,13 +935,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SPEED_ZONE = new NativeFITMessage(53, "SPEED_ZONE", Arrays.asList( + public static final NativeFITMessage SPEED_ZONE = new NativeFITMessage(53, "SPEED_ZONE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "high_value", 1000, 0), // m/s new FieldDefinitionPrimitive(1, BaseType.STRING, "name"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage MONITORING = new NativeFITMessage(55, "MONITORING", Arrays.asList( + public static final NativeFITMessage MONITORING = new NativeFITMessage(55, "MONITORING", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "device_index"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "calories"), // kcal new FieldDefinitionPrimitive(2, BaseType.UINT32, "distance"), @@ -891,7 +975,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage MAP_LAYER = new NativeFITMessage(70, "MAP_LAYER", Arrays.asList( + public static final NativeFITMessage MAP_LAYER = new NativeFITMessage(70, "MAP_LAYER", Arrays.asList( new FieldDefinitionPrimitive(2, BaseType.ENUM, "relief_shading"), new FieldDefinitionPrimitive(11, BaseType.ENUM, "orientation"), new FieldDefinitionPrimitive(13, BaseType.ENUM, "user_locations"), @@ -907,7 +991,17 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage TRAINING_FILE = new NativeFITMessage(72, "TRAINING_FILE", Arrays.asList( + public static final NativeFITMessage ROUTING = new NativeFITMessage(71, "ROUTING", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "routing_mode"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "calculation_method"), + new FieldDefinitionPrimitive(2, BaseType.ENUM, "lock_on_road"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "avoidances"), + new FieldDefinitionPrimitive(4, BaseType.ENUM, "route_recalculation"), + new FieldDefinitionPrimitive(5, BaseType.ENUM, "type"), + new FieldDefinitionPrimitive(7, BaseType.ENUM, "course_recalculation") + )); + + public static final NativeFITMessage TRAINING_FILE = new NativeFITMessage(72, "TRAINING_FILE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "type"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "manufacturer"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "product"), @@ -916,11 +1010,11 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HRV = new NativeFITMessage(78, "HRV", Arrays.asList( + public static final NativeFITMessage HRV = new NativeFITMessage(78, "HRV", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ARRAY) )); - public static NativeFITMessage USER_METRICS = new NativeFITMessage(79, "USER_METRICS", Arrays.asList( + public static final NativeFITMessage USER_METRICS = new NativeFITMessage(79, "USER_METRICS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "vo2_max"), // scale: 292.5714286 new FieldDefinitionPrimitive(1, BaseType.UINT8, "age"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "height", 100, 0), // m @@ -928,15 +1022,19 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(4, BaseType.ENUM, "gender"), new FieldDefinitionPrimitive(6, BaseType.UINT8, "max_hr"), new FieldDefinitionPrimitive(8, BaseType.UINT16, "remaining_recovery_time"), // min - new FieldDefinitionPrimitive(15, BaseType.UINT8, "initial_body_battery"), + new FieldDefinitionPrimitive(11, BaseType.UINT16, "lactate_threshold_heart_rate"), // bpm + new FieldDefinitionPrimitive(12, BaseType.UINT16, "lactate_threshold_power"), // watt + new FieldDefinitionPrimitive(13, BaseType.UINT16, "lactate_threshold_speed", 10, 0), // km/h + new FieldDefinitionPrimitive(15, BaseType.UINT8, "beginning_body_battery"), // % new FieldDefinitionPrimitive(16, BaseType.UINT32, "start_of_activity"), + new FieldDefinitionPrimitive(19, BaseType.SINT32, "first_vo2_max"), // 18724.57143 ml/kg/min new FieldDefinitionPrimitive(32, BaseType.UINT8, "beginning_potential"), new FieldDefinitionPrimitive(35, BaseType.UINT32, "end_of_previous_activity"), - new FieldDefinitionPrimitive(39, BaseType.UINT32, "wake_up_time"), + new FieldDefinitionPrimitive(39, BaseType.UINT32, "wake_up_time", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage ANT_RX = new NativeFITMessage(80, "ANT_RX", Arrays.asList( + public static final NativeFITMessage ANT_RX = new NativeFITMessage(80, "ANT_RX", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "fractional_timestamp", 32768, 0), new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "mesg_id"), new FieldDefinitionPrimitive(2, BaseType.BASE_TYPE_BYTE, "mesg_data", FieldDefinitionFactory.FIELD.ARRAY), @@ -945,7 +1043,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage ANT_TX = new NativeFITMessage(81, "ANT_TX", Arrays.asList( + public static final NativeFITMessage ANT_TX = new NativeFITMessage(81, "ANT_TX", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "fractional_timestamp", 32768, 0), new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "mesg_id"), new FieldDefinitionPrimitive(2, BaseType.BASE_TYPE_BYTE, "mesg_data", FieldDefinitionFactory.FIELD.ARRAY), @@ -954,7 +1052,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage ANT_CHANNEL_ID = new NativeFITMessage(82, "ANT_CHANNEL_ID", Arrays.asList( + public static final NativeFITMessage ANT_CHANNEL_ID = new NativeFITMessage(82, "ANT_CHANNEL_ID", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "channel_number"), new FieldDefinitionPrimitive(1, BaseType.UINT8Z, "device_type"), new FieldDefinitionPrimitive(2, BaseType.UINT16Z, "device_number"), @@ -962,7 +1060,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(4, BaseType.UINT8, "device_index") )); - public static NativeFITMessage LENGTH = new NativeFITMessage(101, "LENGTH", Arrays.asList( + public static final NativeFITMessage LENGTH = new NativeFITMessage(101, "LENGTH", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time"), @@ -987,7 +1085,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage MONITORING_INFO = new NativeFITMessage(103, "MONITORING_INFO", Arrays.asList( + public static final NativeFITMessage MONITORING_INFO = new NativeFITMessage(103, "MONITORING_INFO", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone new FieldDefinitionPrimitive(1, BaseType.ENUM, "activity_type", FieldDefinitionFactory.FIELD.ARRAY), // 6 walking, 1 running, 13 ? new FieldDefinitionPrimitive(3, BaseType.UINT16, "steps_to_distance", FieldDefinitionFactory.FIELD.ARRAY, 5000, 0), // same size as activity_type? @@ -996,23 +1094,38 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage DEVICE_STATUS = new NativeFITMessage(104, "DEVICE_STATUS", Arrays.asList( + public static final NativeFITMessage DEVICE_STATUS = new NativeFITMessage(104, "DEVICE_STATUS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "battery_voltage", 1000, 0), // V new FieldDefinitionPrimitive(2, BaseType.UINT8, "battery_level"), // 0 - 100% new FieldDefinitionPrimitive(3, BaseType.SINT8, "temperature"), // °C new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage PAD = new NativeFITMessage(105, "PAD", Arrays.asList( + public static final NativeFITMessage PAD = new NativeFITMessage(105, "PAD", Arrays.asList( // only used to align other messages to memory boundaries )); - public static NativeFITMessage SLAVE_DEVICE = new NativeFITMessage(106, "SLAVE_DEVICE", Arrays.asList( + public static final NativeFITMessage SLAVE_DEVICE = new NativeFITMessage(106, "SLAVE_DEVICE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "manufacturer"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "product") )); - public static NativeFITMessage CONNECTIVITY = new NativeFITMessage(127, "CONNECTIVITY", Arrays.asList( + public static final NativeFITMessage BEST_EFFORT = new NativeFITMessage(113, "BEST_EFFORT", Arrays.asList( + 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") + )); + + public static final NativeFITMessage PERSONAL_RECORD = new NativeFITMessage(114, "PERSONAL_RECORD", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "metric"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "sport"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "distance", 100, 0), // m + new FieldDefinitionPrimitive(5, BaseType.UINT32, "record") + )); + + public static final NativeFITMessage CONNECTIVITY = new NativeFITMessage(127, "CONNECTIVITY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "bluetooth_enabled"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "bluetooth_le_enabled"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "ant_enabled"), @@ -1028,7 +1141,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(12, BaseType.ENUM, "grouptrack_enabled") )); - public static NativeFITMessage WEATHER = new NativeFITMessage(128, "WEATHER", Arrays.asList( + public static final NativeFITMessage WEATHER = new NativeFITMessage(128, "WEATHER", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "weather_report", FieldDefinitionFactory.FIELD.WEATHER_REPORT), new FieldDefinitionPrimitive(1, BaseType.SINT8, "temperature", FieldDefinitionFactory.FIELD.TEMPERATURE), new FieldDefinitionPrimitive(2, BaseType.ENUM, "condition", FieldDefinitionFactory.FIELD.WEATHER_CONDITION), @@ -1050,7 +1163,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage WEATHER_ALERT = new NativeFITMessage(129, "WEATHER_ALERT", Arrays.asList( + public static final NativeFITMessage WEATHER_ALERT = new NativeFITMessage(129, "WEATHER_ALERT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, "report_id"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "issue_time"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "expire_time"), @@ -1059,13 +1172,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage CADENCE_ZONE = new NativeFITMessage(131, "CADENCE_ZONE", Arrays.asList( + public static final NativeFITMessage CADENCE_ZONE = new NativeFITMessage(131, "CADENCE_ZONE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "high_value"), // rpm new FieldDefinitionPrimitive(1, BaseType.STRING, "name"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage HR = new NativeFITMessage(132, "HR", Arrays.asList( + public static final NativeFITMessage HR = new NativeFITMessage(132, "HR", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "fractional_timestamp", 32768, 0), // s new FieldDefinitionPrimitive(1, BaseType.UINT8, "time256", 256, 0), // s new FieldDefinitionPrimitive(6, BaseType.UINT8, "filtered_bpm", FieldDefinitionFactory.FIELD.ARRAY), // bpm @@ -1075,24 +1188,37 @@ public class NativeFITMessage { )); // https://github.com/GoldenCheetah/GoldenCheetah/blob/71e3928bc614f3209d9977d90cc50b942999b855/src/FileIO/FitRideFile.cpp#L1998 - public static NativeFITMessage PHYSIOLOGICAL_METRICS = new NativeFITMessage(140, "PHYSIOLOGICAL_METRICS", Arrays.asList( + public static final NativeFITMessage PHYSIOLOGICAL_METRICS = new NativeFITMessage(140, "PHYSIOLOGICAL_METRICS", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.UINT8, "new_hr_max"), // BPM new FieldDefinitionPrimitive(4, BaseType.UINT8, "aerobic_effect", 10, 0), new FieldDefinitionPrimitive(7, BaseType.SINT32, "met_max", 65536, 0), new FieldDefinitionPrimitive(9, BaseType.UINT16, "recovery_time", 1, 0), // minutes - new FieldDefinitionPrimitive(14, BaseType.UINT16, "lactate_threshold_heart_rate", 1, 0), // bpm - //new FieldDefinitionPrimitive(15, BaseType.UINT16, "lactate_threshold_speed", 1, 0), // m/s // TODO confirm scale + new FieldDefinitionPrimitive(11, BaseType.ENUM, "sport"), + new FieldDefinitionPrimitive(14, BaseType.UINT16, "lactate_threshold_heart_rate"), // bpm + new FieldDefinitionPrimitive(15, BaseType.UINT16, "lactate_threshold_power"), // watt + new FieldDefinitionPrimitive(16, BaseType.UINT16, "lactate_threshold_speed", 10, 0), // km/h + new FieldDefinitionPrimitive(17, BaseType.SINT8, "ending_performance_condition"), new FieldDefinitionPrimitive(20, BaseType.UINT8, "anaerobic_effect", 10, 0), + new FieldDefinitionPrimitive(25, BaseType.UINT8, "ending_body_battery"), // % + new FieldDefinitionPrimitive(29, BaseType.SINT32, "first_vo2_max", 65536, 0), + new FieldDefinitionPrimitive(41, BaseType.ENUM, "primary_benefit"), + new FieldDefinitionPrimitive(48, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone + new FieldDefinitionPrimitive(50, BaseType.UINT8, "ending_potential"), + new FieldDefinitionPrimitive(60, BaseType.UINT16, "total_ascent"), // m + new FieldDefinitionPrimitive(61, BaseType.UINT16, "total_descent"), // m + new FieldDefinitionPrimitive(62, BaseType.UINT16, "average_power"), // watt + new FieldDefinitionPrimitive(63, BaseType.UINT8, "average_heart_rate"), // BPM new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage EPO_STATUS = new NativeFITMessage(141, "EPO_STATUS", Arrays.asList( + public static final NativeFITMessage EPO_STATUS = new NativeFITMessage(141, "EPO_STATUS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "status"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "start_time"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "end_time"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SEGMENT_LAP = new NativeFITMessage(142, "SEGMENT_LAP", Arrays.asList( + public static final NativeFITMessage SEGMENT_LAP = new NativeFITMessage(142, "SEGMENT_LAP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time"), @@ -1190,7 +1316,14 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage MEMO_GLOB = new NativeFITMessage(145, "MEMO_GLOB", Arrays.asList( + 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"), + new FieldDefinitionPrimitive(2, BaseType.ENUM, "lock_device"), + new FieldDefinitionPrimitive(3, BaseType.STRING, "name") + )); + + public static final NativeFITMessage MEMO_GLOB = new NativeFITMessage(145, "MEMO_GLOB", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.BASE_TYPE_BYTE, "memo", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(1, BaseType.UINT16, "mesg_num"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "parent_index"), @@ -1199,16 +1332,23 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(250, BaseType.UINT32, "part_index") )); - public static NativeFITMessage SENSOR_SETTINGS = new NativeFITMessage(147, "SENSOR_SETTINGS", Arrays.asList( + public static final NativeFITMessage SENSOR_SETTINGS = new NativeFITMessage(147, "SENSOR_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "ant_id"), new FieldDefinitionPrimitive(2, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(10, BaseType.UINT16, "wheel_size_manual"), // mm + new FieldDefinitionPrimitive(11, BaseType.UINT16, "calibration_factor"), + new FieldDefinitionPrimitive(21, BaseType.UINT16, "wheel_size_auto"), // mm + new FieldDefinitionPrimitive(32, BaseType.UINT16, "product"), + new FieldDefinitionPrimitive(33, BaseType.UINT16, "manufacturer"), new FieldDefinitionPrimitive(45, BaseType.ENUM, "use_for_speed"), new FieldDefinitionPrimitive(46, BaseType.ENUM, "use_for_distance"), new FieldDefinitionPrimitive(51, BaseType.ENUM, "connection_type"), + new FieldDefinitionPrimitive(52, BaseType.ENUM, "sensor_type"), + new FieldDefinitionPrimitive(91, BaseType.STRING, "product_name"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SEGMENT_ID = new NativeFITMessage(148, "SEGMENT_ID", Arrays.asList( + public static final NativeFITMessage SEGMENT_ID = new NativeFITMessage(148, "SEGMENT_ID", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, 50, "name"), new FieldDefinitionPrimitive(1, BaseType.STRING, 33, "uuid"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "sport"), @@ -1220,7 +1360,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(8, BaseType.ENUM, "selection_type") )); - public static NativeFITMessage SEGMENT_LEADERBOARD_ENTRY = new NativeFITMessage(149, "SEGMENT_LEADERBOARD_ENTRY", Arrays.asList( + public static final NativeFITMessage SEGMENT_LEADERBOARD_ENTRY = new NativeFITMessage(149, "SEGMENT_LEADERBOARD_ENTRY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, 100, "name"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "type"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "group_primary_key"), @@ -1230,7 +1370,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SEGMENT_POINT = new NativeFITMessage(150, "SEGMENT_POINT", Arrays.asList( + public static final NativeFITMessage SEGMENT_POINT = new NativeFITMessage(150, "SEGMENT_POINT", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.SINT32, "position_lat", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(2, BaseType.SINT32, "position_long", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(3, BaseType.UINT32, "distance", 100, 0), // m @@ -1240,7 +1380,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SEGMENT_FILE = new NativeFITMessage(151, "SEGMENT_FILE", Arrays.asList( + public static final NativeFITMessage SEGMENT_FILE = new NativeFITMessage(151, "SEGMENT_FILE", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.STRING, "file_uuid"), new FieldDefinitionPrimitive(3, BaseType.ENUM, "enabled"), new FieldDefinitionPrimitive(4, BaseType.UINT32, "user_profile_primary_key"), @@ -1252,7 +1392,14 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage WORKOUT_SESSION = new NativeFITMessage(158, "WORKOUT_SESSION", Arrays.asList( + public static final NativeFITMessage METRONOME = new NativeFITMessage(152, "METRONOME", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled"), + new FieldDefinitionPrimitive(1, BaseType.UINT8, "beats_per_minute"), //BPM + new FieldDefinitionPrimitive(2, BaseType.UINT8, "alert_frequency"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "sound_and_vibe") + )); + + public static final NativeFITMessage WORKOUT_SESSION = new NativeFITMessage(158, "WORKOUT_SESSION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "num_valid_steps"), @@ -1262,13 +1409,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage WATCHFACE_SETTINGS = new NativeFITMessage(159, "WATCHFACE_SETTINGS", Arrays.asList( + public static final NativeFITMessage WATCHFACE_SETTINGS = new NativeFITMessage(159, "WATCHFACE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "mode"), //1=analog new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "layout"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage GPS_METADATA = new NativeFITMessage(160, "GPS_METADATA", Arrays.asList( + public static final NativeFITMessage GPS_METADATA = new NativeFITMessage(160, "GPS_METADATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.SINT32, "position_lat", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(2, BaseType.SINT32, "position_long", FieldDefinitionFactory.FIELD.COORDINATE), @@ -1280,7 +1427,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage CAMERA_EVENT = new NativeFITMessage(161, "CAMERA_EVENT", Arrays.asList( + public static final NativeFITMessage CAMERA_EVENT = new NativeFITMessage(161, "CAMERA_EVENT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.ENUM, "camera_event_type"), new FieldDefinitionPrimitive(2, BaseType.STRING, "camera_file_uuid"), @@ -1288,7 +1435,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage TIMESTAMP_CORRELATION = new NativeFITMessage(162, "TIMESTAMP_CORRELATION", Arrays.asList( + public static final NativeFITMessage TIMESTAMP_CORRELATION = new NativeFITMessage(162, "TIMESTAMP_CORRELATION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "fractional_timestamp", 32768, 0), new FieldDefinitionPrimitive(1, BaseType.UINT32, "system_timestamp"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "fractional_system_timestamp", 32768, 0), @@ -1298,7 +1445,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage GYROSCOPE_DATA = new NativeFITMessage(164, "GYROSCOPE_DATA", Arrays.asList( + public static final NativeFITMessage GYROSCOPE_DATA = new NativeFITMessage(164, "GYROSCOPE_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_time_offset", FieldDefinitionFactory.FIELD.ARRAY), // ms new FieldDefinitionPrimitive(2, BaseType.UINT16, "gyro_x", FieldDefinitionFactory.FIELD.ARRAY), // count @@ -1310,7 +1457,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage ACCELEROMETER_DATA = new NativeFITMessage(165, "ACCELEROMETER_DATA", Arrays.asList( + public static final NativeFITMessage ACCELEROMETER_DATA = new NativeFITMessage(165, "ACCELEROMETER_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_time_offset", FieldDefinitionFactory.FIELD.ARRAY), // ms new FieldDefinitionPrimitive(2, BaseType.UINT16, "accel_x", FieldDefinitionFactory.FIELD.ARRAY), // count @@ -1325,7 +1472,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage THREE_D_SENSOR_CALIBRATION = new NativeFITMessage(167, "THREE_D_SENSOR_CALIBRATION", Arrays.asList( + public static final NativeFITMessage THREE_D_SENSOR_CALIBRATION = new NativeFITMessage(167, "THREE_D_SENSOR_CALIBRATION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sensor_type"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "calibration_factor"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "calibration_divisor"), @@ -1335,13 +1482,20 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage VIDEO_FRAME = new NativeFITMessage(169, "VIDEO_FRAME", Arrays.asList( + public static final NativeFITMessage VIDEO_FRAME = new NativeFITMessage(169, "VIDEO_FRAME", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT32, "frame_number"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage OBDII_DATA = new NativeFITMessage(174, "OBDII_DATA", Arrays.asList( + public static final NativeFITMessage CONNECT_IQ_FIELD = new NativeFITMessage(170, "CONNECT_IQ_FIELD", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.UINT8, "app_id", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "data_field"), + new FieldDefinitionPrimitive(100, BaseType.UINT8, "screen_id"), + new FieldDefinitionPrimitive(101, BaseType.BASE_TYPE_BYTE, "field_bits") + )); + + 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 new FieldDefinitionPrimitive(2, BaseType.BASE_TYPE_BYTE, "pid"), @@ -1353,13 +1507,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage NMEA_SENTENCE = new NativeFITMessage(177, "NMEA_SENTENCE", Arrays.asList( + public static final NativeFITMessage NMEA_SENTENCE = new NativeFITMessage(177, "NMEA_SENTENCE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.STRING, "sentence"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage AVIATION_ATTITUDE = new NativeFITMessage(178, "AVIATION_ATTITUDE", Arrays.asList( + public static final NativeFITMessage AVIATION_ATTITUDE = new NativeFITMessage(178, "AVIATION_ATTITUDE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT32, "system_time", FieldDefinitionFactory.FIELD.ARRAY), // ms new FieldDefinitionPrimitive(2, BaseType.SINT16, "pitch", FieldDefinitionFactory.FIELD.ARRAY), @@ -1374,25 +1528,25 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage VIDEO = new NativeFITMessage(184, "VIDEO", Arrays.asList( + public static final NativeFITMessage VIDEO = new NativeFITMessage(184, "VIDEO", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, "url"), new FieldDefinitionPrimitive(1, BaseType.STRING, "hosting_provider"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "duration") )); - public static NativeFITMessage VIDEO_TITLE = new NativeFITMessage(185, "VIDEO_TITLE", Arrays.asList( + public static final NativeFITMessage VIDEO_TITLE = new NativeFITMessage(185, "VIDEO_TITLE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "message_count"), new FieldDefinitionPrimitive(1, BaseType.STRING, "text"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage VIDEO_DESCRIPTION = new NativeFITMessage(186, "VIDEO_DESCRIPTION", Arrays.asList( + public static final NativeFITMessage VIDEO_DESCRIPTION = new NativeFITMessage(186, "VIDEO_DESCRIPTION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "message_count"), new FieldDefinitionPrimitive(1, BaseType.STRING, "text"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage VIDEO_CLIP = new NativeFITMessage(187, "VIDEO_CLIP", Arrays.asList( + public static final NativeFITMessage VIDEO_CLIP = new NativeFITMessage(187, "VIDEO_CLIP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "clip_number"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "start_timestamp"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "start_timestamp_ms"), @@ -1402,19 +1556,19 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(7, BaseType.UINT32, "clip_end") // ms )); - public static NativeFITMessage OHR_SETTINGS = new NativeFITMessage(188, "OHR_SETTINGS", Arrays.asList( + public static final NativeFITMessage OHR_SETTINGS = new NativeFITMessage(188, "OHR_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage EXD_SCREEN_CONFIGURATION = new NativeFITMessage(200, "EXD_SCREEN_CONFIGURATION", Arrays.asList( + public static final NativeFITMessage EXD_SCREEN_CONFIGURATION = new NativeFITMessage(200, "EXD_SCREEN_CONFIGURATION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "screen_index"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "field_count"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "layout"), new FieldDefinitionPrimitive(3, BaseType.ENUM, "screen_enabled", FieldDefinitionFactory.FIELD.BOOLEAN) )); - public static NativeFITMessage EXD_DATA_FIELD_CONFIGURATION = new NativeFITMessage(201, "EXD_DATA_FIELD_CONFIGURATION", Arrays.asList( + public static final NativeFITMessage EXD_DATA_FIELD_CONFIGURATION = new NativeFITMessage(201, "EXD_DATA_FIELD_CONFIGURATION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "screen_index"), new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "concept_field"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "field_id"), @@ -1423,7 +1577,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(5, BaseType.STRING, 32, "title") )); - public static NativeFITMessage EXD_DATA_CONCEPT_CONFIGURATION = new NativeFITMessage(202, "EXD_DATA_CONCEPT_CONFIGURATION", Arrays.asList( + public static final NativeFITMessage EXD_DATA_CONCEPT_CONFIGURATION = new NativeFITMessage(202, "EXD_DATA_CONCEPT_CONFIGURATION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "screen_index"), new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "concept_field"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "field_id"), @@ -1437,7 +1591,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(11, BaseType.ENUM, "is_signed", FieldDefinitionFactory.FIELD.BOOLEAN) )); - public static NativeFITMessage FIELD_DESCRIPTION = new NativeFITMessage(206, "FIELD_DESCRIPTION", Arrays.asList( + public static final NativeFITMessage FIELD_DESCRIPTION = new NativeFITMessage(206, "FIELD_DESCRIPTION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "developer_data_index"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "field_definition_number"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "fit_base_type_id"), @@ -1454,7 +1608,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(15, BaseType.UINT8, "native_field_num") )); - public static NativeFITMessage DEVELOPER_DATA = new NativeFITMessage(207, "DEVELOPER_DATA", Arrays.asList( + public static final NativeFITMessage DEVELOPER_DATA = new NativeFITMessage(207, "DEVELOPER_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.BASE_TYPE_BYTE, 16, "developer_id", FieldDefinitionFactory.FIELD.ARRAY, 1, 0), new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, 16, "application_id", FieldDefinitionFactory.FIELD.ARRAY, 1, 0), new FieldDefinitionPrimitive(2, BaseType.UINT16, "manufacturer_id"), @@ -1462,7 +1616,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(4, BaseType.UINT32, "application_version") )); - public static NativeFITMessage MAGNETOMETER_DATA = new NativeFITMessage(208, "MAGNETOMETER_DATA", Arrays.asList( + public static final NativeFITMessage MAGNETOMETER_DATA = new NativeFITMessage(208, "MAGNETOMETER_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_time_offset", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(2, BaseType.UINT16, "mag_x", FieldDefinitionFactory.FIELD.ARRAY), @@ -1474,14 +1628,14 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage BAROMETER_DATA = new NativeFITMessage(209, "BAROMETER_DATA", Arrays.asList( + public static final NativeFITMessage BAROMETER_DATA = new NativeFITMessage(209, "BAROMETER_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_time_offset", FieldDefinitionFactory.FIELD.ARRAY), // ms new FieldDefinitionPrimitive(2, BaseType.UINT32, "baro_pres", FieldDefinitionFactory.FIELD.ARRAY), // Pa new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage ONE_D_SENSOR_CALIBRATION = new NativeFITMessage(210, "ONE_D_SENSOR_CALIBRATION", Arrays.asList( + public static final NativeFITMessage ONE_D_SENSOR_CALIBRATION = new NativeFITMessage(210, "ONE_D_SENSOR_CALIBRATION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sensor_type"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "calibration_factor"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "calibration_divisor"), @@ -1490,13 +1644,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage MONITORING_HR_DATA = new NativeFITMessage(211, "MONITORING_HR_DATA", Arrays.asList( + public static final NativeFITMessage MONITORING_HR_DATA = new NativeFITMessage(211, "MONITORING_HR_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "resting_heart_rate"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "current_day_resting_heart_rate"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage TIME_IN_ZONE = new NativeFITMessage(216, "TIME_IN_ZONE", Arrays.asList( + public static final NativeFITMessage TIME_IN_ZONE = new NativeFITMessage(216, "TIME_IN_ZONE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "reference_message"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "reference_index"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "time_in_zone", FieldDefinitionFactory.FIELD.HR_TIME_IN_ZONE), // seconds @@ -1516,19 +1670,20 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage ALARM_SETTINGS = new NativeFITMessage(222, "ALARM_SETTINGS", Arrays.asList( + public static final NativeFITMessage ALARM_SETTINGS = new NativeFITMessage(222, "ALARM_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ALARM), new FieldDefinitionPrimitive(1, BaseType.UINT32Z, "repeat"), // 31 weekday 96 weekend 126 all except mon 127 daily 128 once new FieldDefinitionPrimitive(2, BaseType.ENUM, "enabled"), // 0/1 new FieldDefinitionPrimitive(3, BaseType.ENUM, "sound"), // 0 none 1 sound 2 vibrate 3 sound+vibrate new FieldDefinitionPrimitive(4, BaseType.ENUM, "backlight"), // 1 - new FieldDefinitionPrimitive(5, BaseType.UINT32, "some_timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(5, BaseType.UINT32, "time_created", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(7, BaseType.UINT8, "unknown7"), // 0 new FieldDefinitionPrimitive(8, BaseType.ENUM, "label", FieldDefinitionFactory.FIELD.ALARM_LABEL), // 0 none 2 workout 3 reminder 4 appointment 6 class 7 meditate 8 bedtime + new FieldDefinitionPrimitive(11, BaseType.UINT32, "time_updated", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SET = new NativeFITMessage(225, "SET", Arrays.asList( + public static final NativeFITMessage SET = new NativeFITMessage(225, "SET", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "duration", 1000, 0), // seconds new FieldDefinitionPrimitive(3, BaseType.UINT16, "repetitions"), new FieldDefinitionPrimitive(4, BaseType.UINT16, "weight", 16, 0), // kg @@ -1541,7 +1696,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(11, BaseType.UINT16, "wkt_step_index"), new FieldDefinitionPrimitive(254, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage DIVE_SETTINGS = new NativeFITMessage(258, "DIVE_SETTINGS", Arrays.asList( + public static final NativeFITMessage DIVE_SETTINGS = new NativeFITMessage(258, "DIVE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.STRING, "name"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "model"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "gf_low"), // % @@ -1578,20 +1733,28 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage DIVE_GAS = new NativeFITMessage(259, "DIVE_GAS", Arrays.asList( + public static final NativeFITMessage DIVE_GAS = new NativeFITMessage(259, "DIVE_GAS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "helium_content"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "oxygen_content"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "status"), new FieldDefinitionPrimitive(3, BaseType.ENUM, "mode"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage STRESS_LEVEL = new NativeFITMessage(227, "STRESS_LEVEL", Arrays.asList( + public static final NativeFITMessage STRESS_LEVEL = new NativeFITMessage(227, "STRESS_LEVEL", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.SINT16, "stress_level_value"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "stress_level_time", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(3, BaseType.SINT8, "body_energy") )); - public static NativeFITMessage DIVE_ALARM = new NativeFITMessage(262, "DIVE_ALARM", Arrays.asList( + public static final NativeFITMessage MUSIC_INFO = new NativeFITMessage(243, "MUSIC_INFO", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32, "start_time"), + new FieldDefinitionPrimitive(2, BaseType.STRING, "title"), + new FieldDefinitionPrimitive(3, BaseType.STRING, "artist"), + new FieldDefinitionPrimitive(4, BaseType.STRING, "genre"), + new FieldDefinitionPrimitive(5, BaseType.UINT16, "duration") + )); + + public static final NativeFITMessage DIVE_ALARM = new NativeFITMessage(262, "DIVE_ALARM", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "depth", 1000, 0), // m new FieldDefinitionPrimitive(1, BaseType.SINT32, "time"), // s new FieldDefinitionPrimitive(2, BaseType.ENUM, "enabled", FieldDefinitionFactory.FIELD.BOOLEAN), @@ -1607,21 +1770,21 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage EXERCISE_TITLE = new NativeFITMessage(264, "EXERCISE_TITLE", Arrays.asList( + public static final NativeFITMessage EXERCISE_TITLE = new NativeFITMessage(264, "EXERCISE_TITLE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "exercise_category"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "exercise_name"), new FieldDefinitionPrimitive(2, BaseType.STRING, "wkt_step_name"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SPO2 = new NativeFITMessage(269, "SPO2", Arrays.asList( + public static final NativeFITMessage SPO2 = new NativeFITMessage(269, "SPO2", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "reading_spo2"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "reading_confidence"), new FieldDefinitionPrimitive(2, BaseType.ENUM, "mode"), // 1 manual 3 periodic new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SLEEP_DATA_INFO = new NativeFITMessage(273, "SLEEP_DATA_INFO", Arrays.asList( + public static final NativeFITMessage SLEEP_DATA_INFO = new NativeFITMessage(273, "SLEEP_DATA_INFO", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "unk0"), // 2 new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_length"), // 60, sample time? new FieldDefinitionPrimitive(2, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone @@ -1630,16 +1793,16 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SLEEP_DATA_RAW = new NativeFITMessage(274, "SLEEP_DATA_RAW", Arrays.asList( + public static final NativeFITMessage SLEEP_DATA_RAW = new NativeFITMessage(274, "SLEEP_DATA_RAW", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.BASE_TYPE_BYTE, "bytes") // arr of 20 bytes per sample )); - public static NativeFITMessage SLEEP_STAGE = new NativeFITMessage(275, "SLEEP_STAGE", Arrays.asList( + public static final NativeFITMessage SLEEP_STAGE = new NativeFITMessage(275, "SLEEP_STAGE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sleep_stage", FieldDefinitionFactory.FIELD.SLEEP_STAGE), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage MAX_MET_DATA = new NativeFITMessage(229, "MAX_MET_DATA", Arrays.asList( + public static final NativeFITMessage MAX_MET_DATA = new NativeFITMessage(229, "MAX_MET_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "update_time", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(2, BaseType.UINT16, "vo2_max", 10, 0), new FieldDefinitionPrimitive(5, BaseType.ENUM, "sport"), @@ -1650,7 +1813,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(13, BaseType.ENUM, "speed_source") )); - public static NativeFITMessage DIVE_SUMMARY = new NativeFITMessage(268, "DIVE_SUMMARY", Arrays.asList( + public static final NativeFITMessage DIVE_SUMMARY = new NativeFITMessage(268, "DIVE_SUMMARY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "reference_mesg"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "reference_index"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "avg_depth", 1000, 0), // m @@ -1677,7 +1840,7 @@ public class NativeFITMessage { )); - public static NativeFITMessage JUMP = new NativeFITMessage(285, "JUMP", Arrays.asList( + public static final NativeFITMessage JUMP = new NativeFITMessage(285, "JUMP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.FLOAT32, "distance"), // m new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "heigh"), // m new FieldDefinitionPrimitive(2, BaseType.UINT8, "rotations"), @@ -1690,7 +1853,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage AAD_ACCEL_FEATURES = new NativeFITMessage(289, "AAD_ACCEL_FEATURES", Arrays.asList( + public static final NativeFITMessage AAD_ACCEL_FEATURES = new NativeFITMessage(289, "AAD_ACCEL_FEATURES", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "time"), // s new FieldDefinitionPrimitive(1, BaseType.UINT32, "energy_total"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "zero_cross_cnt"), @@ -1699,18 +1862,18 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage BEAT_INTERVALS = new NativeFITMessage(290, "BEAT_INTERVALS", Arrays.asList( + public static final NativeFITMessage BEAT_INTERVALS = new NativeFITMessage(290, "BEAT_INTERVALS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ARRAY), // ms new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage RESPIRATION_RATE = new NativeFITMessage(297, "RESPIRATION_RATE", Arrays.asList( + public static final NativeFITMessage RESPIRATION_RATE = new NativeFITMessage(297, "RESPIRATION_RATE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.SINT16, "respiration_rate", 100, 0), // breaths / min new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_ACCELEROMETER_DATA = new NativeFITMessage(302, "HSA_ACCELEROMETER_DATA", Arrays.asList( + public static final NativeFITMessage HSA_ACCELEROMETER_DATA = new NativeFITMessage(302, "HSA_ACCELEROMETER_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "sampling_interval"), new FieldDefinitionPrimitive(2, BaseType.SINT16, "accel_x", FieldDefinitionFactory.FIELD.ARRAY), @@ -1720,39 +1883,65 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_STEP_DATA = new NativeFITMessage(304, "HSA_STEP_DATA", Arrays.asList( + public static final NativeFITMessage HSA_STEP_DATA = new NativeFITMessage(304, "HSA_STEP_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds new FieldDefinitionPrimitive(1, BaseType.UINT32, "steps", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_SPO2_DATA = new NativeFITMessage(305, "HSA_SPO2_DATA", Arrays.asList( + public static final NativeFITMessage HSA_SPO2_DATA = new NativeFITMessage(305, "HSA_SPO2_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds new FieldDefinitionPrimitive(1, BaseType.UINT8, "reading_spo2", FieldDefinitionFactory.FIELD.ARRAY), // % new FieldDefinitionPrimitive(2, BaseType.UINT8, "confidence", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_STRESS_DATA = new NativeFITMessage(306, "HSA_STRESS_DATA", Arrays.asList( + public static final NativeFITMessage HSA_STRESS_DATA = new NativeFITMessage(306, "HSA_STRESS_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds new FieldDefinitionPrimitive(1, BaseType.SINT8, "stress_level", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_RESPIRATION_DATA = new NativeFITMessage(307, "HSA_RESPIRATION_DATA", Arrays.asList( + public static final NativeFITMessage HSA_RESPIRATION_DATA = new NativeFITMessage(307, "HSA_RESPIRATION_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds new FieldDefinitionPrimitive(1, BaseType.SINT16, "respiration_rate", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // breath / minute new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_HEART_RATE_DATA = new NativeFITMessage(308, "HSA_HEART_RATE_DATA", Arrays.asList( + public static final NativeFITMessage HSA_HEART_RATE_DATA = new NativeFITMessage(308, "HSA_HEART_RATE_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds new FieldDefinitionPrimitive(1, BaseType.UINT8, "status"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "heart_rate", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SPLIT = new NativeFITMessage(312, "SPLIT", Arrays.asList( + public static final NativeFITMessage MTB_CX = new NativeFITMessage(309, "MTB_CX", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.ENUM, "grit_flow_jump_recording"), + new FieldDefinitionPrimitive(2, BaseType.ENUM, "jump_alerts") + )); + + public static final NativeFITMessage RACE = new NativeFITMessage(310, "RACE", Arrays.asList( + new FieldDefinitionPrimitive(3, BaseType.UINT32, "goal_time", 1000, 0), // s + new FieldDefinitionPrimitive(4, BaseType.UINT16, "goal_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(5, BaseType.UINT32, "distance", 100, 0), // m + new FieldDefinitionPrimitive(7, BaseType.UINT32, "split_distance", 100, 0) // m + )); + + public static final NativeFITMessage SPLIT_TIME = new NativeFITMessage(311, "SPLIT_TIME", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32, "time", 1000, 0), // s + new FieldDefinitionPrimitive(1, BaseType.UINT32, "distance", 100, 0), // m + new FieldDefinitionPrimitive(2, BaseType.UINT32, "split_time", 1000, 0), // s + new FieldDefinitionPrimitive(3, BaseType.UINT32, "split_distance", 100, 0), // m + new FieldDefinitionPrimitive(4, BaseType.UINT16, "split_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(9, BaseType.SINT32, "start_position_lat", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(10, BaseType.SINT32, "start_position_long", FieldDefinitionFactory.FIELD.COORDINATE), + 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 + )); + + public static final NativeFITMessage SPLIT = new NativeFITMessage(312, "SPLIT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "split_type"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "total_elapsed_time", 1000, 0), // seconds new FieldDefinitionPrimitive(2, BaseType.UINT32, "total_timer_time", 1000, 0), // seconds @@ -1774,7 +1963,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SPLIT_SUMMARY = new NativeFITMessage(313, "SPLIT_SUMMARY", Arrays.asList( + public static final NativeFITMessage SPLIT_SUMMARY = new NativeFITMessage(313, "SPLIT_SUMMARY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "split_type"), new FieldDefinitionPrimitive(3, BaseType.UINT16, "num_splits"), new FieldDefinitionPrimitive(4, BaseType.UINT32, "total_timer_time", 1000, 0), // s @@ -1792,7 +1981,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage HSA_BODY_BATTERY_DATA = new NativeFITMessage(314, "HSA_BODY_BATTERY_DATA", Arrays.asList( + public static final NativeFITMessage HSA_BODY_BATTERY_DATA = new NativeFITMessage(314, "HSA_BODY_BATTERY_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds new FieldDefinitionPrimitive(1, BaseType.SINT8, "level", FieldDefinitionFactory.FIELD.ARRAY), // % new FieldDefinitionPrimitive(2, BaseType.SINT16, "charged", FieldDefinitionFactory.FIELD.ARRAY), @@ -1800,12 +1989,12 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_EVENT = new NativeFITMessage(315, "HSA_EVENT", Arrays.asList( + public static final NativeFITMessage HSA_EVENT = new NativeFITMessage(315, "HSA_EVENT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "event_id"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage CLIMB_PRO = new NativeFITMessage(317, "CLIMB_PRO", Arrays.asList( + public static final NativeFITMessage CLIMB_PRO = new NativeFITMessage(317, "CLIMB_PRO", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.SINT32, "position_lat", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(1, BaseType.SINT32, "position_long", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(2, BaseType.ENUM, "climb_pro_event"), @@ -1815,13 +2004,19 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage TANK_UPDATE = new NativeFITMessage(319, "TANK_UPDATE", Arrays.asList( + public static final NativeFITMessage TANK_UPDATE = new NativeFITMessage(319, "TANK_UPDATE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "sensor"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "pressure", 100, 0), // bar new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage TANK_SUMMARY = new NativeFITMessage(323, "TANK_SUMMARY", Arrays.asList( + public static final NativeFITMessage POWER_MODE = new NativeFITMessage(321, "POWER_MODE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32, "low_battery_alert"), // s + new FieldDefinitionPrimitive(1, BaseType.SINT32, "default_mode"), + new FieldDefinitionPrimitive(3, BaseType.UINT32, "auto_enable_time") // s + )); + + public static final NativeFITMessage TANK_SUMMARY = new NativeFITMessage(323, "TANK_SUMMARY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "sensor"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "start_pressure", 100, 0), // bar new FieldDefinitionPrimitive(2, BaseType.UINT16, "end_pressure", 100, 0), // bar @@ -1829,13 +2024,13 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage GPS_EVENT = new NativeFITMessage(326, "GPS_EVENT", Arrays.asList( + public static final NativeFITMessage GPS_EVENT = new NativeFITMessage(326, "GPS_EVENT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "event_type"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "data"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage ECG_SUMMARY = new NativeFITMessage(336, "ECG_SUMMARY", Arrays.asList( + public static final NativeFITMessage ECG_SUMMARY = new NativeFITMessage(336, "ECG_SUMMARY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "unknown_0"), // 10103 new FieldDefinitionPrimitive(1, BaseType.ENUM, "unknown_1"), // 3 new FieldDefinitionPrimitive(2, BaseType.FLOAT32, "raw_sample_rate"), // 512 @@ -1849,15 +2044,15 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(12, BaseType.UINT8, "sdrr_hrv") // ms )); - public static NativeFITMessage ECG_RAW_SAMPLE = new NativeFITMessage(337, "ECG_RAW_SAMPLE", Arrays.asList( + public static final NativeFITMessage ECG_RAW_SAMPLE = new NativeFITMessage(337, "ECG_RAW_SAMPLE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.FLOAT32, "value") )); - public static NativeFITMessage ECG_SMOOTH_SAMPLE = new NativeFITMessage(338, "ECG_SMOOTH_SAMPLE", Arrays.asList( + public static final NativeFITMessage ECG_SMOOTH_SAMPLE = new NativeFITMessage(338, "ECG_SMOOTH_SAMPLE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.FLOAT32, "value") )); - public static NativeFITMessage SLEEP_STATS = new NativeFITMessage(346, "SLEEP_STATS", Arrays.asList( + public static final NativeFITMessage SLEEP_STATS = new NativeFITMessage(346, "SLEEP_STATS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "combined_awake_score"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "awake_time_score"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "awakenings_count_score"), @@ -1878,7 +2073,7 @@ public class NativeFITMessage { )); // Source: #5709 - public static NativeFITMessage FUNCTIONAL_METRICS = new NativeFITMessage(356, "FUNCTIONAL_METRICS", Arrays.asList( + public static final NativeFITMessage FUNCTIONAL_METRICS = new NativeFITMessage(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"), @@ -1894,8 +2089,22 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static final NativeFITMessage RACE_EVENT = new NativeFITMessage(358, "RACE_EVENT", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.STRING, "event_id"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time"), + new FieldDefinitionPrimitive(3, BaseType.UINT32, "local_timestamp"), + new FieldDefinitionPrimitive(4, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(5, BaseType.STRING, "location"), + new FieldDefinitionPrimitive(6, BaseType.SINT32, "start_point_lat", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(7, BaseType.SINT32, "start_point_long", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(10, BaseType.UINT32, "distance", 100, 0), // m + new FieldDefinitionPrimitive(12, BaseType.UINT32, "target_time", 1000, 0), // s + new FieldDefinitionPrimitive(24, BaseType.STRING, "city"), + new FieldDefinitionPrimitive(26, BaseType.STRING, "country") + )); + // Source: #5710 - public static NativeFITMessage TRAINING_READINESS = new NativeFITMessage(369, "TRAINING_READINESS", Arrays.asList( + public static final NativeFITMessage TRAINING_READINESS = new NativeFITMessage(369, "TRAINING_READINESS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "training_readiness"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "level"), // 1=poor, 2=low, 3=moderate, 4=high, 5=prime new FieldDefinitionPrimitive(2, BaseType.ENUM, "unknown_2"), @@ -1928,7 +2137,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HRV_SUMMARY = new NativeFITMessage(370, "HRV_SUMMARY", Arrays.asList( + public static final NativeFITMessage HRV_SUMMARY = new NativeFITMessage(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 new FieldDefinitionPrimitive(2, BaseType.UINT16, "last_night_5_min_high", 128, 0), // milliseconds, scaled by 128 @@ -1939,12 +2148,12 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HRV_VALUE = new NativeFITMessage(371, "HRV_VALUE", Arrays.asList( + public static final NativeFITMessage HRV_VALUE = new NativeFITMessage(371, "HRV_VALUE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "value", 128, 0), // milliseconds, scaled by 128 new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage RAW_BBI = new NativeFITMessage(372, "RAW_BBI", Arrays.asList( + public static final NativeFITMessage RAW_BBI = new NativeFITMessage(372, "RAW_BBI", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "data", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(2, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ARRAY), // ms @@ -1953,7 +2162,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage DEVICE_AUX_BATTERY_INFO = new NativeFITMessage(375, "DEVICE_AUX_BATTERY_INFO", Arrays.asList( + public static final NativeFITMessage DEVICE_AUX_BATTERY_INFO = new NativeFITMessage(375, "DEVICE_AUX_BATTERY_INFO", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "device_index"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "battery_voltage", 256, 0), // V new FieldDefinitionPrimitive(2, BaseType.UINT8, "battery_status"), @@ -1961,7 +2170,7 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_GYROSCOPE_DATA = new NativeFITMessage(376, "HSA_GYROSCOPE_DATA", Arrays.asList( + public static final NativeFITMessage HSA_GYROSCOPE_DATA = new NativeFITMessage(376, "HSA_GYROSCOPE_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms new FieldDefinitionPrimitive(1, BaseType.UINT16, "sampling_interval"), new FieldDefinitionPrimitive(2, BaseType.SINT16, "gyro_x", FieldDefinitionFactory.FIELD.ARRAY), @@ -1971,30 +2180,30 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SKIN_TEMP_RAW = new NativeFITMessage(397, "SKIN_TEMP_RAW", Arrays.asList( + public static final NativeFITMessage SKIN_TEMP_RAW = new NativeFITMessage(397, "SKIN_TEMP_RAW", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "deviation"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage TRAINING_LOAD = new NativeFITMessage(378, "TRAINING_LOAD", Arrays.asList( + public static final NativeFITMessage TRAINING_LOAD = new NativeFITMessage(378, "TRAINING_LOAD", Arrays.asList( new FieldDefinitionPrimitive(3, BaseType.UINT16, "training_load_acute"), new FieldDefinitionPrimitive(4, BaseType.UINT16, "training_load_chronic"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SLEEP_SCHEDULE = new NativeFITMessage(379, "SLEEP_SCHEDULE", Arrays.asList( + public static final NativeFITMessage SLEEP_SCHEDULE = new NativeFITMessage(379, "SLEEP_SCHEDULE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "bed_time"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "wake_time"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SLEEP_RESTLESS_MOMENTS = new NativeFITMessage(382, "SLEEP_RESTLESS_MOMENTS", Arrays.asList( + public static final NativeFITMessage SLEEP_RESTLESS_MOMENTS = new NativeFITMessage(382, "SLEEP_RESTLESS_MOMENTS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "unknown_0"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "restless_moments_count"), - new FieldDefinitionPrimitive(2, BaseType.UINT8, "unknown_2", FieldDefinitionFactory.FIELD.ARRAY) + new FieldDefinitionPrimitive(2, BaseType.UINT8, "durations", FieldDefinitionFactory.FIELD.ARRAY) )); - public static NativeFITMessage CHRONO_SHOT_SESSION = new NativeFITMessage(387, "CHRONO_SHOT_SESSION", Arrays.asList( + public static final NativeFITMessage CHRONO_SHOT_SESSION = new NativeFITMessage(387, "CHRONO_SHOT_SESSION", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "min_speed", 1000, 0), // m/s new FieldDefinitionPrimitive(1, BaseType.UINT32, "max_speed", 1000, 0), // m/s new FieldDefinitionPrimitive(2, BaseType.UINT32, "avg_speed", 1000, 0), // m/s @@ -2005,19 +2214,19 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage CHRONO_SHOT_DATA = new NativeFITMessage(388, "CHRONO_SHOT_DATA", Arrays.asList( + public static final NativeFITMessage CHRONO_SHOT_DATA = new NativeFITMessage(388, "CHRONO_SHOT_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "shot_speed", 1000, 0), // m/s new FieldDefinitionPrimitive(1, BaseType.UINT16, "shot_num"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_CONFIGURATION_DATA = new NativeFITMessage(389, "HSA_CONFIGURATION_DATA", Arrays.asList( + public static final NativeFITMessage HSA_CONFIGURATION_DATA = new NativeFITMessage(389, "HSA_CONFIGURATION_DATA", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.BASE_TYPE_BYTE, "data", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(1, BaseType.UINT8, "data_size"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage DIVE_APNEA_ALARM = new NativeFITMessage(393, "DIVE_APNEA_ALARM", Arrays.asList( + public static final NativeFITMessage DIVE_APNEA_ALARM = new NativeFITMessage(393, "DIVE_APNEA_ALARM", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "depth", 1000, 0), // m new FieldDefinitionPrimitive(1, BaseType.SINT32, "time"), // s new FieldDefinitionPrimitive(2, BaseType.ENUM, "enabled", FieldDefinitionFactory.FIELD.BOOLEAN), @@ -2033,14 +2242,14 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage CPE_STATUS = new NativeFITMessage(394, "CPE_STATUS", Arrays.asList( + public static final NativeFITMessage CPE_STATUS = new NativeFITMessage(394, "CPE_STATUS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "status"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "start_time"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "end_time"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SKIN_TEMP_OVERNIGHT = new NativeFITMessage(398, "SKIN_TEMP_OVERNIGHT", Arrays.asList( + public static final NativeFITMessage SKIN_TEMP_OVERNIGHT = new NativeFITMessage(398, "SKIN_TEMP_OVERNIGHT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "average_deviation"), new FieldDefinitionPrimitive(2, BaseType.FLOAT32, "average_7_day_deviation"), @@ -2050,7 +2259,7 @@ public class NativeFITMessage { )); // Source: matrix - public static NativeFITMessage HILL_SCORE = new NativeFITMessage(402, "HILL_SCORE", Arrays.asList( + public static final NativeFITMessage HILL_SCORE = new NativeFITMessage(402, "HILL_SCORE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "hill_score"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "hill_strength"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "hill_endurance"), @@ -2061,7 +2270,7 @@ public class NativeFITMessage { )); // Source: #5708 - public static NativeFITMessage ENDURANCE_SCORE = new NativeFITMessage(403, "ENDURANCE_SCORE", Arrays.asList( + public static final NativeFITMessage ENDURANCE_SCORE = new NativeFITMessage(403, "ENDURANCE_SCORE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "endurance_score"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "level"), // 1=recreational, 2=intermediate, 3=trained, 4=well-trained, 5=expert, 6=superior, 7=elite new FieldDefinitionPrimitive(2, BaseType.ENUM, "unknown_2"), @@ -2077,35 +2286,44 @@ public class NativeFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage HSA_WRIST_TEMPERATURE_DATA = new NativeFITMessage(409, "HSA_WRIST_TEMPERATURE_DATA", Arrays.asList( + public static final NativeFITMessage HSA_WRIST_TEMPERATURE_DATA = new NativeFITMessage(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 new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage NAP = new NativeFITMessage(412, "NAP", Arrays.asList( + public static final NativeFITMessage NAP = new NativeFITMessage(412, "NAP", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "start_timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), - new FieldDefinitionPrimitive(1, BaseType.SINT16, "unknown_1"), // 0 + new FieldDefinitionPrimitive(1, BaseType.SINT16, "start_tz_offset"), // min new FieldDefinitionPrimitive(2, BaseType.UINT32, "end_timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), - new FieldDefinitionPrimitive(3, BaseType.SINT16, "unknown_3"), // 0 + new FieldDefinitionPrimitive(3, BaseType.SINT16, "end_tz_offset"), // min new FieldDefinitionPrimitive(4, BaseType.ENUM, "unknown_4"), // 8 new FieldDefinitionPrimitive(6, BaseType.ENUM, "unknown_6"), // 0 new FieldDefinitionPrimitive(7, BaseType.UINT32, "timestamp_7", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static NativeFITMessage SLEEP_DISRUPTION_SEVERITY_PERIOD = new NativeFITMessage(470, "SLEEP_DISRUPTION_SEVERITY_PERIOD", Arrays.asList( + public static final NativeFITMessage WORKOUT_SCHEDULE = new NativeFITMessage(428, "WORKOUT_SCHEDULE", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.UINT16, "workout_index"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "est_benefit"), + 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 + )); + + public static final NativeFITMessage SLEEP_DISRUPTION_SEVERITY_PERIOD = new NativeFITMessage(470, "SLEEP_DISRUPTION_SEVERITY_PERIOD", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "severity"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); - public static NativeFITMessage SLEEP_DISRUPTION_OVERNIGHT_SEVERITY = new NativeFITMessage(471, "SLEEP_DISRUPTION_OVERNIGHT_SEVERITY", Arrays.asList( + public static final NativeFITMessage SLEEP_DISRUPTION_OVERNIGHT_SEVERITY = new NativeFITMessage(471, "SLEEP_DISRUPTION_OVERNIGHT_SEVERITY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "severity"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); - public static Map KNOWN_MESSAGES = new HashMap<>() {{ + public static final Map KNOWN_MESSAGES = new HashMap<>() {{ put(0, FILE_ID); put(1, CAPABILITIES); put(2, DEVICE_SETTINGS); @@ -2119,7 +2337,10 @@ public class NativeFITMessage { put(10, MET_ZONE); put(12, SPORT); put(13, TRAINING_SETTINGS); + put(14, DATA_SCREEN); put(15, GOALS); + put(16, ALERT); + put(17, RANGE_ALERT); put(18, SESSION); put(19, LAP); put(20, RECORD); @@ -2144,6 +2365,7 @@ public class NativeFITMessage { put(53, SPEED_ZONE); put(55, MONITORING); put(70, MAP_LAYER); + put(71, ROUTING); put(72, TRAINING_FILE); put(78, HRV); put(79, USER_METRICS); @@ -2155,6 +2377,8 @@ public class NativeFITMessage { put(104, DEVICE_STATUS); put(105, PAD); put(106, SLAVE_DEVICE); + put(113, BEST_EFFORT); + put(114, PERSONAL_RECORD); put(127, CONNECTIVITY); put(128, WEATHER); put(129, WEATHER_ALERT); @@ -2163,12 +2387,14 @@ public class NativeFITMessage { put(140, PHYSIOLOGICAL_METRICS); put(141, EPO_STATUS); put(142, SEGMENT_LAP); + put(144, MULTISPORT_ACTIVITY); put(145, MEMO_GLOB); put(147, SENSOR_SETTINGS); put(148, SEGMENT_ID); put(149, SEGMENT_LEADERBOARD_ENTRY); put(150, SEGMENT_POINT); put(151, SEGMENT_FILE); + put(152, METRONOME); put(158, WORKOUT_SESSION); put(159, WATCHFACE_SETTINGS); put(160, GPS_METADATA); @@ -2178,6 +2404,7 @@ public class NativeFITMessage { put(165, ACCELEROMETER_DATA); put(167, THREE_D_SENSOR_CALIBRATION); put(169, VIDEO_FRAME); + put(170, CONNECT_IQ_FIELD); put(174, OBDII_DATA); put(177, NMEA_SENTENCE); put(178, AVIATION_ATTITUDE); @@ -2200,6 +2427,7 @@ public class NativeFITMessage { put(225, SET); put(227, STRESS_LEVEL); put(229, MAX_MET_DATA); + put(243, MUSIC_INFO); put(258, DIVE_SETTINGS); put(259, DIVE_GAS); put(262, DIVE_ALARM); @@ -2219,12 +2447,16 @@ public class NativeFITMessage { put(306, HSA_STRESS_DATA); put(307, HSA_RESPIRATION_DATA); put(308, HSA_HEART_RATE_DATA); + put(309, MTB_CX); + put(310, RACE); + put(311, SPLIT_TIME); put(312, SPLIT); put(313, SPLIT_SUMMARY); put(314, HSA_BODY_BATTERY_DATA); put(315, HSA_EVENT); put(317, CLIMB_PRO); put(319, TANK_UPDATE); + put(321, POWER_MODE); put(323, TANK_SUMMARY); put(326, GPS_EVENT); put(336, ECG_SUMMARY); @@ -2232,6 +2464,7 @@ public class NativeFITMessage { put(338, ECG_SMOOTH_SAMPLE); put(346, SLEEP_STATS); put(356, FUNCTIONAL_METRICS); + put(358, RACE_EVENT); put(369, TRAINING_READINESS); put(370, HRV_SUMMARY); put(371, HRV_VALUE); @@ -2252,6 +2485,7 @@ public class NativeFITMessage { put(403, ENDURANCE_SCORE); put(409, HSA_WRIST_TEMPERATURE_DATA); put(412, NAP); + put(428, WORKOUT_SCHEDULE); put(470, SLEEP_DISRUPTION_SEVERITY_PERIOD); put(471, SLEEP_DISRUPTION_OVERNIGHT_SEVERITY); }}; @@ -2261,13 +2495,13 @@ public class NativeFITMessage { private final List fieldDefinitionPrimitives; - NativeFITMessage(int number, String name, List fieldDefinitionPrimitives) { + private NativeFITMessage(int number, String name, List fieldDefinitionPrimitives) { this.number = number; this.name = name; this.fieldDefinitionPrimitives = fieldDefinitionPrimitives; } - public static NativeFITMessage fromNumber(final int number) { + static NativeFITMessage fromNumber(final int number) { final NativeFITMessage found = KNOWN_MESSAGES.get(number); if (found != null) { return found; @@ -2289,7 +2523,7 @@ public class NativeFITMessage { } @Nullable - public List getFieldDefinitions(int... ids) { + List getFieldDefinitions(int... ids) { if (null == fieldDefinitionPrimitives) return null; List subset = new ArrayList<>(ids.length); @@ -2313,7 +2547,7 @@ public class NativeFITMessage { return subset; } - public FieldDefinition getFieldDefinition(final String name, final int count) { + FieldDefinition getFieldDefinition(final String name, final int count) { for (FieldDefinitionPrimitive fieldDefinitionPrimitive : fieldDefinitionPrimitives) { if (name.equals(fieldDefinitionPrimitive.name)) { @@ -2333,7 +2567,7 @@ public class NativeFITMessage { } @Nullable - public FieldDefinition getFieldDefinition(int id, int size) { + FieldDefinition getFieldDefinition(int id, int size) { if (null == fieldDefinitionPrimitives) return null; for (NativeFITMessage.FieldDefinitionPrimitive fieldDefinitionPrimitive : @@ -2370,15 +2604,15 @@ public class NativeFITMessage { } public static class FieldDefinitionPrimitive { - private final int number; - private final BaseType baseType; - private final String name; - private final FieldDefinitionFactory.FIELD type; - private final int scale; - private final int offset; - private final int size; + final int number; + final BaseType baseType; + final String name; + final FieldDefinitionFactory.FIELD type; + final int scale; + final int offset; + final int size; - public FieldDefinitionPrimitive(int number, BaseType baseType, int size, String name, FieldDefinitionFactory.FIELD type, int scale, int offset) { + FieldDefinitionPrimitive(int number, BaseType baseType, int size, String name, FieldDefinitionFactory.FIELD type, int scale, int offset) { this.number = number; this.baseType = baseType; this.size = size; @@ -2388,23 +2622,23 @@ public class NativeFITMessage { this.offset = offset; } - public FieldDefinitionPrimitive(int number, BaseType baseType, String name, FieldDefinitionFactory.FIELD type, int scale, int offset) { + FieldDefinitionPrimitive(int number, BaseType baseType, String name, FieldDefinitionFactory.FIELD type, int scale, int offset) { this(number, baseType, baseType.getSize(), name, type, scale, offset); } - public FieldDefinitionPrimitive(int number, BaseType baseType, String name, FieldDefinitionFactory.FIELD type) { + FieldDefinitionPrimitive(int number, BaseType baseType, String name, FieldDefinitionFactory.FIELD type) { this(number, baseType, baseType.getSize(), name, type, 1, 0); } - public FieldDefinitionPrimitive(int number, BaseType baseType, String name) { + FieldDefinitionPrimitive(int number, BaseType baseType, String name) { this(number, baseType, baseType.getSize(), name, null, 1, 0); } - public FieldDefinitionPrimitive(int number, BaseType baseType, int size, String name) { + FieldDefinitionPrimitive(int number, BaseType baseType, int size, String name) { this(number, baseType, size, name, null, 1, 0); } - public FieldDefinitionPrimitive(int number, BaseType baseType, String name, int scale, int offset) { + FieldDefinitionPrimitive(int number, BaseType baseType, String name, int scale, int offset) { this(number, baseType, baseType.getSize(), name, null, scale, offset); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java index b424f066bc..8c612985ca 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlarmSettings.java @@ -68,7 +68,7 @@ public class FitAlarmSettings extends RecordData { } @Nullable - public Long getSomeTimestamp() { + public Long getTimeCreated() { return getFieldByNumber(5, Long.class); } @@ -82,6 +82,11 @@ public class FitAlarmSettings extends RecordData { return getFieldByNumber(8, Label.class); } + @Nullable + public Long getTimeUpdated() { + return getFieldByNumber(11, Long.class); + } + @Nullable public Integer getMessageIndex() { return getFieldByNumber(254, Integer.class); @@ -120,7 +125,7 @@ public class FitAlarmSettings extends RecordData { return this; } - public Builder setSomeTimestamp(final Long value) { + public Builder setTimeCreated(final Long value) { setFieldByNumber(5, value); return this; } @@ -135,6 +140,11 @@ public class FitAlarmSettings extends RecordData { return this; } + public Builder setTimeUpdated(final Long value) { + setFieldByNumber(11, 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/FitAlert.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlert.java new file mode 100644 index 0000000000..e46f4b07bb --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitAlert.java @@ -0,0 +1,110 @@ +/* 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 FitAlert extends RecordData { + public FitAlert(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 16) { + throw new IllegalArgumentException("FitAlert expects native messages of " + 16 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getMetric() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Long getValue() { + return getFieldByNumber(2, Long.class); + } + + @Nullable + public Integer getStatus() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public String getMessage() { + return getFieldByNumber(4, String.class); + } + + @Nullable + public Integer getRepeat() { + return getFieldByNumber(5, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(16); + } + + public Builder setMetric(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setValue(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setStatus(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setMessage(final String value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setRepeat(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + @Override + public FitAlert build() { + return (FitAlert) super.build(); + } + + @Override + public FitAlert build(final int localMessageType) { + return (FitAlert) super.build(localMessageType); + } + } +} 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 new file mode 100644 index 0000000000..3725aafa9b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBestEffort.java @@ -0,0 +1,110 @@ +/* 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 FitBestEffort extends RecordData { + public FitBestEffort(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 113) { + throw new IllegalArgumentException("FitBestEffort expects native messages of " + 113 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getSport() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Double getDistance() { + return getFieldByNumber(2, Double.class); + } + + @Nullable + public Double getTime() { + return getFieldByNumber(3, Double.class); + } + + @Nullable + public Long getTimestamp() { + return getFieldByNumber(4, Long.class); + } + + @Nullable + public Integer getPersonalRecord() { + return getFieldByNumber(5, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(113); + } + + public Builder setSport(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setDistance(final Double value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTime(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setPersonalRecord(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + @Override + public FitBestEffort build() { + return (FitBestEffort) super.build(); + } + + @Override + public FitBestEffort build(final int localMessageType) { + return (FitBestEffort) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectIqField.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectIqField.java new file mode 100644 index 0000000000..7ae6734053 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectIqField.java @@ -0,0 +1,100 @@ +/* Copyright (C) 2026 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitConnectIqField extends RecordData { + public FitConnectIqField(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 170) { + throw new IllegalArgumentException("FitConnectIqField expects native messages of " + 170 + ", got " + nativeNumber); + } + } + + @Nullable + public Number[] getAppId() { + return getArrayFieldByNumber(1, Number.class); + } + + @Nullable + public Long getDataField() { + return getFieldByNumber(2, Long.class); + } + + @Nullable + public Integer getScreenId() { + return getFieldByNumber(100, Integer.class); + } + + @Nullable + public Integer getFieldBits() { + return getFieldByNumber(101, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(170); + } + + public Builder setAppId(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setDataField(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setScreenId(final Integer value) { + setFieldByNumber(100, value); + return this; + } + + public Builder setFieldBits(final Integer value) { + setFieldByNumber(101, value); + return this; + } + + @Override + public FitConnectIqField build() { + return (FitConnectIqField) super.build(); + } + + @Override + public FitConnectIqField build(final int localMessageType) { + return (FitConnectIqField) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDataScreen.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDataScreen.java new file mode 100644 index 0000000000..742110ae35 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDataScreen.java @@ -0,0 +1,110 @@ +/* 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 FitDataScreen extends RecordData { + public FitDataScreen(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 14) { + throw new IllegalArgumentException("FitDataScreen expects native messages of " + 14 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getNrFields() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Integer getDataFields() { + return getFieldByNumber(7, Integer.class); + } + + @Nullable + public Integer getLayout() { + return getFieldByNumber(8, Integer.class); + } + + @Nullable + public Integer getPosition() { + return getFieldByNumber(9, Integer.class); + } + + @Nullable + public Integer getScreenType() { + return getFieldByNumber(10, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(14); + } + + public Builder setNrFields(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setDataFields(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setLayout(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setPosition(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setScreenType(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + @Override + public FitDataScreen build() { + return (FitDataScreen) super.build(); + } + + @Override + public FitDataScreen build(final int localMessageType) { + return (FitDataScreen) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java index 59dd9fc6a8..64be1b4f58 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java @@ -680,6 +680,41 @@ public class FitLap extends RecordData { return getFieldByNumber(160, Float.class); } + @Nullable + public Double getGradeAdjustedSpeed() { + return getFieldByNumber(161, Double.class); + } + + @Nullable + public Integer getUnpaved() { + return getFieldByNumber(163, Integer.class); + } + + @Nullable + public Float getStepSpeedLossDistance() { + return getFieldByNumber(164, Float.class); + } + + @Nullable + public Float getStepSpeedLossPercentage() { + return getFieldByNumber(165, Float.class); + } + + @Nullable + public Double getAvgForce() { + return getFieldByNumber(166, Double.class); + } + + @Nullable + public Double getMaxForce() { + return getFieldByNumber(167, Double.class); + } + + @Nullable + public Double getNormalizedForce() { + return getFieldByNumber(168, Double.class); + } + @Nullable public Long getTimestamp() { return getFieldByNumber(253, Long.class); @@ -1338,6 +1373,41 @@ public class FitLap extends RecordData { return this; } + public Builder setGradeAdjustedSpeed(final Double value) { + setFieldByNumber(161, value); + return this; + } + + public Builder setUnpaved(final Integer value) { + setFieldByNumber(163, value); + return this; + } + + public Builder setStepSpeedLossDistance(final Float value) { + setFieldByNumber(164, value); + return this; + } + + public Builder setStepSpeedLossPercentage(final Float value) { + setFieldByNumber(165, value); + return this; + } + + public Builder setAvgForce(final Double value) { + setFieldByNumber(166, value); + return this; + } + + public Builder setMaxForce(final Double value) { + setFieldByNumber(167, value); + return this; + } + + public Builder setNormalizedForce(final Double value) { + setFieldByNumber(168, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetronome.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetronome.java new file mode 100644 index 0000000000..3842495bd9 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetronome.java @@ -0,0 +1,100 @@ +/* Copyright (C) 2026 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitMetronome extends RecordData { + public FitMetronome(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 152) { + throw new IllegalArgumentException("FitMetronome expects native messages of " + 152 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getEnabled() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Integer getBeatsPerMinute() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getAlertFrequency() { + return getFieldByNumber(2, Integer.class); + } + + @Nullable + public Integer getSoundAndVibe() { + return getFieldByNumber(3, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(152); + } + + public Builder setEnabled(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setBeatsPerMinute(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setAlertFrequency(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setSoundAndVibe(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + @Override + public FitMetronome build() { + return (FitMetronome) super.build(); + } + + @Override + public FitMetronome build(final int localMessageType) { + return (FitMetronome) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMtbCx.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMtbCx.java new file mode 100644 index 0000000000..e33c5f79eb --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMtbCx.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 FitMtbCx extends RecordData { + public FitMtbCx(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 309) { + throw new IllegalArgumentException("FitMtbCx expects native messages of " + 309 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getGritFlowJumpRecording() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getJumpAlerts() { + return getFieldByNumber(2, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(309); + } + + public Builder setGritFlowJumpRecording(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setJumpAlerts(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + @Override + public FitMtbCx build() { + return (FitMtbCx) super.build(); + } + + @Override + public FitMtbCx build(final int localMessageType) { + return (FitMtbCx) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMultisportActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMultisportActivity.java new file mode 100644 index 0000000000..2e52c66a30 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMultisportActivity.java @@ -0,0 +1,100 @@ +/* Copyright (C) 2026 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitMultisportActivity extends RecordData { + public FitMultisportActivity(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 144) { + throw new IllegalArgumentException("FitMultisportActivity expects native messages of " + 144 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getSport() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Integer getSubSport() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getLockDevice() { + return getFieldByNumber(2, Integer.class); + } + + @Nullable + public String getName() { + return getFieldByNumber(3, String.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(144); + } + + public Builder setSport(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSubSport(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setLockDevice(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setName(final String value) { + setFieldByNumber(3, value); + return this; + } + + @Override + public FitMultisportActivity build() { + return (FitMultisportActivity) super.build(); + } + + @Override + public FitMultisportActivity build(final int localMessageType) { + return (FitMultisportActivity) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMusicInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMusicInfo.java new file mode 100644 index 0000000000..fa73a14c17 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMusicInfo.java @@ -0,0 +1,110 @@ +/* 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 FitMusicInfo extends RecordData { + public FitMusicInfo(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 243) { + throw new IllegalArgumentException("FitMusicInfo expects native messages of " + 243 + ", got " + nativeNumber); + } + } + + @Nullable + public Long getStartTime() { + return getFieldByNumber(0, Long.class); + } + + @Nullable + public String getTitle() { + return getFieldByNumber(2, String.class); + } + + @Nullable + public String getArtist() { + return getFieldByNumber(3, String.class); + } + + @Nullable + public String getGenre() { + return getFieldByNumber(4, String.class); + } + + @Nullable + public Integer getDuration() { + return getFieldByNumber(5, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(243); + } + + public Builder setStartTime(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTitle(final String value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setArtist(final String value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setGenre(final String value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setDuration(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + @Override + public FitMusicInfo build() { + return (FitMusicInfo) super.build(); + } + + @Override + public FitMusicInfo build(final int localMessageType) { + return (FitMusicInfo) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitNap.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitNap.java index 83f94971af..783b2273d2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitNap.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitNap.java @@ -45,7 +45,7 @@ public class FitNap extends RecordData { } @Nullable - public Integer getUnknown1() { + public Integer getStartTzOffset() { return getFieldByNumber(1, Integer.class); } @@ -55,7 +55,7 @@ public class FitNap extends RecordData { } @Nullable - public Integer getUnknown3() { + public Integer getEndTzOffset() { return getFieldByNumber(3, Integer.class); } @@ -92,7 +92,7 @@ public class FitNap extends RecordData { return this; } - public Builder setUnknown1(final Integer value) { + public Builder setStartTzOffset(final Integer value) { setFieldByNumber(1, value); return this; } @@ -102,7 +102,7 @@ public class FitNap extends RecordData { return this; } - public Builder setUnknown3(final Integer value) { + public Builder setEndTzOffset(final Integer value) { setFieldByNumber(3, value); return this; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPersonalRecord.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPersonalRecord.java new file mode 100644 index 0000000000..388aa208ce --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPersonalRecord.java @@ -0,0 +1,100 @@ +/* Copyright (C) 2026 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitPersonalRecord extends RecordData { + public FitPersonalRecord(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 114) { + throw new IllegalArgumentException("FitPersonalRecord expects native messages of " + 114 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getMetric() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Integer getSport() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Double getDistance() { + return getFieldByNumber(2, Double.class); + } + + @Nullable + public Long getRecord() { + return getFieldByNumber(5, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(114); + } + + public Builder setMetric(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSport(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setDistance(final Double value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setRecord(final Long value) { + setFieldByNumber(5, value); + return this; + } + + @Override + public FitPersonalRecord build() { + return (FitPersonalRecord) super.build(); + } + + @Override + public FitPersonalRecord build(final int localMessageType) { + return (FitPersonalRecord) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPhysiologicalMetrics.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPhysiologicalMetrics.java index 8147bfe7e2..1b08ee8abb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPhysiologicalMetrics.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPhysiologicalMetrics.java @@ -39,6 +39,11 @@ public class FitPhysiologicalMetrics extends RecordData { } } + @Nullable + public Integer getNewHrMax() { + return getFieldByNumber(1, Integer.class); + } + @Nullable public Float getAerobicEffect() { return getFieldByNumber(4, Float.class); @@ -54,16 +59,81 @@ public class FitPhysiologicalMetrics extends RecordData { return getFieldByNumber(9, Integer.class); } + @Nullable + public Integer getSport() { + return getFieldByNumber(11, Integer.class); + } + @Nullable public Integer getLactateThresholdHeartRate() { return getFieldByNumber(14, Integer.class); } + @Nullable + public Integer getLactateThresholdPower() { + return getFieldByNumber(15, Integer.class); + } + + @Nullable + public Float getLactateThresholdSpeed() { + return getFieldByNumber(16, Float.class); + } + + @Nullable + public Integer getEndingPerformanceCondition() { + return getFieldByNumber(17, Integer.class); + } + @Nullable public Float getAnaerobicEffect() { return getFieldByNumber(20, Float.class); } + @Nullable + public Integer getEndingBodyBattery() { + return getFieldByNumber(25, Integer.class); + } + + @Nullable + public Double getFirstVo2Max() { + return getFieldByNumber(29, Double.class); + } + + @Nullable + public Integer getPrimaryBenefit() { + return getFieldByNumber(41, Integer.class); + } + + @Nullable + public Long getLocalTimestamp() { + return getFieldByNumber(48, Long.class); + } + + @Nullable + public Integer getEndingPotential() { + return getFieldByNumber(50, Integer.class); + } + + @Nullable + public Integer getTotalAscent() { + return getFieldByNumber(60, Integer.class); + } + + @Nullable + public Integer getTotalDescent() { + return getFieldByNumber(61, Integer.class); + } + + @Nullable + public Integer getAveragePower() { + return getFieldByNumber(62, Integer.class); + } + + @Nullable + public Integer getAverageHeartRate() { + return getFieldByNumber(63, Integer.class); + } + @Nullable public Long getTimestamp() { return getFieldByNumber(253, Long.class); @@ -77,6 +147,11 @@ public class FitPhysiologicalMetrics extends RecordData { super(140); } + public Builder setNewHrMax(final Integer value) { + setFieldByNumber(1, value); + return this; + } + public Builder setAerobicEffect(final Float value) { setFieldByNumber(4, value); return this; @@ -92,16 +167,81 @@ public class FitPhysiologicalMetrics extends RecordData { return this; } + public Builder setSport(final Integer value) { + setFieldByNumber(11, value); + return this; + } + public Builder setLactateThresholdHeartRate(final Integer value) { setFieldByNumber(14, value); return this; } + public Builder setLactateThresholdPower(final Integer value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setLactateThresholdSpeed(final Float value) { + setFieldByNumber(16, value); + return this; + } + + public Builder setEndingPerformanceCondition(final Integer value) { + setFieldByNumber(17, value); + return this; + } + public Builder setAnaerobicEffect(final Float value) { setFieldByNumber(20, value); return this; } + public Builder setEndingBodyBattery(final Integer value) { + setFieldByNumber(25, value); + return this; + } + + public Builder setFirstVo2Max(final Double value) { + setFieldByNumber(29, value); + return this; + } + + public Builder setPrimaryBenefit(final Integer value) { + setFieldByNumber(41, value); + return this; + } + + public Builder setLocalTimestamp(final Long value) { + setFieldByNumber(48, value); + return this; + } + + public Builder setEndingPotential(final Integer value) { + setFieldByNumber(50, value); + return this; + } + + public Builder setTotalAscent(final Integer value) { + setFieldByNumber(60, value); + return this; + } + + public Builder setTotalDescent(final Integer value) { + setFieldByNumber(61, value); + return this; + } + + public Builder setAveragePower(final Integer value) { + setFieldByNumber(62, value); + return this; + } + + public Builder setAverageHeartRate(final Integer value) { + setFieldByNumber(63, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPowerMode.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPowerMode.java new file mode 100644 index 0000000000..4735268a61 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPowerMode.java @@ -0,0 +1,90 @@ +/* Copyright (C) 2026 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitPowerMode extends RecordData { + public FitPowerMode(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 321) { + throw new IllegalArgumentException("FitPowerMode expects native messages of " + 321 + ", got " + nativeNumber); + } + } + + @Nullable + public Long getLowBatteryAlert() { + return getFieldByNumber(0, Long.class); + } + + @Nullable + public Long getDefaultMode() { + return getFieldByNumber(1, Long.class); + } + + @Nullable + public Long getAutoEnableTime() { + return getFieldByNumber(3, Long.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(321); + } + + public Builder setLowBatteryAlert(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDefaultMode(final Long value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setAutoEnableTime(final Long value) { + setFieldByNumber(3, value); + return this; + } + + @Override + public FitPowerMode build() { + return (FitPowerMode) super.build(); + } + + @Override + public FitPowerMode build(final int localMessageType) { + return (FitPowerMode) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRace.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRace.java new file mode 100644 index 0000000000..26fc01e62b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRace.java @@ -0,0 +1,100 @@ +/* Copyright (C) 2026 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitRace extends RecordData { + public FitRace(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 310) { + throw new IllegalArgumentException("FitRace expects native messages of " + 310 + ", got " + nativeNumber); + } + } + + @Nullable + public Double getGoalTime() { + return getFieldByNumber(3, Double.class); + } + + @Nullable + public Float getGoalSpeed() { + return getFieldByNumber(4, Float.class); + } + + @Nullable + public Double getDistance() { + return getFieldByNumber(5, Double.class); + } + + @Nullable + public Double getSplitDistance() { + return getFieldByNumber(7, Double.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(310); + } + + public Builder setGoalTime(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setGoalSpeed(final Float value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setDistance(final Double value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setSplitDistance(final Double value) { + setFieldByNumber(7, value); + return this; + } + + @Override + public FitRace build() { + return (FitRace) super.build(); + } + + @Override + public FitRace build(final int localMessageType) { + return (FitRace) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRaceEvent.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRaceEvent.java new file mode 100644 index 0000000000..600835c594 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRaceEvent.java @@ -0,0 +1,170 @@ +/* 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 FitRaceEvent extends RecordData { + public FitRaceEvent(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 358) { + throw new IllegalArgumentException("FitRaceEvent expects native messages of " + 358 + ", got " + nativeNumber); + } + } + + @Nullable + public String getEventId() { + return getFieldByNumber(1, String.class); + } + + @Nullable + public Long getStartTime() { + return getFieldByNumber(2, Long.class); + } + + @Nullable + public Long getLocalTimestamp() { + return getFieldByNumber(3, Long.class); + } + + @Nullable + public String getName() { + return getFieldByNumber(4, String.class); + } + + @Nullable + public String getLocation() { + return getFieldByNumber(5, String.class); + } + + @Nullable + public Double getStartPointLat() { + return getFieldByNumber(6, Double.class); + } + + @Nullable + public Double getStartPointLong() { + return getFieldByNumber(7, Double.class); + } + + @Nullable + public Double getDistance() { + return getFieldByNumber(10, Double.class); + } + + @Nullable + public Double getTargetTime() { + return getFieldByNumber(12, Double.class); + } + + @Nullable + public String getCity() { + return getFieldByNumber(24, String.class); + } + + @Nullable + public String getCountry() { + return getFieldByNumber(26, String.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(358); + } + + public Builder setEventId(final String value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setStartTime(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setLocalTimestamp(final Long value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setName(final String value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setLocation(final String value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setStartPointLat(final Double value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setStartPointLong(final Double value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setDistance(final Double value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setTargetTime(final Double value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setCity(final String value) { + setFieldByNumber(24, value); + return this; + } + + public Builder setCountry(final String value) { + setFieldByNumber(26, value); + return this; + } + + @Override + public FitRaceEvent build() { + return (FitRaceEvent) super.build(); + } + + @Override + public FitRaceEvent build(final int localMessageType) { + return (FitRaceEvent) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRangeAlert.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRangeAlert.java new file mode 100644 index 0000000000..b3f54dd548 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRangeAlert.java @@ -0,0 +1,110 @@ +/* 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 FitRangeAlert extends RecordData { + public FitRangeAlert(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 17) { + throw new IllegalArgumentException("FitRangeAlert expects native messages of " + 17 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getMetric() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getLowStatus() { + return getFieldByNumber(2, Integer.class); + } + + @Nullable + public Integer getLowValue() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Integer getHighStatus() { + return getFieldByNumber(4, Integer.class); + } + + @Nullable + public Integer getHighValue() { + return getFieldByNumber(5, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(17); + } + + public Builder setMetric(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setLowStatus(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setLowValue(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setHighStatus(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setHighValue(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + @Override + public FitRangeAlert build() { + return (FitRangeAlert) super.build(); + } + + @Override + public FitRangeAlert build(final int localMessageType) { + return (FitRangeAlert) 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 e2a3d882da..961834c1b1 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 @@ -44,7 +44,10 @@ public class FitRecordDataFactory { case 10 -> new FitMetZone(recordDefinition, recordHeader); case 12 -> new FitSport(recordDefinition, recordHeader); case 13 -> new FitTrainingSettings(recordDefinition, recordHeader); + case 14 -> new FitDataScreen(recordDefinition, recordHeader); case 15 -> new FitGoals(recordDefinition, recordHeader); + case 16 -> new FitAlert(recordDefinition, recordHeader); + case 17 -> new FitRangeAlert(recordDefinition, recordHeader); case 18 -> new FitSession(recordDefinition, recordHeader); case 19 -> new FitLap(recordDefinition, recordHeader); case 20 -> new FitRecord(recordDefinition, recordHeader); @@ -69,6 +72,7 @@ public class FitRecordDataFactory { case 53 -> new FitSpeedZone(recordDefinition, recordHeader); case 55 -> new FitMonitoring(recordDefinition, recordHeader); case 70 -> new FitMapLayer(recordDefinition, recordHeader); + case 71 -> new FitRouting(recordDefinition, recordHeader); case 72 -> new FitTrainingFile(recordDefinition, recordHeader); case 78 -> new FitHrv(recordDefinition, recordHeader); case 79 -> new FitUserMetrics(recordDefinition, recordHeader); @@ -80,6 +84,8 @@ public class FitRecordDataFactory { case 104 -> new FitDeviceStatus(recordDefinition, recordHeader); case 105 -> new FitPad(recordDefinition, recordHeader); case 106 -> new FitSlaveDevice(recordDefinition, recordHeader); + case 113 -> new FitBestEffort(recordDefinition, recordHeader); + case 114 -> new FitPersonalRecord(recordDefinition, recordHeader); case 127 -> new FitConnectivity(recordDefinition, recordHeader); case 128 -> new FitWeather(recordDefinition, recordHeader); case 129 -> new FitWeatherAlert(recordDefinition, recordHeader); @@ -88,12 +94,14 @@ public class FitRecordDataFactory { case 140 -> new FitPhysiologicalMetrics(recordDefinition, recordHeader); case 141 -> new FitEpoStatus(recordDefinition, recordHeader); case 142 -> new FitSegmentLap(recordDefinition, recordHeader); + case 144 -> new FitMultisportActivity(recordDefinition, recordHeader); case 145 -> new FitMemoGlob(recordDefinition, recordHeader); case 147 -> new FitSensorSettings(recordDefinition, recordHeader); case 148 -> new FitSegmentId(recordDefinition, recordHeader); case 149 -> new FitSegmentLeaderboardEntry(recordDefinition, recordHeader); case 150 -> new FitSegmentPoint(recordDefinition, recordHeader); case 151 -> new FitSegmentFile(recordDefinition, recordHeader); + case 152 -> new FitMetronome(recordDefinition, recordHeader); case 158 -> new FitWorkoutSession(recordDefinition, recordHeader); case 159 -> new FitWatchfaceSettings(recordDefinition, recordHeader); case 160 -> new FitGpsMetadata(recordDefinition, recordHeader); @@ -103,6 +111,7 @@ public class FitRecordDataFactory { case 165 -> new FitAccelerometerData(recordDefinition, recordHeader); case 167 -> new FitThreeDSensorCalibration(recordDefinition, recordHeader); case 169 -> new FitVideoFrame(recordDefinition, recordHeader); + case 170 -> new FitConnectIqField(recordDefinition, recordHeader); case 174 -> new FitObdiiData(recordDefinition, recordHeader); case 177 -> new FitNmeaSentence(recordDefinition, recordHeader); case 178 -> new FitAviationAttitude(recordDefinition, recordHeader); @@ -125,6 +134,7 @@ public class FitRecordDataFactory { case 225 -> new FitSet(recordDefinition, recordHeader); case 227 -> new FitStressLevel(recordDefinition, recordHeader); case 229 -> new FitMaxMetData(recordDefinition, recordHeader); + case 243 -> new FitMusicInfo(recordDefinition, recordHeader); case 258 -> new FitDiveSettings(recordDefinition, recordHeader); case 259 -> new FitDiveGas(recordDefinition, recordHeader); case 262 -> new FitDiveAlarm(recordDefinition, recordHeader); @@ -144,12 +154,16 @@ public class FitRecordDataFactory { case 306 -> new FitHsaStressData(recordDefinition, recordHeader); case 307 -> new FitHsaRespirationData(recordDefinition, recordHeader); case 308 -> new FitHsaHeartRateData(recordDefinition, recordHeader); + case 309 -> new FitMtbCx(recordDefinition, recordHeader); + case 310 -> new FitRace(recordDefinition, recordHeader); + case 311 -> new FitSplitTime(recordDefinition, recordHeader); case 312 -> new FitSplit(recordDefinition, recordHeader); case 313 -> new FitSplitSummary(recordDefinition, recordHeader); case 314 -> new FitHsaBodyBatteryData(recordDefinition, recordHeader); case 315 -> new FitHsaEvent(recordDefinition, recordHeader); case 317 -> new FitClimbPro(recordDefinition, recordHeader); case 319 -> new FitTankUpdate(recordDefinition, recordHeader); + case 321 -> new FitPowerMode(recordDefinition, recordHeader); case 323 -> new FitTankSummary(recordDefinition, recordHeader); case 326 -> new FitGpsEvent(recordDefinition, recordHeader); case 336 -> new FitEcgSummary(recordDefinition, recordHeader); @@ -157,6 +171,7 @@ public class FitRecordDataFactory { case 338 -> new FitEcgSmoothSample(recordDefinition, recordHeader); case 346 -> new FitSleepStats(recordDefinition, recordHeader); case 356 -> new FitFunctionalMetrics(recordDefinition, recordHeader); + case 358 -> new FitRaceEvent(recordDefinition, recordHeader); case 369 -> new FitTrainingReadiness(recordDefinition, recordHeader); case 370 -> new FitHrvSummary(recordDefinition, recordHeader); case 371 -> new FitHrvValue(recordDefinition, recordHeader); @@ -177,6 +192,7 @@ public class FitRecordDataFactory { case 403 -> new FitEnduranceScore(recordDefinition, recordHeader); case 409 -> new FitHsaWristTemperatureData(recordDefinition, recordHeader); case 412 -> new FitNap(recordDefinition, recordHeader); + case 428 -> new FitWorkoutSchedule(recordDefinition, recordHeader); case 470 -> new FitSleepDisruptionSeverityPeriod(recordDefinition, recordHeader); case 471 -> new FitSleepDisruptionOvernightSeverity(recordDefinition, recordHeader); default -> new RecordData(recordDefinition, recordHeader); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRouting.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRouting.java new file mode 100644 index 0000000000..f32604cb4c --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRouting.java @@ -0,0 +1,130 @@ +/* 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 FitRouting extends RecordData { + public FitRouting(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 71) { + throw new IllegalArgumentException("FitRouting expects native messages of " + 71 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getRoutingMode() { + return getFieldByNumber(0, Integer.class); + } + + @Nullable + public Integer getCalculationMethod() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getLockOnRoad() { + return getFieldByNumber(2, Integer.class); + } + + @Nullable + public Integer getAvoidances() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Integer getRouteRecalculation() { + return getFieldByNumber(4, Integer.class); + } + + @Nullable + public Integer getType() { + return getFieldByNumber(5, Integer.class); + } + + @Nullable + public Integer getCourseRecalculation() { + return getFieldByNumber(7, Integer.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(71); + } + + public Builder setRoutingMode(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setCalculationMethod(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setLockOnRoad(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setAvoidances(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setRouteRecalculation(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setType(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setCourseRecalculation(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + @Override + public FitRouting build() { + return (FitRouting) super.build(); + } + + @Override + public FitRouting build(final int localMessageType) { + return (FitRouting) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java index 4f353a4237..8c59d40145 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java @@ -49,6 +49,31 @@ public class FitSensorSettings extends RecordData { return getFieldByNumber(2, String.class); } + @Nullable + public Integer getWheelSizeManual() { + return getFieldByNumber(10, Integer.class); + } + + @Nullable + public Integer getCalibrationFactor() { + return getFieldByNumber(11, Integer.class); + } + + @Nullable + public Integer getWheelSizeAuto() { + return getFieldByNumber(21, Integer.class); + } + + @Nullable + public Integer getProduct() { + return getFieldByNumber(32, Integer.class); + } + + @Nullable + public Integer getManufacturer() { + return getFieldByNumber(33, Integer.class); + } + @Nullable public Integer getUseForSpeed() { return getFieldByNumber(45, Integer.class); @@ -64,6 +89,16 @@ public class FitSensorSettings extends RecordData { return getFieldByNumber(51, Integer.class); } + @Nullable + public Integer getSensorType() { + return getFieldByNumber(52, Integer.class); + } + + @Nullable + public String getProductName() { + return getFieldByNumber(91, String.class); + } + @Nullable public Integer getMessageIndex() { return getFieldByNumber(254, Integer.class); @@ -87,6 +122,31 @@ public class FitSensorSettings extends RecordData { return this; } + public Builder setWheelSizeManual(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setCalibrationFactor(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setWheelSizeAuto(final Integer value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setProduct(final Integer value) { + setFieldByNumber(32, value); + return this; + } + + public Builder setManufacturer(final Integer value) { + setFieldByNumber(33, value); + return this; + } + public Builder setUseForSpeed(final Integer value) { setFieldByNumber(45, value); return this; @@ -102,6 +162,16 @@ public class FitSensorSettings extends RecordData { return this; } + public Builder setSensorType(final Integer value) { + setFieldByNumber(52, value); + return this; + } + + public Builder setProductName(final String value) { + setFieldByNumber(91, 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/FitSleepRestlessMoments.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepRestlessMoments.java index 8b7c13819f..85a935e86d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepRestlessMoments.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSleepRestlessMoments.java @@ -50,7 +50,7 @@ public class FitSleepRestlessMoments extends RecordData { } @Nullable - public Number[] getUnknown2() { + public Number[] getDurations() { return getArrayFieldByNumber(2, Number.class); } @@ -72,7 +72,7 @@ public class FitSleepRestlessMoments extends RecordData { return this; } - public Builder setUnknown2(final Number[] value) { + public Builder setDurations(final Number[] value) { setFieldByNumber(2, (Object[]) 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 new file mode 100644 index 0000000000..39a761039d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplitTime.java @@ -0,0 +1,170 @@ +/* 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 FitSplitTime extends RecordData { + public FitSplitTime(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 311) { + throw new IllegalArgumentException("FitSplitTime expects native messages of " + 311 + ", got " + nativeNumber); + } + } + + @Nullable + public Double getTime() { + return getFieldByNumber(0, Double.class); + } + + @Nullable + public Double getDistance() { + return getFieldByNumber(1, Double.class); + } + + @Nullable + public Double getSplitTime() { + return getFieldByNumber(2, Double.class); + } + + @Nullable + public Double getSplitDistance() { + return getFieldByNumber(3, Double.class); + } + + @Nullable + public Float getSplitSpeed() { + return getFieldByNumber(4, Float.class); + } + + @Nullable + public Double getStartPositionLat() { + return getFieldByNumber(9, Double.class); + } + + @Nullable + public Double getStartPositionLong() { + return getFieldByNumber(10, Double.class); + } + + @Nullable + public Double getEndPositionLat() { + return getFieldByNumber(11, Double.class); + } + + @Nullable + public Double getEndPositionLong() { + return getFieldByNumber(12, Double.class); + } + + @Nullable + public Double getStartAltitude() { + return getFieldByNumber(13, Double.class); + } + + @Nullable + public Double getEndAltitude() { + return getFieldByNumber(14, Double.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(311); + } + + public Builder setTime(final Double value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDistance(final Double value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setSplitTime(final Double value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setSplitDistance(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setSplitSpeed(final Float value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setStartPositionLat(final Double value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setStartPositionLong(final Double value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setEndPositionLat(final Double value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setEndPositionLong(final Double value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setStartAltitude(final Double value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setEndAltitude(final Double value) { + setFieldByNumber(14, value); + return this; + } + + @Override + public FitSplitTime build() { + return (FitSplitTime) super.build(); + } + + @Override + public FitSplitTime build(final int localMessageType) { + return (FitSplitTime) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java index e35740e5de..eb41d52820 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSport.java @@ -54,6 +54,41 @@ public class FitSport extends RecordData { return getFieldByNumber(3, String.class); } + @Nullable + public Integer getPopularityRouting() { + return getFieldByNumber(15, Integer.class); + } + + @Nullable + public Integer getNavigationPrompt() { + return getFieldByNumber(17, Integer.class); + } + + @Nullable + public Integer getSharpBendWarnings() { + return getFieldByNumber(18, Integer.class); + } + + @Nullable + public Integer getWorkoutVideos() { + return getFieldByNumber(21, Integer.class); + } + + @Nullable + public Integer getHighTrafficRoadWarnings() { + return getFieldByNumber(22, Integer.class); + } + + @Nullable + public Integer getRoadHazardWarnings() { + return getFieldByNumber(23, Integer.class); + } + + @Nullable + public Integer getUnpavedRoadWarnings() { + return getFieldByNumber(24, Integer.class); + } + /** * @noinspection unused */ @@ -77,6 +112,41 @@ public class FitSport extends RecordData { return this; } + public Builder setPopularityRouting(final Integer value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setNavigationPrompt(final Integer value) { + setFieldByNumber(17, value); + return this; + } + + public Builder setSharpBendWarnings(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setWorkoutVideos(final Integer value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setHighTrafficRoadWarnings(final Integer value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setRoadHazardWarnings(final Integer value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setUnpavedRoadWarnings(final Integer value) { + setFieldByNumber(24, value); + return this; + } + @Override public FitSport build() { return (FitSport) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java index 059ad8289a..bb0f4a9202 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java @@ -39,6 +39,61 @@ public class FitTrainingSettings extends RecordData { } } + @Nullable + public Float getVirtualPartnerPace() { + return getFieldByNumber(2, Float.class); + } + + @Nullable + public Integer getAutoLapMode() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Double getAutoLapDistance() { + return getFieldByNumber(4, Double.class); + } + + @Nullable + public Integer getAutoPause() { + return getFieldByNumber(7, Integer.class); + } + + @Nullable + public Float getAutoPauseThreshold() { + return getFieldByNumber(8, Float.class); + } + + @Nullable + public Integer getPowerAveraging() { + return getFieldByNumber(12, Integer.class); + } + + @Nullable + public Integer getAutoScroll() { + return getFieldByNumber(15, Integer.class); + } + + @Nullable + public Integer getTimerStartPrompt() { + return getFieldByNumber(18, Integer.class); + } + + @Nullable + public Float getPoolLength() { + return getFieldByNumber(22, Float.class); + } + + @Nullable + public Integer getAutoSleep() { + return getFieldByNumber(25, Integer.class); + } + + @Nullable + public Integer getSatellites() { + return getFieldByNumber(27, Integer.class); + } + @Nullable public Double getTargetDistance() { return getFieldByNumber(31, Double.class); @@ -54,6 +109,146 @@ public class FitTrainingSettings extends RecordData { return getFieldByNumber(33, Long.class); } + @Nullable + public Integer getSpeed3D() { + return getFieldByNumber(35, Integer.class); + } + + @Nullable + public Integer getDistance3D() { + return getFieldByNumber(36, Integer.class); + } + + @Nullable + public Integer getAutoClimb() { + return getFieldByNumber(37, Integer.class); + } + + @Nullable + public Integer getAutoClimbInvertColors() { + return getFieldByNumber(40, Integer.class); + } + + @Nullable + public Long getAutoClimbVerticalSpeed() { + return getFieldByNumber(41, Long.class); + } + + @Nullable + public Integer getAutoClimbModeSwitch() { + return getFieldByNumber(42, Integer.class); + } + + @Nullable + public Integer getLapKey() { + return getFieldByNumber(46, Integer.class); + } + + @Nullable + public Integer getWorkoutTargetAlerts() { + return getFieldByNumber(50, Integer.class); + } + + @Nullable + public Integer getTimerStartAuto() { + return getFieldByNumber(51, Integer.class); + } + + @Nullable + public Float getTimerStartSpeed() { + return getFieldByNumber(52, Float.class); + } + + @Nullable + public Integer getSegmentAlerts() { + return getFieldByNumber(52, Integer.class); + } + + @Nullable + public Integer getCountdownStart() { + return getFieldByNumber(57, Integer.class); + } + + @Nullable + public Integer getClimbPro() { + return getFieldByNumber(63, Integer.class); + } + + @Nullable + public Integer getTrackConsumption() { + return getFieldByNumber(67, Integer.class); + } + + @Nullable + public Integer getBottleSize() { + return getFieldByNumber(69, Integer.class); + } + + @Nullable + public Integer getVolume() { + return getFieldByNumber(70, Integer.class); + } + + @Nullable + public Integer getMinimumRideDuration() { + return getFieldByNumber(80, Integer.class); + } + + @Nullable + public Integer getLaneNumber() { + return getFieldByNumber(86, Integer.class); + } + + @Nullable + public Integer getBroadcastHeartRate() { + return getFieldByNumber(87, Integer.class); + } + + @Nullable + public Integer getSelfEvaluation() { + return getFieldByNumber(93, Integer.class); + } + + @Nullable + public Integer getSpeedPro() { + return getFieldByNumber(102, Integer.class); + } + + @Nullable + public Integer getTouch() { + return getFieldByNumber(103, Integer.class); + } + + @Nullable + public Integer getRecordTemperature() { + return getFieldByNumber(106, Integer.class); + } + + @Nullable + public Integer getRunningPowerMode() { + return getFieldByNumber(109, Integer.class); + } + + @Nullable + public Integer getAccountForWind() { + return getFieldByNumber(110, Integer.class); + } + + @Nullable + public Integer getClimbProMode() { + return getFieldByNumber(111, Integer.class); + } + + @Nullable + public Integer getClimbDetection() { + return getFieldByNumber(117, Integer.class); + } + + @Nullable + public Integer getClimbProTerrain() { + return getFieldByNumber(119, Integer.class); + } + @Nullable public Double getPreciseTargetSpeed() { return getFieldByNumber(153, Double.class); @@ -67,6 +262,61 @@ public class FitTrainingSettings extends RecordData { super(13); } + public Builder setVirtualPartnerPace(final Float value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setAutoLapMode(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setAutoLapDistance(final Double value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setAutoPause(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setAutoPauseThreshold(final Float value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setPowerAveraging(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setAutoScroll(final Integer value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setTimerStartPrompt(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setPoolLength(final Float value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setAutoSleep(final Integer value) { + setFieldByNumber(25, value); + return this; + } + + public Builder setSatellites(final Integer value) { + setFieldByNumber(27, value); + return this; + } + public Builder setTargetDistance(final Double value) { setFieldByNumber(31, value); return this; @@ -82,6 +332,146 @@ public class FitTrainingSettings extends RecordData { return this; } + public Builder setSpeed3D(final Integer value) { + setFieldByNumber(35, value); + return this; + } + + public Builder setDistance3D(final Integer value) { + setFieldByNumber(36, value); + return this; + } + + public Builder setAutoClimb(final Integer value) { + setFieldByNumber(37, value); + return this; + } + + public Builder setAutoClimbInvertColors(final Integer value) { + setFieldByNumber(40, value); + return this; + } + + public Builder setAutoClimbVerticalSpeed(final Long value) { + setFieldByNumber(41, value); + return this; + } + + public Builder setAutoClimbModeSwitch(final Integer value) { + setFieldByNumber(42, value); + return this; + } + + public Builder setLapKey(final Integer value) { + setFieldByNumber(46, value); + return this; + } + + public Builder setWorkoutTargetAlerts(final Integer value) { + setFieldByNumber(50, value); + return this; + } + + public Builder setTimerStartAuto(final Integer value) { + setFieldByNumber(51, value); + return this; + } + + public Builder setTimerStartSpeed(final Float value) { + setFieldByNumber(52, value); + return this; + } + + public Builder setSegmentAlerts(final Integer value) { + setFieldByNumber(52, value); + return this; + } + + public Builder setCountdownStart(final Integer value) { + setFieldByNumber(57, value); + return this; + } + + public Builder setClimbPro(final Integer value) { + setFieldByNumber(63, value); + return this; + } + + public Builder setTrackConsumption(final Integer value) { + setFieldByNumber(67, value); + return this; + } + + public Builder setBottleSize(final Integer value) { + setFieldByNumber(69, value); + return this; + } + + public Builder setVolume(final Integer value) { + setFieldByNumber(70, value); + return this; + } + + public Builder setMinimumRideDuration(final Integer value) { + setFieldByNumber(80, value); + return this; + } + + public Builder setLaneNumber(final Integer value) { + setFieldByNumber(86, value); + return this; + } + + public Builder setBroadcastHeartRate(final Integer value) { + setFieldByNumber(87, value); + return this; + } + + public Builder setSelfEvaluation(final Integer value) { + setFieldByNumber(93, value); + return this; + } + + public Builder setSpeedPro(final Integer value) { + setFieldByNumber(102, value); + return this; + } + + public Builder setTouch(final Integer value) { + setFieldByNumber(103, value); + return this; + } + + public Builder setRecordTemperature(final Integer value) { + setFieldByNumber(106, value); + return this; + } + + public Builder setRunningPowerMode(final Integer value) { + setFieldByNumber(109, value); + return this; + } + + public Builder setAccountForWind(final Integer value) { + setFieldByNumber(110, value); + return this; + } + + public Builder setClimbProMode(final Integer value) { + setFieldByNumber(111, value); + return this; + } + + public Builder setClimbDetection(final Integer value) { + setFieldByNumber(117, value); + return this; + } + + public Builder setClimbProTerrain(final Integer value) { + setFieldByNumber(119, value); + return this; + } + public Builder setPreciseTargetSpeed(final Double value) { setFieldByNumber(153, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java index 142fba6609..3deafd46e2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java @@ -75,7 +75,22 @@ public class FitUserMetrics extends RecordData { } @Nullable - public Integer getInitialBodyBattery() { + public Integer getLactateThresholdHeartRate() { + return getFieldByNumber(11, Integer.class); + } + + @Nullable + public Integer getLactateThresholdPower() { + return getFieldByNumber(12, Integer.class); + } + + @Nullable + public Float getLactateThresholdSpeed() { + return getFieldByNumber(13, Float.class); + } + + @Nullable + public Integer getBeginningBodyBattery() { return getFieldByNumber(15, Integer.class); } @@ -84,6 +99,11 @@ public class FitUserMetrics extends RecordData { return getFieldByNumber(16, Long.class); } + @Nullable + public Long getFirstVo2Max() { + return getFieldByNumber(19, Long.class); + } + @Nullable public Integer getBeginningPotential() { return getFieldByNumber(32, Integer.class); @@ -147,7 +167,22 @@ public class FitUserMetrics extends RecordData { return this; } - public Builder setInitialBodyBattery(final Integer value) { + public Builder setLactateThresholdHeartRate(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setLactateThresholdPower(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setLactateThresholdSpeed(final Float value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setBeginningBodyBattery(final Integer value) { setFieldByNumber(15, value); return this; } @@ -157,6 +192,11 @@ public class FitUserMetrics extends RecordData { return this; } + public Builder setFirstVo2Max(final Long value) { + setFieldByNumber(19, value); + return this; + } + public Builder setBeginningPotential(final Integer value) { setFieldByNumber(32, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java index c3a1291630..3ad134b00f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java @@ -177,7 +177,7 @@ public class FitUserProfile extends RecordData { } @Nullable - public Float getLtspeed() { + public Float getLactateThresholdSpeed() { return getFieldByNumber(37, Float.class); } @@ -349,7 +349,7 @@ public class FitUserProfile extends RecordData { return this; } - public Builder setLtspeed(final Float value) { + public Builder setLactateThresholdSpeed(final Float value) { setFieldByNumber(37, value); return this; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java index 48bad5ae3d..b3d874e1b9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java @@ -59,6 +59,16 @@ public class FitWorkout extends RecordData { return getFieldByNumber(8, String.class); } + @Nullable + public Integer getDurationType() { + return getFieldByNumber(9, Integer.class); + } + + @Nullable + public Long getDurationValue() { + return getFieldByNumber(10, Long.class); + } + @Nullable public Integer getSubSport() { return getFieldByNumber(11, Integer.class); @@ -79,6 +89,21 @@ public class FitWorkout extends RecordData { return getFieldByNumber(17, String.class); } + @Nullable + public Integer getWorkoutIndex() { + return getFieldByNumber(20, Integer.class); + } + + @Nullable + public Double getTime() { + return getFieldByNumber(21, Double.class); + } + + @Nullable + public Double getDistance() { + return getFieldByNumber(22, Double.class); + } + @Nullable public Integer getMessageIndex() { return getFieldByNumber(254, Integer.class); @@ -112,6 +137,16 @@ public class FitWorkout extends RecordData { return this; } + public Builder setDurationType(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setDurationValue(final Long value) { + setFieldByNumber(10, value); + return this; + } + public Builder setSubSport(final Integer value) { setFieldByNumber(11, value); return this; @@ -132,6 +167,21 @@ public class FitWorkout extends RecordData { return this; } + public Builder setWorkoutIndex(final Integer value) { + setFieldByNumber(20, value); + return this; + } + + public Builder setTime(final Double value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setDistance(final Double value) { + setFieldByNumber(22, 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/FitWorkoutSchedule.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSchedule.java new file mode 100644 index 0000000000..e96a519942 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSchedule.java @@ -0,0 +1,120 @@ +/* Copyright (C) 2026 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * + * @noinspection unused + */ +public class FitWorkoutSchedule extends RecordData { + public FitWorkoutSchedule(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber(); + if (nativeNumber != 428) { + throw new IllegalArgumentException("FitWorkoutSchedule expects native messages of " + 428 + ", got " + nativeNumber); + } + } + + @Nullable + public Integer getWorkoutIndex() { + return getFieldByNumber(1, Integer.class); + } + + @Nullable + public Integer getEstBenefit() { + return getFieldByNumber(3, Integer.class); + } + + @Nullable + public Float getEstAerobicTe() { + return getFieldByNumber(5, Float.class); + } + + @Nullable + public Float getEstAnaerTe() { + return getFieldByNumber(6, Float.class); + } + + @Nullable + public Integer getSport() { + return getFieldByNumber(7, Integer.class); + } + + @Nullable + public Double getDuration() { + return getFieldByNumber(9, Double.class); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(428); + } + + public Builder setWorkoutIndex(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setEstBenefit(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setEstAerobicTe(final Float value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setEstAnaerTe(final Float value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setSport(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setDuration(final Double value) { + setFieldByNumber(9, value); + return this; + } + + @Override + public FitWorkoutSchedule build() { + return (FitWorkoutSchedule) super.build(); + } + + @Override + public FitWorkoutSchedule build(final int localMessageType) { + return (FitWorkoutSchedule) super.build(localMessageType); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java index 1ef3266f36..ed612d021d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java @@ -109,6 +109,11 @@ public class FitWorkoutStep extends RecordData { return getFieldByNumber(13, Integer.class); } + @Nullable + public Integer getSkipLastRecover() { + return getFieldByNumber(18, Integer.class); + } + @Nullable public Integer getSecondaryTargetType() { return getFieldByNumber(19, Integer.class); @@ -129,6 +134,11 @@ public class FitWorkoutStep extends RecordData { return getFieldByNumber(22, Long.class); } + @Nullable + public Integer getWorkoutIndex() { + return getFieldByNumber(31, Integer.class); + } + @Nullable public Integer getMessageIndex() { return getFieldByNumber(254, Integer.class); @@ -212,6 +222,11 @@ public class FitWorkoutStep extends RecordData { return this; } + public Builder setSkipLastRecover(final Integer value) { + setFieldByNumber(18, value); + return this; + } + public Builder setSecondaryTargetType(final Integer value) { setFieldByNumber(19, value); return this; @@ -232,6 +247,11 @@ public class FitWorkoutStep extends RecordData { return this; } + public Builder setWorkoutIndex(final Integer value) { + setFieldByNumber(31, value); + return this; + } + public Builder setMessageIndex(final Integer value) { setFieldByNumber(254, value); return this;