Garmin: extend FIT file parsing 4

This commit is contained in:
Thomas Kuehne
2025-09-21 15:24:05 +02:00
parent 0e5c493cea
commit ca081c062f
29 changed files with 3866 additions and 38 deletions
@@ -84,7 +84,7 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(18, BaseType.ENUM, "position_setting"),
new FieldDefinitionPrimitive(21, BaseType.ENUM, "temperature_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM),
new FieldDefinitionPrimitive(22, BaseType.UINT16, "local_id"),
new FieldDefinitionPrimitive(23, BaseType.UINT8, 6, "global_id"),
new FieldDefinitionPrimitive(23, BaseType.BASE_TYPE_BYTE, 6, "global_id"),
new FieldDefinitionPrimitive(24, BaseType.UINT8, "year_of_birth", 1, -1900),
new FieldDefinitionPrimitive(28, BaseType.UINT32, "wake_time"),
new FieldDefinitionPrimitive(29, BaseType.UINT32, "sleep_time"),
@@ -100,7 +100,7 @@ public class GlobalFITMessage {
));
public static GlobalFITMessage HRM_PROFILE = new GlobalFITMessage(4, "HRM_PROFILE", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT8, "enabled"),
new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(1, BaseType.UINT16Z, "hrm_ant_id"),
new FieldDefinitionPrimitive(2, BaseType.ENUM, "log_hrv"),
new FieldDefinitionPrimitive(3, BaseType.UINT8Z, "hrm_ant_id_trans_type"),
@@ -108,7 +108,7 @@ public class GlobalFITMessage {
));
public static GlobalFITMessage SDM_PROFILE = new GlobalFITMessage(5, "SDM_PROFILE", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled"),
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), // %
new FieldDefinitionPrimitive(3, BaseType.UINT32, "odometer", 100, 0), // m
@@ -205,7 +205,8 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(8, BaseType.ENUM, "recurrence"),
new FieldDefinitionPrimitive(9, BaseType.UINT16, "recurrence_value"),
new FieldDefinitionPrimitive(10, BaseType.ENUM, "enabled"),
new FieldDefinitionPrimitive(11, BaseType.ENUM, "source", FieldDefinitionFactory.FIELD.GOAL_SOURCE)
new FieldDefinitionPrimitive(11, BaseType.ENUM, "source", FieldDefinitionFactory.FIELD.GOAL_SOURCE),
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage SESSION = new GlobalFITMessage(18, "SESSION", Arrays.asList(
@@ -294,6 +295,12 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(92, BaseType.UINT8, "avg_fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(93, BaseType.UINT8, "max_fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(94, BaseType.UINT8, "total_fractional_cycles", 128, 0), // cycles
new FieldDefinitionPrimitive(95, BaseType.UINT16, "avg_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(96, BaseType.UINT16, "min_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(97, BaseType.UINT16, "max_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(98, BaseType.UINT16, "avg_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(99, BaseType.UINT16, "min_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(100, BaseType.UINT16, "max_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(101, BaseType.UINT8, "avg_left_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(102, BaseType.UINT8, "avg_right_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(103, BaseType.UINT8, "avg_left_pedal_smoothness", 2, 0), // %
@@ -317,10 +324,17 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(123, BaseType.UINT8, "max_cadence_position", FieldDefinitionFactory.FIELD.ARRAY), // watt, 2 items (seat / stand)
new FieldDefinitionPrimitive(124, BaseType.UINT32, "enhanced_avg_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(125, BaseType.UINT32, "enhanced_max_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(126, BaseType.UINT32, "enhanced_avg_altitude", 5, 500), // m
new FieldDefinitionPrimitive(127, BaseType.UINT32, "enhanced_min_altitude", 5, 500), // m
new FieldDefinitionPrimitive(128, BaseType.UINT32, "enhanced_max_altitude", 5, 500), // m
new FieldDefinitionPrimitive(129, BaseType.UINT16, "avg_lev_motor_power"), // watt
new FieldDefinitionPrimitive(130, BaseType.UINT16, "max_lev_motor_power"), // watt
new FieldDefinitionPrimitive(131, BaseType.UINT8, "lev_battery_consumption", 2, 0), // %
new FieldDefinitionPrimitive(132, BaseType.UINT16, "avg_vertical_ratio", 100, 0), // %
new FieldDefinitionPrimitive(133, BaseType.UINT16, "avg_stance_time_balance", 100, 0), // %
new FieldDefinitionPrimitive(134, BaseType.UINT16, "avg_step_length", 10, 0), // mm
new FieldDefinitionPrimitive(137, BaseType.UINT8, "total_anaerobic_training_effect", 10, 0),
new FieldDefinitionPrimitive(139, BaseType.UINT16, "avg_vam", 1000, 0), // m/s
new FieldDefinitionPrimitive(140, BaseType.UINT32, "avg_depth", 1000, 0), // m
new FieldDefinitionPrimitive(141, BaseType.UINT32, "max_depth", 1000, 0), // m
new FieldDefinitionPrimitive(142, BaseType.UINT32, "surface_interval"), // s
@@ -418,12 +432,38 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(54, BaseType.SINT16, "avg_neg_vertical_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(55, BaseType.SINT16, "max_pos_vertical_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(56, BaseType.SINT16, "max_neg_vertical_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(57, BaseType.UINT32, "time_in_hr_zone", 1000, 0), // s
new FieldDefinitionPrimitive(57, BaseType.UINT32, "time_in_hr_zone", FieldDefinitionFactory.FIELD.ARRAY,1000, 0), // s
new FieldDefinitionPrimitive(58, BaseType.UINT32, "time_in_speed_zone", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(59, BaseType.UINT32, "time_in_cadence_zone", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(60, BaseType.UINT32, "time_in_power_zone", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(61, BaseType.UINT16, "repetition_num"),
new FieldDefinitionPrimitive(62, BaseType.UINT16, "min_altitude", 5, 500), // m
new FieldDefinitionPrimitive(63, BaseType.UINT8, "min_heart_rate"),
new FieldDefinitionPrimitive(71, BaseType.UINT16, "wkt_step_index"),
new FieldDefinitionPrimitive(73, BaseType.UINT16, "avg_swolf"),
new FieldDefinitionPrimitive(74, BaseType.UINT16, "opponent_score"),
new FieldDefinitionPrimitive(75, BaseType.UINT16, "stroke_count", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(76, BaseType.UINT16, "zone_count", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(77, BaseType.UINT16, "avg_vertical_oscillation", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // mm
new FieldDefinitionPrimitive(78, BaseType.UINT16, "avg_stance_time_percen", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // %
new FieldDefinitionPrimitive(79, BaseType.UINT16, "avg_stance_time", FieldDefinitionFactory.FIELD.ARRAY, 10, 0), // ms
new FieldDefinitionPrimitive(80, BaseType.UINT8, "avg_fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(81, BaseType.UINT8, "max_fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(82, BaseType.UINT8, "total_fractional_cycles", 128, 0), // cycles
new FieldDefinitionPrimitive(83, BaseType.UINT16, "player_score"),
new FieldDefinitionPrimitive(84, BaseType.UINT16, "avg_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(85, BaseType.UINT16, "min_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(86, BaseType.UINT16, "max_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(87, BaseType.UINT16, "avg_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(88, BaseType.UINT16, "min_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(89, BaseType.UINT16, "max_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(91, BaseType.UINT8, "avg_left_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(92, BaseType.UINT8, "avg_right_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(93, BaseType.UINT8, "avg_left_pedal_smoothness", 2, 0), // %
new FieldDefinitionPrimitive(94, BaseType.UINT8, "avg_right_pedal_smoothness", 2, 0), // %
new FieldDefinitionPrimitive(95, BaseType.UINT8, "avg_combined_pedal_smoothness", 2, 0), // %
new FieldDefinitionPrimitive(98, BaseType.UINT32, "time_standing", 1000, 0), // s
new FieldDefinitionPrimitive(99, BaseType.UINT16, "stand_count"),
new FieldDefinitionPrimitive(100, BaseType.SINT8, "avg_left_pco"), // mm
new FieldDefinitionPrimitive(101, BaseType.SINT8, "avg_right_pco"), // mm
new FieldDefinitionPrimitive(102, BaseType.UINT8, "avg_left_power_phase"),
@@ -436,7 +476,30 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(109, BaseType.UINT8, "max_cadence_position"), // rpm
new FieldDefinitionPrimitive(110, BaseType.UINT32, "enhanced_avg_speed", 100, 0), // m/s
new FieldDefinitionPrimitive(111, BaseType.UINT32, "enhanced_max_speed", 100, 0), // m/s
new FieldDefinitionPrimitive(112, BaseType.UINT32, "enhanced_avg_altitude", 5, 500), // m
new FieldDefinitionPrimitive(113, BaseType.UINT32, "enhanced_min_altitude", 5, 500), // m
new FieldDefinitionPrimitive(114, BaseType.UINT32, "enhanced_max_altitude", 5, 500), // m
new FieldDefinitionPrimitive(115, BaseType.UINT16, "avg_lev_motor_power"), // watt
new FieldDefinitionPrimitive(116, BaseType.UINT16, "max_lev_motor_power"), // watt
new FieldDefinitionPrimitive(117, BaseType.UINT8, "lev_battery_consumption", 2, 0), // %
new FieldDefinitionPrimitive(118, BaseType.UINT16, "avg_vertical_ratio", 100, 0), // %
new FieldDefinitionPrimitive(119, BaseType.UINT16, "avg_stance_time_balance", 100, 0), // %
new FieldDefinitionPrimitive(120, BaseType.UINT16, "avg_step_length", 10, 0), // mm
new FieldDefinitionPrimitive(121, BaseType.UINT16, "avg_vam", 1000, 0), // m/s
new FieldDefinitionPrimitive(122, BaseType.UINT32, "avg_depth", 1000, 0), // m
new FieldDefinitionPrimitive(123, BaseType.UINT32, "max_depth", 1000, 0), // m
new FieldDefinitionPrimitive(124, BaseType.SINT8, "min_temperature"), // °C
new FieldDefinitionPrimitive(136, BaseType.UINT16, "enhanced_avg_respiration_rate", 100, 0), // breath / min
new FieldDefinitionPrimitive(137, BaseType.UINT16, "enhanced_max_respiration_rate", 100, 0), // breath / min
new FieldDefinitionPrimitive(147, BaseType.UINT8, "avg_respiration_rate"),
new FieldDefinitionPrimitive(148, BaseType.UINT8, "max_respiration_rate"),
new FieldDefinitionPrimitive(149, BaseType.FLOAT32, "total_grit"),
new FieldDefinitionPrimitive(150, BaseType.FLOAT32, "total_flow"),
new FieldDefinitionPrimitive(151, BaseType.UINT16, "jump_count"),
new FieldDefinitionPrimitive(153, BaseType.FLOAT32, "avg_grit"),
new FieldDefinitionPrimitive(154, BaseType.FLOAT32, "avg_flow"),
new FieldDefinitionPrimitive(156, BaseType.UINT8, "total_fractional_ascent", 100, 0), // m
new FieldDefinitionPrimitive(157, BaseType.UINT8, "total_fractional_descent", 100, 0), // m
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
@@ -472,12 +535,30 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(40, BaseType.UINT16, "stance_time_percent", 100, 0), // %
new FieldDefinitionPrimitive(41, BaseType.UINT16, "stance_time", 10, 0), // ms
new FieldDefinitionPrimitive(42, BaseType.ENUM, "activity"),
new FieldDefinitionPrimitive(43, BaseType.UINT8, "left_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(44, BaseType.UINT8, "right_torque_effectiveness", 2, 0), // %
new FieldDefinitionPrimitive(45, BaseType.UINT8, "left_pedal_smoothness", 2, 0), // %
new FieldDefinitionPrimitive(46, BaseType.UINT8, "right_pedal_smoothness", 2, 0), // %
new FieldDefinitionPrimitive(47, BaseType.UINT8, "combined_pedal_smoothness", 2, 0), // %
new FieldDefinitionPrimitive(48, BaseType.UINT8, "time128", 128, 0), // s
new FieldDefinitionPrimitive(49, BaseType.ENUM, "stroke_type"),
new FieldDefinitionPrimitive(50, BaseType.UINT8, "zone"),
new FieldDefinitionPrimitive(51, BaseType.UINT16, "ball_speed", 100, 0), // m/s
new FieldDefinitionPrimitive(52, BaseType.UINT16, "cadence256", 256, 0), // RPM
new FieldDefinitionPrimitive(53, BaseType.UINT8, "fractional_cadence", 128, 0), // rpm
new FieldDefinitionPrimitive(54, BaseType.UINT16, "avg_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(55, BaseType.UINT16, "min_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(56, BaseType.UINT16, "max_total_hemoglobin_conc", FieldDefinitionFactory.FIELD.ARRAY,100, 0), // g/dL
new FieldDefinitionPrimitive(57, BaseType.UINT16, "avg_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(58, BaseType.UINT16, "min_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(59, BaseType.UINT16, "max_saturated_hemoglobin_percent", FieldDefinitionFactory.FIELD.ARRAY,10, 0), // %
new FieldDefinitionPrimitive(62, BaseType.UINT8, "device_index"),
new FieldDefinitionPrimitive(67, BaseType.SINT8, "left_pco"), // mm
new FieldDefinitionPrimitive(68, BaseType.SINT8, "right_pco"), // mm
new FieldDefinitionPrimitive(69, BaseType.UINT8, "left_power_phase", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(70, BaseType.UINT8, "left_power_phase_peak", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(71, BaseType.UINT8, "right_power_phase", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(72, BaseType.UINT8, "right_power_phase_peak", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(73, BaseType.UINT32, "enhanced_speed", 1000, 0), // mm/s
new FieldDefinitionPrimitive(78, BaseType.UINT32, "enhanced_altitude", 5, 500), // m
new FieldDefinitionPrimitive(81, BaseType.UINT8, "battery_soc", 2, 0), // %
@@ -499,6 +580,10 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(114, BaseType.FLOAT32, "grit"),
new FieldDefinitionPrimitive(115, BaseType.FLOAT32, "flow"),
new FieldDefinitionPrimitive(116, BaseType.UINT16, "current_stress", 100, 0),
new FieldDefinitionPrimitive(117, BaseType.UINT16, "ebike_travel_rang"), // km
new FieldDefinitionPrimitive(118, BaseType.UINT8, "ebike_battery_level"), // %
new FieldDefinitionPrimitive(119, BaseType.UINT8, "ebike_assist_mode"),
new FieldDefinitionPrimitive(120, BaseType.UINT8, "ebike_assist_level_percent"), // %
new FieldDefinitionPrimitive(123, BaseType.UINT32, "air_time_remaining"), // s
new FieldDefinitionPrimitive(124, BaseType.UINT16, "pressure_sac", 100, 0), // bar / min
new FieldDefinitionPrimitive(125, BaseType.UINT16, "volume_sac", 100, 0), // liter / min
@@ -515,8 +600,21 @@ public class GlobalFITMessage {
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"),
new FieldDefinitionPrimitive(3, BaseType.UINT32, "data"), // in sleep they're timestamps in garmin epoch? in timer, 0 for manual
new FieldDefinitionPrimitive(3, BaseType.UINT32, "data"), // in sleep they're timestamps in garmin epoch? in timer, 0 for manual - datatype depends on field 2 (event_type) ...
new FieldDefinitionPrimitive(4, BaseType.UINT8, "event_group"), // 0?
new FieldDefinitionPrimitive(7, BaseType.UINT16, "score"),
new FieldDefinitionPrimitive(8, BaseType.UINT16, "opponent_score"),
new FieldDefinitionPrimitive(9, BaseType.UINT8Z, "front_gear_num"),
new FieldDefinitionPrimitive(10, BaseType.UINT8Z, "front_gear"),
new FieldDefinitionPrimitive(11, BaseType.UINT8Z, "rear_gear_num"),
new FieldDefinitionPrimitive(12, BaseType.UINT8Z, "rear_gear"),
new FieldDefinitionPrimitive(13, BaseType.UINT8, "device_index"),
new FieldDefinitionPrimitive(14, BaseType.ENUM, "activity_type"),
new FieldDefinitionPrimitive(15, BaseType.UINT32, "start_timestamp"), // s
new FieldDefinitionPrimitive(21, BaseType.ENUM, "radar_threat_level_max"),
new FieldDefinitionPrimitive(22, BaseType.UINT8, "radar_threat_count"),
new FieldDefinitionPrimitive(23, BaseType.UINT8, "radar_threat_avg_approach_speed", 10, 0), // m/s
new FieldDefinitionPrimitive(24, BaseType.UINT8, "radar_threat_max_approach_speed", 10, 0), // m/s
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
@@ -561,7 +659,8 @@ public class GlobalFITMessage {
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(17, BaseType.STRING, "notes"),
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage WORKOUT_STEP = new GlobalFITMessage(27, "WORKOUT_STEP", Arrays.asList(
@@ -586,6 +685,16 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage SCHEDULE = new GlobalFITMessage(28, "SCHEDULE", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT16, "manufacturer"),
new FieldDefinitionPrimitive(1, BaseType.UINT16, "product"),
new FieldDefinitionPrimitive(2, BaseType.UINT32Z, "serial_number"),
new FieldDefinitionPrimitive(3, BaseType.UINT32, "time_created"),
new FieldDefinitionPrimitive(4, BaseType.ENUM, "completed", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(5, BaseType.ENUM, "type"),
new FieldDefinitionPrimitive(6, BaseType.UINT32, "scheduled_time")
));
public static GlobalFITMessage LOCATION = new GlobalFITMessage(29, "LOCATION", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.STRING, 32, "name"),
new FieldDefinitionPrimitive(1, BaseType.SINT32, "position_lat", FieldDefinitionFactory.FIELD.COORDINATE),
@@ -727,7 +836,7 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(8, BaseType.UINT16, "distance_16"),
new FieldDefinitionPrimitive(9, BaseType.UINT16, "cycles_16"),
new FieldDefinitionPrimitive(10, BaseType.UINT16, "active_time_16"),
new FieldDefinitionPrimitive(11, BaseType.UINT16, "local_timestamp"),
new FieldDefinitionPrimitive(11, BaseType.UINT32, "local_timestamp"),
new FieldDefinitionPrimitive(12, BaseType.SINT16, "temperature", 100, 0), // °C
new FieldDefinitionPrimitive(14, BaseType.SINT16, "temperature_min", 100, 0), // °C
new FieldDefinitionPrimitive(15, BaseType.SINT16, "temperature_max", 100, 0), // °C
@@ -791,6 +900,33 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(39, BaseType.UINT32, "wake_up_time"),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage ANT_RX = new GlobalFITMessage(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),
new FieldDefinitionPrimitive(3, BaseType.UINT8, "channel_number"),
new FieldDefinitionPrimitive(4, BaseType.BASE_TYPE_BYTE, "data", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage ANT_TX = new GlobalFITMessage(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),
new FieldDefinitionPrimitive(3, BaseType.UINT8, "channel_number"),
new FieldDefinitionPrimitive(4, BaseType.BASE_TYPE_BYTE, "data", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage ANT_CHANNEL_ID = new GlobalFITMessage(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"),
new FieldDefinitionPrimitive(3, BaseType.UINT8Z, "transmission_type"),
new FieldDefinitionPrimitive(4, BaseType.UINT8, "device_index")
));
public static GlobalFITMessage LENGTH = new GlobalFITMessage(101, "LENGTH", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"),
new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"),
@@ -879,9 +1015,19 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage WEATHER_ALERT = new GlobalFITMessage(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"),
new FieldDefinitionPrimitive(3, BaseType.ENUM, "severity"),
new FieldDefinitionPrimitive(4, BaseType.ENUM, "type"),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage CADENCE_ZONE = new GlobalFITMessage(131, "CADENCE_ZONE", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT8, "high_value"), // rpm
new FieldDefinitionPrimitive(1, BaseType.STRING, "name")
new FieldDefinitionPrimitive(1, BaseType.STRING, "name"),
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage HR = new GlobalFITMessage(132, "HR", Arrays.asList(
@@ -935,6 +1081,7 @@ public class GlobalFITMessage {
));
public static GlobalFITMessage MEMO_GLOB = new GlobalFITMessage(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"),
new FieldDefinitionPrimitive(3, BaseType.UINT8, "field_num"),
@@ -977,6 +1124,7 @@ public class GlobalFITMessage {
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
new FieldDefinitionPrimitive(4, BaseType.UINT16, "altitude", 5, 500), // m
new FieldDefinitionPrimitive(5, BaseType.UINT32, 6,"leader_time", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // s
new FieldDefinitionPrimitive(6, BaseType.UINT32, "enhanced_altitude", 5, 500), // m
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
@@ -1011,8 +1159,15 @@ public class GlobalFITMessage {
));
public static GlobalFITMessage GPS_METADATA = new GlobalFITMessage(160, "GPS_METADATA", Arrays.asList(
new FieldDefinitionPrimitive(3, BaseType.UINT32, "enhanced_altitude"),
new FieldDefinitionPrimitive(4, BaseType.UINT32, "enhanced_speed")
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),
new FieldDefinitionPrimitive(3, BaseType.UINT32, "enhanced_altitude", 5, 500), // m
new FieldDefinitionPrimitive(4, BaseType.UINT32, "enhanced_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(5, BaseType.UINT16, "heading", 100, 0), // degrees
new FieldDefinitionPrimitive(6, BaseType.UINT32, "utc_timestamp"), // s
new FieldDefinitionPrimitive(7, BaseType.SINT16, 3, "velocity", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // m/s
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage TIMESTAMP_CORRELATION = new GlobalFITMessage(162, "TIMESTAMP_CORRELATION", Arrays.asList(
@@ -1107,7 +1262,10 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(5, BaseType.UINT8, "set_type"), // 1 active 0 rest
new FieldDefinitionPrimitive(6, BaseType.UINT32, "start_time", FieldDefinitionFactory.FIELD.TIMESTAMP),
new FieldDefinitionPrimitive(7, BaseType.UINT16, "category", FieldDefinitionFactory.FIELD.EXERCISE_CATEGORY),
new FieldDefinitionPrimitive(8, BaseType.UINT16, "category_subtype", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(9, BaseType.UINT16, "weight_display_unit"),
new FieldDefinitionPrimitive(10, BaseType.UINT16, "message_index"),
new FieldDefinitionPrimitive(11, BaseType.UINT16, "wkt_step_index"),
new FieldDefinitionPrimitive(254, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage DIVE_SETTINGS = new GlobalFITMessage(258, "DIVE_SETTINGS", Arrays.asList(
@@ -1143,14 +1301,14 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(30, BaseType.ENUM, "up_key_enabled"),
new FieldDefinitionPrimitive(35, BaseType.ENUM, "dive_sounds"),
new FieldDefinitionPrimitive(36, BaseType.UINT8, "last_stop_multiple", 10, 0),
new FieldDefinitionPrimitive(37, BaseType.UINT8, "no_fly_time_mode"),
new FieldDefinitionPrimitive(37, BaseType.ENUM, "no_fly_time_mode"),
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP),
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage DIVE_GAS = new GlobalFITMessage(259, "DIVE_GAS", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT8, "helium_content"),
new FieldDefinitionPrimitive(1, BaseType.UINT8, "oxygen_content"),
new FieldDefinitionPrimitive(2, BaseType.UINT8, "status"),
new FieldDefinitionPrimitive(2, BaseType.ENUM, "status"),
new FieldDefinitionPrimitive(3, BaseType.ENUM, "mode"),
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
@@ -1160,6 +1318,22 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(3, BaseType.SINT8, "body_energy")
));
public static GlobalFITMessage DIVE_ALARM = new GlobalFITMessage(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),
new FieldDefinitionPrimitive(3, BaseType.ENUM, "alarm_type"),
new FieldDefinitionPrimitive(4, BaseType.ENUM, "sound"),
new FieldDefinitionPrimitive(5, BaseType.ENUM, "dive_types", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(6, BaseType.UINT32, "id"),
new FieldDefinitionPrimitive(7, BaseType.ENUM, "popup_enabled", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(8, BaseType.ENUM, "trigger_on_descent", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(9, BaseType.ENUM, "trigger_on_ascent", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(10, BaseType.ENUM, "repeating", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(11, BaseType.SINT32, "speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage EXERCISE_TITLE = new GlobalFITMessage(264, "EXERCISE_TITLE", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT16, "exercise_category"),
new FieldDefinitionPrimitive(1, BaseType.UINT16, "exercise_name"),
@@ -1170,7 +1344,7 @@ public class GlobalFITMessage {
public static GlobalFITMessage SPO2 = new GlobalFITMessage(269, "SPO2", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT8, "reading_spo2"),
new FieldDefinitionPrimitive(1, BaseType.UINT8, "reading_confidence"),
new FieldDefinitionPrimitive(2, BaseType.UINT8, "mode"), // 1 manual 3 periodic
new FieldDefinitionPrimitive(2, BaseType.ENUM, "mode"), // 1 manual 3 periodic
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
@@ -1230,6 +1404,19 @@ public class GlobalFITMessage {
));
public static GlobalFITMessage JUMP = new GlobalFITMessage(285, "JUMP", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.FLOAT32, "distance"), // m
new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "heigh"), // m
new FieldDefinitionPrimitive(2, BaseType.UINT8, "rotations"),
new FieldDefinitionPrimitive(3, BaseType.FLOAT32, "hang_time"), // s
new FieldDefinitionPrimitive(4, BaseType.FLOAT32, "score"), // s
new FieldDefinitionPrimitive(5, BaseType.SINT32, "position_lat", FieldDefinitionFactory.FIELD.COORDINATE),
new FieldDefinitionPrimitive(6, BaseType.SINT32, "position_long", FieldDefinitionFactory.FIELD.COORDINATE),
new FieldDefinitionPrimitive(7, BaseType.UINT16, "speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(8, BaseType.UINT32, "enhanced_speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage BEAT_INTERVALS = new GlobalFITMessage(290, "BEAT_INTERVALS", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms
new FieldDefinitionPrimitive(1, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ARRAY), // ms
@@ -1291,7 +1478,7 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(27, BaseType.UINT32, "end_time"),
new FieldDefinitionPrimitive(28, BaseType.UINT32, "total_calories"), // kcal
new FieldDefinitionPrimitive(74, BaseType.UINT32, "start_elevation", 5, 500), // meter
new FieldDefinitionPrimitive(101, BaseType.UINT32, "total_moving_time", 1000, 0), // seconds
new FieldDefinitionPrimitive(110, BaseType.UINT32, "total_moving_time", 1000, 0), // seconds
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
@@ -1326,6 +1513,16 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage CLIMB_PRO = new GlobalFITMessage(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"),
new FieldDefinitionPrimitive(3, BaseType.UINT16, "climb_number"),
new FieldDefinitionPrimitive(4, BaseType.UINT8, "climb_category"),
new FieldDefinitionPrimitive(5, BaseType.FLOAT32, "current_dist"), // m
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage TANK_UPDATE = new GlobalFITMessage(319, "TANK_UPDATE", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "sensor"),
new FieldDefinitionPrimitive(1, BaseType.UINT16, "pressure", 100, 0), // bar
@@ -1429,12 +1626,45 @@ public class GlobalFITMessage {
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage CHRONO_SHOT_SESSION = new GlobalFITMessage(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
new FieldDefinitionPrimitive(3, BaseType.UINT16, "shot_count"),
new FieldDefinitionPrimitive(4, BaseType.ENUM, "projectile_type"),
new FieldDefinitionPrimitive(5, BaseType.UINT32, "grain_weight", 10, 0), // g
new FieldDefinitionPrimitive(6, BaseType.UINT32, "standard_deviation", 1000, 0), // m/s
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));
public static GlobalFITMessage CHRONO_SHOT_DATA = new GlobalFITMessage(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 GlobalFITMessage HSA_CONFIGURATION_DATA = new GlobalFITMessage(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 GlobalFITMessage DIVE_APNEA_ALARM = new GlobalFITMessage(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),
new FieldDefinitionPrimitive(3, BaseType.ENUM, "alarm_type"),
new FieldDefinitionPrimitive(4, BaseType.ENUM, "sound"),
new FieldDefinitionPrimitive(5, BaseType.ENUM, "dive_types", FieldDefinitionFactory.FIELD.ARRAY),
new FieldDefinitionPrimitive(6, BaseType.UINT32, "id"),
new FieldDefinitionPrimitive(7, BaseType.ENUM, "popup_enabled", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(8, BaseType.ENUM, "trigger_on_descent", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(9, BaseType.ENUM, "trigger_on_ascent", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(10, BaseType.ENUM, "repeating", FieldDefinitionFactory.FIELD.BOOLEAN),
new FieldDefinitionPrimitive(11, BaseType.SINT32, "speed", 1000, 0), // m/s
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
));
public static GlobalFITMessage CPE_STATUS = new GlobalFITMessage(394, "CPE_STATUS", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.ENUM, "status"),
new FieldDefinitionPrimitive(1, BaseType.UINT32, "start_time"),
@@ -1491,6 +1721,7 @@ public class GlobalFITMessage {
put(23, DEVICE_INFO);
put(26, WORKOUT);
put(27, WORKOUT_STEP);
put(28, SCHEDULE);
put(29, LOCATION);
put(30, WEIGHT_SCALE);
put(31, COURSE);
@@ -1509,6 +1740,9 @@ public class GlobalFITMessage {
put(72, TRAINING_FILE);
put(78, HRV);
put(79, USER_METRICS);
put(80, ANT_RX);
put(81, ANT_TX);
put(82, ANT_CHANNEL_ID);
put(101, LENGTH);
put(103, MONITORING_INFO);
put(104, DEVICE_STATUS);
@@ -1516,6 +1750,7 @@ public class GlobalFITMessage {
put(106, SLAVE_DEVICE);
put(127, CONNECTIVITY);
put(128, WEATHER);
put(129, WEATHER_ALERT);
put(131, CADENCE_ZONE);
put(132, HR);
put(140, PHYSIOLOGICAL_METRICS);
@@ -1543,12 +1778,14 @@ public class GlobalFITMessage {
put(229, MAX_MET_DATA);
put(258, DIVE_SETTINGS);
put(259, DIVE_GAS);
put(262, DIVE_ALARM);
put(264, EXERCISE_TITLE);
put(269, SPO2);
put(273, SLEEP_DATA_INFO);
put(274, SLEEP_DATA_RAW);
put(268, DIVE_SUMMARY);
put(275, SLEEP_STAGE);
put(285, JUMP);
put(290, BEAT_INTERVALS);
put(297, RESPIRATION_RATE);
put(304, HSA_STEP_DATA);
@@ -1560,6 +1797,7 @@ public class GlobalFITMessage {
put(313, SPLIT_SUMMARY);
put(314, HSA_BODY_BATTERY_DATA);
put(315, HSA_EVENT);
put(317, CLIMB_PRO);
put(319, TANK_UPDATE);
put(323, TANK_SUMMARY);
put(326, GPS_EVENT);
@@ -1572,7 +1810,10 @@ public class GlobalFITMessage {
put(375, DEVICE_AUX_BATTERY_INFO);
put(378, TRAINING_LOAD);
put(379, SLEEP_SCHEDULE);
put(387, CHRONO_SHOT_SESSION);
put(388, CHRONO_SHOT_DATA);
put(389, HSA_CONFIGURATION_DATA);
put(393, DIVE_APNEA_ALARM);
put(394, CPE_STATUS);
put(397, SKIN_TEMP_RAW);
put(398, SKIN_TEMP_OVERNIGHT);
@@ -0,0 +1,104 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitAntChannelId extends RecordData {
public FitAntChannelId(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 82) {
throw new IllegalArgumentException("FitAntChannelId expects global messages of " + 82 + ", got " + globalNumber);
}
}
@Nullable
public Integer getChannelNumber() {
return (Integer) getFieldByNumber(0);
}
@Nullable
public Integer getDeviceType() {
return (Integer) getFieldByNumber(1);
}
@Nullable
public Integer getDeviceNumber() {
return (Integer) getFieldByNumber(2);
}
@Nullable
public Integer getTransmissionType() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Integer getDeviceIndex() {
return (Integer) getFieldByNumber(4);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(82);
}
public Builder setChannelNumber(final Integer value) {
setFieldByNumber(0, value);
return this;
}
public Builder setDeviceType(final Integer value) {
setFieldByNumber(1, value);
return this;
}
public Builder setDeviceNumber(final Integer value) {
setFieldByNumber(2, value);
return this;
}
public Builder setTransmissionType(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setDeviceIndex(final Integer value) {
setFieldByNumber(4, value);
return this;
}
@Override
public FitAntChannelId build() {
return (FitAntChannelId) super.build();
}
}
}
@@ -0,0 +1,128 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitAntRx extends RecordData {
public FitAntRx(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 80) {
throw new IllegalArgumentException("FitAntRx expects global messages of " + 80 + ", got " + globalNumber);
}
}
@Nullable
public Float getFractionalTimestamp() {
return (Float) getFieldByNumber(0);
}
@Nullable
public Integer getMesgId() {
return (Integer) getFieldByNumber(1);
}
@Nullable
public Number[] getMesgData() {
final Object[] objectsArray = (Object[]) getFieldByNumber(2);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Integer getChannelNumber() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Number[] getData() {
final Object[] objectsArray = (Object[]) getFieldByNumber(4);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(80);
}
public Builder setFractionalTimestamp(final Float value) {
setFieldByNumber(0, value);
return this;
}
public Builder setMesgId(final Integer value) {
setFieldByNumber(1, value);
return this;
}
public Builder setMesgData(final Number[] value) {
setFieldByNumber(2, (Object[]) value);
return this;
}
public Builder setChannelNumber(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setData(final Number[] value) {
setFieldByNumber(4, (Object[]) value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitAntRx build() {
return (FitAntRx) super.build();
}
}
}
@@ -0,0 +1,128 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitAntTx extends RecordData {
public FitAntTx(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 81) {
throw new IllegalArgumentException("FitAntTx expects global messages of " + 81 + ", got " + globalNumber);
}
}
@Nullable
public Float getFractionalTimestamp() {
return (Float) getFieldByNumber(0);
}
@Nullable
public Integer getMesgId() {
return (Integer) getFieldByNumber(1);
}
@Nullable
public Number[] getMesgData() {
final Object[] objectsArray = (Object[]) getFieldByNumber(2);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Integer getChannelNumber() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Number[] getData() {
final Object[] objectsArray = (Object[]) getFieldByNumber(4);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(81);
}
public Builder setFractionalTimestamp(final Float value) {
setFieldByNumber(0, value);
return this;
}
public Builder setMesgId(final Integer value) {
setFieldByNumber(1, value);
return this;
}
public Builder setMesgData(final Number[] value) {
setFieldByNumber(2, (Object[]) value);
return this;
}
public Builder setChannelNumber(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setData(final Number[] value) {
setFieldByNumber(4, (Object[]) value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitAntTx build() {
return (FitAntTx) super.build();
}
}
}
@@ -48,6 +48,11 @@ public class FitCadenceZone extends RecordData {
return (String) getFieldByNumber(1);
}
@Nullable
public Integer getMessageIndex() {
return (Integer) getFieldByNumber(254);
}
/**
* @noinspection unused
*/
@@ -66,6 +71,11 @@ public class FitCadenceZone extends RecordData {
return this;
}
public Builder setMessageIndex(final Integer value) {
setFieldByNumber(254, value);
return this;
}
@Override
public FitCadenceZone build() {
return (FitCadenceZone) super.build();
@@ -0,0 +1,84 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitChronoShotData extends RecordData {
public FitChronoShotData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 388) {
throw new IllegalArgumentException("FitChronoShotData expects global messages of " + 388 + ", got " + globalNumber);
}
}
@Nullable
public Double getShotSpeed() {
return (Double) getFieldByNumber(0);
}
@Nullable
public Integer getShotNum() {
return (Integer) getFieldByNumber(1);
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(388);
}
public Builder setShotSpeed(final Double value) {
setFieldByNumber(0, value);
return this;
}
public Builder setShotNum(final Integer value) {
setFieldByNumber(1, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitChronoShotData build() {
return (FitChronoShotData) super.build();
}
}
}
@@ -0,0 +1,134 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitChronoShotSession extends RecordData {
public FitChronoShotSession(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 387) {
throw new IllegalArgumentException("FitChronoShotSession expects global messages of " + 387 + ", got " + globalNumber);
}
}
@Nullable
public Double getMinSpeed() {
return (Double) getFieldByNumber(0);
}
@Nullable
public Double getMaxSpeed() {
return (Double) getFieldByNumber(1);
}
@Nullable
public Double getAvgSpeed() {
return (Double) getFieldByNumber(2);
}
@Nullable
public Integer getShotCount() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Integer getProjectileType() {
return (Integer) getFieldByNumber(4);
}
@Nullable
public Double getGrainWeight() {
return (Double) getFieldByNumber(5);
}
@Nullable
public Double getStandardDeviation() {
return (Double) getFieldByNumber(6);
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(387);
}
public Builder setMinSpeed(final Double value) {
setFieldByNumber(0, value);
return this;
}
public Builder setMaxSpeed(final Double value) {
setFieldByNumber(1, value);
return this;
}
public Builder setAvgSpeed(final Double value) {
setFieldByNumber(2, value);
return this;
}
public Builder setShotCount(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setProjectileType(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setGrainWeight(final Double value) {
setFieldByNumber(5, value);
return this;
}
public Builder setStandardDeviation(final Double value) {
setFieldByNumber(6, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitChronoShotSession build() {
return (FitChronoShotSession) super.build();
}
}
}
@@ -0,0 +1,124 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitClimbPro extends RecordData {
public FitClimbPro(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 317) {
throw new IllegalArgumentException("FitClimbPro expects global messages of " + 317 + ", got " + globalNumber);
}
}
@Nullable
public Double getPositionLat() {
return (Double) getFieldByNumber(0);
}
@Nullable
public Double getPositionLong() {
return (Double) getFieldByNumber(1);
}
@Nullable
public Integer getClimbProEvent() {
return (Integer) getFieldByNumber(2);
}
@Nullable
public Integer getClimbNumber() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Integer getClimbCategory() {
return (Integer) getFieldByNumber(4);
}
@Nullable
public Float getCurrentDist() {
return (Float) getFieldByNumber(5);
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(317);
}
public Builder setPositionLat(final Double value) {
setFieldByNumber(0, value);
return this;
}
public Builder setPositionLong(final Double value) {
setFieldByNumber(1, value);
return this;
}
public Builder setClimbProEvent(final Integer value) {
setFieldByNumber(2, value);
return this;
}
public Builder setClimbNumber(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setClimbCategory(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setCurrentDist(final Float value) {
setFieldByNumber(5, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitClimbPro build() {
return (FitClimbPro) super.build();
}
}
}
@@ -0,0 +1,191 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitDiveAlarm extends RecordData {
public FitDiveAlarm(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 262) {
throw new IllegalArgumentException("FitDiveAlarm expects global messages of " + 262 + ", got " + globalNumber);
}
}
@Nullable
public Double getDepth() {
return (Double) getFieldByNumber(0);
}
@Nullable
public Long getTime() {
return (Long) getFieldByNumber(1);
}
@Nullable
public Boolean getEnabled() {
return (Boolean) getFieldByNumber(2);
}
@Nullable
public Integer getAlarmType() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Integer getSound() {
return (Integer) getFieldByNumber(4);
}
@Nullable
public Number[] getDiveTypes() {
final Object[] objectsArray = (Object[]) getFieldByNumber(5);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Long getId() {
return (Long) getFieldByNumber(6);
}
@Nullable
public Boolean getPopupEnabled() {
return (Boolean) getFieldByNumber(7);
}
@Nullable
public Boolean getTriggerOnDescent() {
return (Boolean) getFieldByNumber(8);
}
@Nullable
public Boolean getTriggerOnAscent() {
return (Boolean) getFieldByNumber(9);
}
@Nullable
public Boolean getRepeating() {
return (Boolean) getFieldByNumber(10);
}
@Nullable
public Double getSpeed() {
return (Double) getFieldByNumber(11);
}
@Nullable
public Integer getMessageIndex() {
return (Integer) getFieldByNumber(254);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(262);
}
public Builder setDepth(final Double value) {
setFieldByNumber(0, value);
return this;
}
public Builder setTime(final Long value) {
setFieldByNumber(1, value);
return this;
}
public Builder setEnabled(final Boolean value) {
setFieldByNumber(2, value);
return this;
}
public Builder setAlarmType(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setSound(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setDiveTypes(final Number[] value) {
setFieldByNumber(5, (Object[]) value);
return this;
}
public Builder setId(final Long value) {
setFieldByNumber(6, value);
return this;
}
public Builder setPopupEnabled(final Boolean value) {
setFieldByNumber(7, value);
return this;
}
public Builder setTriggerOnDescent(final Boolean value) {
setFieldByNumber(8, value);
return this;
}
public Builder setTriggerOnAscent(final Boolean value) {
setFieldByNumber(9, value);
return this;
}
public Builder setRepeating(final Boolean value) {
setFieldByNumber(10, value);
return this;
}
public Builder setSpeed(final Double value) {
setFieldByNumber(11, value);
return this;
}
public Builder setMessageIndex(final Integer value) {
setFieldByNumber(254, value);
return this;
}
@Override
public FitDiveAlarm build() {
return (FitDiveAlarm) super.build();
}
}
}
@@ -0,0 +1,191 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitDiveApneaAlarm extends RecordData {
public FitDiveApneaAlarm(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 393) {
throw new IllegalArgumentException("FitDiveApneaAlarm expects global messages of " + 393 + ", got " + globalNumber);
}
}
@Nullable
public Double getDepth() {
return (Double) getFieldByNumber(0);
}
@Nullable
public Long getTime() {
return (Long) getFieldByNumber(1);
}
@Nullable
public Boolean getEnabled() {
return (Boolean) getFieldByNumber(2);
}
@Nullable
public Integer getAlarmType() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Integer getSound() {
return (Integer) getFieldByNumber(4);
}
@Nullable
public Number[] getDiveTypes() {
final Object[] objectsArray = (Object[]) getFieldByNumber(5);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Long getId() {
return (Long) getFieldByNumber(6);
}
@Nullable
public Boolean getPopupEnabled() {
return (Boolean) getFieldByNumber(7);
}
@Nullable
public Boolean getTriggerOnDescent() {
return (Boolean) getFieldByNumber(8);
}
@Nullable
public Boolean getTriggerOnAscent() {
return (Boolean) getFieldByNumber(9);
}
@Nullable
public Boolean getRepeating() {
return (Boolean) getFieldByNumber(10);
}
@Nullable
public Double getSpeed() {
return (Double) getFieldByNumber(11);
}
@Nullable
public Integer getMessageIndex() {
return (Integer) getFieldByNumber(254);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(393);
}
public Builder setDepth(final Double value) {
setFieldByNumber(0, value);
return this;
}
public Builder setTime(final Long value) {
setFieldByNumber(1, value);
return this;
}
public Builder setEnabled(final Boolean value) {
setFieldByNumber(2, value);
return this;
}
public Builder setAlarmType(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setSound(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setDiveTypes(final Number[] value) {
setFieldByNumber(5, (Object[]) value);
return this;
}
public Builder setId(final Long value) {
setFieldByNumber(6, value);
return this;
}
public Builder setPopupEnabled(final Boolean value) {
setFieldByNumber(7, value);
return this;
}
public Builder setTriggerOnDescent(final Boolean value) {
setFieldByNumber(8, value);
return this;
}
public Builder setTriggerOnAscent(final Boolean value) {
setFieldByNumber(9, value);
return this;
}
public Builder setRepeating(final Boolean value) {
setFieldByNumber(10, value);
return this;
}
public Builder setSpeed(final Double value) {
setFieldByNumber(11, value);
return this;
}
public Builder setMessageIndex(final Integer value) {
setFieldByNumber(254, value);
return this;
}
@Override
public FitDiveApneaAlarm build() {
return (FitDiveApneaAlarm) super.build();
}
}
}
@@ -63,6 +63,71 @@ public class FitEvent extends RecordData {
return (Integer) getFieldByNumber(4);
}
@Nullable
public Integer getScore() {
return (Integer) getFieldByNumber(7);
}
@Nullable
public Integer getOpponentScore() {
return (Integer) getFieldByNumber(8);
}
@Nullable
public Integer getFrontGearNum() {
return (Integer) getFieldByNumber(9);
}
@Nullable
public Integer getFrontGear() {
return (Integer) getFieldByNumber(10);
}
@Nullable
public Integer getRearGearNum() {
return (Integer) getFieldByNumber(11);
}
@Nullable
public Integer getRearGear() {
return (Integer) getFieldByNumber(12);
}
@Nullable
public Integer getDeviceIndex() {
return (Integer) getFieldByNumber(13);
}
@Nullable
public Integer getActivityType() {
return (Integer) getFieldByNumber(14);
}
@Nullable
public Long getStartTimestamp() {
return (Long) getFieldByNumber(15);
}
@Nullable
public Integer getRadarThreatLevelMax() {
return (Integer) getFieldByNumber(21);
}
@Nullable
public Integer getRadarThreatCount() {
return (Integer) getFieldByNumber(22);
}
@Nullable
public Float getRadarThreatAvgApproachSpeed() {
return (Float) getFieldByNumber(23);
}
@Nullable
public Float getRadarThreatMaxApproachSpeed() {
return (Float) getFieldByNumber(24);
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
@@ -101,6 +166,71 @@ public class FitEvent extends RecordData {
return this;
}
public Builder setScore(final Integer value) {
setFieldByNumber(7, value);
return this;
}
public Builder setOpponentScore(final Integer value) {
setFieldByNumber(8, value);
return this;
}
public Builder setFrontGearNum(final Integer value) {
setFieldByNumber(9, value);
return this;
}
public Builder setFrontGear(final Integer value) {
setFieldByNumber(10, value);
return this;
}
public Builder setRearGearNum(final Integer value) {
setFieldByNumber(11, value);
return this;
}
public Builder setRearGear(final Integer value) {
setFieldByNumber(12, value);
return this;
}
public Builder setDeviceIndex(final Integer value) {
setFieldByNumber(13, value);
return this;
}
public Builder setActivityType(final Integer value) {
setFieldByNumber(14, value);
return this;
}
public Builder setStartTimestamp(final Long value) {
setFieldByNumber(15, value);
return this;
}
public Builder setRadarThreatLevelMax(final Integer value) {
setFieldByNumber(21, value);
return this;
}
public Builder setRadarThreatCount(final Integer value) {
setFieldByNumber(22, value);
return this;
}
public Builder setRadarThreatAvgApproachSpeed(final Float value) {
setFieldByNumber(23, value);
return this;
}
public Builder setRadarThreatMaxApproachSpeed(final Float value) {
setFieldByNumber(24, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
@@ -100,6 +100,11 @@ public class FitGoals extends RecordData {
return (Source) getFieldByNumber(11);
}
@Nullable
public Integer getMessageIndex() {
return (Integer) getFieldByNumber(254);
}
/**
* @noinspection unused
*/
@@ -168,6 +173,11 @@ public class FitGoals extends RecordData {
return this;
}
public Builder setMessageIndex(final Integer value) {
setFieldByNumber(254, value);
return this;
}
@Override
public FitGoals build() {
return (FitGoals) super.build();
@@ -39,13 +39,55 @@ public class FitGpsMetadata extends RecordData {
}
@Nullable
public Long getEnhancedAltitude() {
return (Long) getFieldByNumber(3);
public Integer getTimestampMs() {
return (Integer) getFieldByNumber(0);
}
@Nullable
public Long getEnhancedSpeed() {
return (Long) getFieldByNumber(4);
public Double getPositionLat() {
return (Double) getFieldByNumber(1);
}
@Nullable
public Double getPositionLong() {
return (Double) getFieldByNumber(2);
}
@Nullable
public Double getEnhancedAltitude() {
return (Double) getFieldByNumber(3);
}
@Nullable
public Double getEnhancedSpeed() {
return (Double) getFieldByNumber(4);
}
@Nullable
public Float getHeading() {
return (Float) getFieldByNumber(5);
}
@Nullable
public Long getUtcTimestamp() {
return (Long) getFieldByNumber(6);
}
@Nullable
public Number[] getVelocity() {
final Object[] objectsArray = (Object[]) getFieldByNumber(7);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
@@ -56,16 +98,51 @@ public class FitGpsMetadata extends RecordData {
super(160);
}
public Builder setEnhancedAltitude(final Long value) {
public Builder setTimestampMs(final Integer value) {
setFieldByNumber(0, value);
return this;
}
public Builder setPositionLat(final Double value) {
setFieldByNumber(1, value);
return this;
}
public Builder setPositionLong(final Double value) {
setFieldByNumber(2, value);
return this;
}
public Builder setEnhancedAltitude(final Double value) {
setFieldByNumber(3, value);
return this;
}
public Builder setEnhancedSpeed(final Long value) {
public Builder setEnhancedSpeed(final Double value) {
setFieldByNumber(4, value);
return this;
}
public Builder setHeading(final Float value) {
setFieldByNumber(5, value);
return this;
}
public Builder setUtcTimestamp(final Long value) {
setFieldByNumber(6, value);
return this;
}
public Builder setVelocity(final Number[] value) {
setFieldByNumber(7, (Object[]) value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitGpsMetadata build() {
return (FitGpsMetadata) super.build();
@@ -39,8 +39,8 @@ public class FitHrmProfile extends RecordData {
}
@Nullable
public Integer getEnabled() {
return (Integer) getFieldByNumber(0);
public Boolean getEnabled() {
return (Boolean) getFieldByNumber(0);
}
@Nullable
@@ -71,7 +71,7 @@ public class FitHrmProfile extends RecordData {
super(4);
}
public Builder setEnabled(final Integer value) {
public Builder setEnabled(final Boolean value) {
setFieldByNumber(0, value);
return this;
}
@@ -0,0 +1,154 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitJump extends RecordData {
public FitJump(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 285) {
throw new IllegalArgumentException("FitJump expects global messages of " + 285 + ", got " + globalNumber);
}
}
@Nullable
public Float getDistance() {
return (Float) getFieldByNumber(0);
}
@Nullable
public Float getHeigh() {
return (Float) getFieldByNumber(1);
}
@Nullable
public Integer getRotations() {
return (Integer) getFieldByNumber(2);
}
@Nullable
public Float getHangTime() {
return (Float) getFieldByNumber(3);
}
@Nullable
public Float getScore() {
return (Float) getFieldByNumber(4);
}
@Nullable
public Double getPositionLat() {
return (Double) getFieldByNumber(5);
}
@Nullable
public Double getPositionLong() {
return (Double) getFieldByNumber(6);
}
@Nullable
public Float getSpeed() {
return (Float) getFieldByNumber(7);
}
@Nullable
public Double getEnhancedSpeed() {
return (Double) getFieldByNumber(8);
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(285);
}
public Builder setDistance(final Float value) {
setFieldByNumber(0, value);
return this;
}
public Builder setHeigh(final Float value) {
setFieldByNumber(1, value);
return this;
}
public Builder setRotations(final Integer value) {
setFieldByNumber(2, value);
return this;
}
public Builder setHangTime(final Float value) {
setFieldByNumber(3, value);
return this;
}
public Builder setScore(final Float value) {
setFieldByNumber(4, value);
return this;
}
public Builder setPositionLat(final Double value) {
setFieldByNumber(5, value);
return this;
}
public Builder setPositionLong(final Double value) {
setFieldByNumber(6, value);
return this;
}
public Builder setSpeed(final Float value) {
setFieldByNumber(7, value);
return this;
}
public Builder setEnhancedSpeed(final Double value) {
setFieldByNumber(8, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitJump build() {
return (FitJump) super.build();
}
}
}
@@ -295,8 +295,56 @@ public class FitLap extends RecordData {
}
@Nullable
public Double getTimeInHrZone() {
return (Double) getFieldByNumber(57);
public Number[] getTimeInHrZone() {
final Object[] objectsArray = (Object[]) getFieldByNumber(57);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getTimeInSpeedZone() {
final Object[] objectsArray = (Object[]) getFieldByNumber(58);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getTimeInCadenceZone() {
final Object[] objectsArray = (Object[]) getFieldByNumber(59);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getTimeInPowerZone() {
final Object[] objectsArray = (Object[]) getFieldByNumber(60);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Integer getRepetitionNum() {
return (Integer) getFieldByNumber(61);
}
@Nullable
@@ -304,6 +352,11 @@ public class FitLap extends RecordData {
return (Float) getFieldByNumber(62);
}
@Nullable
public Integer getMinHeartRate() {
return (Integer) getFieldByNumber(63);
}
@Nullable
public Integer getWktStepIndex() {
return (Integer) getFieldByNumber(71);
@@ -314,6 +367,71 @@ public class FitLap extends RecordData {
return (Integer) getFieldByNumber(73);
}
@Nullable
public Integer getOpponentScore() {
return (Integer) getFieldByNumber(74);
}
@Nullable
public Number[] getStrokeCount() {
final Object[] objectsArray = (Object[]) getFieldByNumber(75);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getZoneCount() {
final Object[] objectsArray = (Object[]) getFieldByNumber(76);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getAvgVerticalOscillation() {
final Object[] objectsArray = (Object[]) getFieldByNumber(77);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getAvgStanceTimePercen() {
final Object[] objectsArray = (Object[]) getFieldByNumber(78);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getAvgStanceTime() {
final Object[] objectsArray = (Object[]) getFieldByNumber(79);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Float getAvgFractionalCadence() {
return (Float) getFieldByNumber(80);
@@ -324,6 +442,123 @@ public class FitLap extends RecordData {
return (Float) getFieldByNumber(81);
}
@Nullable
public Float getTotalFractionalCycles() {
return (Float) getFieldByNumber(82);
}
@Nullable
public Integer getPlayerScore() {
return (Integer) getFieldByNumber(83);
}
@Nullable
public Number[] getAvgTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(84);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMinTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(85);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMaxTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(86);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getAvgSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(87);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMinSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(88);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMaxSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(89);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Float getAvgLeftTorqueEffectiveness() {
return (Float) getFieldByNumber(91);
}
@Nullable
public Float getAvgRightTorqueEffectiveness() {
return (Float) getFieldByNumber(92);
}
@Nullable
public Float getAvgLeftPedalSmoothness() {
return (Float) getFieldByNumber(93);
}
@Nullable
public Float getAvgRightPedalSmoothness() {
return (Float) getFieldByNumber(94);
}
@Nullable
public Float getAvgCombinedPedalSmoothness() {
return (Float) getFieldByNumber(95);
}
@Nullable
public Double getTimeStanding() {
return (Double) getFieldByNumber(98);
}
@Nullable
public Integer getStandCount() {
return (Integer) getFieldByNumber(99);
}
@Nullable
public Integer getAvgLeftPco() {
return (Integer) getFieldByNumber(100);
@@ -384,11 +619,126 @@ public class FitLap extends RecordData {
return (Double) getFieldByNumber(111);
}
@Nullable
public Double getEnhancedAvgAltitude() {
return (Double) getFieldByNumber(112);
}
@Nullable
public Double getEnhancedMinAltitude() {
return (Double) getFieldByNumber(113);
}
@Nullable
public Double getEnhancedMaxAltitude() {
return (Double) getFieldByNumber(114);
}
@Nullable
public Integer getAvgLevMotorPower() {
return (Integer) getFieldByNumber(115);
}
@Nullable
public Integer getMaxLevMotorPower() {
return (Integer) getFieldByNumber(116);
}
@Nullable
public Float getLevBatteryConsumption() {
return (Float) getFieldByNumber(117);
}
@Nullable
public Float getAvgVerticalRatio() {
return (Float) getFieldByNumber(118);
}
@Nullable
public Float getAvgStanceTimeBalance() {
return (Float) getFieldByNumber(119);
}
@Nullable
public Float getAvgStepLength() {
return (Float) getFieldByNumber(120);
}
@Nullable
public Float getAvgVam() {
return (Float) getFieldByNumber(121);
}
@Nullable
public Double getAvgDepth() {
return (Double) getFieldByNumber(122);
}
@Nullable
public Double getMaxDepth() {
return (Double) getFieldByNumber(123);
}
@Nullable
public Integer getMinTemperature() {
return (Integer) getFieldByNumber(124);
}
@Nullable
public Float getEnhancedAvgRespirationRate() {
return (Float) getFieldByNumber(136);
}
@Nullable
public Float getEnhancedMaxRespirationRate() {
return (Float) getFieldByNumber(137);
}
@Nullable
public Integer getAvgRespirationRate() {
return (Integer) getFieldByNumber(147);
}
@Nullable
public Integer getMaxRespirationRate() {
return (Integer) getFieldByNumber(148);
}
@Nullable
public Float getTotalGrit() {
return (Float) getFieldByNumber(149);
}
@Nullable
public Float getTotalFlow() {
return (Float) getFieldByNumber(150);
}
@Nullable
public Integer getJumpCount() {
return (Integer) getFieldByNumber(151);
}
@Nullable
public Float getAvgGrit() {
return (Float) getFieldByNumber(153);
}
@Nullable
public Float getAvgFlow() {
return (Float) getFieldByNumber(154);
}
@Nullable
public Float getTotalFractionalAscent() {
return (Float) getFieldByNumber(156);
}
@Nullable
public Float getTotalFractionalDescent() {
return (Float) getFieldByNumber(157);
}
@Nullable
public Float getAvgCoreTemperature() {
return (Float) getFieldByNumber(158);
@@ -677,8 +1027,28 @@ public class FitLap extends RecordData {
return this;
}
public Builder setTimeInHrZone(final Double value) {
setFieldByNumber(57, value);
public Builder setTimeInHrZone(final Number[] value) {
setFieldByNumber(57, (Object[]) value);
return this;
}
public Builder setTimeInSpeedZone(final Number[] value) {
setFieldByNumber(58, (Object[]) value);
return this;
}
public Builder setTimeInCadenceZone(final Number[] value) {
setFieldByNumber(59, (Object[]) value);
return this;
}
public Builder setTimeInPowerZone(final Number[] value) {
setFieldByNumber(60, (Object[]) value);
return this;
}
public Builder setRepetitionNum(final Integer value) {
setFieldByNumber(61, value);
return this;
}
@@ -687,6 +1057,11 @@ public class FitLap extends RecordData {
return this;
}
public Builder setMinHeartRate(final Integer value) {
setFieldByNumber(63, value);
return this;
}
public Builder setWktStepIndex(final Integer value) {
setFieldByNumber(71, value);
return this;
@@ -697,6 +1072,36 @@ public class FitLap extends RecordData {
return this;
}
public Builder setOpponentScore(final Integer value) {
setFieldByNumber(74, value);
return this;
}
public Builder setStrokeCount(final Number[] value) {
setFieldByNumber(75, (Object[]) value);
return this;
}
public Builder setZoneCount(final Number[] value) {
setFieldByNumber(76, (Object[]) value);
return this;
}
public Builder setAvgVerticalOscillation(final Number[] value) {
setFieldByNumber(77, (Object[]) value);
return this;
}
public Builder setAvgStanceTimePercen(final Number[] value) {
setFieldByNumber(78, (Object[]) value);
return this;
}
public Builder setAvgStanceTime(final Number[] value) {
setFieldByNumber(79, (Object[]) value);
return this;
}
public Builder setAvgFractionalCadence(final Float value) {
setFieldByNumber(80, value);
return this;
@@ -707,6 +1112,81 @@ public class FitLap extends RecordData {
return this;
}
public Builder setTotalFractionalCycles(final Float value) {
setFieldByNumber(82, value);
return this;
}
public Builder setPlayerScore(final Integer value) {
setFieldByNumber(83, value);
return this;
}
public Builder setAvgTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(84, (Object[]) value);
return this;
}
public Builder setMinTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(85, (Object[]) value);
return this;
}
public Builder setMaxTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(86, (Object[]) value);
return this;
}
public Builder setAvgSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(87, (Object[]) value);
return this;
}
public Builder setMinSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(88, (Object[]) value);
return this;
}
public Builder setMaxSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(89, (Object[]) value);
return this;
}
public Builder setAvgLeftTorqueEffectiveness(final Float value) {
setFieldByNumber(91, value);
return this;
}
public Builder setAvgRightTorqueEffectiveness(final Float value) {
setFieldByNumber(92, value);
return this;
}
public Builder setAvgLeftPedalSmoothness(final Float value) {
setFieldByNumber(93, value);
return this;
}
public Builder setAvgRightPedalSmoothness(final Float value) {
setFieldByNumber(94, value);
return this;
}
public Builder setAvgCombinedPedalSmoothness(final Float value) {
setFieldByNumber(95, value);
return this;
}
public Builder setTimeStanding(final Double value) {
setFieldByNumber(98, value);
return this;
}
public Builder setStandCount(final Integer value) {
setFieldByNumber(99, value);
return this;
}
public Builder setAvgLeftPco(final Integer value) {
setFieldByNumber(100, value);
return this;
@@ -767,11 +1247,126 @@ public class FitLap extends RecordData {
return this;
}
public Builder setEnhancedAvgAltitude(final Double value) {
setFieldByNumber(112, value);
return this;
}
public Builder setEnhancedMinAltitude(final Double value) {
setFieldByNumber(113, value);
return this;
}
public Builder setEnhancedMaxAltitude(final Double value) {
setFieldByNumber(114, value);
return this;
}
public Builder setAvgLevMotorPower(final Integer value) {
setFieldByNumber(115, value);
return this;
}
public Builder setMaxLevMotorPower(final Integer value) {
setFieldByNumber(116, value);
return this;
}
public Builder setLevBatteryConsumption(final Float value) {
setFieldByNumber(117, value);
return this;
}
public Builder setAvgVerticalRatio(final Float value) {
setFieldByNumber(118, value);
return this;
}
public Builder setAvgStanceTimeBalance(final Float value) {
setFieldByNumber(119, value);
return this;
}
public Builder setAvgStepLength(final Float value) {
setFieldByNumber(120, value);
return this;
}
public Builder setAvgVam(final Float value) {
setFieldByNumber(121, value);
return this;
}
public Builder setAvgDepth(final Double value) {
setFieldByNumber(122, value);
return this;
}
public Builder setMaxDepth(final Double value) {
setFieldByNumber(123, value);
return this;
}
public Builder setMinTemperature(final Integer value) {
setFieldByNumber(124, value);
return this;
}
public Builder setEnhancedAvgRespirationRate(final Float value) {
setFieldByNumber(136, value);
return this;
}
public Builder setEnhancedMaxRespirationRate(final Float value) {
setFieldByNumber(137, value);
return this;
}
public Builder setAvgRespirationRate(final Integer value) {
setFieldByNumber(147, value);
return this;
}
public Builder setMaxRespirationRate(final Integer value) {
setFieldByNumber(148, value);
return this;
}
public Builder setTotalGrit(final Float value) {
setFieldByNumber(149, value);
return this;
}
public Builder setTotalFlow(final Float value) {
setFieldByNumber(150, value);
return this;
}
public Builder setJumpCount(final Integer value) {
setFieldByNumber(151, value);
return this;
}
public Builder setAvgGrit(final Float value) {
setFieldByNumber(153, value);
return this;
}
public Builder setAvgFlow(final Float value) {
setFieldByNumber(154, value);
return this;
}
public Builder setTotalFractionalAscent(final Float value) {
setFieldByNumber(156, value);
return this;
}
public Builder setTotalFractionalDescent(final Float value) {
setFieldByNumber(157, value);
return this;
}
public Builder setAvgCoreTemperature(final Float value) {
setFieldByNumber(158, value);
return this;
@@ -38,6 +38,18 @@ public class FitMemoGlob extends RecordData {
}
}
@Nullable
public Number[] getMemo() {
final Object[] objectsArray = (Object[]) getFieldByNumber(0);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Integer getMesgNum() {
return (Integer) getFieldByNumber(1);
@@ -71,6 +83,11 @@ public class FitMemoGlob extends RecordData {
super(145);
}
public Builder setMemo(final Number[] value) {
setFieldByNumber(0, (Object[]) value);
return this;
}
public Builder setMesgNum(final Integer value) {
setFieldByNumber(1, value);
return this;
@@ -97,8 +97,8 @@ public class FitMonitoring extends RecordData {
}
@Nullable
public Integer getLocalTimestamp() {
return (Integer) getFieldByNumber(11);
public Long getLocalTimestamp() {
return (Long) getFieldByNumber(11);
}
@Nullable
@@ -249,7 +249,7 @@ public class FitMonitoring extends RecordData {
return this;
}
public Builder setLocalTimestamp(final Integer value) {
public Builder setLocalTimestamp(final Long value) {
setFieldByNumber(11, value);
return this;
}
@@ -184,6 +184,36 @@ public class FitRecord extends RecordData {
return (Integer) getFieldByNumber(42);
}
@Nullable
public Float getLeftTorqueEffectiveness() {
return (Float) getFieldByNumber(43);
}
@Nullable
public Float getRightTorqueEffectiveness() {
return (Float) getFieldByNumber(44);
}
@Nullable
public Float getLeftPedalSmoothness() {
return (Float) getFieldByNumber(45);
}
@Nullable
public Float getRightPedalSmoothness() {
return (Float) getFieldByNumber(46);
}
@Nullable
public Float getCombinedPedalSmoothness() {
return (Float) getFieldByNumber(47);
}
@Nullable
public Float getTime128() {
return (Float) getFieldByNumber(48);
}
@Nullable
public Integer getStrokeType() {
return (Integer) getFieldByNumber(49);
@@ -209,11 +239,141 @@ public class FitRecord extends RecordData {
return (Float) getFieldByNumber(53);
}
@Nullable
public Number[] getAvgTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(54);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMinTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(55);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMaxTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(56);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getAvgSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(57);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMinSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(58);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMaxSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(59);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Integer getDeviceIndex() {
return (Integer) getFieldByNumber(62);
}
@Nullable
public Integer getLeftPco() {
return (Integer) getFieldByNumber(67);
}
@Nullable
public Integer getRightPco() {
return (Integer) getFieldByNumber(68);
}
@Nullable
public Number[] getLeftPowerPhase() {
final Object[] objectsArray = (Object[]) getFieldByNumber(69);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getLeftPowerPhasePeak() {
final Object[] objectsArray = (Object[]) getFieldByNumber(70);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getRightPowerPhase() {
final Object[] objectsArray = (Object[]) getFieldByNumber(71);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getRightPowerPhasePeak() {
final Object[] objectsArray = (Object[]) getFieldByNumber(72);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Double getEnhancedSpeed() {
return (Double) getFieldByNumber(73);
@@ -319,6 +479,26 @@ public class FitRecord extends RecordData {
return (Float) getFieldByNumber(116);
}
@Nullable
public Integer getEbikeTravelRang() {
return (Integer) getFieldByNumber(117);
}
@Nullable
public Integer getEbikeBatteryLevel() {
return (Integer) getFieldByNumber(118);
}
@Nullable
public Integer getEbikeAssistMode() {
return (Integer) getFieldByNumber(119);
}
@Nullable
public Integer getEbikeAssistLevelPercent() {
return (Integer) getFieldByNumber(120);
}
@Nullable
public Long getAirTimeRemaining() {
return (Long) getFieldByNumber(123);
@@ -512,6 +692,36 @@ public class FitRecord extends RecordData {
return this;
}
public Builder setLeftTorqueEffectiveness(final Float value) {
setFieldByNumber(43, value);
return this;
}
public Builder setRightTorqueEffectiveness(final Float value) {
setFieldByNumber(44, value);
return this;
}
public Builder setLeftPedalSmoothness(final Float value) {
setFieldByNumber(45, value);
return this;
}
public Builder setRightPedalSmoothness(final Float value) {
setFieldByNumber(46, value);
return this;
}
public Builder setCombinedPedalSmoothness(final Float value) {
setFieldByNumber(47, value);
return this;
}
public Builder setTime128(final Float value) {
setFieldByNumber(48, value);
return this;
}
public Builder setStrokeType(final Integer value) {
setFieldByNumber(49, value);
return this;
@@ -537,11 +747,71 @@ public class FitRecord extends RecordData {
return this;
}
public Builder setAvgTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(54, (Object[]) value);
return this;
}
public Builder setMinTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(55, (Object[]) value);
return this;
}
public Builder setMaxTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(56, (Object[]) value);
return this;
}
public Builder setAvgSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(57, (Object[]) value);
return this;
}
public Builder setMinSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(58, (Object[]) value);
return this;
}
public Builder setMaxSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(59, (Object[]) value);
return this;
}
public Builder setDeviceIndex(final Integer value) {
setFieldByNumber(62, value);
return this;
}
public Builder setLeftPco(final Integer value) {
setFieldByNumber(67, value);
return this;
}
public Builder setRightPco(final Integer value) {
setFieldByNumber(68, value);
return this;
}
public Builder setLeftPowerPhase(final Number[] value) {
setFieldByNumber(69, (Object[]) value);
return this;
}
public Builder setLeftPowerPhasePeak(final Number[] value) {
setFieldByNumber(70, (Object[]) value);
return this;
}
public Builder setRightPowerPhase(final Number[] value) {
setFieldByNumber(71, (Object[]) value);
return this;
}
public Builder setRightPowerPhasePeak(final Number[] value) {
setFieldByNumber(72, (Object[]) value);
return this;
}
public Builder setEnhancedSpeed(final Double value) {
setFieldByNumber(73, value);
return this;
@@ -647,6 +917,26 @@ public class FitRecord extends RecordData {
return this;
}
public Builder setEbikeTravelRang(final Integer value) {
setFieldByNumber(117, value);
return this;
}
public Builder setEbikeBatteryLevel(final Integer value) {
setFieldByNumber(118, value);
return this;
}
public Builder setEbikeAssistMode(final Integer value) {
setFieldByNumber(119, value);
return this;
}
public Builder setEbikeAssistLevelPercent(final Integer value) {
setFieldByNumber(120, value);
return this;
}
public Builder setAirTimeRemaining(final Long value) {
setFieldByNumber(123, value);
return this;
@@ -37,6 +37,7 @@ public class FitRecordDataFactory {
case 23 -> new FitDeviceInfo(recordDefinition, recordHeader);
case 26 -> new FitWorkout(recordDefinition, recordHeader);
case 27 -> new FitWorkoutStep(recordDefinition, recordHeader);
case 28 -> new FitSchedule(recordDefinition, recordHeader);
case 29 -> new FitLocation(recordDefinition, recordHeader);
case 30 -> new FitWeightScale(recordDefinition, recordHeader);
case 31 -> new FitCourse(recordDefinition, recordHeader);
@@ -55,6 +56,9 @@ public class FitRecordDataFactory {
case 72 -> new FitTrainingFile(recordDefinition, recordHeader);
case 78 -> new FitHrv(recordDefinition, recordHeader);
case 79 -> new FitUserMetrics(recordDefinition, recordHeader);
case 80 -> new FitAntRx(recordDefinition, recordHeader);
case 81 -> new FitAntTx(recordDefinition, recordHeader);
case 82 -> new FitAntChannelId(recordDefinition, recordHeader);
case 101 -> new FitLength(recordDefinition, recordHeader);
case 103 -> new FitMonitoringInfo(recordDefinition, recordHeader);
case 104 -> new FitDeviceStatus(recordDefinition, recordHeader);
@@ -62,6 +66,7 @@ public class FitRecordDataFactory {
case 106 -> new FitSlaveDevice(recordDefinition, recordHeader);
case 127 -> new FitConnectivity(recordDefinition, recordHeader);
case 128 -> new FitWeather(recordDefinition, recordHeader);
case 129 -> new FitWeatherAlert(recordDefinition, recordHeader);
case 131 -> new FitCadenceZone(recordDefinition, recordHeader);
case 132 -> new FitHr(recordDefinition, recordHeader);
case 140 -> new FitPhysiologicalMetrics(recordDefinition, recordHeader);
@@ -89,12 +94,14 @@ public class FitRecordDataFactory {
case 229 -> new FitMaxMetData(recordDefinition, recordHeader);
case 258 -> new FitDiveSettings(recordDefinition, recordHeader);
case 259 -> new FitDiveGas(recordDefinition, recordHeader);
case 262 -> new FitDiveAlarm(recordDefinition, recordHeader);
case 264 -> new FitExerciseTitle(recordDefinition, recordHeader);
case 268 -> new FitDiveSummary(recordDefinition, recordHeader);
case 269 -> new FitSpo2(recordDefinition, recordHeader);
case 273 -> new FitSleepDataInfo(recordDefinition, recordHeader);
case 274 -> new FitSleepDataRaw(recordDefinition, recordHeader);
case 275 -> new FitSleepStage(recordDefinition, recordHeader);
case 285 -> new FitJump(recordDefinition, recordHeader);
case 290 -> new FitBeatIntervals(recordDefinition, recordHeader);
case 297 -> new FitRespirationRate(recordDefinition, recordHeader);
case 304 -> new FitHsaStepData(recordDefinition, recordHeader);
@@ -106,6 +113,7 @@ public class FitRecordDataFactory {
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 323 -> new FitTankSummary(recordDefinition, recordHeader);
case 326 -> new FitGpsEvent(recordDefinition, recordHeader);
@@ -118,7 +126,10 @@ public class FitRecordDataFactory {
case 375 -> new FitDeviceAuxBatteryInfo(recordDefinition, recordHeader);
case 378 -> new FitTrainingLoad(recordDefinition, recordHeader);
case 379 -> new FitSleepSchedule(recordDefinition, recordHeader);
case 387 -> new FitChronoShotSession(recordDefinition, recordHeader);
case 388 -> new FitChronoShotData(recordDefinition, recordHeader);
case 389 -> new FitHsaConfigurationData(recordDefinition, recordHeader);
case 393 -> new FitDiveApneaAlarm(recordDefinition, recordHeader);
case 394 -> new FitCpeStatus(recordDefinition, recordHeader);
case 397 -> new FitSkinTempRaw(recordDefinition, recordHeader);
case 398 -> new FitSkinTempOvernight(recordDefinition, recordHeader);
@@ -0,0 +1,124 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitSchedule extends RecordData {
public FitSchedule(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 28) {
throw new IllegalArgumentException("FitSchedule expects global messages of " + 28 + ", got " + globalNumber);
}
}
@Nullable
public Integer getManufacturer() {
return (Integer) getFieldByNumber(0);
}
@Nullable
public Integer getProduct() {
return (Integer) getFieldByNumber(1);
}
@Nullable
public Long getSerialNumber() {
return (Long) getFieldByNumber(2);
}
@Nullable
public Long getTimeCreated() {
return (Long) getFieldByNumber(3);
}
@Nullable
public Boolean getCompleted() {
return (Boolean) getFieldByNumber(4);
}
@Nullable
public Integer getType() {
return (Integer) getFieldByNumber(5);
}
@Nullable
public Long getScheduledTime() {
return (Long) getFieldByNumber(6);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(28);
}
public Builder setManufacturer(final Integer value) {
setFieldByNumber(0, value);
return this;
}
public Builder setProduct(final Integer value) {
setFieldByNumber(1, value);
return this;
}
public Builder setSerialNumber(final Long value) {
setFieldByNumber(2, value);
return this;
}
public Builder setTimeCreated(final Long value) {
setFieldByNumber(3, value);
return this;
}
public Builder setCompleted(final Boolean value) {
setFieldByNumber(4, value);
return this;
}
public Builder setType(final Integer value) {
setFieldByNumber(5, value);
return this;
}
public Builder setScheduledTime(final Long value) {
setFieldByNumber(6, value);
return this;
}
@Override
public FitSchedule build() {
return (FitSchedule) super.build();
}
}
}
@@ -39,8 +39,8 @@ public class FitSdmProfile extends RecordData {
}
@Nullable
public Integer getEnabled() {
return (Integer) getFieldByNumber(0);
public Boolean getEnabled() {
return (Boolean) getFieldByNumber(0);
}
@Nullable
@@ -86,7 +86,7 @@ public class FitSdmProfile extends RecordData {
super(5);
}
public Builder setEnabled(final Integer value) {
public Builder setEnabled(final Boolean value) {
setFieldByNumber(0, value);
return this;
}
@@ -53,6 +53,11 @@ public class FitSegmentPoint extends RecordData {
return (Double) getFieldByNumber(3);
}
@Nullable
public Float getAltitude() {
return (Float) getFieldByNumber(4);
}
@Nullable
public Number[] getLeaderTime() {
final Object[] objectsArray = (Object[]) getFieldByNumber(5);
@@ -98,6 +103,11 @@ public class FitSegmentPoint extends RecordData {
return this;
}
public Builder setAltitude(final Float value) {
setFieldByNumber(4, value);
return this;
}
public Builder setLeaderTime(final Number[] value) {
setFieldByNumber(5, (Object[]) value);
return this;
@@ -463,6 +463,78 @@ public class FitSession extends RecordData {
return (Float) getFieldByNumber(94);
}
@Nullable
public Number[] getAvgTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(95);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMinTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(96);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMaxTotalHemoglobinConc() {
final Object[] objectsArray = (Object[]) getFieldByNumber(97);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getAvgSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(98);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMinSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(99);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Number[] getMaxSaturatedHemoglobinPercent() {
final Object[] objectsArray = (Object[]) getFieldByNumber(100);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Float getAvgLeftTorqueEffectiveness() {
return (Float) getFieldByNumber(101);
@@ -634,6 +706,36 @@ public class FitSession extends RecordData {
return (Double) getFieldByNumber(125);
}
@Nullable
public Double getEnhancedAvgAltitude() {
return (Double) getFieldByNumber(126);
}
@Nullable
public Double getEnhancedMinAltitude() {
return (Double) getFieldByNumber(127);
}
@Nullable
public Double getEnhancedMaxAltitude() {
return (Double) getFieldByNumber(128);
}
@Nullable
public Integer getAvgLevMotorPower() {
return (Integer) getFieldByNumber(129);
}
@Nullable
public Integer getMaxLevMotorPower() {
return (Integer) getFieldByNumber(130);
}
@Nullable
public Float getLevBatteryConsumption() {
return (Float) getFieldByNumber(131);
}
@Nullable
public Float getAvgVerticalRatio() {
return (Float) getFieldByNumber(132);
@@ -654,6 +756,11 @@ public class FitSession extends RecordData {
return (Float) getFieldByNumber(137);
}
@Nullable
public Float getAvgVam() {
return (Float) getFieldByNumber(139);
}
@Nullable
public Double getAvgDepth() {
return (Double) getFieldByNumber(140);
@@ -1302,6 +1409,36 @@ public class FitSession extends RecordData {
return this;
}
public Builder setAvgTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(95, (Object[]) value);
return this;
}
public Builder setMinTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(96, (Object[]) value);
return this;
}
public Builder setMaxTotalHemoglobinConc(final Number[] value) {
setFieldByNumber(97, (Object[]) value);
return this;
}
public Builder setAvgSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(98, (Object[]) value);
return this;
}
public Builder setMinSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(99, (Object[]) value);
return this;
}
public Builder setMaxSaturatedHemoglobinPercent(final Number[] value) {
setFieldByNumber(100, (Object[]) value);
return this;
}
public Builder setAvgLeftTorqueEffectiveness(final Float value) {
setFieldByNumber(101, value);
return this;
@@ -1417,6 +1554,36 @@ public class FitSession extends RecordData {
return this;
}
public Builder setEnhancedAvgAltitude(final Double value) {
setFieldByNumber(126, value);
return this;
}
public Builder setEnhancedMinAltitude(final Double value) {
setFieldByNumber(127, value);
return this;
}
public Builder setEnhancedMaxAltitude(final Double value) {
setFieldByNumber(128, value);
return this;
}
public Builder setAvgLevMotorPower(final Integer value) {
setFieldByNumber(129, value);
return this;
}
public Builder setMaxLevMotorPower(final Integer value) {
setFieldByNumber(130, value);
return this;
}
public Builder setLevBatteryConsumption(final Float value) {
setFieldByNumber(131, value);
return this;
}
public Builder setAvgVerticalRatio(final Float value) {
setFieldByNumber(132, value);
return this;
@@ -1437,6 +1604,11 @@ public class FitSession extends RecordData {
return this;
}
public Builder setAvgVam(final Float value) {
setFieldByNumber(139, value);
return this;
}
public Builder setAvgDepth(final Double value) {
setFieldByNumber(140, value);
return this;
@@ -76,11 +76,33 @@ public class FitSet extends RecordData {
return ret;
}
@Nullable
public Number[] getCategorySubtype() {
final Object[] objectsArray = (Object[]) getFieldByNumber(8);
if (objectsArray == null)
return null;
final Number[] ret = new Number[objectsArray.length];
for (int i = 0; i < objectsArray.length; i++) {
ret[i] = (Number) objectsArray[i];
}
return ret;
}
@Nullable
public Integer getWeightDisplayUnit() {
return (Integer) getFieldByNumber(9);
}
@Nullable
public Integer getMessageIndex() {
return (Integer) getFieldByNumber(10);
}
@Nullable
public Integer getWktStepIndex() {
return (Integer) getFieldByNumber(11);
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(254);
@@ -124,11 +146,26 @@ public class FitSet extends RecordData {
return this;
}
public Builder setCategorySubtype(final Number[] value) {
setFieldByNumber(8, (Object[]) value);
return this;
}
public Builder setWeightDisplayUnit(final Integer value) {
setFieldByNumber(9, value);
return this;
}
public Builder setMessageIndex(final Integer value) {
setFieldByNumber(10, value);
return this;
}
public Builder setWktStepIndex(final Integer value) {
setFieldByNumber(11, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(254, value);
return this;
@@ -125,7 +125,7 @@ public class FitSplit extends RecordData {
@Nullable
public Double getTotalMovingTime() {
return (Double) getFieldByNumber(101);
return (Double) getFieldByNumber(110);
}
@Nullable
@@ -227,7 +227,7 @@ public class FitSplit extends RecordData {
}
public Builder setTotalMovingTime(final Double value) {
setFieldByNumber(101, value);
setFieldByNumber(110, value);
return this;
}
@@ -0,0 +1,114 @@
/* Copyright (C) 2025 Freeyourgadget
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader;
/**
* WARNING: This class was auto-generated, please avoid modifying it directly.
* See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen}
* @noinspection unused
*/
public class FitWeatherAlert extends RecordData {
public FitWeatherAlert(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
super(recordDefinition, recordHeader);
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
if (globalNumber != 129) {
throw new IllegalArgumentException("FitWeatherAlert expects global messages of " + 129 + ", got " + globalNumber);
}
}
@Nullable
public String getReportId() {
return (String) getFieldByNumber(0);
}
@Nullable
public Long getIssueTime() {
return (Long) getFieldByNumber(1);
}
@Nullable
public Long getExpireTime() {
return (Long) getFieldByNumber(2);
}
@Nullable
public Integer getSeverity() {
return (Integer) getFieldByNumber(3);
}
@Nullable
public Integer getType() {
return (Integer) getFieldByNumber(4);
}
@Nullable
public Long getTimestamp() {
return (Long) getFieldByNumber(253);
}
/**
* @noinspection unused
*/
public static class Builder extends FitRecordDataBuilder {
public Builder() {
super(129);
}
public Builder setReportId(final String value) {
setFieldByNumber(0, value);
return this;
}
public Builder setIssueTime(final Long value) {
setFieldByNumber(1, value);
return this;
}
public Builder setExpireTime(final Long value) {
setFieldByNumber(2, value);
return this;
}
public Builder setSeverity(final Integer value) {
setFieldByNumber(3, value);
return this;
}
public Builder setType(final Integer value) {
setFieldByNumber(4, value);
return this;
}
public Builder setTimestamp(final Long value) {
setFieldByNumber(253, value);
return this;
}
@Override
public FitWeatherAlert build() {
return (FitWeatherAlert) super.build();
}
}
}
@@ -78,6 +78,11 @@ public class FitWorkout extends RecordData {
return (String) getFieldByNumber(17);
}
@Nullable
public Integer getMessageIndex() {
return (Integer) getFieldByNumber(254);
}
/**
* @noinspection unused
*/
@@ -126,6 +131,11 @@ public class FitWorkout extends RecordData {
return this;
}
public Builder setMessageIndex(final Integer value) {
setFieldByNumber(254, value);
return this;
}
@Override
public FitWorkout build() {
return (FitWorkout) super.build();
@@ -1,5 +1,8 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import org.junit.Assert;
import org.junit.Test;
@@ -7,6 +10,7 @@ import java.math.BigInteger;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FieldDefinition;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitFile;
@@ -336,7 +340,7 @@ public class GarminSupportTest extends TestBase {
"FitFileId{type=SETTINGS, manufacturer=1, product=1561, serial_number=3889965805}, FitFileCreator{software_version=340}, " +
"FitDeviceSettings{active_time_zone=0, utc_offset=0, time_offset=0, unknown_3(ENUM/1)=0, time_mode=0, time_zone_offset=0, unknown_10(ENUM/1)=3, unknown_11(ENUM/1)=0, backlight_mode=2, unknown_13(UINT8/1)=0, unknown_14(UINT8/1)=0, unknown_15(UINT8/1)=50, unknown_21(ENUM/1)=1, unknown_22(ENUM/1)=0, unknown_26(ENUM/1)=254, unknown_27(ENUM/1)=0, unknown_29(ENUM/1)=0, unknown_52(ENUM/1)=0, unknown_53(ENUM/1)=1}, " +
"FitUserProfile{friendly_name=edge510, gender=1, age=41, height=183, weight=78.0, language=english, elev_setting=metric, weight_setting=metric, resting_heart_rate=60, default_max_biking_heart_rate=185, default_max_heart_rate=185, hr_setting=1, speed_setting=metric, dist_setting=metric, power_setting=1, activity_class=168, position_setting=2, temperature_setting=metric}, " +
"FitHrmProfile{enabled=1, hrm_ant_id=50008, hrm_ant_id_trans_type=1, message_index=0}, " +
"FitHrmProfile{enabled=true, hrm_ant_id=50008, hrm_ant_id_trans_type=1, message_index=0}, " +
"FitBikeProfile{name=EVO, odometer=457191.72, bike_power_ant_id=47617, custom_wheelsize=2.096, auto_wheelsize=0.0, bike_weight=8.0, power_cal_factor=50.0, auto_wheel_cal=true, auto_power_zero=true, id=0, spd_enabled=false, cad_enabled=false, spdcad_enabled=false, power_enabled=true, crank_length=227.0, enabled=true, bike_power_ant_id_trans_type=5, unknown_35(UINT8/3)=[0,50,], unknown_36(ENUM/1)=4, front_gear_num=2, front_gear=[39,53,,], rear_gear_num=11, rear_gear=[23,21,19,18,17,16,15,14,13,12,11,], shimano_di2_enabled=false, message_index=0}, " +
"FitBikeProfile{name=P2SL, odometer=0.0, bike_power_ant_id=28209, custom_wheelsize=2.096, auto_wheelsize=0.0, bike_weight=9.0, power_cal_factor=50.0, auto_wheel_cal=true, auto_power_zero=true, id=0, spd_enabled=false, cad_enabled=false, spdcad_enabled=false, power_enabled=true, crank_length=227.0, enabled=true, bike_power_ant_id_trans_type=5, unknown_35(UINT8/3)=[0,118,190], unknown_36(ENUM/1)=4, front_gear_num=2, front_gear=[39,53,,], rear_gear_num=11, rear_gear=[23,21,19,18,17,16,15,14,13,12,11,], shimano_di2_enabled=false, message_index=1}, " +
"FitBikeProfile{name=LANGSTER, odometer=12318.91, bike_power_ant_id=10851, custom_wheelsize=2.096, auto_wheelsize=0.0, bike_weight=9.5, power_cal_factor=50.0, auto_wheel_cal=true, auto_power_zero=true, id=0, spd_enabled=false, cad_enabled=false, spdcad_enabled=false, power_enabled=true, crank_length=100.0, enabled=true, bike_power_ant_id_trans_type=5, unknown_35(UINT8/3)=[0,50,], unknown_36(ENUM/1)=4, front_gear_num=2, front_gear=[39,53,,], rear_gear_num=11, rear_gear=[23,21,19,18,17,16,15,14,13,12,11,], shimano_di2_enabled=false, message_index=2}, " +
@@ -371,4 +375,742 @@ public class GarminSupportTest extends TestBase {
FitFile fitFile = FitFile.parseIncoming(fileContents);
Assert.assertEquals(expectedOutput, fitFile.toString());
}
}
@Test
public void TestFitMessageTypeParsing() throws FitParseException {
byte[] fileContents = GB.hexStringToByteArray(
"0E20B352F21B00002E464954" +
"AB6240000000000700010001" +
"028402028403048C04048605" +
"0284080D070004FF00FEFF01" +
"0000007F4533432A00476164" +
"676574427269646765004000" +
"0001000215048C17048C0001" +
"000000010000004000000200" +
"130001020104860C01002401" +
"002704862E01002F01003701" +
"003801003A02843B02845001" +
"005601005901005A04865E01" +
"025F0100860100AE01000001" +
"0100000001017F4533430101" +
"010101000100010101010000" +
"000101010140000003001CFE" +
"028400020701010002010203" +
"010204028405010006010007" +
"01000801020901020A01020B" +
"01020C01000D01000E010010" +
"010011010012010015010016" +
"02841C04861D04861E01001F" +
"02842002842F010031048600" +
"010061000101640A00010101" +
"01010101010101017F010101" +
"00010000000100000001E803" +
"E80301010000004000000400" +
"05FE028400010001028B0201" +
"0003010A0001000101000101" +
"400000050008FE0284000100" +
"01028B020284030486040100" +
"05010A070102000100010100" +
"0A0064000000010101400000" +
"06001E28010A2C0100FE0284" +
"000207010100020100030486" +
"04028B05028B06028B07028B" +
"0802840902840A02840B0284" +
"0C01000D01000E01020F0100" +
"100100110100120100130102" +
"14010015010A16010A17010A" +
"18010A25010226010A000101" +
"010061000101640000000100" +
"010001000100E803E8030A00" +
"0A0001010101010101FF0101" +
"010101010140000007000501" +
"010202010203028405010007" +
"010000010101000101400000" +
"080003FE0284010102020207" +
"000100016100400000090003" +
"FE0284010284020207000100" +
"010061004000000A0004FE02" +
"840101020202840301020001" +
"00010A000A4000000C000300" +
"010001010003020700010161" +
"004000000D00041F04862002" +
"842104869904860064000000" +
"E8030100000040420F004000" +
"000F000DFE02840001000101" +
"000204860304860401000504" +
"860601000704860801000902" +
"840A01000B01000001000101" +
"7F4533437F45334301010000" +
"000101000000010100010140" +
"0000120088BA0488BB0488C0" +
"0102C10102C20102C30102C5" +
"0102C60102C70102C80102D0" +
"0284D10284D202847D04867E" +
"04867F048680048681028482" +
"028483010284028485028486" +
"02848901028B02848C04868D" +
"04868E04868F010290010291" +
"028492028493010294010295" +
"01029601019B02849C0486A8" +
"0485A90284AA0284B40284B5" +
"0488B60488B7028465010266" +
"01026701026801026901026E" +
"02076F010270048671028472" +
"01017301017C04863B04863C" +
"02833D02833E02833F028340" +
"010245048646028447028452" +
"028453028454020757028458" +
"02845902845A02845B02845C" +
"01025D01025E01021A02841B" +
"01021C01001D04851E04851F" +
"048520048521028422028423" +
"028424028425028426048527" +
"04852904862A02842B01002C" +
"02842D02842E01002F028430" +
"048631028432028433010234" +
"028335028336028337028338" +
"02833901013A0101FE0284FD" +
"048600010001010002048603" +
"048504048505010006010007" +
"04860804860904860A04860B" +
"02840D02840E02840F028410" +
"010211010212010213010214" +
"028415028416028417028418" +
"0102190284000000803F0000" +
"803F01010101010164646400" +
"64006400E8030000C9090000" +
"C9090000C909000001000100" +
"02640064000A000AE803E803" +
"0000E8030000010000000101" +
"010001000101010101000100" +
"000000000100640064006400" +
"0000803F0000803F01000202" +
"020202610001E80300000100" +
"0101E8030000E8030000E803" +
"E803E803E80301E803000001" +
"00C909010001006100640064" +
"000A0064000A008080800100" +
"010101000000010000000100" +
"000001000000010001000A00" +
"E80301000100000001000000" +
"0A0000006400016400010001" +
"010001000000C909C9090164" +
"006400640064006400010101" +
"007F45334303017F45334301" +
"000000010000000101E80300" +
"00E803000064000000010000" +
"0001000100E803E803010101" +
"0101000100010001000A0100" +
"400000130067950488960488" +
"9702849904889A04889C0102" +
"9D01029E02849F0284A00284" +
"6501016E04866F0486700486" +
"710486720486730284740284" +
"750102760284770284780284" +
"7902847A04867B04867C0101" +
"880284890284930102940102" +
"3D02843E02843F0102470284" +
"4A02844D02844E02844F0284" +
"500102510102520102530284" +
"5B01025C01025D01025E0102" +
"5F0102620486630284640101" +
"1901001A0102200284210284" +
"220284230284250284260100" +
"2701002802842904862A0284" +
"2B02842C01022D02832E0283" +
"2F0283300283310283320101" +
"330101340486350283360283" +
"370283380283FE0284FD0486" +
"000100010100020486030485" +
"040485050485060485070486" +
"0804860904860A04860B0284" +
"0C02840D02840E02840F0102" +
"100102110102120102130284" +
"140284150284160284170100" +
"180100000000803F0000803F" +
"01000000803F0000803F6464" +
"64006400640001E8030000E8" +
"030000C9090000C9090000C9" +
"090000010001000264006400" +
"0A00E803E8030000E8030000" +
"016400640001010100C90901" +
"010001000A0064000A008080" +
"8001000202020202E8030000" +
"010001010101000100010001" +
"0064000101010001000000C9" +
"09C909016400640064006400" +
"64000101E8030000E803E803" +
"E803E80301007F4533430301" +
"7F4533430100000001000000" +
"0100000001000000E8030000" +
"E80300006400000001000000" +
"01000100E803E80301010101" +
"010001000100010001014000" +
"0014004E5B04865C04865D04" +
"865E04865F04866004866101" +
"026202846301026C02847204" +
"887304887402847502847601" +
"027701027801027B04867C02" +
"847D02847E02847F04858101" +
"028B02842D01022E01022F01" +
"023001023101003201023302" +
"843402843501023602843702" +
"843802843902843A02843B02" +
"843E01024301014401014904" +
"864E04865101025202845302" +
"84540284550284570284FD04" +
"860004850104850202840301" +
"020401020504860602840702" +
"840902830A01020B04850C01" +
"020D01011201021304861C02" +
"841D04861E01021F01022002" +
"832102842702842802842902" +
"842A01002B01022C01020001" +
"000000E8030000E803000001" +
"000000010000000100000001" +
"01000164000000803F000080" +
"3F6400010001010101000000" +
"640064006400E80300006464" +
"000202028001016400000180" +
"6400640064000A000A000A00" +
"010101E8030000C909000002" +
"0100640064000A0064007F45" +
"33430100000001000000C909" +
"010164000000E80301006400" +
"01E803000064010101000000" +
"0100010000000101E8030100" +
"0A0064000A00010202400000" +
"15001309010A0A010A0B010A" +
"0C010A0D01020E01000F0486" +
"150100160102170102180102" +
"FD0486000100010100020284" +
"030486040102070284080284" +
"000101010101017F45334301" +
"010A0A7F4533430301010001" +
"000000010100010040000017" +
"0013FD048600010201010202" +
"028403048C04028405028406" +
"01020704860A02840B010212" +
"010013020714010A15028B16" +
"01001901001B020720010200" +
"7F4533430101010001000000" +
"010064000101000000000101" +
"016100010100010161000140" +
"00001A0009FE028404010005" +
"048C0602840802070B01000E" +
"02840F010011020700010001" +
"010000000100610001640001" +
"61004000001B001306048607" +
"01000802070901000A02840B" +
"02840C02840D028413010014" +
"0486150486160486FE028400" +
"020701010002048603010004" +
"048605048600010000000161" +
"000101000100640001000101" +
"000000010000000100000001" +
"006100016400000001010000" +
"00010000004000001C000700" +
"028401028402048C03048604" +
"010005010006048600010001" +
"00010000007F453343010101" +
"0000004000001E000EFD0486" +
"000284010284020284030284" +
"040284050284070284080102" +
"0902840A01020B01020C0284" +
"0D0284007F45334364006400" +
"640064006400640004000104" +
"00010101000A004000001F00" +
"0404010005020706048C0701" +
"000001610001000000014000" +
"00200008FE02840104860204" +
"850304850404860501000602" +
"070801000001007F45334301" +
"000000010000006400000001" +
"61000140000021000AFE0284" +
"FD0486000486010486020486" +
"030100040486050284060486" +
"0901020001007F4533430100" +
"000001000000010000000101" +
"000000010001000000014000" +
"00220008FD04860004860102" +
"840201000301000401000504" +
"86060102007F453343E80300" +
"000100010301010000000140" +
"0000230003FE028403028405" +
"020700010064006100400000" +
"250006FE028400010001010A" +
"020207030284040486000100" +
"020161000100010000004000" +
"00260005FE02840001000102" +
"840201000302840001000201" +
"00010100400000270005FE02" +
"840001000102840201020302" +
"840001000201000101004000" +
"003100020002840101020001" +
"000140000033000BFD048600" +
"028401028402028403028404" +
"028405028406010207010008" +
"0100090284007F4533430100" +
"010001000100010001000101" +
"010100400000350003FE0284" +
"000284010207000100E80361" +
"0040000037001C220284FD04" +
"860001020102840204860304" +
"860404860501000601000701" +
"000802840902840A02840B04" +
"860C02830E02830F02831302" +
"8418010D1901021A02841B01" +
"021C01021D02841E04861F04" +
"862004862102840001007F45" +
"334301010064000000020000" +
"00E803000001010101000100" +
"010001000000640064006400" +
"010001010100010A01000100" +
"0000E8030000E80300000100" +
"400000480006FD0486000100" +
"01028402028403048C040486" +
"007F45334302010001000100" +
"00007F4533434000004E0000" +
"00400000500004FD04860002" +
"8401010D030102007F453343" +
"00800101400000510004FD04" +
"8600028401010D030102007F" +
"453343008001014000005200" +
"0500010201010A02028B0301" +
"0A0401020001010100010140" +
"0000650014FE0284FD048600" +
"010001010002048603048604" +
"048605028406028407010009" +
"01020A01020B02840C010012" +
"028413028416028417028418" +
"01021901020001007F453343" +
"03017F453343E8030000E803" +
"00000100E803010101010001" +
"010001006400640001014000" +
"00670003FD04860004860502" +
"84007F453343010000000100" +
"400000690000004000006A00" +
"020002840102840001000100" +
"4000007F000D000100010100" +
"020100030207040100050100" +
"060100070100080100090100" +
"0A01000B01000C0100000101" +
"016100010101010101010101" +
"400000800010FD0486000100" +
"010101020100030284040284" +
"050102060101070102080207" +
"0904860A04850B04850C0100" +
"0D01010E0101007F45334301" +
"01010100E80301010161007F" +
"453343010000000100000001" +
"0101400000810006FD048600" +
"020701048602048603010004" +
"0100007F45334361007F4533" +
"437F45334301014000008300" +
"03FE02840001020102070001" +
"00016100400000840003FD04" +
"86000284010102007F453343" +
"0080FF4000008E0053540488" +
"550488560488570488590102" +
"5A01025B04865C04865D0486" +
"3902843A01003B01023C0102" +
"3D01023E01023F0102400100" +
"410207420102430102440102" +
"450284460284470486480284" +
"4901014A01015302841C0485" +
"1D02071E02841F0284200100" +
"210486220284230284240102" +
"250283260283270283280283" +
"2902832A01012B01012C0486" +
"2D02832E02832F0283300283" +
"350284360284370102380486" +
"FE0284FD0486000100010100" +
"020486030485040485050485" +
"060485070486080486090486" +
"0A04860B02840C02840D0284" +
"0E02840F0102100102110102" +
"120102130284140284150284" +
"160284170100180102190485" +
"1A04851B0485000000803F00" +
"00803F0000803F0000803F64" +
"64C9090000C9090000C90900" +
"000100010202020202016100" +
"80808001000100E803000001" +
"000101010001000000610001" +
"0001000101000000C909C909" +
"016400640064006400640001" +
"01E8030000E803E803E803E8" +
"030100C90901E80300000100" +
"7F45334303017F4533430100" +
"000001000000010000000100" +
"0000E8030000E80300006400" +
"00000100000001000100E803" +
"E80301010101010001000100" +
"010001010100000001000000" +
"01000000400000910004FA04" +
"860102840202840301020001" +
"000000010001000140000094" +
"000900020701020702010003" +
"010004048605048606010207" +
"010008010000610061000101" +
"010000000100000001010140" +
"0000950007FE028400020701" +
"010002048603048604048605" +
"020700010061000101000000" +
"01000000E803000061004000" +
"00960006FE02840104850204" +
"850304860402840604860001" +
"000100000001000000640000" +
"00C909C90900004000009700" +
"05FE02840102070301000404" +
"860B01020001006100010100" +
"0000014000009E0007FE0284" +
"000100010100020284030284" +
"040284050100000100010101" +
"0001006400014000009F0003" +
"FE028400010001010D000100" +
"0101400000A00008FD048600" +
"028401048502048503048604" +
"0486050284060486007F4533" +
"4301000100000001000000C9" +
"090000E803000064007F4533" +
"43400000A10005FD04860002" +
"84010100020207030100007F" +
"453343010001610001400000" +
"A20007FD0486000284010486" +
"020284030486040284050284" +
"007F45334300807F45334300" +
"800100000001000100400000" +
"A40002FD0486000284007F45" +
"33430100400000A50002FD04" +
"86000284007F453343010040" +
"0000A70005FD048600010001" +
"0486020486030486007F4533" +
"430101000000010000000100" +
"0000400000A90003FD048600" +
"0284010486007F4533430100" +
"01000000400000AE0005FD04" +
"8600028402010D0604860702" +
"84007F4533430100017F4533" +
"430100400000B10003FD0486" +
"000284010207007F45334301" +
"006100400000B20002FD0486" +
"000284007F45334301004000" +
"00B800030002070102070204" +
"860061006100010000004000" +
"00B90003FE02840002840102" +
"0700010001006100400000BA" +
"0003FE028400028401020700" +
"010001006100400000BB0007" +
"000284010486020284030486" +
"040284060486070486000100" +
"7F45334301007F4533430100" +
"0100000001000000400000BC" +
"0002FD0486000100007F4533" +
"4301400000C8000400010201" +
"010202010003010000010101" +
"01400000C900050001020101" +
"0D0201020301020401000001" +
"01010101400000CA000B0001" +
"0201010D0201020301020401" +
"020501020601020801000901" +
"000A01000B01000001010101" +
"01010101010101400000CE00" +
"0C0001020101020201020401" +
"020502070601020701010902" +
"070A02070D02840E02840F01" +
"020001010101610001016100" +
"61000100010001400000CF00" +
"030202840301020404860001" +
"000101000000400000D00002" +
"FD0486000284007F45334301" +
"00400000D10002FD04860002" +
"84007F4533430100400000D2" +
"0006FD048600010001048602" +
"0486030486040485007F4533" +
"430101000000010000000100" +
"000001000000400000D30003" +
"FD0486000102010102007F45" +
"33430101400000D80009FD04" +
"860002840102840A01000B01" +
"020C01020D01020E01000F02" +
"84007F453343010001000101" +
"0101010100400000E10009FE" +
"048600048603028404028405" +
"01020604860902840A02840B" +
"0284007F453343E803000001" +
"001000017F45334301000100" +
"0100400000E3000200028301" +
"04860001007F453343400000" +
"E50008000486020284050100" +
"0601000801000901000C0100" +
"0D0100007F4533430A000101" +
"010101014000000201231A01" +
"021B04861D01001E01002301" +
"00240102250100FD0486FE02" +
"840002070101000201020301" +
"020401000504880601020701" +
"020801020901000A04880B04" +
"860C01000D04860E01000F01" +
"021001021102841202841301" +
"001401021502841601001701" +
"021804861901000064E80300" +
"000101010A017F4533430100" +
"6100FF0101010000803F6464" +
"64010000803F010000000101" +
"000000010101010001000101" +
"01000164E803000001400000" +
"030105FE0284000102010102" +
"020100030100000100010101" +
"0140000006010CFE02840004" +
"860104850201000301000401" +
"000604860701000801000901" +
"000A01000B0485000100E803" +
"000001000000010101010000" +
"0001010101E8030000400000" +
"080103FE0284000284010284" +
"000100010001004000000C01" +
"17FD04860002840102840204" +
"860304860404860501020601" +
"020702840802840902840A04" +
"860B04860C02840D02840E02" +
"840F04861004861104851604" +
"86170486180486190486007F" +
"45334301000100E8030000E8" +
"030000010000000101010001" +
"00010001000000E803000064" +
"0064006400E8030000E80300" +
"00E8030000E8030000E80300" +
"00E8030000E8030000400000" +
"0D0104FD0486000102010102" +
"020100007F45334301010140" +
"0000130102FD048600010000" +
"7F453343014000001D010AFD" +
"048600048801048802010203" +
"048804048805048506048507" +
"0284080486007F4533430000" +
"803F0000803F010000803F00" +
"00803F0100000001000000E8" +
"03E8030000400000210106FD" +
"048600028401048602028403" +
"0102040284007F4533430100" +
"010000000100011900400000" +
"220102FD0486000284007F45" +
"33430100400000290102FD04" +
"86000283007F453343640040" +
"00002E0104FD048600028401" +
"0284050486007F4533430100" +
"010001000000400000300102" +
"FD0486000284007F45334301" +
"00400000310102FD04860002" +
"84007F453343010040000032" +
"0102FD0486000284007F4533" +
"430100400000330102FD0486" +
"000284007F45334301004000" +
"00340103FD04860002840101" +
"02007F453343010001400000" +
"380113FE0284000100010486" +
"020486030486040486090486" +
"0D02840E0284150485160485" +
"1704851804851904861A0485" +
"1B04861C04864A04866E0486" +
"00010002E8030000E8030000" +
"64000000E80300007F453343" +
"010001000100000001000000" +
"0100000001000000E8030000" +
"E80300007F45334301000000" +
"C9090000E803000040000039" +
"010EFE028400010003028404" +
"048605048606048607048608" +
"02840902840A01020B01020C" +
"04850D04864D048600010002" +
"0100E803000064000000E803" +
"0000E8030000010001000101" +
"E803000001000000E8030000" +
"4000003A0102FD0486000284" +
"007F45334301004000003B01" +
"02FD0486000102007F453343" +
"014000003D0107FD04860004" +
"850104850201000302840401" +
"02050488007F453343010000" +
"000100000001010001000080" +
"3F4000003F0103FD04860004" +
"8C010284007F453343010000" +
"006400400000430105FD0486" +
"00048C010284020284030486" +
"007F45334301000000640064" +
"00640000004000005A010E00" +
"010201010202010203010204" +
"010205010206010207010208" +
"01020901020A01020B01020E" +
"01020F028400010101010101" +
"010101010101016400400000" +
"720108FD0486000284010284" +
"020284030284040284050284" +
"060100007F45334380008000" +
"800080008000800001400000" +
"730102FD0486000284007F45" +
"33438000400000740102FD04" +
"86000284007F453343010040" +
"0000770105FD048600010201" +
"0284020102030102007F4533" +
"430100010101400000780104" +
"FD0486000284010284050486" +
"007F45334301000100010000" +
"00400000830108FD04860004" +
"860104860204860302840401" +
"00050486060486007F453343" +
"E8030000E8030000E8030000" +
"0100010A000000E803000040" +
"0000840103FD048600048601" +
"0284007F453343E803000001" +
"00400000850102FD04860101" +
"02007F453343014000008901" +
"0CFE02840004860104850201" +
"000301000401000604860701" +
"000801000901000A01000B04" +
"85000100E803000001000000" +
"0101010100000001010101E8" +
"0300004000008E0105FD0486" +
"000486010488020488040488" +
"007F45334301000000000080" +
"3F0000803F0000803F400000" +
"990102FD0486000284007F45" +
"33430100E881"
);
String expectedOutput =
"[FitFileId{type=ACTIVITY, manufacturer=255, product=65534, serial_number=1, time_created=1758499199, number=42, product_name=GadgetBridge}, " +
"FitCapabilities{workouts_supported=1, connectivity_supported=1}, " +
"FitDeviceSettings{active_time_zone=1, utc_offset=1, backlight_mode=1, activity_tracker_enabled=1, clock_time=1127433599, move_alert_enabled=1, date_mode=1, display_orientation=1, mounting_side=1, autosync_min_steps=1, autosync_min_time=1, lactate_threshold_autodetect_enabled=1, ble_auto_upload_enabled=1, auto_sync_frequency=1, auto_activity_detect=1, number_of_screens=1, smart_notification_display_orientation=1, tap_interface=1, tap_sensitivity=1}, " +
"FitUserProfile{friendly_name=a, gender=1, age=1, height=100, weight=1.0, language=french, elev_setting=imperial, weight_setting=imperial, resting_heart_rate=1, default_max_running_heart_rate=1, default_max_biking_heart_rate=1, default_max_heart_rate=1, hr_setting=1, speed_setting=imperial, dist_setting=imperial, power_setting=1, activity_class=127, position_setting=1, temperature_setting=imperial, local_id=1, wake_time=1, sleep_time=1, height_setting=imperial, user_running_step_length=1000, user_walking_step_length=1000, depth_setting=imperial, dive_count=1, message_index=1}, " +
"FitHrmProfile{enabled=true, hrm_ant_id=1, log_hrv=1, hrm_ant_id_trans_type=1, message_index=1}, " +
"FitSdmProfile{enabled=true, sdm_ant_id=1, sdm_cal_factor=1.0, odometer=1.0, speed_source=1, sdm_ant_id_trans_type=1, odometer_rollover=1, message_index=1}, " +
"FitBikeProfile{name=a, sport=1, sub_sport=1, odometer=1.0, bike_spd_ant_id=1, bike_cad_ant_id=1, bike_spdcad_ant_id=1, bike_power_ant_id=1, custom_wheelsize=1.0, auto_wheelsize=1.0, bike_weight=1.0, power_cal_factor=1.0, auto_wheel_cal=true, auto_power_zero=true, id=1, spd_enabled=true, cad_enabled=true, spdcad_enabled=true, power_enabled=true, enabled=true, bike_spd_ant_id_trans_type=1, bike_cad_ant_id_trans_type=1, bike_spdcad_ant_id_trans_type=1, bike_power_ant_id_trans_type=1, odometer_rollover=1, front_gear_num=1, rear_gear_num=1, shimano_di2_enabled=true, message_index=1}, " +
"FitZonesTarget{max_heart_rate=1, threshold_heart_rate=1, functional_threshold_power=1, hr_calc_type=1, pwr_calc_type=1}, " +
"FitHrZone{high_bpm=1, name=a, message_index=1}, " +
"FitPowerZone{high_value=1, name=a, message_index=1}, " +
"FitMetZone{high_bpm=1, calories=1.0, fat_calories=1.0, message_index=1}, " +
"FitSport{sport=1, sub_sport=1, name=a}, " +
"FitTrainingSettings{target_distance=1.0, target_speed=1.0, target_time=1, precise_target_speed=1.0}, " +
"FitGoals{sport=1, sub_sport=1, start_date=1127433599, end_date=1127433599, type=distance, value=1, repeat=1, target_value=1, recurrence=1, recurrence_value=1, enabled=1, source=community, message_index=1}, " +
"FitSession{2025-09-22 01:59:59.000, event=3, event_type=1, start_time=1127433599, start_latitude=8.381903171539307E-8, start_longitude=8.381903171539307E-8, sport=1, sub_sport=1, total_elapsed_time=1000, total_timer_time=1000, total_distance=100, total_cycles=1, total_calories=1, total_fat_calories=1, avg_speed=1.0, max_speed=1.0, average_heart_rate=1, max_heart_rate=1, avg_cadence=1, max_cadence=1, avg_power=1, max_power=1, total_ascent=1, total_descent=1, total_training_effect=1.0, first_lap_index=1, num_laps=1, event_group=1, trigger=1, nec_latitude=8.381903171539307E-8, nec_longitude=8.381903171539307E-8, swc_latitude=8.381903171539307E-8, swc_longitude=8.381903171539307E-8, num_lengths=1, normalized_power=1, training_stress_score=1.0, intensity_factor=1.0, left_right_balance=1, end_latitude=8.381903171539307E-8, end_longitude=8.381903171539307E-8, avg_stroke_count=10, avg_stroke_distance=1.0, swim_stroke=1, pool_length=1.0, threshold_power=1, pool_length_unit=1, num_active_lengths=1, total_work=1, avg_altitude=1.0, max_altitude=1.0, gps_accuracy=1, avg_grade=1.0, avg_pos_grade=1.0, avg_neg_grade=1.0, max_pos_grade=1.0, max_neg_grade=1.0, avg_temperature=1, max_temperature=1, total_moving_time=1.0, avg_pos_vertical_speed=1.0, avg_neg_vertical_speed=1.0, max_pos_vertical_speed=1.0, max_neg_vertical_speed=1.0, min_heart_rate=1, avg_lap_time=1.0, best_lap_index=1, min_altitude=1.0, player_score=1, opponent_score=1, opponent_name=a, max_ball_speed=1.0, avg_ball_speed=1.0, avg_vertical_oscillation=1.0, avg_stance_time_percent=1.0, avg_stance_time=1.0, avg_fractional_cadence=1.0, max_fractional_cadence=1.0, total_fractional_cycles=1.0, avg_left_torque_effectiveness=1.0, avg_right_torque_effectiveness=1.0, avg_left_pedal_smoothness=1.0, avg_right_pedal_smoothness=1.0, avg_combined_pedal_smoothness=1.0, sport_profile_name=a, sport_index=1, stand_time=1000, stand_count=1, avg_left_pco=1, avg_right_pco=1, enhanced_avg_speed=1.0, enhanced_max_speed=1.0, enhanced_avg_altitude=1.0, enhanced_min_altitude=1.0, enhanced_max_altitude=1.0, avg_lev_motor_power=1, max_lev_motor_power=1, lev_battery_consumption=1.0, avg_vertical_ratio=1.0, avg_stance_time_balance=1.0, avg_step_length=1.0, total_anaerobic_training_effect=1.0, avg_vam=1.0, avg_depth=1.0, max_depth=1.0, surface_interval=1, start_cns=1, end_cns=1, start_n2=1, end_n2=1, avg_respiration_rate=1, max_respiration_rate=1, min_respiration_rate=1, min_temperature=1, o2_toxicity=1, dive_number=1, training_load_peak=1.0, enhanced_avg_respiration_rate=1.0, enhanced_max_respiration_rate=1.0, enhanced_min_respiration_rate=1.0, total_grit=1.0, total_flow=1.0, jump_count=1, avg_grit=1.0, avg_flow=1.0, workout_feel=1, workout_rpe=1, avg_spo2=1, avg_stress=1, hrv_sdrr=1, hrv_rmssd=1, total_fractional_ascent=1.0, total_fractional_descent=1.0, avg_core_temperature=1.0, min_core_temperature=1.0, max_core_temperature=1.0, timestamp=1758499199, message_index=1}, " +
"FitLap{2025-09-22 01:59:59.000, event=3, event_type=1, start_time=1127433599, start_lat=8.381903171539307E-8, start_long=8.381903171539307E-8, end_lat=8.381903171539307E-8, end_long=8.381903171539307E-8, total_elapsed_time=1.0, total_timer_time=1.0, total_distance=1.0, total_cycles=1, total_calories=1, total_fat_calories=1, avg_speed=1.0, max_speed=1.0, avg_heart_rate=1, max_heart_rate=1, avg_cadence=1, max_cadence=1, avg_power=1, max_power=1, total_ascent=1, total_descent=1, intensity=1, lap_trigger=1, sport=1, event_group=1, num_lengths=1, normalized_power=1, left_right_balance=1, first_length_index=1, avg_stroke_distance=100, swim_style=BACKSTROKE, sub_sport=1, num_active_lengths=1, total_work=1, avg_altitude=1.0, max_altitude=1.0, gps_accuracy=1, avg_grade=1.0, avg_pos_grade=1.0, avg_neg_grade=1.0, max_pos_grade=1.0, max_neg_grade=1.0, avg_temperature=1, max_temperature=1, total_moving_time=1.0, avg_pos_vertical_speed=1.0, avg_neg_vertical_speed=1.0, max_pos_vertical_speed=1.0, max_neg_vertical_speed=1.0, repetition_num=1, min_altitude=1.0, min_heart_rate=1, wkt_step_index=1, opponent_score=1, avg_vertical_oscillation=1.0, avg_stance_time_percen=1.0, avg_stance_time=1.0, avg_fractional_cadence=1.0, max_fractional_cadence=1.0, total_fractional_cycles=1.0, player_score=1, avg_left_torque_effectiveness=1.0, avg_right_torque_effectiveness=1.0, avg_left_pedal_smoothness=1.0, avg_right_pedal_smoothness=1.0, avg_combined_pedal_smoothness=1.0, time_standing=1.0, stand_count=1, avg_left_pco=1, avg_right_pco=1, enhanced_avg_speed=10.0, enhanced_max_speed=10.0, enhanced_avg_altitude=1.0, enhanced_min_altitude=1.0, enhanced_max_altitude=1.0, avg_lev_motor_power=1, max_lev_motor_power=1, lev_battery_consumption=1.0, avg_vertical_ratio=1.0, avg_stance_time_balance=1.0, avg_step_length=1.0, avg_vam=1.0, avg_depth=1.0, max_depth=1.0, min_temperature=1, enhanced_avg_respiration_rate=1.0, enhanced_max_respiration_rate=1.0, avg_respiration_rate=1, max_respiration_rate=1, total_grit=1.0, total_flow=1.0, jump_count=1, avg_grit=1.0, avg_flow=1.0, total_fractional_ascent=1.0, total_fractional_descent=1.0, avg_core_temperature=1.0, min_core_temperature=1.0, max_core_temperature=1.0, timestamp=1758499199, message_index=1}, " +
"FitRecord{2025-09-22 01:59:59.000, latitude=8.381903171539307E-8, longitude=8.381903171539307E-8, altitude=1.0, heart_rate=1, cadence=1, distance=1.0, speed=1.0, power=1, grade=1.0, resistance=1, time_from_course=1.0, cycle_length=1.0, temperature=1, cycles=1, total_cycles=1, compressed_accumulated_power=1, accumulated_power=1, left_right_balance=1, gps_accuracy=1, vertical_speed=1.0, calories=1, oscillation=1.0, stance_time_percent=1.0, stance_time=1.0, activity=1, left_torque_effectiveness=1.0, right_torque_effectiveness=1.0, left_pedal_smoothness=1.0, right_pedal_smoothness=1.0, combined_pedal_smoothness=1.0, time128=1.0, stroke_type=1, zone=1, ball_speed=1.0, cadence256=1.0, fractional_cadence=1.0, avg_total_hemoglobin_conc=1.0, min_total_hemoglobin_conc=1.0, max_total_hemoglobin_conc=1.0, avg_saturated_hemoglobin_percent=1.0, min_saturated_hemoglobin_percent=1.0, max_saturated_hemoglobin_percent=1.0, device_index=1, left_pco=1, right_pco=1, enhanced_speed=1.0, enhanced_altitude=1.0, battery_soc=1.0, motor_power=1, vertical_ratio=1.0, stance_time_balance=1.0, step_length=1.0, cycle_length16=1.0, absolute_pressure=1, depth=1.0, next_stop_depth=1.0, next_stop_time=1, time_to_surface=1, ndl_time=1, cns_load=1, n2_load=1, respiration_rate=1, enhanced_respiration_rate=100, grit=1.0, flow=1.0, current_stress=1.0, ebike_travel_rang=1, ebike_battery_level=1, ebike_assist_mode=1, ebike_assist_level_percent=1, air_time_remaining=1, pressure_sac=1.0, volume_sac=1.0, rmv=1.0, ascent_rate=1.0, po2=1.0, core_temperature=1.0, timestamp=1758499199}, " +
"FitEvent{2025-09-22 01:59:59.000, event=3, event_type=1, data16=1, data=1, event_group=1, score=1, opponent_score=1, front_gear_num=1, front_gear=1, rear_gear_num=1, rear_gear=1, device_index=1, activity_type=1, start_timestamp=1127433599, radar_threat_level_max=1, radar_threat_count=1, radar_threat_avg_approach_speed=1.0, radar_threat_max_approach_speed=1.0, timestamp=1758499199}, " +
"FitDeviceInfo{2025-09-22 01:59:59.000, device_index=1, device_type=1, manufacturer=1, serial_number=1, product=1, software_version=100, hardware_version=1, cum_operating_time=1, battery_voltage=1.0, battery_status=1, sensor_position=1, descriptor=a, ant_transmission_type=1, ant_device_number=1, ant_network=1, source_type=1, product_name=a, battery_level=1, timestamp=1758499199}, " +
"FitWorkout{2025-09-22 01:59:59.000, sport=1, capabilities=1, num_valid_steps=1, name=a, sub_sport=1, pool_length=1.0, pool_length_unit=1, notes=a, message_index=1}, " +
"FitWorkoutStep{2025-09-22 01:59:59.000, wkt_step_name=a, duration_type=1, duration_value=100, target_type=1, target_value=1, custom_target_value_low=1, custom_target_value_high=1, intensity=1, notes=a, equipment=1, exercise_category=1, exercise_name=1, exercise_weight=1.0, weight_display_unit=1, secondary_target_type=1, secondary_target_value=1, secondary_custom_target_value_low=1, secondary_custom_target_value_high=1, message_index=1}, " +
"FitSchedule{2025-09-22 01:59:59.000, manufacturer=1, product=1, serial_number=1, time_created=1127433599, completed=true, type=1, scheduled_time=1}, " +
"FitWeightScale{2025-09-22 01:59:59.000, weight=1.0, percent_fat=1.0, percent_hydration=1.0, visceral_fat_mass=1.0, bone_mass=1.0, muscle_mass=1.0, basal_met=1.0, physique_rating=1, active_met=1.0, metabolic_age=1, visceral_fat_rating=1, user_profile_index=1, bmi=1.0, timestamp=1758499199}, " +
"FitCourse{2025-09-22 01:59:59.000, sport=1, name=a, capabilities=1, sub_sport=1}, " +
"FitCoursePoint{2025-09-22 01:59:59.000, timestamp=1758499199, position_lat=8.381903171539307E-8, position_long=8.381903171539307E-8, distance=1.0, type=1, name=a, favorite=1, message_index=1}, " +
"FitTotals{2025-09-22 01:59:59.000, timer_time=1, distance=1, calories=1, sport=1, elapsed_time=1, sessions=1, active_time=1, sport_index=1, timestamp=1758499199, message_index=1}, " +
"FitActivity{2025-09-22 01:59:59.000, total_timer_time=1000, num_sessions=1, type=1, event=3, event_type=1, local_timestamp=1, event_group=1, timestamp=1758499199}, " +
"FitSoftware{2025-09-22 01:59:59.000, version=1.0, part_number=a, message_index=1}, " +
"FitFileCapabilities{2025-09-22 01:59:59.000, type=2, flags=1, directory=a, max_count=1, max_size=1, message_index=1}, " +
"FitMesgCapabilities{2025-09-22 01:59:59.000, file=2, mesg_num=1, count_type=1, max_count=1, message_index=1}, " +
"FitFieldCapabilities{2025-09-22 01:59:59.000, file=2, mesg_num=1, field_num=1, count=1, message_index=1}, " +
"FitFileCreator{2025-09-22 01:59:59.000, software_version=1, hardware_version=1}, " +
"FitBloodPressure{2025-09-22 01:59:59.000, systolic_pressure=1, diastolic_pressure=1, mean_arterial_pressure=1, map_3_sample_mean=1, map_morning_values=1, map_evening_values=1, heart_rate=1, heart_rate_type=1, status=1, user_profile_index=1, timestamp=1758499199}, " +
"FitSpeedZone{2025-09-22 01:59:59.000, high_value=1.0, name=a, message_index=1}, " +
"FitMonitoring{2025-09-22 01:59:59.000, device_index=1, calories=1, distance=100, cycles=2, active_time=1000, activity_type=1, activity_subtype=1, activity_level=1, distance_16=1, cycles_16=1, active_time_16=1, local_timestamp=1, temperature=1.0, temperature_min=1.0, temperature_max=1.0, active_calories=1, current_activity_type_intensity=1, timestamp_min_8=1, timestamp_16=1, heart_rate=1, intensity=1.0, duration_min=1, duration=1, ascent=1.0, descent=1.0, moderate_activity_minutes=1, vigorous_activity_minutes=1, timestamp=1758499199}, " +
"FitTrainingFile{2025-09-22 01:59:59.000, type=2, manufacturer=1, product=1, serial_number=1, time_created=1127433599, timestamp=1758499199}, " +
"FitHrv{2025-09-22 01:59:59.000}, " +
"FitAntRx{2025-09-22 01:59:59.000, fractional_timestamp=1.0, mesg_id=1, channel_number=1, timestamp=1758499199}, " +
"FitAntTx{2025-09-22 01:59:59.000, fractional_timestamp=1.0, mesg_id=1, channel_number=1, timestamp=1758499199}, " +
"FitAntChannelId{2025-09-22 01:59:59.000, channel_number=1, device_type=1, device_number=1, transmission_type=1, device_index=1}, " +
"FitLength{2025-09-22 01:59:59.000, event=3, event_type=1, start_time=1127433599, total_elapsed_time=1.0, total_timer_time=1.0, total_strokes=1, avg_speed=1.0, swim_stroke=1, avg_swimming_cadence=1, event_group=1, total_calories=1, length_type=1, player_score=1, opponent_score=1, enhanced_avg_respiration_rate=0.1, enhanced_max_respiration_rate=0.1, avg_respiration_rate=1, max_respiration_rate=1, timestamp=1758499199, message_index=1}, " +
"FitMonitoringInfo{2025-09-22 01:59:59.000, local_timestamp=1, resting_metabolic_rate=1, timestamp=1758499199}, " +
"FitPad{2025-09-22 01:59:59.000}, " +
"FitSlaveDevice{2025-09-22 01:59:59.000, manufacturer=1, product=1}, " +
"FitConnectivity{2025-09-22 01:59:59.000, bluetooth_enabled=1, bluetooth_le_enabled=1, ant_enabled=1, name=a, live_tracking_enabled=1, weather_conditions_enabled=1, weather_alerts_enabled=1, auto_activity_upload_enabled=1, course_download_enabled=1, workout_download_enabled=1, gps_ephemeris_download_enabled=1, incident_detection_enabled=1, grouptrack_enabled=1}, " +
"FitWeather{2025-09-22 01:59:59.000, weather_report=1, temperature=274, condition=PARTLY_CLOUDY, wind_direction=1, wind_speed=3.3557048, precipitation_probability=1, temperature_feels_like=274, relative_humidity=1, location=a, observed_at_time=1758499199, observed_location_lat=1, observed_location_long=1, day_of_week=MONDAY, high_temperature=274, low_temperature=274, timestamp=1758499199}, " +
"FitWeatherAlert{2025-09-22 01:59:59.000, report_id=a, issue_time=1127433599, expire_time=1127433599, severity=1, type=1, timestamp=1758499199}, " +
"FitCadenceZone{2025-09-22 01:59:59.000, high_value=1, name=a, message_index=1}, " +
"FitHr{2025-09-22 01:59:59.000, fractional_timestamp=1.0, timestamp=1758499199}, " +
"FitSegmentLap{2025-09-22 01:59:59.000, unknown_0(ENUM/1)=3, unknown_1(ENUM/1)=1, unknown_2(UINT32/4)=1127433599, start_position_lat=8.381903171539307E-8, start_position_long=8.381903171539307E-8, end_position_lat=8.381903171539307E-8, end_position_long=8.381903171539307E-8, unknown_7(UINT32/4)=1000, unknown_8(UINT32/4)=1000, total_distance=1.0, unknown_10(UINT32/4)=1, unknown_11(UINT16/2)=1, unknown_12(UINT16/2)=1, unknown_13(UINT16/2)=1000, unknown_14(UINT16/2)=1000, unknown_15(UINT8/1)=1, unknown_16(UINT8/1)=1, unknown_17(UINT8/1)=1, unknown_18(UINT8/1)=1, unknown_19(UINT16/2)=1, unknown_20(UINT16/2)=1, total_ascent=1, total_descent=1, sport=1, unknown_24(UINT8/1)=1, nec_lat=8.381903171539307E-8, nec_long=8.381903171539307E-8, swc_lat=8.381903171539307E-8, swc_long=8.381903171539307E-8, name=a, unknown_30(UINT16/2)=1, unknown_31(UINT16/2)=1, unknown_32(ENUM/1)=1, unknown_33(UINT32/4)=1, unknown_34(UINT16/2)=2505, unknown_35(UINT16/2)=2505, unknown_36(UINT8/1)=1, unknown_37(SINT16/2)=100, unknown_38(SINT16/2)=100, unknown_39(SINT16/2)=100, unknown_40(SINT16/2)=100, unknown_41(SINT16/2)=100, avg_temperature=1, max_temperature=1, unknown_44(UINT32/4)=1000, unknown_45(SINT16/2)=1000, unknown_46(SINT16/2)=1000, unknown_47(SINT16/2)=1000, unknown_48(SINT16/2)=1000, unknown_53(UINT16/2)=1, unknown_54(UINT16/2)=2505, unknown_55(UINT8/1)=1, unknown_56(UINT32/4)=1000, unknown_57(UINT16/2)=1, unknown_58(ENUM/1)=1, unknown_59(UINT8/1)=2, unknown_60(UINT8/1)=2, unknown_61(UINT8/1)=2, unknown_62(UINT8/1)=2, unknown_63(UINT8/1)=2, unknown_64(ENUM/1)=1, uuid=a, unknown_66(UINT8/1)=128, unknown_67(UINT8/1)=128, unknown_68(UINT8/1)=128, unknown_69(UINT16/2)=1, unknown_70(UINT16/2)=1, unknown_71(UINT32/4)=1000, unknown_72(UINT16/2)=1, unknown_73(SINT8/1)=1, unknown_74(SINT8/1)=1, unknown_83(UINT16/2)=1, unknown_84(FLOAT32/4)=1.0, unknown_85(FLOAT32/4)=1.0, unknown_86(FLOAT32/4)=1.0, unknown_87(FLOAT32/4)=1.0, total_fractional_ascent=1.0, total_fractional_descent=1.0, unknown_91(UINT32/4)=2505, unknown_92(UINT32/4)=2505, unknown_93(UINT32/4)=2505, timestamp=1758499199, message_index=1}, " +
"FitMemoGlob{2025-09-22 01:59:59.000, mesg_num=1, parent_index=1, field_num=1, part_index=1}, " +
"FitSegmentId{2025-09-22 01:59:59.000, name=a, uuid=a, sport=1, enabled=1, user_profile_primary_key=1, device_id=1, default_race_leader=1, delete_status=1, selection_type=1}, " +
"FitSegmentLeaderboardEntry{2025-09-22 01:59:59.000, name=a, type=1, group_primary_key=1, activity_id=1, segment_time=1.0, activity_id_string=a, message_index=1}, " +
"FitSegmentPoint{2025-09-22 01:59:59.000, position_lat=8.381903171539307E-8, position_long=8.381903171539307E-8, distance=1.0, altitude=1.0, enhanced_altitude=1.0, message_index=1}, " +
"FitSegmentFile{2025-09-22 01:59:59.000, file_uuid=a, enabled=1, user_profile_primary_key=1, default_race_leader=1, message_index=1}, " +
"FitWorkoutSession{2025-09-22 01:59:59.000, sport=1, sub_sport=1, num_valid_steps=1, first_step_index=1, pool_length=1.0, pool_length_unit=1, message_index=1}, " +
"FitWatchfaceSettings{2025-09-22 01:59:59.000, mode=1, layout=1, message_index=1}, " +
"FitGpsMetadata{2025-09-22 01:59:59.000, timestamp_ms=1, position_lat=8.381903171539307E-8, position_long=8.381903171539307E-8, enhanced_altitude=1.0, enhanced_speed=1.0, heading=1.0, utc_timestamp=1127433599, timestamp=1758499199}, " +
"RecordData{UNK_161_camera_event, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(ENUM/1)=1, unknown_2(STRING/2)=a, unknown_3(ENUM/1)=1, 253_timestamp=1758499199}, " +
"FitTimestampCorrelation{2025-09-22 01:59:59.000, fractional_timestamp=1.0, system_timestamp=1127433599, fractional_system_timestamp=1.0, local_timestamp=1, timestamp_ms=1, system_timestamp_ms=1, timestamp=1758499199}, " +
"RecordData{UNK_164_gyroscope_data, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, 253_timestamp=1758499199}, " +
"RecordData{UNK_165_accelerometer_data, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, 253_timestamp=1758499199}, " +
"RecordData{UNK_167_three_d_sensor_calibration, 2025-09-22 01:59:59.000, unknown_0(ENUM/1)=1, unknown_1(UINT32/4)=1, unknown_2(UINT32/4)=1, unknown_3(UINT32/4)=1, 253_timestamp=1758499199}, " +
"RecordData{UNK_169_video_frame, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT32/4)=1, 253_timestamp=1758499199}, " +
"RecordData{UNK_174_obdii_data, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_2(BASE_TYPE_BYTE/1)=1, unknown_6(UINT32/4)=1127433599, unknown_7(UINT16/2)=1, 253_timestamp=1758499199}, " +
"RecordData{UNK_177_nmea_sentence, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(STRING/2)=a, 253_timestamp=1758499199}, " +
"RecordData{UNK_178_aviation_attitude, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, 253_timestamp=1758499199}, " +
"RecordData{UNK_184_video, 2025-09-22 01:59:59.000, unknown_0(STRING/2)=a, unknown_1(STRING/2)=a, unknown_2(UINT32/4)=1}, " +
"RecordData{UNK_185_video_title, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(STRING/2)=a, unknown_254(UINT16/2)=1}, " +
"RecordData{UNK_186_video_description, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(STRING/2)=a, unknown_254(UINT16/2)=1}, " +
"RecordData{UNK_187_video_clip, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT32/4)=1127433599, unknown_2(UINT16/2)=1, unknown_3(UINT32/4)=1127433599, unknown_4(UINT16/2)=1, unknown_6(UINT32/4)=1, unknown_7(UINT32/4)=1}, " +
"FitOhrSettings{2025-09-22 01:59:59.000, enabled=1, timestamp=1758499199}, " +
"RecordData{UNK_200_exd_screen_configuration, 2025-09-22 01:59:59.000, unknown_0(UINT8/1)=1, unknown_1(UINT8/1)=1, unknown_2(ENUM/1)=1, unknown_3(ENUM/1)=1}, " +
"RecordData{UNK_201_exd_data_field_configuration, 2025-09-22 01:59:59.000, unknown_0(UINT8/1)=1, unknown_1(BASE_TYPE_BYTE/1)=1, unknown_2(UINT8/1)=1, unknown_3(UINT8/1)=1, unknown_4(ENUM/1)=1}, " +
"RecordData{UNK_202_exd_data_concept_configuration, 2025-09-22 01:59:59.000, unknown_0(UINT8/1)=1, unknown_1(BASE_TYPE_BYTE/1)=1, unknown_2(UINT8/1)=1, unknown_3(UINT8/1)=1, unknown_4(UINT8/1)=1, unknown_5(UINT8/1)=1, unknown_6(UINT8/1)=1, unknown_8(ENUM/1)=1, unknown_9(ENUM/1)=1, unknown_10(ENUM/1)=1, unknown_11(ENUM/1)=1}, " +
"FitFieldDescription{2025-09-22 01:59:59.000, developer_data_index=1, field_definition_number=1, fit_base_type_id=1, array=1, components=a, scale=1, offset=1, bits=a, accumulate=a, fit_base_unit_id=1, native_mesg_num=1, native_field_num=1}, " +
"FitDeveloperData{2025-09-22 01:59:59.000, manufacturer_id=1, developer_data_index=1, application_version=1}, " +
"RecordData{UNK_208_magnetometer_data, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, 253_timestamp=1758499199}, " +
"FitBarometerData{2025-09-22 01:59:59.000, timestamp_ms=1, timestamp=1758499199}, " +
"RecordData{UNK_210_one_d_sensor_calibration, 2025-09-22 01:59:59.000, unknown_0(ENUM/1)=1, unknown_1(UINT32/4)=1, unknown_2(UINT32/4)=1, unknown_3(UINT32/4)=1, unknown_4(SINT32/4)=1, 253_timestamp=1758499199}, " +
"FitMonitoringHrData{2025-09-22 01:59:59.000, resting_heart_rate=1, current_day_resting_heart_rate=1, timestamp=1758499199}, " +
"FitTimeInZone{2025-09-22 01:59:59.000, reference_message=1, reference_index=1, hr_calc_type=1, max_heart_rate=1, resting_heart_rate=1, threshold_heart_rate=1, pwr_calc_type=1, functional_threshold_power=1, timestamp=1758499199}, " +
"FitSet{2025-09-22 01:59:59.000, duration=1.0, repetitions=1, weight=1.0, set_type=1, start_time=1758499199, weight_display_unit=1, message_index=1, wkt_step_index=1, timestamp=1758499199}, " +
"FitStressLevel{2025-09-22 01:59:59.000, stress_level_value=1, stress_level_time=1758499199}, " +
"FitMaxMetData{2025-09-22 01:59:59.000, update_time=1758499199, vo2_max=1.0, sport=1, sub_sport=1, max_met_category=1, calibrated_data=1, hr_source=1, speed_source=1}, " +
"FitDiveSettings{2025-09-22 01:59:59.000, name=a, gf_low=1, gf_high=1, water_type=1, water_density=1.0, po2_warn=1.0, po2_critical=1.0, po2_deco=1.0, safety_stop_enabled=1, bottom_depth=1.0, bottom_time=1, apnea_countdown_enabled=1, apnea_countdown_time=1, backlight_mode=1, backlight_brightness=1, backlight_timeout=1, repeat_dive_interval=1, safety_stop_time=1, heart_rate_source_type=1, heart_rate_source=1, travel_gas=1, ccr_low_setpoint_switch_mode=1, ccr_low_setpoint=1.0, ccr_low_setpoint_depth=1.0, ccr_high_setpoint_switch_mode=1, ccr_high_setpoint=1.0, ccr_high_setpoint_depth=1.0, gas_consumption_display=1, up_key_enabled=1, dive_sounds=1, last_stop_multiple=1.0, no_fly_time_mode=1, timestamp=1758499199, message_index=1}, " +
"FitDiveGas{2025-09-22 01:59:59.000, helium_content=1, oxygen_content=1, status=1, mode=1, message_index=1}, " +
"FitDiveAlarm{2025-09-22 01:59:59.000, depth=1.0, time=1, enabled=true, alarm_type=1, sound=1, id=1, popup_enabled=true, trigger_on_descent=true, trigger_on_ascent=true, repeating=true, speed=1.0, message_index=1}, " +
"FitExerciseTitle{2025-09-22 01:59:59.000, exercise_category=1, exercise_name=1, message_index=1}, " +
"FitDiveSummary{2025-09-22 01:59:59.000, reference_mesg=1, reference_index=1, avg_depth=1.0, max_depth=1.0, surface_interval=1, start_cns=1, end_cns=1, start_n2=1, end_n2=1, o2_toxicity=1, dive_number=1, bottom_time=1.0, avg_pressure_sac=1.0, avg_volume_sac=1.0, avg_rmv=1.0, descent_time=1.0, ascent_time=1.0, avg_ascent_rate=1.0, avg_descent_rate=1.0, max_ascent_rate=1.0, max_descent_rate=1.0, hang_time=1.0, timestamp=1758499199}, " +
"FitSpo2{2025-09-22 01:59:59.000, reading_spo2=1, reading_confidence=1, mode=1, timestamp=1758499199}, " +
"FitSleepStage{2025-09-22 01:59:59.000, sleep_stage=AWAKE, timestamp=1758499199}, " +
"FitJump{2025-09-22 01:59:59.000, distance=1.0, heigh=1.0, rotations=1, hang_time=1.0, score=1.0, position_lat=8.381903171539307E-8, position_long=8.381903171539307E-8, speed=1.0, enhanced_speed=1.0, timestamp=1758499199}, " +
"RecordData{UNK_289_aad_accel_features, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT32/4)=1, unknown_2(UINT16/2)=1, unknown_3(UINT8/1)=1, unknown_4(UINT16/2)=25, 253_timestamp=1758499199}, " +
"FitBeatIntervals{2025-09-22 01:59:59.000, timestamp_ms=1, timestamp=1758499199}, " +
"FitRespirationRate{2025-09-22 01:59:59.000, respiration_rate=1.0, timestamp=1758499199}, " +
"RecordData{UNK_302_hsa_accelerometer_data, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT16/2)=1, unknown_5(UINT32/4)=1, 253_timestamp=1758499199}, " +
"FitHsaStepData{2025-09-22 01:59:59.000, processing_interval=1, timestamp=1758499199}, " +
"FitHsaSpo2Data{2025-09-22 01:59:59.000, processing_interval=1, timestamp=1758499199}, " +
"FitHsaStressData{2025-09-22 01:59:59.000, processing_interval=1, timestamp=1758499199}, " +
"FitHsaRespirationData{2025-09-22 01:59:59.000, processing_interval=1, timestamp=1758499199}, " +
"FitHsaHeartRateData{2025-09-22 01:59:59.000, processing_interval=1, status=1, timestamp=1758499199}, " +
"FitSplit{2025-09-22 01:59:59.000, split_type=2, total_elapsed_time=1.0, total_timer_time=1.0, total_distance=1.0, avg_speed=1.0, start_time=1127433599, total_ascent=1, total_descent=1, start_position_lat=8.381903171539307E-8, start_position_long=8.381903171539307E-8, end_position_lat=8.381903171539307E-8, end_position_long=8.381903171539307E-8, max_speed=1.0, avg_vert_speed=1.0, end_time=1127433599, total_calories=1, start_elevation=1.0, total_moving_time=1.0, message_index=1}, " +
"FitSplitSummary{2025-09-22 01:59:59.000, split_type=2, num_splits=1, total_timer_time=1.0, total_distance=1.0, avg_speed=1.0, max_speed=1.0, total_ascent=1, total_descent=1, avg_heart_rate=1, max_heart_rate=1, avg_vert_speed=1.0, total_calories=1, total_moving_time=1.0, message_index=1}, " +
"FitHsaBodyBatteryData{2025-09-22 01:59:59.000, processing_interval=1, timestamp=1758499199}, " +
"FitHsaEvent{2025-09-22 01:59:59.000, event_id=1, timestamp=1758499199}, " +
"FitClimbPro{2025-09-22 01:59:59.000, position_lat=8.381903171539307E-8, position_long=8.381903171539307E-8, climb_pro_event=1, climb_number=1, climb_category=1, current_dist=1.0, timestamp=1758499199}, " +
"FitTankUpdate{2025-09-22 01:59:59.000, sensor=1, pressure=1.0, timestamp=1758499199}, " +
"FitTankSummary{2025-09-22 01:59:59.000, sensor=1, start_pressure=1.0, end_pressure=1.0, volume_used=1.0, timestamp=1758499199}, " +
"FitSleepStats{2025-09-22 01:59:59.000, combined_awake_score=1, awake_time_score=1, awakenings_count_score=1, deep_sleep_score=1, sleep_duration_score=1, light_sleep_score=1, overall_sleep_score=1, sleep_quality_score=1, sleep_recovery_score=1, rem_sleep_score=1, sleep_restlessness_score=1, awakenings_count=1, interruptions_score=1, average_stress_during_sleep=1.0}, " +
"FitHrvSummary{2025-09-22 01:59:59.000, weekly_average=1.0, last_night_average=1.0, last_night_5_min_high=1.0, baseline_low_upper=1.0, baseline_balanced_lower=1.0, baseline_balanced_upper=1.0, status=POOR, timestamp=1758499199}, " +
"FitHrvValue{2025-09-22 01:59:59.000, value=1.0, timestamp=1758499199}, " +
"RecordData{UNK_372_raw_bbi, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, 253_timestamp=1758499199}, " +
"FitDeviceAuxBatteryInfo{2025-09-22 01:59:59.000, device_index=1, battery_voltage=1.0, battery_status=1, battery_identifier=1, timestamp=1758499199}, " +
"RecordData{UNK_376_hsa_gyroscope_data, 2025-09-22 01:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT16/2)=1, unknown_5(UINT32/4)=1, 253_timestamp=1758499199}, " +
"FitChronoShotSession{2025-09-22 01:59:59.000, min_speed=1.0, max_speed=1.0, avg_speed=1.0, shot_count=1, projectile_type=1, grain_weight=1.0, standard_deviation=1.0, timestamp=1758499199}, " +
"FitChronoShotData{2025-09-22 01:59:59.000, shot_speed=1.0, shot_num=1, timestamp=1758499199}, " +
"FitHsaConfigurationData{2025-09-22 01:59:59.000, data_size=1, timestamp=1758499199}, " +
"FitDiveApneaAlarm{2025-09-22 01:59:59.000, depth=1.0, time=1, enabled=true, alarm_type=1, sound=1, id=1, popup_enabled=true, trigger_on_descent=true, trigger_on_ascent=true, repeating=true, speed=1.0, message_index=1}, " +
"FitSkinTempOvernight{2025-09-22 01:59:59.000, local_timestamp=1, average_deviation=1.0, average_7_day_deviation=1.0, nightly_value=1.0, timestamp=1758499199}, " +
"FitHsaWristTemperatureData{2025-09-22 01:59:59.000, processing_interval=1, timestamp=1758499199}]";
TimeZone defaultTimeZone = TimeZone.getDefault();
TimeZone testTimeZone = TimeZone.getTimeZone("Europe/Zurich");
TimeZone.setDefault(testTimeZone);
try {
FitFile fitFile = FitFile.parseIncoming(fileContents);
String expected = expectedOutput.replace("}, Fit", "},\nFit").replace("}, RecordData{", "},\nRecordData{");
String actual = fitFile.toString().replace("}, Fit", "},\nFit").replace("}, RecordData{", "},\nRecordData{");
assertThat(actual, is(expected));
} finally {
TimeZone.setDefault(defaultTimeZone);
}
}
}