diff --git a/README.md b/README.md
index b221c59..e374072 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ The old version is archived as
and internal parts. (Still unstable and partially complete.)
* Proper documentation!
- [Available here](http://dtcooper.github.com/python-fitparse/).
+ [Available here](https://pythonhosted.org/fitparse/).
* Unit tests and example programs.
diff --git a/docs/index.rst b/docs/index.rst
index 78400e9..f261d0f 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -56,8 +56,7 @@ Requirements
The following are required to install :mod:`fitparse`,
-* `Python `_ 2.5 and above (Python 3 is currently not
- supported)
+* `Python `_ 2.5 and above
* The `argparse `_ is required for the
:command:`fitdump` command, but it is included in the Python standard library
diff --git a/fitparse/__init__.py b/fitparse/__init__.py
index 1bbc49e..e1f590e 100644
--- a/fitparse/__init__.py
+++ b/fitparse/__init__.py
@@ -3,7 +3,7 @@
from fitparse.processors import FitFileDataProcessor, StandardUnitsDataProcessor
-__version__ = '1.0.1'
+__version__ = '1.0.2'
__all__ = [
'FitFileDataProcessor', 'FitFile', 'FitParseError',
'StandardUnitsDataProcessor', 'DataMessage'
diff --git a/fitparse/profile.py b/fitparse/profile.py
index ad4fe6b..667bf1a 100644
--- a/fitparse/profile.py
+++ b/fitparse/profile.py
@@ -1,12074 +1,12134 @@
-
-# ***************** BEGIN AUTOMATICALLY GENERATED FIT PROFILE ******************
-# *************************** DO NOT EDIT THIS FILE ****************************
-# *********** EXPORTED PROFILE FROM SDK VERSION 20.66 ON 2018-07-18 ************
-# ********* PARSED 161 TYPES (2985 VALUES), 85 MESSAGES (1038 FIELDS) **********
-
-from fitparse.records import (
- ComponentField,
- Field,
- FieldType,
- MessageType,
- ReferenceField,
- SubField,
- BASE_TYPES,
-)
-
-
-FIELD_NUM_TIMESTAMP = 253
-
-
-FIELD_TYPES = {
- 'activity': FieldType(
- name='activity',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'manual',
- 1: 'auto_multi_sport',
- },
- ),
- 'activity_class': FieldType(
- name='activity_class',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 100: 'level_max',
- 0x7F: 'level', # 0 to 100
- 0x80: 'athlete',
- },
- ),
- 'activity_level': FieldType(
- name='activity_level',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'low',
- 1: 'medium',
- 2: 'high',
- },
- ),
- 'activity_subtype': FieldType(
- name='activity_subtype',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'generic',
- 1: 'treadmill', # Run
- 2: 'street', # Run
- 3: 'trail', # Run
- 4: 'track', # Run
- 5: 'spin', # Cycling
- 6: 'indoor_cycling', # Cycling
- 7: 'road', # Cycling
- 8: 'mountain', # Cycling
- 9: 'downhill', # Cycling
- 10: 'recumbent', # Cycling
- 11: 'cyclocross', # Cycling
- 12: 'hand_cycling', # Cycling
- 13: 'track_cycling', # Cycling
- 14: 'indoor_rowing', # Fitness Equipment
- 15: 'elliptical', # Fitness Equipment
- 16: 'stair_climbing', # Fitness Equipment
- 17: 'lap_swimming', # Swimming
- 18: 'open_water', # Swimming
- 254: 'all',
- },
- ),
- 'activity_type': FieldType(
- name='activity_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'generic',
- 1: 'running',
- 2: 'cycling',
- 3: 'transition', # Mulitsport transition
- 4: 'fitness_equipment',
- 5: 'swimming',
- 6: 'walking',
- 8: 'sedentary',
- 254: 'all', # All is for goals only to include all sports.
- },
- ),
- 'analog_watchface_layout': FieldType(
- name='analog_watchface_layout',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'minimal',
- 1: 'traditional',
- 2: 'modern',
- },
- ),
- 'ant_network': FieldType(
- name='ant_network',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'public',
- 1: 'antplus',
- 2: 'antfs',
- 3: 'private',
- },
- ),
- 'antplus_device_type': FieldType(
- name='antplus_device_type',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 1: 'antfs',
- 11: 'bike_power',
- 12: 'environment_sensor_legacy',
- 15: 'multi_sport_speed_distance',
- 16: 'control',
- 17: 'fitness_equipment',
- 18: 'blood_pressure',
- 19: 'geocache_node',
- 20: 'light_electric_vehicle',
- 25: 'env_sensor',
- 26: 'racquet',
- 27: 'control_hub',
- 31: 'muscle_oxygen',
- 35: 'bike_light_main',
- 36: 'bike_light_shared',
- 38: 'exd',
- 40: 'bike_radar',
- 119: 'weight_scale',
- 120: 'heart_rate',
- 121: 'bike_speed_cadence',
- 122: 'bike_cadence',
- 123: 'bike_speed',
- 124: 'stride_speed_distance',
- },
- ),
- 'attitude_stage': FieldType(
- name='attitude_stage',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'failed',
- 1: 'aligning',
- 2: 'degraded',
- 3: 'valid',
- },
- ),
- 'attitude_validity': FieldType(
- name='attitude_validity',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0x0001: 'track_angle_heading_valid',
- 0x0002: 'pitch_valid',
- 0x0004: 'roll_valid',
- 0x0008: 'lateral_body_accel_valid',
- 0x0010: 'normal_body_accel_valid',
- 0x0020: 'turn_rate_valid',
- 0x0040: 'hw_fail',
- 0x0080: 'mag_invalid',
- 0x0100: 'no_gps',
- 0x0200: 'gps_invalid',
- 0x0400: 'solution_coasting',
- 0x0800: 'true_track_angle',
- 0x1000: 'magnetic_heading',
- },
- ),
- 'auto_activity_detect': FieldType(
- name='auto_activity_detect',
- base_type=BASE_TYPES[0x86], # uint32
- values={
- 0x00000000: 'none',
- 0x00000001: 'running',
- 0x00000002: 'cycling',
- 0x00000004: 'swimming',
- 0x00000008: 'walking',
- 0x00000020: 'elliptical',
- 0x00000400: 'sedentary',
- },
- ),
- 'auto_sync_frequency': FieldType(
- name='auto_sync_frequency',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'never',
- 1: 'occasionally',
- 2: 'frequent',
- 3: 'once_a_day',
- 4: 'remote',
- },
- ),
- 'autolap_trigger': FieldType(
- name='autolap_trigger',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'time',
- 1: 'distance',
- 2: 'position_start',
- 3: 'position_lap',
- 4: 'position_waypoint',
- 5: 'position_marked',
- 6: 'off',
- },
- ),
- 'autoscroll': FieldType(
- name='autoscroll',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'none',
- 1: 'slow',
- 2: 'medium',
- 3: 'fast',
- },
- ),
- 'backlight_mode': FieldType(
- name='backlight_mode',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'off',
- 1: 'manual',
- 2: 'key_and_messages',
- 3: 'auto_brightness',
- 4: 'smart_notifications',
- 5: 'key_and_messages_night',
- 6: 'key_and_messages_and_smart_notifications',
- },
- ),
- 'backlight_timeout': FieldType( # Timeout in seconds.
- name='backlight_timeout',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 0: 'infinite', # Backlight stays on forever.
- },
- ),
- 'battery_status': FieldType(
- name='battery_status',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 1: 'new',
- 2: 'good',
- 3: 'ok',
- 4: 'low',
- 5: 'critical',
- 6: 'charging',
- 7: 'unknown',
- },
- ),
- 'bench_press_exercise_name': FieldType(
- name='bench_press_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'alternating_dumbbell_chest_press_on_swiss_ball',
- 1: 'barbell_bench_press',
- 2: 'barbell_board_bench_press',
- 3: 'barbell_floor_press',
- 4: 'close_grip_barbell_bench_press',
- 5: 'decline_dumbbell_bench_press',
- 6: 'dumbbell_bench_press',
- 7: 'dumbbell_floor_press',
- 8: 'incline_barbell_bench_press',
- 9: 'incline_dumbbell_bench_press',
- 10: 'incline_smith_machine_bench_press',
- 11: 'isometric_barbell_bench_press',
- 12: 'kettlebell_chest_press',
- 13: 'neutral_grip_dumbbell_bench_press',
- 14: 'neutral_grip_dumbbell_incline_bench_press',
- 15: 'one_arm_floor_press',
- 16: 'weighted_one_arm_floor_press',
- 17: 'partial_lockout',
- 18: 'reverse_grip_barbell_bench_press',
- 19: 'reverse_grip_incline_bench_press',
- 20: 'single_arm_cable_chest_press',
- 21: 'single_arm_dumbbell_bench_press',
- 22: 'smith_machine_bench_press',
- 23: 'swiss_ball_dumbbell_chest_press',
- 24: 'triple_stop_barbell_bench_press',
- 25: 'wide_grip_barbell_bench_press',
- 26: 'alternating_dumbbell_chest_press',
- },
- ),
- 'bike_light_beam_angle_mode': FieldType(
- name='bike_light_beam_angle_mode',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 0: 'manual',
- 1: 'auto',
- },
- ),
- 'bike_light_network_config_type': FieldType(
- name='bike_light_network_config_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'auto',
- 4: 'individual',
- 5: 'high_visibility',
- 6: 'trail',
- },
- ),
- 'body_location': FieldType(
- name='body_location',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'left_leg',
- 1: 'left_calf',
- 2: 'left_shin',
- 3: 'left_hamstring',
- 4: 'left_quad',
- 5: 'left_glute',
- 6: 'right_leg',
- 7: 'right_calf',
- 8: 'right_shin',
- 9: 'right_hamstring',
- 10: 'right_quad',
- 11: 'right_glute',
- 12: 'torso_back',
- 13: 'left_lower_back',
- 14: 'left_upper_back',
- 15: 'right_lower_back',
- 16: 'right_upper_back',
- 17: 'torso_front',
- 18: 'left_abdomen',
- 19: 'left_chest',
- 20: 'right_abdomen',
- 21: 'right_chest',
- 22: 'left_arm',
- 23: 'left_shoulder',
- 24: 'left_bicep',
- 25: 'left_tricep',
- 26: 'left_brachioradialis', # Left anterior forearm
- 27: 'left_forearm_extensors', # Left posterior forearm
- 28: 'right_arm',
- 29: 'right_shoulder',
- 30: 'right_bicep',
- 31: 'right_tricep',
- 32: 'right_brachioradialis', # Right anterior forearm
- 33: 'right_forearm_extensors', # Right posterior forearm
- 34: 'neck',
- 35: 'throat',
- 36: 'waist_mid_back',
- 37: 'waist_front',
- 38: 'waist_left',
- 39: 'waist_right',
- },
- ),
- 'bool': FieldType(
- name='bool',
- base_type=BASE_TYPES[0x00], # enum
- ),
- 'bp_status': FieldType(
- name='bp_status',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'no_error',
- 1: 'error_incomplete_data',
- 2: 'error_no_measurement',
- 3: 'error_data_out_of_range',
- 4: 'error_irregular_heart_rate',
- },
- ),
- 'calf_raise_exercise_name': FieldType(
- name='calf_raise_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: '3_way_calf_raise',
- 1: '3_way_weighted_calf_raise',
- 2: '3_way_single_leg_calf_raise',
- 3: '3_way_weighted_single_leg_calf_raise',
- 4: 'donkey_calf_raise',
- 5: 'weighted_donkey_calf_raise',
- 6: 'seated_calf_raise',
- 7: 'weighted_seated_calf_raise',
- 8: 'seated_dumbbell_toe_raise',
- 9: 'single_leg_bent_knee_calf_raise',
- 10: 'weighted_single_leg_bent_knee_calf_raise',
- 11: 'single_leg_decline_push_up',
- 12: 'single_leg_donkey_calf_raise',
- 13: 'weighted_single_leg_donkey_calf_raise',
- 14: 'single_leg_hip_raise_with_knee_hold',
- 15: 'single_leg_standing_calf_raise',
- 16: 'single_leg_standing_dumbbell_calf_raise',
- 17: 'standing_barbell_calf_raise',
- 18: 'standing_calf_raise',
- 19: 'weighted_standing_calf_raise',
- 20: 'standing_dumbbell_calf_raise',
- },
- ),
- 'camera_event_type': FieldType(
- name='camera_event_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'video_start', # Start of video recording
- 1: 'video_split', # Mark of video file split (end of one file, beginning of the other)
- 2: 'video_end', # End of video recording
- 3: 'photo_taken', # Still photo taken
- 4: 'video_second_stream_start',
- 5: 'video_second_stream_split',
- 6: 'video_second_stream_end',
- 7: 'video_split_start', # Mark of video file split start
- 8: 'video_second_stream_split_start',
- 11: 'video_pause', # Mark when a video recording has been paused
- 12: 'video_second_stream_pause',
- 13: 'video_resume', # Mark when a video recording has been resumed
- 14: 'video_second_stream_resume',
- },
- ),
- 'camera_orientation_type': FieldType(
- name='camera_orientation_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'camera_orientation_0',
- 1: 'camera_orientation_90',
- 2: 'camera_orientation_180',
- 3: 'camera_orientation_270',
- },
- ),
- 'cardio_exercise_name': FieldType(
- name='cardio_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'bob_and_weave_circle',
- 1: 'weighted_bob_and_weave_circle',
- 2: 'cardio_core_crawl',
- 3: 'weighted_cardio_core_crawl',
- 4: 'double_under',
- 5: 'weighted_double_under',
- 6: 'jump_rope',
- 7: 'weighted_jump_rope',
- 8: 'jump_rope_crossover',
- 9: 'weighted_jump_rope_crossover',
- 10: 'jump_rope_jog',
- 11: 'weighted_jump_rope_jog',
- 12: 'jumping_jacks',
- 13: 'weighted_jumping_jacks',
- 14: 'ski_moguls',
- 15: 'weighted_ski_moguls',
- 16: 'split_jacks',
- 17: 'weighted_split_jacks',
- 18: 'squat_jacks',
- 19: 'weighted_squat_jacks',
- 20: 'triple_under',
- 21: 'weighted_triple_under',
- },
- ),
- 'carry_exercise_name': FieldType(
- name='carry_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'bar_holds',
- 1: 'farmers_walk',
- 2: 'farmers_walk_on_toes',
- 3: 'hex_dumbbell_hold',
- 4: 'overhead_carry',
- },
- ),
- 'checksum': FieldType(
- name='checksum',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 0: 'clear', # Allows clear of checksum for flash memory where can only write 1 to 0 without erasing sector.
- 1: 'ok', # Set to mark checksum as valid if computes to invalid values 0 or 0xFF. Checksum can also be set to ok to save encoding computation time.
- },
- ),
- 'chop_exercise_name': FieldType(
- name='chop_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'cable_pull_through',
- 1: 'cable_rotational_lift',
- 2: 'cable_woodchop',
- 3: 'cross_chop_to_knee',
- 4: 'weighted_cross_chop_to_knee',
- 5: 'dumbbell_chop',
- 6: 'half_kneeling_rotation',
- 7: 'weighted_half_kneeling_rotation',
- 8: 'half_kneeling_rotational_chop',
- 9: 'half_kneeling_rotational_reverse_chop',
- 10: 'half_kneeling_stability_chop',
- 11: 'half_kneeling_stability_reverse_chop',
- 12: 'kneeling_rotational_chop',
- 13: 'kneeling_rotational_reverse_chop',
- 14: 'kneeling_stability_chop',
- 15: 'kneeling_woodchopper',
- 16: 'medicine_ball_wood_chops',
- 17: 'power_squat_chops',
- 18: 'weighted_power_squat_chops',
- 19: 'standing_rotational_chop',
- 20: 'standing_split_rotational_chop',
- 21: 'standing_split_rotational_reverse_chop',
- 22: 'standing_stability_reverse_chop',
- },
- ),
- 'comm_timeout_type': FieldType(
- name='comm_timeout_type',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'wildcard_pairing_timeout', # Timeout pairing to any device
- 1: 'pairing_timeout', # Timeout pairing to previously paired device
- 2: 'connection_lost', # Temporary loss of communications
- 3: 'connection_timeout', # Connection closed due to extended bad communications
- },
- ),
- 'connectivity_capabilities': FieldType(
- name='connectivity_capabilities',
- base_type=BASE_TYPES[0x8C], # uint32z
- values={
- 0x00000001: 'bluetooth',
- 0x00000002: 'bluetooth_le',
- 0x00000004: 'ant',
- 0x00000008: 'activity_upload',
- 0x00000010: 'course_download',
- 0x00000020: 'workout_download',
- 0x00000040: 'live_track',
- 0x00000080: 'weather_conditions',
- 0x00000100: 'weather_alerts',
- 0x00000200: 'gps_ephemeris_download',
- 0x00000400: 'explicit_archive',
- 0x00000800: 'setup_incomplete',
- 0x00001000: 'continue_sync_after_software_update',
- 0x00002000: 'connect_iq_app_download',
- 0x00004000: 'golf_course_download',
- 0x00008000: 'device_initiates_sync', # Indicates device is in control of initiating all syncs
- 0x00010000: 'connect_iq_watch_app_download',
- 0x00020000: 'connect_iq_widget_download',
- 0x00040000: 'connect_iq_watch_face_download',
- 0x00080000: 'connect_iq_data_field_download',
- 0x00100000: 'connect_iq_app_managment', # Device supports delete and reorder of apps via GCM
- 0x00200000: 'swing_sensor',
- 0x00400000: 'swing_sensor_remote',
- 0x00800000: 'incident_detection', # Device supports incident detection
- 0x01000000: 'audio_prompts',
- 0x02000000: 'wifi_verification', # Device supports reporting wifi verification via GCM
- 0x04000000: 'true_up', # Device supports True Up
- 0x08000000: 'find_my_watch', # Device supports Find My Watch
- 0x10000000: 'remote_manual_sync',
- 0x20000000: 'live_track_auto_start', # Device supports LiveTrack auto start
- 0x40000000: 'live_track_messaging', # Device supports LiveTrack Messaging
- 0x80000000: 'instant_input', # Device supports instant input feature
- },
- ),
- 'core_exercise_name': FieldType(
- name='core_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'abs_jabs',
- 1: 'weighted_abs_jabs',
- 2: 'alternating_plate_reach',
- 3: 'barbell_rollout',
- 4: 'weighted_barbell_rollout',
- 5: 'body_bar_oblique_twist',
- 6: 'cable_core_press',
- 7: 'cable_side_bend',
- 8: 'side_bend',
- 9: 'weighted_side_bend',
- 10: 'crescent_circle',
- 11: 'weighted_crescent_circle',
- 12: 'cycling_russian_twist',
- 13: 'weighted_cycling_russian_twist',
- 14: 'elevated_feet_russian_twist',
- 15: 'weighted_elevated_feet_russian_twist',
- 16: 'half_turkish_get_up',
- 17: 'kettlebell_windmill',
- 18: 'kneeling_ab_wheel',
- 19: 'weighted_kneeling_ab_wheel',
- 20: 'modified_front_lever',
- 21: 'open_knee_tucks',
- 22: 'weighted_open_knee_tucks',
- 23: 'side_abs_leg_lift',
- 24: 'weighted_side_abs_leg_lift',
- 25: 'swiss_ball_jackknife',
- 26: 'weighted_swiss_ball_jackknife',
- 27: 'swiss_ball_pike',
- 28: 'weighted_swiss_ball_pike',
- 29: 'swiss_ball_rollout',
- 30: 'weighted_swiss_ball_rollout',
- 31: 'triangle_hip_press',
- 32: 'weighted_triangle_hip_press',
- 33: 'trx_suspended_jackknife',
- 34: 'weighted_trx_suspended_jackknife',
- 35: 'u_boat',
- 36: 'weighted_u_boat',
- 37: 'windmill_switches',
- 38: 'weighted_windmill_switches',
- 39: 'alternating_slide_out',
- 40: 'weighted_alternating_slide_out',
- 41: 'ghd_back_extensions',
- 42: 'weighted_ghd_back_extensions',
- 43: 'overhead_walk',
- 44: 'inchworm',
- 45: 'weighted_modified_front_lever',
- },
- ),
- 'course_capabilities': FieldType(
- name='course_capabilities',
- base_type=BASE_TYPES[0x8C], # uint32z
- values={
- 0x00000001: 'processed',
- 0x00000002: 'valid',
- 0x00000004: 'time',
- 0x00000008: 'distance',
- 0x00000010: 'position',
- 0x00000020: 'heart_rate',
- 0x00000040: 'power',
- 0x00000080: 'cadence',
- 0x00000100: 'training',
- 0x00000200: 'navigation',
- 0x00000400: 'bikeway',
- },
- ),
- 'course_point': FieldType(
- name='course_point',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'generic',
- 1: 'summit',
- 2: 'valley',
- 3: 'water',
- 4: 'food',
- 5: 'danger',
- 6: 'left',
- 7: 'right',
- 8: 'straight',
- 9: 'first_aid',
- 10: 'fourth_category',
- 11: 'third_category',
- 12: 'second_category',
- 13: 'first_category',
- 14: 'hors_category',
- 15: 'sprint',
- 16: 'left_fork',
- 17: 'right_fork',
- 18: 'middle_fork',
- 19: 'slight_left',
- 20: 'sharp_left',
- 21: 'slight_right',
- 22: 'sharp_right',
- 23: 'u_turn',
- 24: 'segment_start',
- 25: 'segment_end',
- },
- ),
- 'crunch_exercise_name': FieldType(
- name='crunch_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'bicycle_crunch',
- 1: 'cable_crunch',
- 2: 'circular_arm_crunch',
- 3: 'crossed_arms_crunch',
- 4: 'weighted_crossed_arms_crunch',
- 5: 'cross_leg_reverse_crunch',
- 6: 'weighted_cross_leg_reverse_crunch',
- 7: 'crunch_chop',
- 8: 'weighted_crunch_chop',
- 9: 'double_crunch',
- 10: 'weighted_double_crunch',
- 11: 'elbow_to_knee_crunch',
- 12: 'weighted_elbow_to_knee_crunch',
- 13: 'flutter_kicks',
- 14: 'weighted_flutter_kicks',
- 15: 'foam_roller_reverse_crunch_on_bench',
- 16: 'weighted_foam_roller_reverse_crunch_on_bench',
- 17: 'foam_roller_reverse_crunch_with_dumbbell',
- 18: 'foam_roller_reverse_crunch_with_medicine_ball',
- 19: 'frog_press',
- 20: 'hanging_knee_raise_oblique_crunch',
- 21: 'weighted_hanging_knee_raise_oblique_crunch',
- 22: 'hip_crossover',
- 23: 'weighted_hip_crossover',
- 24: 'hollow_rock',
- 25: 'weighted_hollow_rock',
- 26: 'incline_reverse_crunch',
- 27: 'weighted_incline_reverse_crunch',
- 28: 'kneeling_cable_crunch',
- 29: 'kneeling_cross_crunch',
- 30: 'weighted_kneeling_cross_crunch',
- 31: 'kneeling_oblique_cable_crunch',
- 32: 'knees_to_elbow',
- 33: 'leg_extensions',
- 34: 'weighted_leg_extensions',
- 35: 'leg_levers',
- 36: 'mcgill_curl_up',
- 37: 'weighted_mcgill_curl_up',
- 38: 'modified_pilates_roll_up_with_ball',
- 39: 'weighted_modified_pilates_roll_up_with_ball',
- 40: 'pilates_crunch',
- 41: 'weighted_pilates_crunch',
- 42: 'pilates_roll_up_with_ball',
- 43: 'weighted_pilates_roll_up_with_ball',
- 44: 'raised_legs_crunch',
- 45: 'weighted_raised_legs_crunch',
- 46: 'reverse_crunch',
- 47: 'weighted_reverse_crunch',
- 48: 'reverse_crunch_on_a_bench',
- 49: 'weighted_reverse_crunch_on_a_bench',
- 50: 'reverse_curl_and_lift',
- 51: 'weighted_reverse_curl_and_lift',
- 52: 'rotational_lift',
- 53: 'weighted_rotational_lift',
- 54: 'seated_alternating_reverse_crunch',
- 55: 'weighted_seated_alternating_reverse_crunch',
- 56: 'seated_leg_u',
- 57: 'weighted_seated_leg_u',
- 58: 'side_to_side_crunch_and_weave',
- 59: 'weighted_side_to_side_crunch_and_weave',
- 60: 'single_leg_reverse_crunch',
- 61: 'weighted_single_leg_reverse_crunch',
- 62: 'skater_crunch_cross',
- 63: 'weighted_skater_crunch_cross',
- 64: 'standing_cable_crunch',
- 65: 'standing_side_crunch',
- 66: 'step_climb',
- 67: 'weighted_step_climb',
- 68: 'swiss_ball_crunch',
- 69: 'swiss_ball_reverse_crunch',
- 70: 'weighted_swiss_ball_reverse_crunch',
- 71: 'swiss_ball_russian_twist',
- 72: 'weighted_swiss_ball_russian_twist',
- 73: 'swiss_ball_side_crunch',
- 74: 'weighted_swiss_ball_side_crunch',
- 75: 'thoracic_crunches_on_foam_roller',
- 76: 'weighted_thoracic_crunches_on_foam_roller',
- 77: 'triceps_crunch',
- 78: 'weighted_bicycle_crunch',
- 79: 'weighted_crunch',
- 80: 'weighted_swiss_ball_crunch',
- 81: 'toes_to_bar',
- 82: 'weighted_toes_to_bar',
- 83: 'crunch',
- },
- ),
- 'curl_exercise_name': FieldType(
- name='curl_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'alternating_dumbbell_biceps_curl',
- 1: 'alternating_dumbbell_biceps_curl_on_swiss_ball',
- 2: 'alternating_incline_dumbbell_biceps_curl',
- 3: 'barbell_biceps_curl',
- 4: 'barbell_reverse_wrist_curl',
- 5: 'barbell_wrist_curl',
- 6: 'behind_the_back_barbell_reverse_wrist_curl',
- 7: 'behind_the_back_one_arm_cable_curl',
- 8: 'cable_biceps_curl',
- 9: 'cable_hammer_curl',
- 10: 'cheating_barbell_biceps_curl',
- 11: 'close_grip_ez_bar_biceps_curl',
- 12: 'cross_body_dumbbell_hammer_curl',
- 13: 'dead_hang_biceps_curl',
- 14: 'decline_hammer_curl',
- 15: 'dumbbell_biceps_curl_with_static_hold',
- 16: 'dumbbell_hammer_curl',
- 17: 'dumbbell_reverse_wrist_curl',
- 18: 'dumbbell_wrist_curl',
- 19: 'ez_bar_preacher_curl',
- 20: 'forward_bend_biceps_curl',
- 21: 'hammer_curl_to_press',
- 22: 'incline_dumbbell_biceps_curl',
- 23: 'incline_offset_thumb_dumbbell_curl',
- 24: 'kettlebell_biceps_curl',
- 25: 'lying_concentration_cable_curl',
- 26: 'one_arm_preacher_curl',
- 27: 'plate_pinch_curl',
- 28: 'preacher_curl_with_cable',
- 29: 'reverse_ez_bar_curl',
- 30: 'reverse_grip_wrist_curl',
- 31: 'reverse_grip_barbell_biceps_curl',
- 32: 'seated_alternating_dumbbell_biceps_curl',
- 33: 'seated_dumbbell_biceps_curl',
- 34: 'seated_reverse_dumbbell_curl',
- 35: 'split_stance_offset_pinky_dumbbell_curl',
- 36: 'standing_alternating_dumbbell_curls',
- 37: 'standing_dumbbell_biceps_curl',
- 38: 'standing_ez_bar_biceps_curl',
- 39: 'static_curl',
- 40: 'swiss_ball_dumbbell_overhead_triceps_extension',
- 41: 'swiss_ball_ez_bar_preacher_curl',
- 42: 'twisting_standing_dumbbell_biceps_curl',
- 43: 'wide_grip_ez_bar_biceps_curl',
- },
- ),
- 'date_mode': FieldType(
- name='date_mode',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'day_month',
- 1: 'month_day',
- },
- ),
- 'date_time': FieldType( # seconds since UTC 00:00 Dec 31 1989
- name='date_time',
- base_type=BASE_TYPES[0x86], # uint32
- ),
- 'day_of_week': FieldType(
- name='day_of_week',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'sunday',
- 1: 'monday',
- 2: 'tuesday',
- 3: 'wednesday',
- 4: 'thursday',
- 5: 'friday',
- 6: 'saturday',
- },
- ),
- 'deadlift_exercise_name': FieldType(
- name='deadlift_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'barbell_deadlift',
- 1: 'barbell_straight_leg_deadlift',
- 2: 'dumbbell_deadlift',
- 3: 'dumbbell_single_leg_deadlift_to_row',
- 4: 'dumbbell_straight_leg_deadlift',
- 5: 'kettlebell_floor_to_shelf',
- 6: 'one_arm_one_leg_deadlift',
- 7: 'rack_pull',
- 8: 'rotational_dumbbell_straight_leg_deadlift',
- 9: 'single_arm_deadlift',
- 10: 'single_leg_barbell_deadlift',
- 11: 'single_leg_barbell_straight_leg_deadlift',
- 12: 'single_leg_deadlift_with_barbell',
- 13: 'single_leg_rdl_circuit',
- 14: 'single_leg_romanian_deadlift_with_dumbbell',
- 15: 'sumo_deadlift',
- 16: 'sumo_deadlift_high_pull',
- 17: 'trap_bar_deadlift',
- 18: 'wide_grip_barbell_deadlift',
- },
- ),
- 'device_index': FieldType(
- name='device_index',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 0: 'creator', # Creator of the file is always device index 0.
- },
- ),
- 'digital_watchface_layout': FieldType(
- name='digital_watchface_layout',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'traditional',
- 1: 'modern',
- 2: 'bold',
- },
- ),
- 'display_heart': FieldType(
- name='display_heart',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'bpm',
- 1: 'max',
- 2: 'reserve',
- },
- ),
- 'display_measure': FieldType(
- name='display_measure',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'metric',
- 1: 'statute',
- 2: 'nautical',
- },
- ),
- 'display_orientation': FieldType(
- name='display_orientation',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'auto', # automatic if the device supports it
- 1: 'portrait',
- 2: 'landscape',
- 3: 'portrait_flipped', # portrait mode but rotated 180 degrees
- 4: 'landscape_flipped', # landscape mode but rotated 180 degrees
- },
- ),
- 'display_position': FieldType(
- name='display_position',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'degree', # dd.dddddd
- 1: 'degree_minute', # dddmm.mmm
- 2: 'degree_minute_second', # dddmmss
- 3: 'austrian_grid', # Austrian Grid (BMN)
- 4: 'british_grid', # British National Grid
- 5: 'dutch_grid', # Dutch grid system
- 6: 'hungarian_grid', # Hungarian grid system
- 7: 'finnish_grid', # Finnish grid system Zone3 KKJ27
- 8: 'german_grid', # Gausss Krueger (German)
- 9: 'icelandic_grid', # Icelandic Grid
- 10: 'indonesian_equatorial', # Indonesian Equatorial LCO
- 11: 'indonesian_irian', # Indonesian Irian LCO
- 12: 'indonesian_southern', # Indonesian Southern LCO
- 13: 'india_zone_0', # India zone 0
- 14: 'india_zone_IA', # India zone IA
- 15: 'india_zone_IB', # India zone IB
- 16: 'india_zone_IIA', # India zone IIA
- 17: 'india_zone_IIB', # India zone IIB
- 18: 'india_zone_IIIA', # India zone IIIA
- 19: 'india_zone_IIIB', # India zone IIIB
- 20: 'india_zone_IVA', # India zone IVA
- 21: 'india_zone_IVB', # India zone IVB
- 22: 'irish_transverse', # Irish Transverse Mercator
- 23: 'irish_grid', # Irish Grid
- 24: 'loran', # Loran TD
- 25: 'maidenhead_grid', # Maidenhead grid system
- 26: 'mgrs_grid', # MGRS grid system
- 27: 'new_zealand_grid', # New Zealand grid system
- 28: 'new_zealand_transverse', # New Zealand Transverse Mercator
- 29: 'qatar_grid', # Qatar National Grid
- 30: 'modified_swedish_grid', # Modified RT-90 (Sweden)
- 31: 'swedish_grid', # RT-90 (Sweden)
- 32: 'south_african_grid', # South African Grid
- 33: 'swiss_grid', # Swiss CH-1903 grid
- 34: 'taiwan_grid', # Taiwan Grid
- 35: 'united_states_grid', # United States National Grid
- 36: 'utm_ups_grid', # UTM/UPS grid system
- 37: 'west_malayan', # West Malayan RSO
- 38: 'borneo_rso', # Borneo RSO
- 39: 'estonian_grid', # Estonian grid system
- 40: 'latvian_grid', # Latvian Transverse Mercator
- 41: 'swedish_ref_99_grid', # Reference Grid 99 TM (Swedish)
- },
- ),
- 'display_power': FieldType(
- name='display_power',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'watts',
- 1: 'percent_ftp',
- },
- ),
- 'dive_alarm_type': FieldType(
- name='dive_alarm_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'depth',
- 1: 'time',
- },
- ),
- 'dive_backlight_mode': FieldType(
- name='dive_backlight_mode',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'at_depth',
- 1: 'always_on',
- },
- ),
- 'dive_gas_status': FieldType(
- name='dive_gas_status',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'disabled',
- 1: 'enabled',
- 2: 'backup_only',
- },
- ),
- 'event': FieldType(
- name='event',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'timer', # Group 0. Start / stop_all
- 3: 'workout', # start / stop
- 4: 'workout_step', # Start at beginning of workout. Stop at end of each step.
- 5: 'power_down', # stop_all group 0
- 6: 'power_up', # stop_all group 0
- 7: 'off_course', # start / stop group 0
- 8: 'session', # Stop at end of each session.
- 9: 'lap', # Stop at end of each lap.
- 10: 'course_point', # marker
- 11: 'battery', # marker
- 12: 'virtual_partner_pace', # Group 1. Start at beginning of activity if VP enabled, when VP pace is changed during activity or VP enabled mid activity. stop_disable when VP disabled.
- 13: 'hr_high_alert', # Group 0. Start / stop when in alert condition.
- 14: 'hr_low_alert', # Group 0. Start / stop when in alert condition.
- 15: 'speed_high_alert', # Group 0. Start / stop when in alert condition.
- 16: 'speed_low_alert', # Group 0. Start / stop when in alert condition.
- 17: 'cad_high_alert', # Group 0. Start / stop when in alert condition.
- 18: 'cad_low_alert', # Group 0. Start / stop when in alert condition.
- 19: 'power_high_alert', # Group 0. Start / stop when in alert condition.
- 20: 'power_low_alert', # Group 0. Start / stop when in alert condition.
- 21: 'recovery_hr', # marker
- 22: 'battery_low', # marker
- 23: 'time_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled.
- 24: 'distance_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled.
- 25: 'calorie_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled.
- 26: 'activity', # Group 1.. Stop at end of activity.
- 27: 'fitness_equipment', # marker
- 28: 'length', # Stop at end of each length.
- 32: 'user_marker', # marker
- 33: 'sport_point', # marker
- 36: 'calibration', # start/stop/marker
- 42: 'front_gear_change', # marker
- 43: 'rear_gear_change', # marker
- 44: 'rider_position_change', # marker
- 45: 'elev_high_alert', # Group 0. Start / stop when in alert condition.
- 46: 'elev_low_alert', # Group 0. Start / stop when in alert condition.
- 47: 'comm_timeout', # marker
- },
- ),
- 'event_type': FieldType(
- name='event_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'start',
- 1: 'stop',
- 2: 'consecutive_depreciated',
- 3: 'marker',
- 4: 'stop_all',
- 5: 'begin_depreciated',
- 6: 'end_depreciated',
- 7: 'end_all_depreciated',
- 8: 'stop_disable',
- 9: 'stop_disable_all',
- },
- ),
- 'exd_data_units': FieldType(
- name='exd_data_units',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'no_units',
- 1: 'laps',
- 2: 'miles_per_hour',
- 3: 'kilometers_per_hour',
- 4: 'feet_per_hour',
- 5: 'meters_per_hour',
- 6: 'degrees_celsius',
- 7: 'degrees_farenheit',
- 8: 'zone',
- 9: 'gear',
- 10: 'rpm',
- 11: 'bpm',
- 12: 'degrees',
- 13: 'millimeters',
- 14: 'meters',
- 15: 'kilometers',
- 16: 'feet',
- 17: 'yards',
- 18: 'kilofeet',
- 19: 'miles',
- 20: 'time',
- 21: 'enum_turn_type',
- 22: 'percent',
- 23: 'watts',
- 24: 'watts_per_kilogram',
- 25: 'enum_battery_status',
- 26: 'enum_bike_light_beam_angle_mode',
- 27: 'enum_bike_light_battery_status',
- 28: 'enum_bike_light_network_config_type',
- 29: 'lights',
- 30: 'seconds',
- 31: 'minutes',
- 32: 'hours',
- 33: 'calories',
- 34: 'kilojoules',
- 35: 'milliseconds',
- 36: 'second_per_mile',
- 37: 'second_per_kilometer',
- 38: 'centimeter',
- 39: 'enum_course_point',
- 40: 'bradians',
- 41: 'enum_sport',
- 42: 'inches_hg',
- 43: 'mm_hg',
- 44: 'mbars',
- 45: 'hecto_pascals',
- 46: 'feet_per_min',
- 47: 'meters_per_min',
- 48: 'meters_per_sec',
- 49: 'eight_cardinal',
- },
- ),
- 'exd_descriptors': FieldType(
- name='exd_descriptors',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'bike_light_battery_status',
- 1: 'beam_angle_status',
- 2: 'batery_level',
- 3: 'light_network_mode',
- 4: 'number_lights_connected',
- 5: 'cadence',
- 6: 'distance',
- 7: 'estimated_time_of_arrival',
- 8: 'heading',
- 9: 'time',
- 10: 'battery_level',
- 11: 'trainer_resistance',
- 12: 'trainer_target_power',
- 13: 'time_seated',
- 14: 'time_standing',
- 15: 'elevation',
- 16: 'grade',
- 17: 'ascent',
- 18: 'descent',
- 19: 'vertical_speed',
- 20: 'di2_battery_level',
- 21: 'front_gear',
- 22: 'rear_gear',
- 23: 'gear_ratio',
- 24: 'heart_rate',
- 25: 'heart_rate_zone',
- 26: 'time_in_heart_rate_zone',
- 27: 'heart_rate_reserve',
- 28: 'calories',
- 29: 'gps_accuracy',
- 30: 'gps_signal_strength',
- 31: 'temperature',
- 32: 'time_of_day',
- 33: 'balance',
- 34: 'pedal_smoothness',
- 35: 'power',
- 36: 'functional_threshold_power',
- 37: 'intensity_factor',
- 38: 'work',
- 39: 'power_ratio',
- 40: 'normalized_power',
- 41: 'training_stress_Score',
- 42: 'time_on_zone',
- 43: 'speed',
- 44: 'laps',
- 45: 'reps',
- 46: 'workout_step',
- 47: 'course_distance',
- 48: 'navigation_distance',
- 49: 'course_estimated_time_of_arrival',
- 50: 'navigation_estimated_time_of_arrival',
- 51: 'course_time',
- 52: 'navigation_time',
- 53: 'course_heading',
- 54: 'navigation_heading',
- 55: 'power_zone',
- 56: 'torque_effectiveness',
- 57: 'timer_time',
- 58: 'power_weight_ratio',
- 59: 'left_platform_center_offset',
- 60: 'right_platform_center_offset',
- 61: 'left_power_phase_start_angle',
- 62: 'right_power_phase_start_angle',
- 63: 'left_power_phase_finish_angle',
- 64: 'right_power_phase_finish_angle',
- 65: 'gears', # Combined gear information
- 66: 'pace',
- 67: 'training_effect',
- 68: 'vertical_oscillation',
- 69: 'vertical_ratio',
- 70: 'ground_contact_time',
- 71: 'left_ground_contact_time_balance',
- 72: 'right_ground_contact_time_balance',
- 73: 'stride_length',
- 74: 'running_cadence',
- 75: 'performance_condition',
- 76: 'course_type',
- 77: 'time_in_power_zone',
- 78: 'navigation_turn',
- 79: 'course_location',
- 80: 'navigation_location',
- 81: 'compass',
- 82: 'gear_combo',
- 83: 'muscle_oxygen',
- 84: 'icon',
- 85: 'compass_heading',
- 86: 'gps_heading',
- 87: 'gps_elevation',
- 88: 'anaerobic_training_effect',
- 89: 'course',
- 90: 'off_course',
- 91: 'glide_ratio',
- 92: 'vertical_distance',
- 93: 'vmg',
- 94: 'ambient_pressure',
- 95: 'pressure',
- 96: 'vam',
- },
- ),
- 'exd_display_type': FieldType(
- name='exd_display_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'numerical',
- 1: 'simple',
- 2: 'graph',
- 3: 'bar',
- 4: 'circle_graph',
- 5: 'virtual_partner',
- 6: 'balance',
- 7: 'string_list',
- 8: 'string',
- 9: 'simple_dynamic_icon',
- 10: 'gauge',
- },
- ),
- 'exd_layout': FieldType(
- name='exd_layout',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'full_screen',
- 1: 'half_vertical',
- 2: 'half_horizontal',
- 3: 'half_vertical_right_split',
- 4: 'half_horizontal_bottom_split',
- 5: 'full_quarter_split',
- 6: 'half_vertical_left_split',
- 7: 'half_horizontal_top_split',
- },
- ),
- 'exd_qualifiers': FieldType(
- name='exd_qualifiers',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'no_qualifier',
- 1: 'instantaneous',
- 2: 'average',
- 3: 'lap',
- 4: 'maximum',
- 5: 'maximum_average',
- 6: 'maximum_lap',
- 7: 'last_lap',
- 8: 'average_lap',
- 9: 'to_destination',
- 10: 'to_go',
- 11: 'to_next',
- 12: 'next_course_point',
- 13: 'total',
- 14: 'three_second_average',
- 15: 'ten_second_average',
- 16: 'thirty_second_average',
- 17: 'percent_maximum',
- 18: 'percent_maximum_average',
- 19: 'lap_percent_maximum',
- 20: 'elapsed',
- 21: 'sunrise',
- 22: 'sunset',
- 23: 'compared_to_virtual_partner',
- 24: 'maximum_24h',
- 25: 'minimum_24h',
- 26: 'minimum',
- 27: 'first',
- 28: 'second',
- 29: 'third',
- 30: 'shifter',
- 31: 'last_sport',
- 32: 'moving',
- 33: 'stopped',
- 34: 'estimated_total',
- 242: 'zone_9',
- 243: 'zone_8',
- 244: 'zone_7',
- 245: 'zone_6',
- 246: 'zone_5',
- 247: 'zone_4',
- 248: 'zone_3',
- 249: 'zone_2',
- 250: 'zone_1',
- },
- ),
- 'exercise_category': FieldType(
- name='exercise_category',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'bench_press',
- 1: 'calf_raise',
- 2: 'cardio',
- 3: 'carry',
- 4: 'chop',
- 5: 'core',
- 6: 'crunch',
- 7: 'curl',
- 8: 'deadlift',
- 9: 'flye',
- 10: 'hip_raise',
- 11: 'hip_stability',
- 12: 'hip_swing',
- 13: 'hyperextension',
- 14: 'lateral_raise',
- 15: 'leg_curl',
- 16: 'leg_raise',
- 17: 'lunge',
- 18: 'olympic_lift',
- 19: 'plank',
- 20: 'plyo',
- 21: 'pull_up',
- 22: 'push_up',
- 23: 'row',
- 24: 'shoulder_press',
- 25: 'shoulder_stability',
- 26: 'shrug',
- 27: 'sit_up',
- 28: 'squat',
- 29: 'total_body',
- 30: 'triceps_extension',
- 31: 'warm_up',
- 32: 'run',
- 65534: 'unknown',
- },
- ),
- 'file': FieldType(
- name='file',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 1: 'device', # Read only, single file. Must be in root directory.
- 2: 'settings', # Read/write, single file. Directory=Settings
- 3: 'sport', # Read/write, multiple files, file number = sport type. Directory=Sports
- 4: 'activity', # Read/erase, multiple files. Directory=Activities
- 5: 'workout', # Read/write/erase, multiple files. Directory=Workouts
- 6: 'course', # Read/write/erase, multiple files. Directory=Courses
- 7: 'schedules', # Read/write, single file. Directory=Schedules
- 9: 'weight', # Read only, single file. Circular buffer. All message definitions at start of file. Directory=Weight
- 10: 'totals', # Read only, single file. Directory=Totals
- 11: 'goals', # Read/write, single file. Directory=Goals
- 14: 'blood_pressure', # Read only. Directory=Blood Pressure
- 15: 'monitoring_a', # Read only. Directory=Monitoring. File number=sub type.
- 20: 'activity_summary', # Read/erase, multiple files. Directory=Activities
- 28: 'monitoring_daily',
- 32: 'monitoring_b', # Read only. Directory=Monitoring. File number=identifier
- 34: 'segment', # Read/write/erase. Multiple Files. Directory=Segments
- 35: 'segment_list', # Read/write/erase. Single File. Directory=Segments
- 40: 'exd_configuration', # Read/write/erase. Single File. Directory=Settings
- 0xF7: 'mfg_range_min', # 0xF7 - 0xFE reserved for manufacturer specific file types
- 0xFE: 'mfg_range_max', # 0xF7 - 0xFE reserved for manufacturer specific file types
- },
- ),
- 'file_flags': FieldType(
- name='file_flags',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x02: 'read',
- 0x04: 'write',
- 0x08: 'erase',
- },
- ),
- 'fit_base_type': FieldType(
- name='fit_base_type',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 0: 'enum',
- 1: 'sint8',
- 2: 'uint8',
- 7: 'string',
- 10: 'uint8z',
- 13: 'byte',
- 131: 'sint16',
- 132: 'uint16',
- 133: 'sint32',
- 134: 'uint32',
- 136: 'float32',
- 137: 'float64',
- 139: 'uint16z',
- 140: 'uint32z',
- 142: 'sint64',
- 143: 'uint64',
- 144: 'uint64z',
- },
- ),
- 'fit_base_unit': FieldType(
- name='fit_base_unit',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'other',
- 1: 'kilogram',
- 2: 'pound',
- },
- ),
- 'fitness_equipment_state': FieldType( # fitness equipment event data
- name='fitness_equipment_state',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'ready',
- 1: 'in_use',
- 2: 'paused',
- 3: 'unknown', # lost connection to fitness equipment
- },
- ),
- 'flye_exercise_name': FieldType(
- name='flye_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'cable_crossover',
- 1: 'decline_dumbbell_flye',
- 2: 'dumbbell_flye',
- 3: 'incline_dumbbell_flye',
- 4: 'kettlebell_flye',
- 5: 'kneeling_rear_flye',
- 6: 'single_arm_standing_cable_reverse_flye',
- 7: 'swiss_ball_dumbbell_flye',
- },
- ),
- 'garmin_product': FieldType(
- name='garmin_product',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 1: 'hrm1',
- 2: 'axh01', # AXH01 HRM chipset
- 3: 'axb01',
- 4: 'axb02',
- 5: 'hrm2ss',
- 6: 'dsi_alf02',
- 7: 'hrm3ss',
- 8: 'hrm_run_single_byte_product_id', # hrm_run model for HRM ANT+ messaging
- 9: 'bsm', # BSM model for ANT+ messaging
- 10: 'bcm', # BCM model for ANT+ messaging
- 11: 'axs01', # AXS01 HRM Bike Chipset model for ANT+ messaging
- 12: 'hrm_tri_single_byte_product_id', # hrm_tri model for HRM ANT+ messaging
- 14: 'fr225_single_byte_product_id', # fr225 model for HRM ANT+ messaging
- 473: 'fr301_china',
- 474: 'fr301_japan',
- 475: 'fr301_korea',
- 494: 'fr301_taiwan',
- 717: 'fr405', # Forerunner 405
- 782: 'fr50', # Forerunner 50
- 987: 'fr405_japan',
- 988: 'fr60', # Forerunner 60
- 1011: 'dsi_alf01',
- 1018: 'fr310xt', # Forerunner 310
- 1036: 'edge500',
- 1124: 'fr110', # Forerunner 110
- 1169: 'edge800',
- 1199: 'edge500_taiwan',
- 1213: 'edge500_japan',
- 1253: 'chirp',
- 1274: 'fr110_japan',
- 1325: 'edge200',
- 1328: 'fr910xt',
- 1333: 'edge800_taiwan',
- 1334: 'edge800_japan',
- 1341: 'alf04',
- 1345: 'fr610',
- 1360: 'fr210_japan',
- 1380: 'vector_ss',
- 1381: 'vector_cp',
- 1386: 'edge800_china',
- 1387: 'edge500_china',
- 1410: 'fr610_japan',
- 1422: 'edge500_korea',
- 1436: 'fr70',
- 1446: 'fr310xt_4t',
- 1461: 'amx',
- 1482: 'fr10',
- 1497: 'edge800_korea',
- 1499: 'swim',
- 1537: 'fr910xt_china',
- 1551: 'fenix',
- 1555: 'edge200_taiwan',
- 1561: 'edge510',
- 1567: 'edge810',
- 1570: 'tempe',
- 1600: 'fr910xt_japan',
- 1623: 'fr620',
- 1632: 'fr220',
- 1664: 'fr910xt_korea',
- 1688: 'fr10_japan',
- 1721: 'edge810_japan',
- 1735: 'virb_elite',
- 1736: 'edge_touring', # Also Edge Touring Plus
- 1742: 'edge510_japan',
- 1743: 'hrm_tri',
- 1752: 'hrm_run',
- 1765: 'fr920xt',
- 1821: 'edge510_asia',
- 1822: 'edge810_china',
- 1823: 'edge810_taiwan',
- 1836: 'edge1000',
- 1837: 'vivo_fit',
- 1853: 'virb_remote',
- 1885: 'vivo_ki',
- 1903: 'fr15',
- 1907: 'vivo_active',
- 1918: 'edge510_korea',
- 1928: 'fr620_japan',
- 1929: 'fr620_china',
- 1930: 'fr220_japan',
- 1931: 'fr220_china',
- 1936: 'approach_s6',
- 1956: 'vivo_smart',
- 1967: 'fenix2',
- 1988: 'epix',
- 2050: 'fenix3',
- 2052: 'edge1000_taiwan',
- 2053: 'edge1000_japan',
- 2061: 'fr15_japan',
- 2067: 'edge520',
- 2070: 'edge1000_china',
- 2072: 'fr620_russia',
- 2073: 'fr220_russia',
- 2079: 'vector_s',
- 2100: 'edge1000_korea',
- 2130: 'fr920xt_taiwan',
- 2131: 'fr920xt_china',
- 2132: 'fr920xt_japan',
- 2134: 'virbx',
- 2135: 'vivo_smart_apac',
- 2140: 'etrex_touch',
- 2147: 'edge25',
- 2148: 'fr25',
- 2150: 'vivo_fit2',
- 2153: 'fr225',
- 2156: 'fr630',
- 2157: 'fr230',
- 2160: 'vivo_active_apac',
- 2161: 'vector_2',
- 2162: 'vector_2s',
- 2172: 'virbxe',
- 2173: 'fr620_taiwan',
- 2174: 'fr220_taiwan',
- 2175: 'truswing',
- 2188: 'fenix3_china',
- 2189: 'fenix3_twn',
- 2192: 'varia_headlight',
- 2193: 'varia_taillight_old',
- 2204: 'edge_explore_1000',
- 2219: 'fr225_asia',
- 2225: 'varia_radar_taillight',
- 2226: 'varia_radar_display',
- 2238: 'edge20',
- 2262: 'd2_bravo',
- 2266: 'approach_s20',
- 2276: 'varia_remote',
- 2327: 'hrm4_run',
- 2337: 'vivo_active_hr',
- 2347: 'vivo_smart_gps_hr',
- 2348: 'vivo_smart_hr',
- 2368: 'vivo_move',
- 2398: 'varia_vision',
- 2406: 'vivo_fit3',
- 2413: 'fenix3_hr',
- 2417: 'virb_ultra_30',
- 2429: 'index_smart_scale',
- 2431: 'fr235',
- 2432: 'fenix3_chronos',
- 2441: 'oregon7xx',
- 2444: 'rino7xx',
- 2496: 'nautix',
- 2530: 'edge_820',
- 2531: 'edge_explore_820',
- 2544: 'fenix5s',
- 2547: 'd2_bravo_titanium',
- 2567: 'varia_ut800', # Varia UT 800 SW
- 2593: 'running_dynamics_pod',
- 2604: 'fenix5x',
- 2606: 'vivo_fit_jr',
- 2691: 'fr935',
- 2697: 'fenix5',
- 10007: 'sdm4', # SDM4 footpod
- 10014: 'edge_remote',
- 20119: 'training_center',
- 65531: 'connectiq_simulator',
- 65532: 'android_antplus_plugin',
- 65534: 'connect', # Garmin Connect website
- },
- ),
- 'gender': FieldType(
- name='gender',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'female',
- 1: 'male',
- },
- ),
- 'goal': FieldType(
- name='goal',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'time',
- 1: 'distance',
- 2: 'calories',
- 3: 'frequency',
- 4: 'steps',
- 5: 'ascent',
- 6: 'active_minutes',
- },
- ),
- 'goal_recurrence': FieldType(
- name='goal_recurrence',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'off',
- 1: 'daily',
- 2: 'weekly',
- 3: 'monthly',
- 4: 'yearly',
- 5: 'custom',
- },
- ),
- 'goal_source': FieldType(
- name='goal_source',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'auto', # Device generated
- 1: 'community', # Social network sourced goal
- 2: 'user', # Manually generated
- },
- ),
- 'hip_raise_exercise_name': FieldType(
- name='hip_raise_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'barbell_hip_thrust_on_floor',
- 1: 'barbell_hip_thrust_with_bench',
- 2: 'bent_knee_swiss_ball_reverse_hip_raise',
- 3: 'weighted_bent_knee_swiss_ball_reverse_hip_raise',
- 4: 'bridge_with_leg_extension',
- 5: 'weighted_bridge_with_leg_extension',
- 6: 'clam_bridge',
- 7: 'front_kick_tabletop',
- 8: 'weighted_front_kick_tabletop',
- 9: 'hip_extension_and_cross',
- 10: 'weighted_hip_extension_and_cross',
- 11: 'hip_raise',
- 12: 'weighted_hip_raise',
- 13: 'hip_raise_with_feet_on_swiss_ball',
- 14: 'weighted_hip_raise_with_feet_on_swiss_ball',
- 15: 'hip_raise_with_head_on_bosu_ball',
- 16: 'weighted_hip_raise_with_head_on_bosu_ball',
- 17: 'hip_raise_with_head_on_swiss_ball',
- 18: 'weighted_hip_raise_with_head_on_swiss_ball',
- 19: 'hip_raise_with_knee_squeeze',
- 20: 'weighted_hip_raise_with_knee_squeeze',
- 21: 'incline_rear_leg_extension',
- 22: 'weighted_incline_rear_leg_extension',
- 23: 'kettlebell_swing',
- 24: 'marching_hip_raise',
- 25: 'weighted_marching_hip_raise',
- 26: 'marching_hip_raise_with_feet_on_a_swiss_ball',
- 27: 'weighted_marching_hip_raise_with_feet_on_a_swiss_ball',
- 28: 'reverse_hip_raise',
- 29: 'weighted_reverse_hip_raise',
- 30: 'single_leg_hip_raise',
- 31: 'weighted_single_leg_hip_raise',
- 32: 'single_leg_hip_raise_with_foot_on_bench',
- 33: 'weighted_single_leg_hip_raise_with_foot_on_bench',
- 34: 'single_leg_hip_raise_with_foot_on_bosu_ball',
- 35: 'weighted_single_leg_hip_raise_with_foot_on_bosu_ball',
- 36: 'single_leg_hip_raise_with_foot_on_foam_roller',
- 37: 'weighted_single_leg_hip_raise_with_foot_on_foam_roller',
- 38: 'single_leg_hip_raise_with_foot_on_medicine_ball',
- 39: 'weighted_single_leg_hip_raise_with_foot_on_medicine_ball',
- 40: 'single_leg_hip_raise_with_head_on_bosu_ball',
- 41: 'weighted_single_leg_hip_raise_with_head_on_bosu_ball',
- 42: 'weighted_clam_bridge',
- },
- ),
- 'hip_stability_exercise_name': FieldType(
- name='hip_stability_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'band_side_lying_leg_raise',
- 1: 'dead_bug',
- 2: 'weighted_dead_bug',
- 3: 'external_hip_raise',
- 4: 'weighted_external_hip_raise',
- 5: 'fire_hydrant_kicks',
- 6: 'weighted_fire_hydrant_kicks',
- 7: 'hip_circles',
- 8: 'weighted_hip_circles',
- 9: 'inner_thigh_lift',
- 10: 'weighted_inner_thigh_lift',
- 11: 'lateral_walks_with_band_at_ankles',
- 12: 'pretzel_side_kick',
- 13: 'weighted_pretzel_side_kick',
- 14: 'prone_hip_internal_rotation',
- 15: 'weighted_prone_hip_internal_rotation',
- 16: 'quadruped',
- 17: 'quadruped_hip_extension',
- 18: 'weighted_quadruped_hip_extension',
- 19: 'quadruped_with_leg_lift',
- 20: 'weighted_quadruped_with_leg_lift',
- 21: 'side_lying_leg_raise',
- 22: 'weighted_side_lying_leg_raise',
- 23: 'sliding_hip_adduction',
- 24: 'weighted_sliding_hip_adduction',
- 25: 'standing_adduction',
- 26: 'weighted_standing_adduction',
- 27: 'standing_cable_hip_abduction',
- 28: 'standing_hip_abduction',
- 29: 'weighted_standing_hip_abduction',
- 30: 'standing_rear_leg_raise',
- 31: 'weighted_standing_rear_leg_raise',
- 32: 'supine_hip_internal_rotation',
- 33: 'weighted_supine_hip_internal_rotation',
- },
- ),
- 'hip_swing_exercise_name': FieldType(
- name='hip_swing_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'single_arm_kettlebell_swing',
- 1: 'single_arm_dumbbell_swing',
- 2: 'step_out_swing',
- },
- ),
- 'hr_type': FieldType(
- name='hr_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'normal',
- 1: 'irregular',
- },
- ),
- 'hr_zone_calc': FieldType(
- name='hr_zone_calc',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'custom',
- 1: 'percent_max_hr',
- 2: 'percent_hrr',
- },
- ),
- 'hyperextension_exercise_name': FieldType(
- name='hyperextension_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'back_extension_with_opposite_arm_and_leg_reach',
- 1: 'weighted_back_extension_with_opposite_arm_and_leg_reach',
- 2: 'base_rotations',
- 3: 'weighted_base_rotations',
- 4: 'bent_knee_reverse_hyperextension',
- 5: 'weighted_bent_knee_reverse_hyperextension',
- 6: 'hollow_hold_and_roll',
- 7: 'weighted_hollow_hold_and_roll',
- 8: 'kicks',
- 9: 'weighted_kicks',
- 10: 'knee_raises',
- 11: 'weighted_knee_raises',
- 12: 'kneeling_superman',
- 13: 'weighted_kneeling_superman',
- 14: 'lat_pull_down_with_row',
- 15: 'medicine_ball_deadlift_to_reach',
- 16: 'one_arm_one_leg_row',
- 17: 'one_arm_row_with_band',
- 18: 'overhead_lunge_with_medicine_ball',
- 19: 'plank_knee_tucks',
- 20: 'weighted_plank_knee_tucks',
- 21: 'side_step',
- 22: 'weighted_side_step',
- 23: 'single_leg_back_extension',
- 24: 'weighted_single_leg_back_extension',
- 25: 'spine_extension',
- 26: 'weighted_spine_extension',
- 27: 'static_back_extension',
- 28: 'weighted_static_back_extension',
- 29: 'superman_from_floor',
- 30: 'weighted_superman_from_floor',
- 31: 'swiss_ball_back_extension',
- 32: 'weighted_swiss_ball_back_extension',
- 33: 'swiss_ball_hyperextension',
- 34: 'weighted_swiss_ball_hyperextension',
- 35: 'swiss_ball_opposite_arm_and_leg_lift',
- 36: 'weighted_swiss_ball_opposite_arm_and_leg_lift',
- },
- ),
- 'intensity': FieldType(
- name='intensity',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'active',
- 1: 'rest',
- 2: 'warmup',
- 3: 'cooldown',
- },
- ),
- 'language': FieldType(
- name='language',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'english',
- 1: 'french',
- 2: 'italian',
- 3: 'german',
- 4: 'spanish',
- 5: 'croatian',
- 6: 'czech',
- 7: 'danish',
- 8: 'dutch',
- 9: 'finnish',
- 10: 'greek',
- 11: 'hungarian',
- 12: 'norwegian',
- 13: 'polish',
- 14: 'portuguese',
- 15: 'slovakian',
- 16: 'slovenian',
- 17: 'swedish',
- 18: 'russian',
- 19: 'turkish',
- 20: 'latvian',
- 21: 'ukrainian',
- 22: 'arabic',
- 23: 'farsi',
- 24: 'bulgarian',
- 25: 'romanian',
- 26: 'chinese',
- 27: 'japanese',
- 28: 'korean',
- 29: 'taiwanese',
- 30: 'thai',
- 31: 'hebrew',
- 32: 'brazilian_portuguese',
- 33: 'indonesian',
- 34: 'malaysian',
- 35: 'vietnamese',
- 36: 'burmese',
- 37: 'mongolian',
- 254: 'custom',
- },
- ),
- 'language_bits_0': FieldType( # Bit field corresponding to language enum type (1 << language).
- name='language_bits_0',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'english',
- 0x02: 'french',
- 0x04: 'italian',
- 0x08: 'german',
- 0x10: 'spanish',
- 0x20: 'croatian',
- 0x40: 'czech',
- 0x80: 'danish',
- },
- ),
- 'language_bits_1': FieldType(
- name='language_bits_1',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'dutch',
- 0x02: 'finnish',
- 0x04: 'greek',
- 0x08: 'hungarian',
- 0x10: 'norwegian',
- 0x20: 'polish',
- 0x40: 'portuguese',
- 0x80: 'slovakian',
- },
- ),
- 'language_bits_2': FieldType(
- name='language_bits_2',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'slovenian',
- 0x02: 'swedish',
- 0x04: 'russian',
- 0x08: 'turkish',
- 0x10: 'latvian',
- 0x20: 'ukrainian',
- 0x40: 'arabic',
- 0x80: 'farsi',
- },
- ),
- 'language_bits_3': FieldType(
- name='language_bits_3',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'bulgarian',
- 0x02: 'romanian',
- 0x04: 'chinese',
- 0x08: 'japanese',
- 0x10: 'korean',
- 0x20: 'taiwanese',
- 0x40: 'thai',
- 0x80: 'hebrew',
- },
- ),
- 'language_bits_4': FieldType(
- name='language_bits_4',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'brazilian_portuguese',
- 0x02: 'indonesian',
- 0x04: 'malaysian',
- 0x08: 'vietnamese',
- 0x10: 'burmese',
- 0x20: 'mongolian',
- },
- ),
- 'lap_trigger': FieldType(
- name='lap_trigger',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'manual',
- 1: 'time',
- 2: 'distance',
- 3: 'position_start',
- 4: 'position_lap',
- 5: 'position_waypoint',
- 6: 'position_marked',
- 7: 'session_end',
- 8: 'fitness_equipment',
- },
- ),
- 'lateral_raise_exercise_name': FieldType(
- name='lateral_raise_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: '45_degree_cable_external_rotation',
- 1: 'alternating_lateral_raise_with_static_hold',
- 2: 'bar_muscle_up',
- 3: 'bent_over_lateral_raise',
- 4: 'cable_diagonal_raise',
- 5: 'cable_front_raise',
- 6: 'calorie_row',
- 7: 'combo_shoulder_raise',
- 8: 'dumbbell_diagonal_raise',
- 9: 'dumbbell_v_raise',
- 10: 'front_raise',
- 11: 'leaning_dumbbell_lateral_raise',
- 12: 'lying_dumbbell_raise',
- 13: 'muscle_up',
- 14: 'one_arm_cable_lateral_raise',
- 15: 'overhand_grip_rear_lateral_raise',
- 16: 'plate_raises',
- 17: 'ring_dip',
- 18: 'weighted_ring_dip',
- 19: 'ring_muscle_up',
- 20: 'weighted_ring_muscle_up',
- 21: 'rope_climb',
- 22: 'weighted_rope_climb',
- 23: 'scaption',
- 24: 'seated_lateral_raise',
- 25: 'seated_rear_lateral_raise',
- 26: 'side_lying_lateral_raise',
- 27: 'standing_lift',
- 28: 'suspended_row',
- 29: 'underhand_grip_rear_lateral_raise',
- 30: 'wall_slide',
- 31: 'weighted_wall_slide',
- },
- ),
- 'left_right_balance': FieldType(
- name='left_right_balance',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 0x7F: 'mask', # % contribution
- 0x80: 'right', # data corresponds to right if set, otherwise unknown
- },
- ),
- 'left_right_balance_100': FieldType(
- name='left_right_balance_100',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0x3FFF: 'mask', # % contribution scaled by 100
- 0x8000: 'right', # data corresponds to right if set, otherwise unknown
- },
- ),
- 'leg_curl_exercise_name': FieldType(
- name='leg_curl_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'leg_curl',
- 1: 'weighted_leg_curl',
- 2: 'good_morning',
- 3: 'seated_barbell_good_morning',
- 4: 'single_leg_barbell_good_morning',
- 5: 'single_leg_sliding_leg_curl',
- 6: 'sliding_leg_curl',
- 7: 'split_barbell_good_morning',
- 8: 'split_stance_extension',
- 9: 'staggered_stance_good_morning',
- 10: 'swiss_ball_hip_raise_and_leg_curl',
- 11: 'zercher_good_morning',
- },
- ),
- 'leg_raise_exercise_name': FieldType(
- name='leg_raise_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'hanging_knee_raise',
- 1: 'hanging_leg_raise',
- 2: 'weighted_hanging_leg_raise',
- 3: 'hanging_single_leg_raise',
- 4: 'weighted_hanging_single_leg_raise',
- 5: 'kettlebell_leg_raises',
- 6: 'leg_lowering_drill',
- 7: 'weighted_leg_lowering_drill',
- 8: 'lying_straight_leg_raise',
- 9: 'weighted_lying_straight_leg_raise',
- 10: 'medicine_ball_leg_drops',
- 11: 'quadruped_leg_raise',
- 12: 'weighted_quadruped_leg_raise',
- 13: 'reverse_leg_raise',
- 14: 'weighted_reverse_leg_raise',
- 15: 'reverse_leg_raise_on_swiss_ball',
- 16: 'weighted_reverse_leg_raise_on_swiss_ball',
- 17: 'single_leg_lowering_drill',
- 18: 'weighted_single_leg_lowering_drill',
- 19: 'weighted_hanging_knee_raise',
- 20: 'lateral_stepover',
- 21: 'weighted_lateral_stepover',
- },
- ),
- 'length_type': FieldType(
- name='length_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'idle', # Rest period. Length with no strokes
- 1: 'active', # Length with strokes.
- },
- ),
- 'local_date_time': FieldType( # seconds since 00:00 Dec 31 1989 in local time zone
- name='local_date_time',
- base_type=BASE_TYPES[0x86], # uint32
- values={
- 0x10000000: 'min', # if date_time is < 0x10000000 then it is system time (seconds from device power on)
- },
- ),
- 'local_device_type': FieldType(
- name='local_device_type',
- base_type=BASE_TYPES[0x02], # uint8
- ),
- 'localtime_into_day': FieldType( # number of seconds into the day since local 00:00:00
- name='localtime_into_day',
- base_type=BASE_TYPES[0x86], # uint32
- ),
- 'lunge_exercise_name': FieldType(
- name='lunge_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'overhead_lunge',
- 1: 'lunge_matrix',
- 2: 'weighted_lunge_matrix',
- 3: 'alternating_barbell_forward_lunge',
- 4: 'alternating_dumbbell_lunge_with_reach',
- 5: 'back_foot_elevated_dumbbell_split_squat',
- 6: 'barbell_box_lunge',
- 7: 'barbell_bulgarian_split_squat',
- 8: 'barbell_crossover_lunge',
- 9: 'barbell_front_split_squat',
- 10: 'barbell_lunge',
- 11: 'barbell_reverse_lunge',
- 12: 'barbell_side_lunge',
- 13: 'barbell_split_squat',
- 14: 'core_control_rear_lunge',
- 15: 'diagonal_lunge',
- 16: 'drop_lunge',
- 17: 'dumbbell_box_lunge',
- 18: 'dumbbell_bulgarian_split_squat',
- 19: 'dumbbell_crossover_lunge',
- 20: 'dumbbell_diagonal_lunge',
- 21: 'dumbbell_lunge',
- 22: 'dumbbell_lunge_and_rotation',
- 23: 'dumbbell_overhead_bulgarian_split_squat',
- 24: 'dumbbell_reverse_lunge_to_high_knee_and_press',
- 25: 'dumbbell_side_lunge',
- 26: 'elevated_front_foot_barbell_split_squat',
- 27: 'front_foot_elevated_dumbbell_split_squat',
- 28: 'gunslinger_lunge',
- 29: 'lawnmower_lunge',
- 30: 'low_lunge_with_isometric_adduction',
- 31: 'low_side_to_side_lunge',
- 32: 'lunge',
- 33: 'weighted_lunge',
- 34: 'lunge_with_arm_reach',
- 35: 'lunge_with_diagonal_reach',
- 36: 'lunge_with_side_bend',
- 37: 'offset_dumbbell_lunge',
- 38: 'offset_dumbbell_reverse_lunge',
- 39: 'overhead_bulgarian_split_squat',
- 40: 'overhead_dumbbell_reverse_lunge',
- 41: 'overhead_dumbbell_split_squat',
- 42: 'overhead_lunge_with_rotation',
- 43: 'reverse_barbell_box_lunge',
- 44: 'reverse_box_lunge',
- 45: 'reverse_dumbbell_box_lunge',
- 46: 'reverse_dumbbell_crossover_lunge',
- 47: 'reverse_dumbbell_diagonal_lunge',
- 48: 'reverse_lunge_with_reach_back',
- 49: 'weighted_reverse_lunge_with_reach_back',
- 50: 'reverse_lunge_with_twist_and_overhead_reach',
- 51: 'weighted_reverse_lunge_with_twist_and_overhead_reach',
- 52: 'reverse_sliding_box_lunge',
- 53: 'weighted_reverse_sliding_box_lunge',
- 54: 'reverse_sliding_lunge',
- 55: 'weighted_reverse_sliding_lunge',
- 56: 'runners_lunge_to_balance',
- 57: 'weighted_runners_lunge_to_balance',
- 58: 'shifting_side_lunge',
- 59: 'side_and_crossover_lunge',
- 60: 'weighted_side_and_crossover_lunge',
- 61: 'side_lunge',
- 62: 'weighted_side_lunge',
- 63: 'side_lunge_and_press',
- 64: 'side_lunge_jump_off',
- 65: 'side_lunge_sweep',
- 66: 'weighted_side_lunge_sweep',
- 67: 'side_lunge_to_crossover_tap',
- 68: 'weighted_side_lunge_to_crossover_tap',
- 69: 'side_to_side_lunge_chops',
- 70: 'weighted_side_to_side_lunge_chops',
- 71: 'siff_jump_lunge',
- 72: 'weighted_siff_jump_lunge',
- 73: 'single_arm_reverse_lunge_and_press',
- 74: 'sliding_lateral_lunge',
- 75: 'weighted_sliding_lateral_lunge',
- 76: 'walking_barbell_lunge',
- 77: 'walking_dumbbell_lunge',
- 78: 'walking_lunge',
- 79: 'weighted_walking_lunge',
- 80: 'wide_grip_overhead_barbell_split_squat',
- },
- ),
- 'manufacturer': FieldType(
- name='manufacturer',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 1: 'garmin',
- 2: 'garmin_fr405_antfs', # Do not use. Used by FR405 for ANTFS man id.
- 3: 'zephyr',
- 4: 'dayton',
- 5: 'idt',
- 6: 'srm',
- 7: 'quarq',
- 8: 'ibike',
- 9: 'saris',
- 10: 'spark_hk',
- 11: 'tanita',
- 12: 'echowell',
- 13: 'dynastream_oem',
- 14: 'nautilus',
- 15: 'dynastream',
- 16: 'timex',
- 17: 'metrigear',
- 18: 'xelic',
- 19: 'beurer',
- 20: 'cardiosport',
- 21: 'a_and_d',
- 22: 'hmm',
- 23: 'suunto',
- 24: 'thita_elektronik',
- 25: 'gpulse',
- 26: 'clean_mobile',
- 27: 'pedal_brain',
- 28: 'peaksware',
- 29: 'saxonar',
- 30: 'lemond_fitness',
- 31: 'dexcom',
- 32: 'wahoo_fitness',
- 33: 'octane_fitness',
- 34: 'archinoetics',
- 35: 'the_hurt_box',
- 36: 'citizen_systems',
- 37: 'magellan',
- 38: 'osynce',
- 39: 'holux',
- 40: 'concept2',
- 42: 'one_giant_leap',
- 43: 'ace_sensor',
- 44: 'brim_brothers',
- 45: 'xplova',
- 46: 'perception_digital',
- 47: 'bf1systems',
- 48: 'pioneer',
- 49: 'spantec',
- 50: 'metalogics',
- 51: '4iiiis',
- 52: 'seiko_epson',
- 53: 'seiko_epson_oem',
- 54: 'ifor_powell',
- 55: 'maxwell_guider',
- 56: 'star_trac',
- 57: 'breakaway',
- 58: 'alatech_technology_ltd',
- 59: 'mio_technology_europe',
- 60: 'rotor',
- 61: 'geonaute',
- 62: 'id_bike',
- 63: 'specialized',
- 64: 'wtek',
- 65: 'physical_enterprises',
- 66: 'north_pole_engineering',
- 67: 'bkool',
- 68: 'cateye',
- 69: 'stages_cycling',
- 70: 'sigmasport',
- 71: 'tomtom',
- 72: 'peripedal',
- 73: 'wattbike',
- 76: 'moxy',
- 77: 'ciclosport',
- 78: 'powerbahn',
- 79: 'acorn_projects_aps',
- 80: 'lifebeam',
- 81: 'bontrager',
- 82: 'wellgo',
- 83: 'scosche',
- 84: 'magura',
- 85: 'woodway',
- 86: 'elite',
- 87: 'nielsen_kellerman',
- 88: 'dk_city',
- 89: 'tacx',
- 90: 'direction_technology',
- 91: 'magtonic',
- 92: '1partcarbon',
- 93: 'inside_ride_technologies',
- 94: 'sound_of_motion',
- 95: 'stryd',
- 96: 'icg', # Indoorcycling Group
- 97: 'MiPulse',
- 98: 'bsx_athletics',
- 99: 'look',
- 100: 'campagnolo_srl',
- 101: 'body_bike_smart',
- 102: 'praxisworks',
- 103: 'limits_technology', # Limits Technology Ltd.
- 104: 'topaction_technology', # TopAction Technology Inc.
- 105: 'cosinuss',
- 106: 'fitcare',
- 107: 'magene',
- 108: 'giant_manufacturing_co',
- 109: 'tigrasport', # Tigrasport
- 110: 'salutron',
- 111: 'technogym',
- 112: 'bryton_sensors',
- 113: 'latitude_limited',
- 114: 'soaring_technology',
- 115: 'igpsport',
- 116: 'thinkrider',
- 117: 'gopher_sport',
- 118: 'waterrower',
- 119: 'orangetheory',
- 120: 'inpeak',
- 121: 'kinetic',
- 122: 'johnson_health_tech',
- 123: 'polar_electro',
- 124: 'seesense',
- 255: 'development',
- 257: 'healthandlife',
- 258: 'lezyne',
- 259: 'scribe_labs',
- 260: 'zwift',
- 261: 'watteam',
- 262: 'recon',
- 263: 'favero_electronics',
- 264: 'dynovelo',
- 265: 'strava',
- 266: 'precor', # Amer Sports
- 267: 'bryton',
- 268: 'sram',
- 269: 'navman', # MiTAC Global Corporation (Mio Technology)
- 270: 'cobi', # COBI GmbH
- 271: 'spivi',
- 272: 'mio_magellan',
- 273: 'evesports',
- 274: 'sensitivus_gauge',
- 275: 'podoon',
- 276: 'life_time_fitness',
- 277: 'falco_e_motors', # Falco eMotors Inc.
- 278: 'minoura',
- 279: 'cycliq',
- 280: 'luxottica',
- 281: 'trainer_road',
- 282: 'the_sufferfest',
- 283: 'fullspeedahead',
- 284: 'virtualtraining',
- 285: 'feedbacksports',
- 286: 'omata',
- 287: 'vdo',
- 288: 'magneticdays',
- 289: 'hammerhead',
- 290: 'kinetic_by_kurt',
- 291: 'shapelog',
- 292: 'dabuziduo',
- 293: 'jetblack',
- 5759: 'actigraphcorp',
- },
- ),
- 'mesg_count': FieldType(
- name='mesg_count',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'num_per_file',
- 1: 'max_per_file',
- 2: 'max_per_file_type',
- },
- ),
- 'mesg_num': FieldType(
- name='mesg_num',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'file_id',
- 1: 'capabilities',
- 2: 'device_settings',
- 3: 'user_profile',
- 4: 'hrm_profile',
- 5: 'sdm_profile',
- 6: 'bike_profile',
- 7: 'zones_target',
- 8: 'hr_zone',
- 9: 'power_zone',
- 10: 'met_zone',
- 12: 'sport',
- 15: 'goal',
- 18: 'session',
- 19: 'lap',
- 20: 'record',
- 21: 'event',
- 23: 'device_info',
- 26: 'workout',
- 27: 'workout_step',
- 28: 'schedule',
- 30: 'weight_scale',
- 31: 'course',
- 32: 'course_point',
- 33: 'totals',
- 34: 'activity',
- 35: 'software',
- 37: 'file_capabilities',
- 38: 'mesg_capabilities',
- 39: 'field_capabilities',
- 49: 'file_creator',
- 51: 'blood_pressure',
- 53: 'speed_zone',
- 55: 'monitoring',
- 72: 'training_file',
- 78: 'hrv',
- 80: 'ant_rx',
- 81: 'ant_tx',
- 82: 'ant_channel_id',
- 101: 'length',
- 103: 'monitoring_info',
- 105: 'pad',
- 106: 'slave_device',
- 127: 'connectivity',
- 128: 'weather_conditions',
- 129: 'weather_alert',
- 131: 'cadence_zone',
- 132: 'hr',
- 142: 'segment_lap',
- 145: 'memo_glob',
- 148: 'segment_id',
- 149: 'segment_leaderboard_entry',
- 150: 'segment_point',
- 151: 'segment_file',
- 158: 'workout_session',
- 159: 'watchface_settings',
- 160: 'gps_metadata',
- 161: 'camera_event',
- 162: 'timestamp_correlation',
- 164: 'gyroscope_data',
- 165: 'accelerometer_data',
- 167: 'three_d_sensor_calibration',
- 169: 'video_frame',
- 174: 'obdii_data',
- 177: 'nmea_sentence',
- 178: 'aviation_attitude',
- 184: 'video',
- 185: 'video_title',
- 186: 'video_description',
- 187: 'video_clip',
- 188: 'ohr_settings',
- 200: 'exd_screen_configuration',
- 201: 'exd_data_field_configuration',
- 202: 'exd_data_concept_configuration',
- 206: 'field_description',
- 207: 'developer_data_id',
- 208: 'magnetometer_data',
- 209: 'barometer_data',
- 210: 'one_d_sensor_calibration',
- 225: 'set',
- 227: 'stress_level',
- 258: 'dive_settings',
- 259: 'dive_gas',
- 262: 'dive_alarm',
- 264: 'exercise_title',
- 268: 'dive_summary',
- },
- ),
- 'message_index': FieldType(
- name='message_index',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0x0FFF: 'mask', # index
- 0x7000: 'reserved', # reserved (default 0)
- 0x8000: 'selected', # message is selected if set
- },
- ),
- 'olympic_lift_exercise_name': FieldType(
- name='olympic_lift_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'barbell_hang_power_clean',
- 1: 'barbell_hang_squat_clean',
- 2: 'barbell_power_clean',
- 3: 'barbell_power_snatch',
- 4: 'barbell_squat_clean',
- 5: 'clean_and_jerk',
- 6: 'barbell_hang_power_snatch',
- 7: 'barbell_hang_pull',
- 8: 'barbell_high_pull',
- 9: 'barbell_snatch',
- 10: 'barbell_split_jerk',
- 11: 'clean',
- 12: 'dumbbell_clean',
- 13: 'dumbbell_hang_pull',
- 14: 'one_hand_dumbbell_split_snatch',
- 15: 'push_jerk',
- 16: 'single_arm_dumbbell_snatch',
- 17: 'single_arm_hang_snatch',
- 18: 'single_arm_kettlebell_snatch',
- 19: 'split_jerk',
- 20: 'squat_clean_and_jerk',
- },
- ),
- 'plank_exercise_name': FieldType(
- name='plank_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: '45_degree_plank',
- 1: 'weighted_45_degree_plank',
- 2: '90_degree_static_hold',
- 3: 'weighted_90_degree_static_hold',
- 4: 'bear_crawl',
- 5: 'weighted_bear_crawl',
- 6: 'cross_body_mountain_climber',
- 7: 'weighted_cross_body_mountain_climber',
- 8: 'elbow_plank_pike_jacks',
- 9: 'weighted_elbow_plank_pike_jacks',
- 10: 'elevated_feet_plank',
- 11: 'weighted_elevated_feet_plank',
- 12: 'elevator_abs',
- 13: 'weighted_elevator_abs',
- 14: 'extended_plank',
- 15: 'weighted_extended_plank',
- 16: 'full_plank_passe_twist',
- 17: 'weighted_full_plank_passe_twist',
- 18: 'inching_elbow_plank',
- 19: 'weighted_inching_elbow_plank',
- 20: 'inchworm_to_side_plank',
- 21: 'weighted_inchworm_to_side_plank',
- 22: 'kneeling_plank',
- 23: 'weighted_kneeling_plank',
- 24: 'kneeling_side_plank_with_leg_lift',
- 25: 'weighted_kneeling_side_plank_with_leg_lift',
- 26: 'lateral_roll',
- 27: 'weighted_lateral_roll',
- 28: 'lying_reverse_plank',
- 29: 'weighted_lying_reverse_plank',
- 30: 'medicine_ball_mountain_climber',
- 31: 'weighted_medicine_ball_mountain_climber',
- 32: 'modified_mountain_climber_and_extension',
- 33: 'weighted_modified_mountain_climber_and_extension',
- 34: 'mountain_climber',
- 35: 'weighted_mountain_climber',
- 36: 'mountain_climber_on_sliding_discs',
- 37: 'weighted_mountain_climber_on_sliding_discs',
- 38: 'mountain_climber_with_feet_on_bosu_ball',
- 39: 'weighted_mountain_climber_with_feet_on_bosu_ball',
- 40: 'mountain_climber_with_hands_on_bench',
- 41: 'mountain_climber_with_hands_on_swiss_ball',
- 42: 'weighted_mountain_climber_with_hands_on_swiss_ball',
- 43: 'plank',
- 44: 'plank_jacks_with_feet_on_sliding_discs',
- 45: 'weighted_plank_jacks_with_feet_on_sliding_discs',
- 46: 'plank_knee_twist',
- 47: 'weighted_plank_knee_twist',
- 48: 'plank_pike_jumps',
- 49: 'weighted_plank_pike_jumps',
- 50: 'plank_pikes',
- 51: 'weighted_plank_pikes',
- 52: 'plank_to_stand_up',
- 53: 'weighted_plank_to_stand_up',
- 54: 'plank_with_arm_raise',
- 55: 'weighted_plank_with_arm_raise',
- 56: 'plank_with_knee_to_elbow',
- 57: 'weighted_plank_with_knee_to_elbow',
- 58: 'plank_with_oblique_crunch',
- 59: 'weighted_plank_with_oblique_crunch',
- 60: 'plyometric_side_plank',
- 61: 'weighted_plyometric_side_plank',
- 62: 'rolling_side_plank',
- 63: 'weighted_rolling_side_plank',
- 64: 'side_kick_plank',
- 65: 'weighted_side_kick_plank',
- 66: 'side_plank',
- 67: 'weighted_side_plank',
- 68: 'side_plank_and_row',
- 69: 'weighted_side_plank_and_row',
- 70: 'side_plank_lift',
- 71: 'weighted_side_plank_lift',
- 72: 'side_plank_with_elbow_on_bosu_ball',
- 73: 'weighted_side_plank_with_elbow_on_bosu_ball',
- 74: 'side_plank_with_feet_on_bench',
- 75: 'weighted_side_plank_with_feet_on_bench',
- 76: 'side_plank_with_knee_circle',
- 77: 'weighted_side_plank_with_knee_circle',
- 78: 'side_plank_with_knee_tuck',
- 79: 'weighted_side_plank_with_knee_tuck',
- 80: 'side_plank_with_leg_lift',
- 81: 'weighted_side_plank_with_leg_lift',
- 82: 'side_plank_with_reach_under',
- 83: 'weighted_side_plank_with_reach_under',
- 84: 'single_leg_elevated_feet_plank',
- 85: 'weighted_single_leg_elevated_feet_plank',
- 86: 'single_leg_flex_and_extend',
- 87: 'weighted_single_leg_flex_and_extend',
- 88: 'single_leg_side_plank',
- 89: 'weighted_single_leg_side_plank',
- 90: 'spiderman_plank',
- 91: 'weighted_spiderman_plank',
- 92: 'straight_arm_plank',
- 93: 'weighted_straight_arm_plank',
- 94: 'straight_arm_plank_with_shoulder_touch',
- 95: 'weighted_straight_arm_plank_with_shoulder_touch',
- 96: 'swiss_ball_plank',
- 97: 'weighted_swiss_ball_plank',
- 98: 'swiss_ball_plank_leg_lift',
- 99: 'weighted_swiss_ball_plank_leg_lift',
- 100: 'swiss_ball_plank_leg_lift_and_hold',
- 101: 'swiss_ball_plank_with_feet_on_bench',
- 102: 'weighted_swiss_ball_plank_with_feet_on_bench',
- 103: 'swiss_ball_prone_jackknife',
- 104: 'weighted_swiss_ball_prone_jackknife',
- 105: 'swiss_ball_side_plank',
- 106: 'weighted_swiss_ball_side_plank',
- 107: 'three_way_plank',
- 108: 'weighted_three_way_plank',
- 109: 'towel_plank_and_knee_in',
- 110: 'weighted_towel_plank_and_knee_in',
- 111: 't_stabilization',
- 112: 'weighted_t_stabilization',
- 113: 'turkish_get_up_to_side_plank',
- 114: 'weighted_turkish_get_up_to_side_plank',
- 115: 'two_point_plank',
- 116: 'weighted_two_point_plank',
- 117: 'weighted_plank',
- 118: 'wide_stance_plank_with_diagonal_arm_lift',
- 119: 'weighted_wide_stance_plank_with_diagonal_arm_lift',
- 120: 'wide_stance_plank_with_diagonal_leg_lift',
- 121: 'weighted_wide_stance_plank_with_diagonal_leg_lift',
- 122: 'wide_stance_plank_with_leg_lift',
- 123: 'weighted_wide_stance_plank_with_leg_lift',
- 124: 'wide_stance_plank_with_opposite_arm_and_leg_lift',
- 125: 'weighted_mountain_climber_with_hands_on_bench',
- 126: 'weighted_swiss_ball_plank_leg_lift_and_hold',
- 127: 'weighted_wide_stance_plank_with_opposite_arm_and_leg_lift',
- },
- ),
- 'plyo_exercise_name': FieldType(
- name='plyo_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'alternating_jump_lunge',
- 1: 'weighted_alternating_jump_lunge',
- 2: 'barbell_jump_squat',
- 3: 'body_weight_jump_squat',
- 4: 'weighted_jump_squat',
- 5: 'cross_knee_strike',
- 6: 'weighted_cross_knee_strike',
- 7: 'depth_jump',
- 8: 'weighted_depth_jump',
- 9: 'dumbbell_jump_squat',
- 10: 'dumbbell_split_jump',
- 11: 'front_knee_strike',
- 12: 'weighted_front_knee_strike',
- 13: 'high_box_jump',
- 14: 'weighted_high_box_jump',
- 15: 'isometric_explosive_body_weight_jump_squat',
- 16: 'weighted_isometric_explosive_jump_squat',
- 17: 'lateral_leap_and_hop',
- 18: 'weighted_lateral_leap_and_hop',
- 19: 'lateral_plyo_squats',
- 20: 'weighted_lateral_plyo_squats',
- 21: 'lateral_slide',
- 22: 'weighted_lateral_slide',
- 23: 'medicine_ball_overhead_throws',
- 24: 'medicine_ball_side_throw',
- 25: 'medicine_ball_slam',
- 26: 'side_to_side_medicine_ball_throws',
- 27: 'side_to_side_shuffle_jump',
- 28: 'weighted_side_to_side_shuffle_jump',
- 29: 'squat_jump_onto_box',
- 30: 'weighted_squat_jump_onto_box',
- 31: 'squat_jumps_in_and_out',
- 32: 'weighted_squat_jumps_in_and_out',
- },
- ),
- 'power_phase_type': FieldType(
- name='power_phase_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'power_phase_start_angle',
- 1: 'power_phase_end_angle',
- 2: 'power_phase_arc_length',
- 3: 'power_phase_center',
- },
- ),
- 'pull_up_exercise_name': FieldType(
- name='pull_up_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'banded_pull_ups',
- 1: '30_degree_lat_pulldown',
- 2: 'band_assisted_chin_up',
- 3: 'close_grip_chin_up',
- 4: 'weighted_close_grip_chin_up',
- 5: 'close_grip_lat_pulldown',
- 6: 'crossover_chin_up',
- 7: 'weighted_crossover_chin_up',
- 8: 'ez_bar_pullover',
- 9: 'hanging_hurdle',
- 10: 'weighted_hanging_hurdle',
- 11: 'kneeling_lat_pulldown',
- 12: 'kneeling_underhand_grip_lat_pulldown',
- 13: 'lat_pulldown',
- 14: 'mixed_grip_chin_up',
- 15: 'weighted_mixed_grip_chin_up',
- 16: 'mixed_grip_pull_up',
- 17: 'weighted_mixed_grip_pull_up',
- 18: 'reverse_grip_pulldown',
- 19: 'standing_cable_pullover',
- 20: 'straight_arm_pulldown',
- 21: 'swiss_ball_ez_bar_pullover',
- 22: 'towel_pull_up',
- 23: 'weighted_towel_pull_up',
- 24: 'weighted_pull_up',
- 25: 'wide_grip_lat_pulldown',
- 26: 'wide_grip_pull_up',
- 27: 'weighted_wide_grip_pull_up',
- 28: 'burpee_pull_up',
- 29: 'weighted_burpee_pull_up',
- 30: 'jumping_pull_ups',
- 31: 'weighted_jumping_pull_ups',
- 32: 'kipping_pull_up',
- 33: 'weighted_kipping_pull_up',
- 34: 'l_pull_up',
- 35: 'weighted_l_pull_up',
- 36: 'suspended_chin_up',
- 37: 'weighted_suspended_chin_up',
- 38: 'pull_up',
- },
- ),
- 'push_up_exercise_name': FieldType(
- name='push_up_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'chest_press_with_band',
- 1: 'alternating_staggered_push_up',
- 2: 'weighted_alternating_staggered_push_up',
- 3: 'alternating_hands_medicine_ball_push_up',
- 4: 'weighted_alternating_hands_medicine_ball_push_up',
- 5: 'bosu_ball_push_up',
- 6: 'weighted_bosu_ball_push_up',
- 7: 'clapping_push_up',
- 8: 'weighted_clapping_push_up',
- 9: 'close_grip_medicine_ball_push_up',
- 10: 'weighted_close_grip_medicine_ball_push_up',
- 11: 'close_hands_push_up',
- 12: 'weighted_close_hands_push_up',
- 13: 'decline_push_up',
- 14: 'weighted_decline_push_up',
- 15: 'diamond_push_up',
- 16: 'weighted_diamond_push_up',
- 17: 'explosive_crossover_push_up',
- 18: 'weighted_explosive_crossover_push_up',
- 19: 'explosive_push_up',
- 20: 'weighted_explosive_push_up',
- 21: 'feet_elevated_side_to_side_push_up',
- 22: 'weighted_feet_elevated_side_to_side_push_up',
- 23: 'hand_release_push_up',
- 24: 'weighted_hand_release_push_up',
- 25: 'handstand_push_up',
- 26: 'weighted_handstand_push_up',
- 27: 'incline_push_up',
- 28: 'weighted_incline_push_up',
- 29: 'isometric_explosive_push_up',
- 30: 'weighted_isometric_explosive_push_up',
- 31: 'judo_push_up',
- 32: 'weighted_judo_push_up',
- 33: 'kneeling_push_up',
- 34: 'weighted_kneeling_push_up',
- 35: 'medicine_ball_chest_pass',
- 36: 'medicine_ball_push_up',
- 37: 'weighted_medicine_ball_push_up',
- 38: 'one_arm_push_up',
- 39: 'weighted_one_arm_push_up',
- 40: 'weighted_push_up',
- 41: 'push_up_and_row',
- 42: 'weighted_push_up_and_row',
- 43: 'push_up_plus',
- 44: 'weighted_push_up_plus',
- 45: 'push_up_with_feet_on_swiss_ball',
- 46: 'weighted_push_up_with_feet_on_swiss_ball',
- 47: 'push_up_with_one_hand_on_medicine_ball',
- 48: 'weighted_push_up_with_one_hand_on_medicine_ball',
- 49: 'shoulder_push_up',
- 50: 'weighted_shoulder_push_up',
- 51: 'single_arm_medicine_ball_push_up',
- 52: 'weighted_single_arm_medicine_ball_push_up',
- 53: 'spiderman_push_up',
- 54: 'weighted_spiderman_push_up',
- 55: 'stacked_feet_push_up',
- 56: 'weighted_stacked_feet_push_up',
- 57: 'staggered_hands_push_up',
- 58: 'weighted_staggered_hands_push_up',
- 59: 'suspended_push_up',
- 60: 'weighted_suspended_push_up',
- 61: 'swiss_ball_push_up',
- 62: 'weighted_swiss_ball_push_up',
- 63: 'swiss_ball_push_up_plus',
- 64: 'weighted_swiss_ball_push_up_plus',
- 65: 't_push_up',
- 66: 'weighted_t_push_up',
- 67: 'triple_stop_push_up',
- 68: 'weighted_triple_stop_push_up',
- 69: 'wide_hands_push_up',
- 70: 'weighted_wide_hands_push_up',
- 71: 'parallette_handstand_push_up',
- 72: 'weighted_parallette_handstand_push_up',
- 73: 'ring_handstand_push_up',
- 74: 'weighted_ring_handstand_push_up',
- 75: 'ring_push_up',
- 76: 'weighted_ring_push_up',
- 77: 'push_up',
- },
- ),
- 'pwr_zone_calc': FieldType(
- name='pwr_zone_calc',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'custom',
- 1: 'percent_ftp',
- },
- ),
- 'rider_position_type': FieldType(
- name='rider_position_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'seated',
- 1: 'standing',
- 2: 'transition_to_seated',
- 3: 'transition_to_standing',
- },
- ),
- 'row_exercise_name': FieldType(
- name='row_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'barbell_straight_leg_deadlift_to_row',
- 1: 'cable_row_standing',
- 2: 'dumbbell_row',
- 3: 'elevated_feet_inverted_row',
- 4: 'weighted_elevated_feet_inverted_row',
- 5: 'face_pull',
- 6: 'face_pull_with_external_rotation',
- 7: 'inverted_row_with_feet_on_swiss_ball',
- 8: 'weighted_inverted_row_with_feet_on_swiss_ball',
- 9: 'kettlebell_row',
- 10: 'modified_inverted_row',
- 11: 'weighted_modified_inverted_row',
- 12: 'neutral_grip_alternating_dumbbell_row',
- 13: 'one_arm_bent_over_row',
- 14: 'one_legged_dumbbell_row',
- 15: 'renegade_row',
- 16: 'reverse_grip_barbell_row',
- 17: 'rope_handle_cable_row',
- 18: 'seated_cable_row',
- 19: 'seated_dumbbell_row',
- 20: 'single_arm_cable_row',
- 21: 'single_arm_cable_row_and_rotation',
- 22: 'single_arm_inverted_row',
- 23: 'weighted_single_arm_inverted_row',
- 24: 'single_arm_neutral_grip_dumbbell_row',
- 25: 'single_arm_neutral_grip_dumbbell_row_and_rotation',
- 26: 'suspended_inverted_row',
- 27: 'weighted_suspended_inverted_row',
- 28: 't_bar_row',
- 29: 'towel_grip_inverted_row',
- 30: 'weighted_towel_grip_inverted_row',
- 31: 'underhand_grip_cable_row',
- 32: 'v_grip_cable_row',
- 33: 'wide_grip_seated_cable_row',
- },
- ),
- 'run_exercise_name': FieldType(
- name='run_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'run',
- 1: 'walk',
- 2: 'jog',
- 3: 'sprint',
- },
- ),
- 'schedule': FieldType(
- name='schedule',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'workout',
- 1: 'course',
- },
- ),
- 'segment_delete_status': FieldType(
- name='segment_delete_status',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'do_not_delete',
- 1: 'delete_one',
- 2: 'delete_all',
- },
- ),
- 'segment_lap_status': FieldType(
- name='segment_lap_status',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'end',
- 1: 'fail',
- },
- ),
- 'segment_leaderboard_type': FieldType(
- name='segment_leaderboard_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'overall',
- 1: 'personal_best',
- 2: 'connections',
- 3: 'group',
- 4: 'challenger',
- 5: 'kom',
- 6: 'qom',
- 7: 'pr',
- 8: 'goal',
- 9: 'rival',
- 10: 'club_leader',
- },
- ),
- 'segment_selection_type': FieldType(
- name='segment_selection_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'starred',
- 1: 'suggested',
- },
- ),
- 'sensor_type': FieldType(
- name='sensor_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'accelerometer',
- 1: 'gyroscope',
- 2: 'compass', # Magnetometer
- 3: 'barometer',
- },
- ),
- 'session_trigger': FieldType(
- name='session_trigger',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'activity_end',
- 1: 'manual', # User changed sport.
- 2: 'auto_multi_sport', # Auto multi-sport feature is enabled and user pressed lap button to advance session.
- 3: 'fitness_equipment', # Auto sport change caused by user linking to fitness equipment.
- },
- ),
- 'set_type': FieldType(
- name='set_type',
- base_type=BASE_TYPES[0x02], # uint8
- values={
- 0: 'rest',
- 1: 'active',
- },
- ),
- 'shoulder_press_exercise_name': FieldType(
- name='shoulder_press_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'alternating_dumbbell_shoulder_press',
- 1: 'arnold_press',
- 2: 'barbell_front_squat_to_push_press',
- 3: 'barbell_push_press',
- 4: 'barbell_shoulder_press',
- 5: 'dead_curl_press',
- 6: 'dumbbell_alternating_shoulder_press_and_twist',
- 7: 'dumbbell_hammer_curl_to_lunge_to_press',
- 8: 'dumbbell_push_press',
- 9: 'floor_inverted_shoulder_press',
- 10: 'weighted_floor_inverted_shoulder_press',
- 11: 'inverted_shoulder_press',
- 12: 'weighted_inverted_shoulder_press',
- 13: 'one_arm_push_press',
- 14: 'overhead_barbell_press',
- 15: 'overhead_dumbbell_press',
- 16: 'seated_barbell_shoulder_press',
- 17: 'seated_dumbbell_shoulder_press',
- 18: 'single_arm_dumbbell_shoulder_press',
- 19: 'single_arm_step_up_and_press',
- 20: 'smith_machine_overhead_press',
- 21: 'split_stance_hammer_curl_to_press',
- 22: 'swiss_ball_dumbbell_shoulder_press',
- 23: 'weight_plate_front_raise',
- },
- ),
- 'shoulder_stability_exercise_name': FieldType(
- name='shoulder_stability_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: '90_degree_cable_external_rotation',
- 1: 'band_external_rotation',
- 2: 'band_internal_rotation',
- 3: 'bent_arm_lateral_raise_and_external_rotation',
- 4: 'cable_external_rotation',
- 5: 'dumbbell_face_pull_with_external_rotation',
- 6: 'floor_i_raise',
- 7: 'weighted_floor_i_raise',
- 8: 'floor_t_raise',
- 9: 'weighted_floor_t_raise',
- 10: 'floor_y_raise',
- 11: 'weighted_floor_y_raise',
- 12: 'incline_i_raise',
- 13: 'weighted_incline_i_raise',
- 14: 'incline_l_raise',
- 15: 'weighted_incline_l_raise',
- 16: 'incline_t_raise',
- 17: 'weighted_incline_t_raise',
- 18: 'incline_w_raise',
- 19: 'weighted_incline_w_raise',
- 20: 'incline_y_raise',
- 21: 'weighted_incline_y_raise',
- 22: 'lying_external_rotation',
- 23: 'seated_dumbbell_external_rotation',
- 24: 'standing_l_raise',
- 25: 'swiss_ball_i_raise',
- 26: 'weighted_swiss_ball_i_raise',
- 27: 'swiss_ball_t_raise',
- 28: 'weighted_swiss_ball_t_raise',
- 29: 'swiss_ball_w_raise',
- 30: 'weighted_swiss_ball_w_raise',
- 31: 'swiss_ball_y_raise',
- 32: 'weighted_swiss_ball_y_raise',
- },
- ),
- 'shrug_exercise_name': FieldType(
- name='shrug_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'barbell_jump_shrug',
- 1: 'barbell_shrug',
- 2: 'barbell_upright_row',
- 3: 'behind_the_back_smith_machine_shrug',
- 4: 'dumbbell_jump_shrug',
- 5: 'dumbbell_shrug',
- 6: 'dumbbell_upright_row',
- 7: 'incline_dumbbell_shrug',
- 8: 'overhead_barbell_shrug',
- 9: 'overhead_dumbbell_shrug',
- 10: 'scaption_and_shrug',
- 11: 'scapular_retraction',
- 12: 'serratus_chair_shrug',
- 13: 'weighted_serratus_chair_shrug',
- 14: 'serratus_shrug',
- 15: 'weighted_serratus_shrug',
- 16: 'wide_grip_jump_shrug',
- },
- ),
- 'side': FieldType(
- name='side',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'right',
- 1: 'left',
- },
- ),
- 'sit_up_exercise_name': FieldType(
- name='sit_up_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'alternating_sit_up',
- 1: 'weighted_alternating_sit_up',
- 2: 'bent_knee_v_up',
- 3: 'weighted_bent_knee_v_up',
- 4: 'butterfly_sit_up',
- 5: 'weighted_butterfly_situp',
- 6: 'cross_punch_roll_up',
- 7: 'weighted_cross_punch_roll_up',
- 8: 'crossed_arms_sit_up',
- 9: 'weighted_crossed_arms_sit_up',
- 10: 'get_up_sit_up',
- 11: 'weighted_get_up_sit_up',
- 12: 'hovering_sit_up',
- 13: 'weighted_hovering_sit_up',
- 14: 'kettlebell_sit_up',
- 15: 'medicine_ball_alternating_v_up',
- 16: 'medicine_ball_sit_up',
- 17: 'medicine_ball_v_up',
- 18: 'modified_sit_up',
- 19: 'negative_sit_up',
- 20: 'one_arm_full_sit_up',
- 21: 'reclining_circle',
- 22: 'weighted_reclining_circle',
- 23: 'reverse_curl_up',
- 24: 'weighted_reverse_curl_up',
- 25: 'single_leg_swiss_ball_jackknife',
- 26: 'weighted_single_leg_swiss_ball_jackknife',
- 27: 'the_teaser',
- 28: 'the_teaser_weighted',
- 29: 'three_part_roll_down',
- 30: 'weighted_three_part_roll_down',
- 31: 'v_up',
- 32: 'weighted_v_up',
- 33: 'weighted_russian_twist_on_swiss_ball',
- 34: 'weighted_sit_up',
- 35: 'x_abs',
- 36: 'weighted_x_abs',
- 37: 'sit_up',
- },
- ),
- 'source_type': FieldType(
- name='source_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'ant', # External device connected with ANT
- 1: 'antplus', # External device connected with ANT+
- 2: 'bluetooth', # External device connected with BT
- 3: 'bluetooth_low_energy', # External device connected with BLE
- 4: 'wifi', # External device connected with Wifi
- 5: 'local', # Onboard device
- },
- ),
- 'sport': FieldType(
- name='sport',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'generic',
- 1: 'running',
- 2: 'cycling',
- 3: 'transition', # Mulitsport transition
- 4: 'fitness_equipment',
- 5: 'swimming',
- 6: 'basketball',
- 7: 'soccer',
- 8: 'tennis',
- 9: 'american_football',
- 10: 'training',
- 11: 'walking',
- 12: 'cross_country_skiing',
- 13: 'alpine_skiing',
- 14: 'snowboarding',
- 15: 'rowing',
- 16: 'mountaineering',
- 17: 'hiking',
- 18: 'multisport',
- 19: 'paddling',
- 20: 'flying',
- 21: 'e_biking',
- 22: 'motorcycling',
- 23: 'boating',
- 24: 'driving',
- 25: 'golf',
- 26: 'hang_gliding',
- 27: 'horseback_riding',
- 28: 'hunting',
- 29: 'fishing',
- 30: 'inline_skating',
- 31: 'rock_climbing',
- 32: 'sailing',
- 33: 'ice_skating',
- 34: 'sky_diving',
- 35: 'snowshoeing',
- 36: 'snowmobiling',
- 37: 'stand_up_paddleboarding',
- 38: 'surfing',
- 39: 'wakeboarding',
- 40: 'water_skiing',
- 41: 'kayaking',
- 42: 'rafting',
- 43: 'windsurfing',
- 44: 'kitesurfing',
- 45: 'tactical',
- 46: 'jumpmaster',
- 47: 'boxing',
- 48: 'floor_climbing',
- 254: 'all', # All is for goals only to include all sports.
- },
- ),
- 'sport_bits_0': FieldType( # Bit field corresponding to sport enum type (1 << sport).
- name='sport_bits_0',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'generic',
- 0x02: 'running',
- 0x04: 'cycling',
- 0x08: 'transition', # Mulitsport transition
- 0x10: 'fitness_equipment',
- 0x20: 'swimming',
- 0x40: 'basketball',
- 0x80: 'soccer',
- },
- ),
- 'sport_bits_1': FieldType( # Bit field corresponding to sport enum type (1 << (sport-8)).
- name='sport_bits_1',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'tennis',
- 0x02: 'american_football',
- 0x04: 'training',
- 0x08: 'walking',
- 0x10: 'cross_country_skiing',
- 0x20: 'alpine_skiing',
- 0x40: 'snowboarding',
- 0x80: 'rowing',
- },
- ),
- 'sport_bits_2': FieldType( # Bit field corresponding to sport enum type (1 << (sport-16)).
- name='sport_bits_2',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'mountaineering',
- 0x02: 'hiking',
- 0x04: 'multisport',
- 0x08: 'paddling',
- 0x10: 'flying',
- 0x20: 'e_biking',
- 0x40: 'motorcycling',
- 0x80: 'boating',
- },
- ),
- 'sport_bits_3': FieldType( # Bit field corresponding to sport enum type (1 << (sport-24)).
- name='sport_bits_3',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'driving',
- 0x02: 'golf',
- 0x04: 'hang_gliding',
- 0x08: 'horseback_riding',
- 0x10: 'hunting',
- 0x20: 'fishing',
- 0x40: 'inline_skating',
- 0x80: 'rock_climbing',
- },
- ),
- 'sport_bits_4': FieldType( # Bit field corresponding to sport enum type (1 << (sport-32)).
- name='sport_bits_4',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'sailing',
- 0x02: 'ice_skating',
- 0x04: 'sky_diving',
- 0x08: 'snowshoeing',
- 0x10: 'snowmobiling',
- 0x20: 'stand_up_paddleboarding',
- 0x40: 'surfing',
- 0x80: 'wakeboarding',
- },
- ),
- 'sport_bits_5': FieldType( # Bit field corresponding to sport enum type (1 << (sport-40)).
- name='sport_bits_5',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'water_skiing',
- 0x02: 'kayaking',
- 0x04: 'rafting',
- 0x08: 'windsurfing',
- 0x10: 'kitesurfing',
- 0x20: 'tactical',
- 0x40: 'jumpmaster',
- 0x80: 'boxing',
- },
- ),
- 'sport_bits_6': FieldType( # Bit field corresponding to sport enum type (1 << (sport-48)).
- name='sport_bits_6',
- base_type=BASE_TYPES[0x0A], # uint8z
- values={
- 0x01: 'floor_climbing',
- },
- ),
- 'sport_event': FieldType(
- name='sport_event',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'uncategorized',
- 1: 'geocaching',
- 2: 'fitness',
- 3: 'recreation',
- 4: 'race',
- 5: 'special_event',
- 6: 'training',
- 7: 'transportation',
- 8: 'touring',
- },
- ),
- 'squat_exercise_name': FieldType(
- name='squat_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'leg_press',
- 1: 'back_squat_with_body_bar',
- 2: 'back_squats',
- 3: 'weighted_back_squats',
- 4: 'balancing_squat',
- 5: 'weighted_balancing_squat',
- 6: 'barbell_back_squat',
- 7: 'barbell_box_squat',
- 8: 'barbell_front_squat',
- 9: 'barbell_hack_squat',
- 10: 'barbell_hang_squat_snatch',
- 11: 'barbell_lateral_step_up',
- 12: 'barbell_quarter_squat',
- 13: 'barbell_siff_squat',
- 14: 'barbell_squat_snatch',
- 15: 'barbell_squat_with_heels_raised',
- 16: 'barbell_stepover',
- 17: 'barbell_step_up',
- 18: 'bench_squat_with_rotational_chop',
- 19: 'weighted_bench_squat_with_rotational_chop',
- 20: 'body_weight_wall_squat',
- 21: 'weighted_wall_squat',
- 22: 'box_step_squat',
- 23: 'weighted_box_step_squat',
- 24: 'braced_squat',
- 25: 'crossed_arm_barbell_front_squat',
- 26: 'crossover_dumbbell_step_up',
- 27: 'dumbbell_front_squat',
- 28: 'dumbbell_split_squat',
- 29: 'dumbbell_squat',
- 30: 'dumbbell_squat_clean',
- 31: 'dumbbell_stepover',
- 32: 'dumbbell_step_up',
- 33: 'elevated_single_leg_squat',
- 34: 'weighted_elevated_single_leg_squat',
- 35: 'figure_four_squats',
- 36: 'weighted_figure_four_squats',
- 37: 'goblet_squat',
- 38: 'kettlebell_squat',
- 39: 'kettlebell_swing_overhead',
- 40: 'kettlebell_swing_with_flip_to_squat',
- 41: 'lateral_dumbbell_step_up',
- 42: 'one_legged_squat',
- 43: 'overhead_dumbbell_squat',
- 44: 'overhead_squat',
- 45: 'partial_single_leg_squat',
- 46: 'weighted_partial_single_leg_squat',
- 47: 'pistol_squat',
- 48: 'weighted_pistol_squat',
- 49: 'plie_slides',
- 50: 'weighted_plie_slides',
- 51: 'plie_squat',
- 52: 'weighted_plie_squat',
- 53: 'prisoner_squat',
- 54: 'weighted_prisoner_squat',
- 55: 'single_leg_bench_get_up',
- 56: 'weighted_single_leg_bench_get_up',
- 57: 'single_leg_bench_squat',
- 58: 'weighted_single_leg_bench_squat',
- 59: 'single_leg_squat_on_swiss_ball',
- 60: 'weighted_single_leg_squat_on_swiss_ball',
- 61: 'squat',
- 62: 'weighted_squat',
- 63: 'squats_with_band',
- 64: 'staggered_squat',
- 65: 'weighted_staggered_squat',
- 66: 'step_up',
- 67: 'weighted_step_up',
- 68: 'suitcase_squats',
- 69: 'sumo_squat',
- 70: 'sumo_squat_slide_in',
- 71: 'weighted_sumo_squat_slide_in',
- 72: 'sumo_squat_to_high_pull',
- 73: 'sumo_squat_to_stand',
- 74: 'weighted_sumo_squat_to_stand',
- 75: 'sumo_squat_with_rotation',
- 76: 'weighted_sumo_squat_with_rotation',
- 77: 'swiss_ball_body_weight_wall_squat',
- 78: 'weighted_swiss_ball_wall_squat',
- 79: 'thrusters',
- 80: 'uneven_squat',
- 81: 'weighted_uneven_squat',
- 82: 'waist_slimming_squat',
- 83: 'wall_ball',
- 84: 'wide_stance_barbell_squat',
- 85: 'wide_stance_goblet_squat',
- 86: 'zercher_squat',
- },
- ),
- 'stroke_type': FieldType(
- name='stroke_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'no_event',
- 1: 'other', # stroke was detected but cannot be identified
- 2: 'serve',
- 3: 'forehand',
- 4: 'backhand',
- 5: 'smash',
- },
- ),
- 'sub_sport': FieldType(
- name='sub_sport',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'generic',
- 1: 'treadmill', # Run/Fitness Equipment
- 2: 'street', # Run
- 3: 'trail', # Run
- 4: 'track', # Run
- 5: 'spin', # Cycling
- 6: 'indoor_cycling', # Cycling/Fitness Equipment
- 7: 'road', # Cycling
- 8: 'mountain', # Cycling
- 9: 'downhill', # Cycling
- 10: 'recumbent', # Cycling
- 11: 'cyclocross', # Cycling
- 12: 'hand_cycling', # Cycling
- 13: 'track_cycling', # Cycling
- 14: 'indoor_rowing', # Fitness Equipment
- 15: 'elliptical', # Fitness Equipment
- 16: 'stair_climbing', # Fitness Equipment
- 17: 'lap_swimming', # Swimming
- 18: 'open_water', # Swimming
- 19: 'flexibility_training', # Training
- 20: 'strength_training', # Training
- 21: 'warm_up', # Tennis
- 22: 'match', # Tennis
- 23: 'exercise', # Tennis
- 24: 'challenge',
- 25: 'indoor_skiing', # Fitness Equipment
- 26: 'cardio_training', # Training
- 27: 'indoor_walking', # Walking/Fitness Equipment
- 28: 'e_bike_fitness', # E-Biking
- 29: 'bmx', # Cycling
- 30: 'casual_walking', # Walking
- 31: 'speed_walking', # Walking
- 32: 'bike_to_run_transition', # Transition
- 33: 'run_to_bike_transition', # Transition
- 34: 'swim_to_bike_transition', # Transition
- 35: 'atv', # Motorcycling
- 36: 'motocross', # Motorcycling
- 37: 'backcountry', # Alpine Skiing/Snowboarding
- 38: 'resort', # Alpine Skiing/Snowboarding
- 39: 'rc_drone', # Flying
- 40: 'wingsuit', # Flying
- 41: 'whitewater', # Kayaking/Rafting
- 42: 'skate_skiing', # Cross Country Skiing
- 43: 'yoga', # Training
- 44: 'pilates', # Training
- 45: 'indoor_running', # Run
- 46: 'gravel_cycling', # Cycling
- 47: 'e_bike_mountain', # Cycling
- 48: 'commuting', # Cycling
- 49: 'mixed_surface', # Cycling
- 50: 'navigate',
- 51: 'track_me',
- 52: 'map',
- 53: 'single_gas_diving', # Diving
- 54: 'multi_gas_diving', # Diving
- 55: 'gauge_diving', # Diving
- 56: 'apnea_diving', # Diving
- 57: 'apnea_hunting', # Diving
- 58: 'virtual_activity',
- 59: 'obstacle', # Used for events where participants run, crawl through mud, climb over walls, etc.
- 254: 'all',
- },
- ),
- 'supported_exd_screen_layouts': FieldType(
- name='supported_exd_screen_layouts',
- base_type=BASE_TYPES[0x8C], # uint32z
- values={
- 0x00000001: 'full_screen',
- 0x00000002: 'half_vertical',
- 0x00000004: 'half_horizontal',
- 0x00000008: 'half_vertical_right_split',
- 0x00000010: 'half_horizontal_bottom_split',
- 0x00000020: 'full_quarter_split',
- 0x00000040: 'half_vertical_left_split',
- 0x00000080: 'half_horizontal_top_split',
- },
- ),
- 'swim_stroke': FieldType(
- name='swim_stroke',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'freestyle',
- 1: 'backstroke',
- 2: 'breaststroke',
- 3: 'butterfly',
- 4: 'drill',
- 5: 'mixed',
- 6: 'im', # IM is a mixed interval containing the same number of lengths for each of: Butterfly, Backstroke, Breaststroke, Freestyle, swam in that order.
- },
- ),
- 'switch': FieldType(
- name='switch',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'off',
- 1: 'on',
- 2: 'auto',
- },
- ),
- 'time_into_day': FieldType( # number of seconds into the day since 00:00:00 UTC
- name='time_into_day',
- base_type=BASE_TYPES[0x86], # uint32
- ),
- 'time_mode': FieldType(
- name='time_mode',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'hour12',
- 1: 'hour24', # Does not use a leading zero and has a colon
- 2: 'military', # Uses a leading zero and does not have a colon
- 3: 'hour_12_with_seconds',
- 4: 'hour_24_with_seconds',
- 5: 'utc',
- },
- ),
- 'time_zone': FieldType(
- name='time_zone',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'almaty',
- 1: 'bangkok',
- 2: 'bombay',
- 3: 'brasilia',
- 4: 'cairo',
- 5: 'cape_verde_is',
- 6: 'darwin',
- 7: 'eniwetok',
- 8: 'fiji',
- 9: 'hong_kong',
- 10: 'islamabad',
- 11: 'kabul',
- 12: 'magadan',
- 13: 'mid_atlantic',
- 14: 'moscow',
- 15: 'muscat',
- 16: 'newfoundland',
- 17: 'samoa',
- 18: 'sydney',
- 19: 'tehran',
- 20: 'tokyo',
- 21: 'us_alaska',
- 22: 'us_atlantic',
- 23: 'us_central',
- 24: 'us_eastern',
- 25: 'us_hawaii',
- 26: 'us_mountain',
- 27: 'us_pacific',
- 28: 'other',
- 29: 'auckland',
- 30: 'kathmandu',
- 31: 'europe_western_wet',
- 32: 'europe_central_cet',
- 33: 'europe_eastern_eet',
- 34: 'jakarta',
- 35: 'perth',
- 36: 'adelaide',
- 37: 'brisbane',
- 38: 'tasmania',
- 39: 'iceland',
- 40: 'amsterdam',
- 41: 'athens',
- 42: 'barcelona',
- 43: 'berlin',
- 44: 'brussels',
- 45: 'budapest',
- 46: 'copenhagen',
- 47: 'dublin',
- 48: 'helsinki',
- 49: 'lisbon',
- 50: 'london',
- 51: 'madrid',
- 52: 'munich',
- 53: 'oslo',
- 54: 'paris',
- 55: 'prague',
- 56: 'reykjavik',
- 57: 'rome',
- 58: 'stockholm',
- 59: 'vienna',
- 60: 'warsaw',
- 61: 'zurich',
- 62: 'quebec',
- 63: 'ontario',
- 64: 'manitoba',
- 65: 'saskatchewan',
- 66: 'alberta',
- 67: 'british_columbia',
- 68: 'boise',
- 69: 'boston',
- 70: 'chicago',
- 71: 'dallas',
- 72: 'denver',
- 73: 'kansas_city',
- 74: 'las_vegas',
- 75: 'los_angeles',
- 76: 'miami',
- 77: 'minneapolis',
- 78: 'new_york',
- 79: 'new_orleans',
- 80: 'phoenix',
- 81: 'santa_fe',
- 82: 'seattle',
- 83: 'washington_dc',
- 84: 'us_arizona',
- 85: 'chita',
- 86: 'ekaterinburg',
- 87: 'irkutsk',
- 88: 'kaliningrad',
- 89: 'krasnoyarsk',
- 90: 'novosibirsk',
- 91: 'petropavlovsk_kamchatskiy',
- 92: 'samara',
- 93: 'vladivostok',
- 94: 'mexico_central',
- 95: 'mexico_mountain',
- 96: 'mexico_pacific',
- 97: 'cape_town',
- 98: 'winkhoek',
- 99: 'lagos',
- 100: 'riyahd',
- 101: 'venezuela',
- 102: 'australia_lh',
- 103: 'santiago',
- 253: 'manual',
- 254: 'automatic',
- },
- ),
- 'timer_trigger': FieldType( # timer event data
- name='timer_trigger',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'manual',
- 1: 'auto',
- 2: 'fitness_equipment',
- },
- ),
- 'tissue_model_type': FieldType(
- name='tissue_model_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'zhl_16c', # Buhlmann's decompression algorithm, version C
- },
- ),
- 'tone': FieldType(
- name='tone',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'off',
- 1: 'tone',
- 2: 'vibrate',
- 3: 'tone_and_vibrate',
- },
- ),
- 'total_body_exercise_name': FieldType(
- name='total_body_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'burpee',
- 1: 'weighted_burpee',
- 2: 'burpee_box_jump',
- 3: 'weighted_burpee_box_jump',
- 4: 'high_pull_burpee',
- 5: 'man_makers',
- 6: 'one_arm_burpee',
- 7: 'squat_thrusts',
- 8: 'weighted_squat_thrusts',
- 9: 'squat_plank_push_up',
- 10: 'weighted_squat_plank_push_up',
- 11: 'standing_t_rotation_balance',
- 12: 'weighted_standing_t_rotation_balance',
- },
- ),
- 'triceps_extension_exercise_name': FieldType(
- name='triceps_extension_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'bench_dip',
- 1: 'weighted_bench_dip',
- 2: 'body_weight_dip',
- 3: 'cable_kickback',
- 4: 'cable_lying_triceps_extension',
- 5: 'cable_overhead_triceps_extension',
- 6: 'dumbbell_kickback',
- 7: 'dumbbell_lying_triceps_extension',
- 8: 'ez_bar_overhead_triceps_extension',
- 9: 'incline_dip',
- 10: 'weighted_incline_dip',
- 11: 'incline_ez_bar_lying_triceps_extension',
- 12: 'lying_dumbbell_pullover_to_extension',
- 13: 'lying_ez_bar_triceps_extension',
- 14: 'lying_triceps_extension_to_close_grip_bench_press',
- 15: 'overhead_dumbbell_triceps_extension',
- 16: 'reclining_triceps_press',
- 17: 'reverse_grip_pressdown',
- 18: 'reverse_grip_triceps_pressdown',
- 19: 'rope_pressdown',
- 20: 'seated_barbell_overhead_triceps_extension',
- 21: 'seated_dumbbell_overhead_triceps_extension',
- 22: 'seated_ez_bar_overhead_triceps_extension',
- 23: 'seated_single_arm_overhead_dumbbell_extension',
- 24: 'single_arm_dumbbell_overhead_triceps_extension',
- 25: 'single_dumbbell_seated_overhead_triceps_extension',
- 26: 'single_leg_bench_dip_and_kick',
- 27: 'weighted_single_leg_bench_dip_and_kick',
- 28: 'single_leg_dip',
- 29: 'weighted_single_leg_dip',
- 30: 'static_lying_triceps_extension',
- 31: 'suspended_dip',
- 32: 'weighted_suspended_dip',
- 33: 'swiss_ball_dumbbell_lying_triceps_extension',
- 34: 'swiss_ball_ez_bar_lying_triceps_extension',
- 35: 'swiss_ball_ez_bar_overhead_triceps_extension',
- 36: 'tabletop_dip',
- 37: 'weighted_tabletop_dip',
- 38: 'triceps_extension_on_floor',
- 39: 'triceps_pressdown',
- 40: 'weighted_dip',
- },
- ),
- 'turn_type': FieldType(
- name='turn_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'arriving_idx',
- 1: 'arriving_left_idx',
- 2: 'arriving_right_idx',
- 3: 'arriving_via_idx',
- 4: 'arriving_via_left_idx',
- 5: 'arriving_via_right_idx',
- 6: 'bear_keep_left_idx',
- 7: 'bear_keep_right_idx',
- 8: 'continue_idx',
- 9: 'exit_left_idx',
- 10: 'exit_right_idx',
- 11: 'ferry_idx',
- 12: 'roundabout_45_idx',
- 13: 'roundabout_90_idx',
- 14: 'roundabout_135_idx',
- 15: 'roundabout_180_idx',
- 16: 'roundabout_225_idx',
- 17: 'roundabout_270_idx',
- 18: 'roundabout_315_idx',
- 19: 'roundabout_360_idx',
- 20: 'roundabout_neg_45_idx',
- 21: 'roundabout_neg_90_idx',
- 22: 'roundabout_neg_135_idx',
- 23: 'roundabout_neg_180_idx',
- 24: 'roundabout_neg_225_idx',
- 25: 'roundabout_neg_270_idx',
- 26: 'roundabout_neg_315_idx',
- 27: 'roundabout_neg_360_idx',
- 28: 'roundabout_generic_idx',
- 29: 'roundabout_neg_generic_idx',
- 30: 'sharp_turn_left_idx',
- 31: 'sharp_turn_right_idx',
- 32: 'turn_left_idx',
- 33: 'turn_right_idx',
- 34: 'uturn_left_idx',
- 35: 'uturn_right_idx',
- 36: 'icon_inv_idx',
- 37: 'icon_idx_cnt',
- },
- ),
- 'user_local_id': FieldType(
- name='user_local_id',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0x0000: 'local_min',
- 0x000F: 'local_max',
- 0x0010: 'stationary_min',
- 0x00FF: 'stationary_max',
- 0x0100: 'portable_min',
- 0xFFFE: 'portable_max',
- },
- ),
- 'warm_up_exercise_name': FieldType(
- name='warm_up_exercise_name',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0: 'quadruped_rocking',
- 1: 'neck_tilts',
- 2: 'ankle_circles',
- 3: 'ankle_dorsiflexion_with_band',
- 4: 'ankle_internal_rotation',
- 5: 'arm_circles',
- 6: 'bent_over_reach_to_sky',
- 7: 'cat_camel',
- 8: 'elbow_to_foot_lunge',
- 9: 'forward_and_backward_leg_swings',
- 10: 'groiners',
- 11: 'inverted_hamstring_stretch',
- 12: 'lateral_duck_under',
- 13: 'neck_rotations',
- 14: 'opposite_arm_and_leg_balance',
- 15: 'reach_roll_and_lift',
- 16: 'scorpion',
- 17: 'shoulder_circles',
- 18: 'side_to_side_leg_swings',
- 19: 'sleeper_stretch',
- 20: 'slide_out',
- 21: 'swiss_ball_hip_crossover',
- 22: 'swiss_ball_reach_roll_and_lift',
- 23: 'swiss_ball_windshield_wipers',
- 24: 'thoracic_rotation',
- 25: 'walking_high_kicks',
- 26: 'walking_high_knees',
- 27: 'walking_knee_hugs',
- 28: 'walking_leg_cradles',
- 29: 'walkout',
- 30: 'walkout_from_push_up_position',
- },
- ),
- 'watchface_mode': FieldType(
- name='watchface_mode',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'digital',
- 1: 'analog',
- 2: 'connect_iq',
- 3: 'disabled',
- },
- ),
- 'water_type': FieldType(
- name='water_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'fresh',
- 1: 'salt',
- 2: 'en13319',
- 3: 'custom',
- },
- ),
- 'weather_report': FieldType(
- name='weather_report',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'current',
- 1: 'forecast', # Deprecated use hourly_forecast instead
- 1: 'hourly_forecast',
- 2: 'daily_forecast',
- },
- ),
- 'weather_severe_type': FieldType(
- name='weather_severe_type',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'unspecified',
- 1: 'tornado',
- 2: 'tsunami',
- 3: 'hurricane',
- 4: 'extreme_wind',
- 5: 'typhoon',
- 6: 'inland_hurricane',
- 7: 'hurricane_force_wind',
- 8: 'waterspout',
- 9: 'severe_thunderstorm',
- 10: 'wreckhouse_winds',
- 11: 'les_suetes_wind',
- 12: 'avalanche',
- 13: 'flash_flood',
- 14: 'tropical_storm',
- 15: 'inland_tropical_storm',
- 16: 'blizzard',
- 17: 'ice_storm',
- 18: 'freezing_rain',
- 19: 'debris_flow',
- 20: 'flash_freeze',
- 21: 'dust_storm',
- 22: 'high_wind',
- 23: 'winter_storm',
- 24: 'heavy_freezing_spray',
- 25: 'extreme_cold',
- 26: 'wind_chill',
- 27: 'cold_wave',
- 28: 'heavy_snow_alert',
- 29: 'lake_effect_blowing_snow',
- 30: 'snow_squall',
- 31: 'lake_effect_snow',
- 32: 'winter_weather',
- 33: 'sleet',
- 34: 'snowfall',
- 35: 'snow_and_blowing_snow',
- 36: 'blowing_snow',
- 37: 'snow_alert',
- 38: 'arctic_outflow',
- 39: 'freezing_drizzle',
- 40: 'storm',
- 41: 'storm_surge',
- 42: 'rainfall',
- 43: 'areal_flood',
- 44: 'coastal_flood',
- 45: 'lakeshore_flood',
- 46: 'excessive_heat',
- 47: 'heat',
- 48: 'weather',
- 49: 'high_heat_and_humidity',
- 50: 'humidex_and_health',
- 51: 'humidex',
- 52: 'gale',
- 53: 'freezing_spray',
- 54: 'special_marine',
- 55: 'squall',
- 56: 'strong_wind',
- 57: 'lake_wind',
- 58: 'marine_weather',
- 59: 'wind',
- 60: 'small_craft_hazardous_seas',
- 61: 'hazardous_seas',
- 62: 'small_craft',
- 63: 'small_craft_winds',
- 64: 'small_craft_rough_bar',
- 65: 'high_water_level',
- 66: 'ashfall',
- 67: 'freezing_fog',
- 68: 'dense_fog',
- 69: 'dense_smoke',
- 70: 'blowing_dust',
- 71: 'hard_freeze',
- 72: 'freeze',
- 73: 'frost',
- 74: 'fire_weather',
- 75: 'flood',
- 76: 'rip_tide',
- 77: 'high_surf',
- 78: 'smog',
- 79: 'air_quality',
- 80: 'brisk_wind',
- 81: 'air_stagnation',
- 82: 'low_water',
- 83: 'hydrological',
- 84: 'special_weather',
- },
- ),
- 'weather_severity': FieldType(
- name='weather_severity',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'unknown',
- 1: 'warning',
- 2: 'watch',
- 3: 'advisory',
- 4: 'statement',
- },
- ),
- 'weather_status': FieldType(
- name='weather_status',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'clear',
- 1: 'partly_cloudy',
- 2: 'mostly_cloudy',
- 3: 'rain',
- 4: 'snow',
- 5: 'windy',
- 6: 'thunderstorms',
- 7: 'wintry_mix',
- 8: 'fog',
- 11: 'hazy',
- 12: 'hail',
- 13: 'scattered_showers',
- 14: 'scattered_thunderstorms',
- 15: 'unknown_precipitation',
- 16: 'light_rain',
- 17: 'heavy_rain',
- 18: 'light_snow',
- 19: 'heavy_snow',
- 20: 'light_rain_snow',
- 21: 'heavy_rain_snow',
- 22: 'cloudy',
- },
- ),
- 'weight': FieldType(
- name='weight',
- base_type=BASE_TYPES[0x84], # uint16
- values={
- 0xFFFE: 'calculating',
- },
- ),
- 'wkt_step_duration': FieldType(
- name='wkt_step_duration',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'time',
- 1: 'distance',
- 2: 'hr_less_than',
- 3: 'hr_greater_than',
- 4: 'calories',
- 5: 'open',
- 6: 'repeat_until_steps_cmplt',
- 7: 'repeat_until_time',
- 8: 'repeat_until_distance',
- 9: 'repeat_until_calories',
- 10: 'repeat_until_hr_less_than',
- 11: 'repeat_until_hr_greater_than',
- 12: 'repeat_until_power_less_than',
- 13: 'repeat_until_power_greater_than',
- 14: 'power_less_than',
- 15: 'power_greater_than',
- 16: 'training_peaks_tss',
- 17: 'repeat_until_power_last_lap_less_than',
- 18: 'repeat_until_max_power_last_lap_less_than',
- 19: 'power_3s_less_than',
- 20: 'power_10s_less_than',
- 21: 'power_30s_less_than',
- 22: 'power_3s_greater_than',
- 23: 'power_10s_greater_than',
- 24: 'power_30s_greater_than',
- 25: 'power_lap_less_than',
- 26: 'power_lap_greater_than',
- 27: 'repeat_until_training_peaks_tss',
- 28: 'repetition_time',
- 29: 'reps',
- },
- ),
- 'wkt_step_target': FieldType(
- name='wkt_step_target',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'speed',
- 1: 'heart_rate',
- 2: 'open',
- 3: 'cadence',
- 4: 'power',
- 5: 'grade',
- 6: 'resistance',
- 7: 'power_3s',
- 8: 'power_10s',
- 9: 'power_30s',
- 10: 'power_lap',
- 11: 'swim_stroke',
- 12: 'speed_lap',
- 13: 'heart_rate_lap',
- },
- ),
- 'workout_capabilities': FieldType(
- name='workout_capabilities',
- base_type=BASE_TYPES[0x8C], # uint32z
- values={
- 0x00000001: 'interval',
- 0x00000002: 'custom',
- 0x00000004: 'fitness_equipment',
- 0x00000008: 'firstbeat',
- 0x00000010: 'new_leaf',
- 0x00000020: 'tcx', # For backwards compatibility. Watch should add missing id fields then clear flag.
- 0x00000080: 'speed', # Speed source required for workout step.
- 0x00000100: 'heart_rate', # Heart rate source required for workout step.
- 0x00000200: 'distance', # Distance source required for workout step.
- 0x00000400: 'cadence', # Cadence source required for workout step.
- 0x00000800: 'power', # Power source required for workout step.
- 0x00001000: 'grade', # Grade source required for workout step.
- 0x00002000: 'resistance', # Resistance source required for workout step.
- 0x00004000: 'protected',
- },
- ),
- 'workout_equipment': FieldType(
- name='workout_equipment',
- base_type=BASE_TYPES[0x00], # enum
- values={
- 0: 'none',
- 1: 'swim_fins',
- 2: 'swim_kickboard',
- 3: 'swim_paddles',
- 4: 'swim_pull_buoy',
- 5: 'swim_snorkel',
- },
- ),
- 'workout_hr': FieldType( # 0 - 100 indicates% of max hr; >100 indicates bpm (255 max) plus 100
- name='workout_hr',
- base_type=BASE_TYPES[0x86], # uint32
- values={
- 100: 'bpm_offset',
- },
- ),
- 'workout_power': FieldType( # 0 - 1000 indicates % of functional threshold power; >1000 indicates watts plus 1000.
- name='workout_power',
- base_type=BASE_TYPES[0x86], # uint32
- values={
- 1000: 'watts_offset',
- },
- ),
-}
-
-
-FIELD_TYPE_TIMESTAMP = Field(name='timestamp', type=FIELD_TYPES['date_time'], def_num=253, units='s')
-
-
-MESSAGE_TYPES = {
- # **************************** Common Messages *****************************
- 0: MessageType( # Must be first message in file.
- name='file_id',
- mesg_num=0,
- fields={
- 0: Field(
- name='type',
- type=FIELD_TYPES['file'],
- def_num=0,
- ),
- 1: Field(
- name='manufacturer',
- type=FIELD_TYPES['manufacturer'],
- def_num=1,
- ),
- 2: Field(
- name='product',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- subfields=(
- SubField(
- name='garmin_product',
- def_num=2,
- type=FIELD_TYPES['garmin_product'],
- ref_fields=(
- ReferenceField(
- name='manufacturer',
- def_num=1,
- value='garmin',
- raw_value=1,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=1,
- value='dynastream',
- raw_value=15,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=1,
- value='dynastream_oem',
- raw_value=13,
- ),
- ),
- ),
- ),
- ),
- 3: Field(
- name='serial_number',
- type=BASE_TYPES[0x8C], # uint32z
- def_num=3,
- ),
- 4: Field( # Only set for files that are can be created/erased.
- name='time_created',
- type=FIELD_TYPES['date_time'],
- def_num=4,
- ),
- 5: Field( # Only set for files that are not created/erased.
- name='number',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- ),
- 8: Field( # Optional free form string to indicate the devices name or model
- name='product_name',
- type=BASE_TYPES[0x07], # string
- def_num=8,
- ),
- },
- ),
-
-
- # ************************************ ************************************
- 1: MessageType(
- name='capabilities',
- mesg_num=1,
- fields={
- 0: Field( # Use language_bits_x types where x is index of array.
- name='languages',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=0,
- ),
- 1: Field( # Use sport_bits_x types where x is index of array.
- name='sports',
- type=FIELD_TYPES['sport_bits_0'],
- def_num=1,
- ),
- 21: Field(
- name='workouts_supported',
- type=FIELD_TYPES['workout_capabilities'],
- def_num=21,
- ),
- 23: Field(
- name='connectivity_supported',
- type=FIELD_TYPES['connectivity_capabilities'],
- def_num=23,
- ),
- },
- ),
- 4: MessageType(
- name='hrm_profile',
- mesg_num=4,
- fields={
- 0: Field(
- name='enabled',
- type=FIELD_TYPES['bool'],
- def_num=0,
- ),
- 1: Field(
- name='hrm_ant_id',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=1,
- ),
- 2: Field(
- name='log_hrv',
- type=FIELD_TYPES['bool'],
- def_num=2,
- ),
- 3: Field(
- name='hrm_ant_id_trans_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=3,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 5: MessageType(
- name='sdm_profile',
- mesg_num=5,
- fields={
- 0: Field(
- name='enabled',
- type=FIELD_TYPES['bool'],
- def_num=0,
- ),
- 1: Field(
- name='sdm_ant_id',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=1,
- ),
- 2: Field(
- name='sdm_cal_factor',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- scale=10,
- units='%',
- ),
- 3: Field(
- name='odometer',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- scale=100,
- units='m',
- ),
- 4: Field( # Use footpod for speed source instead of GPS
- name='speed_source',
- type=FIELD_TYPES['bool'],
- def_num=4,
- ),
- 5: Field(
- name='sdm_ant_id_trans_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=5,
- ),
- 7: Field( # Rollover counter that can be used to extend the odometer
- name='odometer_rollover',
- type=BASE_TYPES[0x02], # uint8
- def_num=7,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 6: MessageType(
- name='bike_profile',
- mesg_num=6,
- fields={
- 0: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=1,
- ),
- 2: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=2,
- ),
- 3: Field(
- name='odometer',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- scale=100,
- units='m',
- ),
- 4: Field(
- name='bike_spd_ant_id',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=4,
- ),
- 5: Field(
- name='bike_cad_ant_id',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=5,
- ),
- 6: Field(
- name='bike_spdcad_ant_id',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=6,
- ),
- 7: Field(
- name='bike_power_ant_id',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=7,
- ),
- 8: Field(
- name='custom_wheelsize',
- type=BASE_TYPES[0x84], # uint16
- def_num=8,
- scale=1000,
- units='m',
- ),
- 9: Field(
- name='auto_wheelsize',
- type=BASE_TYPES[0x84], # uint16
- def_num=9,
- scale=1000,
- units='m',
- ),
- 10: Field(
- name='bike_weight',
- type=BASE_TYPES[0x84], # uint16
- def_num=10,
- scale=10,
- units='kg',
- ),
- 11: Field(
- name='power_cal_factor',
- type=BASE_TYPES[0x84], # uint16
- def_num=11,
- scale=10,
- units='%',
- ),
- 12: Field(
- name='auto_wheel_cal',
- type=FIELD_TYPES['bool'],
- def_num=12,
- ),
- 13: Field(
- name='auto_power_zero',
- type=FIELD_TYPES['bool'],
- def_num=13,
- ),
- 14: Field(
- name='id',
- type=BASE_TYPES[0x02], # uint8
- def_num=14,
- ),
- 15: Field(
- name='spd_enabled',
- type=FIELD_TYPES['bool'],
- def_num=15,
- ),
- 16: Field(
- name='cad_enabled',
- type=FIELD_TYPES['bool'],
- def_num=16,
- ),
- 17: Field(
- name='spdcad_enabled',
- type=FIELD_TYPES['bool'],
- def_num=17,
- ),
- 18: Field(
- name='power_enabled',
- type=FIELD_TYPES['bool'],
- def_num=18,
- ),
- 19: Field(
- name='crank_length',
- type=BASE_TYPES[0x02], # uint8
- def_num=19,
- scale=2,
- offset=-110,
- units='mm',
- ),
- 20: Field(
- name='enabled',
- type=FIELD_TYPES['bool'],
- def_num=20,
- ),
- 21: Field(
- name='bike_spd_ant_id_trans_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=21,
- ),
- 22: Field(
- name='bike_cad_ant_id_trans_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=22,
- ),
- 23: Field(
- name='bike_spdcad_ant_id_trans_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=23,
- ),
- 24: Field(
- name='bike_power_ant_id_trans_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=24,
- ),
- 37: Field( # Rollover counter that can be used to extend the odometer
- name='odometer_rollover',
- type=BASE_TYPES[0x02], # uint8
- def_num=37,
- ),
- 38: Field( # Number of front gears
- name='front_gear_num',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=38,
- ),
- 39: Field( # Number of teeth on each gear 0 is innermost
- name='front_gear',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=39,
- ),
- 40: Field( # Number of rear gears
- name='rear_gear_num',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=40,
- ),
- 41: Field( # Number of teeth on each gear 0 is innermost
- name='rear_gear',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=41,
- ),
- 44: Field(
- name='shimano_di2_enabled',
- type=FIELD_TYPES['bool'],
- def_num=44,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 8: MessageType(
- name='hr_zone',
- mesg_num=8,
- fields={
- 1: Field(
- name='high_bpm',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- units='bpm',
- ),
- 2: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=2,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 9: MessageType(
- name='power_zone',
- mesg_num=9,
- fields={
- 1: Field(
- name='high_value',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='watts',
- ),
- 2: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=2,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 10: MessageType(
- name='met_zone',
- mesg_num=10,
- fields={
- 1: Field(
- name='high_bpm',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- ),
- 2: Field(
- name='calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- scale=10,
- units='kcal/min',
- ),
- 3: Field(
- name='fat_calories',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- scale=10,
- units='kcal/min',
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 12: MessageType(
- name='sport',
- mesg_num=12,
- fields={
- 0: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=0,
- ),
- 1: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=1,
- ),
- 3: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=3,
- ),
- },
- ),
- 18: MessageType(
- name='session',
- mesg_num=18,
- fields={
- 0: Field( # session
- name='event',
- type=FIELD_TYPES['event'],
- def_num=0,
- ),
- 1: Field( # stop
- name='event_type',
- type=FIELD_TYPES['event_type'],
- def_num=1,
- ),
- 2: Field(
- name='start_time',
- type=FIELD_TYPES['date_time'],
- def_num=2,
- ),
- 3: Field(
- name='start_position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=3,
- units='semicircles',
- ),
- 4: Field(
- name='start_position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=4,
- units='semicircles',
- ),
- 5: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=5,
- ),
- 6: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=6,
- ),
- 7: Field( # Time (includes pauses)
- name='total_elapsed_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=7,
- scale=1000,
- units='s',
- ),
- 8: Field( # Timer Time (excludes pauses)
- name='total_timer_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=8,
- scale=1000,
- units='s',
- ),
- 9: Field(
- name='total_distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=9,
- scale=100,
- units='m',
- ),
- 10: Field(
- name='total_cycles',
- type=BASE_TYPES[0x86], # uint32
- def_num=10,
- units='cycles',
- subfields=(
- SubField(
- name='total_strides',
- def_num=10,
- type=BASE_TYPES[0x86], # uint32
- units='strides',
- ref_fields=(
- ReferenceField(
- name='sport',
- def_num=5,
- value='running',
- raw_value=1,
- ),
- ReferenceField(
- name='sport',
- def_num=5,
- value='walking',
- raw_value=11,
- ),
- ),
- ),
- ),
- ),
- 11: Field(
- name='total_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=11,
- units='kcal',
- ),
- 13: Field(
- name='total_fat_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=13,
- units='kcal',
- ),
- 14: Field( # total_distance / total_timer_time
- name='avg_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=14,
- components=(
- ComponentField(
- name='enhanced_avg_speed',
- def_num=124,
- scale=1000,
- units='m/s',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 15: Field(
- name='max_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=15,
- components=(
- ComponentField(
- name='enhanced_max_speed',
- def_num=125,
- scale=1000,
- units='m/s',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 16: Field( # average heart rate (excludes pause time)
- name='avg_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=16,
- units='bpm',
- ),
- 17: Field(
- name='max_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=17,
- units='bpm',
- ),
- 18: Field( # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time
- name='avg_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=18,
- units='rpm',
- subfields=(
- SubField(
- name='avg_running_cadence',
- def_num=18,
- type=BASE_TYPES[0x02], # uint8
- units='strides/min',
- ref_fields=(
- ReferenceField(
- name='sport',
- def_num=5,
- value='running',
- raw_value=1,
- ),
- ),
- ),
- ),
- ),
- 19: Field(
- name='max_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=19,
- units='rpm',
- subfields=(
- SubField(
- name='max_running_cadence',
- def_num=19,
- type=BASE_TYPES[0x02], # uint8
- units='strides/min',
- ref_fields=(
- ReferenceField(
- name='sport',
- def_num=5,
- value='running',
- raw_value=1,
- ),
- ),
- ),
- ),
- ),
- 20: Field( # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time
- name='avg_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=20,
- units='watts',
- ),
- 21: Field(
- name='max_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=21,
- units='watts',
- ),
- 22: Field(
- name='total_ascent',
- type=BASE_TYPES[0x84], # uint16
- def_num=22,
- units='m',
- ),
- 23: Field(
- name='total_descent',
- type=BASE_TYPES[0x84], # uint16
- def_num=23,
- units='m',
- ),
- 24: Field(
- name='total_training_effect',
- type=BASE_TYPES[0x02], # uint8
- def_num=24,
- scale=10,
- ),
- 25: Field(
- name='first_lap_index',
- type=BASE_TYPES[0x84], # uint16
- def_num=25,
- ),
- 26: Field(
- name='num_laps',
- type=BASE_TYPES[0x84], # uint16
- def_num=26,
- ),
- 27: Field(
- name='event_group',
- type=BASE_TYPES[0x02], # uint8
- def_num=27,
- ),
- 28: Field(
- name='trigger',
- type=FIELD_TYPES['session_trigger'],
- def_num=28,
- ),
- 29: Field(
- name='nec_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=29,
- units='semicircles',
- ),
- 30: Field(
- name='nec_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=30,
- units='semicircles',
- ),
- 31: Field(
- name='swc_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=31,
- units='semicircles',
- ),
- 32: Field(
- name='swc_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=32,
- units='semicircles',
- ),
- 34: Field(
- name='normalized_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=34,
- units='watts',
- ),
- 35: Field(
- name='training_stress_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=35,
- scale=10,
- units='tss',
- ),
- 36: Field(
- name='intensity_factor',
- type=BASE_TYPES[0x84], # uint16
- def_num=36,
- scale=1000,
- units='if',
- ),
- 37: Field(
- name='left_right_balance',
- type=FIELD_TYPES['left_right_balance_100'],
- def_num=37,
- ),
- 41: Field(
- name='avg_stroke_count',
- type=BASE_TYPES[0x86], # uint32
- def_num=41,
- scale=10,
- units='strokes/lap',
- ),
- 42: Field(
- name='avg_stroke_distance',
- type=BASE_TYPES[0x84], # uint16
- def_num=42,
- scale=100,
- units='m',
- ),
- 43: Field(
- name='swim_stroke',
- type=FIELD_TYPES['swim_stroke'],
- def_num=43,
- units='swim_stroke',
- ),
- 44: Field(
- name='pool_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=44,
- scale=100,
- units='m',
- ),
- 45: Field(
- name='threshold_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=45,
- units='watts',
- ),
- 46: Field(
- name='pool_length_unit',
- type=FIELD_TYPES['display_measure'],
- def_num=46,
- ),
- 47: Field( # # of active lengths of swim pool
- name='num_active_lengths',
- type=BASE_TYPES[0x84], # uint16
- def_num=47,
- units='lengths',
- ),
- 48: Field(
- name='total_work',
- type=BASE_TYPES[0x86], # uint32
- def_num=48,
- units='J',
- ),
- 49: Field(
- name='avg_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=49,
- components=(
- ComponentField(
- name='enhanced_avg_altitude',
- def_num=126,
- scale=5,
- offset=500,
- units='m',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 50: Field(
- name='max_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=50,
- components=(
- ComponentField(
- name='enhanced_max_altitude',
- def_num=128,
- scale=5,
- offset=500,
- units='m',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 51: Field(
- name='gps_accuracy',
- type=BASE_TYPES[0x02], # uint8
- def_num=51,
- units='m',
- ),
- 52: Field(
- name='avg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=52,
- scale=100,
- units='%',
- ),
- 53: Field(
- name='avg_pos_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=53,
- scale=100,
- units='%',
- ),
- 54: Field(
- name='avg_neg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=54,
- scale=100,
- units='%',
- ),
- 55: Field(
- name='max_pos_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=55,
- scale=100,
- units='%',
- ),
- 56: Field(
- name='max_neg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=56,
- scale=100,
- units='%',
- ),
- 57: Field(
- name='avg_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=57,
- units='C',
- ),
- 58: Field(
- name='max_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=58,
- units='C',
- ),
- 59: Field(
- name='total_moving_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=59,
- scale=1000,
- units='s',
- ),
- 60: Field(
- name='avg_pos_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=60,
- scale=1000,
- units='m/s',
- ),
- 61: Field(
- name='avg_neg_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=61,
- scale=1000,
- units='m/s',
- ),
- 62: Field(
- name='max_pos_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=62,
- scale=1000,
- units='m/s',
- ),
- 63: Field(
- name='max_neg_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=63,
- scale=1000,
- units='m/s',
- ),
- 64: Field(
- name='min_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=64,
- units='bpm',
- ),
- 65: Field(
- name='time_in_hr_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=65,
- scale=1000,
- units='s',
- ),
- 66: Field(
- name='time_in_speed_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=66,
- scale=1000,
- units='s',
- ),
- 67: Field(
- name='time_in_cadence_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=67,
- scale=1000,
- units='s',
- ),
- 68: Field(
- name='time_in_power_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=68,
- scale=1000,
- units='s',
- ),
- 69: Field(
- name='avg_lap_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=69,
- scale=1000,
- units='s',
- ),
- 70: Field(
- name='best_lap_index',
- type=BASE_TYPES[0x84], # uint16
- def_num=70,
- ),
- 71: Field(
- name='min_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=71,
- components=(
- ComponentField(
- name='enhanced_min_altitude',
- def_num=127,
- scale=5,
- offset=500,
- units='m',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 82: Field(
- name='player_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=82,
- ),
- 83: Field(
- name='opponent_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=83,
- ),
- 84: Field(
- name='opponent_name',
- type=BASE_TYPES[0x07], # string
- def_num=84,
- ),
- 85: Field( # stroke_type enum used as the index
- name='stroke_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=85,
- units='counts',
- ),
- 86: Field( # zone number used as the index
- name='zone_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=86,
- units='counts',
- ),
- 87: Field(
- name='max_ball_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=87,
- scale=100,
- units='m/s',
- ),
- 88: Field(
- name='avg_ball_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=88,
- scale=100,
- units='m/s',
- ),
- 89: Field(
- name='avg_vertical_oscillation',
- type=BASE_TYPES[0x84], # uint16
- def_num=89,
- scale=10,
- units='mm',
- ),
- 90: Field(
- name='avg_stance_time_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=90,
- scale=100,
- units='percent',
- ),
- 91: Field(
- name='avg_stance_time',
- type=BASE_TYPES[0x84], # uint16
- def_num=91,
- scale=10,
- units='ms',
- ),
- 92: Field( # fractional part of the avg_cadence
- name='avg_fractional_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=92,
- scale=128,
- units='rpm',
- ),
- 93: Field( # fractional part of the max_cadence
- name='max_fractional_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=93,
- scale=128,
- units='rpm',
- ),
- 94: Field( # fractional part of the total_cycles
- name='total_fractional_cycles',
- type=BASE_TYPES[0x02], # uint8
- def_num=94,
- scale=128,
- units='cycles',
- ),
- 95: Field( # Avg saturated and unsaturated hemoglobin
- name='avg_total_hemoglobin_conc',
- type=BASE_TYPES[0x84], # uint16
- def_num=95,
- scale=100,
- units='g/dL',
- ),
- 96: Field( # Min saturated and unsaturated hemoglobin
- name='min_total_hemoglobin_conc',
- type=BASE_TYPES[0x84], # uint16
- def_num=96,
- scale=100,
- units='g/dL',
- ),
- 97: Field( # Max saturated and unsaturated hemoglobin
- name='max_total_hemoglobin_conc',
- type=BASE_TYPES[0x84], # uint16
- def_num=97,
- scale=100,
- units='g/dL',
- ),
- 98: Field( # Avg percentage of hemoglobin saturated with oxygen
- name='avg_saturated_hemoglobin_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=98,
- scale=10,
- units='%',
- ),
- 99: Field( # Min percentage of hemoglobin saturated with oxygen
- name='min_saturated_hemoglobin_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=99,
- scale=10,
- units='%',
- ),
- 100: Field( # Max percentage of hemoglobin saturated with oxygen
- name='max_saturated_hemoglobin_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=100,
- scale=10,
- units='%',
- ),
- 101: Field(
- name='avg_left_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=101,
- scale=2,
- units='percent',
- ),
- 102: Field(
- name='avg_right_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=102,
- scale=2,
- units='percent',
- ),
- 103: Field(
- name='avg_left_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=103,
- scale=2,
- units='percent',
- ),
- 104: Field(
- name='avg_right_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=104,
- scale=2,
- units='percent',
- ),
- 105: Field(
- name='avg_combined_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=105,
- scale=2,
- units='percent',
- ),
- 111: Field(
- name='sport_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=111,
- ),
- 112: Field( # Total time spend in the standing position
- name='time_standing',
- type=BASE_TYPES[0x86], # uint32
- def_num=112,
- scale=1000,
- units='s',
- ),
- 113: Field( # Number of transitions to the standing state
- name='stand_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=113,
- ),
- 114: Field( # Average platform center offset Left
- name='avg_left_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=114,
- units='mm',
- ),
- 115: Field( # Average platform center offset Right
- name='avg_right_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=115,
- units='mm',
- ),
- 116: Field( # Average left power phase angles. Indexes defined by power_phase_type.
- name='avg_left_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=116,
- scale=0.7111111,
- units='degrees',
- ),
- 117: Field( # Average left power phase peak angles. Data value indexes defined by power_phase_type.
- name='avg_left_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=117,
- scale=0.7111111,
- units='degrees',
- ),
- 118: Field( # Average right power phase angles. Data value indexes defined by power_phase_type.
- name='avg_right_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=118,
- scale=0.7111111,
- units='degrees',
- ),
- 119: Field( # Average right power phase peak angles data value indexes defined by power_phase_type.
- name='avg_right_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=119,
- scale=0.7111111,
- units='degrees',
- ),
- 120: Field( # Average power by position. Data value indexes defined by rider_position_type.
- name='avg_power_position',
- type=BASE_TYPES[0x84], # uint16
- def_num=120,
- units='watts',
- ),
- 121: Field( # Maximum power by position. Data value indexes defined by rider_position_type.
- name='max_power_position',
- type=BASE_TYPES[0x84], # uint16
- def_num=121,
- units='watts',
- ),
- 122: Field( # Average cadence by position. Data value indexes defined by rider_position_type.
- name='avg_cadence_position',
- type=BASE_TYPES[0x02], # uint8
- def_num=122,
- units='rpm',
- ),
- 123: Field( # Maximum cadence by position. Data value indexes defined by rider_position_type.
- name='max_cadence_position',
- type=BASE_TYPES[0x02], # uint8
- def_num=123,
- units='rpm',
- ),
- 124: Field( # total_distance / total_timer_time
- name='enhanced_avg_speed',
- type=BASE_TYPES[0x86], # uint32
- def_num=124,
- scale=1000,
- units='m/s',
- ),
- 125: Field(
- name='enhanced_max_speed',
- type=BASE_TYPES[0x86], # uint32
- def_num=125,
- scale=1000,
- units='m/s',
- ),
- 126: Field(
- name='enhanced_avg_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=126,
- scale=5,
- offset=500,
- units='m',
- ),
- 127: Field(
- name='enhanced_min_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=127,
- scale=5,
- offset=500,
- units='m',
- ),
- 128: Field(
- name='enhanced_max_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=128,
- scale=5,
- offset=500,
- units='m',
- ),
- 129: Field( # lev average motor power during session
- name='avg_lev_motor_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=129,
- units='watts',
- ),
- 130: Field( # lev maximum motor power during session
- name='max_lev_motor_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=130,
- units='watts',
- ),
- 131: Field( # lev battery consumption during session
- name='lev_battery_consumption',
- type=BASE_TYPES[0x02], # uint8
- def_num=131,
- scale=2,
- units='percent',
- ),
- 132: Field(
- name='avg_vertical_ratio',
- type=BASE_TYPES[0x84], # uint16
- def_num=132,
- scale=100,
- units='percent',
- ),
- 133: Field(
- name='avg_stance_time_balance',
- type=BASE_TYPES[0x84], # uint16
- def_num=133,
- scale=100,
- units='percent',
- ),
- 134: Field(
- name='avg_step_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=134,
- scale=10,
- units='mm',
- ),
- 137: Field(
- name='total_anaerobic_training_effect',
- type=BASE_TYPES[0x02], # uint8
- def_num=137,
- scale=10,
- ),
- 139: Field(
- name='avg_vam',
- type=BASE_TYPES[0x84], # uint16
- def_num=139,
- scale=1000,
- units='m/s',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Sesson end time.
- 254: Field( # Selected bit is set for the current session.
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 19: MessageType(
- name='lap',
- mesg_num=19,
- fields={
- 0: Field(
- name='event',
- type=FIELD_TYPES['event'],
- def_num=0,
- ),
- 1: Field(
- name='event_type',
- type=FIELD_TYPES['event_type'],
- def_num=1,
- ),
- 2: Field(
- name='start_time',
- type=FIELD_TYPES['date_time'],
- def_num=2,
- ),
- 3: Field(
- name='start_position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=3,
- units='semicircles',
- ),
- 4: Field(
- name='start_position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=4,
- units='semicircles',
- ),
- 5: Field(
- name='end_position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=5,
- units='semicircles',
- ),
- 6: Field(
- name='end_position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=6,
- units='semicircles',
- ),
- 7: Field( # Time (includes pauses)
- name='total_elapsed_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=7,
- scale=1000,
- units='s',
- ),
- 8: Field( # Timer Time (excludes pauses)
- name='total_timer_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=8,
- scale=1000,
- units='s',
- ),
- 9: Field(
- name='total_distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=9,
- scale=100,
- units='m',
- ),
- 10: Field(
- name='total_cycles',
- type=BASE_TYPES[0x86], # uint32
- def_num=10,
- units='cycles',
- subfields=(
- SubField(
- name='total_strides',
- def_num=10,
- type=BASE_TYPES[0x86], # uint32
- units='strides',
- ref_fields=(
- ReferenceField(
- name='sport',
- def_num=25,
- value='running',
- raw_value=1,
- ),
- ReferenceField(
- name='sport',
- def_num=25,
- value='walking',
- raw_value=11,
- ),
- ),
- ),
- ),
- ),
- 11: Field(
- name='total_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=11,
- units='kcal',
- ),
- 12: Field( # If New Leaf
- name='total_fat_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=12,
- units='kcal',
- ),
- 13: Field(
- name='avg_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=13,
- components=(
- ComponentField(
- name='enhanced_avg_speed',
- def_num=110,
- scale=1000,
- units='m/s',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 14: Field(
- name='max_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=14,
- components=(
- ComponentField(
- name='enhanced_max_speed',
- def_num=111,
- scale=1000,
- units='m/s',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 15: Field(
- name='avg_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=15,
- units='bpm',
- ),
- 16: Field(
- name='max_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=16,
- units='bpm',
- ),
- 17: Field( # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time
- name='avg_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=17,
- units='rpm',
- subfields=(
- SubField(
- name='avg_running_cadence',
- def_num=17,
- type=BASE_TYPES[0x02], # uint8
- units='strides/min',
- ref_fields=(
- ReferenceField(
- name='sport',
- def_num=25,
- value='running',
- raw_value=1,
- ),
- ),
- ),
- ),
- ),
- 18: Field(
- name='max_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=18,
- units='rpm',
- subfields=(
- SubField(
- name='max_running_cadence',
- def_num=18,
- type=BASE_TYPES[0x02], # uint8
- units='strides/min',
- ref_fields=(
- ReferenceField(
- name='sport',
- def_num=25,
- value='running',
- raw_value=1,
- ),
- ),
- ),
- ),
- ),
- 19: Field( # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time
- name='avg_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=19,
- units='watts',
- ),
- 20: Field(
- name='max_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=20,
- units='watts',
- ),
- 21: Field(
- name='total_ascent',
- type=BASE_TYPES[0x84], # uint16
- def_num=21,
- units='m',
- ),
- 22: Field(
- name='total_descent',
- type=BASE_TYPES[0x84], # uint16
- def_num=22,
- units='m',
- ),
- 23: Field(
- name='intensity',
- type=FIELD_TYPES['intensity'],
- def_num=23,
- ),
- 24: Field(
- name='lap_trigger',
- type=FIELD_TYPES['lap_trigger'],
- def_num=24,
- ),
- 25: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=25,
- ),
- 26: Field(
- name='event_group',
- type=BASE_TYPES[0x02], # uint8
- def_num=26,
- ),
- 32: Field( # # of lengths of swim pool
- name='num_lengths',
- type=BASE_TYPES[0x84], # uint16
- def_num=32,
- units='lengths',
- ),
- 33: Field(
- name='normalized_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=33,
- units='watts',
- ),
- 34: Field(
- name='left_right_balance',
- type=FIELD_TYPES['left_right_balance_100'],
- def_num=34,
- ),
- 35: Field(
- name='first_length_index',
- type=BASE_TYPES[0x84], # uint16
- def_num=35,
- ),
- 37: Field(
- name='avg_stroke_distance',
- type=BASE_TYPES[0x84], # uint16
- def_num=37,
- scale=100,
- units='m',
- ),
- 38: Field(
- name='swim_stroke',
- type=FIELD_TYPES['swim_stroke'],
- def_num=38,
- ),
- 39: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=39,
- ),
- 40: Field( # # of active lengths of swim pool
- name='num_active_lengths',
- type=BASE_TYPES[0x84], # uint16
- def_num=40,
- units='lengths',
- ),
- 41: Field(
- name='total_work',
- type=BASE_TYPES[0x86], # uint32
- def_num=41,
- units='J',
- ),
- 42: Field(
- name='avg_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=42,
- components=(
- ComponentField(
- name='enhanced_avg_altitude',
- def_num=112,
- scale=5,
- offset=500,
- units='m',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 43: Field(
- name='max_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=43,
- components=(
- ComponentField(
- name='enhanced_max_altitude',
- def_num=114,
- scale=5,
- offset=500,
- units='m',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 44: Field(
- name='gps_accuracy',
- type=BASE_TYPES[0x02], # uint8
- def_num=44,
- units='m',
- ),
- 45: Field(
- name='avg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=45,
- scale=100,
- units='%',
- ),
- 46: Field(
- name='avg_pos_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=46,
- scale=100,
- units='%',
- ),
- 47: Field(
- name='avg_neg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=47,
- scale=100,
- units='%',
- ),
- 48: Field(
- name='max_pos_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=48,
- scale=100,
- units='%',
- ),
- 49: Field(
- name='max_neg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=49,
- scale=100,
- units='%',
- ),
- 50: Field(
- name='avg_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=50,
- units='C',
- ),
- 51: Field(
- name='max_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=51,
- units='C',
- ),
- 52: Field(
- name='total_moving_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=52,
- scale=1000,
- units='s',
- ),
- 53: Field(
- name='avg_pos_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=53,
- scale=1000,
- units='m/s',
- ),
- 54: Field(
- name='avg_neg_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=54,
- scale=1000,
- units='m/s',
- ),
- 55: Field(
- name='max_pos_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=55,
- scale=1000,
- units='m/s',
- ),
- 56: Field(
- name='max_neg_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=56,
- scale=1000,
- units='m/s',
- ),
- 57: Field(
- name='time_in_hr_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=57,
- scale=1000,
- units='s',
- ),
- 58: Field(
- name='time_in_speed_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=58,
- scale=1000,
- units='s',
- ),
- 59: Field(
- name='time_in_cadence_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=59,
- scale=1000,
- units='s',
- ),
- 60: Field(
- name='time_in_power_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=60,
- scale=1000,
- units='s',
- ),
- 61: Field(
- name='repetition_num',
- type=BASE_TYPES[0x84], # uint16
- def_num=61,
- ),
- 62: Field(
- name='min_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=62,
- components=(
- ComponentField(
- name='enhanced_min_altitude',
- def_num=113,
- scale=5,
- offset=500,
- units='m',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 63: Field(
- name='min_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=63,
- units='bpm',
- ),
- 71: Field(
- name='wkt_step_index',
- type=FIELD_TYPES['message_index'],
- def_num=71,
- ),
- 74: Field(
- name='opponent_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=74,
- ),
- 75: Field( # stroke_type enum used as the index
- name='stroke_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=75,
- units='counts',
- ),
- 76: Field( # zone number used as the index
- name='zone_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=76,
- units='counts',
- ),
- 77: Field(
- name='avg_vertical_oscillation',
- type=BASE_TYPES[0x84], # uint16
- def_num=77,
- scale=10,
- units='mm',
- ),
- 78: Field(
- name='avg_stance_time_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=78,
- scale=100,
- units='percent',
- ),
- 79: Field(
- name='avg_stance_time',
- type=BASE_TYPES[0x84], # uint16
- def_num=79,
- scale=10,
- units='ms',
- ),
- 80: Field( # fractional part of the avg_cadence
- name='avg_fractional_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=80,
- scale=128,
- units='rpm',
- ),
- 81: Field( # fractional part of the max_cadence
- name='max_fractional_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=81,
- scale=128,
- units='rpm',
- ),
- 82: Field( # fractional part of the total_cycles
- name='total_fractional_cycles',
- type=BASE_TYPES[0x02], # uint8
- def_num=82,
- scale=128,
- units='cycles',
- ),
- 83: Field(
- name='player_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=83,
- ),
- 84: Field( # Avg saturated and unsaturated hemoglobin
- name='avg_total_hemoglobin_conc',
- type=BASE_TYPES[0x84], # uint16
- def_num=84,
- scale=100,
- units='g/dL',
- ),
- 85: Field( # Min saturated and unsaturated hemoglobin
- name='min_total_hemoglobin_conc',
- type=BASE_TYPES[0x84], # uint16
- def_num=85,
- scale=100,
- units='g/dL',
- ),
- 86: Field( # Max saturated and unsaturated hemoglobin
- name='max_total_hemoglobin_conc',
- type=BASE_TYPES[0x84], # uint16
- def_num=86,
- scale=100,
- units='g/dL',
- ),
- 87: Field( # Avg percentage of hemoglobin saturated with oxygen
- name='avg_saturated_hemoglobin_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=87,
- scale=10,
- units='%',
- ),
- 88: Field( # Min percentage of hemoglobin saturated with oxygen
- name='min_saturated_hemoglobin_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=88,
- scale=10,
- units='%',
- ),
- 89: Field( # Max percentage of hemoglobin saturated with oxygen
- name='max_saturated_hemoglobin_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=89,
- scale=10,
- units='%',
- ),
- 91: Field(
- name='avg_left_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=91,
- scale=2,
- units='percent',
- ),
- 92: Field(
- name='avg_right_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=92,
- scale=2,
- units='percent',
- ),
- 93: Field(
- name='avg_left_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=93,
- scale=2,
- units='percent',
- ),
- 94: Field(
- name='avg_right_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=94,
- scale=2,
- units='percent',
- ),
- 95: Field(
- name='avg_combined_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=95,
- scale=2,
- units='percent',
- ),
- 98: Field( # Total time spent in the standing position
- name='time_standing',
- type=BASE_TYPES[0x86], # uint32
- def_num=98,
- scale=1000,
- units='s',
- ),
- 99: Field( # Number of transitions to the standing state
- name='stand_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=99,
- ),
- 100: Field( # Average left platform center offset
- name='avg_left_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=100,
- units='mm',
- ),
- 101: Field( # Average right platform center offset
- name='avg_right_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=101,
- units='mm',
- ),
- 102: Field( # Average left power phase angles. Data value indexes defined by power_phase_type.
- name='avg_left_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=102,
- scale=0.7111111,
- units='degrees',
- ),
- 103: Field( # Average left power phase peak angles. Data value indexes defined by power_phase_type.
- name='avg_left_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=103,
- scale=0.7111111,
- units='degrees',
- ),
- 104: Field( # Average right power phase angles. Data value indexes defined by power_phase_type.
- name='avg_right_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=104,
- scale=0.7111111,
- units='degrees',
- ),
- 105: Field( # Average right power phase peak angles. Data value indexes defined by power_phase_type.
- name='avg_right_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=105,
- scale=0.7111111,
- units='degrees',
- ),
- 106: Field( # Average power by position. Data value indexes defined by rider_position_type.
- name='avg_power_position',
- type=BASE_TYPES[0x84], # uint16
- def_num=106,
- units='watts',
- ),
- 107: Field( # Maximum power by position. Data value indexes defined by rider_position_type.
- name='max_power_position',
- type=BASE_TYPES[0x84], # uint16
- def_num=107,
- units='watts',
- ),
- 108: Field( # Average cadence by position. Data value indexes defined by rider_position_type.
- name='avg_cadence_position',
- type=BASE_TYPES[0x02], # uint8
- def_num=108,
- units='rpm',
- ),
- 109: Field( # Maximum cadence by position. Data value indexes defined by rider_position_type.
- name='max_cadence_position',
- type=BASE_TYPES[0x02], # uint8
- def_num=109,
- units='rpm',
- ),
- 110: Field(
- name='enhanced_avg_speed',
- type=BASE_TYPES[0x86], # uint32
- def_num=110,
- scale=1000,
- units='m/s',
- ),
- 111: Field(
- name='enhanced_max_speed',
- type=BASE_TYPES[0x86], # uint32
- def_num=111,
- scale=1000,
- units='m/s',
- ),
- 112: Field(
- name='enhanced_avg_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=112,
- scale=5,
- offset=500,
- units='m',
- ),
- 113: Field(
- name='enhanced_min_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=113,
- scale=5,
- offset=500,
- units='m',
- ),
- 114: Field(
- name='enhanced_max_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=114,
- scale=5,
- offset=500,
- units='m',
- ),
- 115: Field( # lev average motor power during lap
- name='avg_lev_motor_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=115,
- units='watts',
- ),
- 116: Field( # lev maximum motor power during lap
- name='max_lev_motor_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=116,
- units='watts',
- ),
- 117: Field( # lev battery consumption during lap
- name='lev_battery_consumption',
- type=BASE_TYPES[0x02], # uint8
- def_num=117,
- scale=2,
- units='percent',
- ),
- 118: Field(
- name='avg_vertical_ratio',
- type=BASE_TYPES[0x84], # uint16
- def_num=118,
- scale=100,
- units='percent',
- ),
- 119: Field(
- name='avg_stance_time_balance',
- type=BASE_TYPES[0x84], # uint16
- def_num=119,
- scale=100,
- units='percent',
- ),
- 120: Field(
- name='avg_step_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=120,
- scale=10,
- units='mm',
- ),
- 121: Field(
- name='avg_vam',
- type=BASE_TYPES[0x84], # uint16
- def_num=121,
- scale=1000,
- units='m/s',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Lap end time.
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 20: MessageType(
- name='record',
- mesg_num=20,
- fields={
- 0: Field(
- name='position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=0,
- units='semicircles',
- ),
- 1: Field(
- name='position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=1,
- units='semicircles',
- ),
- 2: Field(
- name='altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- components=(
- ComponentField(
- name='enhanced_altitude',
- def_num=78,
- scale=5,
- offset=500,
- units='m',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 3: Field(
- name='heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- units='bpm',
- ),
- 4: Field(
- name='cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=4,
- units='rpm',
- ),
- 5: Field(
- name='distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=5,
- scale=100,
- units='m',
- ),
- 6: Field(
- name='speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=6,
- components=(
- ComponentField(
- name='enhanced_speed',
- def_num=73,
- scale=1000,
- units='m/s',
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 7: Field(
- name='power',
- type=BASE_TYPES[0x84], # uint16
- def_num=7,
- units='watts',
- ),
- 8: Field(
- name='compressed_speed_distance',
- type=BASE_TYPES[0x0D], # byte
- def_num=8,
- components=(
- ComponentField(
- name='speed',
- def_num=6,
- scale=100,
- units='m/s',
- accumulate=False,
- bits=12,
- bit_offset=0,
- ),
- ComponentField(
- name='distance',
- def_num=5,
- scale=16,
- units='m',
- accumulate=True,
- bits=12,
- bit_offset=12,
- ),
- ),
- ),
- 9: Field(
- name='grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=9,
- scale=100,
- units='%',
- ),
- 10: Field( # Relative. 0 is none 254 is Max.
- name='resistance',
- type=BASE_TYPES[0x02], # uint8
- def_num=10,
- ),
- 11: Field(
- name='time_from_course',
- type=BASE_TYPES[0x85], # sint32
- def_num=11,
- scale=1000,
- units='s',
- ),
- 12: Field(
- name='cycle_length',
- type=BASE_TYPES[0x02], # uint8
- def_num=12,
- scale=100,
- units='m',
- ),
- 13: Field(
- name='temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=13,
- units='C',
- ),
- 17: Field( # Speed at 1s intervals. Timestamp field indicates time of last array element.
- name='speed_1s',
- type=BASE_TYPES[0x02], # uint8
- def_num=17,
- scale=16,
- units='m/s',
- ),
- 18: Field(
- name='cycles',
- type=BASE_TYPES[0x02], # uint8
- def_num=18,
- components=(
- ComponentField(
- name='total_cycles',
- def_num=19,
- units='cycles',
- accumulate=True,
- bits=8,
- bit_offset=0,
- ),
- ),
- ),
- 19: Field(
- name='total_cycles',
- type=BASE_TYPES[0x86], # uint32
- def_num=19,
- units='cycles',
- ),
- 28: Field(
- name='compressed_accumulated_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=28,
- components=(
- ComponentField(
- name='accumulated_power',
- def_num=29,
- units='watts',
- accumulate=True,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 29: Field(
- name='accumulated_power',
- type=BASE_TYPES[0x86], # uint32
- def_num=29,
- units='watts',
- ),
- 30: Field(
- name='left_right_balance',
- type=FIELD_TYPES['left_right_balance'],
- def_num=30,
- ),
- 31: Field(
- name='gps_accuracy',
- type=BASE_TYPES[0x02], # uint8
- def_num=31,
- units='m',
- ),
- 32: Field(
- name='vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=32,
- scale=1000,
- units='m/s',
- ),
- 33: Field(
- name='calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=33,
- units='kcal',
- ),
- 39: Field(
- name='vertical_oscillation',
- type=BASE_TYPES[0x84], # uint16
- def_num=39,
- scale=10,
- units='mm',
- ),
- 40: Field(
- name='stance_time_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=40,
- scale=100,
- units='percent',
- ),
- 41: Field(
- name='stance_time',
- type=BASE_TYPES[0x84], # uint16
- def_num=41,
- scale=10,
- units='ms',
- ),
- 42: Field(
- name='activity_type',
- type=FIELD_TYPES['activity_type'],
- def_num=42,
- ),
- 43: Field(
- name='left_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=43,
- scale=2,
- units='percent',
- ),
- 44: Field(
- name='right_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=44,
- scale=2,
- units='percent',
- ),
- 45: Field(
- name='left_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=45,
- scale=2,
- units='percent',
- ),
- 46: Field(
- name='right_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=46,
- scale=2,
- units='percent',
- ),
- 47: Field(
- name='combined_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=47,
- scale=2,
- units='percent',
- ),
- 48: Field(
- name='time128',
- type=BASE_TYPES[0x02], # uint8
- def_num=48,
- scale=128,
- units='s',
- ),
- 49: Field(
- name='stroke_type',
- type=FIELD_TYPES['stroke_type'],
- def_num=49,
- ),
- 50: Field(
- name='zone',
- type=BASE_TYPES[0x02], # uint8
- def_num=50,
- ),
- 51: Field(
- name='ball_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=51,
- scale=100,
- units='m/s',
- ),
- 52: Field( # Log cadence and fractional cadence for backwards compatability
- name='cadence256',
- type=BASE_TYPES[0x84], # uint16
- def_num=52,
- scale=256,
- units='rpm',
- ),
- 53: Field(
- name='fractional_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=53,
- scale=128,
- units='rpm',
- ),
- 54: Field( # Total saturated and unsaturated hemoglobin
- name='total_hemoglobin_conc',
- type=BASE_TYPES[0x84], # uint16
- def_num=54,
- scale=100,
- units='g/dL',
- ),
- 55: Field( # Min saturated and unsaturated hemoglobin
- name='total_hemoglobin_conc_min',
- type=BASE_TYPES[0x84], # uint16
- def_num=55,
- scale=100,
- units='g/dL',
- ),
- 56: Field( # Max saturated and unsaturated hemoglobin
- name='total_hemoglobin_conc_max',
- type=BASE_TYPES[0x84], # uint16
- def_num=56,
- scale=100,
- units='g/dL',
- ),
- 57: Field( # Percentage of hemoglobin saturated with oxygen
- name='saturated_hemoglobin_percent',
- type=BASE_TYPES[0x84], # uint16
- def_num=57,
- scale=10,
- units='%',
- ),
- 58: Field( # Min percentage of hemoglobin saturated with oxygen
- name='saturated_hemoglobin_percent_min',
- type=BASE_TYPES[0x84], # uint16
- def_num=58,
- scale=10,
- units='%',
- ),
- 59: Field( # Max percentage of hemoglobin saturated with oxygen
- name='saturated_hemoglobin_percent_max',
- type=BASE_TYPES[0x84], # uint16
- def_num=59,
- scale=10,
- units='%',
- ),
- 62: Field(
- name='device_index',
- type=FIELD_TYPES['device_index'],
- def_num=62,
- ),
- 67: Field( # Left platform center offset
- name='left_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=67,
- units='mm',
- ),
- 68: Field( # Right platform center offset
- name='right_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=68,
- units='mm',
- ),
- 69: Field( # Left power phase angles. Data value indexes defined by power_phase_type.
- name='left_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=69,
- scale=0.7111111,
- units='degrees',
- ),
- 70: Field( # Left power phase peak angles. Data value indexes defined by power_phase_type.
- name='left_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=70,
- scale=0.7111111,
- units='degrees',
- ),
- 71: Field( # Right power phase angles. Data value indexes defined by power_phase_type.
- name='right_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=71,
- scale=0.7111111,
- units='degrees',
- ),
- 72: Field( # Right power phase peak angles. Data value indexes defined by power_phase_type.
- name='right_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=72,
- scale=0.7111111,
- units='degrees',
- ),
- 73: Field(
- name='enhanced_speed',
- type=BASE_TYPES[0x86], # uint32
- def_num=73,
- scale=1000,
- units='m/s',
- ),
- 78: Field(
- name='enhanced_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=78,
- scale=5,
- offset=500,
- units='m',
- ),
- 81: Field( # lev battery state of charge
- name='battery_soc',
- type=BASE_TYPES[0x02], # uint8
- def_num=81,
- scale=2,
- units='percent',
- ),
- 82: Field( # lev motor power
- name='motor_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=82,
- units='watts',
- ),
- 83: Field(
- name='vertical_ratio',
- type=BASE_TYPES[0x84], # uint16
- def_num=83,
- scale=100,
- units='percent',
- ),
- 84: Field(
- name='stance_time_balance',
- type=BASE_TYPES[0x84], # uint16
- def_num=84,
- scale=100,
- units='percent',
- ),
- 85: Field(
- name='step_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=85,
- scale=10,
- units='mm',
- ),
- 91: Field( # Includes atmospheric pressure
- name='absolute_pressure',
- type=BASE_TYPES[0x86], # uint32
- def_num=91,
- units='Pa',
- ),
- 92: Field( # 0 if above water
- name='depth',
- type=BASE_TYPES[0x86], # uint32
- def_num=92,
- scale=1000,
- units='m',
- ),
- 93: Field( # 0 if above water
- name='next_stop_depth',
- type=BASE_TYPES[0x86], # uint32
- def_num=93,
- scale=1000,
- units='m',
- ),
- 94: Field(
- name='next_stop_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=94,
- units='s',
- ),
- 95: Field(
- name='time_to_surface',
- type=BASE_TYPES[0x86], # uint32
- def_num=95,
- units='s',
- ),
- 96: Field(
- name='ndl_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=96,
- units='s',
- ),
- 97: Field(
- name='cns_load',
- type=BASE_TYPES[0x02], # uint8
- def_num=97,
- units='percent',
- ),
- 98: Field(
- name='n2_load',
- type=BASE_TYPES[0x84], # uint16
- def_num=98,
- units='percent',
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 21: MessageType(
- name='event',
- mesg_num=21,
- fields={
- 0: Field(
- name='event',
- type=FIELD_TYPES['event'],
- def_num=0,
- ),
- 1: Field(
- name='event_type',
- type=FIELD_TYPES['event_type'],
- def_num=1,
- ),
- 2: Field(
- name='data16',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- components=(
- ComponentField(
- name='data',
- def_num=3,
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ),
- ),
- 3: Field(
- name='data',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- subfields=(
- SubField(
- name='battery_level',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- scale=1000,
- units='V',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='battery',
- raw_value=11,
- ),
- ),
- ),
- SubField(
- name='cad_high_alert',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- units='rpm',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='cad_high_alert',
- raw_value=17,
- ),
- ),
- ),
- SubField(
- name='cad_low_alert',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- units='rpm',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='cad_low_alert',
- raw_value=18,
- ),
- ),
- ),
- SubField(
- name='calorie_duration_alert',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- units='calories',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='calorie_duration_alert',
- raw_value=25,
- ),
- ),
- ),
- SubField(
- name='comm_timeout',
- def_num=3,
- type=FIELD_TYPES['comm_timeout_type'],
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='comm_timeout',
- raw_value=47,
- ),
- ),
- ),
- SubField(
- name='course_point_index',
- def_num=3,
- type=FIELD_TYPES['message_index'],
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='course_point',
- raw_value=10,
- ),
- ),
- ),
- SubField(
- name='distance_duration_alert',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- scale=100,
- units='m',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='distance_duration_alert',
- raw_value=24,
- ),
- ),
- ),
- SubField(
- name='fitness_equipment_state',
- def_num=3,
- type=FIELD_TYPES['fitness_equipment_state'],
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='fitness_equipment',
- raw_value=27,
- ),
- ),
- ),
- SubField(
- name='gear_change_data',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='front_gear_change',
- raw_value=42,
- ),
- ReferenceField(
- name='event',
- def_num=0,
- value='rear_gear_change',
- raw_value=43,
- ),
- ),
- components=(
- ComponentField(
- name='rear_gear_num',
- def_num=11,
- accumulate=False,
- bits=8,
- bit_offset=0,
- ),
- ComponentField(
- name='rear_gear',
- def_num=12,
- accumulate=False,
- bits=8,
- bit_offset=8,
- ),
- ComponentField(
- name='front_gear_num',
- def_num=9,
- accumulate=False,
- bits=8,
- bit_offset=16,
- ),
- ComponentField(
- name='front_gear',
- def_num=10,
- accumulate=False,
- bits=8,
- bit_offset=24,
- ),
- ),
- ),
- SubField(
- name='hr_high_alert',
- def_num=3,
- type=BASE_TYPES[0x02], # uint8
- units='bpm',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='hr_high_alert',
- raw_value=13,
- ),
- ),
- ),
- SubField(
- name='hr_low_alert',
- def_num=3,
- type=BASE_TYPES[0x02], # uint8
- units='bpm',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='hr_low_alert',
- raw_value=14,
- ),
- ),
- ),
- SubField(
- name='power_high_alert',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- units='watts',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='power_high_alert',
- raw_value=19,
- ),
- ),
- ),
- SubField(
- name='power_low_alert',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- units='watts',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='power_low_alert',
- raw_value=20,
- ),
- ),
- ),
- SubField( # Indicates the rider position value.
- name='rider_position',
- def_num=3,
- type=FIELD_TYPES['rider_position_type'],
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='rider_position_change',
- raw_value=44,
- ),
- ),
- ),
- SubField(
- name='speed_high_alert',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- scale=1000,
- units='m/s',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='speed_high_alert',
- raw_value=15,
- ),
- ),
- ),
- SubField(
- name='speed_low_alert',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- scale=1000,
- units='m/s',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='speed_low_alert',
- raw_value=16,
- ),
- ),
- ),
- SubField(
- name='sport_point',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='sport_point',
- raw_value=33,
- ),
- ),
- components=(
- ComponentField(
- name='score',
- def_num=7,
- accumulate=False,
- bits=16,
- bit_offset=0,
- ),
- ComponentField(
- name='opponent_score',
- def_num=8,
- accumulate=False,
- bits=16,
- bit_offset=16,
- ),
- ),
- ),
- SubField(
- name='time_duration_alert',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- scale=1000,
- units='s',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='time_duration_alert',
- raw_value=23,
- ),
- ),
- ),
- SubField(
- name='timer_trigger',
- def_num=3,
- type=FIELD_TYPES['timer_trigger'],
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='timer',
- raw_value=0,
- ),
- ),
- ),
- SubField(
- name='virtual_partner_speed',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- scale=1000,
- units='m/s',
- ref_fields=(
- ReferenceField(
- name='event',
- def_num=0,
- value='virtual_partner_pace',
- raw_value=12,
- ),
- ),
- ),
- ),
- ),
- 4: Field(
- name='event_group',
- type=BASE_TYPES[0x02], # uint8
- def_num=4,
- ),
- 7: Field( # Do not populate directly. Autogenerated by decoder for sport_point subfield components
- name='score',
- type=BASE_TYPES[0x84], # uint16
- def_num=7,
- ),
- 8: Field( # Do not populate directly. Autogenerated by decoder for sport_point subfield components
- name='opponent_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=8,
- ),
- 9: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Front gear number. 1 is innermost.
- name='front_gear_num',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=9,
- ),
- 10: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of front teeth.
- name='front_gear',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=10,
- ),
- 11: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Rear gear number. 1 is innermost.
- name='rear_gear_num',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=11,
- ),
- 12: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of rear teeth.
- name='rear_gear',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=12,
- ),
- 13: Field(
- name='device_index',
- type=FIELD_TYPES['device_index'],
- def_num=13,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 23: MessageType(
- name='device_info',
- mesg_num=23,
- fields={
- 0: Field(
- name='device_index',
- type=FIELD_TYPES['device_index'],
- def_num=0,
- ),
- 1: Field(
- name='device_type',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- subfields=(
- SubField(
- name='ant_device_type',
- def_num=1,
- type=BASE_TYPES[0x02], # uint8
- ref_fields=(
- ReferenceField(
- name='source_type',
- def_num=25,
- value='ant',
- raw_value=0,
- ),
- ),
- ),
- SubField(
- name='antplus_device_type',
- def_num=1,
- type=FIELD_TYPES['antplus_device_type'],
- ref_fields=(
- ReferenceField(
- name='source_type',
- def_num=25,
- value='antplus',
- raw_value=1,
- ),
- ),
- ),
- ),
- ),
- 2: Field(
- name='manufacturer',
- type=FIELD_TYPES['manufacturer'],
- def_num=2,
- ),
- 3: Field(
- name='serial_number',
- type=BASE_TYPES[0x8C], # uint32z
- def_num=3,
- ),
- 4: Field(
- name='product',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- subfields=(
- SubField(
- name='garmin_product',
- def_num=4,
- type=FIELD_TYPES['garmin_product'],
- ref_fields=(
- ReferenceField(
- name='manufacturer',
- def_num=2,
- value='garmin',
- raw_value=1,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=2,
- value='dynastream',
- raw_value=15,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=2,
- value='dynastream_oem',
- raw_value=13,
- ),
- ),
- ),
- ),
- ),
- 5: Field(
- name='software_version',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- scale=100,
- ),
- 6: Field(
- name='hardware_version',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- ),
- 7: Field( # Reset by new battery or charge.
- name='cum_operating_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=7,
- units='s',
- ),
- 10: Field(
- name='battery_voltage',
- type=BASE_TYPES[0x84], # uint16
- def_num=10,
- scale=256,
- units='V',
- ),
- 11: Field(
- name='battery_status',
- type=FIELD_TYPES['battery_status'],
- def_num=11,
- ),
- 18: Field( # Indicates the location of the sensor
- name='sensor_position',
- type=FIELD_TYPES['body_location'],
- def_num=18,
- ),
- 19: Field( # Used to describe the sensor or location
- name='descriptor',
- type=BASE_TYPES[0x07], # string
- def_num=19,
- ),
- 20: Field(
- name='ant_transmission_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=20,
- ),
- 21: Field(
- name='ant_device_number',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=21,
- ),
- 22: Field(
- name='ant_network',
- type=FIELD_TYPES['ant_network'],
- def_num=22,
- ),
- 25: Field(
- name='source_type',
- type=FIELD_TYPES['source_type'],
- def_num=25,
- ),
- 27: Field( # Optional free form string to indicate the devices name or model
- name='product_name',
- type=BASE_TYPES[0x07], # string
- def_num=27,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 27: MessageType(
- name='workout_step',
- mesg_num=27,
- fields={
- 0: Field(
- name='wkt_step_name',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field(
- name='duration_type',
- type=FIELD_TYPES['wkt_step_duration'],
- def_num=1,
- ),
- 2: Field(
- name='duration_value',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- subfields=(
- SubField(
- name='duration_calories',
- def_num=2,
- type=BASE_TYPES[0x86], # uint32
- units='calories',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='calories',
- raw_value=4,
- ),
- ),
- ),
- SubField(
- name='duration_distance',
- def_num=2,
- type=BASE_TYPES[0x86], # uint32
- scale=100,
- units='m',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='distance',
- raw_value=1,
- ),
- ),
- ),
- SubField(
- name='duration_hr',
- def_num=2,
- type=FIELD_TYPES['workout_hr'],
- units='% or bpm',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='hr_less_than',
- raw_value=2,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='hr_greater_than',
- raw_value=3,
- ),
- ),
- ),
- SubField(
- name='duration_power',
- def_num=2,
- type=FIELD_TYPES['workout_power'],
- units='% or watts',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='power_less_than',
- raw_value=14,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='power_greater_than',
- raw_value=15,
- ),
- ),
- ),
- SubField(
- name='duration_reps',
- def_num=2,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='reps',
- raw_value=29,
- ),
- ),
- ),
- SubField( # message_index of step to loop back to. Steps are assumed to be in the order by message_index. custom_name and intensity members are undefined for this duration type.
- name='duration_step',
- def_num=2,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_steps_cmplt',
- raw_value=6,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_time',
- raw_value=7,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_distance',
- raw_value=8,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_calories',
- raw_value=9,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_hr_less_than',
- raw_value=10,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_hr_greater_than',
- raw_value=11,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_power_less_than',
- raw_value=12,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_power_greater_than',
- raw_value=13,
- ),
- ),
- ),
- SubField(
- name='duration_time',
- def_num=2,
- type=BASE_TYPES[0x86], # uint32
- scale=1000,
- units='s',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='time',
- raw_value=0,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repetition_time',
- raw_value=28,
- ),
- ),
- ),
- ),
- ),
- 3: Field(
- name='target_type',
- type=FIELD_TYPES['wkt_step_target'],
- def_num=3,
- ),
- 4: Field(
- name='target_value',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- subfields=(
- SubField(
- name='repeat_calories',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- units='calories',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_calories',
- raw_value=9,
- ),
- ),
- ),
- SubField(
- name='repeat_distance',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- scale=100,
- units='m',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_distance',
- raw_value=8,
- ),
- ),
- ),
- SubField(
- name='repeat_hr',
- def_num=4,
- type=FIELD_TYPES['workout_hr'],
- units='% or bpm',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_hr_less_than',
- raw_value=10,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_hr_greater_than',
- raw_value=11,
- ),
- ),
- ),
- SubField(
- name='repeat_power',
- def_num=4,
- type=FIELD_TYPES['workout_power'],
- units='% or watts',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_power_less_than',
- raw_value=12,
- ),
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_power_greater_than',
- raw_value=13,
- ),
- ),
- ),
- SubField( # # of repetitions
- name='repeat_steps',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_steps_cmplt',
- raw_value=6,
- ),
- ),
- ),
- SubField(
- name='repeat_time',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- scale=1000,
- units='s',
- ref_fields=(
- ReferenceField(
- name='duration_type',
- def_num=1,
- value='repeat_until_time',
- raw_value=7,
- ),
- ),
- ),
- SubField( # Zone (1-?); Custom = 0;
- name='target_cadence_zone',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='cadence',
- raw_value=3,
- ),
- ),
- ),
- SubField( # hr zone (1-5);Custom =0;
- name='target_hr_zone',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='heart_rate',
- raw_value=1,
- ),
- ),
- ),
- SubField( # Power Zone ( 1-7); Custom = 0;
- name='target_power_zone',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='power',
- raw_value=4,
- ),
- ),
- ),
- SubField( # speed zone (1-10);Custom =0;
- name='target_speed_zone',
- def_num=4,
- type=BASE_TYPES[0x86], # uint32
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='speed',
- raw_value=0,
- ),
- ),
- ),
- SubField(
- name='target_stroke_type',
- def_num=4,
- type=FIELD_TYPES['swim_stroke'],
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='swim_stroke',
- raw_value=11,
- ),
- ),
- ),
- ),
- ),
- 5: Field(
- name='custom_target_value_low',
- type=BASE_TYPES[0x86], # uint32
- def_num=5,
- subfields=(
- SubField(
- name='custom_target_cadence_low',
- def_num=5,
- type=BASE_TYPES[0x86], # uint32
- units='rpm',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='cadence',
- raw_value=3,
- ),
- ),
- ),
- SubField(
- name='custom_target_heart_rate_low',
- def_num=5,
- type=FIELD_TYPES['workout_hr'],
- units='% or bpm',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='heart_rate',
- raw_value=1,
- ),
- ),
- ),
- SubField(
- name='custom_target_power_low',
- def_num=5,
- type=FIELD_TYPES['workout_power'],
- units='% or watts',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='power',
- raw_value=4,
- ),
- ),
- ),
- SubField(
- name='custom_target_speed_low',
- def_num=5,
- type=BASE_TYPES[0x86], # uint32
- scale=1000,
- units='m/s',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='speed',
- raw_value=0,
- ),
- ),
- ),
- ),
- ),
- 6: Field(
- name='custom_target_value_high',
- type=BASE_TYPES[0x86], # uint32
- def_num=6,
- subfields=(
- SubField(
- name='custom_target_cadence_high',
- def_num=6,
- type=BASE_TYPES[0x86], # uint32
- units='rpm',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='cadence',
- raw_value=3,
- ),
- ),
- ),
- SubField(
- name='custom_target_heart_rate_high',
- def_num=6,
- type=FIELD_TYPES['workout_hr'],
- units='% or bpm',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='heart_rate',
- raw_value=1,
- ),
- ),
- ),
- SubField(
- name='custom_target_power_high',
- def_num=6,
- type=FIELD_TYPES['workout_power'],
- units='% or watts',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='power',
- raw_value=4,
- ),
- ),
- ),
- SubField(
- name='custom_target_speed_high',
- def_num=6,
- type=BASE_TYPES[0x86], # uint32
- scale=1000,
- units='m/s',
- ref_fields=(
- ReferenceField(
- name='target_type',
- def_num=3,
- value='speed',
- raw_value=0,
- ),
- ),
- ),
- ),
- ),
- 7: Field(
- name='intensity',
- type=FIELD_TYPES['intensity'],
- def_num=7,
- ),
- 8: Field(
- name='notes',
- type=BASE_TYPES[0x07], # string
- def_num=8,
- ),
- 9: Field(
- name='equipment',
- type=FIELD_TYPES['workout_equipment'],
- def_num=9,
- ),
- 10: Field(
- name='exercise_category',
- type=FIELD_TYPES['exercise_category'],
- def_num=10,
- ),
- 11: Field(
- name='exercise_name',
- type=BASE_TYPES[0x84], # uint16
- def_num=11,
- ),
- 12: Field(
- name='exercise_weight',
- type=BASE_TYPES[0x84], # uint16
- def_num=12,
- scale=100,
- units='kg',
- ),
- 13: Field(
- name='weight_display_unit',
- type=FIELD_TYPES['fit_base_unit'],
- def_num=13,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 32: MessageType(
- name='course_point',
- mesg_num=32,
- fields={
- 1: Field(
- name='timestamp',
- type=FIELD_TYPES['date_time'],
- def_num=1,
- ),
- 2: Field(
- name='position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=2,
- units='semicircles',
- ),
- 3: Field(
- name='position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=3,
- units='semicircles',
- ),
- 4: Field(
- name='distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- scale=100,
- units='m',
- ),
- 5: Field(
- name='type',
- type=FIELD_TYPES['course_point'],
- def_num=5,
- ),
- 6: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=6,
- ),
- 8: Field(
- name='favorite',
- type=FIELD_TYPES['bool'],
- def_num=8,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 37: MessageType(
- name='file_capabilities',
- mesg_num=37,
- fields={
- 0: Field(
- name='type',
- type=FIELD_TYPES['file'],
- def_num=0,
- ),
- 1: Field(
- name='flags',
- type=FIELD_TYPES['file_flags'],
- def_num=1,
- ),
- 2: Field(
- name='directory',
- type=BASE_TYPES[0x07], # string
- def_num=2,
- ),
- 3: Field(
- name='max_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- ),
- 4: Field(
- name='max_size',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- units='bytes',
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 38: MessageType(
- name='mesg_capabilities',
- mesg_num=38,
- fields={
- 0: Field(
- name='file',
- type=FIELD_TYPES['file'],
- def_num=0,
- ),
- 1: Field(
- name='mesg_num',
- type=FIELD_TYPES['mesg_num'],
- def_num=1,
- ),
- 2: Field(
- name='count_type',
- type=FIELD_TYPES['mesg_count'],
- def_num=2,
- ),
- 3: Field(
- name='count',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- subfields=(
- SubField(
- name='max_per_file',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- ref_fields=(
- ReferenceField(
- name='count_type',
- def_num=2,
- value='max_per_file',
- raw_value=1,
- ),
- ),
- ),
- SubField(
- name='max_per_file_type',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- ref_fields=(
- ReferenceField(
- name='count_type',
- def_num=2,
- value='max_per_file_type',
- raw_value=2,
- ),
- ),
- ),
- SubField(
- name='num_per_file',
- def_num=3,
- type=BASE_TYPES[0x84], # uint16
- ref_fields=(
- ReferenceField(
- name='count_type',
- def_num=2,
- value='num_per_file',
- raw_value=0,
- ),
- ),
- ),
- ),
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 39: MessageType(
- name='field_capabilities',
- mesg_num=39,
- fields={
- 0: Field(
- name='file',
- type=FIELD_TYPES['file'],
- def_num=0,
- ),
- 1: Field(
- name='mesg_num',
- type=FIELD_TYPES['mesg_num'],
- def_num=1,
- ),
- 2: Field(
- name='field_num',
- type=BASE_TYPES[0x02], # uint8
- def_num=2,
- ),
- 3: Field(
- name='count',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 49: MessageType(
- name='file_creator',
- mesg_num=49,
- fields={
- 0: Field(
- name='software_version',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- ),
- 1: Field(
- name='hardware_version',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- ),
- },
- ),
- 53: MessageType(
- name='speed_zone',
- mesg_num=53,
- fields={
- 0: Field(
- name='high_value',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- scale=1000,
- units='m/s',
- ),
- 1: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 55: MessageType(
- name='monitoring',
- mesg_num=55,
- fields={
- 0: Field( # Associates this data to device_info message. Not required for file with single device (sensor).
- name='device_index',
- type=FIELD_TYPES['device_index'],
- def_num=0,
- ),
- 1: Field( # Accumulated total calories. Maintained by MonitoringReader for each activity_type. See SDK documentation
- name='calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='kcal',
- ),
- 2: Field( # Accumulated distance. Maintained by MonitoringReader for each activity_type. See SDK documentation.
- name='distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- scale=100,
- units='m',
- ),
- 3: Field( # Accumulated cycles. Maintained by MonitoringReader for each activity_type. See SDK documentation.
- name='cycles',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- scale=2,
- units='cycles',
- subfields=(
- SubField(
- name='steps',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- units='steps',
- ref_fields=(
- ReferenceField(
- name='activity_type',
- def_num=5,
- value='walking',
- raw_value=6,
- ),
- ReferenceField(
- name='activity_type',
- def_num=5,
- value='running',
- raw_value=1,
- ),
- ),
- ),
- SubField(
- name='strokes',
- def_num=3,
- type=BASE_TYPES[0x86], # uint32
- scale=2,
- units='strokes',
- ref_fields=(
- ReferenceField(
- name='activity_type',
- def_num=5,
- value='cycling',
- raw_value=2,
- ),
- ReferenceField(
- name='activity_type',
- def_num=5,
- value='swimming',
- raw_value=5,
- ),
- ),
- ),
- ),
- ),
- 4: Field(
- name='active_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- scale=1000,
- units='s',
- ),
- 5: Field(
- name='activity_type',
- type=FIELD_TYPES['activity_type'],
- def_num=5,
- ),
- 6: Field(
- name='activity_subtype',
- type=FIELD_TYPES['activity_subtype'],
- def_num=6,
- ),
- 7: Field(
- name='activity_level',
- type=FIELD_TYPES['activity_level'],
- def_num=7,
- ),
- 8: Field(
- name='distance_16',
- type=BASE_TYPES[0x84], # uint16
- def_num=8,
- units='100*m',
- ),
- 9: Field(
- name='cycles_16',
- type=BASE_TYPES[0x84], # uint16
- def_num=9,
- units='2*cycles or steps',
- ),
- 10: Field(
- name='active_time_16',
- type=BASE_TYPES[0x84], # uint16
- def_num=10,
- units='s',
- ),
- 11: Field( # Must align to logging interval, for example, time must be 00:00:00 for daily log.
- name='local_timestamp',
- type=FIELD_TYPES['local_date_time'],
- def_num=11,
- ),
- 12: Field( # Avg temperature during the logging interval ended at timestamp
- name='temperature',
- type=BASE_TYPES[0x83], # sint16
- def_num=12,
- scale=100,
- units='C',
- ),
- 14: Field( # Min temperature during the logging interval ended at timestamp
- name='temperature_min',
- type=BASE_TYPES[0x83], # sint16
- def_num=14,
- scale=100,
- units='C',
- ),
- 15: Field( # Max temperature during the logging interval ended at timestamp
- name='temperature_max',
- type=BASE_TYPES[0x83], # sint16
- def_num=15,
- scale=100,
- units='C',
- ),
- 16: Field( # Indexed using minute_activity_level enum
- name='activity_time',
- type=BASE_TYPES[0x84], # uint16
- def_num=16,
- units='minutes',
- ),
- 19: Field(
- name='active_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=19,
- units='kcal',
- ),
- 24: Field( # Indicates single type / intensity for duration since last monitoring message.
- name='current_activity_type_intensity',
- type=BASE_TYPES[0x0D], # byte
- def_num=24,
- components=(
- ComponentField(
- name='activity_type',
- def_num=5,
- accumulate=False,
- bits=5,
- bit_offset=0,
- ),
- ComponentField(
- name='intensity',
- def_num=28,
- accumulate=False,
- bits=3,
- bit_offset=5,
- ),
- ),
- ),
- 25: Field(
- name='timestamp_min_8',
- type=BASE_TYPES[0x02], # uint8
- def_num=25,
- units='min',
- ),
- 26: Field(
- name='timestamp_16',
- type=BASE_TYPES[0x84], # uint16
- def_num=26,
- units='s',
- ),
- 27: Field(
- name='heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=27,
- units='bpm',
- ),
- 28: Field(
- name='intensity',
- type=BASE_TYPES[0x02], # uint8
- def_num=28,
- scale=10,
- ),
- 29: Field(
- name='duration_min',
- type=BASE_TYPES[0x84], # uint16
- def_num=29,
- units='min',
- ),
- 30: Field(
- name='duration',
- type=BASE_TYPES[0x86], # uint32
- def_num=30,
- units='s',
- ),
- 31: Field(
- name='ascent',
- type=BASE_TYPES[0x86], # uint32
- def_num=31,
- scale=1000,
- units='m',
- ),
- 32: Field(
- name='descent',
- type=BASE_TYPES[0x86], # uint32
- def_num=32,
- scale=1000,
- units='m',
- ),
- 33: Field(
- name='moderate_activity_minutes',
- type=BASE_TYPES[0x84], # uint16
- def_num=33,
- units='minutes',
- ),
- 34: Field(
- name='vigorous_activity_minutes',
- type=BASE_TYPES[0x84], # uint16
- def_num=34,
- units='minutes',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Must align to logging interval, for example, time must be 00:00:00 for daily log.
- },
- ),
- 72: MessageType( # Corresponds to file_id of workout or course.
- name='training_file',
- mesg_num=72,
- fields={
- 0: Field(
- name='type',
- type=FIELD_TYPES['file'],
- def_num=0,
- ),
- 1: Field(
- name='manufacturer',
- type=FIELD_TYPES['manufacturer'],
- def_num=1,
- ),
- 2: Field(
- name='product',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- subfields=(
- SubField(
- name='garmin_product',
- def_num=2,
- type=FIELD_TYPES['garmin_product'],
- ref_fields=(
- ReferenceField(
- name='manufacturer',
- def_num=1,
- value='garmin',
- raw_value=1,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=1,
- value='dynastream',
- raw_value=15,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=1,
- value='dynastream_oem',
- raw_value=13,
- ),
- ),
- ),
- ),
- ),
- 3: Field(
- name='serial_number',
- type=BASE_TYPES[0x8C], # uint32z
- def_num=3,
- ),
- 4: Field(
- name='time_created',
- type=FIELD_TYPES['date_time'],
- def_num=4,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 78: MessageType( # Heart rate variability
- name='hrv',
- mesg_num=78,
- fields={
- 0: Field( # Time between beats
- name='time',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- scale=1000,
- units='s',
- ),
- },
- ),
- 80: MessageType(
- name='ant_rx',
- mesg_num=80,
- fields={
- 0: Field(
- name='fractional_timestamp',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- scale=32768,
- units='s',
- ),
- 1: Field(
- name='mesg_id',
- type=BASE_TYPES[0x0D], # byte
- def_num=1,
- ),
- 2: Field(
- name='mesg_data',
- type=BASE_TYPES[0x0D], # byte
- def_num=2,
- components=(
- ComponentField(
- name='channel_number',
- def_num=3,
- accumulate=False,
- bits=8,
- bit_offset=0,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=8,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=16,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=24,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=32,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=40,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=48,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=56,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=64,
- ),
- ),
- ),
- 3: Field(
- name='channel_number',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- ),
- 4: Field(
- name='data',
- type=BASE_TYPES[0x0D], # byte
- def_num=4,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 81: MessageType(
- name='ant_tx',
- mesg_num=81,
- fields={
- 0: Field(
- name='fractional_timestamp',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- scale=32768,
- units='s',
- ),
- 1: Field(
- name='mesg_id',
- type=BASE_TYPES[0x0D], # byte
- def_num=1,
- ),
- 2: Field(
- name='mesg_data',
- type=BASE_TYPES[0x0D], # byte
- def_num=2,
- components=(
- ComponentField(
- name='channel_number',
- def_num=3,
- accumulate=False,
- bits=8,
- bit_offset=0,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=8,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=16,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=24,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=32,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=40,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=48,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=56,
- ),
- ComponentField(
- name='data',
- def_num=4,
- accumulate=False,
- bits=8,
- bit_offset=64,
- ),
- ),
- ),
- 3: Field(
- name='channel_number',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- ),
- 4: Field(
- name='data',
- type=BASE_TYPES[0x0D], # byte
- def_num=4,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 82: MessageType(
- name='ant_channel_id',
- mesg_num=82,
- fields={
- 0: Field(
- name='channel_number',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- ),
- 1: Field(
- name='device_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=1,
- ),
- 2: Field(
- name='device_number',
- type=BASE_TYPES[0x8B], # uint16z
- def_num=2,
- ),
- 3: Field(
- name='transmission_type',
- type=BASE_TYPES[0x0A], # uint8z
- def_num=3,
- ),
- 4: Field(
- name='device_index',
- type=FIELD_TYPES['device_index'],
- def_num=4,
- ),
- },
- ),
- 101: MessageType(
- name='length',
- mesg_num=101,
- fields={
- 0: Field(
- name='event',
- type=FIELD_TYPES['event'],
- def_num=0,
- ),
- 1: Field(
- name='event_type',
- type=FIELD_TYPES['event_type'],
- def_num=1,
- ),
- 2: Field(
- name='start_time',
- type=FIELD_TYPES['date_time'],
- def_num=2,
- ),
- 3: Field(
- name='total_elapsed_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- scale=1000,
- units='s',
- ),
- 4: Field(
- name='total_timer_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- scale=1000,
- units='s',
- ),
- 5: Field(
- name='total_strokes',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- units='strokes',
- ),
- 6: Field(
- name='avg_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=6,
- scale=1000,
- units='m/s',
- ),
- 7: Field(
- name='swim_stroke',
- type=FIELD_TYPES['swim_stroke'],
- def_num=7,
- units='swim_stroke',
- ),
- 9: Field(
- name='avg_swimming_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=9,
- units='strokes/min',
- ),
- 10: Field(
- name='event_group',
- type=BASE_TYPES[0x02], # uint8
- def_num=10,
- ),
- 11: Field(
- name='total_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=11,
- units='kcal',
- ),
- 12: Field(
- name='length_type',
- type=FIELD_TYPES['length_type'],
- def_num=12,
- ),
- 18: Field(
- name='player_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=18,
- ),
- 19: Field(
- name='opponent_score',
- type=BASE_TYPES[0x84], # uint16
- def_num=19,
- ),
- 20: Field( # stroke_type enum used as the index
- name='stroke_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=20,
- units='counts',
- ),
- 21: Field( # zone number used as the index
- name='zone_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=21,
- units='counts',
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 106: MessageType(
- name='slave_device',
- mesg_num=106,
- fields={
- 0: Field(
- name='manufacturer',
- type=FIELD_TYPES['manufacturer'],
- def_num=0,
- ),
- 1: Field(
- name='product',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- subfields=(
- SubField(
- name='garmin_product',
- def_num=1,
- type=FIELD_TYPES['garmin_product'],
- ref_fields=(
- ReferenceField(
- name='manufacturer',
- def_num=0,
- value='garmin',
- raw_value=1,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=0,
- value='dynastream',
- raw_value=15,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=0,
- value='dynastream_oem',
- raw_value=13,
- ),
- ),
- ),
- ),
- ),
- },
- ),
- 127: MessageType(
- name='connectivity',
- mesg_num=127,
- fields={
- 0: Field( # Use Bluetooth for connectivity features
- name='bluetooth_enabled',
- type=FIELD_TYPES['bool'],
- def_num=0,
- ),
- 1: Field( # Use Bluetooth Low Energy for connectivity features
- name='bluetooth_le_enabled',
- type=FIELD_TYPES['bool'],
- def_num=1,
- ),
- 2: Field( # Use ANT for connectivity features
- name='ant_enabled',
- type=FIELD_TYPES['bool'],
- def_num=2,
- ),
- 3: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=3,
- ),
- 4: Field(
- name='live_tracking_enabled',
- type=FIELD_TYPES['bool'],
- def_num=4,
- ),
- 5: Field(
- name='weather_conditions_enabled',
- type=FIELD_TYPES['bool'],
- def_num=5,
- ),
- 6: Field(
- name='weather_alerts_enabled',
- type=FIELD_TYPES['bool'],
- def_num=6,
- ),
- 7: Field(
- name='auto_activity_upload_enabled',
- type=FIELD_TYPES['bool'],
- def_num=7,
- ),
- 8: Field(
- name='course_download_enabled',
- type=FIELD_TYPES['bool'],
- def_num=8,
- ),
- 9: Field(
- name='workout_download_enabled',
- type=FIELD_TYPES['bool'],
- def_num=9,
- ),
- 10: Field(
- name='gps_ephemeris_download_enabled',
- type=FIELD_TYPES['bool'],
- def_num=10,
- ),
- 11: Field(
- name='incident_detection_enabled',
- type=FIELD_TYPES['bool'],
- def_num=11,
- ),
- 12: Field(
- name='grouptrack_enabled',
- type=FIELD_TYPES['bool'],
- def_num=12,
- ),
- },
- ),
- 128: MessageType(
- name='weather_conditions',
- mesg_num=128,
- fields={
- 0: Field( # Current or forecast
- name='weather_report',
- type=FIELD_TYPES['weather_report'],
- def_num=0,
- ),
- 1: Field(
- name='temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=1,
- units='C',
- ),
- 2: Field( # Corresponds to GSC Response weatherIcon field
- name='condition',
- type=FIELD_TYPES['weather_status'],
- def_num=2,
- ),
- 3: Field(
- name='wind_direction',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- units='degrees',
- ),
- 4: Field(
- name='wind_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- scale=1000,
- units='m/s',
- ),
- 5: Field( # range 0-100
- name='precipitation_probability',
- type=BASE_TYPES[0x02], # uint8
- def_num=5,
- ),
- 6: Field( # Heat Index if GCS heatIdx above or equal to 90F or wind chill if GCS windChill below or equal to 32F
- name='temperature_feels_like',
- type=BASE_TYPES[0x01], # sint8
- def_num=6,
- units='C',
- ),
- 7: Field(
- name='relative_humidity',
- type=BASE_TYPES[0x02], # uint8
- def_num=7,
- ),
- 8: Field( # string corresponding to GCS response location string
- name='location',
- type=BASE_TYPES[0x07], # string
- def_num=8,
- ),
- 9: Field(
- name='observed_at_time',
- type=FIELD_TYPES['date_time'],
- def_num=9,
- ),
- 10: Field(
- name='observed_location_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=10,
- units='semicircles',
- ),
- 11: Field(
- name='observed_location_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=11,
- units='semicircles',
- ),
- 12: Field(
- name='day_of_week',
- type=FIELD_TYPES['day_of_week'],
- def_num=12,
- ),
- 13: Field(
- name='high_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=13,
- units='C',
- ),
- 14: Field(
- name='low_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=14,
- units='C',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # time of update for current conditions, else forecast time
- },
- ),
- 129: MessageType(
- name='weather_alert',
- mesg_num=129,
- fields={
- 0: Field( # Unique identifier from GCS report ID string, length is 12
- name='report_id',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field( # Time alert was issued
- name='issue_time',
- type=FIELD_TYPES['date_time'],
- def_num=1,
- ),
- 2: Field( # Time alert expires
- name='expire_time',
- type=FIELD_TYPES['date_time'],
- def_num=2,
- ),
- 3: Field( # Warning, Watch, Advisory, Statement
- name='severity',
- type=FIELD_TYPES['weather_severity'],
- def_num=3,
- ),
- 4: Field( # Tornado, Severe Thunderstorm, etc.
- name='type',
- type=FIELD_TYPES['weather_severe_type'],
- def_num=4,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 131: MessageType(
- name='cadence_zone',
- mesg_num=131,
- fields={
- 0: Field(
- name='high_value',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- units='rpm',
- ),
- 1: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 132: MessageType(
- name='hr',
- mesg_num=132,
- fields={
- 0: Field(
- name='fractional_timestamp',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- scale=32768,
- units='s',
- ),
- 1: Field(
- name='time256',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- components=(
- ComponentField(
- name='fractional_timestamp',
- def_num=0,
- scale=256,
- units='s',
- accumulate=False,
- bits=8,
- bit_offset=0,
- ),
- ),
- ),
- 6: Field(
- name='filtered_bpm',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- units='bpm',
- ),
- 9: Field(
- name='event_timestamp',
- type=BASE_TYPES[0x86], # uint32
- def_num=9,
- scale=1024,
- units='s',
- ),
- 10: Field(
- name='event_timestamp_12',
- type=BASE_TYPES[0x0D], # byte
- def_num=10,
- components=(
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=0,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=12,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=24,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=36,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=48,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=60,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=72,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=84,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=96,
- ),
- ComponentField(
- name='event_timestamp',
- def_num=9,
- scale=1024,
- units='s',
- accumulate=True,
- bits=12,
- bit_offset=108,
- ),
- ),
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
- 142: MessageType(
- name='segment_lap',
- mesg_num=142,
- fields={
- 0: Field(
- name='event',
- type=FIELD_TYPES['event'],
- def_num=0,
- ),
- 1: Field(
- name='event_type',
- type=FIELD_TYPES['event_type'],
- def_num=1,
- ),
- 2: Field(
- name='start_time',
- type=FIELD_TYPES['date_time'],
- def_num=2,
- ),
- 3: Field(
- name='start_position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=3,
- units='semicircles',
- ),
- 4: Field(
- name='start_position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=4,
- units='semicircles',
- ),
- 5: Field(
- name='end_position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=5,
- units='semicircles',
- ),
- 6: Field(
- name='end_position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=6,
- units='semicircles',
- ),
- 7: Field( # Time (includes pauses)
- name='total_elapsed_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=7,
- scale=1000,
- units='s',
- ),
- 8: Field( # Timer Time (excludes pauses)
- name='total_timer_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=8,
- scale=1000,
- units='s',
- ),
- 9: Field(
- name='total_distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=9,
- scale=100,
- units='m',
- ),
- 10: Field(
- name='total_cycles',
- type=BASE_TYPES[0x86], # uint32
- def_num=10,
- units='cycles',
- subfields=(
- SubField(
- name='total_strokes',
- def_num=10,
- type=BASE_TYPES[0x86], # uint32
- units='strokes',
- ref_fields=(
- ReferenceField(
- name='sport',
- def_num=23,
- value='cycling',
- raw_value=2,
- ),
- ),
- ),
- ),
- ),
- 11: Field(
- name='total_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=11,
- units='kcal',
- ),
- 12: Field( # If New Leaf
- name='total_fat_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=12,
- units='kcal',
- ),
- 13: Field(
- name='avg_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=13,
- scale=1000,
- units='m/s',
- ),
- 14: Field(
- name='max_speed',
- type=BASE_TYPES[0x84], # uint16
- def_num=14,
- scale=1000,
- units='m/s',
- ),
- 15: Field(
- name='avg_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=15,
- units='bpm',
- ),
- 16: Field(
- name='max_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=16,
- units='bpm',
- ),
- 17: Field( # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time
- name='avg_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=17,
- units='rpm',
- ),
- 18: Field(
- name='max_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=18,
- units='rpm',
- ),
- 19: Field( # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time
- name='avg_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=19,
- units='watts',
- ),
- 20: Field(
- name='max_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=20,
- units='watts',
- ),
- 21: Field(
- name='total_ascent',
- type=BASE_TYPES[0x84], # uint16
- def_num=21,
- units='m',
- ),
- 22: Field(
- name='total_descent',
- type=BASE_TYPES[0x84], # uint16
- def_num=22,
- units='m',
- ),
- 23: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=23,
- ),
- 24: Field(
- name='event_group',
- type=BASE_TYPES[0x02], # uint8
- def_num=24,
- ),
- 25: Field( # North east corner latitude.
- name='nec_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=25,
- units='semicircles',
- ),
- 26: Field( # North east corner longitude.
- name='nec_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=26,
- units='semicircles',
- ),
- 27: Field( # South west corner latitude.
- name='swc_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=27,
- units='semicircles',
- ),
- 28: Field( # South west corner latitude.
- name='swc_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=28,
- units='semicircles',
- ),
- 29: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=29,
- ),
- 30: Field(
- name='normalized_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=30,
- units='watts',
- ),
- 31: Field(
- name='left_right_balance',
- type=FIELD_TYPES['left_right_balance_100'],
- def_num=31,
- ),
- 32: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=32,
- ),
- 33: Field(
- name='total_work',
- type=BASE_TYPES[0x86], # uint32
- def_num=33,
- units='J',
- ),
- 34: Field(
- name='avg_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=34,
- scale=5,
- offset=500,
- units='m',
- ),
- 35: Field(
- name='max_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=35,
- scale=5,
- offset=500,
- units='m',
- ),
- 36: Field(
- name='gps_accuracy',
- type=BASE_TYPES[0x02], # uint8
- def_num=36,
- units='m',
- ),
- 37: Field(
- name='avg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=37,
- scale=100,
- units='%',
- ),
- 38: Field(
- name='avg_pos_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=38,
- scale=100,
- units='%',
- ),
- 39: Field(
- name='avg_neg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=39,
- scale=100,
- units='%',
- ),
- 40: Field(
- name='max_pos_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=40,
- scale=100,
- units='%',
- ),
- 41: Field(
- name='max_neg_grade',
- type=BASE_TYPES[0x83], # sint16
- def_num=41,
- scale=100,
- units='%',
- ),
- 42: Field(
- name='avg_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=42,
- units='C',
- ),
- 43: Field(
- name='max_temperature',
- type=BASE_TYPES[0x01], # sint8
- def_num=43,
- units='C',
- ),
- 44: Field(
- name='total_moving_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=44,
- scale=1000,
- units='s',
- ),
- 45: Field(
- name='avg_pos_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=45,
- scale=1000,
- units='m/s',
- ),
- 46: Field(
- name='avg_neg_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=46,
- scale=1000,
- units='m/s',
- ),
- 47: Field(
- name='max_pos_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=47,
- scale=1000,
- units='m/s',
- ),
- 48: Field(
- name='max_neg_vertical_speed',
- type=BASE_TYPES[0x83], # sint16
- def_num=48,
- scale=1000,
- units='m/s',
- ),
- 49: Field(
- name='time_in_hr_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=49,
- scale=1000,
- units='s',
- ),
- 50: Field(
- name='time_in_speed_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=50,
- scale=1000,
- units='s',
- ),
- 51: Field(
- name='time_in_cadence_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=51,
- scale=1000,
- units='s',
- ),
- 52: Field(
- name='time_in_power_zone',
- type=BASE_TYPES[0x86], # uint32
- def_num=52,
- scale=1000,
- units='s',
- ),
- 53: Field(
- name='repetition_num',
- type=BASE_TYPES[0x84], # uint16
- def_num=53,
- ),
- 54: Field(
- name='min_altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=54,
- scale=5,
- offset=500,
- units='m',
- ),
- 55: Field(
- name='min_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=55,
- units='bpm',
- ),
- 56: Field(
- name='active_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=56,
- scale=1000,
- units='s',
- ),
- 57: Field(
- name='wkt_step_index',
- type=FIELD_TYPES['message_index'],
- def_num=57,
- ),
- 58: Field(
- name='sport_event',
- type=FIELD_TYPES['sport_event'],
- def_num=58,
- ),
- 59: Field(
- name='avg_left_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=59,
- scale=2,
- units='percent',
- ),
- 60: Field(
- name='avg_right_torque_effectiveness',
- type=BASE_TYPES[0x02], # uint8
- def_num=60,
- scale=2,
- units='percent',
- ),
- 61: Field(
- name='avg_left_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=61,
- scale=2,
- units='percent',
- ),
- 62: Field(
- name='avg_right_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=62,
- scale=2,
- units='percent',
- ),
- 63: Field(
- name='avg_combined_pedal_smoothness',
- type=BASE_TYPES[0x02], # uint8
- def_num=63,
- scale=2,
- units='percent',
- ),
- 64: Field(
- name='status',
- type=FIELD_TYPES['segment_lap_status'],
- def_num=64,
- ),
- 65: Field(
- name='uuid',
- type=BASE_TYPES[0x07], # string
- def_num=65,
- ),
- 66: Field( # fractional part of the avg_cadence
- name='avg_fractional_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=66,
- scale=128,
- units='rpm',
- ),
- 67: Field( # fractional part of the max_cadence
- name='max_fractional_cadence',
- type=BASE_TYPES[0x02], # uint8
- def_num=67,
- scale=128,
- units='rpm',
- ),
- 68: Field( # fractional part of the total_cycles
- name='total_fractional_cycles',
- type=BASE_TYPES[0x02], # uint8
- def_num=68,
- scale=128,
- units='cycles',
- ),
- 69: Field(
- name='front_gear_shift_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=69,
- ),
- 70: Field(
- name='rear_gear_shift_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=70,
- ),
- 71: Field( # Total time spent in the standing position
- name='time_standing',
- type=BASE_TYPES[0x86], # uint32
- def_num=71,
- scale=1000,
- units='s',
- ),
- 72: Field( # Number of transitions to the standing state
- name='stand_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=72,
- ),
- 73: Field( # Average left platform center offset
- name='avg_left_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=73,
- units='mm',
- ),
- 74: Field( # Average right platform center offset
- name='avg_right_pco',
- type=BASE_TYPES[0x01], # sint8
- def_num=74,
- units='mm',
- ),
- 75: Field( # Average left power phase angles. Data value indexes defined by power_phase_type.
- name='avg_left_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=75,
- scale=0.7111111,
- units='degrees',
- ),
- 76: Field( # Average left power phase peak angles. Data value indexes defined by power_phase_type.
- name='avg_left_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=76,
- scale=0.7111111,
- units='degrees',
- ),
- 77: Field( # Average right power phase angles. Data value indexes defined by power_phase_type.
- name='avg_right_power_phase',
- type=BASE_TYPES[0x02], # uint8
- def_num=77,
- scale=0.7111111,
- units='degrees',
- ),
- 78: Field( # Average right power phase peak angles. Data value indexes defined by power_phase_type.
- name='avg_right_power_phase_peak',
- type=BASE_TYPES[0x02], # uint8
- def_num=78,
- scale=0.7111111,
- units='degrees',
- ),
- 79: Field( # Average power by position. Data value indexes defined by rider_position_type.
- name='avg_power_position',
- type=BASE_TYPES[0x84], # uint16
- def_num=79,
- units='watts',
- ),
- 80: Field( # Maximum power by position. Data value indexes defined by rider_position_type.
- name='max_power_position',
- type=BASE_TYPES[0x84], # uint16
- def_num=80,
- units='watts',
- ),
- 81: Field( # Average cadence by position. Data value indexes defined by rider_position_type.
- name='avg_cadence_position',
- type=BASE_TYPES[0x02], # uint8
- def_num=81,
- units='rpm',
- ),
- 82: Field( # Maximum cadence by position. Data value indexes defined by rider_position_type.
- name='max_cadence_position',
- type=BASE_TYPES[0x02], # uint8
- def_num=82,
- units='rpm',
- ),
- 83: Field( # Manufacturer that produced the segment
- name='manufacturer',
- type=FIELD_TYPES['manufacturer'],
- def_num=83,
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Lap end time.
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 149: MessageType( # Unique Identification data for an individual segment leader within a segment file
- name='segment_leaderboard_entry',
- mesg_num=149,
- fields={
- 0: Field( # Friendly name assigned to leader
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field( # Leader classification
- name='type',
- type=FIELD_TYPES['segment_leaderboard_type'],
- def_num=1,
- ),
- 2: Field( # Primary user ID of this leader
- name='group_primary_key',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- ),
- 3: Field( # ID of the activity associated with this leader time
- name='activity_id',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- ),
- 4: Field( # Segment Time (includes pauses)
- name='segment_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- scale=1000,
- units='s',
- ),
- 5: Field( # String version of the activity_id. 21 characters long, express in decimal
- name='activity_id_string',
- type=BASE_TYPES[0x07], # string
- def_num=5,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 150: MessageType( # Navigation and race evaluation point for a segment decribing a point along the segment path and time it took each segment leader to reach that point
- name='segment_point',
- mesg_num=150,
- fields={
- 1: Field(
- name='position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=1,
- units='semicircles',
- ),
- 2: Field(
- name='position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=2,
- units='semicircles',
- ),
- 3: Field( # Accumulated distance along the segment at the described point
- name='distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- scale=100,
- units='m',
- ),
- 4: Field( # Accumulated altitude along the segment at the described point
- name='altitude',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- scale=5,
- offset=500,
- units='m',
- ),
- 5: Field( # Accumualted time each leader board member required to reach the described point. This value is zero for all leader board members at the starting point of the segment.
- name='leader_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=5,
- scale=1000,
- units='s',
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 158: MessageType(
- name='workout_session',
- mesg_num=158,
- fields={
- 0: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=0,
- ),
- 1: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=1,
- ),
- 2: Field(
- name='num_valid_steps',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- ),
- 3: Field(
- name='first_step_index',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- ),
- 4: Field(
- name='pool_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- scale=100,
- units='m',
- ),
- 5: Field(
- name='pool_length_unit',
- type=FIELD_TYPES['display_measure'],
- def_num=5,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 159: MessageType(
- name='watchface_settings',
- mesg_num=159,
- fields={
- 0: Field(
- name='mode',
- type=FIELD_TYPES['watchface_mode'],
- def_num=0,
- ),
- 1: Field(
- name='layout',
- type=BASE_TYPES[0x0D], # byte
- def_num=1,
- subfields=(
- SubField(
- name='analog_layout',
- def_num=1,
- type=FIELD_TYPES['analog_watchface_layout'],
- ref_fields=(
- ReferenceField(
- name='mode',
- def_num=0,
- value='analog',
- raw_value=1,
- ),
- ),
- ),
- SubField(
- name='digital_layout',
- def_num=1,
- type=FIELD_TYPES['digital_watchface_layout'],
- ref_fields=(
- ReferenceField(
- name='mode',
- def_num=0,
- value='digital',
- raw_value=0,
- ),
- ),
- ),
- ),
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 160: MessageType(
- name='gps_metadata',
- mesg_num=160,
- fields={
- 0: Field( # Millisecond part of the timestamp.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field(
- name='position_lat',
- type=BASE_TYPES[0x85], # sint32
- def_num=1,
- units='semicircles',
- ),
- 2: Field(
- name='position_long',
- type=BASE_TYPES[0x85], # sint32
- def_num=2,
- units='semicircles',
- ),
- 3: Field(
- name='enhanced_altitude',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- scale=5,
- offset=500,
- units='m',
- ),
- 4: Field(
- name='enhanced_speed',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- scale=1000,
- units='m/s',
- ),
- 5: Field(
- name='heading',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- scale=100,
- units='degrees',
- ),
- 6: Field( # Used to correlate UTC to system time if the timestamp of the message is in system time. This UTC time is derived from the GPS data.
- name='utc_timestamp',
- type=FIELD_TYPES['date_time'],
- def_num=6,
- units='s',
- ),
- 7: Field( # velocity[0] is lon velocity. Velocity[1] is lat velocity. Velocity[2] is altitude velocity.
- name='velocity',
- type=BASE_TYPES[0x83], # sint16
- def_num=7,
- scale=100,
- units='m/s',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp.
- },
- ),
- 161: MessageType(
- name='camera_event',
- mesg_num=161,
- fields={
- 0: Field( # Millisecond part of the timestamp.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field(
- name='camera_event_type',
- type=FIELD_TYPES['camera_event_type'],
- def_num=1,
- ),
- 2: Field(
- name='camera_file_uuid',
- type=BASE_TYPES[0x07], # string
- def_num=2,
- ),
- 3: Field(
- name='camera_orientation',
- type=FIELD_TYPES['camera_orientation_type'],
- def_num=3,
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp.
- },
- ),
- 162: MessageType(
- name='timestamp_correlation',
- mesg_num=162,
- fields={
- 0: Field( # Fractional part of the UTC timestamp at the time the system timestamp was recorded.
- name='fractional_timestamp',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- scale=32768,
- units='s',
- ),
- 1: Field( # Whole second part of the system timestamp
- name='system_timestamp',
- type=FIELD_TYPES['date_time'],
- def_num=1,
- units='s',
- ),
- 2: Field( # Fractional part of the system timestamp
- name='fractional_system_timestamp',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- scale=32768,
- units='s',
- ),
- 3: Field( # timestamp epoch expressed in local time used to convert timestamps to local time
- name='local_timestamp',
- type=FIELD_TYPES['local_date_time'],
- def_num=3,
- units='s',
- ),
- 4: Field( # Millisecond part of the UTC timestamp at the time the system timestamp was recorded.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- units='ms',
- ),
- 5: Field( # Millisecond part of the system timestamp
- name='system_timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- units='ms',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of UTC timestamp at the time the system timestamp was recorded.
- },
- ),
- 164: MessageType(
- name='gyroscope_data',
- mesg_num=164,
- fields={
- 0: Field( # Millisecond part of the timestamp.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # Each time in the array describes the time at which the gyro sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in gyro_x and gyro_y and gyro_z
- name='sample_time_offset',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='ms',
- ),
- 2: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='gyro_x',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- units='counts',
- ),
- 3: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='gyro_y',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- units='counts',
- ),
- 4: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='gyro_z',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- units='counts',
- ),
- 5: Field( # Calibrated gyro reading
- name='calibrated_gyro_x',
- type=BASE_TYPES[0x88], # float32
- def_num=5,
- units='deg/s',
- ),
- 6: Field( # Calibrated gyro reading
- name='calibrated_gyro_y',
- type=BASE_TYPES[0x88], # float32
- def_num=6,
- units='deg/s',
- ),
- 7: Field( # Calibrated gyro reading
- name='calibrated_gyro_z',
- type=BASE_TYPES[0x88], # float32
- def_num=7,
- units='deg/s',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
- },
- ),
- 165: MessageType(
- name='accelerometer_data',
- mesg_num=165,
- fields={
- 0: Field( # Millisecond part of the timestamp.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # Each time in the array describes the time at which the accelerometer sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in accel_x and accel_y and accel_z
- name='sample_time_offset',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='ms',
- ),
- 2: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='accel_x',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- units='counts',
- ),
- 3: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='accel_y',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- units='counts',
- ),
- 4: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='accel_z',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- units='counts',
- ),
- 5: Field( # Calibrated accel reading
- name='calibrated_accel_x',
- type=BASE_TYPES[0x88], # float32
- def_num=5,
- units='g',
- ),
- 6: Field( # Calibrated accel reading
- name='calibrated_accel_y',
- type=BASE_TYPES[0x88], # float32
- def_num=6,
- units='g',
- ),
- 7: Field( # Calibrated accel reading
- name='calibrated_accel_z',
- type=BASE_TYPES[0x88], # float32
- def_num=7,
- units='g',
- ),
- 8: Field( # Calibrated accel reading
- name='compressed_calibrated_accel_x',
- type=BASE_TYPES[0x83], # sint16
- def_num=8,
- units='mG',
- ),
- 9: Field( # Calibrated accel reading
- name='compressed_calibrated_accel_y',
- type=BASE_TYPES[0x83], # sint16
- def_num=9,
- units='mG',
- ),
- 10: Field( # Calibrated accel reading
- name='compressed_calibrated_accel_z',
- type=BASE_TYPES[0x83], # sint16
- def_num=10,
- units='mG',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
- },
- ),
- 167: MessageType(
- name='three_d_sensor_calibration',
- mesg_num=167,
- fields={
- 0: Field( # Indicates which sensor the calibration is for
- name='sensor_type',
- type=FIELD_TYPES['sensor_type'],
- def_num=0,
- ),
- 1: Field( # Calibration factor used to convert from raw ADC value to degrees, g, etc.
- name='calibration_factor',
- type=BASE_TYPES[0x86], # uint32
- def_num=1,
- subfields=(
- SubField( # Accelerometer calibration factor
- name='accel_cal_factor',
- def_num=1,
- type=BASE_TYPES[0x86], # uint32
- units='g',
- ref_fields=(
- ReferenceField(
- name='sensor_type',
- def_num=0,
- value='accelerometer',
- raw_value=0,
- ),
- ),
- ),
- SubField( # Gyro calibration factor
- name='gyro_cal_factor',
- def_num=1,
- type=BASE_TYPES[0x86], # uint32
- units='deg/s',
- ref_fields=(
- ReferenceField(
- name='sensor_type',
- def_num=0,
- value='gyroscope',
- raw_value=1,
- ),
- ),
- ),
- ),
- ),
- 2: Field( # Calibration factor divisor
- name='calibration_divisor',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- units='counts',
- ),
- 3: Field( # Level shift value used to shift the ADC value back into range
- name='level_shift',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- ),
- 4: Field( # Internal calibration factors, one for each: xy, yx, zx
- name='offset_cal',
- type=BASE_TYPES[0x85], # sint32
- def_num=4,
- ),
- 5: Field( # 3 x 3 rotation matrix (row major)
- name='orientation_matrix',
- type=BASE_TYPES[0x85], # sint32
- def_num=5,
- scale=65535,
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
- },
- ),
- 169: MessageType(
- name='video_frame',
- mesg_num=169,
- fields={
- 0: Field( # Millisecond part of the timestamp.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # Number of the frame that the timestamp and timestamp_ms correlate to
- name='frame_number',
- type=BASE_TYPES[0x86], # uint32
- def_num=1,
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
- },
- ),
- 174: MessageType(
- name='obdii_data',
- mesg_num=174,
- fields={
- 0: Field( # Fractional part of timestamp, added to timestamp
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # Offset of PID reading [i] from start_timestamp+start_timestamp_ms. Readings may span accross seconds.
- name='time_offset',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='ms',
- ),
- 2: Field( # Parameter ID
- name='pid',
- type=BASE_TYPES[0x0D], # byte
- def_num=2,
- ),
- 3: Field( # Raw parameter data
- name='raw_data',
- type=BASE_TYPES[0x0D], # byte
- def_num=3,
- ),
- 4: Field( # Optional, data size of PID[i]. If not specified refer to SAE J1979.
- name='pid_data_size',
- type=BASE_TYPES[0x02], # uint8
- def_num=4,
- ),
- 5: Field( # System time associated with sample expressed in ms, can be used instead of time_offset. There will be a system_time value for each raw_data element. For multibyte pids the system_time is repeated.
- name='system_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=5,
- ),
- 6: Field( # Timestamp of first sample recorded in the message. Used with time_offset to generate time of each sample
- name='start_timestamp',
- type=FIELD_TYPES['date_time'],
- def_num=6,
- ),
- 7: Field( # Fractional part of start_timestamp
- name='start_timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=7,
- units='ms',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Timestamp message was output
- },
- ),
- 177: MessageType(
- name='nmea_sentence',
- mesg_num=177,
- fields={
- 0: Field( # Fractional part of timestamp, added to timestamp
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # NMEA sentence
- name='sentence',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Timestamp message was output
- },
- ),
- 178: MessageType(
- name='aviation_attitude',
- mesg_num=178,
- fields={
- 0: Field( # Fractional part of timestamp, added to timestamp
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # System time associated with sample expressed in ms.
- name='system_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=1,
- units='ms',
- ),
- 2: Field( # Range -PI/2 to +PI/2
- name='pitch',
- type=BASE_TYPES[0x83], # sint16
- def_num=2,
- scale=10430.38,
- units='radians',
- ),
- 3: Field( # Range -PI to +PI
- name='roll',
- type=BASE_TYPES[0x83], # sint16
- def_num=3,
- scale=10430.38,
- units='radians',
- ),
- 4: Field( # Range -78.4 to +78.4 (-8 Gs to 8 Gs)
- name='accel_lateral',
- type=BASE_TYPES[0x83], # sint16
- def_num=4,
- scale=100,
- units='m/s^2',
- ),
- 5: Field( # Range -78.4 to +78.4 (-8 Gs to 8 Gs)
- name='accel_normal',
- type=BASE_TYPES[0x83], # sint16
- def_num=5,
- scale=100,
- units='m/s^2',
- ),
- 6: Field( # Range -8.727 to +8.727 (-500 degs/sec to +500 degs/sec)
- name='turn_rate',
- type=BASE_TYPES[0x83], # sint16
- def_num=6,
- scale=1024,
- units='radians/second',
- ),
- 7: Field(
- name='stage',
- type=FIELD_TYPES['attitude_stage'],
- def_num=7,
- ),
- 8: Field( # The percent complete of the current attitude stage. Set to 0 for attitude stages 0, 1 and 2 and to 100 for attitude stage 3 by AHRS modules that do not support it. Range - 100
- name='attitude_stage_complete',
- type=BASE_TYPES[0x02], # uint8
- def_num=8,
- units='%',
- ),
- 9: Field( # Track Angle/Heading Range 0 - 2pi
- name='track',
- type=BASE_TYPES[0x84], # uint16
- def_num=9,
- scale=10430.38,
- units='radians',
- ),
- 10: Field(
- name='validity',
- type=FIELD_TYPES['attitude_validity'],
- def_num=10,
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Timestamp message was output
- },
- ),
- 184: MessageType(
- name='video',
- mesg_num=184,
- fields={
- 0: Field(
- name='url',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field(
- name='hosting_provider',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 2: Field( # Playback time of video
- name='duration',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- units='ms',
- ),
- },
- ),
- 185: MessageType(
- name='video_title',
- mesg_num=185,
- fields={
- 0: Field( # Total number of title parts
- name='message_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- ),
- 1: Field(
- name='text',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 254: Field( # Long titles will be split into multiple parts
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 186: MessageType(
- name='video_description',
- mesg_num=186,
- fields={
- 0: Field( # Total number of description parts
- name='message_count',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- ),
- 1: Field(
- name='text',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 254: Field( # Long descriptions will be split into multiple parts
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 187: MessageType(
- name='video_clip',
- mesg_num=187,
- fields={
- 0: Field(
- name='clip_number',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- ),
- 1: Field(
- name='start_timestamp',
- type=FIELD_TYPES['date_time'],
- def_num=1,
- ),
- 2: Field(
- name='start_timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- ),
- 3: Field(
- name='end_timestamp',
- type=FIELD_TYPES['date_time'],
- def_num=3,
- ),
- 4: Field(
- name='end_timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- ),
- 6: Field( # Start of clip in video time
- name='clip_start',
- type=BASE_TYPES[0x86], # uint32
- def_num=6,
- units='ms',
- ),
- 7: Field( # End of clip in video time
- name='clip_end',
- type=BASE_TYPES[0x86], # uint32
- def_num=7,
- units='ms',
- ),
- },
- ),
- 188: MessageType(
- name='ohr_settings',
- mesg_num=188,
- fields={
- 0: Field(
- name='enabled',
- type=FIELD_TYPES['switch'],
- def_num=0,
- ),
- },
- ),
- 200: MessageType(
- name='exd_screen_configuration',
- mesg_num=200,
- fields={
- 0: Field(
- name='screen_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- ),
- 1: Field( # number of fields in screen
- name='field_count',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- ),
- 2: Field(
- name='layout',
- type=FIELD_TYPES['exd_layout'],
- def_num=2,
- ),
- 3: Field(
- name='screen_enabled',
- type=FIELD_TYPES['bool'],
- def_num=3,
- ),
- },
- ),
- 201: MessageType(
- name='exd_data_field_configuration',
- mesg_num=201,
- fields={
- 0: Field(
- name='screen_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- ),
- 1: Field(
- name='concept_field',
- type=BASE_TYPES[0x0D], # byte
- def_num=1,
- components=(
- ComponentField(
- name='field_id',
- def_num=2,
- accumulate=False,
- bits=4,
- bit_offset=0,
- ),
- ComponentField(
- name='concept_count',
- def_num=3,
- accumulate=False,
- bits=4,
- bit_offset=4,
- ),
- ),
- ),
- 2: Field(
- name='field_id',
- type=BASE_TYPES[0x02], # uint8
- def_num=2,
- ),
- 3: Field(
- name='concept_count',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- ),
- 4: Field(
- name='display_type',
- type=FIELD_TYPES['exd_display_type'],
- def_num=4,
- ),
- 5: Field(
- name='title',
- type=BASE_TYPES[0x07], # string
- def_num=5,
- ),
- },
- ),
- 202: MessageType(
- name='exd_data_concept_configuration',
- mesg_num=202,
- fields={
- 0: Field(
- name='screen_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- ),
- 1: Field(
- name='concept_field',
- type=BASE_TYPES[0x0D], # byte
- def_num=1,
- components=(
- ComponentField(
- name='field_id',
- def_num=2,
- accumulate=False,
- bits=4,
- bit_offset=0,
- ),
- ComponentField(
- name='concept_index',
- def_num=3,
- accumulate=False,
- bits=4,
- bit_offset=4,
- ),
- ),
- ),
- 2: Field(
- name='field_id',
- type=BASE_TYPES[0x02], # uint8
- def_num=2,
- ),
- 3: Field(
- name='concept_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- ),
- 4: Field(
- name='data_page',
- type=BASE_TYPES[0x02], # uint8
- def_num=4,
- ),
- 5: Field(
- name='concept_key',
- type=BASE_TYPES[0x02], # uint8
- def_num=5,
- ),
- 6: Field(
- name='scaling',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- ),
- 8: Field(
- name='data_units',
- type=FIELD_TYPES['exd_data_units'],
- def_num=8,
- ),
- 9: Field(
- name='qualifier',
- type=FIELD_TYPES['exd_qualifiers'],
- def_num=9,
- ),
- 10: Field(
- name='descriptor',
- type=FIELD_TYPES['exd_descriptors'],
- def_num=10,
- ),
- 11: Field(
- name='is_signed',
- type=FIELD_TYPES['bool'],
- def_num=11,
- ),
- },
- ),
- 206: MessageType( # Must be logged before developer field is used
- name='field_description',
- mesg_num=206,
- fields={
- 0: Field(
- name='developer_data_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- ),
- 1: Field(
- name='field_definition_number',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- ),
- 2: Field(
- name='fit_base_type_id',
- type=FIELD_TYPES['fit_base_type'],
- def_num=2,
- ),
- 3: Field(
- name='field_name',
- type=BASE_TYPES[0x07], # string
- def_num=3,
- ),
- 4: Field(
- name='array',
- type=BASE_TYPES[0x02], # uint8
- def_num=4,
- ),
- 5: Field(
- name='components',
- type=BASE_TYPES[0x07], # string
- def_num=5,
- ),
- 6: Field(
- name='scale',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- ),
- 7: Field(
- name='offset',
- type=BASE_TYPES[0x01], # sint8
- def_num=7,
- ),
- 8: Field(
- name='units',
- type=BASE_TYPES[0x07], # string
- def_num=8,
- ),
- 9: Field(
- name='bits',
- type=BASE_TYPES[0x07], # string
- def_num=9,
- ),
- 10: Field(
- name='accumulate',
- type=BASE_TYPES[0x07], # string
- def_num=10,
- ),
- 13: Field(
- name='fit_base_unit_id',
- type=FIELD_TYPES['fit_base_unit'],
- def_num=13,
- ),
- 14: Field(
- name='native_mesg_num',
- type=FIELD_TYPES['mesg_num'],
- def_num=14,
- ),
- 15: Field(
- name='native_field_num',
- type=BASE_TYPES[0x02], # uint8
- def_num=15,
- ),
- },
- ),
- 207: MessageType( # Must be logged before field description
- name='developer_data_id',
- mesg_num=207,
- fields={
- 0: Field(
- name='developer_id',
- type=BASE_TYPES[0x0D], # byte
- def_num=0,
- ),
- 1: Field(
- name='application_id',
- type=BASE_TYPES[0x0D], # byte
- def_num=1,
- ),
- 2: Field(
- name='manufacturer_id',
- type=FIELD_TYPES['manufacturer'],
- def_num=2,
- ),
- 3: Field(
- name='developer_data_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- ),
- 4: Field(
- name='application_version',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- ),
- },
- ),
- 208: MessageType(
- name='magnetometer_data',
- mesg_num=208,
- fields={
- 0: Field( # Millisecond part of the timestamp.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # Each time in the array describes the time at which the compass sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in cmps_x and cmps_y and cmps_z
- name='sample_time_offset',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='ms',
- ),
- 2: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='mag_x',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- units='counts',
- ),
- 3: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='mag_y',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- units='counts',
- ),
- 4: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='mag_z',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- units='counts',
- ),
- 5: Field( # Calibrated Magnetometer reading
- name='calibrated_mag_x',
- type=BASE_TYPES[0x88], # float32
- def_num=5,
- units='G',
- ),
- 6: Field( # Calibrated Magnetometer reading
- name='calibrated_mag_y',
- type=BASE_TYPES[0x88], # float32
- def_num=6,
- units='G',
- ),
- 7: Field( # Calibrated Magnetometer reading
- name='calibrated_mag_z',
- type=BASE_TYPES[0x88], # float32
- def_num=7,
- units='G',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
- },
- ),
- 209: MessageType(
- name='barometer_data',
- mesg_num=209,
- fields={
- 0: Field( # Millisecond part of the timestamp.
- name='timestamp_ms',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='ms',
- ),
- 1: Field( # Each time in the array describes the time at which the barometer sample with the corrosponding index was taken. The samples may span across seconds. Array size must match the number of samples in baro_cal
- name='sample_time_offset',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='ms',
- ),
- 2: Field( # These are the raw ADC reading. The samples may span across seconds. A conversion will need to be done on this data once read.
- name='baro_pres',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- units='Pa',
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
- },
- ),
- 210: MessageType(
- name='one_d_sensor_calibration',
- mesg_num=210,
- fields={
- 0: Field( # Indicates which sensor the calibration is for
- name='sensor_type',
- type=FIELD_TYPES['sensor_type'],
- def_num=0,
- ),
- 1: Field( # Calibration factor used to convert from raw ADC value to degrees, g, etc.
- name='calibration_factor',
- type=BASE_TYPES[0x86], # uint32
- def_num=1,
- subfields=(
- SubField( # Barometer calibration factor
- name='baro_cal_factor',
- def_num=1,
- type=BASE_TYPES[0x86], # uint32
- units='Pa',
- ref_fields=(
- ReferenceField(
- name='sensor_type',
- def_num=0,
- value='barometer',
- raw_value=3,
- ),
- ),
- ),
- ),
- ),
- 2: Field( # Calibration factor divisor
- name='calibration_divisor',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- units='counts',
- ),
- 3: Field( # Level shift value used to shift the ADC value back into range
- name='level_shift',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- ),
- 4: Field( # Internal Calibration factor
- name='offset_cal',
- type=BASE_TYPES[0x85], # sint32
- def_num=4,
- ),
- 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
- },
- ),
- 225: MessageType(
- name='set',
- mesg_num=225,
- fields={
- 0: Field(
- name='duration',
- type=BASE_TYPES[0x86], # uint32
- def_num=0,
- scale=1000,
- units='s',
- ),
- 3: Field( # # of repitions of the movement
- name='repetitions',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- ),
- 4: Field( # Amount of weight applied for the set
- name='weight',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- scale=16,
- units='kg',
- ),
- 5: Field(
- name='set_type',
- type=FIELD_TYPES['set_type'],
- def_num=5,
- ),
- 6: Field( # Start time of the set
- name='start_time',
- type=FIELD_TYPES['date_time'],
- def_num=6,
- ),
- 7: Field(
- name='category',
- type=FIELD_TYPES['exercise_category'],
- def_num=7,
- ),
- 8: Field( # Based on the associated category, see [category]_exercise_names
- name='category_subtype',
- type=BASE_TYPES[0x84], # uint16
- def_num=8,
- ),
- 9: Field(
- name='weight_display_unit',
- type=FIELD_TYPES['fit_base_unit'],
- def_num=9,
- ),
- 10: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=10,
- ),
- 11: Field(
- name='wkt_step_index',
- type=FIELD_TYPES['message_index'],
- def_num=11,
- ),
- 254: Field( # Timestamp of the set
- name='timestamp',
- type=FIELD_TYPES['date_time'],
- def_num=254,
- ),
- },
- ),
- 227: MessageType( # Value from 1 to 100 calculated by FirstBeat
- name='stress_level',
- mesg_num=227,
- fields={
- 0: Field(
- name='stress_level_value',
- type=BASE_TYPES[0x83], # sint16
- def_num=0,
- ),
- 1: Field( # Time stress score was calculated
- name='stress_level_time',
- type=FIELD_TYPES['date_time'],
- def_num=1,
- units='s',
- ),
- },
- ),
- 258: MessageType(
- name='dive_settings',
- mesg_num=258,
- fields={
- 0: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field(
- name='model',
- type=FIELD_TYPES['tissue_model_type'],
- def_num=1,
- ),
- 2: Field(
- name='gf_low',
- type=BASE_TYPES[0x02], # uint8
- def_num=2,
- units='percent',
- ),
- 3: Field(
- name='gf_high',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- units='percent',
- ),
- 4: Field(
- name='water_type',
- type=FIELD_TYPES['water_type'],
- def_num=4,
- ),
- 5: Field( # Fresh water is usually 1000; salt water is usually 1025
- name='water_density',
- type=BASE_TYPES[0x88], # float32
- def_num=5,
- units='kg/m^3',
- ),
- 6: Field( # Typically 1.40
- name='po2_warn',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- scale=100,
- units='percent',
- ),
- 7: Field( # Typically 1.60
- name='po2_critical',
- type=BASE_TYPES[0x02], # uint8
- def_num=7,
- scale=100,
- units='percent',
- ),
- 8: Field(
- name='po2_deco',
- type=BASE_TYPES[0x02], # uint8
- def_num=8,
- scale=100,
- units='percent',
- ),
- 9: Field(
- name='safety_stop_enabled',
- type=FIELD_TYPES['bool'],
- def_num=9,
- ),
- 10: Field(
- name='bottom_depth',
- type=BASE_TYPES[0x88], # float32
- def_num=10,
- ),
- 11: Field(
- name='bottom_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=11,
- ),
- 12: Field(
- name='apnea_countdown_enabled',
- type=FIELD_TYPES['bool'],
- def_num=12,
- ),
- 13: Field(
- name='apnea_countdown_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=13,
- ),
- 14: Field(
- name='backlight_mode',
- type=FIELD_TYPES['dive_backlight_mode'],
- def_num=14,
- ),
- 15: Field(
- name='backlight_brightness',
- type=BASE_TYPES[0x02], # uint8
- def_num=15,
- ),
- 16: Field(
- name='backlight_timeout',
- type=FIELD_TYPES['backlight_timeout'],
- def_num=16,
- ),
- 17: Field( # Time between surfacing and ending the activity
- name='repeat_dive_interval',
- type=BASE_TYPES[0x84], # uint16
- def_num=17,
- units='s',
- ),
- 18: Field( # Time at safety stop (if enabled)
- name='safety_stop_time',
- type=BASE_TYPES[0x84], # uint16
- def_num=18,
- units='s',
- ),
- 19: Field(
- name='heart_rate_source_type',
- type=FIELD_TYPES['source_type'],
- def_num=19,
- ),
- 20: Field(
- name='heart_rate_source',
- type=BASE_TYPES[0x02], # uint8
- def_num=20,
- subfields=(
- SubField(
- name='heart_rate_antplus_device_type',
- def_num=20,
- type=FIELD_TYPES['antplus_device_type'],
- ref_fields=(
- ReferenceField(
- name='heart_rate_source_type',
- def_num=19,
- value='antplus',
- raw_value=1,
- ),
- ),
- ),
- SubField(
- name='heart_rate_local_device_type',
- def_num=20,
- type=FIELD_TYPES['local_device_type'],
- ref_fields=(
- ReferenceField(
- name='heart_rate_source_type',
- def_num=19,
- value='local',
- raw_value=5,
- ),
- ),
- ),
- ),
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 259: MessageType(
- name='dive_gas',
- mesg_num=259,
- fields={
- 0: Field(
- name='helium_content',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- units='percent',
- ),
- 1: Field(
- name='oxygen_content',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- units='percent',
- ),
- 2: Field(
- name='status',
- type=FIELD_TYPES['dive_gas_status'],
- def_num=2,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 262: MessageType(
- name='dive_alarm',
- mesg_num=262,
- fields={
- 0: Field(
- name='depth',
- type=BASE_TYPES[0x86], # uint32
- def_num=0,
- scale=1000,
- units='m',
- ),
- 1: Field(
- name='time',
- type=BASE_TYPES[0x85], # sint32
- def_num=1,
- units='s',
- ),
- 2: Field(
- name='enabled',
- type=FIELD_TYPES['bool'],
- def_num=2,
- ),
- 3: Field(
- name='alarm_type',
- type=FIELD_TYPES['dive_alarm_type'],
- def_num=3,
- ),
- 4: Field(
- name='sound',
- type=FIELD_TYPES['tone'],
- def_num=4,
- ),
- 5: Field(
- name='dive_types',
- type=FIELD_TYPES['sub_sport'],
- def_num=5,
- ),
- 254: Field( # Index of the alarm
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 264: MessageType(
- name='exercise_title',
- mesg_num=264,
- fields={
- 0: Field(
- name='exercise_category',
- type=FIELD_TYPES['exercise_category'],
- def_num=0,
- ),
- 1: Field(
- name='exercise_name',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- ),
- 2: Field(
- name='wkt_step_name',
- type=BASE_TYPES[0x07], # string
- def_num=2,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
- 268: MessageType(
- name='dive_summary',
- mesg_num=268,
- fields={
- 0: Field(
- name='reference_mesg',
- type=FIELD_TYPES['mesg_num'],
- def_num=0,
- ),
- 1: Field(
- name='reference_index',
- type=FIELD_TYPES['message_index'],
- def_num=1,
- ),
- 2: Field( # 0 if above water
- name='avg_depth',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- scale=1000,
- units='m',
- ),
- 3: Field( # 0 if above water
- name='max_depth',
- type=BASE_TYPES[0x86], # uint32
- def_num=3,
- scale=1000,
- units='m',
- ),
- 4: Field( # Time since end of last dive
- name='surface_interval',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- units='s',
- ),
- 5: Field(
- name='start_cns',
- type=BASE_TYPES[0x02], # uint8
- def_num=5,
- units='percent',
- ),
- 6: Field(
- name='end_cns',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- units='percent',
- ),
- 7: Field(
- name='start_n2',
- type=BASE_TYPES[0x84], # uint16
- def_num=7,
- units='percent',
- ),
- 8: Field(
- name='end_n2',
- type=BASE_TYPES[0x84], # uint16
- def_num=8,
- units='percent',
- ),
- 9: Field(
- name='o2_toxicity',
- type=BASE_TYPES[0x84], # uint16
- def_num=9,
- units='OTUs',
- ),
- 10: Field(
- name='dive_number',
- type=BASE_TYPES[0x86], # uint32
- def_num=10,
- ),
- 11: Field(
- name='bottom_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=11,
- scale=1000,
- units='s',
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
-
-
- # ************************* Activity File Messages *************************
- 34: MessageType(
- name='activity',
- mesg_num=34,
- fields={
- 0: Field( # Exclude pauses
- name='total_timer_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=0,
- scale=1000,
- units='s',
- ),
- 1: Field(
- name='num_sessions',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- ),
- 2: Field(
- name='type',
- type=FIELD_TYPES['activity'],
- def_num=2,
- ),
- 3: Field(
- name='event',
- type=FIELD_TYPES['event'],
- def_num=3,
- ),
- 4: Field(
- name='event_type',
- type=FIELD_TYPES['event_type'],
- def_num=4,
- ),
- 5: Field( # timestamp epoch expressed in local time, used to convert activity timestamps to local time
- name='local_timestamp',
- type=FIELD_TYPES['local_date_time'],
- def_num=5,
- ),
- 6: Field(
- name='event_group',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
-
-
- # ********************** Blood Pressure File Messages **********************
- 51: MessageType(
- name='blood_pressure',
- mesg_num=51,
- fields={
- 0: Field(
- name='systolic_pressure',
- type=BASE_TYPES[0x84], # uint16
- def_num=0,
- units='mmHg',
- ),
- 1: Field(
- name='diastolic_pressure',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- units='mmHg',
- ),
- 2: Field(
- name='mean_arterial_pressure',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- units='mmHg',
- ),
- 3: Field(
- name='map_3_sample_mean',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- units='mmHg',
- ),
- 4: Field(
- name='map_morning_values',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- units='mmHg',
- ),
- 5: Field(
- name='map_evening_values',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- units='mmHg',
- ),
- 6: Field(
- name='heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- units='bpm',
- ),
- 7: Field(
- name='heart_rate_type',
- type=FIELD_TYPES['hr_type'],
- def_num=7,
- ),
- 8: Field(
- name='status',
- type=FIELD_TYPES['bp_status'],
- def_num=8,
- ),
- 9: Field( # Associates this blood pressure message to a user. This corresponds to the index of the user profile message in the blood pressure file.
- name='user_profile_index',
- type=FIELD_TYPES['message_index'],
- def_num=9,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
-
-
- # ************************** Course File Messages **************************
- 31: MessageType(
- name='course',
- mesg_num=31,
- fields={
- 4: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=4,
- ),
- 5: Field(
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=5,
- ),
- 6: Field(
- name='capabilities',
- type=FIELD_TYPES['course_capabilities'],
- def_num=6,
- ),
- 7: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=7,
- ),
- },
- ),
-
-
- # ************************** Device File Messages **************************
- 35: MessageType(
- name='software',
- mesg_num=35,
- fields={
- 3: Field(
- name='version',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- scale=100,
- ),
- 5: Field(
- name='part_number',
- type=BASE_TYPES[0x07], # string
- def_num=5,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
-
-
- # ************************** Goals File Messages ***************************
- 15: MessageType(
- name='goal',
- mesg_num=15,
- fields={
- 0: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=0,
- ),
- 1: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=1,
- ),
- 2: Field(
- name='start_date',
- type=FIELD_TYPES['date_time'],
- def_num=2,
- ),
- 3: Field(
- name='end_date',
- type=FIELD_TYPES['date_time'],
- def_num=3,
- ),
- 4: Field(
- name='type',
- type=FIELD_TYPES['goal'],
- def_num=4,
- ),
- 5: Field(
- name='value',
- type=BASE_TYPES[0x86], # uint32
- def_num=5,
- ),
- 6: Field(
- name='repeat',
- type=FIELD_TYPES['bool'],
- def_num=6,
- ),
- 7: Field(
- name='target_value',
- type=BASE_TYPES[0x86], # uint32
- def_num=7,
- ),
- 8: Field(
- name='recurrence',
- type=FIELD_TYPES['goal_recurrence'],
- def_num=8,
- ),
- 9: Field(
- name='recurrence_value',
- type=BASE_TYPES[0x84], # uint16
- def_num=9,
- ),
- 10: Field(
- name='enabled',
- type=FIELD_TYPES['bool'],
- def_num=10,
- ),
- 11: Field(
- name='source',
- type=FIELD_TYPES['goal_source'],
- def_num=11,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
-
-
- # ************************ Monitoring File Messages ************************
- 103: MessageType(
- name='monitoring_info',
- mesg_num=103,
- fields={
- 0: Field( # Use to convert activity timestamps to local time if device does not support time zone and daylight savings time correction.
- name='local_timestamp',
- type=FIELD_TYPES['local_date_time'],
- def_num=0,
- units='s',
- ),
- 1: Field(
- name='activity_type',
- type=FIELD_TYPES['activity_type'],
- def_num=1,
- ),
- 3: Field( # Indexed by activity_type
- name='cycles_to_distance',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- scale=5000,
- units='m/cycle',
- ),
- 4: Field( # Indexed by activity_type
- name='cycles_to_calories',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- scale=5000,
- units='kcal/cycle',
- ),
- 5: Field(
- name='resting_metabolic_rate',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- units='kcal/day',
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
-
-
- # ***************************** Other Messages *****************************
- 145: MessageType(
- name='memo_glob',
- mesg_num=145,
- fields={
- 0: Field( # Block of utf8 bytes
- name='memo',
- type=BASE_TYPES[0x0D], # byte
- def_num=0,
- ),
- 1: Field( # Allows relating glob to another mesg If used only required for first part of each memo_glob
- name='message_number',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- ),
- 2: Field( # Index of external mesg
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=2,
- ),
- 250: Field( # Sequence number of memo blocks
- name='part_index',
- type=BASE_TYPES[0x86], # uint32
- def_num=250,
- ),
- },
- ),
-
-
- # ************************* Schedule File Messages *************************
- 28: MessageType(
- name='schedule',
- mesg_num=28,
- fields={
- 0: Field( # Corresponds to file_id of scheduled workout / course.
- name='manufacturer',
- type=FIELD_TYPES['manufacturer'],
- def_num=0,
- ),
- 1: Field( # Corresponds to file_id of scheduled workout / course.
- name='product',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- subfields=(
- SubField(
- name='garmin_product',
- def_num=1,
- type=FIELD_TYPES['garmin_product'],
- ref_fields=(
- ReferenceField(
- name='manufacturer',
- def_num=0,
- value='garmin',
- raw_value=1,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=0,
- value='dynastream',
- raw_value=15,
- ),
- ReferenceField(
- name='manufacturer',
- def_num=0,
- value='dynastream_oem',
- raw_value=13,
- ),
- ),
- ),
- ),
- ),
- 2: Field( # Corresponds to file_id of scheduled workout / course.
- name='serial_number',
- type=BASE_TYPES[0x8C], # uint32z
- def_num=2,
- ),
- 3: Field( # Corresponds to file_id of scheduled workout / course.
- name='time_created',
- type=FIELD_TYPES['date_time'],
- def_num=3,
- ),
- 4: Field( # TRUE if this activity has been started
- name='completed',
- type=FIELD_TYPES['bool'],
- def_num=4,
- ),
- 5: Field(
- name='type',
- type=FIELD_TYPES['schedule'],
- def_num=5,
- ),
- 6: Field(
- name='scheduled_time',
- type=FIELD_TYPES['local_date_time'],
- def_num=6,
- ),
- },
- ),
-
-
- # ************************* Segment File Messages **************************
- 148: MessageType( # Unique Identification data for a segment file
- name='segment_id',
- mesg_num=148,
- fields={
- 0: Field( # Friendly name assigned to segment
- name='name',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field( # UUID of the segment
- name='uuid',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 2: Field( # Sport associated with the segment
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=2,
- ),
- 3: Field( # Segment enabled for evaluation
- name='enabled',
- type=FIELD_TYPES['bool'],
- def_num=3,
- ),
- 4: Field( # Primary key of the user that created the segment
- name='user_profile_primary_key',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- ),
- 5: Field( # ID of the device that created the segment
- name='device_id',
- type=BASE_TYPES[0x86], # uint32
- def_num=5,
- ),
- 6: Field( # Index for the Leader Board entry selected as the default race participant
- name='default_race_leader',
- type=BASE_TYPES[0x02], # uint8
- def_num=6,
- ),
- 7: Field( # Indicates if any segments should be deleted
- name='delete_status',
- type=FIELD_TYPES['segment_delete_status'],
- def_num=7,
- ),
- 8: Field( # Indicates how the segment was selected to be sent to the device
- name='selection_type',
- type=FIELD_TYPES['segment_selection_type'],
- def_num=8,
- ),
- },
- ),
-
-
- # *********************** Segment List File Messages ***********************
- 151: MessageType( # Summary of the unique segment and leaderboard information associated with a segment file. This message is used to compile a segment list file describing all segment files on a device. The segment list file is used when refreshing the contents of a segment file with the latest available leaderboard information.
- name='segment_file',
- mesg_num=151,
- fields={
- 1: Field( # UUID of the segment file
- name='file_uuid',
- type=BASE_TYPES[0x07], # string
- def_num=1,
- ),
- 3: Field( # Enabled state of the segment file
- name='enabled',
- type=FIELD_TYPES['bool'],
- def_num=3,
- ),
- 4: Field( # Primary key of the user that created the segment file
- name='user_profile_primary_key',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- ),
- 7: Field( # Leader type of each leader in the segment file
- name='leader_type',
- type=FIELD_TYPES['segment_leaderboard_type'],
- def_num=7,
- ),
- 8: Field( # Group primary key of each leader in the segment file
- name='leader_group_primary_key',
- type=BASE_TYPES[0x86], # uint32
- def_num=8,
- ),
- 9: Field( # Activity ID of each leader in the segment file
- name='leader_activity_id',
- type=BASE_TYPES[0x86], # uint32
- def_num=9,
- ),
- 10: Field( # String version of the activity ID of each leader in the segment file. 21 characters long for each ID, express in decimal
- name='leader_activity_id_string',
- type=BASE_TYPES[0x07], # string
- def_num=10,
- ),
- 11: Field( # Index for the Leader Board entry selected as the default race participant
- name='default_race_leader',
- type=BASE_TYPES[0x02], # uint8
- def_num=11,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
-
-
- # ************************* Settings File Messages *************************
- 2: MessageType(
- name='device_settings',
- mesg_num=2,
- fields={
- 0: Field( # Index into time zone arrays.
- name='active_time_zone',
- type=BASE_TYPES[0x02], # uint8
- def_num=0,
- ),
- 1: Field( # Offset from system time. Required to convert timestamp from system time to UTC.
- name='utc_offset',
- type=BASE_TYPES[0x86], # uint32
- def_num=1,
- ),
- 2: Field( # Offset from system time.
- name='time_offset',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- units='s',
- ),
- 4: Field( # Display mode for the time
- name='time_mode',
- type=FIELD_TYPES['time_mode'],
- def_num=4,
- ),
- 5: Field( # timezone offset in 1/4 hour increments
- name='time_zone_offset',
- type=BASE_TYPES[0x01], # sint8
- def_num=5,
- scale=4,
- units='hr',
- ),
- 12: Field( # Mode for backlight
- name='backlight_mode',
- type=FIELD_TYPES['backlight_mode'],
- def_num=12,
- ),
- 36: Field( # Enabled state of the activity tracker functionality
- name='activity_tracker_enabled',
- type=FIELD_TYPES['bool'],
- def_num=36,
- ),
- 39: Field( # UTC timestamp used to set the devices clock and date
- name='clock_time',
- type=FIELD_TYPES['date_time'],
- def_num=39,
- ),
- 40: Field( # Bitfield to configure enabled screens for each supported loop
- name='pages_enabled',
- type=BASE_TYPES[0x84], # uint16
- def_num=40,
- ),
- 46: Field( # Enabled state of the move alert
- name='move_alert_enabled',
- type=FIELD_TYPES['bool'],
- def_num=46,
- ),
- 47: Field( # Display mode for the date
- name='date_mode',
- type=FIELD_TYPES['date_mode'],
- def_num=47,
- ),
- 55: Field(
- name='display_orientation',
- type=FIELD_TYPES['display_orientation'],
- def_num=55,
- ),
- 56: Field(
- name='mounting_side',
- type=FIELD_TYPES['side'],
- def_num=56,
- ),
- 57: Field( # Bitfield to indicate one page as default for each supported loop
- name='default_page',
- type=BASE_TYPES[0x84], # uint16
- def_num=57,
- ),
- 58: Field( # Minimum steps before an autosync can occur
- name='autosync_min_steps',
- type=BASE_TYPES[0x84], # uint16
- def_num=58,
- units='steps',
- ),
- 59: Field( # Minimum minutes before an autosync can occur
- name='autosync_min_time',
- type=BASE_TYPES[0x84], # uint16
- def_num=59,
- units='minutes',
- ),
- 80: Field( # Enable auto-detect setting for the lactate threshold feature.
- name='lactate_threshold_autodetect_enabled',
- type=FIELD_TYPES['bool'],
- def_num=80,
- ),
- 86: Field( # Automatically upload using BLE
- name='ble_auto_upload_enabled',
- type=FIELD_TYPES['bool'],
- def_num=86,
- ),
- 89: Field( # Helps to conserve battery by changing modes
- name='auto_sync_frequency',
- type=FIELD_TYPES['auto_sync_frequency'],
- def_num=89,
- ),
- 90: Field( # Allows setting specific activities auto-activity detect enabled/disabled settings
- name='auto_activity_detect',
- type=FIELD_TYPES['auto_activity_detect'],
- def_num=90,
- ),
- 94: Field( # Number of screens configured to display
- name='number_of_screens',
- type=BASE_TYPES[0x02], # uint8
- def_num=94,
- ),
- 95: Field( # Smart Notification display orientation
- name='smart_notification_display_orientation',
- type=FIELD_TYPES['display_orientation'],
- def_num=95,
- ),
- 134: Field(
- name='tap_interface',
- type=FIELD_TYPES['switch'],
- def_num=134,
- ),
- },
- ),
- 3: MessageType(
- name='user_profile',
- mesg_num=3,
- fields={
- 0: Field(
- name='friendly_name',
- type=BASE_TYPES[0x07], # string
- def_num=0,
- ),
- 1: Field(
- name='gender',
- type=FIELD_TYPES['gender'],
- def_num=1,
- ),
- 2: Field(
- name='age',
- type=BASE_TYPES[0x02], # uint8
- def_num=2,
- units='years',
- ),
- 3: Field(
- name='height',
- type=BASE_TYPES[0x02], # uint8
- def_num=3,
- scale=100,
- units='m',
- ),
- 4: Field(
- name='weight',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- scale=10,
- units='kg',
- ),
- 5: Field(
- name='language',
- type=FIELD_TYPES['language'],
- def_num=5,
- ),
- 6: Field(
- name='elev_setting',
- type=FIELD_TYPES['display_measure'],
- def_num=6,
- ),
- 7: Field(
- name='weight_setting',
- type=FIELD_TYPES['display_measure'],
- def_num=7,
- ),
- 8: Field(
- name='resting_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=8,
- units='bpm',
- ),
- 9: Field(
- name='default_max_running_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=9,
- units='bpm',
- ),
- 10: Field(
- name='default_max_biking_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=10,
- units='bpm',
- ),
- 11: Field(
- name='default_max_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=11,
- units='bpm',
- ),
- 12: Field(
- name='hr_setting',
- type=FIELD_TYPES['display_heart'],
- def_num=12,
- ),
- 13: Field(
- name='speed_setting',
- type=FIELD_TYPES['display_measure'],
- def_num=13,
- ),
- 14: Field(
- name='dist_setting',
- type=FIELD_TYPES['display_measure'],
- def_num=14,
- ),
- 16: Field(
- name='power_setting',
- type=FIELD_TYPES['display_power'],
- def_num=16,
- ),
- 17: Field(
- name='activity_class',
- type=FIELD_TYPES['activity_class'],
- def_num=17,
- ),
- 18: Field(
- name='position_setting',
- type=FIELD_TYPES['display_position'],
- def_num=18,
- ),
- 21: Field(
- name='temperature_setting',
- type=FIELD_TYPES['display_measure'],
- def_num=21,
- ),
- 22: Field(
- name='local_id',
- type=FIELD_TYPES['user_local_id'],
- def_num=22,
- ),
- 23: Field(
- name='global_id',
- type=BASE_TYPES[0x0D], # byte
- def_num=23,
- ),
- 28: Field( # Typical wake time
- name='wake_time',
- type=FIELD_TYPES['localtime_into_day'],
- def_num=28,
- ),
- 29: Field( # Typical bed time
- name='sleep_time',
- type=FIELD_TYPES['localtime_into_day'],
- def_num=29,
- ),
- 30: Field(
- name='height_setting',
- type=FIELD_TYPES['display_measure'],
- def_num=30,
- ),
- 31: Field( # User defined running step length set to 0 for auto length
- name='user_running_step_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=31,
- scale=1000,
- units='m',
- ),
- 32: Field( # User defined walking step length set to 0 for auto length
- name='user_walking_step_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=32,
- scale=1000,
- units='m',
- ),
- 47: Field(
- name='depth_setting',
- type=FIELD_TYPES['display_measure'],
- def_num=47,
- ),
- 49: Field(
- name='dive_count',
- type=BASE_TYPES[0x86], # uint32
- def_num=49,
- ),
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
-
-
- # ********************** Sport Settings File Messages **********************
- 7: MessageType(
- name='zones_target',
- mesg_num=7,
- fields={
- 1: Field(
- name='max_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=1,
- ),
- 2: Field(
- name='threshold_heart_rate',
- type=BASE_TYPES[0x02], # uint8
- def_num=2,
- ),
- 3: Field(
- name='functional_threshold_power',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- ),
- 5: Field(
- name='hr_calc_type',
- type=FIELD_TYPES['hr_zone_calc'],
- def_num=5,
- ),
- 7: Field(
- name='pwr_calc_type',
- type=FIELD_TYPES['pwr_zone_calc'],
- def_num=7,
- ),
- },
- ),
-
-
- # ************************** Totals File Messages **************************
- 33: MessageType(
- name='totals',
- mesg_num=33,
- fields={
- 0: Field( # Excludes pauses
- name='timer_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=0,
- units='s',
- ),
- 1: Field(
- name='distance',
- type=BASE_TYPES[0x86], # uint32
- def_num=1,
- units='m',
- ),
- 2: Field(
- name='calories',
- type=BASE_TYPES[0x86], # uint32
- def_num=2,
- units='kcal',
- ),
- 3: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=3,
- ),
- 4: Field( # Includes pauses
- name='elapsed_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=4,
- units='s',
- ),
- 5: Field(
- name='sessions',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- ),
- 6: Field(
- name='active_time',
- type=BASE_TYPES[0x86], # uint32
- def_num=6,
- units='s',
- ),
- 9: Field(
- name='sport_index',
- type=BASE_TYPES[0x02], # uint8
- def_num=9,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- 254: Field(
- name='message_index',
- type=FIELD_TYPES['message_index'],
- def_num=254,
- ),
- },
- ),
-
-
- # *********************** Weight Scale File Messages ***********************
- 30: MessageType(
- name='weight_scale',
- mesg_num=30,
- fields={
- 0: Field(
- name='weight',
- type=FIELD_TYPES['weight'],
- def_num=0,
- scale=100,
- units='kg',
- ),
- 1: Field(
- name='percent_fat',
- type=BASE_TYPES[0x84], # uint16
- def_num=1,
- scale=100,
- units='%',
- ),
- 2: Field(
- name='percent_hydration',
- type=BASE_TYPES[0x84], # uint16
- def_num=2,
- scale=100,
- units='%',
- ),
- 3: Field(
- name='visceral_fat_mass',
- type=BASE_TYPES[0x84], # uint16
- def_num=3,
- scale=100,
- units='kg',
- ),
- 4: Field(
- name='bone_mass',
- type=BASE_TYPES[0x84], # uint16
- def_num=4,
- scale=100,
- units='kg',
- ),
- 5: Field(
- name='muscle_mass',
- type=BASE_TYPES[0x84], # uint16
- def_num=5,
- scale=100,
- units='kg',
- ),
- 7: Field(
- name='basal_met',
- type=BASE_TYPES[0x84], # uint16
- def_num=7,
- scale=4,
- units='kcal/day',
- ),
- 8: Field(
- name='physique_rating',
- type=BASE_TYPES[0x02], # uint8
- def_num=8,
- ),
- 9: Field( # ~4kJ per kcal, 0.25 allows max 16384 kcal
- name='active_met',
- type=BASE_TYPES[0x84], # uint16
- def_num=9,
- scale=4,
- units='kcal/day',
- ),
- 10: Field(
- name='metabolic_age',
- type=BASE_TYPES[0x02], # uint8
- def_num=10,
- units='years',
- ),
- 11: Field(
- name='visceral_fat_rating',
- type=BASE_TYPES[0x02], # uint8
- def_num=11,
- ),
- 12: Field( # Associates this weight scale message to a user. This corresponds to the index of the user profile message in the weight scale file.
- name='user_profile_index',
- type=FIELD_TYPES['message_index'],
- def_num=12,
- ),
- 253: FIELD_TYPE_TIMESTAMP,
- },
- ),
-
-
- # ************************* Workout File Messages **************************
- 26: MessageType(
- name='workout',
- mesg_num=26,
- fields={
- 4: Field(
- name='sport',
- type=FIELD_TYPES['sport'],
- def_num=4,
- ),
- 5: Field(
- name='capabilities',
- type=FIELD_TYPES['workout_capabilities'],
- def_num=5,
- ),
- 6: Field( # number of valid steps
- name='num_valid_steps',
- type=BASE_TYPES[0x84], # uint16
- def_num=6,
- ),
- 8: Field(
- name='wkt_name',
- type=BASE_TYPES[0x07], # string
- def_num=8,
- ),
- 11: Field(
- name='sub_sport',
- type=FIELD_TYPES['sub_sport'],
- def_num=11,
- ),
- 14: Field(
- name='pool_length',
- type=BASE_TYPES[0x84], # uint16
- def_num=14,
- scale=100,
- units='m',
- ),
- 15: Field(
- name='pool_length_unit',
- type=FIELD_TYPES['display_measure'],
- def_num=15,
- ),
- },
- ),
-}
+
+# ***************** BEGIN AUTOMATICALLY GENERATED FIT PROFILE ******************
+# *************************** DO NOT EDIT THIS FILE ****************************
+# *********** EXPORTED PROFILE FROM SDK VERSION 20.76 ON 2018-11-06 ************
+# ********* PARSED 161 TYPES (3044 VALUES), 85 MESSAGES (1039 FIELDS) **********
+
+from fitparse.records import (
+ ComponentField,
+ Field,
+ FieldType,
+ MessageType,
+ ReferenceField,
+ SubField,
+ BASE_TYPES,
+)
+
+
+FIELD_NUM_TIMESTAMP = 253
+
+
+FIELD_TYPES = {
+ 'activity': FieldType(
+ name='activity',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'manual',
+ 1: 'auto_multi_sport',
+ },
+ ),
+ 'activity_class': FieldType(
+ name='activity_class',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 100: 'level_max',
+ 0x7F: 'level', # 0 to 100
+ 0x80: 'athlete',
+ },
+ ),
+ 'activity_level': FieldType(
+ name='activity_level',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'low',
+ 1: 'medium',
+ 2: 'high',
+ },
+ ),
+ 'activity_subtype': FieldType(
+ name='activity_subtype',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'generic',
+ 1: 'treadmill', # Run
+ 2: 'street', # Run
+ 3: 'trail', # Run
+ 4: 'track', # Run
+ 5: 'spin', # Cycling
+ 6: 'indoor_cycling', # Cycling
+ 7: 'road', # Cycling
+ 8: 'mountain', # Cycling
+ 9: 'downhill', # Cycling
+ 10: 'recumbent', # Cycling
+ 11: 'cyclocross', # Cycling
+ 12: 'hand_cycling', # Cycling
+ 13: 'track_cycling', # Cycling
+ 14: 'indoor_rowing', # Fitness Equipment
+ 15: 'elliptical', # Fitness Equipment
+ 16: 'stair_climbing', # Fitness Equipment
+ 17: 'lap_swimming', # Swimming
+ 18: 'open_water', # Swimming
+ 254: 'all',
+ },
+ ),
+ 'activity_type': FieldType(
+ name='activity_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'generic',
+ 1: 'running',
+ 2: 'cycling',
+ 3: 'transition', # Mulitsport transition
+ 4: 'fitness_equipment',
+ 5: 'swimming',
+ 6: 'walking',
+ 8: 'sedentary',
+ 254: 'all', # All is for goals only to include all sports.
+ },
+ ),
+ 'analog_watchface_layout': FieldType(
+ name='analog_watchface_layout',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'minimal',
+ 1: 'traditional',
+ 2: 'modern',
+ },
+ ),
+ 'ant_network': FieldType(
+ name='ant_network',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'public',
+ 1: 'antplus',
+ 2: 'antfs',
+ 3: 'private',
+ },
+ ),
+ 'antplus_device_type': FieldType(
+ name='antplus_device_type',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 1: 'antfs',
+ 11: 'bike_power',
+ 12: 'environment_sensor_legacy',
+ 15: 'multi_sport_speed_distance',
+ 16: 'control',
+ 17: 'fitness_equipment',
+ 18: 'blood_pressure',
+ 19: 'geocache_node',
+ 20: 'light_electric_vehicle',
+ 25: 'env_sensor',
+ 26: 'racquet',
+ 27: 'control_hub',
+ 31: 'muscle_oxygen',
+ 35: 'bike_light_main',
+ 36: 'bike_light_shared',
+ 38: 'exd',
+ 40: 'bike_radar',
+ 119: 'weight_scale',
+ 120: 'heart_rate',
+ 121: 'bike_speed_cadence',
+ 122: 'bike_cadence',
+ 123: 'bike_speed',
+ 124: 'stride_speed_distance',
+ },
+ ),
+ 'attitude_stage': FieldType(
+ name='attitude_stage',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'failed',
+ 1: 'aligning',
+ 2: 'degraded',
+ 3: 'valid',
+ },
+ ),
+ 'attitude_validity': FieldType(
+ name='attitude_validity',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0x0001: 'track_angle_heading_valid',
+ 0x0002: 'pitch_valid',
+ 0x0004: 'roll_valid',
+ 0x0008: 'lateral_body_accel_valid',
+ 0x0010: 'normal_body_accel_valid',
+ 0x0020: 'turn_rate_valid',
+ 0x0040: 'hw_fail',
+ 0x0080: 'mag_invalid',
+ 0x0100: 'no_gps',
+ 0x0200: 'gps_invalid',
+ 0x0400: 'solution_coasting',
+ 0x0800: 'true_track_angle',
+ 0x1000: 'magnetic_heading',
+ },
+ ),
+ 'auto_activity_detect': FieldType(
+ name='auto_activity_detect',
+ base_type=BASE_TYPES[0x86], # uint32
+ values={
+ 0x00000000: 'none',
+ 0x00000001: 'running',
+ 0x00000002: 'cycling',
+ 0x00000004: 'swimming',
+ 0x00000008: 'walking',
+ 0x00000020: 'elliptical',
+ 0x00000400: 'sedentary',
+ },
+ ),
+ 'auto_sync_frequency': FieldType(
+ name='auto_sync_frequency',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'never',
+ 1: 'occasionally',
+ 2: 'frequent',
+ 3: 'once_a_day',
+ 4: 'remote',
+ },
+ ),
+ 'autolap_trigger': FieldType(
+ name='autolap_trigger',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'time',
+ 1: 'distance',
+ 2: 'position_start',
+ 3: 'position_lap',
+ 4: 'position_waypoint',
+ 5: 'position_marked',
+ 6: 'off',
+ },
+ ),
+ 'autoscroll': FieldType(
+ name='autoscroll',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'none',
+ 1: 'slow',
+ 2: 'medium',
+ 3: 'fast',
+ },
+ ),
+ 'backlight_mode': FieldType(
+ name='backlight_mode',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'off',
+ 1: 'manual',
+ 2: 'key_and_messages',
+ 3: 'auto_brightness',
+ 4: 'smart_notifications',
+ 5: 'key_and_messages_night',
+ 6: 'key_and_messages_and_smart_notifications',
+ },
+ ),
+ 'backlight_timeout': FieldType( # Timeout in seconds.
+ name='backlight_timeout',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 0: 'infinite', # Backlight stays on forever.
+ },
+ ),
+ 'battery_status': FieldType(
+ name='battery_status',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 1: 'new',
+ 2: 'good',
+ 3: 'ok',
+ 4: 'low',
+ 5: 'critical',
+ 6: 'charging',
+ 7: 'unknown',
+ },
+ ),
+ 'bench_press_exercise_name': FieldType(
+ name='bench_press_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'alternating_dumbbell_chest_press_on_swiss_ball',
+ 1: 'barbell_bench_press',
+ 2: 'barbell_board_bench_press',
+ 3: 'barbell_floor_press',
+ 4: 'close_grip_barbell_bench_press',
+ 5: 'decline_dumbbell_bench_press',
+ 6: 'dumbbell_bench_press',
+ 7: 'dumbbell_floor_press',
+ 8: 'incline_barbell_bench_press',
+ 9: 'incline_dumbbell_bench_press',
+ 10: 'incline_smith_machine_bench_press',
+ 11: 'isometric_barbell_bench_press',
+ 12: 'kettlebell_chest_press',
+ 13: 'neutral_grip_dumbbell_bench_press',
+ 14: 'neutral_grip_dumbbell_incline_bench_press',
+ 15: 'one_arm_floor_press',
+ 16: 'weighted_one_arm_floor_press',
+ 17: 'partial_lockout',
+ 18: 'reverse_grip_barbell_bench_press',
+ 19: 'reverse_grip_incline_bench_press',
+ 20: 'single_arm_cable_chest_press',
+ 21: 'single_arm_dumbbell_bench_press',
+ 22: 'smith_machine_bench_press',
+ 23: 'swiss_ball_dumbbell_chest_press',
+ 24: 'triple_stop_barbell_bench_press',
+ 25: 'wide_grip_barbell_bench_press',
+ 26: 'alternating_dumbbell_chest_press',
+ },
+ ),
+ 'bike_light_beam_angle_mode': FieldType(
+ name='bike_light_beam_angle_mode',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 0: 'manual',
+ 1: 'auto',
+ },
+ ),
+ 'bike_light_network_config_type': FieldType(
+ name='bike_light_network_config_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'auto',
+ 4: 'individual',
+ 5: 'high_visibility',
+ 6: 'trail',
+ },
+ ),
+ 'body_location': FieldType(
+ name='body_location',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'left_leg',
+ 1: 'left_calf',
+ 2: 'left_shin',
+ 3: 'left_hamstring',
+ 4: 'left_quad',
+ 5: 'left_glute',
+ 6: 'right_leg',
+ 7: 'right_calf',
+ 8: 'right_shin',
+ 9: 'right_hamstring',
+ 10: 'right_quad',
+ 11: 'right_glute',
+ 12: 'torso_back',
+ 13: 'left_lower_back',
+ 14: 'left_upper_back',
+ 15: 'right_lower_back',
+ 16: 'right_upper_back',
+ 17: 'torso_front',
+ 18: 'left_abdomen',
+ 19: 'left_chest',
+ 20: 'right_abdomen',
+ 21: 'right_chest',
+ 22: 'left_arm',
+ 23: 'left_shoulder',
+ 24: 'left_bicep',
+ 25: 'left_tricep',
+ 26: 'left_brachioradialis', # Left anterior forearm
+ 27: 'left_forearm_extensors', # Left posterior forearm
+ 28: 'right_arm',
+ 29: 'right_shoulder',
+ 30: 'right_bicep',
+ 31: 'right_tricep',
+ 32: 'right_brachioradialis', # Right anterior forearm
+ 33: 'right_forearm_extensors', # Right posterior forearm
+ 34: 'neck',
+ 35: 'throat',
+ 36: 'waist_mid_back',
+ 37: 'waist_front',
+ 38: 'waist_left',
+ 39: 'waist_right',
+ },
+ ),
+ 'bool': FieldType(
+ name='bool',
+ base_type=BASE_TYPES[0x00], # enum
+ ),
+ 'bp_status': FieldType(
+ name='bp_status',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'no_error',
+ 1: 'error_incomplete_data',
+ 2: 'error_no_measurement',
+ 3: 'error_data_out_of_range',
+ 4: 'error_irregular_heart_rate',
+ },
+ ),
+ 'calf_raise_exercise_name': FieldType(
+ name='calf_raise_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: '3_way_calf_raise',
+ 1: '3_way_weighted_calf_raise',
+ 2: '3_way_single_leg_calf_raise',
+ 3: '3_way_weighted_single_leg_calf_raise',
+ 4: 'donkey_calf_raise',
+ 5: 'weighted_donkey_calf_raise',
+ 6: 'seated_calf_raise',
+ 7: 'weighted_seated_calf_raise',
+ 8: 'seated_dumbbell_toe_raise',
+ 9: 'single_leg_bent_knee_calf_raise',
+ 10: 'weighted_single_leg_bent_knee_calf_raise',
+ 11: 'single_leg_decline_push_up',
+ 12: 'single_leg_donkey_calf_raise',
+ 13: 'weighted_single_leg_donkey_calf_raise',
+ 14: 'single_leg_hip_raise_with_knee_hold',
+ 15: 'single_leg_standing_calf_raise',
+ 16: 'single_leg_standing_dumbbell_calf_raise',
+ 17: 'standing_barbell_calf_raise',
+ 18: 'standing_calf_raise',
+ 19: 'weighted_standing_calf_raise',
+ 20: 'standing_dumbbell_calf_raise',
+ },
+ ),
+ 'camera_event_type': FieldType(
+ name='camera_event_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'video_start', # Start of video recording
+ 1: 'video_split', # Mark of video file split (end of one file, beginning of the other)
+ 2: 'video_end', # End of video recording
+ 3: 'photo_taken', # Still photo taken
+ 4: 'video_second_stream_start',
+ 5: 'video_second_stream_split',
+ 6: 'video_second_stream_end',
+ 7: 'video_split_start', # Mark of video file split start
+ 8: 'video_second_stream_split_start',
+ 11: 'video_pause', # Mark when a video recording has been paused
+ 12: 'video_second_stream_pause',
+ 13: 'video_resume', # Mark when a video recording has been resumed
+ 14: 'video_second_stream_resume',
+ },
+ ),
+ 'camera_orientation_type': FieldType(
+ name='camera_orientation_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'camera_orientation_0',
+ 1: 'camera_orientation_90',
+ 2: 'camera_orientation_180',
+ 3: 'camera_orientation_270',
+ },
+ ),
+ 'cardio_exercise_name': FieldType(
+ name='cardio_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'bob_and_weave_circle',
+ 1: 'weighted_bob_and_weave_circle',
+ 2: 'cardio_core_crawl',
+ 3: 'weighted_cardio_core_crawl',
+ 4: 'double_under',
+ 5: 'weighted_double_under',
+ 6: 'jump_rope',
+ 7: 'weighted_jump_rope',
+ 8: 'jump_rope_crossover',
+ 9: 'weighted_jump_rope_crossover',
+ 10: 'jump_rope_jog',
+ 11: 'weighted_jump_rope_jog',
+ 12: 'jumping_jacks',
+ 13: 'weighted_jumping_jacks',
+ 14: 'ski_moguls',
+ 15: 'weighted_ski_moguls',
+ 16: 'split_jacks',
+ 17: 'weighted_split_jacks',
+ 18: 'squat_jacks',
+ 19: 'weighted_squat_jacks',
+ 20: 'triple_under',
+ 21: 'weighted_triple_under',
+ },
+ ),
+ 'carry_exercise_name': FieldType(
+ name='carry_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'bar_holds',
+ 1: 'farmers_walk',
+ 2: 'farmers_walk_on_toes',
+ 3: 'hex_dumbbell_hold',
+ 4: 'overhead_carry',
+ },
+ ),
+ 'checksum': FieldType(
+ name='checksum',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 0: 'clear', # Allows clear of checksum for flash memory where can only write 1 to 0 without erasing sector.
+ 1: 'ok', # Set to mark checksum as valid if computes to invalid values 0 or 0xFF. Checksum can also be set to ok to save encoding computation time.
+ },
+ ),
+ 'chop_exercise_name': FieldType(
+ name='chop_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'cable_pull_through',
+ 1: 'cable_rotational_lift',
+ 2: 'cable_woodchop',
+ 3: 'cross_chop_to_knee',
+ 4: 'weighted_cross_chop_to_knee',
+ 5: 'dumbbell_chop',
+ 6: 'half_kneeling_rotation',
+ 7: 'weighted_half_kneeling_rotation',
+ 8: 'half_kneeling_rotational_chop',
+ 9: 'half_kneeling_rotational_reverse_chop',
+ 10: 'half_kneeling_stability_chop',
+ 11: 'half_kneeling_stability_reverse_chop',
+ 12: 'kneeling_rotational_chop',
+ 13: 'kneeling_rotational_reverse_chop',
+ 14: 'kneeling_stability_chop',
+ 15: 'kneeling_woodchopper',
+ 16: 'medicine_ball_wood_chops',
+ 17: 'power_squat_chops',
+ 18: 'weighted_power_squat_chops',
+ 19: 'standing_rotational_chop',
+ 20: 'standing_split_rotational_chop',
+ 21: 'standing_split_rotational_reverse_chop',
+ 22: 'standing_stability_reverse_chop',
+ },
+ ),
+ 'comm_timeout_type': FieldType(
+ name='comm_timeout_type',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'wildcard_pairing_timeout', # Timeout pairing to any device
+ 1: 'pairing_timeout', # Timeout pairing to previously paired device
+ 2: 'connection_lost', # Temporary loss of communications
+ 3: 'connection_timeout', # Connection closed due to extended bad communications
+ },
+ ),
+ 'connectivity_capabilities': FieldType(
+ name='connectivity_capabilities',
+ base_type=BASE_TYPES[0x8C], # uint32z
+ values={
+ 0x00000001: 'bluetooth',
+ 0x00000002: 'bluetooth_le',
+ 0x00000004: 'ant',
+ 0x00000008: 'activity_upload',
+ 0x00000010: 'course_download',
+ 0x00000020: 'workout_download',
+ 0x00000040: 'live_track',
+ 0x00000080: 'weather_conditions',
+ 0x00000100: 'weather_alerts',
+ 0x00000200: 'gps_ephemeris_download',
+ 0x00000400: 'explicit_archive',
+ 0x00000800: 'setup_incomplete',
+ 0x00001000: 'continue_sync_after_software_update',
+ 0x00002000: 'connect_iq_app_download',
+ 0x00004000: 'golf_course_download',
+ 0x00008000: 'device_initiates_sync', # Indicates device is in control of initiating all syncs
+ 0x00010000: 'connect_iq_watch_app_download',
+ 0x00020000: 'connect_iq_widget_download',
+ 0x00040000: 'connect_iq_watch_face_download',
+ 0x00080000: 'connect_iq_data_field_download',
+ 0x00100000: 'connect_iq_app_managment', # Device supports delete and reorder of apps via GCM
+ 0x00200000: 'swing_sensor',
+ 0x00400000: 'swing_sensor_remote',
+ 0x00800000: 'incident_detection', # Device supports incident detection
+ 0x01000000: 'audio_prompts',
+ 0x02000000: 'wifi_verification', # Device supports reporting wifi verification via GCM
+ 0x04000000: 'true_up', # Device supports True Up
+ 0x08000000: 'find_my_watch', # Device supports Find My Watch
+ 0x10000000: 'remote_manual_sync',
+ 0x20000000: 'live_track_auto_start', # Device supports LiveTrack auto start
+ 0x40000000: 'live_track_messaging', # Device supports LiveTrack Messaging
+ 0x80000000: 'instant_input', # Device supports instant input feature
+ },
+ ),
+ 'core_exercise_name': FieldType(
+ name='core_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'abs_jabs',
+ 1: 'weighted_abs_jabs',
+ 2: 'alternating_plate_reach',
+ 3: 'barbell_rollout',
+ 4: 'weighted_barbell_rollout',
+ 5: 'body_bar_oblique_twist',
+ 6: 'cable_core_press',
+ 7: 'cable_side_bend',
+ 8: 'side_bend',
+ 9: 'weighted_side_bend',
+ 10: 'crescent_circle',
+ 11: 'weighted_crescent_circle',
+ 12: 'cycling_russian_twist',
+ 13: 'weighted_cycling_russian_twist',
+ 14: 'elevated_feet_russian_twist',
+ 15: 'weighted_elevated_feet_russian_twist',
+ 16: 'half_turkish_get_up',
+ 17: 'kettlebell_windmill',
+ 18: 'kneeling_ab_wheel',
+ 19: 'weighted_kneeling_ab_wheel',
+ 20: 'modified_front_lever',
+ 21: 'open_knee_tucks',
+ 22: 'weighted_open_knee_tucks',
+ 23: 'side_abs_leg_lift',
+ 24: 'weighted_side_abs_leg_lift',
+ 25: 'swiss_ball_jackknife',
+ 26: 'weighted_swiss_ball_jackknife',
+ 27: 'swiss_ball_pike',
+ 28: 'weighted_swiss_ball_pike',
+ 29: 'swiss_ball_rollout',
+ 30: 'weighted_swiss_ball_rollout',
+ 31: 'triangle_hip_press',
+ 32: 'weighted_triangle_hip_press',
+ 33: 'trx_suspended_jackknife',
+ 34: 'weighted_trx_suspended_jackknife',
+ 35: 'u_boat',
+ 36: 'weighted_u_boat',
+ 37: 'windmill_switches',
+ 38: 'weighted_windmill_switches',
+ 39: 'alternating_slide_out',
+ 40: 'weighted_alternating_slide_out',
+ 41: 'ghd_back_extensions',
+ 42: 'weighted_ghd_back_extensions',
+ 43: 'overhead_walk',
+ 44: 'inchworm',
+ 45: 'weighted_modified_front_lever',
+ 46: 'russian_twist',
+ 47: 'abdominal_leg_rotations',
+ 48: 'arm_and_leg_extension_on_knees',
+ 49: 'bicycle',
+ 50: 'bicep_curl_with_leg_extension',
+ 51: 'cat_cow',
+ 52: 'corkscrew',
+ 53: 'criss_cross',
+ 54: 'criss_cross_with_ball',
+ 55: 'double_leg_stretch',
+ 56: 'knee_folds',
+ 57: 'lower_lift',
+ 58: 'neck_pull',
+ 59: 'pelvic_clocks',
+ 60: 'roll_over',
+ 61: 'roll_up',
+ 62: 'rolling',
+ 63: 'rowing_1',
+ 64: 'rowing_2',
+ 65: 'scissors',
+ 66: 'single_leg_circles',
+ 67: 'single_leg_stretch',
+ 68: 'snake_twist_1_and_2',
+ 69: 'swan',
+ 70: 'swimming',
+ 71: 'teaser',
+ 72: 'the_hundred',
+ },
+ ),
+ 'course_capabilities': FieldType(
+ name='course_capabilities',
+ base_type=BASE_TYPES[0x8C], # uint32z
+ values={
+ 0x00000001: 'processed',
+ 0x00000002: 'valid',
+ 0x00000004: 'time',
+ 0x00000008: 'distance',
+ 0x00000010: 'position',
+ 0x00000020: 'heart_rate',
+ 0x00000040: 'power',
+ 0x00000080: 'cadence',
+ 0x00000100: 'training',
+ 0x00000200: 'navigation',
+ 0x00000400: 'bikeway',
+ },
+ ),
+ 'course_point': FieldType(
+ name='course_point',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'generic',
+ 1: 'summit',
+ 2: 'valley',
+ 3: 'water',
+ 4: 'food',
+ 5: 'danger',
+ 6: 'left',
+ 7: 'right',
+ 8: 'straight',
+ 9: 'first_aid',
+ 10: 'fourth_category',
+ 11: 'third_category',
+ 12: 'second_category',
+ 13: 'first_category',
+ 14: 'hors_category',
+ 15: 'sprint',
+ 16: 'left_fork',
+ 17: 'right_fork',
+ 18: 'middle_fork',
+ 19: 'slight_left',
+ 20: 'sharp_left',
+ 21: 'slight_right',
+ 22: 'sharp_right',
+ 23: 'u_turn',
+ 24: 'segment_start',
+ 25: 'segment_end',
+ },
+ ),
+ 'crunch_exercise_name': FieldType(
+ name='crunch_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'bicycle_crunch',
+ 1: 'cable_crunch',
+ 2: 'circular_arm_crunch',
+ 3: 'crossed_arms_crunch',
+ 4: 'weighted_crossed_arms_crunch',
+ 5: 'cross_leg_reverse_crunch',
+ 6: 'weighted_cross_leg_reverse_crunch',
+ 7: 'crunch_chop',
+ 8: 'weighted_crunch_chop',
+ 9: 'double_crunch',
+ 10: 'weighted_double_crunch',
+ 11: 'elbow_to_knee_crunch',
+ 12: 'weighted_elbow_to_knee_crunch',
+ 13: 'flutter_kicks',
+ 14: 'weighted_flutter_kicks',
+ 15: 'foam_roller_reverse_crunch_on_bench',
+ 16: 'weighted_foam_roller_reverse_crunch_on_bench',
+ 17: 'foam_roller_reverse_crunch_with_dumbbell',
+ 18: 'foam_roller_reverse_crunch_with_medicine_ball',
+ 19: 'frog_press',
+ 20: 'hanging_knee_raise_oblique_crunch',
+ 21: 'weighted_hanging_knee_raise_oblique_crunch',
+ 22: 'hip_crossover',
+ 23: 'weighted_hip_crossover',
+ 24: 'hollow_rock',
+ 25: 'weighted_hollow_rock',
+ 26: 'incline_reverse_crunch',
+ 27: 'weighted_incline_reverse_crunch',
+ 28: 'kneeling_cable_crunch',
+ 29: 'kneeling_cross_crunch',
+ 30: 'weighted_kneeling_cross_crunch',
+ 31: 'kneeling_oblique_cable_crunch',
+ 32: 'knees_to_elbow',
+ 33: 'leg_extensions',
+ 34: 'weighted_leg_extensions',
+ 35: 'leg_levers',
+ 36: 'mcgill_curl_up',
+ 37: 'weighted_mcgill_curl_up',
+ 38: 'modified_pilates_roll_up_with_ball',
+ 39: 'weighted_modified_pilates_roll_up_with_ball',
+ 40: 'pilates_crunch',
+ 41: 'weighted_pilates_crunch',
+ 42: 'pilates_roll_up_with_ball',
+ 43: 'weighted_pilates_roll_up_with_ball',
+ 44: 'raised_legs_crunch',
+ 45: 'weighted_raised_legs_crunch',
+ 46: 'reverse_crunch',
+ 47: 'weighted_reverse_crunch',
+ 48: 'reverse_crunch_on_a_bench',
+ 49: 'weighted_reverse_crunch_on_a_bench',
+ 50: 'reverse_curl_and_lift',
+ 51: 'weighted_reverse_curl_and_lift',
+ 52: 'rotational_lift',
+ 53: 'weighted_rotational_lift',
+ 54: 'seated_alternating_reverse_crunch',
+ 55: 'weighted_seated_alternating_reverse_crunch',
+ 56: 'seated_leg_u',
+ 57: 'weighted_seated_leg_u',
+ 58: 'side_to_side_crunch_and_weave',
+ 59: 'weighted_side_to_side_crunch_and_weave',
+ 60: 'single_leg_reverse_crunch',
+ 61: 'weighted_single_leg_reverse_crunch',
+ 62: 'skater_crunch_cross',
+ 63: 'weighted_skater_crunch_cross',
+ 64: 'standing_cable_crunch',
+ 65: 'standing_side_crunch',
+ 66: 'step_climb',
+ 67: 'weighted_step_climb',
+ 68: 'swiss_ball_crunch',
+ 69: 'swiss_ball_reverse_crunch',
+ 70: 'weighted_swiss_ball_reverse_crunch',
+ 71: 'swiss_ball_russian_twist',
+ 72: 'weighted_swiss_ball_russian_twist',
+ 73: 'swiss_ball_side_crunch',
+ 74: 'weighted_swiss_ball_side_crunch',
+ 75: 'thoracic_crunches_on_foam_roller',
+ 76: 'weighted_thoracic_crunches_on_foam_roller',
+ 77: 'triceps_crunch',
+ 78: 'weighted_bicycle_crunch',
+ 79: 'weighted_crunch',
+ 80: 'weighted_swiss_ball_crunch',
+ 81: 'toes_to_bar',
+ 82: 'weighted_toes_to_bar',
+ 83: 'crunch',
+ 84: 'straight_leg_crunch_with_ball',
+ },
+ ),
+ 'curl_exercise_name': FieldType(
+ name='curl_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'alternating_dumbbell_biceps_curl',
+ 1: 'alternating_dumbbell_biceps_curl_on_swiss_ball',
+ 2: 'alternating_incline_dumbbell_biceps_curl',
+ 3: 'barbell_biceps_curl',
+ 4: 'barbell_reverse_wrist_curl',
+ 5: 'barbell_wrist_curl',
+ 6: 'behind_the_back_barbell_reverse_wrist_curl',
+ 7: 'behind_the_back_one_arm_cable_curl',
+ 8: 'cable_biceps_curl',
+ 9: 'cable_hammer_curl',
+ 10: 'cheating_barbell_biceps_curl',
+ 11: 'close_grip_ez_bar_biceps_curl',
+ 12: 'cross_body_dumbbell_hammer_curl',
+ 13: 'dead_hang_biceps_curl',
+ 14: 'decline_hammer_curl',
+ 15: 'dumbbell_biceps_curl_with_static_hold',
+ 16: 'dumbbell_hammer_curl',
+ 17: 'dumbbell_reverse_wrist_curl',
+ 18: 'dumbbell_wrist_curl',
+ 19: 'ez_bar_preacher_curl',
+ 20: 'forward_bend_biceps_curl',
+ 21: 'hammer_curl_to_press',
+ 22: 'incline_dumbbell_biceps_curl',
+ 23: 'incline_offset_thumb_dumbbell_curl',
+ 24: 'kettlebell_biceps_curl',
+ 25: 'lying_concentration_cable_curl',
+ 26: 'one_arm_preacher_curl',
+ 27: 'plate_pinch_curl',
+ 28: 'preacher_curl_with_cable',
+ 29: 'reverse_ez_bar_curl',
+ 30: 'reverse_grip_wrist_curl',
+ 31: 'reverse_grip_barbell_biceps_curl',
+ 32: 'seated_alternating_dumbbell_biceps_curl',
+ 33: 'seated_dumbbell_biceps_curl',
+ 34: 'seated_reverse_dumbbell_curl',
+ 35: 'split_stance_offset_pinky_dumbbell_curl',
+ 36: 'standing_alternating_dumbbell_curls',
+ 37: 'standing_dumbbell_biceps_curl',
+ 38: 'standing_ez_bar_biceps_curl',
+ 39: 'static_curl',
+ 40: 'swiss_ball_dumbbell_overhead_triceps_extension',
+ 41: 'swiss_ball_ez_bar_preacher_curl',
+ 42: 'twisting_standing_dumbbell_biceps_curl',
+ 43: 'wide_grip_ez_bar_biceps_curl',
+ },
+ ),
+ 'date_mode': FieldType(
+ name='date_mode',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'day_month',
+ 1: 'month_day',
+ },
+ ),
+ 'date_time': FieldType( # seconds since UTC 00:00 Dec 31 1989
+ name='date_time',
+ base_type=BASE_TYPES[0x86], # uint32
+ ),
+ 'day_of_week': FieldType(
+ name='day_of_week',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'sunday',
+ 1: 'monday',
+ 2: 'tuesday',
+ 3: 'wednesday',
+ 4: 'thursday',
+ 5: 'friday',
+ 6: 'saturday',
+ },
+ ),
+ 'deadlift_exercise_name': FieldType(
+ name='deadlift_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'barbell_deadlift',
+ 1: 'barbell_straight_leg_deadlift',
+ 2: 'dumbbell_deadlift',
+ 3: 'dumbbell_single_leg_deadlift_to_row',
+ 4: 'dumbbell_straight_leg_deadlift',
+ 5: 'kettlebell_floor_to_shelf',
+ 6: 'one_arm_one_leg_deadlift',
+ 7: 'rack_pull',
+ 8: 'rotational_dumbbell_straight_leg_deadlift',
+ 9: 'single_arm_deadlift',
+ 10: 'single_leg_barbell_deadlift',
+ 11: 'single_leg_barbell_straight_leg_deadlift',
+ 12: 'single_leg_deadlift_with_barbell',
+ 13: 'single_leg_rdl_circuit',
+ 14: 'single_leg_romanian_deadlift_with_dumbbell',
+ 15: 'sumo_deadlift',
+ 16: 'sumo_deadlift_high_pull',
+ 17: 'trap_bar_deadlift',
+ 18: 'wide_grip_barbell_deadlift',
+ },
+ ),
+ 'device_index': FieldType(
+ name='device_index',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 0: 'creator', # Creator of the file is always device index 0.
+ },
+ ),
+ 'digital_watchface_layout': FieldType(
+ name='digital_watchface_layout',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'traditional',
+ 1: 'modern',
+ 2: 'bold',
+ },
+ ),
+ 'display_heart': FieldType(
+ name='display_heart',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'bpm',
+ 1: 'max',
+ 2: 'reserve',
+ },
+ ),
+ 'display_measure': FieldType(
+ name='display_measure',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'metric',
+ 1: 'statute',
+ 2: 'nautical',
+ },
+ ),
+ 'display_orientation': FieldType(
+ name='display_orientation',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'auto', # automatic if the device supports it
+ 1: 'portrait',
+ 2: 'landscape',
+ 3: 'portrait_flipped', # portrait mode but rotated 180 degrees
+ 4: 'landscape_flipped', # landscape mode but rotated 180 degrees
+ },
+ ),
+ 'display_position': FieldType(
+ name='display_position',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'degree', # dd.dddddd
+ 1: 'degree_minute', # dddmm.mmm
+ 2: 'degree_minute_second', # dddmmss
+ 3: 'austrian_grid', # Austrian Grid (BMN)
+ 4: 'british_grid', # British National Grid
+ 5: 'dutch_grid', # Dutch grid system
+ 6: 'hungarian_grid', # Hungarian grid system
+ 7: 'finnish_grid', # Finnish grid system Zone3 KKJ27
+ 8: 'german_grid', # Gausss Krueger (German)
+ 9: 'icelandic_grid', # Icelandic Grid
+ 10: 'indonesian_equatorial', # Indonesian Equatorial LCO
+ 11: 'indonesian_irian', # Indonesian Irian LCO
+ 12: 'indonesian_southern', # Indonesian Southern LCO
+ 13: 'india_zone_0', # India zone 0
+ 14: 'india_zone_IA', # India zone IA
+ 15: 'india_zone_IB', # India zone IB
+ 16: 'india_zone_IIA', # India zone IIA
+ 17: 'india_zone_IIB', # India zone IIB
+ 18: 'india_zone_IIIA', # India zone IIIA
+ 19: 'india_zone_IIIB', # India zone IIIB
+ 20: 'india_zone_IVA', # India zone IVA
+ 21: 'india_zone_IVB', # India zone IVB
+ 22: 'irish_transverse', # Irish Transverse Mercator
+ 23: 'irish_grid', # Irish Grid
+ 24: 'loran', # Loran TD
+ 25: 'maidenhead_grid', # Maidenhead grid system
+ 26: 'mgrs_grid', # MGRS grid system
+ 27: 'new_zealand_grid', # New Zealand grid system
+ 28: 'new_zealand_transverse', # New Zealand Transverse Mercator
+ 29: 'qatar_grid', # Qatar National Grid
+ 30: 'modified_swedish_grid', # Modified RT-90 (Sweden)
+ 31: 'swedish_grid', # RT-90 (Sweden)
+ 32: 'south_african_grid', # South African Grid
+ 33: 'swiss_grid', # Swiss CH-1903 grid
+ 34: 'taiwan_grid', # Taiwan Grid
+ 35: 'united_states_grid', # United States National Grid
+ 36: 'utm_ups_grid', # UTM/UPS grid system
+ 37: 'west_malayan', # West Malayan RSO
+ 38: 'borneo_rso', # Borneo RSO
+ 39: 'estonian_grid', # Estonian grid system
+ 40: 'latvian_grid', # Latvian Transverse Mercator
+ 41: 'swedish_ref_99_grid', # Reference Grid 99 TM (Swedish)
+ },
+ ),
+ 'display_power': FieldType(
+ name='display_power',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'watts',
+ 1: 'percent_ftp',
+ },
+ ),
+ 'dive_alarm_type': FieldType(
+ name='dive_alarm_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'depth',
+ 1: 'time',
+ },
+ ),
+ 'dive_backlight_mode': FieldType(
+ name='dive_backlight_mode',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'at_depth',
+ 1: 'always_on',
+ },
+ ),
+ 'dive_gas_status': FieldType(
+ name='dive_gas_status',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'disabled',
+ 1: 'enabled',
+ 2: 'backup_only',
+ },
+ ),
+ 'event': FieldType(
+ name='event',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'timer', # Group 0. Start / stop_all
+ 3: 'workout', # start / stop
+ 4: 'workout_step', # Start at beginning of workout. Stop at end of each step.
+ 5: 'power_down', # stop_all group 0
+ 6: 'power_up', # stop_all group 0
+ 7: 'off_course', # start / stop group 0
+ 8: 'session', # Stop at end of each session.
+ 9: 'lap', # Stop at end of each lap.
+ 10: 'course_point', # marker
+ 11: 'battery', # marker
+ 12: 'virtual_partner_pace', # Group 1. Start at beginning of activity if VP enabled, when VP pace is changed during activity or VP enabled mid activity. stop_disable when VP disabled.
+ 13: 'hr_high_alert', # Group 0. Start / stop when in alert condition.
+ 14: 'hr_low_alert', # Group 0. Start / stop when in alert condition.
+ 15: 'speed_high_alert', # Group 0. Start / stop when in alert condition.
+ 16: 'speed_low_alert', # Group 0. Start / stop when in alert condition.
+ 17: 'cad_high_alert', # Group 0. Start / stop when in alert condition.
+ 18: 'cad_low_alert', # Group 0. Start / stop when in alert condition.
+ 19: 'power_high_alert', # Group 0. Start / stop when in alert condition.
+ 20: 'power_low_alert', # Group 0. Start / stop when in alert condition.
+ 21: 'recovery_hr', # marker
+ 22: 'battery_low', # marker
+ 23: 'time_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled.
+ 24: 'distance_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled.
+ 25: 'calorie_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled.
+ 26: 'activity', # Group 1.. Stop at end of activity.
+ 27: 'fitness_equipment', # marker
+ 28: 'length', # Stop at end of each length.
+ 32: 'user_marker', # marker
+ 33: 'sport_point', # marker
+ 36: 'calibration', # start/stop/marker
+ 42: 'front_gear_change', # marker
+ 43: 'rear_gear_change', # marker
+ 44: 'rider_position_change', # marker
+ 45: 'elev_high_alert', # Group 0. Start / stop when in alert condition.
+ 46: 'elev_low_alert', # Group 0. Start / stop when in alert condition.
+ 47: 'comm_timeout', # marker
+ },
+ ),
+ 'event_type': FieldType(
+ name='event_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'start',
+ 1: 'stop',
+ 2: 'consecutive_depreciated',
+ 3: 'marker',
+ 4: 'stop_all',
+ 5: 'begin_depreciated',
+ 6: 'end_depreciated',
+ 7: 'end_all_depreciated',
+ 8: 'stop_disable',
+ 9: 'stop_disable_all',
+ },
+ ),
+ 'exd_data_units': FieldType(
+ name='exd_data_units',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'no_units',
+ 1: 'laps',
+ 2: 'miles_per_hour',
+ 3: 'kilometers_per_hour',
+ 4: 'feet_per_hour',
+ 5: 'meters_per_hour',
+ 6: 'degrees_celsius',
+ 7: 'degrees_farenheit',
+ 8: 'zone',
+ 9: 'gear',
+ 10: 'rpm',
+ 11: 'bpm',
+ 12: 'degrees',
+ 13: 'millimeters',
+ 14: 'meters',
+ 15: 'kilometers',
+ 16: 'feet',
+ 17: 'yards',
+ 18: 'kilofeet',
+ 19: 'miles',
+ 20: 'time',
+ 21: 'enum_turn_type',
+ 22: 'percent',
+ 23: 'watts',
+ 24: 'watts_per_kilogram',
+ 25: 'enum_battery_status',
+ 26: 'enum_bike_light_beam_angle_mode',
+ 27: 'enum_bike_light_battery_status',
+ 28: 'enum_bike_light_network_config_type',
+ 29: 'lights',
+ 30: 'seconds',
+ 31: 'minutes',
+ 32: 'hours',
+ 33: 'calories',
+ 34: 'kilojoules',
+ 35: 'milliseconds',
+ 36: 'second_per_mile',
+ 37: 'second_per_kilometer',
+ 38: 'centimeter',
+ 39: 'enum_course_point',
+ 40: 'bradians',
+ 41: 'enum_sport',
+ 42: 'inches_hg',
+ 43: 'mm_hg',
+ 44: 'mbars',
+ 45: 'hecto_pascals',
+ 46: 'feet_per_min',
+ 47: 'meters_per_min',
+ 48: 'meters_per_sec',
+ 49: 'eight_cardinal',
+ },
+ ),
+ 'exd_descriptors': FieldType(
+ name='exd_descriptors',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'bike_light_battery_status',
+ 1: 'beam_angle_status',
+ 2: 'batery_level',
+ 3: 'light_network_mode',
+ 4: 'number_lights_connected',
+ 5: 'cadence',
+ 6: 'distance',
+ 7: 'estimated_time_of_arrival',
+ 8: 'heading',
+ 9: 'time',
+ 10: 'battery_level',
+ 11: 'trainer_resistance',
+ 12: 'trainer_target_power',
+ 13: 'time_seated',
+ 14: 'time_standing',
+ 15: 'elevation',
+ 16: 'grade',
+ 17: 'ascent',
+ 18: 'descent',
+ 19: 'vertical_speed',
+ 20: 'di2_battery_level',
+ 21: 'front_gear',
+ 22: 'rear_gear',
+ 23: 'gear_ratio',
+ 24: 'heart_rate',
+ 25: 'heart_rate_zone',
+ 26: 'time_in_heart_rate_zone',
+ 27: 'heart_rate_reserve',
+ 28: 'calories',
+ 29: 'gps_accuracy',
+ 30: 'gps_signal_strength',
+ 31: 'temperature',
+ 32: 'time_of_day',
+ 33: 'balance',
+ 34: 'pedal_smoothness',
+ 35: 'power',
+ 36: 'functional_threshold_power',
+ 37: 'intensity_factor',
+ 38: 'work',
+ 39: 'power_ratio',
+ 40: 'normalized_power',
+ 41: 'training_stress_Score',
+ 42: 'time_on_zone',
+ 43: 'speed',
+ 44: 'laps',
+ 45: 'reps',
+ 46: 'workout_step',
+ 47: 'course_distance',
+ 48: 'navigation_distance',
+ 49: 'course_estimated_time_of_arrival',
+ 50: 'navigation_estimated_time_of_arrival',
+ 51: 'course_time',
+ 52: 'navigation_time',
+ 53: 'course_heading',
+ 54: 'navigation_heading',
+ 55: 'power_zone',
+ 56: 'torque_effectiveness',
+ 57: 'timer_time',
+ 58: 'power_weight_ratio',
+ 59: 'left_platform_center_offset',
+ 60: 'right_platform_center_offset',
+ 61: 'left_power_phase_start_angle',
+ 62: 'right_power_phase_start_angle',
+ 63: 'left_power_phase_finish_angle',
+ 64: 'right_power_phase_finish_angle',
+ 65: 'gears', # Combined gear information
+ 66: 'pace',
+ 67: 'training_effect',
+ 68: 'vertical_oscillation',
+ 69: 'vertical_ratio',
+ 70: 'ground_contact_time',
+ 71: 'left_ground_contact_time_balance',
+ 72: 'right_ground_contact_time_balance',
+ 73: 'stride_length',
+ 74: 'running_cadence',
+ 75: 'performance_condition',
+ 76: 'course_type',
+ 77: 'time_in_power_zone',
+ 78: 'navigation_turn',
+ 79: 'course_location',
+ 80: 'navigation_location',
+ 81: 'compass',
+ 82: 'gear_combo',
+ 83: 'muscle_oxygen',
+ 84: 'icon',
+ 85: 'compass_heading',
+ 86: 'gps_heading',
+ 87: 'gps_elevation',
+ 88: 'anaerobic_training_effect',
+ 89: 'course',
+ 90: 'off_course',
+ 91: 'glide_ratio',
+ 92: 'vertical_distance',
+ 93: 'vmg',
+ 94: 'ambient_pressure',
+ 95: 'pressure',
+ 96: 'vam',
+ },
+ ),
+ 'exd_display_type': FieldType(
+ name='exd_display_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'numerical',
+ 1: 'simple',
+ 2: 'graph',
+ 3: 'bar',
+ 4: 'circle_graph',
+ 5: 'virtual_partner',
+ 6: 'balance',
+ 7: 'string_list',
+ 8: 'string',
+ 9: 'simple_dynamic_icon',
+ 10: 'gauge',
+ },
+ ),
+ 'exd_layout': FieldType(
+ name='exd_layout',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'full_screen',
+ 1: 'half_vertical',
+ 2: 'half_horizontal',
+ 3: 'half_vertical_right_split',
+ 4: 'half_horizontal_bottom_split',
+ 5: 'full_quarter_split',
+ 6: 'half_vertical_left_split',
+ 7: 'half_horizontal_top_split',
+ },
+ ),
+ 'exd_qualifiers': FieldType(
+ name='exd_qualifiers',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'no_qualifier',
+ 1: 'instantaneous',
+ 2: 'average',
+ 3: 'lap',
+ 4: 'maximum',
+ 5: 'maximum_average',
+ 6: 'maximum_lap',
+ 7: 'last_lap',
+ 8: 'average_lap',
+ 9: 'to_destination',
+ 10: 'to_go',
+ 11: 'to_next',
+ 12: 'next_course_point',
+ 13: 'total',
+ 14: 'three_second_average',
+ 15: 'ten_second_average',
+ 16: 'thirty_second_average',
+ 17: 'percent_maximum',
+ 18: 'percent_maximum_average',
+ 19: 'lap_percent_maximum',
+ 20: 'elapsed',
+ 21: 'sunrise',
+ 22: 'sunset',
+ 23: 'compared_to_virtual_partner',
+ 24: 'maximum_24h',
+ 25: 'minimum_24h',
+ 26: 'minimum',
+ 27: 'first',
+ 28: 'second',
+ 29: 'third',
+ 30: 'shifter',
+ 31: 'last_sport',
+ 32: 'moving',
+ 33: 'stopped',
+ 34: 'estimated_total',
+ 242: 'zone_9',
+ 243: 'zone_8',
+ 244: 'zone_7',
+ 245: 'zone_6',
+ 246: 'zone_5',
+ 247: 'zone_4',
+ 248: 'zone_3',
+ 249: 'zone_2',
+ 250: 'zone_1',
+ },
+ ),
+ 'exercise_category': FieldType(
+ name='exercise_category',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'bench_press',
+ 1: 'calf_raise',
+ 2: 'cardio',
+ 3: 'carry',
+ 4: 'chop',
+ 5: 'core',
+ 6: 'crunch',
+ 7: 'curl',
+ 8: 'deadlift',
+ 9: 'flye',
+ 10: 'hip_raise',
+ 11: 'hip_stability',
+ 12: 'hip_swing',
+ 13: 'hyperextension',
+ 14: 'lateral_raise',
+ 15: 'leg_curl',
+ 16: 'leg_raise',
+ 17: 'lunge',
+ 18: 'olympic_lift',
+ 19: 'plank',
+ 20: 'plyo',
+ 21: 'pull_up',
+ 22: 'push_up',
+ 23: 'row',
+ 24: 'shoulder_press',
+ 25: 'shoulder_stability',
+ 26: 'shrug',
+ 27: 'sit_up',
+ 28: 'squat',
+ 29: 'total_body',
+ 30: 'triceps_extension',
+ 31: 'warm_up',
+ 32: 'run',
+ 65534: 'unknown',
+ },
+ ),
+ 'file': FieldType(
+ name='file',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 1: 'device', # Read only, single file. Must be in root directory.
+ 2: 'settings', # Read/write, single file. Directory=Settings
+ 3: 'sport', # Read/write, multiple files, file number = sport type. Directory=Sports
+ 4: 'activity', # Read/erase, multiple files. Directory=Activities
+ 5: 'workout', # Read/write/erase, multiple files. Directory=Workouts
+ 6: 'course', # Read/write/erase, multiple files. Directory=Courses
+ 7: 'schedules', # Read/write, single file. Directory=Schedules
+ 9: 'weight', # Read only, single file. Circular buffer. All message definitions at start of file. Directory=Weight
+ 10: 'totals', # Read only, single file. Directory=Totals
+ 11: 'goals', # Read/write, single file. Directory=Goals
+ 14: 'blood_pressure', # Read only. Directory=Blood Pressure
+ 15: 'monitoring_a', # Read only. Directory=Monitoring. File number=sub type.
+ 20: 'activity_summary', # Read/erase, multiple files. Directory=Activities
+ 28: 'monitoring_daily',
+ 32: 'monitoring_b', # Read only. Directory=Monitoring. File number=identifier
+ 34: 'segment', # Read/write/erase. Multiple Files. Directory=Segments
+ 35: 'segment_list', # Read/write/erase. Single File. Directory=Segments
+ 40: 'exd_configuration', # Read/write/erase. Single File. Directory=Settings
+ 0xF7: 'mfg_range_min', # 0xF7 - 0xFE reserved for manufacturer specific file types
+ 0xFE: 'mfg_range_max', # 0xF7 - 0xFE reserved for manufacturer specific file types
+ },
+ ),
+ 'file_flags': FieldType(
+ name='file_flags',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x02: 'read',
+ 0x04: 'write',
+ 0x08: 'erase',
+ },
+ ),
+ 'fit_base_type': FieldType(
+ name='fit_base_type',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 0: 'enum',
+ 1: 'sint8',
+ 2: 'uint8',
+ 7: 'string',
+ 10: 'uint8z',
+ 13: 'byte',
+ 131: 'sint16',
+ 132: 'uint16',
+ 133: 'sint32',
+ 134: 'uint32',
+ 136: 'float32',
+ 137: 'float64',
+ 139: 'uint16z',
+ 140: 'uint32z',
+ 142: 'sint64',
+ 143: 'uint64',
+ 144: 'uint64z',
+ },
+ ),
+ 'fit_base_unit': FieldType(
+ name='fit_base_unit',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'other',
+ 1: 'kilogram',
+ 2: 'pound',
+ },
+ ),
+ 'fitness_equipment_state': FieldType( # fitness equipment event data
+ name='fitness_equipment_state',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'ready',
+ 1: 'in_use',
+ 2: 'paused',
+ 3: 'unknown', # lost connection to fitness equipment
+ },
+ ),
+ 'flye_exercise_name': FieldType(
+ name='flye_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'cable_crossover',
+ 1: 'decline_dumbbell_flye',
+ 2: 'dumbbell_flye',
+ 3: 'incline_dumbbell_flye',
+ 4: 'kettlebell_flye',
+ 5: 'kneeling_rear_flye',
+ 6: 'single_arm_standing_cable_reverse_flye',
+ 7: 'swiss_ball_dumbbell_flye',
+ 8: 'arm_rotations',
+ 9: 'hug_a_tree',
+ },
+ ),
+ 'garmin_product': FieldType(
+ name='garmin_product',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 1: 'hrm1',
+ 2: 'axh01', # AXH01 HRM chipset
+ 3: 'axb01',
+ 4: 'axb02',
+ 5: 'hrm2ss',
+ 6: 'dsi_alf02',
+ 7: 'hrm3ss',
+ 8: 'hrm_run_single_byte_product_id', # hrm_run model for HRM ANT+ messaging
+ 9: 'bsm', # BSM model for ANT+ messaging
+ 10: 'bcm', # BCM model for ANT+ messaging
+ 11: 'axs01', # AXS01 HRM Bike Chipset model for ANT+ messaging
+ 12: 'hrm_tri_single_byte_product_id', # hrm_tri model for HRM ANT+ messaging
+ 14: 'fr225_single_byte_product_id', # fr225 model for HRM ANT+ messaging
+ 473: 'fr301_china',
+ 474: 'fr301_japan',
+ 475: 'fr301_korea',
+ 494: 'fr301_taiwan',
+ 717: 'fr405', # Forerunner 405
+ 782: 'fr50', # Forerunner 50
+ 987: 'fr405_japan',
+ 988: 'fr60', # Forerunner 60
+ 1011: 'dsi_alf01',
+ 1018: 'fr310xt', # Forerunner 310
+ 1036: 'edge500',
+ 1124: 'fr110', # Forerunner 110
+ 1169: 'edge800',
+ 1199: 'edge500_taiwan',
+ 1213: 'edge500_japan',
+ 1253: 'chirp',
+ 1274: 'fr110_japan',
+ 1325: 'edge200',
+ 1328: 'fr910xt',
+ 1333: 'edge800_taiwan',
+ 1334: 'edge800_japan',
+ 1341: 'alf04',
+ 1345: 'fr610',
+ 1360: 'fr210_japan',
+ 1380: 'vector_ss',
+ 1381: 'vector_cp',
+ 1386: 'edge800_china',
+ 1387: 'edge500_china',
+ 1410: 'fr610_japan',
+ 1422: 'edge500_korea',
+ 1436: 'fr70',
+ 1446: 'fr310xt_4t',
+ 1461: 'amx',
+ 1482: 'fr10',
+ 1497: 'edge800_korea',
+ 1499: 'swim',
+ 1537: 'fr910xt_china',
+ 1551: 'fenix',
+ 1555: 'edge200_taiwan',
+ 1561: 'edge510',
+ 1567: 'edge810',
+ 1570: 'tempe',
+ 1600: 'fr910xt_japan',
+ 1623: 'fr620',
+ 1632: 'fr220',
+ 1664: 'fr910xt_korea',
+ 1688: 'fr10_japan',
+ 1721: 'edge810_japan',
+ 1735: 'virb_elite',
+ 1736: 'edge_touring', # Also Edge Touring Plus
+ 1742: 'edge510_japan',
+ 1743: 'hrm_tri',
+ 1752: 'hrm_run',
+ 1765: 'fr920xt',
+ 1821: 'edge510_asia',
+ 1822: 'edge810_china',
+ 1823: 'edge810_taiwan',
+ 1836: 'edge1000',
+ 1837: 'vivo_fit',
+ 1853: 'virb_remote',
+ 1885: 'vivo_ki',
+ 1903: 'fr15',
+ 1907: 'vivo_active',
+ 1918: 'edge510_korea',
+ 1928: 'fr620_japan',
+ 1929: 'fr620_china',
+ 1930: 'fr220_japan',
+ 1931: 'fr220_china',
+ 1936: 'approach_s6',
+ 1956: 'vivo_smart',
+ 1967: 'fenix2',
+ 1988: 'epix',
+ 2050: 'fenix3',
+ 2052: 'edge1000_taiwan',
+ 2053: 'edge1000_japan',
+ 2061: 'fr15_japan',
+ 2067: 'edge520',
+ 2070: 'edge1000_china',
+ 2072: 'fr620_russia',
+ 2073: 'fr220_russia',
+ 2079: 'vector_s',
+ 2100: 'edge1000_korea',
+ 2130: 'fr920xt_taiwan',
+ 2131: 'fr920xt_china',
+ 2132: 'fr920xt_japan',
+ 2134: 'virbx',
+ 2135: 'vivo_smart_apac',
+ 2140: 'etrex_touch',
+ 2147: 'edge25',
+ 2148: 'fr25',
+ 2150: 'vivo_fit2',
+ 2153: 'fr225',
+ 2156: 'fr630',
+ 2157: 'fr230',
+ 2160: 'vivo_active_apac',
+ 2161: 'vector_2',
+ 2162: 'vector_2s',
+ 2172: 'virbxe',
+ 2173: 'fr620_taiwan',
+ 2174: 'fr220_taiwan',
+ 2175: 'truswing',
+ 2188: 'fenix3_china',
+ 2189: 'fenix3_twn',
+ 2192: 'varia_headlight',
+ 2193: 'varia_taillight_old',
+ 2204: 'edge_explore_1000',
+ 2219: 'fr225_asia',
+ 2225: 'varia_radar_taillight',
+ 2226: 'varia_radar_display',
+ 2238: 'edge20',
+ 2262: 'd2_bravo',
+ 2266: 'approach_s20',
+ 2276: 'varia_remote',
+ 2327: 'hrm4_run',
+ 2337: 'vivo_active_hr',
+ 2347: 'vivo_smart_gps_hr',
+ 2348: 'vivo_smart_hr',
+ 2368: 'vivo_move',
+ 2398: 'varia_vision',
+ 2406: 'vivo_fit3',
+ 2413: 'fenix3_hr',
+ 2417: 'virb_ultra_30',
+ 2429: 'index_smart_scale',
+ 2431: 'fr235',
+ 2432: 'fenix3_chronos',
+ 2441: 'oregon7xx',
+ 2444: 'rino7xx',
+ 2496: 'nautix',
+ 2530: 'edge_820',
+ 2531: 'edge_explore_820',
+ 2544: 'fenix5s',
+ 2547: 'd2_bravo_titanium',
+ 2567: 'varia_ut800', # Varia UT 800 SW
+ 2593: 'running_dynamics_pod',
+ 2604: 'fenix5x',
+ 2606: 'vivo_fit_jr',
+ 2691: 'fr935',
+ 2697: 'fenix5',
+ 10007: 'sdm4', # SDM4 footpod
+ 10014: 'edge_remote',
+ 20119: 'training_center',
+ 65531: 'connectiq_simulator',
+ 65532: 'android_antplus_plugin',
+ 65534: 'connect', # Garmin Connect website
+ },
+ ),
+ 'gender': FieldType(
+ name='gender',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'female',
+ 1: 'male',
+ },
+ ),
+ 'goal': FieldType(
+ name='goal',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'time',
+ 1: 'distance',
+ 2: 'calories',
+ 3: 'frequency',
+ 4: 'steps',
+ 5: 'ascent',
+ 6: 'active_minutes',
+ },
+ ),
+ 'goal_recurrence': FieldType(
+ name='goal_recurrence',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'off',
+ 1: 'daily',
+ 2: 'weekly',
+ 3: 'monthly',
+ 4: 'yearly',
+ 5: 'custom',
+ },
+ ),
+ 'goal_source': FieldType(
+ name='goal_source',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'auto', # Device generated
+ 1: 'community', # Social network sourced goal
+ 2: 'user', # Manually generated
+ },
+ ),
+ 'hip_raise_exercise_name': FieldType(
+ name='hip_raise_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'barbell_hip_thrust_on_floor',
+ 1: 'barbell_hip_thrust_with_bench',
+ 2: 'bent_knee_swiss_ball_reverse_hip_raise',
+ 3: 'weighted_bent_knee_swiss_ball_reverse_hip_raise',
+ 4: 'bridge_with_leg_extension',
+ 5: 'weighted_bridge_with_leg_extension',
+ 6: 'clam_bridge',
+ 7: 'front_kick_tabletop',
+ 8: 'weighted_front_kick_tabletop',
+ 9: 'hip_extension_and_cross',
+ 10: 'weighted_hip_extension_and_cross',
+ 11: 'hip_raise',
+ 12: 'weighted_hip_raise',
+ 13: 'hip_raise_with_feet_on_swiss_ball',
+ 14: 'weighted_hip_raise_with_feet_on_swiss_ball',
+ 15: 'hip_raise_with_head_on_bosu_ball',
+ 16: 'weighted_hip_raise_with_head_on_bosu_ball',
+ 17: 'hip_raise_with_head_on_swiss_ball',
+ 18: 'weighted_hip_raise_with_head_on_swiss_ball',
+ 19: 'hip_raise_with_knee_squeeze',
+ 20: 'weighted_hip_raise_with_knee_squeeze',
+ 21: 'incline_rear_leg_extension',
+ 22: 'weighted_incline_rear_leg_extension',
+ 23: 'kettlebell_swing',
+ 24: 'marching_hip_raise',
+ 25: 'weighted_marching_hip_raise',
+ 26: 'marching_hip_raise_with_feet_on_a_swiss_ball',
+ 27: 'weighted_marching_hip_raise_with_feet_on_a_swiss_ball',
+ 28: 'reverse_hip_raise',
+ 29: 'weighted_reverse_hip_raise',
+ 30: 'single_leg_hip_raise',
+ 31: 'weighted_single_leg_hip_raise',
+ 32: 'single_leg_hip_raise_with_foot_on_bench',
+ 33: 'weighted_single_leg_hip_raise_with_foot_on_bench',
+ 34: 'single_leg_hip_raise_with_foot_on_bosu_ball',
+ 35: 'weighted_single_leg_hip_raise_with_foot_on_bosu_ball',
+ 36: 'single_leg_hip_raise_with_foot_on_foam_roller',
+ 37: 'weighted_single_leg_hip_raise_with_foot_on_foam_roller',
+ 38: 'single_leg_hip_raise_with_foot_on_medicine_ball',
+ 39: 'weighted_single_leg_hip_raise_with_foot_on_medicine_ball',
+ 40: 'single_leg_hip_raise_with_head_on_bosu_ball',
+ 41: 'weighted_single_leg_hip_raise_with_head_on_bosu_ball',
+ 42: 'weighted_clam_bridge',
+ 43: 'single_leg_swiss_ball_hip_raise_and_leg_curl',
+ 44: 'clams',
+ 45: 'inner_thigh_circles',
+ 46: 'inner_thigh_side_lift',
+ 47: 'leg_circles',
+ 48: 'leg_lift',
+ 49: 'leg_lift_in_external_rotation',
+ },
+ ),
+ 'hip_stability_exercise_name': FieldType(
+ name='hip_stability_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'band_side_lying_leg_raise',
+ 1: 'dead_bug',
+ 2: 'weighted_dead_bug',
+ 3: 'external_hip_raise',
+ 4: 'weighted_external_hip_raise',
+ 5: 'fire_hydrant_kicks',
+ 6: 'weighted_fire_hydrant_kicks',
+ 7: 'hip_circles',
+ 8: 'weighted_hip_circles',
+ 9: 'inner_thigh_lift',
+ 10: 'weighted_inner_thigh_lift',
+ 11: 'lateral_walks_with_band_at_ankles',
+ 12: 'pretzel_side_kick',
+ 13: 'weighted_pretzel_side_kick',
+ 14: 'prone_hip_internal_rotation',
+ 15: 'weighted_prone_hip_internal_rotation',
+ 16: 'quadruped',
+ 17: 'quadruped_hip_extension',
+ 18: 'weighted_quadruped_hip_extension',
+ 19: 'quadruped_with_leg_lift',
+ 20: 'weighted_quadruped_with_leg_lift',
+ 21: 'side_lying_leg_raise',
+ 22: 'weighted_side_lying_leg_raise',
+ 23: 'sliding_hip_adduction',
+ 24: 'weighted_sliding_hip_adduction',
+ 25: 'standing_adduction',
+ 26: 'weighted_standing_adduction',
+ 27: 'standing_cable_hip_abduction',
+ 28: 'standing_hip_abduction',
+ 29: 'weighted_standing_hip_abduction',
+ 30: 'standing_rear_leg_raise',
+ 31: 'weighted_standing_rear_leg_raise',
+ 32: 'supine_hip_internal_rotation',
+ 33: 'weighted_supine_hip_internal_rotation',
+ },
+ ),
+ 'hip_swing_exercise_name': FieldType(
+ name='hip_swing_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'single_arm_kettlebell_swing',
+ 1: 'single_arm_dumbbell_swing',
+ 2: 'step_out_swing',
+ },
+ ),
+ 'hr_type': FieldType(
+ name='hr_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'normal',
+ 1: 'irregular',
+ },
+ ),
+ 'hr_zone_calc': FieldType(
+ name='hr_zone_calc',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'custom',
+ 1: 'percent_max_hr',
+ 2: 'percent_hrr',
+ },
+ ),
+ 'hyperextension_exercise_name': FieldType(
+ name='hyperextension_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'back_extension_with_opposite_arm_and_leg_reach',
+ 1: 'weighted_back_extension_with_opposite_arm_and_leg_reach',
+ 2: 'base_rotations',
+ 3: 'weighted_base_rotations',
+ 4: 'bent_knee_reverse_hyperextension',
+ 5: 'weighted_bent_knee_reverse_hyperextension',
+ 6: 'hollow_hold_and_roll',
+ 7: 'weighted_hollow_hold_and_roll',
+ 8: 'kicks',
+ 9: 'weighted_kicks',
+ 10: 'knee_raises',
+ 11: 'weighted_knee_raises',
+ 12: 'kneeling_superman',
+ 13: 'weighted_kneeling_superman',
+ 14: 'lat_pull_down_with_row',
+ 15: 'medicine_ball_deadlift_to_reach',
+ 16: 'one_arm_one_leg_row',
+ 17: 'one_arm_row_with_band',
+ 18: 'overhead_lunge_with_medicine_ball',
+ 19: 'plank_knee_tucks',
+ 20: 'weighted_plank_knee_tucks',
+ 21: 'side_step',
+ 22: 'weighted_side_step',
+ 23: 'single_leg_back_extension',
+ 24: 'weighted_single_leg_back_extension',
+ 25: 'spine_extension',
+ 26: 'weighted_spine_extension',
+ 27: 'static_back_extension',
+ 28: 'weighted_static_back_extension',
+ 29: 'superman_from_floor',
+ 30: 'weighted_superman_from_floor',
+ 31: 'swiss_ball_back_extension',
+ 32: 'weighted_swiss_ball_back_extension',
+ 33: 'swiss_ball_hyperextension',
+ 34: 'weighted_swiss_ball_hyperextension',
+ 35: 'swiss_ball_opposite_arm_and_leg_lift',
+ 36: 'weighted_swiss_ball_opposite_arm_and_leg_lift',
+ 37: 'superman_on_swiss_ball',
+ 38: 'cobra',
+ 39: 'supine_floor_barre',
+ },
+ ),
+ 'intensity': FieldType(
+ name='intensity',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'active',
+ 1: 'rest',
+ 2: 'warmup',
+ 3: 'cooldown',
+ },
+ ),
+ 'language': FieldType(
+ name='language',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'english',
+ 1: 'french',
+ 2: 'italian',
+ 3: 'german',
+ 4: 'spanish',
+ 5: 'croatian',
+ 6: 'czech',
+ 7: 'danish',
+ 8: 'dutch',
+ 9: 'finnish',
+ 10: 'greek',
+ 11: 'hungarian',
+ 12: 'norwegian',
+ 13: 'polish',
+ 14: 'portuguese',
+ 15: 'slovakian',
+ 16: 'slovenian',
+ 17: 'swedish',
+ 18: 'russian',
+ 19: 'turkish',
+ 20: 'latvian',
+ 21: 'ukrainian',
+ 22: 'arabic',
+ 23: 'farsi',
+ 24: 'bulgarian',
+ 25: 'romanian',
+ 26: 'chinese',
+ 27: 'japanese',
+ 28: 'korean',
+ 29: 'taiwanese',
+ 30: 'thai',
+ 31: 'hebrew',
+ 32: 'brazilian_portuguese',
+ 33: 'indonesian',
+ 34: 'malaysian',
+ 35: 'vietnamese',
+ 36: 'burmese',
+ 37: 'mongolian',
+ 254: 'custom',
+ },
+ ),
+ 'language_bits_0': FieldType( # Bit field corresponding to language enum type (1 << language).
+ name='language_bits_0',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'english',
+ 0x02: 'french',
+ 0x04: 'italian',
+ 0x08: 'german',
+ 0x10: 'spanish',
+ 0x20: 'croatian',
+ 0x40: 'czech',
+ 0x80: 'danish',
+ },
+ ),
+ 'language_bits_1': FieldType(
+ name='language_bits_1',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'dutch',
+ 0x02: 'finnish',
+ 0x04: 'greek',
+ 0x08: 'hungarian',
+ 0x10: 'norwegian',
+ 0x20: 'polish',
+ 0x40: 'portuguese',
+ 0x80: 'slovakian',
+ },
+ ),
+ 'language_bits_2': FieldType(
+ name='language_bits_2',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'slovenian',
+ 0x02: 'swedish',
+ 0x04: 'russian',
+ 0x08: 'turkish',
+ 0x10: 'latvian',
+ 0x20: 'ukrainian',
+ 0x40: 'arabic',
+ 0x80: 'farsi',
+ },
+ ),
+ 'language_bits_3': FieldType(
+ name='language_bits_3',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'bulgarian',
+ 0x02: 'romanian',
+ 0x04: 'chinese',
+ 0x08: 'japanese',
+ 0x10: 'korean',
+ 0x20: 'taiwanese',
+ 0x40: 'thai',
+ 0x80: 'hebrew',
+ },
+ ),
+ 'language_bits_4': FieldType(
+ name='language_bits_4',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'brazilian_portuguese',
+ 0x02: 'indonesian',
+ 0x04: 'malaysian',
+ 0x08: 'vietnamese',
+ 0x10: 'burmese',
+ 0x20: 'mongolian',
+ },
+ ),
+ 'lap_trigger': FieldType(
+ name='lap_trigger',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'manual',
+ 1: 'time',
+ 2: 'distance',
+ 3: 'position_start',
+ 4: 'position_lap',
+ 5: 'position_waypoint',
+ 6: 'position_marked',
+ 7: 'session_end',
+ 8: 'fitness_equipment',
+ },
+ ),
+ 'lateral_raise_exercise_name': FieldType(
+ name='lateral_raise_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: '45_degree_cable_external_rotation',
+ 1: 'alternating_lateral_raise_with_static_hold',
+ 2: 'bar_muscle_up',
+ 3: 'bent_over_lateral_raise',
+ 4: 'cable_diagonal_raise',
+ 5: 'cable_front_raise',
+ 6: 'calorie_row',
+ 7: 'combo_shoulder_raise',
+ 8: 'dumbbell_diagonal_raise',
+ 9: 'dumbbell_v_raise',
+ 10: 'front_raise',
+ 11: 'leaning_dumbbell_lateral_raise',
+ 12: 'lying_dumbbell_raise',
+ 13: 'muscle_up',
+ 14: 'one_arm_cable_lateral_raise',
+ 15: 'overhand_grip_rear_lateral_raise',
+ 16: 'plate_raises',
+ 17: 'ring_dip',
+ 18: 'weighted_ring_dip',
+ 19: 'ring_muscle_up',
+ 20: 'weighted_ring_muscle_up',
+ 21: 'rope_climb',
+ 22: 'weighted_rope_climb',
+ 23: 'scaption',
+ 24: 'seated_lateral_raise',
+ 25: 'seated_rear_lateral_raise',
+ 26: 'side_lying_lateral_raise',
+ 27: 'standing_lift',
+ 28: 'suspended_row',
+ 29: 'underhand_grip_rear_lateral_raise',
+ 30: 'wall_slide',
+ 31: 'weighted_wall_slide',
+ 32: 'arm_circles',
+ 33: 'shaving_the_head',
+ },
+ ),
+ 'left_right_balance': FieldType(
+ name='left_right_balance',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 0x7F: 'mask', # % contribution
+ 0x80: 'right', # data corresponds to right if set, otherwise unknown
+ },
+ ),
+ 'left_right_balance_100': FieldType(
+ name='left_right_balance_100',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0x3FFF: 'mask', # % contribution scaled by 100
+ 0x8000: 'right', # data corresponds to right if set, otherwise unknown
+ },
+ ),
+ 'leg_curl_exercise_name': FieldType(
+ name='leg_curl_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'leg_curl',
+ 1: 'weighted_leg_curl',
+ 2: 'good_morning',
+ 3: 'seated_barbell_good_morning',
+ 4: 'single_leg_barbell_good_morning',
+ 5: 'single_leg_sliding_leg_curl',
+ 6: 'sliding_leg_curl',
+ 7: 'split_barbell_good_morning',
+ 8: 'split_stance_extension',
+ 9: 'staggered_stance_good_morning',
+ 10: 'swiss_ball_hip_raise_and_leg_curl',
+ 11: 'zercher_good_morning',
+ },
+ ),
+ 'leg_raise_exercise_name': FieldType(
+ name='leg_raise_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'hanging_knee_raise',
+ 1: 'hanging_leg_raise',
+ 2: 'weighted_hanging_leg_raise',
+ 3: 'hanging_single_leg_raise',
+ 4: 'weighted_hanging_single_leg_raise',
+ 5: 'kettlebell_leg_raises',
+ 6: 'leg_lowering_drill',
+ 7: 'weighted_leg_lowering_drill',
+ 8: 'lying_straight_leg_raise',
+ 9: 'weighted_lying_straight_leg_raise',
+ 10: 'medicine_ball_leg_drops',
+ 11: 'quadruped_leg_raise',
+ 12: 'weighted_quadruped_leg_raise',
+ 13: 'reverse_leg_raise',
+ 14: 'weighted_reverse_leg_raise',
+ 15: 'reverse_leg_raise_on_swiss_ball',
+ 16: 'weighted_reverse_leg_raise_on_swiss_ball',
+ 17: 'single_leg_lowering_drill',
+ 18: 'weighted_single_leg_lowering_drill',
+ 19: 'weighted_hanging_knee_raise',
+ 20: 'lateral_stepover',
+ 21: 'weighted_lateral_stepover',
+ },
+ ),
+ 'length_type': FieldType(
+ name='length_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'idle', # Rest period. Length with no strokes
+ 1: 'active', # Length with strokes.
+ },
+ ),
+ 'local_date_time': FieldType( # seconds since 00:00 Dec 31 1989 in local time zone
+ name='local_date_time',
+ base_type=BASE_TYPES[0x86], # uint32
+ values={
+ 0x10000000: 'min', # if date_time is < 0x10000000 then it is system time (seconds from device power on)
+ },
+ ),
+ 'local_device_type': FieldType(
+ name='local_device_type',
+ base_type=BASE_TYPES[0x02], # uint8
+ ),
+ 'localtime_into_day': FieldType( # number of seconds into the day since local 00:00:00
+ name='localtime_into_day',
+ base_type=BASE_TYPES[0x86], # uint32
+ ),
+ 'lunge_exercise_name': FieldType(
+ name='lunge_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'overhead_lunge',
+ 1: 'lunge_matrix',
+ 2: 'weighted_lunge_matrix',
+ 3: 'alternating_barbell_forward_lunge',
+ 4: 'alternating_dumbbell_lunge_with_reach',
+ 5: 'back_foot_elevated_dumbbell_split_squat',
+ 6: 'barbell_box_lunge',
+ 7: 'barbell_bulgarian_split_squat',
+ 8: 'barbell_crossover_lunge',
+ 9: 'barbell_front_split_squat',
+ 10: 'barbell_lunge',
+ 11: 'barbell_reverse_lunge',
+ 12: 'barbell_side_lunge',
+ 13: 'barbell_split_squat',
+ 14: 'core_control_rear_lunge',
+ 15: 'diagonal_lunge',
+ 16: 'drop_lunge',
+ 17: 'dumbbell_box_lunge',
+ 18: 'dumbbell_bulgarian_split_squat',
+ 19: 'dumbbell_crossover_lunge',
+ 20: 'dumbbell_diagonal_lunge',
+ 21: 'dumbbell_lunge',
+ 22: 'dumbbell_lunge_and_rotation',
+ 23: 'dumbbell_overhead_bulgarian_split_squat',
+ 24: 'dumbbell_reverse_lunge_to_high_knee_and_press',
+ 25: 'dumbbell_side_lunge',
+ 26: 'elevated_front_foot_barbell_split_squat',
+ 27: 'front_foot_elevated_dumbbell_split_squat',
+ 28: 'gunslinger_lunge',
+ 29: 'lawnmower_lunge',
+ 30: 'low_lunge_with_isometric_adduction',
+ 31: 'low_side_to_side_lunge',
+ 32: 'lunge',
+ 33: 'weighted_lunge',
+ 34: 'lunge_with_arm_reach',
+ 35: 'lunge_with_diagonal_reach',
+ 36: 'lunge_with_side_bend',
+ 37: 'offset_dumbbell_lunge',
+ 38: 'offset_dumbbell_reverse_lunge',
+ 39: 'overhead_bulgarian_split_squat',
+ 40: 'overhead_dumbbell_reverse_lunge',
+ 41: 'overhead_dumbbell_split_squat',
+ 42: 'overhead_lunge_with_rotation',
+ 43: 'reverse_barbell_box_lunge',
+ 44: 'reverse_box_lunge',
+ 45: 'reverse_dumbbell_box_lunge',
+ 46: 'reverse_dumbbell_crossover_lunge',
+ 47: 'reverse_dumbbell_diagonal_lunge',
+ 48: 'reverse_lunge_with_reach_back',
+ 49: 'weighted_reverse_lunge_with_reach_back',
+ 50: 'reverse_lunge_with_twist_and_overhead_reach',
+ 51: 'weighted_reverse_lunge_with_twist_and_overhead_reach',
+ 52: 'reverse_sliding_box_lunge',
+ 53: 'weighted_reverse_sliding_box_lunge',
+ 54: 'reverse_sliding_lunge',
+ 55: 'weighted_reverse_sliding_lunge',
+ 56: 'runners_lunge_to_balance',
+ 57: 'weighted_runners_lunge_to_balance',
+ 58: 'shifting_side_lunge',
+ 59: 'side_and_crossover_lunge',
+ 60: 'weighted_side_and_crossover_lunge',
+ 61: 'side_lunge',
+ 62: 'weighted_side_lunge',
+ 63: 'side_lunge_and_press',
+ 64: 'side_lunge_jump_off',
+ 65: 'side_lunge_sweep',
+ 66: 'weighted_side_lunge_sweep',
+ 67: 'side_lunge_to_crossover_tap',
+ 68: 'weighted_side_lunge_to_crossover_tap',
+ 69: 'side_to_side_lunge_chops',
+ 70: 'weighted_side_to_side_lunge_chops',
+ 71: 'siff_jump_lunge',
+ 72: 'weighted_siff_jump_lunge',
+ 73: 'single_arm_reverse_lunge_and_press',
+ 74: 'sliding_lateral_lunge',
+ 75: 'weighted_sliding_lateral_lunge',
+ 76: 'walking_barbell_lunge',
+ 77: 'walking_dumbbell_lunge',
+ 78: 'walking_lunge',
+ 79: 'weighted_walking_lunge',
+ 80: 'wide_grip_overhead_barbell_split_squat',
+ },
+ ),
+ 'manufacturer': FieldType(
+ name='manufacturer',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 1: 'garmin',
+ 2: 'garmin_fr405_antfs', # Do not use. Used by FR405 for ANTFS man id.
+ 3: 'zephyr',
+ 4: 'dayton',
+ 5: 'idt',
+ 6: 'srm',
+ 7: 'quarq',
+ 8: 'ibike',
+ 9: 'saris',
+ 10: 'spark_hk',
+ 11: 'tanita',
+ 12: 'echowell',
+ 13: 'dynastream_oem',
+ 14: 'nautilus',
+ 15: 'dynastream',
+ 16: 'timex',
+ 17: 'metrigear',
+ 18: 'xelic',
+ 19: 'beurer',
+ 20: 'cardiosport',
+ 21: 'a_and_d',
+ 22: 'hmm',
+ 23: 'suunto',
+ 24: 'thita_elektronik',
+ 25: 'gpulse',
+ 26: 'clean_mobile',
+ 27: 'pedal_brain',
+ 28: 'peaksware',
+ 29: 'saxonar',
+ 30: 'lemond_fitness',
+ 31: 'dexcom',
+ 32: 'wahoo_fitness',
+ 33: 'octane_fitness',
+ 34: 'archinoetics',
+ 35: 'the_hurt_box',
+ 36: 'citizen_systems',
+ 37: 'magellan',
+ 38: 'osynce',
+ 39: 'holux',
+ 40: 'concept2',
+ 42: 'one_giant_leap',
+ 43: 'ace_sensor',
+ 44: 'brim_brothers',
+ 45: 'xplova',
+ 46: 'perception_digital',
+ 47: 'bf1systems',
+ 48: 'pioneer',
+ 49: 'spantec',
+ 50: 'metalogics',
+ 51: '4iiiis',
+ 52: 'seiko_epson',
+ 53: 'seiko_epson_oem',
+ 54: 'ifor_powell',
+ 55: 'maxwell_guider',
+ 56: 'star_trac',
+ 57: 'breakaway',
+ 58: 'alatech_technology_ltd',
+ 59: 'mio_technology_europe',
+ 60: 'rotor',
+ 61: 'geonaute',
+ 62: 'id_bike',
+ 63: 'specialized',
+ 64: 'wtek',
+ 65: 'physical_enterprises',
+ 66: 'north_pole_engineering',
+ 67: 'bkool',
+ 68: 'cateye',
+ 69: 'stages_cycling',
+ 70: 'sigmasport',
+ 71: 'tomtom',
+ 72: 'peripedal',
+ 73: 'wattbike',
+ 76: 'moxy',
+ 77: 'ciclosport',
+ 78: 'powerbahn',
+ 79: 'acorn_projects_aps',
+ 80: 'lifebeam',
+ 81: 'bontrager',
+ 82: 'wellgo',
+ 83: 'scosche',
+ 84: 'magura',
+ 85: 'woodway',
+ 86: 'elite',
+ 87: 'nielsen_kellerman',
+ 88: 'dk_city',
+ 89: 'tacx',
+ 90: 'direction_technology',
+ 91: 'magtonic',
+ 92: '1partcarbon',
+ 93: 'inside_ride_technologies',
+ 94: 'sound_of_motion',
+ 95: 'stryd',
+ 96: 'icg', # Indoorcycling Group
+ 97: 'MiPulse',
+ 98: 'bsx_athletics',
+ 99: 'look',
+ 100: 'campagnolo_srl',
+ 101: 'body_bike_smart',
+ 102: 'praxisworks',
+ 103: 'limits_technology', # Limits Technology Ltd.
+ 104: 'topaction_technology', # TopAction Technology Inc.
+ 105: 'cosinuss',
+ 106: 'fitcare',
+ 107: 'magene',
+ 108: 'giant_manufacturing_co',
+ 109: 'tigrasport', # Tigrasport
+ 110: 'salutron',
+ 111: 'technogym',
+ 112: 'bryton_sensors',
+ 113: 'latitude_limited',
+ 114: 'soaring_technology',
+ 115: 'igpsport',
+ 116: 'thinkrider',
+ 117: 'gopher_sport',
+ 118: 'waterrower',
+ 119: 'orangetheory',
+ 120: 'inpeak',
+ 121: 'kinetic',
+ 122: 'johnson_health_tech',
+ 123: 'polar_electro',
+ 124: 'seesense',
+ 125: 'nci_technology',
+ 255: 'development',
+ 257: 'healthandlife',
+ 258: 'lezyne',
+ 259: 'scribe_labs',
+ 260: 'zwift',
+ 261: 'watteam',
+ 262: 'recon',
+ 263: 'favero_electronics',
+ 264: 'dynovelo',
+ 265: 'strava',
+ 266: 'precor', # Amer Sports
+ 267: 'bryton',
+ 268: 'sram',
+ 269: 'navman', # MiTAC Global Corporation (Mio Technology)
+ 270: 'cobi', # COBI GmbH
+ 271: 'spivi',
+ 272: 'mio_magellan',
+ 273: 'evesports',
+ 274: 'sensitivus_gauge',
+ 275: 'podoon',
+ 276: 'life_time_fitness',
+ 277: 'falco_e_motors', # Falco eMotors Inc.
+ 278: 'minoura',
+ 279: 'cycliq',
+ 280: 'luxottica',
+ 281: 'trainer_road',
+ 282: 'the_sufferfest',
+ 283: 'fullspeedahead',
+ 284: 'virtualtraining',
+ 285: 'feedbacksports',
+ 286: 'omata',
+ 287: 'vdo',
+ 288: 'magneticdays',
+ 289: 'hammerhead',
+ 290: 'kinetic_by_kurt',
+ 291: 'shapelog',
+ 292: 'dabuziduo',
+ 293: 'jetblack',
+ 294: 'coros',
+ 295: 'virtugo',
+ 296: 'velosense',
+ 5759: 'actigraphcorp',
+ },
+ ),
+ 'mesg_count': FieldType(
+ name='mesg_count',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'num_per_file',
+ 1: 'max_per_file',
+ 2: 'max_per_file_type',
+ },
+ ),
+ 'mesg_num': FieldType(
+ name='mesg_num',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'file_id',
+ 1: 'capabilities',
+ 2: 'device_settings',
+ 3: 'user_profile',
+ 4: 'hrm_profile',
+ 5: 'sdm_profile',
+ 6: 'bike_profile',
+ 7: 'zones_target',
+ 8: 'hr_zone',
+ 9: 'power_zone',
+ 10: 'met_zone',
+ 12: 'sport',
+ 15: 'goal',
+ 18: 'session',
+ 19: 'lap',
+ 20: 'record',
+ 21: 'event',
+ 23: 'device_info',
+ 26: 'workout',
+ 27: 'workout_step',
+ 28: 'schedule',
+ 30: 'weight_scale',
+ 31: 'course',
+ 32: 'course_point',
+ 33: 'totals',
+ 34: 'activity',
+ 35: 'software',
+ 37: 'file_capabilities',
+ 38: 'mesg_capabilities',
+ 39: 'field_capabilities',
+ 49: 'file_creator',
+ 51: 'blood_pressure',
+ 53: 'speed_zone',
+ 55: 'monitoring',
+ 72: 'training_file',
+ 78: 'hrv',
+ 80: 'ant_rx',
+ 81: 'ant_tx',
+ 82: 'ant_channel_id',
+ 101: 'length',
+ 103: 'monitoring_info',
+ 105: 'pad',
+ 106: 'slave_device',
+ 127: 'connectivity',
+ 128: 'weather_conditions',
+ 129: 'weather_alert',
+ 131: 'cadence_zone',
+ 132: 'hr',
+ 142: 'segment_lap',
+ 145: 'memo_glob',
+ 148: 'segment_id',
+ 149: 'segment_leaderboard_entry',
+ 150: 'segment_point',
+ 151: 'segment_file',
+ 158: 'workout_session',
+ 159: 'watchface_settings',
+ 160: 'gps_metadata',
+ 161: 'camera_event',
+ 162: 'timestamp_correlation',
+ 164: 'gyroscope_data',
+ 165: 'accelerometer_data',
+ 167: 'three_d_sensor_calibration',
+ 169: 'video_frame',
+ 174: 'obdii_data',
+ 177: 'nmea_sentence',
+ 178: 'aviation_attitude',
+ 184: 'video',
+ 185: 'video_title',
+ 186: 'video_description',
+ 187: 'video_clip',
+ 188: 'ohr_settings',
+ 200: 'exd_screen_configuration',
+ 201: 'exd_data_field_configuration',
+ 202: 'exd_data_concept_configuration',
+ 206: 'field_description',
+ 207: 'developer_data_id',
+ 208: 'magnetometer_data',
+ 209: 'barometer_data',
+ 210: 'one_d_sensor_calibration',
+ 225: 'set',
+ 227: 'stress_level',
+ 258: 'dive_settings',
+ 259: 'dive_gas',
+ 262: 'dive_alarm',
+ 264: 'exercise_title',
+ 268: 'dive_summary',
+ },
+ ),
+ 'message_index': FieldType(
+ name='message_index',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0x0FFF: 'mask', # index
+ 0x7000: 'reserved', # reserved (default 0)
+ 0x8000: 'selected', # message is selected if set
+ },
+ ),
+ 'olympic_lift_exercise_name': FieldType(
+ name='olympic_lift_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'barbell_hang_power_clean',
+ 1: 'barbell_hang_squat_clean',
+ 2: 'barbell_power_clean',
+ 3: 'barbell_power_snatch',
+ 4: 'barbell_squat_clean',
+ 5: 'clean_and_jerk',
+ 6: 'barbell_hang_power_snatch',
+ 7: 'barbell_hang_pull',
+ 8: 'barbell_high_pull',
+ 9: 'barbell_snatch',
+ 10: 'barbell_split_jerk',
+ 11: 'clean',
+ 12: 'dumbbell_clean',
+ 13: 'dumbbell_hang_pull',
+ 14: 'one_hand_dumbbell_split_snatch',
+ 15: 'push_jerk',
+ 16: 'single_arm_dumbbell_snatch',
+ 17: 'single_arm_hang_snatch',
+ 18: 'single_arm_kettlebell_snatch',
+ 19: 'split_jerk',
+ 20: 'squat_clean_and_jerk',
+ },
+ ),
+ 'plank_exercise_name': FieldType(
+ name='plank_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: '45_degree_plank',
+ 1: 'weighted_45_degree_plank',
+ 2: '90_degree_static_hold',
+ 3: 'weighted_90_degree_static_hold',
+ 4: 'bear_crawl',
+ 5: 'weighted_bear_crawl',
+ 6: 'cross_body_mountain_climber',
+ 7: 'weighted_cross_body_mountain_climber',
+ 8: 'elbow_plank_pike_jacks',
+ 9: 'weighted_elbow_plank_pike_jacks',
+ 10: 'elevated_feet_plank',
+ 11: 'weighted_elevated_feet_plank',
+ 12: 'elevator_abs',
+ 13: 'weighted_elevator_abs',
+ 14: 'extended_plank',
+ 15: 'weighted_extended_plank',
+ 16: 'full_plank_passe_twist',
+ 17: 'weighted_full_plank_passe_twist',
+ 18: 'inching_elbow_plank',
+ 19: 'weighted_inching_elbow_plank',
+ 20: 'inchworm_to_side_plank',
+ 21: 'weighted_inchworm_to_side_plank',
+ 22: 'kneeling_plank',
+ 23: 'weighted_kneeling_plank',
+ 24: 'kneeling_side_plank_with_leg_lift',
+ 25: 'weighted_kneeling_side_plank_with_leg_lift',
+ 26: 'lateral_roll',
+ 27: 'weighted_lateral_roll',
+ 28: 'lying_reverse_plank',
+ 29: 'weighted_lying_reverse_plank',
+ 30: 'medicine_ball_mountain_climber',
+ 31: 'weighted_medicine_ball_mountain_climber',
+ 32: 'modified_mountain_climber_and_extension',
+ 33: 'weighted_modified_mountain_climber_and_extension',
+ 34: 'mountain_climber',
+ 35: 'weighted_mountain_climber',
+ 36: 'mountain_climber_on_sliding_discs',
+ 37: 'weighted_mountain_climber_on_sliding_discs',
+ 38: 'mountain_climber_with_feet_on_bosu_ball',
+ 39: 'weighted_mountain_climber_with_feet_on_bosu_ball',
+ 40: 'mountain_climber_with_hands_on_bench',
+ 41: 'mountain_climber_with_hands_on_swiss_ball',
+ 42: 'weighted_mountain_climber_with_hands_on_swiss_ball',
+ 43: 'plank',
+ 44: 'plank_jacks_with_feet_on_sliding_discs',
+ 45: 'weighted_plank_jacks_with_feet_on_sliding_discs',
+ 46: 'plank_knee_twist',
+ 47: 'weighted_plank_knee_twist',
+ 48: 'plank_pike_jumps',
+ 49: 'weighted_plank_pike_jumps',
+ 50: 'plank_pikes',
+ 51: 'weighted_plank_pikes',
+ 52: 'plank_to_stand_up',
+ 53: 'weighted_plank_to_stand_up',
+ 54: 'plank_with_arm_raise',
+ 55: 'weighted_plank_with_arm_raise',
+ 56: 'plank_with_knee_to_elbow',
+ 57: 'weighted_plank_with_knee_to_elbow',
+ 58: 'plank_with_oblique_crunch',
+ 59: 'weighted_plank_with_oblique_crunch',
+ 60: 'plyometric_side_plank',
+ 61: 'weighted_plyometric_side_plank',
+ 62: 'rolling_side_plank',
+ 63: 'weighted_rolling_side_plank',
+ 64: 'side_kick_plank',
+ 65: 'weighted_side_kick_plank',
+ 66: 'side_plank',
+ 67: 'weighted_side_plank',
+ 68: 'side_plank_and_row',
+ 69: 'weighted_side_plank_and_row',
+ 70: 'side_plank_lift',
+ 71: 'weighted_side_plank_lift',
+ 72: 'side_plank_with_elbow_on_bosu_ball',
+ 73: 'weighted_side_plank_with_elbow_on_bosu_ball',
+ 74: 'side_plank_with_feet_on_bench',
+ 75: 'weighted_side_plank_with_feet_on_bench',
+ 76: 'side_plank_with_knee_circle',
+ 77: 'weighted_side_plank_with_knee_circle',
+ 78: 'side_plank_with_knee_tuck',
+ 79: 'weighted_side_plank_with_knee_tuck',
+ 80: 'side_plank_with_leg_lift',
+ 81: 'weighted_side_plank_with_leg_lift',
+ 82: 'side_plank_with_reach_under',
+ 83: 'weighted_side_plank_with_reach_under',
+ 84: 'single_leg_elevated_feet_plank',
+ 85: 'weighted_single_leg_elevated_feet_plank',
+ 86: 'single_leg_flex_and_extend',
+ 87: 'weighted_single_leg_flex_and_extend',
+ 88: 'single_leg_side_plank',
+ 89: 'weighted_single_leg_side_plank',
+ 90: 'spiderman_plank',
+ 91: 'weighted_spiderman_plank',
+ 92: 'straight_arm_plank',
+ 93: 'weighted_straight_arm_plank',
+ 94: 'straight_arm_plank_with_shoulder_touch',
+ 95: 'weighted_straight_arm_plank_with_shoulder_touch',
+ 96: 'swiss_ball_plank',
+ 97: 'weighted_swiss_ball_plank',
+ 98: 'swiss_ball_plank_leg_lift',
+ 99: 'weighted_swiss_ball_plank_leg_lift',
+ 100: 'swiss_ball_plank_leg_lift_and_hold',
+ 101: 'swiss_ball_plank_with_feet_on_bench',
+ 102: 'weighted_swiss_ball_plank_with_feet_on_bench',
+ 103: 'swiss_ball_prone_jackknife',
+ 104: 'weighted_swiss_ball_prone_jackknife',
+ 105: 'swiss_ball_side_plank',
+ 106: 'weighted_swiss_ball_side_plank',
+ 107: 'three_way_plank',
+ 108: 'weighted_three_way_plank',
+ 109: 'towel_plank_and_knee_in',
+ 110: 'weighted_towel_plank_and_knee_in',
+ 111: 't_stabilization',
+ 112: 'weighted_t_stabilization',
+ 113: 'turkish_get_up_to_side_plank',
+ 114: 'weighted_turkish_get_up_to_side_plank',
+ 115: 'two_point_plank',
+ 116: 'weighted_two_point_plank',
+ 117: 'weighted_plank',
+ 118: 'wide_stance_plank_with_diagonal_arm_lift',
+ 119: 'weighted_wide_stance_plank_with_diagonal_arm_lift',
+ 120: 'wide_stance_plank_with_diagonal_leg_lift',
+ 121: 'weighted_wide_stance_plank_with_diagonal_leg_lift',
+ 122: 'wide_stance_plank_with_leg_lift',
+ 123: 'weighted_wide_stance_plank_with_leg_lift',
+ 124: 'wide_stance_plank_with_opposite_arm_and_leg_lift',
+ 125: 'weighted_mountain_climber_with_hands_on_bench',
+ 126: 'weighted_swiss_ball_plank_leg_lift_and_hold',
+ 127: 'weighted_wide_stance_plank_with_opposite_arm_and_leg_lift',
+ 128: 'plank_with_feet_on_swiss_ball',
+ 129: 'side_plank_to_plank_with_reach_under',
+ 130: 'bridge_with_glute_lower_lift',
+ 131: 'bridge_one_leg_bridge',
+ 132: 'plank_with_arm_variations',
+ 133: 'plank_with_leg_lift',
+ 134: 'reverse_plank_with_leg_pull',
+ },
+ ),
+ 'plyo_exercise_name': FieldType(
+ name='plyo_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'alternating_jump_lunge',
+ 1: 'weighted_alternating_jump_lunge',
+ 2: 'barbell_jump_squat',
+ 3: 'body_weight_jump_squat',
+ 4: 'weighted_jump_squat',
+ 5: 'cross_knee_strike',
+ 6: 'weighted_cross_knee_strike',
+ 7: 'depth_jump',
+ 8: 'weighted_depth_jump',
+ 9: 'dumbbell_jump_squat',
+ 10: 'dumbbell_split_jump',
+ 11: 'front_knee_strike',
+ 12: 'weighted_front_knee_strike',
+ 13: 'high_box_jump',
+ 14: 'weighted_high_box_jump',
+ 15: 'isometric_explosive_body_weight_jump_squat',
+ 16: 'weighted_isometric_explosive_jump_squat',
+ 17: 'lateral_leap_and_hop',
+ 18: 'weighted_lateral_leap_and_hop',
+ 19: 'lateral_plyo_squats',
+ 20: 'weighted_lateral_plyo_squats',
+ 21: 'lateral_slide',
+ 22: 'weighted_lateral_slide',
+ 23: 'medicine_ball_overhead_throws',
+ 24: 'medicine_ball_side_throw',
+ 25: 'medicine_ball_slam',
+ 26: 'side_to_side_medicine_ball_throws',
+ 27: 'side_to_side_shuffle_jump',
+ 28: 'weighted_side_to_side_shuffle_jump',
+ 29: 'squat_jump_onto_box',
+ 30: 'weighted_squat_jump_onto_box',
+ 31: 'squat_jumps_in_and_out',
+ 32: 'weighted_squat_jumps_in_and_out',
+ },
+ ),
+ 'power_phase_type': FieldType(
+ name='power_phase_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'power_phase_start_angle',
+ 1: 'power_phase_end_angle',
+ 2: 'power_phase_arc_length',
+ 3: 'power_phase_center',
+ },
+ ),
+ 'pull_up_exercise_name': FieldType(
+ name='pull_up_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'banded_pull_ups',
+ 1: '30_degree_lat_pulldown',
+ 2: 'band_assisted_chin_up',
+ 3: 'close_grip_chin_up',
+ 4: 'weighted_close_grip_chin_up',
+ 5: 'close_grip_lat_pulldown',
+ 6: 'crossover_chin_up',
+ 7: 'weighted_crossover_chin_up',
+ 8: 'ez_bar_pullover',
+ 9: 'hanging_hurdle',
+ 10: 'weighted_hanging_hurdle',
+ 11: 'kneeling_lat_pulldown',
+ 12: 'kneeling_underhand_grip_lat_pulldown',
+ 13: 'lat_pulldown',
+ 14: 'mixed_grip_chin_up',
+ 15: 'weighted_mixed_grip_chin_up',
+ 16: 'mixed_grip_pull_up',
+ 17: 'weighted_mixed_grip_pull_up',
+ 18: 'reverse_grip_pulldown',
+ 19: 'standing_cable_pullover',
+ 20: 'straight_arm_pulldown',
+ 21: 'swiss_ball_ez_bar_pullover',
+ 22: 'towel_pull_up',
+ 23: 'weighted_towel_pull_up',
+ 24: 'weighted_pull_up',
+ 25: 'wide_grip_lat_pulldown',
+ 26: 'wide_grip_pull_up',
+ 27: 'weighted_wide_grip_pull_up',
+ 28: 'burpee_pull_up',
+ 29: 'weighted_burpee_pull_up',
+ 30: 'jumping_pull_ups',
+ 31: 'weighted_jumping_pull_ups',
+ 32: 'kipping_pull_up',
+ 33: 'weighted_kipping_pull_up',
+ 34: 'l_pull_up',
+ 35: 'weighted_l_pull_up',
+ 36: 'suspended_chin_up',
+ 37: 'weighted_suspended_chin_up',
+ 38: 'pull_up',
+ },
+ ),
+ 'push_up_exercise_name': FieldType(
+ name='push_up_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'chest_press_with_band',
+ 1: 'alternating_staggered_push_up',
+ 2: 'weighted_alternating_staggered_push_up',
+ 3: 'alternating_hands_medicine_ball_push_up',
+ 4: 'weighted_alternating_hands_medicine_ball_push_up',
+ 5: 'bosu_ball_push_up',
+ 6: 'weighted_bosu_ball_push_up',
+ 7: 'clapping_push_up',
+ 8: 'weighted_clapping_push_up',
+ 9: 'close_grip_medicine_ball_push_up',
+ 10: 'weighted_close_grip_medicine_ball_push_up',
+ 11: 'close_hands_push_up',
+ 12: 'weighted_close_hands_push_up',
+ 13: 'decline_push_up',
+ 14: 'weighted_decline_push_up',
+ 15: 'diamond_push_up',
+ 16: 'weighted_diamond_push_up',
+ 17: 'explosive_crossover_push_up',
+ 18: 'weighted_explosive_crossover_push_up',
+ 19: 'explosive_push_up',
+ 20: 'weighted_explosive_push_up',
+ 21: 'feet_elevated_side_to_side_push_up',
+ 22: 'weighted_feet_elevated_side_to_side_push_up',
+ 23: 'hand_release_push_up',
+ 24: 'weighted_hand_release_push_up',
+ 25: 'handstand_push_up',
+ 26: 'weighted_handstand_push_up',
+ 27: 'incline_push_up',
+ 28: 'weighted_incline_push_up',
+ 29: 'isometric_explosive_push_up',
+ 30: 'weighted_isometric_explosive_push_up',
+ 31: 'judo_push_up',
+ 32: 'weighted_judo_push_up',
+ 33: 'kneeling_push_up',
+ 34: 'weighted_kneeling_push_up',
+ 35: 'medicine_ball_chest_pass',
+ 36: 'medicine_ball_push_up',
+ 37: 'weighted_medicine_ball_push_up',
+ 38: 'one_arm_push_up',
+ 39: 'weighted_one_arm_push_up',
+ 40: 'weighted_push_up',
+ 41: 'push_up_and_row',
+ 42: 'weighted_push_up_and_row',
+ 43: 'push_up_plus',
+ 44: 'weighted_push_up_plus',
+ 45: 'push_up_with_feet_on_swiss_ball',
+ 46: 'weighted_push_up_with_feet_on_swiss_ball',
+ 47: 'push_up_with_one_hand_on_medicine_ball',
+ 48: 'weighted_push_up_with_one_hand_on_medicine_ball',
+ 49: 'shoulder_push_up',
+ 50: 'weighted_shoulder_push_up',
+ 51: 'single_arm_medicine_ball_push_up',
+ 52: 'weighted_single_arm_medicine_ball_push_up',
+ 53: 'spiderman_push_up',
+ 54: 'weighted_spiderman_push_up',
+ 55: 'stacked_feet_push_up',
+ 56: 'weighted_stacked_feet_push_up',
+ 57: 'staggered_hands_push_up',
+ 58: 'weighted_staggered_hands_push_up',
+ 59: 'suspended_push_up',
+ 60: 'weighted_suspended_push_up',
+ 61: 'swiss_ball_push_up',
+ 62: 'weighted_swiss_ball_push_up',
+ 63: 'swiss_ball_push_up_plus',
+ 64: 'weighted_swiss_ball_push_up_plus',
+ 65: 't_push_up',
+ 66: 'weighted_t_push_up',
+ 67: 'triple_stop_push_up',
+ 68: 'weighted_triple_stop_push_up',
+ 69: 'wide_hands_push_up',
+ 70: 'weighted_wide_hands_push_up',
+ 71: 'parallette_handstand_push_up',
+ 72: 'weighted_parallette_handstand_push_up',
+ 73: 'ring_handstand_push_up',
+ 74: 'weighted_ring_handstand_push_up',
+ 75: 'ring_push_up',
+ 76: 'weighted_ring_push_up',
+ 77: 'push_up',
+ 78: 'pilates_pushup',
+ },
+ ),
+ 'pwr_zone_calc': FieldType(
+ name='pwr_zone_calc',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'custom',
+ 1: 'percent_ftp',
+ },
+ ),
+ 'rider_position_type': FieldType(
+ name='rider_position_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'seated',
+ 1: 'standing',
+ 2: 'transition_to_seated',
+ 3: 'transition_to_standing',
+ },
+ ),
+ 'row_exercise_name': FieldType(
+ name='row_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'barbell_straight_leg_deadlift_to_row',
+ 1: 'cable_row_standing',
+ 2: 'dumbbell_row',
+ 3: 'elevated_feet_inverted_row',
+ 4: 'weighted_elevated_feet_inverted_row',
+ 5: 'face_pull',
+ 6: 'face_pull_with_external_rotation',
+ 7: 'inverted_row_with_feet_on_swiss_ball',
+ 8: 'weighted_inverted_row_with_feet_on_swiss_ball',
+ 9: 'kettlebell_row',
+ 10: 'modified_inverted_row',
+ 11: 'weighted_modified_inverted_row',
+ 12: 'neutral_grip_alternating_dumbbell_row',
+ 13: 'one_arm_bent_over_row',
+ 14: 'one_legged_dumbbell_row',
+ 15: 'renegade_row',
+ 16: 'reverse_grip_barbell_row',
+ 17: 'rope_handle_cable_row',
+ 18: 'seated_cable_row',
+ 19: 'seated_dumbbell_row',
+ 20: 'single_arm_cable_row',
+ 21: 'single_arm_cable_row_and_rotation',
+ 22: 'single_arm_inverted_row',
+ 23: 'weighted_single_arm_inverted_row',
+ 24: 'single_arm_neutral_grip_dumbbell_row',
+ 25: 'single_arm_neutral_grip_dumbbell_row_and_rotation',
+ 26: 'suspended_inverted_row',
+ 27: 'weighted_suspended_inverted_row',
+ 28: 't_bar_row',
+ 29: 'towel_grip_inverted_row',
+ 30: 'weighted_towel_grip_inverted_row',
+ 31: 'underhand_grip_cable_row',
+ 32: 'v_grip_cable_row',
+ 33: 'wide_grip_seated_cable_row',
+ },
+ ),
+ 'run_exercise_name': FieldType(
+ name='run_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'run',
+ 1: 'walk',
+ 2: 'jog',
+ 3: 'sprint',
+ },
+ ),
+ 'schedule': FieldType(
+ name='schedule',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'workout',
+ 1: 'course',
+ },
+ ),
+ 'segment_delete_status': FieldType(
+ name='segment_delete_status',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'do_not_delete',
+ 1: 'delete_one',
+ 2: 'delete_all',
+ },
+ ),
+ 'segment_lap_status': FieldType(
+ name='segment_lap_status',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'end',
+ 1: 'fail',
+ },
+ ),
+ 'segment_leaderboard_type': FieldType(
+ name='segment_leaderboard_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'overall',
+ 1: 'personal_best',
+ 2: 'connections',
+ 3: 'group',
+ 4: 'challenger',
+ 5: 'kom',
+ 6: 'qom',
+ 7: 'pr',
+ 8: 'goal',
+ 9: 'rival',
+ 10: 'club_leader',
+ },
+ ),
+ 'segment_selection_type': FieldType(
+ name='segment_selection_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'starred',
+ 1: 'suggested',
+ },
+ ),
+ 'sensor_type': FieldType(
+ name='sensor_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'accelerometer',
+ 1: 'gyroscope',
+ 2: 'compass', # Magnetometer
+ 3: 'barometer',
+ },
+ ),
+ 'session_trigger': FieldType(
+ name='session_trigger',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'activity_end',
+ 1: 'manual', # User changed sport.
+ 2: 'auto_multi_sport', # Auto multi-sport feature is enabled and user pressed lap button to advance session.
+ 3: 'fitness_equipment', # Auto sport change caused by user linking to fitness equipment.
+ },
+ ),
+ 'set_type': FieldType(
+ name='set_type',
+ base_type=BASE_TYPES[0x02], # uint8
+ values={
+ 0: 'rest',
+ 1: 'active',
+ },
+ ),
+ 'shoulder_press_exercise_name': FieldType(
+ name='shoulder_press_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'alternating_dumbbell_shoulder_press',
+ 1: 'arnold_press',
+ 2: 'barbell_front_squat_to_push_press',
+ 3: 'barbell_push_press',
+ 4: 'barbell_shoulder_press',
+ 5: 'dead_curl_press',
+ 6: 'dumbbell_alternating_shoulder_press_and_twist',
+ 7: 'dumbbell_hammer_curl_to_lunge_to_press',
+ 8: 'dumbbell_push_press',
+ 9: 'floor_inverted_shoulder_press',
+ 10: 'weighted_floor_inverted_shoulder_press',
+ 11: 'inverted_shoulder_press',
+ 12: 'weighted_inverted_shoulder_press',
+ 13: 'one_arm_push_press',
+ 14: 'overhead_barbell_press',
+ 15: 'overhead_dumbbell_press',
+ 16: 'seated_barbell_shoulder_press',
+ 17: 'seated_dumbbell_shoulder_press',
+ 18: 'single_arm_dumbbell_shoulder_press',
+ 19: 'single_arm_step_up_and_press',
+ 20: 'smith_machine_overhead_press',
+ 21: 'split_stance_hammer_curl_to_press',
+ 22: 'swiss_ball_dumbbell_shoulder_press',
+ 23: 'weight_plate_front_raise',
+ },
+ ),
+ 'shoulder_stability_exercise_name': FieldType(
+ name='shoulder_stability_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: '90_degree_cable_external_rotation',
+ 1: 'band_external_rotation',
+ 2: 'band_internal_rotation',
+ 3: 'bent_arm_lateral_raise_and_external_rotation',
+ 4: 'cable_external_rotation',
+ 5: 'dumbbell_face_pull_with_external_rotation',
+ 6: 'floor_i_raise',
+ 7: 'weighted_floor_i_raise',
+ 8: 'floor_t_raise',
+ 9: 'weighted_floor_t_raise',
+ 10: 'floor_y_raise',
+ 11: 'weighted_floor_y_raise',
+ 12: 'incline_i_raise',
+ 13: 'weighted_incline_i_raise',
+ 14: 'incline_l_raise',
+ 15: 'weighted_incline_l_raise',
+ 16: 'incline_t_raise',
+ 17: 'weighted_incline_t_raise',
+ 18: 'incline_w_raise',
+ 19: 'weighted_incline_w_raise',
+ 20: 'incline_y_raise',
+ 21: 'weighted_incline_y_raise',
+ 22: 'lying_external_rotation',
+ 23: 'seated_dumbbell_external_rotation',
+ 24: 'standing_l_raise',
+ 25: 'swiss_ball_i_raise',
+ 26: 'weighted_swiss_ball_i_raise',
+ 27: 'swiss_ball_t_raise',
+ 28: 'weighted_swiss_ball_t_raise',
+ 29: 'swiss_ball_w_raise',
+ 30: 'weighted_swiss_ball_w_raise',
+ 31: 'swiss_ball_y_raise',
+ 32: 'weighted_swiss_ball_y_raise',
+ },
+ ),
+ 'shrug_exercise_name': FieldType(
+ name='shrug_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'barbell_jump_shrug',
+ 1: 'barbell_shrug',
+ 2: 'barbell_upright_row',
+ 3: 'behind_the_back_smith_machine_shrug',
+ 4: 'dumbbell_jump_shrug',
+ 5: 'dumbbell_shrug',
+ 6: 'dumbbell_upright_row',
+ 7: 'incline_dumbbell_shrug',
+ 8: 'overhead_barbell_shrug',
+ 9: 'overhead_dumbbell_shrug',
+ 10: 'scaption_and_shrug',
+ 11: 'scapular_retraction',
+ 12: 'serratus_chair_shrug',
+ 13: 'weighted_serratus_chair_shrug',
+ 14: 'serratus_shrug',
+ 15: 'weighted_serratus_shrug',
+ 16: 'wide_grip_jump_shrug',
+ },
+ ),
+ 'side': FieldType(
+ name='side',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'right',
+ 1: 'left',
+ },
+ ),
+ 'sit_up_exercise_name': FieldType(
+ name='sit_up_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'alternating_sit_up',
+ 1: 'weighted_alternating_sit_up',
+ 2: 'bent_knee_v_up',
+ 3: 'weighted_bent_knee_v_up',
+ 4: 'butterfly_sit_up',
+ 5: 'weighted_butterfly_situp',
+ 6: 'cross_punch_roll_up',
+ 7: 'weighted_cross_punch_roll_up',
+ 8: 'crossed_arms_sit_up',
+ 9: 'weighted_crossed_arms_sit_up',
+ 10: 'get_up_sit_up',
+ 11: 'weighted_get_up_sit_up',
+ 12: 'hovering_sit_up',
+ 13: 'weighted_hovering_sit_up',
+ 14: 'kettlebell_sit_up',
+ 15: 'medicine_ball_alternating_v_up',
+ 16: 'medicine_ball_sit_up',
+ 17: 'medicine_ball_v_up',
+ 18: 'modified_sit_up',
+ 19: 'negative_sit_up',
+ 20: 'one_arm_full_sit_up',
+ 21: 'reclining_circle',
+ 22: 'weighted_reclining_circle',
+ 23: 'reverse_curl_up',
+ 24: 'weighted_reverse_curl_up',
+ 25: 'single_leg_swiss_ball_jackknife',
+ 26: 'weighted_single_leg_swiss_ball_jackknife',
+ 27: 'the_teaser',
+ 28: 'the_teaser_weighted',
+ 29: 'three_part_roll_down',
+ 30: 'weighted_three_part_roll_down',
+ 31: 'v_up',
+ 32: 'weighted_v_up',
+ 33: 'weighted_russian_twist_on_swiss_ball',
+ 34: 'weighted_sit_up',
+ 35: 'x_abs',
+ 36: 'weighted_x_abs',
+ 37: 'sit_up',
+ },
+ ),
+ 'source_type': FieldType(
+ name='source_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'ant', # External device connected with ANT
+ 1: 'antplus', # External device connected with ANT+
+ 2: 'bluetooth', # External device connected with BT
+ 3: 'bluetooth_low_energy', # External device connected with BLE
+ 4: 'wifi', # External device connected with Wifi
+ 5: 'local', # Onboard device
+ },
+ ),
+ 'sport': FieldType(
+ name='sport',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'generic',
+ 1: 'running',
+ 2: 'cycling',
+ 3: 'transition', # Mulitsport transition
+ 4: 'fitness_equipment',
+ 5: 'swimming',
+ 6: 'basketball',
+ 7: 'soccer',
+ 8: 'tennis',
+ 9: 'american_football',
+ 10: 'training',
+ 11: 'walking',
+ 12: 'cross_country_skiing',
+ 13: 'alpine_skiing',
+ 14: 'snowboarding',
+ 15: 'rowing',
+ 16: 'mountaineering',
+ 17: 'hiking',
+ 18: 'multisport',
+ 19: 'paddling',
+ 20: 'flying',
+ 21: 'e_biking',
+ 22: 'motorcycling',
+ 23: 'boating',
+ 24: 'driving',
+ 25: 'golf',
+ 26: 'hang_gliding',
+ 27: 'horseback_riding',
+ 28: 'hunting',
+ 29: 'fishing',
+ 30: 'inline_skating',
+ 31: 'rock_climbing',
+ 32: 'sailing',
+ 33: 'ice_skating',
+ 34: 'sky_diving',
+ 35: 'snowshoeing',
+ 36: 'snowmobiling',
+ 37: 'stand_up_paddleboarding',
+ 38: 'surfing',
+ 39: 'wakeboarding',
+ 40: 'water_skiing',
+ 41: 'kayaking',
+ 42: 'rafting',
+ 43: 'windsurfing',
+ 44: 'kitesurfing',
+ 45: 'tactical',
+ 46: 'jumpmaster',
+ 47: 'boxing',
+ 48: 'floor_climbing',
+ 254: 'all', # All is for goals only to include all sports.
+ },
+ ),
+ 'sport_bits_0': FieldType( # Bit field corresponding to sport enum type (1 << sport).
+ name='sport_bits_0',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'generic',
+ 0x02: 'running',
+ 0x04: 'cycling',
+ 0x08: 'transition', # Mulitsport transition
+ 0x10: 'fitness_equipment',
+ 0x20: 'swimming',
+ 0x40: 'basketball',
+ 0x80: 'soccer',
+ },
+ ),
+ 'sport_bits_1': FieldType( # Bit field corresponding to sport enum type (1 << (sport-8)).
+ name='sport_bits_1',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'tennis',
+ 0x02: 'american_football',
+ 0x04: 'training',
+ 0x08: 'walking',
+ 0x10: 'cross_country_skiing',
+ 0x20: 'alpine_skiing',
+ 0x40: 'snowboarding',
+ 0x80: 'rowing',
+ },
+ ),
+ 'sport_bits_2': FieldType( # Bit field corresponding to sport enum type (1 << (sport-16)).
+ name='sport_bits_2',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'mountaineering',
+ 0x02: 'hiking',
+ 0x04: 'multisport',
+ 0x08: 'paddling',
+ 0x10: 'flying',
+ 0x20: 'e_biking',
+ 0x40: 'motorcycling',
+ 0x80: 'boating',
+ },
+ ),
+ 'sport_bits_3': FieldType( # Bit field corresponding to sport enum type (1 << (sport-24)).
+ name='sport_bits_3',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'driving',
+ 0x02: 'golf',
+ 0x04: 'hang_gliding',
+ 0x08: 'horseback_riding',
+ 0x10: 'hunting',
+ 0x20: 'fishing',
+ 0x40: 'inline_skating',
+ 0x80: 'rock_climbing',
+ },
+ ),
+ 'sport_bits_4': FieldType( # Bit field corresponding to sport enum type (1 << (sport-32)).
+ name='sport_bits_4',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'sailing',
+ 0x02: 'ice_skating',
+ 0x04: 'sky_diving',
+ 0x08: 'snowshoeing',
+ 0x10: 'snowmobiling',
+ 0x20: 'stand_up_paddleboarding',
+ 0x40: 'surfing',
+ 0x80: 'wakeboarding',
+ },
+ ),
+ 'sport_bits_5': FieldType( # Bit field corresponding to sport enum type (1 << (sport-40)).
+ name='sport_bits_5',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'water_skiing',
+ 0x02: 'kayaking',
+ 0x04: 'rafting',
+ 0x08: 'windsurfing',
+ 0x10: 'kitesurfing',
+ 0x20: 'tactical',
+ 0x40: 'jumpmaster',
+ 0x80: 'boxing',
+ },
+ ),
+ 'sport_bits_6': FieldType( # Bit field corresponding to sport enum type (1 << (sport-48)).
+ name='sport_bits_6',
+ base_type=BASE_TYPES[0x0A], # uint8z
+ values={
+ 0x01: 'floor_climbing',
+ },
+ ),
+ 'sport_event': FieldType(
+ name='sport_event',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'uncategorized',
+ 1: 'geocaching',
+ 2: 'fitness',
+ 3: 'recreation',
+ 4: 'race',
+ 5: 'special_event',
+ 6: 'training',
+ 7: 'transportation',
+ 8: 'touring',
+ },
+ ),
+ 'squat_exercise_name': FieldType(
+ name='squat_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'leg_press',
+ 1: 'back_squat_with_body_bar',
+ 2: 'back_squats',
+ 3: 'weighted_back_squats',
+ 4: 'balancing_squat',
+ 5: 'weighted_balancing_squat',
+ 6: 'barbell_back_squat',
+ 7: 'barbell_box_squat',
+ 8: 'barbell_front_squat',
+ 9: 'barbell_hack_squat',
+ 10: 'barbell_hang_squat_snatch',
+ 11: 'barbell_lateral_step_up',
+ 12: 'barbell_quarter_squat',
+ 13: 'barbell_siff_squat',
+ 14: 'barbell_squat_snatch',
+ 15: 'barbell_squat_with_heels_raised',
+ 16: 'barbell_stepover',
+ 17: 'barbell_step_up',
+ 18: 'bench_squat_with_rotational_chop',
+ 19: 'weighted_bench_squat_with_rotational_chop',
+ 20: 'body_weight_wall_squat',
+ 21: 'weighted_wall_squat',
+ 22: 'box_step_squat',
+ 23: 'weighted_box_step_squat',
+ 24: 'braced_squat',
+ 25: 'crossed_arm_barbell_front_squat',
+ 26: 'crossover_dumbbell_step_up',
+ 27: 'dumbbell_front_squat',
+ 28: 'dumbbell_split_squat',
+ 29: 'dumbbell_squat',
+ 30: 'dumbbell_squat_clean',
+ 31: 'dumbbell_stepover',
+ 32: 'dumbbell_step_up',
+ 33: 'elevated_single_leg_squat',
+ 34: 'weighted_elevated_single_leg_squat',
+ 35: 'figure_four_squats',
+ 36: 'weighted_figure_four_squats',
+ 37: 'goblet_squat',
+ 38: 'kettlebell_squat',
+ 39: 'kettlebell_swing_overhead',
+ 40: 'kettlebell_swing_with_flip_to_squat',
+ 41: 'lateral_dumbbell_step_up',
+ 42: 'one_legged_squat',
+ 43: 'overhead_dumbbell_squat',
+ 44: 'overhead_squat',
+ 45: 'partial_single_leg_squat',
+ 46: 'weighted_partial_single_leg_squat',
+ 47: 'pistol_squat',
+ 48: 'weighted_pistol_squat',
+ 49: 'plie_slides',
+ 50: 'weighted_plie_slides',
+ 51: 'plie_squat',
+ 52: 'weighted_plie_squat',
+ 53: 'prisoner_squat',
+ 54: 'weighted_prisoner_squat',
+ 55: 'single_leg_bench_get_up',
+ 56: 'weighted_single_leg_bench_get_up',
+ 57: 'single_leg_bench_squat',
+ 58: 'weighted_single_leg_bench_squat',
+ 59: 'single_leg_squat_on_swiss_ball',
+ 60: 'weighted_single_leg_squat_on_swiss_ball',
+ 61: 'squat',
+ 62: 'weighted_squat',
+ 63: 'squats_with_band',
+ 64: 'staggered_squat',
+ 65: 'weighted_staggered_squat',
+ 66: 'step_up',
+ 67: 'weighted_step_up',
+ 68: 'suitcase_squats',
+ 69: 'sumo_squat',
+ 70: 'sumo_squat_slide_in',
+ 71: 'weighted_sumo_squat_slide_in',
+ 72: 'sumo_squat_to_high_pull',
+ 73: 'sumo_squat_to_stand',
+ 74: 'weighted_sumo_squat_to_stand',
+ 75: 'sumo_squat_with_rotation',
+ 76: 'weighted_sumo_squat_with_rotation',
+ 77: 'swiss_ball_body_weight_wall_squat',
+ 78: 'weighted_swiss_ball_wall_squat',
+ 79: 'thrusters',
+ 80: 'uneven_squat',
+ 81: 'weighted_uneven_squat',
+ 82: 'waist_slimming_squat',
+ 83: 'wall_ball',
+ 84: 'wide_stance_barbell_squat',
+ 85: 'wide_stance_goblet_squat',
+ 86: 'zercher_squat',
+ 87: 'kbs_overhead',
+ 88: 'squat_and_side_kick',
+ 89: 'squat_jumps_in_n_out',
+ 90: 'pilates_plie_squats_parallel_turned_out_flat_and_heels',
+ 91: 'releve_straight_leg_and_knee_bent_with_one_leg_variation',
+ },
+ ),
+ 'stroke_type': FieldType(
+ name='stroke_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'no_event',
+ 1: 'other', # stroke was detected but cannot be identified
+ 2: 'serve',
+ 3: 'forehand',
+ 4: 'backhand',
+ 5: 'smash',
+ },
+ ),
+ 'sub_sport': FieldType(
+ name='sub_sport',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'generic',
+ 1: 'treadmill', # Run/Fitness Equipment
+ 2: 'street', # Run
+ 3: 'trail', # Run
+ 4: 'track', # Run
+ 5: 'spin', # Cycling
+ 6: 'indoor_cycling', # Cycling/Fitness Equipment
+ 7: 'road', # Cycling
+ 8: 'mountain', # Cycling
+ 9: 'downhill', # Cycling
+ 10: 'recumbent', # Cycling
+ 11: 'cyclocross', # Cycling
+ 12: 'hand_cycling', # Cycling
+ 13: 'track_cycling', # Cycling
+ 14: 'indoor_rowing', # Fitness Equipment
+ 15: 'elliptical', # Fitness Equipment
+ 16: 'stair_climbing', # Fitness Equipment
+ 17: 'lap_swimming', # Swimming
+ 18: 'open_water', # Swimming
+ 19: 'flexibility_training', # Training
+ 20: 'strength_training', # Training
+ 21: 'warm_up', # Tennis
+ 22: 'match', # Tennis
+ 23: 'exercise', # Tennis
+ 24: 'challenge',
+ 25: 'indoor_skiing', # Fitness Equipment
+ 26: 'cardio_training', # Training
+ 27: 'indoor_walking', # Walking/Fitness Equipment
+ 28: 'e_bike_fitness', # E-Biking
+ 29: 'bmx', # Cycling
+ 30: 'casual_walking', # Walking
+ 31: 'speed_walking', # Walking
+ 32: 'bike_to_run_transition', # Transition
+ 33: 'run_to_bike_transition', # Transition
+ 34: 'swim_to_bike_transition', # Transition
+ 35: 'atv', # Motorcycling
+ 36: 'motocross', # Motorcycling
+ 37: 'backcountry', # Alpine Skiing/Snowboarding
+ 38: 'resort', # Alpine Skiing/Snowboarding
+ 39: 'rc_drone', # Flying
+ 40: 'wingsuit', # Flying
+ 41: 'whitewater', # Kayaking/Rafting
+ 42: 'skate_skiing', # Cross Country Skiing
+ 43: 'yoga', # Training
+ 44: 'pilates', # Fitness Equipment
+ 45: 'indoor_running', # Run
+ 46: 'gravel_cycling', # Cycling
+ 47: 'e_bike_mountain', # Cycling
+ 48: 'commuting', # Cycling
+ 49: 'mixed_surface', # Cycling
+ 50: 'navigate',
+ 51: 'track_me',
+ 52: 'map',
+ 53: 'single_gas_diving', # Diving
+ 54: 'multi_gas_diving', # Diving
+ 55: 'gauge_diving', # Diving
+ 56: 'apnea_diving', # Diving
+ 57: 'apnea_hunting', # Diving
+ 58: 'virtual_activity',
+ 59: 'obstacle', # Used for events where participants run, crawl through mud, climb over walls, etc.
+ 254: 'all',
+ },
+ ),
+ 'supported_exd_screen_layouts': FieldType(
+ name='supported_exd_screen_layouts',
+ base_type=BASE_TYPES[0x8C], # uint32z
+ values={
+ 0x00000001: 'full_screen',
+ 0x00000002: 'half_vertical',
+ 0x00000004: 'half_horizontal',
+ 0x00000008: 'half_vertical_right_split',
+ 0x00000010: 'half_horizontal_bottom_split',
+ 0x00000020: 'full_quarter_split',
+ 0x00000040: 'half_vertical_left_split',
+ 0x00000080: 'half_horizontal_top_split',
+ },
+ ),
+ 'swim_stroke': FieldType(
+ name='swim_stroke',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'freestyle',
+ 1: 'backstroke',
+ 2: 'breaststroke',
+ 3: 'butterfly',
+ 4: 'drill',
+ 5: 'mixed',
+ 6: 'im', # IM is a mixed interval containing the same number of lengths for each of: Butterfly, Backstroke, Breaststroke, Freestyle, swam in that order.
+ },
+ ),
+ 'switch': FieldType(
+ name='switch',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'off',
+ 1: 'on',
+ 2: 'auto',
+ },
+ ),
+ 'time_into_day': FieldType( # number of seconds into the day since 00:00:00 UTC
+ name='time_into_day',
+ base_type=BASE_TYPES[0x86], # uint32
+ ),
+ 'time_mode': FieldType(
+ name='time_mode',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'hour12',
+ 1: 'hour24', # Does not use a leading zero and has a colon
+ 2: 'military', # Uses a leading zero and does not have a colon
+ 3: 'hour_12_with_seconds',
+ 4: 'hour_24_with_seconds',
+ 5: 'utc',
+ },
+ ),
+ 'time_zone': FieldType(
+ name='time_zone',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'almaty',
+ 1: 'bangkok',
+ 2: 'bombay',
+ 3: 'brasilia',
+ 4: 'cairo',
+ 5: 'cape_verde_is',
+ 6: 'darwin',
+ 7: 'eniwetok',
+ 8: 'fiji',
+ 9: 'hong_kong',
+ 10: 'islamabad',
+ 11: 'kabul',
+ 12: 'magadan',
+ 13: 'mid_atlantic',
+ 14: 'moscow',
+ 15: 'muscat',
+ 16: 'newfoundland',
+ 17: 'samoa',
+ 18: 'sydney',
+ 19: 'tehran',
+ 20: 'tokyo',
+ 21: 'us_alaska',
+ 22: 'us_atlantic',
+ 23: 'us_central',
+ 24: 'us_eastern',
+ 25: 'us_hawaii',
+ 26: 'us_mountain',
+ 27: 'us_pacific',
+ 28: 'other',
+ 29: 'auckland',
+ 30: 'kathmandu',
+ 31: 'europe_western_wet',
+ 32: 'europe_central_cet',
+ 33: 'europe_eastern_eet',
+ 34: 'jakarta',
+ 35: 'perth',
+ 36: 'adelaide',
+ 37: 'brisbane',
+ 38: 'tasmania',
+ 39: 'iceland',
+ 40: 'amsterdam',
+ 41: 'athens',
+ 42: 'barcelona',
+ 43: 'berlin',
+ 44: 'brussels',
+ 45: 'budapest',
+ 46: 'copenhagen',
+ 47: 'dublin',
+ 48: 'helsinki',
+ 49: 'lisbon',
+ 50: 'london',
+ 51: 'madrid',
+ 52: 'munich',
+ 53: 'oslo',
+ 54: 'paris',
+ 55: 'prague',
+ 56: 'reykjavik',
+ 57: 'rome',
+ 58: 'stockholm',
+ 59: 'vienna',
+ 60: 'warsaw',
+ 61: 'zurich',
+ 62: 'quebec',
+ 63: 'ontario',
+ 64: 'manitoba',
+ 65: 'saskatchewan',
+ 66: 'alberta',
+ 67: 'british_columbia',
+ 68: 'boise',
+ 69: 'boston',
+ 70: 'chicago',
+ 71: 'dallas',
+ 72: 'denver',
+ 73: 'kansas_city',
+ 74: 'las_vegas',
+ 75: 'los_angeles',
+ 76: 'miami',
+ 77: 'minneapolis',
+ 78: 'new_york',
+ 79: 'new_orleans',
+ 80: 'phoenix',
+ 81: 'santa_fe',
+ 82: 'seattle',
+ 83: 'washington_dc',
+ 84: 'us_arizona',
+ 85: 'chita',
+ 86: 'ekaterinburg',
+ 87: 'irkutsk',
+ 88: 'kaliningrad',
+ 89: 'krasnoyarsk',
+ 90: 'novosibirsk',
+ 91: 'petropavlovsk_kamchatskiy',
+ 92: 'samara',
+ 93: 'vladivostok',
+ 94: 'mexico_central',
+ 95: 'mexico_mountain',
+ 96: 'mexico_pacific',
+ 97: 'cape_town',
+ 98: 'winkhoek',
+ 99: 'lagos',
+ 100: 'riyahd',
+ 101: 'venezuela',
+ 102: 'australia_lh',
+ 103: 'santiago',
+ 253: 'manual',
+ 254: 'automatic',
+ },
+ ),
+ 'timer_trigger': FieldType( # timer event data
+ name='timer_trigger',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'manual',
+ 1: 'auto',
+ 2: 'fitness_equipment',
+ },
+ ),
+ 'tissue_model_type': FieldType(
+ name='tissue_model_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'zhl_16c', # Buhlmann's decompression algorithm, version C
+ },
+ ),
+ 'tone': FieldType(
+ name='tone',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'off',
+ 1: 'tone',
+ 2: 'vibrate',
+ 3: 'tone_and_vibrate',
+ },
+ ),
+ 'total_body_exercise_name': FieldType(
+ name='total_body_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'burpee',
+ 1: 'weighted_burpee',
+ 2: 'burpee_box_jump',
+ 3: 'weighted_burpee_box_jump',
+ 4: 'high_pull_burpee',
+ 5: 'man_makers',
+ 6: 'one_arm_burpee',
+ 7: 'squat_thrusts',
+ 8: 'weighted_squat_thrusts',
+ 9: 'squat_plank_push_up',
+ 10: 'weighted_squat_plank_push_up',
+ 11: 'standing_t_rotation_balance',
+ 12: 'weighted_standing_t_rotation_balance',
+ },
+ ),
+ 'triceps_extension_exercise_name': FieldType(
+ name='triceps_extension_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'bench_dip',
+ 1: 'weighted_bench_dip',
+ 2: 'body_weight_dip',
+ 3: 'cable_kickback',
+ 4: 'cable_lying_triceps_extension',
+ 5: 'cable_overhead_triceps_extension',
+ 6: 'dumbbell_kickback',
+ 7: 'dumbbell_lying_triceps_extension',
+ 8: 'ez_bar_overhead_triceps_extension',
+ 9: 'incline_dip',
+ 10: 'weighted_incline_dip',
+ 11: 'incline_ez_bar_lying_triceps_extension',
+ 12: 'lying_dumbbell_pullover_to_extension',
+ 13: 'lying_ez_bar_triceps_extension',
+ 14: 'lying_triceps_extension_to_close_grip_bench_press',
+ 15: 'overhead_dumbbell_triceps_extension',
+ 16: 'reclining_triceps_press',
+ 17: 'reverse_grip_pressdown',
+ 18: 'reverse_grip_triceps_pressdown',
+ 19: 'rope_pressdown',
+ 20: 'seated_barbell_overhead_triceps_extension',
+ 21: 'seated_dumbbell_overhead_triceps_extension',
+ 22: 'seated_ez_bar_overhead_triceps_extension',
+ 23: 'seated_single_arm_overhead_dumbbell_extension',
+ 24: 'single_arm_dumbbell_overhead_triceps_extension',
+ 25: 'single_dumbbell_seated_overhead_triceps_extension',
+ 26: 'single_leg_bench_dip_and_kick',
+ 27: 'weighted_single_leg_bench_dip_and_kick',
+ 28: 'single_leg_dip',
+ 29: 'weighted_single_leg_dip',
+ 30: 'static_lying_triceps_extension',
+ 31: 'suspended_dip',
+ 32: 'weighted_suspended_dip',
+ 33: 'swiss_ball_dumbbell_lying_triceps_extension',
+ 34: 'swiss_ball_ez_bar_lying_triceps_extension',
+ 35: 'swiss_ball_ez_bar_overhead_triceps_extension',
+ 36: 'tabletop_dip',
+ 37: 'weighted_tabletop_dip',
+ 38: 'triceps_extension_on_floor',
+ 39: 'triceps_pressdown',
+ 40: 'weighted_dip',
+ },
+ ),
+ 'turn_type': FieldType(
+ name='turn_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'arriving_idx',
+ 1: 'arriving_left_idx',
+ 2: 'arriving_right_idx',
+ 3: 'arriving_via_idx',
+ 4: 'arriving_via_left_idx',
+ 5: 'arriving_via_right_idx',
+ 6: 'bear_keep_left_idx',
+ 7: 'bear_keep_right_idx',
+ 8: 'continue_idx',
+ 9: 'exit_left_idx',
+ 10: 'exit_right_idx',
+ 11: 'ferry_idx',
+ 12: 'roundabout_45_idx',
+ 13: 'roundabout_90_idx',
+ 14: 'roundabout_135_idx',
+ 15: 'roundabout_180_idx',
+ 16: 'roundabout_225_idx',
+ 17: 'roundabout_270_idx',
+ 18: 'roundabout_315_idx',
+ 19: 'roundabout_360_idx',
+ 20: 'roundabout_neg_45_idx',
+ 21: 'roundabout_neg_90_idx',
+ 22: 'roundabout_neg_135_idx',
+ 23: 'roundabout_neg_180_idx',
+ 24: 'roundabout_neg_225_idx',
+ 25: 'roundabout_neg_270_idx',
+ 26: 'roundabout_neg_315_idx',
+ 27: 'roundabout_neg_360_idx',
+ 28: 'roundabout_generic_idx',
+ 29: 'roundabout_neg_generic_idx',
+ 30: 'sharp_turn_left_idx',
+ 31: 'sharp_turn_right_idx',
+ 32: 'turn_left_idx',
+ 33: 'turn_right_idx',
+ 34: 'uturn_left_idx',
+ 35: 'uturn_right_idx',
+ 36: 'icon_inv_idx',
+ 37: 'icon_idx_cnt',
+ },
+ ),
+ 'user_local_id': FieldType(
+ name='user_local_id',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0x0000: 'local_min',
+ 0x000F: 'local_max',
+ 0x0010: 'stationary_min',
+ 0x00FF: 'stationary_max',
+ 0x0100: 'portable_min',
+ 0xFFFE: 'portable_max',
+ },
+ ),
+ 'warm_up_exercise_name': FieldType(
+ name='warm_up_exercise_name',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0: 'quadruped_rocking',
+ 1: 'neck_tilts',
+ 2: 'ankle_circles',
+ 3: 'ankle_dorsiflexion_with_band',
+ 4: 'ankle_internal_rotation',
+ 5: 'arm_circles',
+ 6: 'bent_over_reach_to_sky',
+ 7: 'cat_camel',
+ 8: 'elbow_to_foot_lunge',
+ 9: 'forward_and_backward_leg_swings',
+ 10: 'groiners',
+ 11: 'inverted_hamstring_stretch',
+ 12: 'lateral_duck_under',
+ 13: 'neck_rotations',
+ 14: 'opposite_arm_and_leg_balance',
+ 15: 'reach_roll_and_lift',
+ 16: 'scorpion',
+ 17: 'shoulder_circles',
+ 18: 'side_to_side_leg_swings',
+ 19: 'sleeper_stretch',
+ 20: 'slide_out',
+ 21: 'swiss_ball_hip_crossover',
+ 22: 'swiss_ball_reach_roll_and_lift',
+ 23: 'swiss_ball_windshield_wipers',
+ 24: 'thoracic_rotation',
+ 25: 'walking_high_kicks',
+ 26: 'walking_high_knees',
+ 27: 'walking_knee_hugs',
+ 28: 'walking_leg_cradles',
+ 29: 'walkout',
+ 30: 'walkout_from_push_up_position',
+ },
+ ),
+ 'watchface_mode': FieldType(
+ name='watchface_mode',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'digital',
+ 1: 'analog',
+ 2: 'connect_iq',
+ 3: 'disabled',
+ },
+ ),
+ 'water_type': FieldType(
+ name='water_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'fresh',
+ 1: 'salt',
+ 2: 'en13319',
+ 3: 'custom',
+ },
+ ),
+ 'weather_report': FieldType(
+ name='weather_report',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'current',
+ 1: 'forecast', # Deprecated use hourly_forecast instead
+ 1: 'hourly_forecast',
+ 2: 'daily_forecast',
+ },
+ ),
+ 'weather_severe_type': FieldType(
+ name='weather_severe_type',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'unspecified',
+ 1: 'tornado',
+ 2: 'tsunami',
+ 3: 'hurricane',
+ 4: 'extreme_wind',
+ 5: 'typhoon',
+ 6: 'inland_hurricane',
+ 7: 'hurricane_force_wind',
+ 8: 'waterspout',
+ 9: 'severe_thunderstorm',
+ 10: 'wreckhouse_winds',
+ 11: 'les_suetes_wind',
+ 12: 'avalanche',
+ 13: 'flash_flood',
+ 14: 'tropical_storm',
+ 15: 'inland_tropical_storm',
+ 16: 'blizzard',
+ 17: 'ice_storm',
+ 18: 'freezing_rain',
+ 19: 'debris_flow',
+ 20: 'flash_freeze',
+ 21: 'dust_storm',
+ 22: 'high_wind',
+ 23: 'winter_storm',
+ 24: 'heavy_freezing_spray',
+ 25: 'extreme_cold',
+ 26: 'wind_chill',
+ 27: 'cold_wave',
+ 28: 'heavy_snow_alert',
+ 29: 'lake_effect_blowing_snow',
+ 30: 'snow_squall',
+ 31: 'lake_effect_snow',
+ 32: 'winter_weather',
+ 33: 'sleet',
+ 34: 'snowfall',
+ 35: 'snow_and_blowing_snow',
+ 36: 'blowing_snow',
+ 37: 'snow_alert',
+ 38: 'arctic_outflow',
+ 39: 'freezing_drizzle',
+ 40: 'storm',
+ 41: 'storm_surge',
+ 42: 'rainfall',
+ 43: 'areal_flood',
+ 44: 'coastal_flood',
+ 45: 'lakeshore_flood',
+ 46: 'excessive_heat',
+ 47: 'heat',
+ 48: 'weather',
+ 49: 'high_heat_and_humidity',
+ 50: 'humidex_and_health',
+ 51: 'humidex',
+ 52: 'gale',
+ 53: 'freezing_spray',
+ 54: 'special_marine',
+ 55: 'squall',
+ 56: 'strong_wind',
+ 57: 'lake_wind',
+ 58: 'marine_weather',
+ 59: 'wind',
+ 60: 'small_craft_hazardous_seas',
+ 61: 'hazardous_seas',
+ 62: 'small_craft',
+ 63: 'small_craft_winds',
+ 64: 'small_craft_rough_bar',
+ 65: 'high_water_level',
+ 66: 'ashfall',
+ 67: 'freezing_fog',
+ 68: 'dense_fog',
+ 69: 'dense_smoke',
+ 70: 'blowing_dust',
+ 71: 'hard_freeze',
+ 72: 'freeze',
+ 73: 'frost',
+ 74: 'fire_weather',
+ 75: 'flood',
+ 76: 'rip_tide',
+ 77: 'high_surf',
+ 78: 'smog',
+ 79: 'air_quality',
+ 80: 'brisk_wind',
+ 81: 'air_stagnation',
+ 82: 'low_water',
+ 83: 'hydrological',
+ 84: 'special_weather',
+ },
+ ),
+ 'weather_severity': FieldType(
+ name='weather_severity',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'unknown',
+ 1: 'warning',
+ 2: 'watch',
+ 3: 'advisory',
+ 4: 'statement',
+ },
+ ),
+ 'weather_status': FieldType(
+ name='weather_status',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'clear',
+ 1: 'partly_cloudy',
+ 2: 'mostly_cloudy',
+ 3: 'rain',
+ 4: 'snow',
+ 5: 'windy',
+ 6: 'thunderstorms',
+ 7: 'wintry_mix',
+ 8: 'fog',
+ 11: 'hazy',
+ 12: 'hail',
+ 13: 'scattered_showers',
+ 14: 'scattered_thunderstorms',
+ 15: 'unknown_precipitation',
+ 16: 'light_rain',
+ 17: 'heavy_rain',
+ 18: 'light_snow',
+ 19: 'heavy_snow',
+ 20: 'light_rain_snow',
+ 21: 'heavy_rain_snow',
+ 22: 'cloudy',
+ },
+ ),
+ 'weight': FieldType(
+ name='weight',
+ base_type=BASE_TYPES[0x84], # uint16
+ values={
+ 0xFFFE: 'calculating',
+ },
+ ),
+ 'wkt_step_duration': FieldType(
+ name='wkt_step_duration',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'time',
+ 1: 'distance',
+ 2: 'hr_less_than',
+ 3: 'hr_greater_than',
+ 4: 'calories',
+ 5: 'open',
+ 6: 'repeat_until_steps_cmplt',
+ 7: 'repeat_until_time',
+ 8: 'repeat_until_distance',
+ 9: 'repeat_until_calories',
+ 10: 'repeat_until_hr_less_than',
+ 11: 'repeat_until_hr_greater_than',
+ 12: 'repeat_until_power_less_than',
+ 13: 'repeat_until_power_greater_than',
+ 14: 'power_less_than',
+ 15: 'power_greater_than',
+ 16: 'training_peaks_tss',
+ 17: 'repeat_until_power_last_lap_less_than',
+ 18: 'repeat_until_max_power_last_lap_less_than',
+ 19: 'power_3s_less_than',
+ 20: 'power_10s_less_than',
+ 21: 'power_30s_less_than',
+ 22: 'power_3s_greater_than',
+ 23: 'power_10s_greater_than',
+ 24: 'power_30s_greater_than',
+ 25: 'power_lap_less_than',
+ 26: 'power_lap_greater_than',
+ 27: 'repeat_until_training_peaks_tss',
+ 28: 'repetition_time',
+ 29: 'reps',
+ },
+ ),
+ 'wkt_step_target': FieldType(
+ name='wkt_step_target',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'speed',
+ 1: 'heart_rate',
+ 2: 'open',
+ 3: 'cadence',
+ 4: 'power',
+ 5: 'grade',
+ 6: 'resistance',
+ 7: 'power_3s',
+ 8: 'power_10s',
+ 9: 'power_30s',
+ 10: 'power_lap',
+ 11: 'swim_stroke',
+ 12: 'speed_lap',
+ 13: 'heart_rate_lap',
+ },
+ ),
+ 'workout_capabilities': FieldType(
+ name='workout_capabilities',
+ base_type=BASE_TYPES[0x8C], # uint32z
+ values={
+ 0x00000001: 'interval',
+ 0x00000002: 'custom',
+ 0x00000004: 'fitness_equipment',
+ 0x00000008: 'firstbeat',
+ 0x00000010: 'new_leaf',
+ 0x00000020: 'tcx', # For backwards compatibility. Watch should add missing id fields then clear flag.
+ 0x00000080: 'speed', # Speed source required for workout step.
+ 0x00000100: 'heart_rate', # Heart rate source required for workout step.
+ 0x00000200: 'distance', # Distance source required for workout step.
+ 0x00000400: 'cadence', # Cadence source required for workout step.
+ 0x00000800: 'power', # Power source required for workout step.
+ 0x00001000: 'grade', # Grade source required for workout step.
+ 0x00002000: 'resistance', # Resistance source required for workout step.
+ 0x00004000: 'protected',
+ },
+ ),
+ 'workout_equipment': FieldType(
+ name='workout_equipment',
+ base_type=BASE_TYPES[0x00], # enum
+ values={
+ 0: 'none',
+ 1: 'swim_fins',
+ 2: 'swim_kickboard',
+ 3: 'swim_paddles',
+ 4: 'swim_pull_buoy',
+ 5: 'swim_snorkel',
+ },
+ ),
+ 'workout_hr': FieldType( # 0 - 100 indicates% of max hr; >100 indicates bpm (255 max) plus 100
+ name='workout_hr',
+ base_type=BASE_TYPES[0x86], # uint32
+ values={
+ 100: 'bpm_offset',
+ },
+ ),
+ 'workout_power': FieldType( # 0 - 1000 indicates % of functional threshold power; >1000 indicates watts plus 1000.
+ name='workout_power',
+ base_type=BASE_TYPES[0x86], # uint32
+ values={
+ 1000: 'watts_offset',
+ },
+ ),
+}
+
+
+FIELD_TYPE_TIMESTAMP = Field(name='timestamp', type=FIELD_TYPES['date_time'], def_num=253, units='s')
+
+
+MESSAGE_TYPES = {
+ # **************************** Common Messages *****************************
+ 0: MessageType( # Must be first message in file.
+ name='file_id',
+ mesg_num=0,
+ fields={
+ 0: Field(
+ name='type',
+ type=FIELD_TYPES['file'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='manufacturer',
+ type=FIELD_TYPES['manufacturer'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='product',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ subfields=(
+ SubField(
+ name='garmin_product',
+ def_num=2,
+ type=FIELD_TYPES['garmin_product'],
+ ref_fields=(
+ ReferenceField(
+ name='manufacturer',
+ def_num=1,
+ value='garmin',
+ raw_value=1,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=1,
+ value='dynastream',
+ raw_value=15,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=1,
+ value='dynastream_oem',
+ raw_value=13,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 3: Field(
+ name='serial_number',
+ type=BASE_TYPES[0x8C], # uint32z
+ def_num=3,
+ ),
+ 4: Field( # Only set for files that are can be created/erased.
+ name='time_created',
+ type=FIELD_TYPES['date_time'],
+ def_num=4,
+ ),
+ 5: Field( # Only set for files that are not created/erased.
+ name='number',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ ),
+ 8: Field( # Optional free form string to indicate the devices name or model
+ name='product_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=8,
+ ),
+ },
+ ),
+
+
+ # ************************************ ************************************
+ 1: MessageType(
+ name='capabilities',
+ mesg_num=1,
+ fields={
+ 0: Field( # Use language_bits_x types where x is index of array.
+ name='languages',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=0,
+ ),
+ 1: Field( # Use sport_bits_x types where x is index of array.
+ name='sports',
+ type=FIELD_TYPES['sport_bits_0'],
+ def_num=1,
+ ),
+ 21: Field(
+ name='workouts_supported',
+ type=FIELD_TYPES['workout_capabilities'],
+ def_num=21,
+ ),
+ 23: Field(
+ name='connectivity_supported',
+ type=FIELD_TYPES['connectivity_capabilities'],
+ def_num=23,
+ ),
+ },
+ ),
+ 4: MessageType(
+ name='hrm_profile',
+ mesg_num=4,
+ fields={
+ 0: Field(
+ name='enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='hrm_ant_id',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=1,
+ ),
+ 2: Field(
+ name='log_hrv',
+ type=FIELD_TYPES['bool'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='hrm_ant_id_trans_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=3,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 5: MessageType(
+ name='sdm_profile',
+ mesg_num=5,
+ fields={
+ 0: Field(
+ name='enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='sdm_ant_id',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=1,
+ ),
+ 2: Field(
+ name='sdm_cal_factor',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ scale=10,
+ units='%',
+ ),
+ 3: Field(
+ name='odometer',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ scale=100,
+ units='m',
+ ),
+ 4: Field( # Use footpod for speed source instead of GPS
+ name='speed_source',
+ type=FIELD_TYPES['bool'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='sdm_ant_id_trans_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=5,
+ ),
+ 7: Field( # Rollover counter that can be used to extend the odometer
+ name='odometer_rollover',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=7,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 6: MessageType(
+ name='bike_profile',
+ mesg_num=6,
+ fields={
+ 0: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='odometer',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ scale=100,
+ units='m',
+ ),
+ 4: Field(
+ name='bike_spd_ant_id',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=4,
+ ),
+ 5: Field(
+ name='bike_cad_ant_id',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=5,
+ ),
+ 6: Field(
+ name='bike_spdcad_ant_id',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=6,
+ ),
+ 7: Field(
+ name='bike_power_ant_id',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=7,
+ ),
+ 8: Field(
+ name='custom_wheelsize',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=8,
+ scale=1000,
+ units='m',
+ ),
+ 9: Field(
+ name='auto_wheelsize',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=9,
+ scale=1000,
+ units='m',
+ ),
+ 10: Field(
+ name='bike_weight',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=10,
+ scale=10,
+ units='kg',
+ ),
+ 11: Field(
+ name='power_cal_factor',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=11,
+ scale=10,
+ units='%',
+ ),
+ 12: Field(
+ name='auto_wheel_cal',
+ type=FIELD_TYPES['bool'],
+ def_num=12,
+ ),
+ 13: Field(
+ name='auto_power_zero',
+ type=FIELD_TYPES['bool'],
+ def_num=13,
+ ),
+ 14: Field(
+ name='id',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=14,
+ ),
+ 15: Field(
+ name='spd_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=15,
+ ),
+ 16: Field(
+ name='cad_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=16,
+ ),
+ 17: Field(
+ name='spdcad_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=17,
+ ),
+ 18: Field(
+ name='power_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=18,
+ ),
+ 19: Field(
+ name='crank_length',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=19,
+ scale=2,
+ offset=-110,
+ units='mm',
+ ),
+ 20: Field(
+ name='enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=20,
+ ),
+ 21: Field(
+ name='bike_spd_ant_id_trans_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=21,
+ ),
+ 22: Field(
+ name='bike_cad_ant_id_trans_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=22,
+ ),
+ 23: Field(
+ name='bike_spdcad_ant_id_trans_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=23,
+ ),
+ 24: Field(
+ name='bike_power_ant_id_trans_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=24,
+ ),
+ 37: Field( # Rollover counter that can be used to extend the odometer
+ name='odometer_rollover',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=37,
+ ),
+ 38: Field( # Number of front gears
+ name='front_gear_num',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=38,
+ ),
+ 39: Field( # Number of teeth on each gear 0 is innermost
+ name='front_gear',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=39,
+ ),
+ 40: Field( # Number of rear gears
+ name='rear_gear_num',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=40,
+ ),
+ 41: Field( # Number of teeth on each gear 0 is innermost
+ name='rear_gear',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=41,
+ ),
+ 44: Field(
+ name='shimano_di2_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=44,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 8: MessageType(
+ name='hr_zone',
+ mesg_num=8,
+ fields={
+ 1: Field(
+ name='high_bpm',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ units='bpm',
+ ),
+ 2: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=2,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 9: MessageType(
+ name='power_zone',
+ mesg_num=9,
+ fields={
+ 1: Field(
+ name='high_value',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='watts',
+ ),
+ 2: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=2,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 10: MessageType(
+ name='met_zone',
+ mesg_num=10,
+ fields={
+ 1: Field(
+ name='high_bpm',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ ),
+ 2: Field(
+ name='calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ scale=10,
+ units='kcal/min',
+ ),
+ 3: Field(
+ name='fat_calories',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ scale=10,
+ units='kcal/min',
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 12: MessageType(
+ name='sport',
+ mesg_num=12,
+ fields={
+ 0: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=1,
+ ),
+ 3: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=3,
+ ),
+ },
+ ),
+ 18: MessageType(
+ name='session',
+ mesg_num=18,
+ fields={
+ 0: Field( # session
+ name='event',
+ type=FIELD_TYPES['event'],
+ def_num=0,
+ ),
+ 1: Field( # stop
+ name='event_type',
+ type=FIELD_TYPES['event_type'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='start_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='start_position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=3,
+ units='semicircles',
+ ),
+ 4: Field(
+ name='start_position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=4,
+ units='semicircles',
+ ),
+ 5: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=5,
+ ),
+ 6: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=6,
+ ),
+ 7: Field( # Time (includes pauses)
+ name='total_elapsed_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=7,
+ scale=1000,
+ units='s',
+ ),
+ 8: Field( # Timer Time (excludes pauses)
+ name='total_timer_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=8,
+ scale=1000,
+ units='s',
+ ),
+ 9: Field(
+ name='total_distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=9,
+ scale=100,
+ units='m',
+ ),
+ 10: Field(
+ name='total_cycles',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=10,
+ units='cycles',
+ subfields=(
+ SubField(
+ name='total_strides',
+ def_num=10,
+ type=BASE_TYPES[0x86], # uint32
+ units='strides',
+ ref_fields=(
+ ReferenceField(
+ name='sport',
+ def_num=5,
+ value='running',
+ raw_value=1,
+ ),
+ ReferenceField(
+ name='sport',
+ def_num=5,
+ value='walking',
+ raw_value=11,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 11: Field(
+ name='total_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=11,
+ units='kcal',
+ ),
+ 13: Field(
+ name='total_fat_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=13,
+ units='kcal',
+ ),
+ 14: Field( # total_distance / total_timer_time
+ name='avg_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=14,
+ components=(
+ ComponentField(
+ name='enhanced_avg_speed',
+ def_num=124,
+ scale=1000,
+ units='m/s',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 15: Field(
+ name='max_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=15,
+ components=(
+ ComponentField(
+ name='enhanced_max_speed',
+ def_num=125,
+ scale=1000,
+ units='m/s',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 16: Field( # average heart rate (excludes pause time)
+ name='avg_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=16,
+ units='bpm',
+ ),
+ 17: Field(
+ name='max_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=17,
+ units='bpm',
+ ),
+ 18: Field( # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time
+ name='avg_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=18,
+ units='rpm',
+ subfields=(
+ SubField(
+ name='avg_running_cadence',
+ def_num=18,
+ type=BASE_TYPES[0x02], # uint8
+ units='strides/min',
+ ref_fields=(
+ ReferenceField(
+ name='sport',
+ def_num=5,
+ value='running',
+ raw_value=1,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 19: Field(
+ name='max_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=19,
+ units='rpm',
+ subfields=(
+ SubField(
+ name='max_running_cadence',
+ def_num=19,
+ type=BASE_TYPES[0x02], # uint8
+ units='strides/min',
+ ref_fields=(
+ ReferenceField(
+ name='sport',
+ def_num=5,
+ value='running',
+ raw_value=1,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 20: Field( # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time
+ name='avg_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=20,
+ units='watts',
+ ),
+ 21: Field(
+ name='max_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=21,
+ units='watts',
+ ),
+ 22: Field(
+ name='total_ascent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=22,
+ units='m',
+ ),
+ 23: Field(
+ name='total_descent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=23,
+ units='m',
+ ),
+ 24: Field(
+ name='total_training_effect',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=24,
+ scale=10,
+ ),
+ 25: Field(
+ name='first_lap_index',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=25,
+ ),
+ 26: Field(
+ name='num_laps',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=26,
+ ),
+ 27: Field(
+ name='event_group',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=27,
+ ),
+ 28: Field(
+ name='trigger',
+ type=FIELD_TYPES['session_trigger'],
+ def_num=28,
+ ),
+ 29: Field(
+ name='nec_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=29,
+ units='semicircles',
+ ),
+ 30: Field(
+ name='nec_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=30,
+ units='semicircles',
+ ),
+ 31: Field(
+ name='swc_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=31,
+ units='semicircles',
+ ),
+ 32: Field(
+ name='swc_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=32,
+ units='semicircles',
+ ),
+ 34: Field(
+ name='normalized_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=34,
+ units='watts',
+ ),
+ 35: Field(
+ name='training_stress_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=35,
+ scale=10,
+ units='tss',
+ ),
+ 36: Field(
+ name='intensity_factor',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=36,
+ scale=1000,
+ units='if',
+ ),
+ 37: Field(
+ name='left_right_balance',
+ type=FIELD_TYPES['left_right_balance_100'],
+ def_num=37,
+ ),
+ 41: Field(
+ name='avg_stroke_count',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=41,
+ scale=10,
+ units='strokes/lap',
+ ),
+ 42: Field(
+ name='avg_stroke_distance',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=42,
+ scale=100,
+ units='m',
+ ),
+ 43: Field(
+ name='swim_stroke',
+ type=FIELD_TYPES['swim_stroke'],
+ def_num=43,
+ units='swim_stroke',
+ ),
+ 44: Field(
+ name='pool_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=44,
+ scale=100,
+ units='m',
+ ),
+ 45: Field(
+ name='threshold_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=45,
+ units='watts',
+ ),
+ 46: Field(
+ name='pool_length_unit',
+ type=FIELD_TYPES['display_measure'],
+ def_num=46,
+ ),
+ 47: Field( # # of active lengths of swim pool
+ name='num_active_lengths',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=47,
+ units='lengths',
+ ),
+ 48: Field(
+ name='total_work',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=48,
+ units='J',
+ ),
+ 49: Field(
+ name='avg_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=49,
+ components=(
+ ComponentField(
+ name='enhanced_avg_altitude',
+ def_num=126,
+ scale=5,
+ offset=500,
+ units='m',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 50: Field(
+ name='max_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=50,
+ components=(
+ ComponentField(
+ name='enhanced_max_altitude',
+ def_num=128,
+ scale=5,
+ offset=500,
+ units='m',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 51: Field(
+ name='gps_accuracy',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=51,
+ units='m',
+ ),
+ 52: Field(
+ name='avg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=52,
+ scale=100,
+ units='%',
+ ),
+ 53: Field(
+ name='avg_pos_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=53,
+ scale=100,
+ units='%',
+ ),
+ 54: Field(
+ name='avg_neg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=54,
+ scale=100,
+ units='%',
+ ),
+ 55: Field(
+ name='max_pos_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=55,
+ scale=100,
+ units='%',
+ ),
+ 56: Field(
+ name='max_neg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=56,
+ scale=100,
+ units='%',
+ ),
+ 57: Field(
+ name='avg_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=57,
+ units='C',
+ ),
+ 58: Field(
+ name='max_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=58,
+ units='C',
+ ),
+ 59: Field(
+ name='total_moving_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=59,
+ scale=1000,
+ units='s',
+ ),
+ 60: Field(
+ name='avg_pos_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=60,
+ scale=1000,
+ units='m/s',
+ ),
+ 61: Field(
+ name='avg_neg_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=61,
+ scale=1000,
+ units='m/s',
+ ),
+ 62: Field(
+ name='max_pos_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=62,
+ scale=1000,
+ units='m/s',
+ ),
+ 63: Field(
+ name='max_neg_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=63,
+ scale=1000,
+ units='m/s',
+ ),
+ 64: Field(
+ name='min_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=64,
+ units='bpm',
+ ),
+ 65: Field(
+ name='time_in_hr_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=65,
+ scale=1000,
+ units='s',
+ ),
+ 66: Field(
+ name='time_in_speed_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=66,
+ scale=1000,
+ units='s',
+ ),
+ 67: Field(
+ name='time_in_cadence_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=67,
+ scale=1000,
+ units='s',
+ ),
+ 68: Field(
+ name='time_in_power_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=68,
+ scale=1000,
+ units='s',
+ ),
+ 69: Field(
+ name='avg_lap_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=69,
+ scale=1000,
+ units='s',
+ ),
+ 70: Field(
+ name='best_lap_index',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=70,
+ ),
+ 71: Field(
+ name='min_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=71,
+ components=(
+ ComponentField(
+ name='enhanced_min_altitude',
+ def_num=127,
+ scale=5,
+ offset=500,
+ units='m',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 82: Field(
+ name='player_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=82,
+ ),
+ 83: Field(
+ name='opponent_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=83,
+ ),
+ 84: Field(
+ name='opponent_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=84,
+ ),
+ 85: Field( # stroke_type enum used as the index
+ name='stroke_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=85,
+ units='counts',
+ ),
+ 86: Field( # zone number used as the index
+ name='zone_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=86,
+ units='counts',
+ ),
+ 87: Field(
+ name='max_ball_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=87,
+ scale=100,
+ units='m/s',
+ ),
+ 88: Field(
+ name='avg_ball_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=88,
+ scale=100,
+ units='m/s',
+ ),
+ 89: Field(
+ name='avg_vertical_oscillation',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=89,
+ scale=10,
+ units='mm',
+ ),
+ 90: Field(
+ name='avg_stance_time_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=90,
+ scale=100,
+ units='percent',
+ ),
+ 91: Field(
+ name='avg_stance_time',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=91,
+ scale=10,
+ units='ms',
+ ),
+ 92: Field( # fractional part of the avg_cadence
+ name='avg_fractional_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=92,
+ scale=128,
+ units='rpm',
+ ),
+ 93: Field( # fractional part of the max_cadence
+ name='max_fractional_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=93,
+ scale=128,
+ units='rpm',
+ ),
+ 94: Field( # fractional part of the total_cycles
+ name='total_fractional_cycles',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=94,
+ scale=128,
+ units='cycles',
+ ),
+ 95: Field( # Avg saturated and unsaturated hemoglobin
+ name='avg_total_hemoglobin_conc',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=95,
+ scale=100,
+ units='g/dL',
+ ),
+ 96: Field( # Min saturated and unsaturated hemoglobin
+ name='min_total_hemoglobin_conc',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=96,
+ scale=100,
+ units='g/dL',
+ ),
+ 97: Field( # Max saturated and unsaturated hemoglobin
+ name='max_total_hemoglobin_conc',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=97,
+ scale=100,
+ units='g/dL',
+ ),
+ 98: Field( # Avg percentage of hemoglobin saturated with oxygen
+ name='avg_saturated_hemoglobin_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=98,
+ scale=10,
+ units='%',
+ ),
+ 99: Field( # Min percentage of hemoglobin saturated with oxygen
+ name='min_saturated_hemoglobin_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=99,
+ scale=10,
+ units='%',
+ ),
+ 100: Field( # Max percentage of hemoglobin saturated with oxygen
+ name='max_saturated_hemoglobin_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=100,
+ scale=10,
+ units='%',
+ ),
+ 101: Field(
+ name='avg_left_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=101,
+ scale=2,
+ units='percent',
+ ),
+ 102: Field(
+ name='avg_right_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=102,
+ scale=2,
+ units='percent',
+ ),
+ 103: Field(
+ name='avg_left_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=103,
+ scale=2,
+ units='percent',
+ ),
+ 104: Field(
+ name='avg_right_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=104,
+ scale=2,
+ units='percent',
+ ),
+ 105: Field(
+ name='avg_combined_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=105,
+ scale=2,
+ units='percent',
+ ),
+ 111: Field(
+ name='sport_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=111,
+ ),
+ 112: Field( # Total time spend in the standing position
+ name='time_standing',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=112,
+ scale=1000,
+ units='s',
+ ),
+ 113: Field( # Number of transitions to the standing state
+ name='stand_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=113,
+ ),
+ 114: Field( # Average platform center offset Left
+ name='avg_left_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=114,
+ units='mm',
+ ),
+ 115: Field( # Average platform center offset Right
+ name='avg_right_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=115,
+ units='mm',
+ ),
+ 116: Field( # Average left power phase angles. Indexes defined by power_phase_type.
+ name='avg_left_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=116,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 117: Field( # Average left power phase peak angles. Data value indexes defined by power_phase_type.
+ name='avg_left_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=117,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 118: Field( # Average right power phase angles. Data value indexes defined by power_phase_type.
+ name='avg_right_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=118,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 119: Field( # Average right power phase peak angles data value indexes defined by power_phase_type.
+ name='avg_right_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=119,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 120: Field( # Average power by position. Data value indexes defined by rider_position_type.
+ name='avg_power_position',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=120,
+ units='watts',
+ ),
+ 121: Field( # Maximum power by position. Data value indexes defined by rider_position_type.
+ name='max_power_position',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=121,
+ units='watts',
+ ),
+ 122: Field( # Average cadence by position. Data value indexes defined by rider_position_type.
+ name='avg_cadence_position',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=122,
+ units='rpm',
+ ),
+ 123: Field( # Maximum cadence by position. Data value indexes defined by rider_position_type.
+ name='max_cadence_position',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=123,
+ units='rpm',
+ ),
+ 124: Field( # total_distance / total_timer_time
+ name='enhanced_avg_speed',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=124,
+ scale=1000,
+ units='m/s',
+ ),
+ 125: Field(
+ name='enhanced_max_speed',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=125,
+ scale=1000,
+ units='m/s',
+ ),
+ 126: Field(
+ name='enhanced_avg_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=126,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 127: Field(
+ name='enhanced_min_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=127,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 128: Field(
+ name='enhanced_max_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=128,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 129: Field( # lev average motor power during session
+ name='avg_lev_motor_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=129,
+ units='watts',
+ ),
+ 130: Field( # lev maximum motor power during session
+ name='max_lev_motor_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=130,
+ units='watts',
+ ),
+ 131: Field( # lev battery consumption during session
+ name='lev_battery_consumption',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=131,
+ scale=2,
+ units='percent',
+ ),
+ 132: Field(
+ name='avg_vertical_ratio',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=132,
+ scale=100,
+ units='percent',
+ ),
+ 133: Field(
+ name='avg_stance_time_balance',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=133,
+ scale=100,
+ units='percent',
+ ),
+ 134: Field(
+ name='avg_step_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=134,
+ scale=10,
+ units='mm',
+ ),
+ 137: Field(
+ name='total_anaerobic_training_effect',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=137,
+ scale=10,
+ ),
+ 139: Field(
+ name='avg_vam',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=139,
+ scale=1000,
+ units='m/s',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Sesson end time.
+ 254: Field( # Selected bit is set for the current session.
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 19: MessageType(
+ name='lap',
+ mesg_num=19,
+ fields={
+ 0: Field(
+ name='event',
+ type=FIELD_TYPES['event'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='event_type',
+ type=FIELD_TYPES['event_type'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='start_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='start_position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=3,
+ units='semicircles',
+ ),
+ 4: Field(
+ name='start_position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=4,
+ units='semicircles',
+ ),
+ 5: Field(
+ name='end_position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=5,
+ units='semicircles',
+ ),
+ 6: Field(
+ name='end_position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=6,
+ units='semicircles',
+ ),
+ 7: Field( # Time (includes pauses)
+ name='total_elapsed_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=7,
+ scale=1000,
+ units='s',
+ ),
+ 8: Field( # Timer Time (excludes pauses)
+ name='total_timer_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=8,
+ scale=1000,
+ units='s',
+ ),
+ 9: Field(
+ name='total_distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=9,
+ scale=100,
+ units='m',
+ ),
+ 10: Field(
+ name='total_cycles',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=10,
+ units='cycles',
+ subfields=(
+ SubField(
+ name='total_strides',
+ def_num=10,
+ type=BASE_TYPES[0x86], # uint32
+ units='strides',
+ ref_fields=(
+ ReferenceField(
+ name='sport',
+ def_num=25,
+ value='running',
+ raw_value=1,
+ ),
+ ReferenceField(
+ name='sport',
+ def_num=25,
+ value='walking',
+ raw_value=11,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 11: Field(
+ name='total_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=11,
+ units='kcal',
+ ),
+ 12: Field( # If New Leaf
+ name='total_fat_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=12,
+ units='kcal',
+ ),
+ 13: Field(
+ name='avg_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=13,
+ components=(
+ ComponentField(
+ name='enhanced_avg_speed',
+ def_num=110,
+ scale=1000,
+ units='m/s',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 14: Field(
+ name='max_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=14,
+ components=(
+ ComponentField(
+ name='enhanced_max_speed',
+ def_num=111,
+ scale=1000,
+ units='m/s',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 15: Field(
+ name='avg_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=15,
+ units='bpm',
+ ),
+ 16: Field(
+ name='max_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=16,
+ units='bpm',
+ ),
+ 17: Field( # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time
+ name='avg_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=17,
+ units='rpm',
+ subfields=(
+ SubField(
+ name='avg_running_cadence',
+ def_num=17,
+ type=BASE_TYPES[0x02], # uint8
+ units='strides/min',
+ ref_fields=(
+ ReferenceField(
+ name='sport',
+ def_num=25,
+ value='running',
+ raw_value=1,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 18: Field(
+ name='max_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=18,
+ units='rpm',
+ subfields=(
+ SubField(
+ name='max_running_cadence',
+ def_num=18,
+ type=BASE_TYPES[0x02], # uint8
+ units='strides/min',
+ ref_fields=(
+ ReferenceField(
+ name='sport',
+ def_num=25,
+ value='running',
+ raw_value=1,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 19: Field( # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time
+ name='avg_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=19,
+ units='watts',
+ ),
+ 20: Field(
+ name='max_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=20,
+ units='watts',
+ ),
+ 21: Field(
+ name='total_ascent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=21,
+ units='m',
+ ),
+ 22: Field(
+ name='total_descent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=22,
+ units='m',
+ ),
+ 23: Field(
+ name='intensity',
+ type=FIELD_TYPES['intensity'],
+ def_num=23,
+ ),
+ 24: Field(
+ name='lap_trigger',
+ type=FIELD_TYPES['lap_trigger'],
+ def_num=24,
+ ),
+ 25: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=25,
+ ),
+ 26: Field(
+ name='event_group',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=26,
+ ),
+ 32: Field( # # of lengths of swim pool
+ name='num_lengths',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=32,
+ units='lengths',
+ ),
+ 33: Field(
+ name='normalized_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=33,
+ units='watts',
+ ),
+ 34: Field(
+ name='left_right_balance',
+ type=FIELD_TYPES['left_right_balance_100'],
+ def_num=34,
+ ),
+ 35: Field(
+ name='first_length_index',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=35,
+ ),
+ 37: Field(
+ name='avg_stroke_distance',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=37,
+ scale=100,
+ units='m',
+ ),
+ 38: Field(
+ name='swim_stroke',
+ type=FIELD_TYPES['swim_stroke'],
+ def_num=38,
+ ),
+ 39: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=39,
+ ),
+ 40: Field( # # of active lengths of swim pool
+ name='num_active_lengths',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=40,
+ units='lengths',
+ ),
+ 41: Field(
+ name='total_work',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=41,
+ units='J',
+ ),
+ 42: Field(
+ name='avg_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=42,
+ components=(
+ ComponentField(
+ name='enhanced_avg_altitude',
+ def_num=112,
+ scale=5,
+ offset=500,
+ units='m',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 43: Field(
+ name='max_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=43,
+ components=(
+ ComponentField(
+ name='enhanced_max_altitude',
+ def_num=114,
+ scale=5,
+ offset=500,
+ units='m',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 44: Field(
+ name='gps_accuracy',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=44,
+ units='m',
+ ),
+ 45: Field(
+ name='avg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=45,
+ scale=100,
+ units='%',
+ ),
+ 46: Field(
+ name='avg_pos_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=46,
+ scale=100,
+ units='%',
+ ),
+ 47: Field(
+ name='avg_neg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=47,
+ scale=100,
+ units='%',
+ ),
+ 48: Field(
+ name='max_pos_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=48,
+ scale=100,
+ units='%',
+ ),
+ 49: Field(
+ name='max_neg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=49,
+ scale=100,
+ units='%',
+ ),
+ 50: Field(
+ name='avg_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=50,
+ units='C',
+ ),
+ 51: Field(
+ name='max_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=51,
+ units='C',
+ ),
+ 52: Field(
+ name='total_moving_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=52,
+ scale=1000,
+ units='s',
+ ),
+ 53: Field(
+ name='avg_pos_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=53,
+ scale=1000,
+ units='m/s',
+ ),
+ 54: Field(
+ name='avg_neg_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=54,
+ scale=1000,
+ units='m/s',
+ ),
+ 55: Field(
+ name='max_pos_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=55,
+ scale=1000,
+ units='m/s',
+ ),
+ 56: Field(
+ name='max_neg_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=56,
+ scale=1000,
+ units='m/s',
+ ),
+ 57: Field(
+ name='time_in_hr_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=57,
+ scale=1000,
+ units='s',
+ ),
+ 58: Field(
+ name='time_in_speed_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=58,
+ scale=1000,
+ units='s',
+ ),
+ 59: Field(
+ name='time_in_cadence_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=59,
+ scale=1000,
+ units='s',
+ ),
+ 60: Field(
+ name='time_in_power_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=60,
+ scale=1000,
+ units='s',
+ ),
+ 61: Field(
+ name='repetition_num',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=61,
+ ),
+ 62: Field(
+ name='min_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=62,
+ components=(
+ ComponentField(
+ name='enhanced_min_altitude',
+ def_num=113,
+ scale=5,
+ offset=500,
+ units='m',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 63: Field(
+ name='min_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=63,
+ units='bpm',
+ ),
+ 71: Field(
+ name='wkt_step_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=71,
+ ),
+ 74: Field(
+ name='opponent_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=74,
+ ),
+ 75: Field( # stroke_type enum used as the index
+ name='stroke_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=75,
+ units='counts',
+ ),
+ 76: Field( # zone number used as the index
+ name='zone_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=76,
+ units='counts',
+ ),
+ 77: Field(
+ name='avg_vertical_oscillation',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=77,
+ scale=10,
+ units='mm',
+ ),
+ 78: Field(
+ name='avg_stance_time_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=78,
+ scale=100,
+ units='percent',
+ ),
+ 79: Field(
+ name='avg_stance_time',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=79,
+ scale=10,
+ units='ms',
+ ),
+ 80: Field( # fractional part of the avg_cadence
+ name='avg_fractional_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=80,
+ scale=128,
+ units='rpm',
+ ),
+ 81: Field( # fractional part of the max_cadence
+ name='max_fractional_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=81,
+ scale=128,
+ units='rpm',
+ ),
+ 82: Field( # fractional part of the total_cycles
+ name='total_fractional_cycles',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=82,
+ scale=128,
+ units='cycles',
+ ),
+ 83: Field(
+ name='player_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=83,
+ ),
+ 84: Field( # Avg saturated and unsaturated hemoglobin
+ name='avg_total_hemoglobin_conc',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=84,
+ scale=100,
+ units='g/dL',
+ ),
+ 85: Field( # Min saturated and unsaturated hemoglobin
+ name='min_total_hemoglobin_conc',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=85,
+ scale=100,
+ units='g/dL',
+ ),
+ 86: Field( # Max saturated and unsaturated hemoglobin
+ name='max_total_hemoglobin_conc',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=86,
+ scale=100,
+ units='g/dL',
+ ),
+ 87: Field( # Avg percentage of hemoglobin saturated with oxygen
+ name='avg_saturated_hemoglobin_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=87,
+ scale=10,
+ units='%',
+ ),
+ 88: Field( # Min percentage of hemoglobin saturated with oxygen
+ name='min_saturated_hemoglobin_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=88,
+ scale=10,
+ units='%',
+ ),
+ 89: Field( # Max percentage of hemoglobin saturated with oxygen
+ name='max_saturated_hemoglobin_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=89,
+ scale=10,
+ units='%',
+ ),
+ 91: Field(
+ name='avg_left_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=91,
+ scale=2,
+ units='percent',
+ ),
+ 92: Field(
+ name='avg_right_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=92,
+ scale=2,
+ units='percent',
+ ),
+ 93: Field(
+ name='avg_left_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=93,
+ scale=2,
+ units='percent',
+ ),
+ 94: Field(
+ name='avg_right_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=94,
+ scale=2,
+ units='percent',
+ ),
+ 95: Field(
+ name='avg_combined_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=95,
+ scale=2,
+ units='percent',
+ ),
+ 98: Field( # Total time spent in the standing position
+ name='time_standing',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=98,
+ scale=1000,
+ units='s',
+ ),
+ 99: Field( # Number of transitions to the standing state
+ name='stand_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=99,
+ ),
+ 100: Field( # Average left platform center offset
+ name='avg_left_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=100,
+ units='mm',
+ ),
+ 101: Field( # Average right platform center offset
+ name='avg_right_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=101,
+ units='mm',
+ ),
+ 102: Field( # Average left power phase angles. Data value indexes defined by power_phase_type.
+ name='avg_left_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=102,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 103: Field( # Average left power phase peak angles. Data value indexes defined by power_phase_type.
+ name='avg_left_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=103,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 104: Field( # Average right power phase angles. Data value indexes defined by power_phase_type.
+ name='avg_right_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=104,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 105: Field( # Average right power phase peak angles. Data value indexes defined by power_phase_type.
+ name='avg_right_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=105,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 106: Field( # Average power by position. Data value indexes defined by rider_position_type.
+ name='avg_power_position',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=106,
+ units='watts',
+ ),
+ 107: Field( # Maximum power by position. Data value indexes defined by rider_position_type.
+ name='max_power_position',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=107,
+ units='watts',
+ ),
+ 108: Field( # Average cadence by position. Data value indexes defined by rider_position_type.
+ name='avg_cadence_position',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=108,
+ units='rpm',
+ ),
+ 109: Field( # Maximum cadence by position. Data value indexes defined by rider_position_type.
+ name='max_cadence_position',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=109,
+ units='rpm',
+ ),
+ 110: Field(
+ name='enhanced_avg_speed',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=110,
+ scale=1000,
+ units='m/s',
+ ),
+ 111: Field(
+ name='enhanced_max_speed',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=111,
+ scale=1000,
+ units='m/s',
+ ),
+ 112: Field(
+ name='enhanced_avg_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=112,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 113: Field(
+ name='enhanced_min_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=113,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 114: Field(
+ name='enhanced_max_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=114,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 115: Field( # lev average motor power during lap
+ name='avg_lev_motor_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=115,
+ units='watts',
+ ),
+ 116: Field( # lev maximum motor power during lap
+ name='max_lev_motor_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=116,
+ units='watts',
+ ),
+ 117: Field( # lev battery consumption during lap
+ name='lev_battery_consumption',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=117,
+ scale=2,
+ units='percent',
+ ),
+ 118: Field(
+ name='avg_vertical_ratio',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=118,
+ scale=100,
+ units='percent',
+ ),
+ 119: Field(
+ name='avg_stance_time_balance',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=119,
+ scale=100,
+ units='percent',
+ ),
+ 120: Field(
+ name='avg_step_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=120,
+ scale=10,
+ units='mm',
+ ),
+ 121: Field(
+ name='avg_vam',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=121,
+ scale=1000,
+ units='m/s',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Lap end time.
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 20: MessageType(
+ name='record',
+ mesg_num=20,
+ fields={
+ 0: Field(
+ name='position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=0,
+ units='semicircles',
+ ),
+ 1: Field(
+ name='position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=1,
+ units='semicircles',
+ ),
+ 2: Field(
+ name='altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ components=(
+ ComponentField(
+ name='enhanced_altitude',
+ def_num=78,
+ scale=5,
+ offset=500,
+ units='m',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 3: Field(
+ name='heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ units='bpm',
+ ),
+ 4: Field(
+ name='cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=4,
+ units='rpm',
+ ),
+ 5: Field(
+ name='distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=5,
+ scale=100,
+ units='m',
+ ),
+ 6: Field(
+ name='speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=6,
+ components=(
+ ComponentField(
+ name='enhanced_speed',
+ def_num=73,
+ scale=1000,
+ units='m/s',
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 7: Field(
+ name='power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=7,
+ units='watts',
+ ),
+ 8: Field(
+ name='compressed_speed_distance',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=8,
+ components=(
+ ComponentField(
+ name='speed',
+ def_num=6,
+ scale=100,
+ units='m/s',
+ accumulate=False,
+ bits=12,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='distance',
+ def_num=5,
+ scale=16,
+ units='m',
+ accumulate=True,
+ bits=12,
+ bit_offset=12,
+ ),
+ ),
+ ),
+ 9: Field(
+ name='grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=9,
+ scale=100,
+ units='%',
+ ),
+ 10: Field( # Relative. 0 is none 254 is Max.
+ name='resistance',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=10,
+ ),
+ 11: Field(
+ name='time_from_course',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=11,
+ scale=1000,
+ units='s',
+ ),
+ 12: Field(
+ name='cycle_length',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=12,
+ scale=100,
+ units='m',
+ ),
+ 13: Field(
+ name='temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=13,
+ units='C',
+ ),
+ 17: Field( # Speed at 1s intervals. Timestamp field indicates time of last array element.
+ name='speed_1s',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=17,
+ scale=16,
+ units='m/s',
+ ),
+ 18: Field(
+ name='cycles',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=18,
+ components=(
+ ComponentField(
+ name='total_cycles',
+ def_num=19,
+ units='cycles',
+ accumulate=True,
+ bits=8,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 19: Field(
+ name='total_cycles',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=19,
+ units='cycles',
+ ),
+ 28: Field(
+ name='compressed_accumulated_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=28,
+ components=(
+ ComponentField(
+ name='accumulated_power',
+ def_num=29,
+ units='watts',
+ accumulate=True,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 29: Field(
+ name='accumulated_power',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=29,
+ units='watts',
+ ),
+ 30: Field(
+ name='left_right_balance',
+ type=FIELD_TYPES['left_right_balance'],
+ def_num=30,
+ ),
+ 31: Field(
+ name='gps_accuracy',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=31,
+ units='m',
+ ),
+ 32: Field(
+ name='vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=32,
+ scale=1000,
+ units='m/s',
+ ),
+ 33: Field(
+ name='calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=33,
+ units='kcal',
+ ),
+ 39: Field(
+ name='vertical_oscillation',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=39,
+ scale=10,
+ units='mm',
+ ),
+ 40: Field(
+ name='stance_time_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=40,
+ scale=100,
+ units='percent',
+ ),
+ 41: Field(
+ name='stance_time',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=41,
+ scale=10,
+ units='ms',
+ ),
+ 42: Field(
+ name='activity_type',
+ type=FIELD_TYPES['activity_type'],
+ def_num=42,
+ ),
+ 43: Field(
+ name='left_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=43,
+ scale=2,
+ units='percent',
+ ),
+ 44: Field(
+ name='right_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=44,
+ scale=2,
+ units='percent',
+ ),
+ 45: Field(
+ name='left_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=45,
+ scale=2,
+ units='percent',
+ ),
+ 46: Field(
+ name='right_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=46,
+ scale=2,
+ units='percent',
+ ),
+ 47: Field(
+ name='combined_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=47,
+ scale=2,
+ units='percent',
+ ),
+ 48: Field(
+ name='time128',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=48,
+ scale=128,
+ units='s',
+ ),
+ 49: Field(
+ name='stroke_type',
+ type=FIELD_TYPES['stroke_type'],
+ def_num=49,
+ ),
+ 50: Field(
+ name='zone',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=50,
+ ),
+ 51: Field(
+ name='ball_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=51,
+ scale=100,
+ units='m/s',
+ ),
+ 52: Field( # Log cadence and fractional cadence for backwards compatability
+ name='cadence256',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=52,
+ scale=256,
+ units='rpm',
+ ),
+ 53: Field(
+ name='fractional_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=53,
+ scale=128,
+ units='rpm',
+ ),
+ 54: Field( # Total saturated and unsaturated hemoglobin
+ name='total_hemoglobin_conc',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=54,
+ scale=100,
+ units='g/dL',
+ ),
+ 55: Field( # Min saturated and unsaturated hemoglobin
+ name='total_hemoglobin_conc_min',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=55,
+ scale=100,
+ units='g/dL',
+ ),
+ 56: Field( # Max saturated and unsaturated hemoglobin
+ name='total_hemoglobin_conc_max',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=56,
+ scale=100,
+ units='g/dL',
+ ),
+ 57: Field( # Percentage of hemoglobin saturated with oxygen
+ name='saturated_hemoglobin_percent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=57,
+ scale=10,
+ units='%',
+ ),
+ 58: Field( # Min percentage of hemoglobin saturated with oxygen
+ name='saturated_hemoglobin_percent_min',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=58,
+ scale=10,
+ units='%',
+ ),
+ 59: Field( # Max percentage of hemoglobin saturated with oxygen
+ name='saturated_hemoglobin_percent_max',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=59,
+ scale=10,
+ units='%',
+ ),
+ 62: Field(
+ name='device_index',
+ type=FIELD_TYPES['device_index'],
+ def_num=62,
+ ),
+ 67: Field( # Left platform center offset
+ name='left_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=67,
+ units='mm',
+ ),
+ 68: Field( # Right platform center offset
+ name='right_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=68,
+ units='mm',
+ ),
+ 69: Field( # Left power phase angles. Data value indexes defined by power_phase_type.
+ name='left_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=69,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 70: Field( # Left power phase peak angles. Data value indexes defined by power_phase_type.
+ name='left_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=70,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 71: Field( # Right power phase angles. Data value indexes defined by power_phase_type.
+ name='right_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=71,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 72: Field( # Right power phase peak angles. Data value indexes defined by power_phase_type.
+ name='right_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=72,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 73: Field(
+ name='enhanced_speed',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=73,
+ scale=1000,
+ units='m/s',
+ ),
+ 78: Field(
+ name='enhanced_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=78,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 81: Field( # lev battery state of charge
+ name='battery_soc',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=81,
+ scale=2,
+ units='percent',
+ ),
+ 82: Field( # lev motor power
+ name='motor_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=82,
+ units='watts',
+ ),
+ 83: Field(
+ name='vertical_ratio',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=83,
+ scale=100,
+ units='percent',
+ ),
+ 84: Field(
+ name='stance_time_balance',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=84,
+ scale=100,
+ units='percent',
+ ),
+ 85: Field(
+ name='step_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=85,
+ scale=10,
+ units='mm',
+ ),
+ 91: Field( # Includes atmospheric pressure
+ name='absolute_pressure',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=91,
+ units='Pa',
+ ),
+ 92: Field( # 0 if above water
+ name='depth',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=92,
+ scale=1000,
+ units='m',
+ ),
+ 93: Field( # 0 if above water
+ name='next_stop_depth',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=93,
+ scale=1000,
+ units='m',
+ ),
+ 94: Field(
+ name='next_stop_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=94,
+ units='s',
+ ),
+ 95: Field(
+ name='time_to_surface',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=95,
+ units='s',
+ ),
+ 96: Field(
+ name='ndl_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=96,
+ units='s',
+ ),
+ 97: Field(
+ name='cns_load',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=97,
+ units='percent',
+ ),
+ 98: Field(
+ name='n2_load',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=98,
+ units='percent',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 21: MessageType(
+ name='event',
+ mesg_num=21,
+ fields={
+ 0: Field(
+ name='event',
+ type=FIELD_TYPES['event'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='event_type',
+ type=FIELD_TYPES['event_type'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='data16',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ components=(
+ ComponentField(
+ name='data',
+ def_num=3,
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 3: Field(
+ name='data',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ subfields=(
+ SubField(
+ name='battery_level',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ scale=1000,
+ units='V',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='battery',
+ raw_value=11,
+ ),
+ ),
+ ),
+ SubField(
+ name='cad_high_alert',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ units='rpm',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='cad_high_alert',
+ raw_value=17,
+ ),
+ ),
+ ),
+ SubField(
+ name='cad_low_alert',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ units='rpm',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='cad_low_alert',
+ raw_value=18,
+ ),
+ ),
+ ),
+ SubField(
+ name='calorie_duration_alert',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ units='calories',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='calorie_duration_alert',
+ raw_value=25,
+ ),
+ ),
+ ),
+ SubField(
+ name='comm_timeout',
+ def_num=3,
+ type=FIELD_TYPES['comm_timeout_type'],
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='comm_timeout',
+ raw_value=47,
+ ),
+ ),
+ ),
+ SubField(
+ name='course_point_index',
+ def_num=3,
+ type=FIELD_TYPES['message_index'],
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='course_point',
+ raw_value=10,
+ ),
+ ),
+ ),
+ SubField(
+ name='distance_duration_alert',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ scale=100,
+ units='m',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='distance_duration_alert',
+ raw_value=24,
+ ),
+ ),
+ ),
+ SubField(
+ name='fitness_equipment_state',
+ def_num=3,
+ type=FIELD_TYPES['fitness_equipment_state'],
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='fitness_equipment',
+ raw_value=27,
+ ),
+ ),
+ ),
+ SubField(
+ name='gear_change_data',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='front_gear_change',
+ raw_value=42,
+ ),
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='rear_gear_change',
+ raw_value=43,
+ ),
+ ),
+ components=(
+ ComponentField(
+ name='rear_gear_num',
+ def_num=11,
+ accumulate=False,
+ bits=8,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='rear_gear',
+ def_num=12,
+ accumulate=False,
+ bits=8,
+ bit_offset=8,
+ ),
+ ComponentField(
+ name='front_gear_num',
+ def_num=9,
+ accumulate=False,
+ bits=8,
+ bit_offset=16,
+ ),
+ ComponentField(
+ name='front_gear',
+ def_num=10,
+ accumulate=False,
+ bits=8,
+ bit_offset=24,
+ ),
+ ),
+ ),
+ SubField(
+ name='hr_high_alert',
+ def_num=3,
+ type=BASE_TYPES[0x02], # uint8
+ units='bpm',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='hr_high_alert',
+ raw_value=13,
+ ),
+ ),
+ ),
+ SubField(
+ name='hr_low_alert',
+ def_num=3,
+ type=BASE_TYPES[0x02], # uint8
+ units='bpm',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='hr_low_alert',
+ raw_value=14,
+ ),
+ ),
+ ),
+ SubField(
+ name='power_high_alert',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ units='watts',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='power_high_alert',
+ raw_value=19,
+ ),
+ ),
+ ),
+ SubField(
+ name='power_low_alert',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ units='watts',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='power_low_alert',
+ raw_value=20,
+ ),
+ ),
+ ),
+ SubField( # Indicates the rider position value.
+ name='rider_position',
+ def_num=3,
+ type=FIELD_TYPES['rider_position_type'],
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='rider_position_change',
+ raw_value=44,
+ ),
+ ),
+ ),
+ SubField(
+ name='speed_high_alert',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ scale=1000,
+ units='m/s',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='speed_high_alert',
+ raw_value=15,
+ ),
+ ),
+ ),
+ SubField(
+ name='speed_low_alert',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ scale=1000,
+ units='m/s',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='speed_low_alert',
+ raw_value=16,
+ ),
+ ),
+ ),
+ SubField(
+ name='sport_point',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='sport_point',
+ raw_value=33,
+ ),
+ ),
+ components=(
+ ComponentField(
+ name='score',
+ def_num=7,
+ accumulate=False,
+ bits=16,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='opponent_score',
+ def_num=8,
+ accumulate=False,
+ bits=16,
+ bit_offset=16,
+ ),
+ ),
+ ),
+ SubField(
+ name='time_duration_alert',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ scale=1000,
+ units='s',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='time_duration_alert',
+ raw_value=23,
+ ),
+ ),
+ ),
+ SubField(
+ name='timer_trigger',
+ def_num=3,
+ type=FIELD_TYPES['timer_trigger'],
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='timer',
+ raw_value=0,
+ ),
+ ),
+ ),
+ SubField(
+ name='virtual_partner_speed',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ scale=1000,
+ units='m/s',
+ ref_fields=(
+ ReferenceField(
+ name='event',
+ def_num=0,
+ value='virtual_partner_pace',
+ raw_value=12,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 4: Field(
+ name='event_group',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=4,
+ ),
+ 7: Field( # Do not populate directly. Autogenerated by decoder for sport_point subfield components
+ name='score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=7,
+ ),
+ 8: Field( # Do not populate directly. Autogenerated by decoder for sport_point subfield components
+ name='opponent_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=8,
+ ),
+ 9: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Front gear number. 1 is innermost.
+ name='front_gear_num',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=9,
+ ),
+ 10: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of front teeth.
+ name='front_gear',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=10,
+ ),
+ 11: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Rear gear number. 1 is innermost.
+ name='rear_gear_num',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=11,
+ ),
+ 12: Field( # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of rear teeth.
+ name='rear_gear',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=12,
+ ),
+ 13: Field(
+ name='device_index',
+ type=FIELD_TYPES['device_index'],
+ def_num=13,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 23: MessageType(
+ name='device_info',
+ mesg_num=23,
+ fields={
+ 0: Field(
+ name='device_index',
+ type=FIELD_TYPES['device_index'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='device_type',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ subfields=(
+ SubField(
+ name='ant_device_type',
+ def_num=1,
+ type=BASE_TYPES[0x02], # uint8
+ ref_fields=(
+ ReferenceField(
+ name='source_type',
+ def_num=25,
+ value='ant',
+ raw_value=0,
+ ),
+ ),
+ ),
+ SubField(
+ name='antplus_device_type',
+ def_num=1,
+ type=FIELD_TYPES['antplus_device_type'],
+ ref_fields=(
+ ReferenceField(
+ name='source_type',
+ def_num=25,
+ value='antplus',
+ raw_value=1,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 2: Field(
+ name='manufacturer',
+ type=FIELD_TYPES['manufacturer'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='serial_number',
+ type=BASE_TYPES[0x8C], # uint32z
+ def_num=3,
+ ),
+ 4: Field(
+ name='product',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ subfields=(
+ SubField(
+ name='garmin_product',
+ def_num=4,
+ type=FIELD_TYPES['garmin_product'],
+ ref_fields=(
+ ReferenceField(
+ name='manufacturer',
+ def_num=2,
+ value='garmin',
+ raw_value=1,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=2,
+ value='dynastream',
+ raw_value=15,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=2,
+ value='dynastream_oem',
+ raw_value=13,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 5: Field(
+ name='software_version',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ scale=100,
+ ),
+ 6: Field(
+ name='hardware_version',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ ),
+ 7: Field( # Reset by new battery or charge.
+ name='cum_operating_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=7,
+ units='s',
+ ),
+ 10: Field(
+ name='battery_voltage',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=10,
+ scale=256,
+ units='V',
+ ),
+ 11: Field(
+ name='battery_status',
+ type=FIELD_TYPES['battery_status'],
+ def_num=11,
+ ),
+ 18: Field( # Indicates the location of the sensor
+ name='sensor_position',
+ type=FIELD_TYPES['body_location'],
+ def_num=18,
+ ),
+ 19: Field( # Used to describe the sensor or location
+ name='descriptor',
+ type=BASE_TYPES[0x07], # string
+ def_num=19,
+ ),
+ 20: Field(
+ name='ant_transmission_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=20,
+ ),
+ 21: Field(
+ name='ant_device_number',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=21,
+ ),
+ 22: Field(
+ name='ant_network',
+ type=FIELD_TYPES['ant_network'],
+ def_num=22,
+ ),
+ 25: Field(
+ name='source_type',
+ type=FIELD_TYPES['source_type'],
+ def_num=25,
+ ),
+ 27: Field( # Optional free form string to indicate the devices name or model
+ name='product_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=27,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 27: MessageType(
+ name='workout_step',
+ mesg_num=27,
+ fields={
+ 0: Field(
+ name='wkt_step_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field(
+ name='duration_type',
+ type=FIELD_TYPES['wkt_step_duration'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='duration_value',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ subfields=(
+ SubField(
+ name='duration_calories',
+ def_num=2,
+ type=BASE_TYPES[0x86], # uint32
+ units='calories',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='calories',
+ raw_value=4,
+ ),
+ ),
+ ),
+ SubField(
+ name='duration_distance',
+ def_num=2,
+ type=BASE_TYPES[0x86], # uint32
+ scale=100,
+ units='m',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='distance',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField(
+ name='duration_hr',
+ def_num=2,
+ type=FIELD_TYPES['workout_hr'],
+ units='% or bpm',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='hr_less_than',
+ raw_value=2,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='hr_greater_than',
+ raw_value=3,
+ ),
+ ),
+ ),
+ SubField(
+ name='duration_power',
+ def_num=2,
+ type=FIELD_TYPES['workout_power'],
+ units='% or watts',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='power_less_than',
+ raw_value=14,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='power_greater_than',
+ raw_value=15,
+ ),
+ ),
+ ),
+ SubField(
+ name='duration_reps',
+ def_num=2,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='reps',
+ raw_value=29,
+ ),
+ ),
+ ),
+ SubField( # message_index of step to loop back to. Steps are assumed to be in the order by message_index. custom_name and intensity members are undefined for this duration type.
+ name='duration_step',
+ def_num=2,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_steps_cmplt',
+ raw_value=6,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_time',
+ raw_value=7,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_distance',
+ raw_value=8,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_calories',
+ raw_value=9,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_hr_less_than',
+ raw_value=10,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_hr_greater_than',
+ raw_value=11,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_power_less_than',
+ raw_value=12,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_power_greater_than',
+ raw_value=13,
+ ),
+ ),
+ ),
+ SubField(
+ name='duration_time',
+ def_num=2,
+ type=BASE_TYPES[0x86], # uint32
+ scale=1000,
+ units='s',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='time',
+ raw_value=0,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repetition_time',
+ raw_value=28,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 3: Field(
+ name='target_type',
+ type=FIELD_TYPES['wkt_step_target'],
+ def_num=3,
+ ),
+ 4: Field(
+ name='target_value',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ subfields=(
+ SubField(
+ name='repeat_calories',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ units='calories',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_calories',
+ raw_value=9,
+ ),
+ ),
+ ),
+ SubField(
+ name='repeat_distance',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ scale=100,
+ units='m',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_distance',
+ raw_value=8,
+ ),
+ ),
+ ),
+ SubField(
+ name='repeat_hr',
+ def_num=4,
+ type=FIELD_TYPES['workout_hr'],
+ units='% or bpm',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_hr_less_than',
+ raw_value=10,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_hr_greater_than',
+ raw_value=11,
+ ),
+ ),
+ ),
+ SubField(
+ name='repeat_power',
+ def_num=4,
+ type=FIELD_TYPES['workout_power'],
+ units='% or watts',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_power_less_than',
+ raw_value=12,
+ ),
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_power_greater_than',
+ raw_value=13,
+ ),
+ ),
+ ),
+ SubField( # # of repetitions
+ name='repeat_steps',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_steps_cmplt',
+ raw_value=6,
+ ),
+ ),
+ ),
+ SubField(
+ name='repeat_time',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ scale=1000,
+ units='s',
+ ref_fields=(
+ ReferenceField(
+ name='duration_type',
+ def_num=1,
+ value='repeat_until_time',
+ raw_value=7,
+ ),
+ ),
+ ),
+ SubField( # Zone (1-?); Custom = 0;
+ name='target_cadence_zone',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='cadence',
+ raw_value=3,
+ ),
+ ),
+ ),
+ SubField( # hr zone (1-5);Custom =0;
+ name='target_hr_zone',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='heart_rate',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField( # Power Zone ( 1-7); Custom = 0;
+ name='target_power_zone',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='power',
+ raw_value=4,
+ ),
+ ),
+ ),
+ SubField( # speed zone (1-10);Custom =0;
+ name='target_speed_zone',
+ def_num=4,
+ type=BASE_TYPES[0x86], # uint32
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='speed',
+ raw_value=0,
+ ),
+ ),
+ ),
+ SubField(
+ name='target_stroke_type',
+ def_num=4,
+ type=FIELD_TYPES['swim_stroke'],
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='swim_stroke',
+ raw_value=11,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 5: Field(
+ name='custom_target_value_low',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=5,
+ subfields=(
+ SubField(
+ name='custom_target_cadence_low',
+ def_num=5,
+ type=BASE_TYPES[0x86], # uint32
+ units='rpm',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='cadence',
+ raw_value=3,
+ ),
+ ),
+ ),
+ SubField(
+ name='custom_target_heart_rate_low',
+ def_num=5,
+ type=FIELD_TYPES['workout_hr'],
+ units='% or bpm',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='heart_rate',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField(
+ name='custom_target_power_low',
+ def_num=5,
+ type=FIELD_TYPES['workout_power'],
+ units='% or watts',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='power',
+ raw_value=4,
+ ),
+ ),
+ ),
+ SubField(
+ name='custom_target_speed_low',
+ def_num=5,
+ type=BASE_TYPES[0x86], # uint32
+ scale=1000,
+ units='m/s',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='speed',
+ raw_value=0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 6: Field(
+ name='custom_target_value_high',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=6,
+ subfields=(
+ SubField(
+ name='custom_target_cadence_high',
+ def_num=6,
+ type=BASE_TYPES[0x86], # uint32
+ units='rpm',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='cadence',
+ raw_value=3,
+ ),
+ ),
+ ),
+ SubField(
+ name='custom_target_heart_rate_high',
+ def_num=6,
+ type=FIELD_TYPES['workout_hr'],
+ units='% or bpm',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='heart_rate',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField(
+ name='custom_target_power_high',
+ def_num=6,
+ type=FIELD_TYPES['workout_power'],
+ units='% or watts',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='power',
+ raw_value=4,
+ ),
+ ),
+ ),
+ SubField(
+ name='custom_target_speed_high',
+ def_num=6,
+ type=BASE_TYPES[0x86], # uint32
+ scale=1000,
+ units='m/s',
+ ref_fields=(
+ ReferenceField(
+ name='target_type',
+ def_num=3,
+ value='speed',
+ raw_value=0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 7: Field(
+ name='intensity',
+ type=FIELD_TYPES['intensity'],
+ def_num=7,
+ ),
+ 8: Field(
+ name='notes',
+ type=BASE_TYPES[0x07], # string
+ def_num=8,
+ ),
+ 9: Field(
+ name='equipment',
+ type=FIELD_TYPES['workout_equipment'],
+ def_num=9,
+ ),
+ 10: Field(
+ name='exercise_category',
+ type=FIELD_TYPES['exercise_category'],
+ def_num=10,
+ ),
+ 11: Field(
+ name='exercise_name',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=11,
+ ),
+ 12: Field(
+ name='exercise_weight',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=12,
+ scale=100,
+ units='kg',
+ ),
+ 13: Field(
+ name='weight_display_unit',
+ type=FIELD_TYPES['fit_base_unit'],
+ def_num=13,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 32: MessageType(
+ name='course_point',
+ mesg_num=32,
+ fields={
+ 1: Field(
+ name='timestamp',
+ type=FIELD_TYPES['date_time'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=2,
+ units='semicircles',
+ ),
+ 3: Field(
+ name='position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=3,
+ units='semicircles',
+ ),
+ 4: Field(
+ name='distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ scale=100,
+ units='m',
+ ),
+ 5: Field(
+ name='type',
+ type=FIELD_TYPES['course_point'],
+ def_num=5,
+ ),
+ 6: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=6,
+ ),
+ 8: Field(
+ name='favorite',
+ type=FIELD_TYPES['bool'],
+ def_num=8,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 37: MessageType(
+ name='file_capabilities',
+ mesg_num=37,
+ fields={
+ 0: Field(
+ name='type',
+ type=FIELD_TYPES['file'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='flags',
+ type=FIELD_TYPES['file_flags'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='directory',
+ type=BASE_TYPES[0x07], # string
+ def_num=2,
+ ),
+ 3: Field(
+ name='max_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ ),
+ 4: Field(
+ name='max_size',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ units='bytes',
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 38: MessageType(
+ name='mesg_capabilities',
+ mesg_num=38,
+ fields={
+ 0: Field(
+ name='file',
+ type=FIELD_TYPES['file'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='mesg_num',
+ type=FIELD_TYPES['mesg_num'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='count_type',
+ type=FIELD_TYPES['mesg_count'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ subfields=(
+ SubField(
+ name='max_per_file',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ ref_fields=(
+ ReferenceField(
+ name='count_type',
+ def_num=2,
+ value='max_per_file',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField(
+ name='max_per_file_type',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ ref_fields=(
+ ReferenceField(
+ name='count_type',
+ def_num=2,
+ value='max_per_file_type',
+ raw_value=2,
+ ),
+ ),
+ ),
+ SubField(
+ name='num_per_file',
+ def_num=3,
+ type=BASE_TYPES[0x84], # uint16
+ ref_fields=(
+ ReferenceField(
+ name='count_type',
+ def_num=2,
+ value='num_per_file',
+ raw_value=0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 39: MessageType(
+ name='field_capabilities',
+ mesg_num=39,
+ fields={
+ 0: Field(
+ name='file',
+ type=FIELD_TYPES['file'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='mesg_num',
+ type=FIELD_TYPES['mesg_num'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='field_num',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=2,
+ ),
+ 3: Field(
+ name='count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 49: MessageType(
+ name='file_creator',
+ mesg_num=49,
+ fields={
+ 0: Field(
+ name='software_version',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ ),
+ 1: Field(
+ name='hardware_version',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ ),
+ },
+ ),
+ 53: MessageType(
+ name='speed_zone',
+ mesg_num=53,
+ fields={
+ 0: Field(
+ name='high_value',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ scale=1000,
+ units='m/s',
+ ),
+ 1: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 55: MessageType(
+ name='monitoring',
+ mesg_num=55,
+ fields={
+ 0: Field( # Associates this data to device_info message. Not required for file with single device (sensor).
+ name='device_index',
+ type=FIELD_TYPES['device_index'],
+ def_num=0,
+ ),
+ 1: Field( # Accumulated total calories. Maintained by MonitoringReader for each activity_type. See SDK documentation
+ name='calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='kcal',
+ ),
+ 2: Field( # Accumulated distance. Maintained by MonitoringReader for each activity_type. See SDK documentation.
+ name='distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ scale=100,
+ units='m',
+ ),
+ 3: Field( # Accumulated cycles. Maintained by MonitoringReader for each activity_type. See SDK documentation.
+ name='cycles',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ scale=2,
+ units='cycles',
+ subfields=(
+ SubField(
+ name='steps',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ units='steps',
+ ref_fields=(
+ ReferenceField(
+ name='activity_type',
+ def_num=5,
+ value='walking',
+ raw_value=6,
+ ),
+ ReferenceField(
+ name='activity_type',
+ def_num=5,
+ value='running',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField(
+ name='strokes',
+ def_num=3,
+ type=BASE_TYPES[0x86], # uint32
+ scale=2,
+ units='strokes',
+ ref_fields=(
+ ReferenceField(
+ name='activity_type',
+ def_num=5,
+ value='cycling',
+ raw_value=2,
+ ),
+ ReferenceField(
+ name='activity_type',
+ def_num=5,
+ value='swimming',
+ raw_value=5,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 4: Field(
+ name='active_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ scale=1000,
+ units='s',
+ ),
+ 5: Field(
+ name='activity_type',
+ type=FIELD_TYPES['activity_type'],
+ def_num=5,
+ ),
+ 6: Field(
+ name='activity_subtype',
+ type=FIELD_TYPES['activity_subtype'],
+ def_num=6,
+ ),
+ 7: Field(
+ name='activity_level',
+ type=FIELD_TYPES['activity_level'],
+ def_num=7,
+ ),
+ 8: Field(
+ name='distance_16',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=8,
+ units='100*m',
+ ),
+ 9: Field(
+ name='cycles_16',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=9,
+ units='2*cycles or steps',
+ ),
+ 10: Field(
+ name='active_time_16',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=10,
+ units='s',
+ ),
+ 11: Field( # Must align to logging interval, for example, time must be 00:00:00 for daily log.
+ name='local_timestamp',
+ type=FIELD_TYPES['local_date_time'],
+ def_num=11,
+ ),
+ 12: Field( # Avg temperature during the logging interval ended at timestamp
+ name='temperature',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=12,
+ scale=100,
+ units='C',
+ ),
+ 14: Field( # Min temperature during the logging interval ended at timestamp
+ name='temperature_min',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=14,
+ scale=100,
+ units='C',
+ ),
+ 15: Field( # Max temperature during the logging interval ended at timestamp
+ name='temperature_max',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=15,
+ scale=100,
+ units='C',
+ ),
+ 16: Field( # Indexed using minute_activity_level enum
+ name='activity_time',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=16,
+ units='minutes',
+ ),
+ 19: Field(
+ name='active_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=19,
+ units='kcal',
+ ),
+ 24: Field( # Indicates single type / intensity for duration since last monitoring message.
+ name='current_activity_type_intensity',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=24,
+ components=(
+ ComponentField(
+ name='activity_type',
+ def_num=5,
+ accumulate=False,
+ bits=5,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='intensity',
+ def_num=28,
+ accumulate=False,
+ bits=3,
+ bit_offset=5,
+ ),
+ ),
+ ),
+ 25: Field(
+ name='timestamp_min_8',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=25,
+ units='min',
+ ),
+ 26: Field(
+ name='timestamp_16',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=26,
+ units='s',
+ ),
+ 27: Field(
+ name='heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=27,
+ units='bpm',
+ ),
+ 28: Field(
+ name='intensity',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=28,
+ scale=10,
+ ),
+ 29: Field(
+ name='duration_min',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=29,
+ units='min',
+ ),
+ 30: Field(
+ name='duration',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=30,
+ units='s',
+ ),
+ 31: Field(
+ name='ascent',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=31,
+ scale=1000,
+ units='m',
+ ),
+ 32: Field(
+ name='descent',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=32,
+ scale=1000,
+ units='m',
+ ),
+ 33: Field(
+ name='moderate_activity_minutes',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=33,
+ units='minutes',
+ ),
+ 34: Field(
+ name='vigorous_activity_minutes',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=34,
+ units='minutes',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Must align to logging interval, for example, time must be 00:00:00 for daily log.
+ },
+ ),
+ 72: MessageType( # Corresponds to file_id of workout or course.
+ name='training_file',
+ mesg_num=72,
+ fields={
+ 0: Field(
+ name='type',
+ type=FIELD_TYPES['file'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='manufacturer',
+ type=FIELD_TYPES['manufacturer'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='product',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ subfields=(
+ SubField(
+ name='garmin_product',
+ def_num=2,
+ type=FIELD_TYPES['garmin_product'],
+ ref_fields=(
+ ReferenceField(
+ name='manufacturer',
+ def_num=1,
+ value='garmin',
+ raw_value=1,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=1,
+ value='dynastream',
+ raw_value=15,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=1,
+ value='dynastream_oem',
+ raw_value=13,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 3: Field(
+ name='serial_number',
+ type=BASE_TYPES[0x8C], # uint32z
+ def_num=3,
+ ),
+ 4: Field(
+ name='time_created',
+ type=FIELD_TYPES['date_time'],
+ def_num=4,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 78: MessageType( # Heart rate variability
+ name='hrv',
+ mesg_num=78,
+ fields={
+ 0: Field( # Time between beats
+ name='time',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ scale=1000,
+ units='s',
+ ),
+ },
+ ),
+ 80: MessageType(
+ name='ant_rx',
+ mesg_num=80,
+ fields={
+ 0: Field(
+ name='fractional_timestamp',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ scale=32768,
+ units='s',
+ ),
+ 1: Field(
+ name='mesg_id',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=1,
+ ),
+ 2: Field(
+ name='mesg_data',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=2,
+ components=(
+ ComponentField(
+ name='channel_number',
+ def_num=3,
+ accumulate=False,
+ bits=8,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=8,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=16,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=24,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=32,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=40,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=48,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=56,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=64,
+ ),
+ ),
+ ),
+ 3: Field(
+ name='channel_number',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ ),
+ 4: Field(
+ name='data',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=4,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 81: MessageType(
+ name='ant_tx',
+ mesg_num=81,
+ fields={
+ 0: Field(
+ name='fractional_timestamp',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ scale=32768,
+ units='s',
+ ),
+ 1: Field(
+ name='mesg_id',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=1,
+ ),
+ 2: Field(
+ name='mesg_data',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=2,
+ components=(
+ ComponentField(
+ name='channel_number',
+ def_num=3,
+ accumulate=False,
+ bits=8,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=8,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=16,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=24,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=32,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=40,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=48,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=56,
+ ),
+ ComponentField(
+ name='data',
+ def_num=4,
+ accumulate=False,
+ bits=8,
+ bit_offset=64,
+ ),
+ ),
+ ),
+ 3: Field(
+ name='channel_number',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ ),
+ 4: Field(
+ name='data',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=4,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 82: MessageType(
+ name='ant_channel_id',
+ mesg_num=82,
+ fields={
+ 0: Field(
+ name='channel_number',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ ),
+ 1: Field(
+ name='device_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=1,
+ ),
+ 2: Field(
+ name='device_number',
+ type=BASE_TYPES[0x8B], # uint16z
+ def_num=2,
+ ),
+ 3: Field(
+ name='transmission_type',
+ type=BASE_TYPES[0x0A], # uint8z
+ def_num=3,
+ ),
+ 4: Field(
+ name='device_index',
+ type=FIELD_TYPES['device_index'],
+ def_num=4,
+ ),
+ },
+ ),
+ 101: MessageType(
+ name='length',
+ mesg_num=101,
+ fields={
+ 0: Field(
+ name='event',
+ type=FIELD_TYPES['event'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='event_type',
+ type=FIELD_TYPES['event_type'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='start_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='total_elapsed_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ scale=1000,
+ units='s',
+ ),
+ 4: Field(
+ name='total_timer_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ scale=1000,
+ units='s',
+ ),
+ 5: Field(
+ name='total_strokes',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ units='strokes',
+ ),
+ 6: Field(
+ name='avg_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=6,
+ scale=1000,
+ units='m/s',
+ ),
+ 7: Field(
+ name='swim_stroke',
+ type=FIELD_TYPES['swim_stroke'],
+ def_num=7,
+ units='swim_stroke',
+ ),
+ 9: Field(
+ name='avg_swimming_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=9,
+ units='strokes/min',
+ ),
+ 10: Field(
+ name='event_group',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=10,
+ ),
+ 11: Field(
+ name='total_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=11,
+ units='kcal',
+ ),
+ 12: Field(
+ name='length_type',
+ type=FIELD_TYPES['length_type'],
+ def_num=12,
+ ),
+ 18: Field(
+ name='player_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=18,
+ ),
+ 19: Field(
+ name='opponent_score',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=19,
+ ),
+ 20: Field( # stroke_type enum used as the index
+ name='stroke_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=20,
+ units='counts',
+ ),
+ 21: Field( # zone number used as the index
+ name='zone_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=21,
+ units='counts',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 106: MessageType(
+ name='slave_device',
+ mesg_num=106,
+ fields={
+ 0: Field(
+ name='manufacturer',
+ type=FIELD_TYPES['manufacturer'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='product',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ subfields=(
+ SubField(
+ name='garmin_product',
+ def_num=1,
+ type=FIELD_TYPES['garmin_product'],
+ ref_fields=(
+ ReferenceField(
+ name='manufacturer',
+ def_num=0,
+ value='garmin',
+ raw_value=1,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=0,
+ value='dynastream',
+ raw_value=15,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=0,
+ value='dynastream_oem',
+ raw_value=13,
+ ),
+ ),
+ ),
+ ),
+ ),
+ },
+ ),
+ 127: MessageType(
+ name='connectivity',
+ mesg_num=127,
+ fields={
+ 0: Field( # Use Bluetooth for connectivity features
+ name='bluetooth_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=0,
+ ),
+ 1: Field( # Use Bluetooth Low Energy for connectivity features
+ name='bluetooth_le_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=1,
+ ),
+ 2: Field( # Use ANT for connectivity features
+ name='ant_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=3,
+ ),
+ 4: Field(
+ name='live_tracking_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='weather_conditions_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=5,
+ ),
+ 6: Field(
+ name='weather_alerts_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=6,
+ ),
+ 7: Field(
+ name='auto_activity_upload_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=7,
+ ),
+ 8: Field(
+ name='course_download_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=8,
+ ),
+ 9: Field(
+ name='workout_download_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=9,
+ ),
+ 10: Field(
+ name='gps_ephemeris_download_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=10,
+ ),
+ 11: Field(
+ name='incident_detection_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=11,
+ ),
+ 12: Field(
+ name='grouptrack_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=12,
+ ),
+ },
+ ),
+ 128: MessageType(
+ name='weather_conditions',
+ mesg_num=128,
+ fields={
+ 0: Field( # Current or forecast
+ name='weather_report',
+ type=FIELD_TYPES['weather_report'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=1,
+ units='C',
+ ),
+ 2: Field( # Corresponds to GSC Response weatherIcon field
+ name='condition',
+ type=FIELD_TYPES['weather_status'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='wind_direction',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ units='degrees',
+ ),
+ 4: Field(
+ name='wind_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ scale=1000,
+ units='m/s',
+ ),
+ 5: Field( # range 0-100
+ name='precipitation_probability',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=5,
+ ),
+ 6: Field( # Heat Index if GCS heatIdx above or equal to 90F or wind chill if GCS windChill below or equal to 32F
+ name='temperature_feels_like',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=6,
+ units='C',
+ ),
+ 7: Field(
+ name='relative_humidity',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=7,
+ ),
+ 8: Field( # string corresponding to GCS response location string
+ name='location',
+ type=BASE_TYPES[0x07], # string
+ def_num=8,
+ ),
+ 9: Field(
+ name='observed_at_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=9,
+ ),
+ 10: Field(
+ name='observed_location_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=10,
+ units='semicircles',
+ ),
+ 11: Field(
+ name='observed_location_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=11,
+ units='semicircles',
+ ),
+ 12: Field(
+ name='day_of_week',
+ type=FIELD_TYPES['day_of_week'],
+ def_num=12,
+ ),
+ 13: Field(
+ name='high_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=13,
+ units='C',
+ ),
+ 14: Field(
+ name='low_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=14,
+ units='C',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # time of update for current conditions, else forecast time
+ },
+ ),
+ 129: MessageType(
+ name='weather_alert',
+ mesg_num=129,
+ fields={
+ 0: Field( # Unique identifier from GCS report ID string, length is 12
+ name='report_id',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field( # Time alert was issued
+ name='issue_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=1,
+ ),
+ 2: Field( # Time alert expires
+ name='expire_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=2,
+ ),
+ 3: Field( # Warning, Watch, Advisory, Statement
+ name='severity',
+ type=FIELD_TYPES['weather_severity'],
+ def_num=3,
+ ),
+ 4: Field( # Tornado, Severe Thunderstorm, etc.
+ name='type',
+ type=FIELD_TYPES['weather_severe_type'],
+ def_num=4,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 131: MessageType(
+ name='cadence_zone',
+ mesg_num=131,
+ fields={
+ 0: Field(
+ name='high_value',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ units='rpm',
+ ),
+ 1: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 132: MessageType(
+ name='hr',
+ mesg_num=132,
+ fields={
+ 0: Field(
+ name='fractional_timestamp',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ scale=32768,
+ units='s',
+ ),
+ 1: Field(
+ name='time256',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ components=(
+ ComponentField(
+ name='fractional_timestamp',
+ def_num=0,
+ scale=256,
+ units='s',
+ accumulate=False,
+ bits=8,
+ bit_offset=0,
+ ),
+ ),
+ ),
+ 6: Field(
+ name='filtered_bpm',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ units='bpm',
+ ),
+ 9: Field(
+ name='event_timestamp',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=9,
+ scale=1024,
+ units='s',
+ ),
+ 10: Field(
+ name='event_timestamp_12',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=10,
+ components=(
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=12,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=24,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=36,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=48,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=60,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=72,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=84,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=96,
+ ),
+ ComponentField(
+ name='event_timestamp',
+ def_num=9,
+ scale=1024,
+ units='s',
+ accumulate=True,
+ bits=12,
+ bit_offset=108,
+ ),
+ ),
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 142: MessageType(
+ name='segment_lap',
+ mesg_num=142,
+ fields={
+ 0: Field(
+ name='event',
+ type=FIELD_TYPES['event'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='event_type',
+ type=FIELD_TYPES['event_type'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='start_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='start_position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=3,
+ units='semicircles',
+ ),
+ 4: Field(
+ name='start_position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=4,
+ units='semicircles',
+ ),
+ 5: Field(
+ name='end_position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=5,
+ units='semicircles',
+ ),
+ 6: Field(
+ name='end_position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=6,
+ units='semicircles',
+ ),
+ 7: Field( # Time (includes pauses)
+ name='total_elapsed_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=7,
+ scale=1000,
+ units='s',
+ ),
+ 8: Field( # Timer Time (excludes pauses)
+ name='total_timer_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=8,
+ scale=1000,
+ units='s',
+ ),
+ 9: Field(
+ name='total_distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=9,
+ scale=100,
+ units='m',
+ ),
+ 10: Field(
+ name='total_cycles',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=10,
+ units='cycles',
+ subfields=(
+ SubField(
+ name='total_strokes',
+ def_num=10,
+ type=BASE_TYPES[0x86], # uint32
+ units='strokes',
+ ref_fields=(
+ ReferenceField(
+ name='sport',
+ def_num=23,
+ value='cycling',
+ raw_value=2,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 11: Field(
+ name='total_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=11,
+ units='kcal',
+ ),
+ 12: Field( # If New Leaf
+ name='total_fat_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=12,
+ units='kcal',
+ ),
+ 13: Field(
+ name='avg_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=13,
+ scale=1000,
+ units='m/s',
+ ),
+ 14: Field(
+ name='max_speed',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=14,
+ scale=1000,
+ units='m/s',
+ ),
+ 15: Field(
+ name='avg_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=15,
+ units='bpm',
+ ),
+ 16: Field(
+ name='max_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=16,
+ units='bpm',
+ ),
+ 17: Field( # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time
+ name='avg_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=17,
+ units='rpm',
+ ),
+ 18: Field(
+ name='max_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=18,
+ units='rpm',
+ ),
+ 19: Field( # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time
+ name='avg_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=19,
+ units='watts',
+ ),
+ 20: Field(
+ name='max_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=20,
+ units='watts',
+ ),
+ 21: Field(
+ name='total_ascent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=21,
+ units='m',
+ ),
+ 22: Field(
+ name='total_descent',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=22,
+ units='m',
+ ),
+ 23: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=23,
+ ),
+ 24: Field(
+ name='event_group',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=24,
+ ),
+ 25: Field( # North east corner latitude.
+ name='nec_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=25,
+ units='semicircles',
+ ),
+ 26: Field( # North east corner longitude.
+ name='nec_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=26,
+ units='semicircles',
+ ),
+ 27: Field( # South west corner latitude.
+ name='swc_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=27,
+ units='semicircles',
+ ),
+ 28: Field( # South west corner latitude.
+ name='swc_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=28,
+ units='semicircles',
+ ),
+ 29: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=29,
+ ),
+ 30: Field(
+ name='normalized_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=30,
+ units='watts',
+ ),
+ 31: Field(
+ name='left_right_balance',
+ type=FIELD_TYPES['left_right_balance_100'],
+ def_num=31,
+ ),
+ 32: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=32,
+ ),
+ 33: Field(
+ name='total_work',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=33,
+ units='J',
+ ),
+ 34: Field(
+ name='avg_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=34,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 35: Field(
+ name='max_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=35,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 36: Field(
+ name='gps_accuracy',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=36,
+ units='m',
+ ),
+ 37: Field(
+ name='avg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=37,
+ scale=100,
+ units='%',
+ ),
+ 38: Field(
+ name='avg_pos_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=38,
+ scale=100,
+ units='%',
+ ),
+ 39: Field(
+ name='avg_neg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=39,
+ scale=100,
+ units='%',
+ ),
+ 40: Field(
+ name='max_pos_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=40,
+ scale=100,
+ units='%',
+ ),
+ 41: Field(
+ name='max_neg_grade',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=41,
+ scale=100,
+ units='%',
+ ),
+ 42: Field(
+ name='avg_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=42,
+ units='C',
+ ),
+ 43: Field(
+ name='max_temperature',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=43,
+ units='C',
+ ),
+ 44: Field(
+ name='total_moving_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=44,
+ scale=1000,
+ units='s',
+ ),
+ 45: Field(
+ name='avg_pos_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=45,
+ scale=1000,
+ units='m/s',
+ ),
+ 46: Field(
+ name='avg_neg_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=46,
+ scale=1000,
+ units='m/s',
+ ),
+ 47: Field(
+ name='max_pos_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=47,
+ scale=1000,
+ units='m/s',
+ ),
+ 48: Field(
+ name='max_neg_vertical_speed',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=48,
+ scale=1000,
+ units='m/s',
+ ),
+ 49: Field(
+ name='time_in_hr_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=49,
+ scale=1000,
+ units='s',
+ ),
+ 50: Field(
+ name='time_in_speed_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=50,
+ scale=1000,
+ units='s',
+ ),
+ 51: Field(
+ name='time_in_cadence_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=51,
+ scale=1000,
+ units='s',
+ ),
+ 52: Field(
+ name='time_in_power_zone',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=52,
+ scale=1000,
+ units='s',
+ ),
+ 53: Field(
+ name='repetition_num',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=53,
+ ),
+ 54: Field(
+ name='min_altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=54,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 55: Field(
+ name='min_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=55,
+ units='bpm',
+ ),
+ 56: Field(
+ name='active_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=56,
+ scale=1000,
+ units='s',
+ ),
+ 57: Field(
+ name='wkt_step_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=57,
+ ),
+ 58: Field(
+ name='sport_event',
+ type=FIELD_TYPES['sport_event'],
+ def_num=58,
+ ),
+ 59: Field(
+ name='avg_left_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=59,
+ scale=2,
+ units='percent',
+ ),
+ 60: Field(
+ name='avg_right_torque_effectiveness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=60,
+ scale=2,
+ units='percent',
+ ),
+ 61: Field(
+ name='avg_left_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=61,
+ scale=2,
+ units='percent',
+ ),
+ 62: Field(
+ name='avg_right_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=62,
+ scale=2,
+ units='percent',
+ ),
+ 63: Field(
+ name='avg_combined_pedal_smoothness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=63,
+ scale=2,
+ units='percent',
+ ),
+ 64: Field(
+ name='status',
+ type=FIELD_TYPES['segment_lap_status'],
+ def_num=64,
+ ),
+ 65: Field(
+ name='uuid',
+ type=BASE_TYPES[0x07], # string
+ def_num=65,
+ ),
+ 66: Field( # fractional part of the avg_cadence
+ name='avg_fractional_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=66,
+ scale=128,
+ units='rpm',
+ ),
+ 67: Field( # fractional part of the max_cadence
+ name='max_fractional_cadence',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=67,
+ scale=128,
+ units='rpm',
+ ),
+ 68: Field( # fractional part of the total_cycles
+ name='total_fractional_cycles',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=68,
+ scale=128,
+ units='cycles',
+ ),
+ 69: Field(
+ name='front_gear_shift_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=69,
+ ),
+ 70: Field(
+ name='rear_gear_shift_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=70,
+ ),
+ 71: Field( # Total time spent in the standing position
+ name='time_standing',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=71,
+ scale=1000,
+ units='s',
+ ),
+ 72: Field( # Number of transitions to the standing state
+ name='stand_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=72,
+ ),
+ 73: Field( # Average left platform center offset
+ name='avg_left_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=73,
+ units='mm',
+ ),
+ 74: Field( # Average right platform center offset
+ name='avg_right_pco',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=74,
+ units='mm',
+ ),
+ 75: Field( # Average left power phase angles. Data value indexes defined by power_phase_type.
+ name='avg_left_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=75,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 76: Field( # Average left power phase peak angles. Data value indexes defined by power_phase_type.
+ name='avg_left_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=76,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 77: Field( # Average right power phase angles. Data value indexes defined by power_phase_type.
+ name='avg_right_power_phase',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=77,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 78: Field( # Average right power phase peak angles. Data value indexes defined by power_phase_type.
+ name='avg_right_power_phase_peak',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=78,
+ scale=0.7111111,
+ units='degrees',
+ ),
+ 79: Field( # Average power by position. Data value indexes defined by rider_position_type.
+ name='avg_power_position',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=79,
+ units='watts',
+ ),
+ 80: Field( # Maximum power by position. Data value indexes defined by rider_position_type.
+ name='max_power_position',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=80,
+ units='watts',
+ ),
+ 81: Field( # Average cadence by position. Data value indexes defined by rider_position_type.
+ name='avg_cadence_position',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=81,
+ units='rpm',
+ ),
+ 82: Field( # Maximum cadence by position. Data value indexes defined by rider_position_type.
+ name='max_cadence_position',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=82,
+ units='rpm',
+ ),
+ 83: Field( # Manufacturer that produced the segment
+ name='manufacturer',
+ type=FIELD_TYPES['manufacturer'],
+ def_num=83,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Lap end time.
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 149: MessageType( # Unique Identification data for an individual segment leader within a segment file
+ name='segment_leaderboard_entry',
+ mesg_num=149,
+ fields={
+ 0: Field( # Friendly name assigned to leader
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field( # Leader classification
+ name='type',
+ type=FIELD_TYPES['segment_leaderboard_type'],
+ def_num=1,
+ ),
+ 2: Field( # Primary user ID of this leader
+ name='group_primary_key',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ ),
+ 3: Field( # ID of the activity associated with this leader time
+ name='activity_id',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ ),
+ 4: Field( # Segment Time (includes pauses)
+ name='segment_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ scale=1000,
+ units='s',
+ ),
+ 5: Field( # String version of the activity_id. 21 characters long, express in decimal
+ name='activity_id_string',
+ type=BASE_TYPES[0x07], # string
+ def_num=5,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 150: MessageType( # Navigation and race evaluation point for a segment decribing a point along the segment path and time it took each segment leader to reach that point
+ name='segment_point',
+ mesg_num=150,
+ fields={
+ 1: Field(
+ name='position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=1,
+ units='semicircles',
+ ),
+ 2: Field(
+ name='position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=2,
+ units='semicircles',
+ ),
+ 3: Field( # Accumulated distance along the segment at the described point
+ name='distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ scale=100,
+ units='m',
+ ),
+ 4: Field( # Accumulated altitude along the segment at the described point
+ name='altitude',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 5: Field( # Accumualted time each leader board member required to reach the described point. This value is zero for all leader board members at the starting point of the segment.
+ name='leader_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=5,
+ scale=1000,
+ units='s',
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 158: MessageType(
+ name='workout_session',
+ mesg_num=158,
+ fields={
+ 0: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='num_valid_steps',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ ),
+ 3: Field(
+ name='first_step_index',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ ),
+ 4: Field(
+ name='pool_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ scale=100,
+ units='m',
+ ),
+ 5: Field(
+ name='pool_length_unit',
+ type=FIELD_TYPES['display_measure'],
+ def_num=5,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 159: MessageType(
+ name='watchface_settings',
+ mesg_num=159,
+ fields={
+ 0: Field(
+ name='mode',
+ type=FIELD_TYPES['watchface_mode'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='layout',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=1,
+ subfields=(
+ SubField(
+ name='analog_layout',
+ def_num=1,
+ type=FIELD_TYPES['analog_watchface_layout'],
+ ref_fields=(
+ ReferenceField(
+ name='mode',
+ def_num=0,
+ value='analog',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField(
+ name='digital_layout',
+ def_num=1,
+ type=FIELD_TYPES['digital_watchface_layout'],
+ ref_fields=(
+ ReferenceField(
+ name='mode',
+ def_num=0,
+ value='digital',
+ raw_value=0,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 160: MessageType(
+ name='gps_metadata',
+ mesg_num=160,
+ fields={
+ 0: Field( # Millisecond part of the timestamp.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field(
+ name='position_lat',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=1,
+ units='semicircles',
+ ),
+ 2: Field(
+ name='position_long',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=2,
+ units='semicircles',
+ ),
+ 3: Field(
+ name='enhanced_altitude',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ scale=5,
+ offset=500,
+ units='m',
+ ),
+ 4: Field(
+ name='enhanced_speed',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ scale=1000,
+ units='m/s',
+ ),
+ 5: Field(
+ name='heading',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ scale=100,
+ units='degrees',
+ ),
+ 6: Field( # Used to correlate UTC to system time if the timestamp of the message is in system time. This UTC time is derived from the GPS data.
+ name='utc_timestamp',
+ type=FIELD_TYPES['date_time'],
+ def_num=6,
+ units='s',
+ ),
+ 7: Field( # velocity[0] is lon velocity. Velocity[1] is lat velocity. Velocity[2] is altitude velocity.
+ name='velocity',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=7,
+ scale=100,
+ units='m/s',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp.
+ },
+ ),
+ 161: MessageType(
+ name='camera_event',
+ mesg_num=161,
+ fields={
+ 0: Field( # Millisecond part of the timestamp.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field(
+ name='camera_event_type',
+ type=FIELD_TYPES['camera_event_type'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='camera_file_uuid',
+ type=BASE_TYPES[0x07], # string
+ def_num=2,
+ ),
+ 3: Field(
+ name='camera_orientation',
+ type=FIELD_TYPES['camera_orientation_type'],
+ def_num=3,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp.
+ },
+ ),
+ 162: MessageType(
+ name='timestamp_correlation',
+ mesg_num=162,
+ fields={
+ 0: Field( # Fractional part of the UTC timestamp at the time the system timestamp was recorded.
+ name='fractional_timestamp',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ scale=32768,
+ units='s',
+ ),
+ 1: Field( # Whole second part of the system timestamp
+ name='system_timestamp',
+ type=FIELD_TYPES['date_time'],
+ def_num=1,
+ units='s',
+ ),
+ 2: Field( # Fractional part of the system timestamp
+ name='fractional_system_timestamp',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ scale=32768,
+ units='s',
+ ),
+ 3: Field( # timestamp epoch expressed in local time used to convert timestamps to local time
+ name='local_timestamp',
+ type=FIELD_TYPES['local_date_time'],
+ def_num=3,
+ units='s',
+ ),
+ 4: Field( # Millisecond part of the UTC timestamp at the time the system timestamp was recorded.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ units='ms',
+ ),
+ 5: Field( # Millisecond part of the system timestamp
+ name='system_timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ units='ms',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of UTC timestamp at the time the system timestamp was recorded.
+ },
+ ),
+ 164: MessageType(
+ name='gyroscope_data',
+ mesg_num=164,
+ fields={
+ 0: Field( # Millisecond part of the timestamp.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # Each time in the array describes the time at which the gyro sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in gyro_x and gyro_y and gyro_z
+ name='sample_time_offset',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='ms',
+ ),
+ 2: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='gyro_x',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ units='counts',
+ ),
+ 3: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='gyro_y',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ units='counts',
+ ),
+ 4: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='gyro_z',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ units='counts',
+ ),
+ 5: Field( # Calibrated gyro reading
+ name='calibrated_gyro_x',
+ type=BASE_TYPES[0x88], # float32
+ def_num=5,
+ units='deg/s',
+ ),
+ 6: Field( # Calibrated gyro reading
+ name='calibrated_gyro_y',
+ type=BASE_TYPES[0x88], # float32
+ def_num=6,
+ units='deg/s',
+ ),
+ 7: Field( # Calibrated gyro reading
+ name='calibrated_gyro_z',
+ type=BASE_TYPES[0x88], # float32
+ def_num=7,
+ units='deg/s',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
+ },
+ ),
+ 165: MessageType(
+ name='accelerometer_data',
+ mesg_num=165,
+ fields={
+ 0: Field( # Millisecond part of the timestamp.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # Each time in the array describes the time at which the accelerometer sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in accel_x and accel_y and accel_z
+ name='sample_time_offset',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='ms',
+ ),
+ 2: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='accel_x',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ units='counts',
+ ),
+ 3: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='accel_y',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ units='counts',
+ ),
+ 4: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='accel_z',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ units='counts',
+ ),
+ 5: Field( # Calibrated accel reading
+ name='calibrated_accel_x',
+ type=BASE_TYPES[0x88], # float32
+ def_num=5,
+ units='g',
+ ),
+ 6: Field( # Calibrated accel reading
+ name='calibrated_accel_y',
+ type=BASE_TYPES[0x88], # float32
+ def_num=6,
+ units='g',
+ ),
+ 7: Field( # Calibrated accel reading
+ name='calibrated_accel_z',
+ type=BASE_TYPES[0x88], # float32
+ def_num=7,
+ units='g',
+ ),
+ 8: Field( # Calibrated accel reading
+ name='compressed_calibrated_accel_x',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=8,
+ units='mG',
+ ),
+ 9: Field( # Calibrated accel reading
+ name='compressed_calibrated_accel_y',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=9,
+ units='mG',
+ ),
+ 10: Field( # Calibrated accel reading
+ name='compressed_calibrated_accel_z',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=10,
+ units='mG',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
+ },
+ ),
+ 167: MessageType(
+ name='three_d_sensor_calibration',
+ mesg_num=167,
+ fields={
+ 0: Field( # Indicates which sensor the calibration is for
+ name='sensor_type',
+ type=FIELD_TYPES['sensor_type'],
+ def_num=0,
+ ),
+ 1: Field( # Calibration factor used to convert from raw ADC value to degrees, g, etc.
+ name='calibration_factor',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=1,
+ subfields=(
+ SubField( # Accelerometer calibration factor
+ name='accel_cal_factor',
+ def_num=1,
+ type=BASE_TYPES[0x86], # uint32
+ units='g',
+ ref_fields=(
+ ReferenceField(
+ name='sensor_type',
+ def_num=0,
+ value='accelerometer',
+ raw_value=0,
+ ),
+ ),
+ ),
+ SubField( # Gyro calibration factor
+ name='gyro_cal_factor',
+ def_num=1,
+ type=BASE_TYPES[0x86], # uint32
+ units='deg/s',
+ ref_fields=(
+ ReferenceField(
+ name='sensor_type',
+ def_num=0,
+ value='gyroscope',
+ raw_value=1,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 2: Field( # Calibration factor divisor
+ name='calibration_divisor',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ units='counts',
+ ),
+ 3: Field( # Level shift value used to shift the ADC value back into range
+ name='level_shift',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ ),
+ 4: Field( # Internal calibration factors, one for each: xy, yx, zx
+ name='offset_cal',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=4,
+ ),
+ 5: Field( # 3 x 3 rotation matrix (row major)
+ name='orientation_matrix',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=5,
+ scale=65535,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
+ },
+ ),
+ 169: MessageType(
+ name='video_frame',
+ mesg_num=169,
+ fields={
+ 0: Field( # Millisecond part of the timestamp.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # Number of the frame that the timestamp and timestamp_ms correlate to
+ name='frame_number',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=1,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
+ },
+ ),
+ 174: MessageType(
+ name='obdii_data',
+ mesg_num=174,
+ fields={
+ 0: Field( # Fractional part of timestamp, added to timestamp
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # Offset of PID reading [i] from start_timestamp+start_timestamp_ms. Readings may span accross seconds.
+ name='time_offset',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='ms',
+ ),
+ 2: Field( # Parameter ID
+ name='pid',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=2,
+ ),
+ 3: Field( # Raw parameter data
+ name='raw_data',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=3,
+ ),
+ 4: Field( # Optional, data size of PID[i]. If not specified refer to SAE J1979.
+ name='pid_data_size',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=4,
+ ),
+ 5: Field( # System time associated with sample expressed in ms, can be used instead of time_offset. There will be a system_time value for each raw_data element. For multibyte pids the system_time is repeated.
+ name='system_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=5,
+ ),
+ 6: Field( # Timestamp of first sample recorded in the message. Used with time_offset to generate time of each sample
+ name='start_timestamp',
+ type=FIELD_TYPES['date_time'],
+ def_num=6,
+ ),
+ 7: Field( # Fractional part of start_timestamp
+ name='start_timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=7,
+ units='ms',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Timestamp message was output
+ },
+ ),
+ 177: MessageType(
+ name='nmea_sentence',
+ mesg_num=177,
+ fields={
+ 0: Field( # Fractional part of timestamp, added to timestamp
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # NMEA sentence
+ name='sentence',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Timestamp message was output
+ },
+ ),
+ 178: MessageType(
+ name='aviation_attitude',
+ mesg_num=178,
+ fields={
+ 0: Field( # Fractional part of timestamp, added to timestamp
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # System time associated with sample expressed in ms.
+ name='system_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=1,
+ units='ms',
+ ),
+ 2: Field( # Range -PI/2 to +PI/2
+ name='pitch',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=2,
+ scale=10430.38,
+ units='radians',
+ ),
+ 3: Field( # Range -PI to +PI
+ name='roll',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=3,
+ scale=10430.38,
+ units='radians',
+ ),
+ 4: Field( # Range -78.4 to +78.4 (-8 Gs to 8 Gs)
+ name='accel_lateral',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=4,
+ scale=100,
+ units='m/s^2',
+ ),
+ 5: Field( # Range -78.4 to +78.4 (-8 Gs to 8 Gs)
+ name='accel_normal',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=5,
+ scale=100,
+ units='m/s^2',
+ ),
+ 6: Field( # Range -8.727 to +8.727 (-500 degs/sec to +500 degs/sec)
+ name='turn_rate',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=6,
+ scale=1024,
+ units='radians/second',
+ ),
+ 7: Field(
+ name='stage',
+ type=FIELD_TYPES['attitude_stage'],
+ def_num=7,
+ ),
+ 8: Field( # The percent complete of the current attitude stage. Set to 0 for attitude stages 0, 1 and 2 and to 100 for attitude stage 3 by AHRS modules that do not support it. Range - 100
+ name='attitude_stage_complete',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=8,
+ units='%',
+ ),
+ 9: Field( # Track Angle/Heading Range 0 - 2pi
+ name='track',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=9,
+ scale=10430.38,
+ units='radians',
+ ),
+ 10: Field(
+ name='validity',
+ type=FIELD_TYPES['attitude_validity'],
+ def_num=10,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Timestamp message was output
+ },
+ ),
+ 184: MessageType(
+ name='video',
+ mesg_num=184,
+ fields={
+ 0: Field(
+ name='url',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field(
+ name='hosting_provider',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 2: Field( # Playback time of video
+ name='duration',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ units='ms',
+ ),
+ },
+ ),
+ 185: MessageType(
+ name='video_title',
+ mesg_num=185,
+ fields={
+ 0: Field( # Total number of title parts
+ name='message_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ ),
+ 1: Field(
+ name='text',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 254: Field( # Long titles will be split into multiple parts
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 186: MessageType(
+ name='video_description',
+ mesg_num=186,
+ fields={
+ 0: Field( # Total number of description parts
+ name='message_count',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ ),
+ 1: Field(
+ name='text',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 254: Field( # Long descriptions will be split into multiple parts
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 187: MessageType(
+ name='video_clip',
+ mesg_num=187,
+ fields={
+ 0: Field(
+ name='clip_number',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ ),
+ 1: Field(
+ name='start_timestamp',
+ type=FIELD_TYPES['date_time'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='start_timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ ),
+ 3: Field(
+ name='end_timestamp',
+ type=FIELD_TYPES['date_time'],
+ def_num=3,
+ ),
+ 4: Field(
+ name='end_timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ ),
+ 6: Field( # Start of clip in video time
+ name='clip_start',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=6,
+ units='ms',
+ ),
+ 7: Field( # End of clip in video time
+ name='clip_end',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=7,
+ units='ms',
+ ),
+ },
+ ),
+ 188: MessageType(
+ name='ohr_settings',
+ mesg_num=188,
+ fields={
+ 0: Field(
+ name='enabled',
+ type=FIELD_TYPES['switch'],
+ def_num=0,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+ 200: MessageType(
+ name='exd_screen_configuration',
+ mesg_num=200,
+ fields={
+ 0: Field(
+ name='screen_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ ),
+ 1: Field( # number of fields in screen
+ name='field_count',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ ),
+ 2: Field(
+ name='layout',
+ type=FIELD_TYPES['exd_layout'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='screen_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=3,
+ ),
+ },
+ ),
+ 201: MessageType(
+ name='exd_data_field_configuration',
+ mesg_num=201,
+ fields={
+ 0: Field(
+ name='screen_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ ),
+ 1: Field(
+ name='concept_field',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=1,
+ components=(
+ ComponentField(
+ name='field_id',
+ def_num=2,
+ accumulate=False,
+ bits=4,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='concept_count',
+ def_num=3,
+ accumulate=False,
+ bits=4,
+ bit_offset=4,
+ ),
+ ),
+ ),
+ 2: Field(
+ name='field_id',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=2,
+ ),
+ 3: Field(
+ name='concept_count',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ ),
+ 4: Field(
+ name='display_type',
+ type=FIELD_TYPES['exd_display_type'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='title',
+ type=BASE_TYPES[0x07], # string
+ def_num=5,
+ ),
+ },
+ ),
+ 202: MessageType(
+ name='exd_data_concept_configuration',
+ mesg_num=202,
+ fields={
+ 0: Field(
+ name='screen_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ ),
+ 1: Field(
+ name='concept_field',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=1,
+ components=(
+ ComponentField(
+ name='field_id',
+ def_num=2,
+ accumulate=False,
+ bits=4,
+ bit_offset=0,
+ ),
+ ComponentField(
+ name='concept_index',
+ def_num=3,
+ accumulate=False,
+ bits=4,
+ bit_offset=4,
+ ),
+ ),
+ ),
+ 2: Field(
+ name='field_id',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=2,
+ ),
+ 3: Field(
+ name='concept_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ ),
+ 4: Field(
+ name='data_page',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=4,
+ ),
+ 5: Field(
+ name='concept_key',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=5,
+ ),
+ 6: Field(
+ name='scaling',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ ),
+ 8: Field(
+ name='data_units',
+ type=FIELD_TYPES['exd_data_units'],
+ def_num=8,
+ ),
+ 9: Field(
+ name='qualifier',
+ type=FIELD_TYPES['exd_qualifiers'],
+ def_num=9,
+ ),
+ 10: Field(
+ name='descriptor',
+ type=FIELD_TYPES['exd_descriptors'],
+ def_num=10,
+ ),
+ 11: Field(
+ name='is_signed',
+ type=FIELD_TYPES['bool'],
+ def_num=11,
+ ),
+ },
+ ),
+ 206: MessageType( # Must be logged before developer field is used
+ name='field_description',
+ mesg_num=206,
+ fields={
+ 0: Field(
+ name='developer_data_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ ),
+ 1: Field(
+ name='field_definition_number',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ ),
+ 2: Field(
+ name='fit_base_type_id',
+ type=FIELD_TYPES['fit_base_type'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='field_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=3,
+ ),
+ 4: Field(
+ name='array',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=4,
+ ),
+ 5: Field(
+ name='components',
+ type=BASE_TYPES[0x07], # string
+ def_num=5,
+ ),
+ 6: Field(
+ name='scale',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ ),
+ 7: Field(
+ name='offset',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=7,
+ ),
+ 8: Field(
+ name='units',
+ type=BASE_TYPES[0x07], # string
+ def_num=8,
+ ),
+ 9: Field(
+ name='bits',
+ type=BASE_TYPES[0x07], # string
+ def_num=9,
+ ),
+ 10: Field(
+ name='accumulate',
+ type=BASE_TYPES[0x07], # string
+ def_num=10,
+ ),
+ 13: Field(
+ name='fit_base_unit_id',
+ type=FIELD_TYPES['fit_base_unit'],
+ def_num=13,
+ ),
+ 14: Field(
+ name='native_mesg_num',
+ type=FIELD_TYPES['mesg_num'],
+ def_num=14,
+ ),
+ 15: Field(
+ name='native_field_num',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=15,
+ ),
+ },
+ ),
+ 207: MessageType( # Must be logged before field description
+ name='developer_data_id',
+ mesg_num=207,
+ fields={
+ 0: Field(
+ name='developer_id',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=0,
+ ),
+ 1: Field(
+ name='application_id',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=1,
+ ),
+ 2: Field(
+ name='manufacturer_id',
+ type=FIELD_TYPES['manufacturer'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='developer_data_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ ),
+ 4: Field(
+ name='application_version',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ ),
+ },
+ ),
+ 208: MessageType(
+ name='magnetometer_data',
+ mesg_num=208,
+ fields={
+ 0: Field( # Millisecond part of the timestamp.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # Each time in the array describes the time at which the compass sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in cmps_x and cmps_y and cmps_z
+ name='sample_time_offset',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='ms',
+ ),
+ 2: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='mag_x',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ units='counts',
+ ),
+ 3: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='mag_y',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ units='counts',
+ ),
+ 4: Field( # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='mag_z',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ units='counts',
+ ),
+ 5: Field( # Calibrated Magnetometer reading
+ name='calibrated_mag_x',
+ type=BASE_TYPES[0x88], # float32
+ def_num=5,
+ units='G',
+ ),
+ 6: Field( # Calibrated Magnetometer reading
+ name='calibrated_mag_y',
+ type=BASE_TYPES[0x88], # float32
+ def_num=6,
+ units='G',
+ ),
+ 7: Field( # Calibrated Magnetometer reading
+ name='calibrated_mag_z',
+ type=BASE_TYPES[0x88], # float32
+ def_num=7,
+ units='G',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
+ },
+ ),
+ 209: MessageType(
+ name='barometer_data',
+ mesg_num=209,
+ fields={
+ 0: Field( # Millisecond part of the timestamp.
+ name='timestamp_ms',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='ms',
+ ),
+ 1: Field( # Each time in the array describes the time at which the barometer sample with the corrosponding index was taken. The samples may span across seconds. Array size must match the number of samples in baro_cal
+ name='sample_time_offset',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='ms',
+ ),
+ 2: Field( # These are the raw ADC reading. The samples may span across seconds. A conversion will need to be done on this data once read.
+ name='baro_pres',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ units='Pa',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
+ },
+ ),
+ 210: MessageType(
+ name='one_d_sensor_calibration',
+ mesg_num=210,
+ fields={
+ 0: Field( # Indicates which sensor the calibration is for
+ name='sensor_type',
+ type=FIELD_TYPES['sensor_type'],
+ def_num=0,
+ ),
+ 1: Field( # Calibration factor used to convert from raw ADC value to degrees, g, etc.
+ name='calibration_factor',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=1,
+ subfields=(
+ SubField( # Barometer calibration factor
+ name='baro_cal_factor',
+ def_num=1,
+ type=BASE_TYPES[0x86], # uint32
+ units='Pa',
+ ref_fields=(
+ ReferenceField(
+ name='sensor_type',
+ def_num=0,
+ value='barometer',
+ raw_value=3,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 2: Field( # Calibration factor divisor
+ name='calibration_divisor',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ units='counts',
+ ),
+ 3: Field( # Level shift value used to shift the ADC value back into range
+ name='level_shift',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ ),
+ 4: Field( # Internal Calibration factor
+ name='offset_cal',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=4,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP, # Whole second part of the timestamp
+ },
+ ),
+ 225: MessageType(
+ name='set',
+ mesg_num=225,
+ fields={
+ 0: Field(
+ name='duration',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=0,
+ scale=1000,
+ units='s',
+ ),
+ 3: Field( # # of repitions of the movement
+ name='repetitions',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ ),
+ 4: Field( # Amount of weight applied for the set
+ name='weight',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ scale=16,
+ units='kg',
+ ),
+ 5: Field(
+ name='set_type',
+ type=FIELD_TYPES['set_type'],
+ def_num=5,
+ ),
+ 6: Field( # Start time of the set
+ name='start_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=6,
+ ),
+ 7: Field(
+ name='category',
+ type=FIELD_TYPES['exercise_category'],
+ def_num=7,
+ ),
+ 8: Field( # Based on the associated category, see [category]_exercise_names
+ name='category_subtype',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=8,
+ ),
+ 9: Field(
+ name='weight_display_unit',
+ type=FIELD_TYPES['fit_base_unit'],
+ def_num=9,
+ ),
+ 10: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=10,
+ ),
+ 11: Field(
+ name='wkt_step_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=11,
+ ),
+ 254: Field( # Timestamp of the set
+ name='timestamp',
+ type=FIELD_TYPES['date_time'],
+ def_num=254,
+ ),
+ },
+ ),
+ 227: MessageType( # Value from 1 to 100 calculated by FirstBeat
+ name='stress_level',
+ mesg_num=227,
+ fields={
+ 0: Field(
+ name='stress_level_value',
+ type=BASE_TYPES[0x83], # sint16
+ def_num=0,
+ ),
+ 1: Field( # Time stress score was calculated
+ name='stress_level_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=1,
+ units='s',
+ ),
+ },
+ ),
+ 258: MessageType(
+ name='dive_settings',
+ mesg_num=258,
+ fields={
+ 0: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field(
+ name='model',
+ type=FIELD_TYPES['tissue_model_type'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='gf_low',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=2,
+ units='percent',
+ ),
+ 3: Field(
+ name='gf_high',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ units='percent',
+ ),
+ 4: Field(
+ name='water_type',
+ type=FIELD_TYPES['water_type'],
+ def_num=4,
+ ),
+ 5: Field( # Fresh water is usually 1000; salt water is usually 1025
+ name='water_density',
+ type=BASE_TYPES[0x88], # float32
+ def_num=5,
+ units='kg/m^3',
+ ),
+ 6: Field( # Typically 1.40
+ name='po2_warn',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ scale=100,
+ units='percent',
+ ),
+ 7: Field( # Typically 1.60
+ name='po2_critical',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=7,
+ scale=100,
+ units='percent',
+ ),
+ 8: Field(
+ name='po2_deco',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=8,
+ scale=100,
+ units='percent',
+ ),
+ 9: Field(
+ name='safety_stop_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=9,
+ ),
+ 10: Field(
+ name='bottom_depth',
+ type=BASE_TYPES[0x88], # float32
+ def_num=10,
+ ),
+ 11: Field(
+ name='bottom_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=11,
+ ),
+ 12: Field(
+ name='apnea_countdown_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=12,
+ ),
+ 13: Field(
+ name='apnea_countdown_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=13,
+ ),
+ 14: Field(
+ name='backlight_mode',
+ type=FIELD_TYPES['dive_backlight_mode'],
+ def_num=14,
+ ),
+ 15: Field(
+ name='backlight_brightness',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=15,
+ ),
+ 16: Field(
+ name='backlight_timeout',
+ type=FIELD_TYPES['backlight_timeout'],
+ def_num=16,
+ ),
+ 17: Field( # Time between surfacing and ending the activity
+ name='repeat_dive_interval',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=17,
+ units='s',
+ ),
+ 18: Field( # Time at safety stop (if enabled)
+ name='safety_stop_time',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=18,
+ units='s',
+ ),
+ 19: Field(
+ name='heart_rate_source_type',
+ type=FIELD_TYPES['source_type'],
+ def_num=19,
+ ),
+ 20: Field(
+ name='heart_rate_source',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=20,
+ subfields=(
+ SubField(
+ name='heart_rate_antplus_device_type',
+ def_num=20,
+ type=FIELD_TYPES['antplus_device_type'],
+ ref_fields=(
+ ReferenceField(
+ name='heart_rate_source_type',
+ def_num=19,
+ value='antplus',
+ raw_value=1,
+ ),
+ ),
+ ),
+ SubField(
+ name='heart_rate_local_device_type',
+ def_num=20,
+ type=FIELD_TYPES['local_device_type'],
+ ref_fields=(
+ ReferenceField(
+ name='heart_rate_source_type',
+ def_num=19,
+ value='local',
+ raw_value=5,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 259: MessageType(
+ name='dive_gas',
+ mesg_num=259,
+ fields={
+ 0: Field(
+ name='helium_content',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ units='percent',
+ ),
+ 1: Field(
+ name='oxygen_content',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ units='percent',
+ ),
+ 2: Field(
+ name='status',
+ type=FIELD_TYPES['dive_gas_status'],
+ def_num=2,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 262: MessageType(
+ name='dive_alarm',
+ mesg_num=262,
+ fields={
+ 0: Field(
+ name='depth',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=0,
+ scale=1000,
+ units='m',
+ ),
+ 1: Field(
+ name='time',
+ type=BASE_TYPES[0x85], # sint32
+ def_num=1,
+ units='s',
+ ),
+ 2: Field(
+ name='enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='alarm_type',
+ type=FIELD_TYPES['dive_alarm_type'],
+ def_num=3,
+ ),
+ 4: Field(
+ name='sound',
+ type=FIELD_TYPES['tone'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='dive_types',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=5,
+ ),
+ 254: Field( # Index of the alarm
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 264: MessageType(
+ name='exercise_title',
+ mesg_num=264,
+ fields={
+ 0: Field(
+ name='exercise_category',
+ type=FIELD_TYPES['exercise_category'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='exercise_name',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ ),
+ 2: Field(
+ name='wkt_step_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=2,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+ 268: MessageType(
+ name='dive_summary',
+ mesg_num=268,
+ fields={
+ 0: Field(
+ name='reference_mesg',
+ type=FIELD_TYPES['mesg_num'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='reference_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=1,
+ ),
+ 2: Field( # 0 if above water
+ name='avg_depth',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ scale=1000,
+ units='m',
+ ),
+ 3: Field( # 0 if above water
+ name='max_depth',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=3,
+ scale=1000,
+ units='m',
+ ),
+ 4: Field( # Time since end of last dive
+ name='surface_interval',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ units='s',
+ ),
+ 5: Field(
+ name='start_cns',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=5,
+ units='percent',
+ ),
+ 6: Field(
+ name='end_cns',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ units='percent',
+ ),
+ 7: Field(
+ name='start_n2',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=7,
+ units='percent',
+ ),
+ 8: Field(
+ name='end_n2',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=8,
+ units='percent',
+ ),
+ 9: Field(
+ name='o2_toxicity',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=9,
+ units='OTUs',
+ ),
+ 10: Field(
+ name='dive_number',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=10,
+ ),
+ 11: Field(
+ name='bottom_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=11,
+ scale=1000,
+ units='s',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+
+
+ # ************************* Activity File Messages *************************
+ 34: MessageType(
+ name='activity',
+ mesg_num=34,
+ fields={
+ 0: Field( # Exclude pauses
+ name='total_timer_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=0,
+ scale=1000,
+ units='s',
+ ),
+ 1: Field(
+ name='num_sessions',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ ),
+ 2: Field(
+ name='type',
+ type=FIELD_TYPES['activity'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='event',
+ type=FIELD_TYPES['event'],
+ def_num=3,
+ ),
+ 4: Field(
+ name='event_type',
+ type=FIELD_TYPES['event_type'],
+ def_num=4,
+ ),
+ 5: Field( # timestamp epoch expressed in local time, used to convert activity timestamps to local time
+ name='local_timestamp',
+ type=FIELD_TYPES['local_date_time'],
+ def_num=5,
+ ),
+ 6: Field(
+ name='event_group',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+
+
+ # ********************** Blood Pressure File Messages **********************
+ 51: MessageType(
+ name='blood_pressure',
+ mesg_num=51,
+ fields={
+ 0: Field(
+ name='systolic_pressure',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=0,
+ units='mmHg',
+ ),
+ 1: Field(
+ name='diastolic_pressure',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ units='mmHg',
+ ),
+ 2: Field(
+ name='mean_arterial_pressure',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ units='mmHg',
+ ),
+ 3: Field(
+ name='map_3_sample_mean',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ units='mmHg',
+ ),
+ 4: Field(
+ name='map_morning_values',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ units='mmHg',
+ ),
+ 5: Field(
+ name='map_evening_values',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ units='mmHg',
+ ),
+ 6: Field(
+ name='heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ units='bpm',
+ ),
+ 7: Field(
+ name='heart_rate_type',
+ type=FIELD_TYPES['hr_type'],
+ def_num=7,
+ ),
+ 8: Field(
+ name='status',
+ type=FIELD_TYPES['bp_status'],
+ def_num=8,
+ ),
+ 9: Field( # Associates this blood pressure message to a user. This corresponds to the index of the user profile message in the blood pressure file.
+ name='user_profile_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=9,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+
+
+ # ************************** Course File Messages **************************
+ 31: MessageType(
+ name='course',
+ mesg_num=31,
+ fields={
+ 4: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=5,
+ ),
+ 6: Field(
+ name='capabilities',
+ type=FIELD_TYPES['course_capabilities'],
+ def_num=6,
+ ),
+ 7: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=7,
+ ),
+ },
+ ),
+
+
+ # ************************** Device File Messages **************************
+ 35: MessageType(
+ name='software',
+ mesg_num=35,
+ fields={
+ 3: Field(
+ name='version',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ scale=100,
+ ),
+ 5: Field(
+ name='part_number',
+ type=BASE_TYPES[0x07], # string
+ def_num=5,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+
+
+ # ************************** Goals File Messages ***************************
+ 15: MessageType(
+ name='goal',
+ mesg_num=15,
+ fields={
+ 0: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=0,
+ ),
+ 1: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='start_date',
+ type=FIELD_TYPES['date_time'],
+ def_num=2,
+ ),
+ 3: Field(
+ name='end_date',
+ type=FIELD_TYPES['date_time'],
+ def_num=3,
+ ),
+ 4: Field(
+ name='type',
+ type=FIELD_TYPES['goal'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='value',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=5,
+ ),
+ 6: Field(
+ name='repeat',
+ type=FIELD_TYPES['bool'],
+ def_num=6,
+ ),
+ 7: Field(
+ name='target_value',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=7,
+ ),
+ 8: Field(
+ name='recurrence',
+ type=FIELD_TYPES['goal_recurrence'],
+ def_num=8,
+ ),
+ 9: Field(
+ name='recurrence_value',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=9,
+ ),
+ 10: Field(
+ name='enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=10,
+ ),
+ 11: Field(
+ name='source',
+ type=FIELD_TYPES['goal_source'],
+ def_num=11,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+
+
+ # ************************ Monitoring File Messages ************************
+ 103: MessageType(
+ name='monitoring_info',
+ mesg_num=103,
+ fields={
+ 0: Field( # Use to convert activity timestamps to local time if device does not support time zone and daylight savings time correction.
+ name='local_timestamp',
+ type=FIELD_TYPES['local_date_time'],
+ def_num=0,
+ units='s',
+ ),
+ 1: Field(
+ name='activity_type',
+ type=FIELD_TYPES['activity_type'],
+ def_num=1,
+ ),
+ 3: Field( # Indexed by activity_type
+ name='cycles_to_distance',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ scale=5000,
+ units='m/cycle',
+ ),
+ 4: Field( # Indexed by activity_type
+ name='cycles_to_calories',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ scale=5000,
+ units='kcal/cycle',
+ ),
+ 5: Field(
+ name='resting_metabolic_rate',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ units='kcal/day',
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+
+
+ # ***************************** Other Messages *****************************
+ 145: MessageType(
+ name='memo_glob',
+ mesg_num=145,
+ fields={
+ 0: Field( # Block of utf8 bytes
+ name='memo',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=0,
+ ),
+ 1: Field( # Allows relating glob to another mesg If used only required for first part of each memo_glob
+ name='message_number',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ ),
+ 2: Field( # Index of external mesg
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=2,
+ ),
+ 250: Field( # Sequence number of memo blocks
+ name='part_index',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=250,
+ ),
+ },
+ ),
+
+
+ # ************************* Schedule File Messages *************************
+ 28: MessageType(
+ name='schedule',
+ mesg_num=28,
+ fields={
+ 0: Field( # Corresponds to file_id of scheduled workout / course.
+ name='manufacturer',
+ type=FIELD_TYPES['manufacturer'],
+ def_num=0,
+ ),
+ 1: Field( # Corresponds to file_id of scheduled workout / course.
+ name='product',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ subfields=(
+ SubField(
+ name='garmin_product',
+ def_num=1,
+ type=FIELD_TYPES['garmin_product'],
+ ref_fields=(
+ ReferenceField(
+ name='manufacturer',
+ def_num=0,
+ value='garmin',
+ raw_value=1,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=0,
+ value='dynastream',
+ raw_value=15,
+ ),
+ ReferenceField(
+ name='manufacturer',
+ def_num=0,
+ value='dynastream_oem',
+ raw_value=13,
+ ),
+ ),
+ ),
+ ),
+ ),
+ 2: Field( # Corresponds to file_id of scheduled workout / course.
+ name='serial_number',
+ type=BASE_TYPES[0x8C], # uint32z
+ def_num=2,
+ ),
+ 3: Field( # Corresponds to file_id of scheduled workout / course.
+ name='time_created',
+ type=FIELD_TYPES['date_time'],
+ def_num=3,
+ ),
+ 4: Field( # TRUE if this activity has been started
+ name='completed',
+ type=FIELD_TYPES['bool'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='type',
+ type=FIELD_TYPES['schedule'],
+ def_num=5,
+ ),
+ 6: Field(
+ name='scheduled_time',
+ type=FIELD_TYPES['local_date_time'],
+ def_num=6,
+ ),
+ },
+ ),
+
+
+ # ************************* Segment File Messages **************************
+ 148: MessageType( # Unique Identification data for a segment file
+ name='segment_id',
+ mesg_num=148,
+ fields={
+ 0: Field( # Friendly name assigned to segment
+ name='name',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field( # UUID of the segment
+ name='uuid',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 2: Field( # Sport associated with the segment
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=2,
+ ),
+ 3: Field( # Segment enabled for evaluation
+ name='enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=3,
+ ),
+ 4: Field( # Primary key of the user that created the segment
+ name='user_profile_primary_key',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ ),
+ 5: Field( # ID of the device that created the segment
+ name='device_id',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=5,
+ ),
+ 6: Field( # Index for the Leader Board entry selected as the default race participant
+ name='default_race_leader',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=6,
+ ),
+ 7: Field( # Indicates if any segments should be deleted
+ name='delete_status',
+ type=FIELD_TYPES['segment_delete_status'],
+ def_num=7,
+ ),
+ 8: Field( # Indicates how the segment was selected to be sent to the device
+ name='selection_type',
+ type=FIELD_TYPES['segment_selection_type'],
+ def_num=8,
+ ),
+ },
+ ),
+
+
+ # *********************** Segment List File Messages ***********************
+ 151: MessageType( # Summary of the unique segment and leaderboard information associated with a segment file. This message is used to compile a segment list file describing all segment files on a device. The segment list file is used when refreshing the contents of a segment file with the latest available leaderboard information.
+ name='segment_file',
+ mesg_num=151,
+ fields={
+ 1: Field( # UUID of the segment file
+ name='file_uuid',
+ type=BASE_TYPES[0x07], # string
+ def_num=1,
+ ),
+ 3: Field( # Enabled state of the segment file
+ name='enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=3,
+ ),
+ 4: Field( # Primary key of the user that created the segment file
+ name='user_profile_primary_key',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ ),
+ 7: Field( # Leader type of each leader in the segment file
+ name='leader_type',
+ type=FIELD_TYPES['segment_leaderboard_type'],
+ def_num=7,
+ ),
+ 8: Field( # Group primary key of each leader in the segment file
+ name='leader_group_primary_key',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=8,
+ ),
+ 9: Field( # Activity ID of each leader in the segment file
+ name='leader_activity_id',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=9,
+ ),
+ 10: Field( # String version of the activity ID of each leader in the segment file. 21 characters long for each ID, express in decimal
+ name='leader_activity_id_string',
+ type=BASE_TYPES[0x07], # string
+ def_num=10,
+ ),
+ 11: Field( # Index for the Leader Board entry selected as the default race participant
+ name='default_race_leader',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=11,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+
+
+ # ************************* Settings File Messages *************************
+ 2: MessageType(
+ name='device_settings',
+ mesg_num=2,
+ fields={
+ 0: Field( # Index into time zone arrays.
+ name='active_time_zone',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=0,
+ ),
+ 1: Field( # Offset from system time. Required to convert timestamp from system time to UTC.
+ name='utc_offset',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=1,
+ ),
+ 2: Field( # Offset from system time.
+ name='time_offset',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ units='s',
+ ),
+ 4: Field( # Display mode for the time
+ name='time_mode',
+ type=FIELD_TYPES['time_mode'],
+ def_num=4,
+ ),
+ 5: Field( # timezone offset in 1/4 hour increments
+ name='time_zone_offset',
+ type=BASE_TYPES[0x01], # sint8
+ def_num=5,
+ scale=4,
+ units='hr',
+ ),
+ 12: Field( # Mode for backlight
+ name='backlight_mode',
+ type=FIELD_TYPES['backlight_mode'],
+ def_num=12,
+ ),
+ 36: Field( # Enabled state of the activity tracker functionality
+ name='activity_tracker_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=36,
+ ),
+ 39: Field( # UTC timestamp used to set the devices clock and date
+ name='clock_time',
+ type=FIELD_TYPES['date_time'],
+ def_num=39,
+ ),
+ 40: Field( # Bitfield to configure enabled screens for each supported loop
+ name='pages_enabled',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=40,
+ ),
+ 46: Field( # Enabled state of the move alert
+ name='move_alert_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=46,
+ ),
+ 47: Field( # Display mode for the date
+ name='date_mode',
+ type=FIELD_TYPES['date_mode'],
+ def_num=47,
+ ),
+ 55: Field(
+ name='display_orientation',
+ type=FIELD_TYPES['display_orientation'],
+ def_num=55,
+ ),
+ 56: Field(
+ name='mounting_side',
+ type=FIELD_TYPES['side'],
+ def_num=56,
+ ),
+ 57: Field( # Bitfield to indicate one page as default for each supported loop
+ name='default_page',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=57,
+ ),
+ 58: Field( # Minimum steps before an autosync can occur
+ name='autosync_min_steps',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=58,
+ units='steps',
+ ),
+ 59: Field( # Minimum minutes before an autosync can occur
+ name='autosync_min_time',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=59,
+ units='minutes',
+ ),
+ 80: Field( # Enable auto-detect setting for the lactate threshold feature.
+ name='lactate_threshold_autodetect_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=80,
+ ),
+ 86: Field( # Automatically upload using BLE
+ name='ble_auto_upload_enabled',
+ type=FIELD_TYPES['bool'],
+ def_num=86,
+ ),
+ 89: Field( # Helps to conserve battery by changing modes
+ name='auto_sync_frequency',
+ type=FIELD_TYPES['auto_sync_frequency'],
+ def_num=89,
+ ),
+ 90: Field( # Allows setting specific activities auto-activity detect enabled/disabled settings
+ name='auto_activity_detect',
+ type=FIELD_TYPES['auto_activity_detect'],
+ def_num=90,
+ ),
+ 94: Field( # Number of screens configured to display
+ name='number_of_screens',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=94,
+ ),
+ 95: Field( # Smart Notification display orientation
+ name='smart_notification_display_orientation',
+ type=FIELD_TYPES['display_orientation'],
+ def_num=95,
+ ),
+ 134: Field(
+ name='tap_interface',
+ type=FIELD_TYPES['switch'],
+ def_num=134,
+ ),
+ },
+ ),
+ 3: MessageType(
+ name='user_profile',
+ mesg_num=3,
+ fields={
+ 0: Field(
+ name='friendly_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=0,
+ ),
+ 1: Field(
+ name='gender',
+ type=FIELD_TYPES['gender'],
+ def_num=1,
+ ),
+ 2: Field(
+ name='age',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=2,
+ units='years',
+ ),
+ 3: Field(
+ name='height',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=3,
+ scale=100,
+ units='m',
+ ),
+ 4: Field(
+ name='weight',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ scale=10,
+ units='kg',
+ ),
+ 5: Field(
+ name='language',
+ type=FIELD_TYPES['language'],
+ def_num=5,
+ ),
+ 6: Field(
+ name='elev_setting',
+ type=FIELD_TYPES['display_measure'],
+ def_num=6,
+ ),
+ 7: Field(
+ name='weight_setting',
+ type=FIELD_TYPES['display_measure'],
+ def_num=7,
+ ),
+ 8: Field(
+ name='resting_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=8,
+ units='bpm',
+ ),
+ 9: Field(
+ name='default_max_running_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=9,
+ units='bpm',
+ ),
+ 10: Field(
+ name='default_max_biking_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=10,
+ units='bpm',
+ ),
+ 11: Field(
+ name='default_max_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=11,
+ units='bpm',
+ ),
+ 12: Field(
+ name='hr_setting',
+ type=FIELD_TYPES['display_heart'],
+ def_num=12,
+ ),
+ 13: Field(
+ name='speed_setting',
+ type=FIELD_TYPES['display_measure'],
+ def_num=13,
+ ),
+ 14: Field(
+ name='dist_setting',
+ type=FIELD_TYPES['display_measure'],
+ def_num=14,
+ ),
+ 16: Field(
+ name='power_setting',
+ type=FIELD_TYPES['display_power'],
+ def_num=16,
+ ),
+ 17: Field(
+ name='activity_class',
+ type=FIELD_TYPES['activity_class'],
+ def_num=17,
+ ),
+ 18: Field(
+ name='position_setting',
+ type=FIELD_TYPES['display_position'],
+ def_num=18,
+ ),
+ 21: Field(
+ name='temperature_setting',
+ type=FIELD_TYPES['display_measure'],
+ def_num=21,
+ ),
+ 22: Field(
+ name='local_id',
+ type=FIELD_TYPES['user_local_id'],
+ def_num=22,
+ ),
+ 23: Field(
+ name='global_id',
+ type=BASE_TYPES[0x0D], # byte
+ def_num=23,
+ ),
+ 28: Field( # Typical wake time
+ name='wake_time',
+ type=FIELD_TYPES['localtime_into_day'],
+ def_num=28,
+ ),
+ 29: Field( # Typical bed time
+ name='sleep_time',
+ type=FIELD_TYPES['localtime_into_day'],
+ def_num=29,
+ ),
+ 30: Field(
+ name='height_setting',
+ type=FIELD_TYPES['display_measure'],
+ def_num=30,
+ ),
+ 31: Field( # User defined running step length set to 0 for auto length
+ name='user_running_step_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=31,
+ scale=1000,
+ units='m',
+ ),
+ 32: Field( # User defined walking step length set to 0 for auto length
+ name='user_walking_step_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=32,
+ scale=1000,
+ units='m',
+ ),
+ 47: Field(
+ name='depth_setting',
+ type=FIELD_TYPES['display_measure'],
+ def_num=47,
+ ),
+ 49: Field(
+ name='dive_count',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=49,
+ ),
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+
+
+ # ********************** Sport Settings File Messages **********************
+ 7: MessageType(
+ name='zones_target',
+ mesg_num=7,
+ fields={
+ 1: Field(
+ name='max_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=1,
+ ),
+ 2: Field(
+ name='threshold_heart_rate',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=2,
+ ),
+ 3: Field(
+ name='functional_threshold_power',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ ),
+ 5: Field(
+ name='hr_calc_type',
+ type=FIELD_TYPES['hr_zone_calc'],
+ def_num=5,
+ ),
+ 7: Field(
+ name='pwr_calc_type',
+ type=FIELD_TYPES['pwr_zone_calc'],
+ def_num=7,
+ ),
+ },
+ ),
+
+
+ # ************************** Totals File Messages **************************
+ 33: MessageType(
+ name='totals',
+ mesg_num=33,
+ fields={
+ 0: Field( # Excludes pauses
+ name='timer_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=0,
+ units='s',
+ ),
+ 1: Field(
+ name='distance',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=1,
+ units='m',
+ ),
+ 2: Field(
+ name='calories',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=2,
+ units='kcal',
+ ),
+ 3: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=3,
+ ),
+ 4: Field( # Includes pauses
+ name='elapsed_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=4,
+ units='s',
+ ),
+ 5: Field(
+ name='sessions',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ ),
+ 6: Field(
+ name='active_time',
+ type=BASE_TYPES[0x86], # uint32
+ def_num=6,
+ units='s',
+ ),
+ 9: Field(
+ name='sport_index',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=9,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ 254: Field(
+ name='message_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=254,
+ ),
+ },
+ ),
+
+
+ # *********************** Weight Scale File Messages ***********************
+ 30: MessageType(
+ name='weight_scale',
+ mesg_num=30,
+ fields={
+ 0: Field(
+ name='weight',
+ type=FIELD_TYPES['weight'],
+ def_num=0,
+ scale=100,
+ units='kg',
+ ),
+ 1: Field(
+ name='percent_fat',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=1,
+ scale=100,
+ units='%',
+ ),
+ 2: Field(
+ name='percent_hydration',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=2,
+ scale=100,
+ units='%',
+ ),
+ 3: Field(
+ name='visceral_fat_mass',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=3,
+ scale=100,
+ units='kg',
+ ),
+ 4: Field(
+ name='bone_mass',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=4,
+ scale=100,
+ units='kg',
+ ),
+ 5: Field(
+ name='muscle_mass',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=5,
+ scale=100,
+ units='kg',
+ ),
+ 7: Field(
+ name='basal_met',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=7,
+ scale=4,
+ units='kcal/day',
+ ),
+ 8: Field(
+ name='physique_rating',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=8,
+ ),
+ 9: Field( # ~4kJ per kcal, 0.25 allows max 16384 kcal
+ name='active_met',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=9,
+ scale=4,
+ units='kcal/day',
+ ),
+ 10: Field(
+ name='metabolic_age',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=10,
+ units='years',
+ ),
+ 11: Field(
+ name='visceral_fat_rating',
+ type=BASE_TYPES[0x02], # uint8
+ def_num=11,
+ ),
+ 12: Field( # Associates this weight scale message to a user. This corresponds to the index of the user profile message in the weight scale file.
+ name='user_profile_index',
+ type=FIELD_TYPES['message_index'],
+ def_num=12,
+ ),
+ 253: FIELD_TYPE_TIMESTAMP,
+ },
+ ),
+
+
+ # ************************* Workout File Messages **************************
+ 26: MessageType(
+ name='workout',
+ mesg_num=26,
+ fields={
+ 4: Field(
+ name='sport',
+ type=FIELD_TYPES['sport'],
+ def_num=4,
+ ),
+ 5: Field(
+ name='capabilities',
+ type=FIELD_TYPES['workout_capabilities'],
+ def_num=5,
+ ),
+ 6: Field( # number of valid steps
+ name='num_valid_steps',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=6,
+ ),
+ 8: Field(
+ name='wkt_name',
+ type=BASE_TYPES[0x07], # string
+ def_num=8,
+ ),
+ 11: Field(
+ name='sub_sport',
+ type=FIELD_TYPES['sub_sport'],
+ def_num=11,
+ ),
+ 14: Field(
+ name='pool_length',
+ type=BASE_TYPES[0x84], # uint16
+ def_num=14,
+ scale=100,
+ units='m',
+ ),
+ 15: Field(
+ name='pool_length_unit',
+ type=FIELD_TYPES['display_measure'],
+ def_num=15,
+ ),
+ },
+ ),
+}