Home Reference Source

src/fit.js

export const FIT = {
  scConst: 180 / Math.pow(2, 31),
  options: {
    speedUnits: {
      mph: {
        multiplier: 3.6 / 1.4,
        offset: 0,
      },
      'km/h': {
        multiplier: 3.6,
        offset: 0,
      },
    },
    lengthUnits: {
      mi: {
        multiplier: 1 / 1609.344,
        offset: 0,
      },
      km: {
        multiplier: 1 / 1000,
        offset: 0,
      },
    },
    temperatureUnits: {
      kelvin: {
        multiplier: 1,
        offset: -273.15,
      },
      fahrenheit: {
        multiplier: 1,
        offset: 0,
      },
    },
  },
  messages: {
    0: {
      name: 'file_id',
      0: { field: 'type', type: 'file', scale: null, offset: '', units: '' },
      1: { field: 'manufacturer', type: 'manufacturer', scale: null, offset: '', units: '' },
      2: { field: 'product', type: 'uint16', scale: null, offset: '', units: '' },
      3: { field: 'serial_number', type: 'uint32z', scale: null, offset: '', units: '' },
      4: { field: 'time_created', type: 'date_time', scale: null, offset: '', units: '' },
      5: { field: 'number', type: 'uint16', scale: null, offset: '', units: '' },
      8: { field: 'product_name', type: 'string', scale: null, offset: '', units: '' },
    },
    1: {
      name: 'capabilities',
      0: { field: 'languages', type: 'uint8z', scale: null, offset: '', units: '' },
      1: { field: 'sports', type: 'sport_bits_0', scale: null, offset: '', units: '' },
      21: { field: 'workouts_supported', type: 'workout_capabilities', scale: null, offset: '', units: '' },
      23: { field: 'connectivity_supported', type: 'connectivity_capabilities', scale: null, offset: '', units: '' },
    },
    2: {
      name: 'device_settings',
      0: { field: 'active_time_zone', type: 'uint8', scale: null, offset: '', units: '' },
      1: { field: 'utc_offset', type: 'uint32', scale: null, offset: '', units: '' },
      2: { field: 'time_offset', type: 'uint32', scale: null, offset: '', units: 's' },
      5: { field: 'time_zone_offset', type: 'sint8', scale: 4, offset: '', units: 'hr' },
      55: { field: 'display_orientation', type: 'display_orientation', scale: null, offset: '', units: '' },
      56: { field: 'mounting_side', type: 'side', scale: null, offset: '', units: '' },
      94: { field: 'number_of_screens', type: 'uint8', scale: null, offset: '', units: '' },
      95: { field: 'smart_notification_display_orientation', type: 'display_orientation', scale: null, offset: '', units: '' },
    },
    3: {
      name: 'user_profile',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      0: { field: 'friendly_name', type: 'string', scale: null, offset: 0, units: '' },
      1: { field: 'gender', type: 'gender', scale: null, offset: 0, units: '' },
      2: { field: 'age', type: 'uint8', scale: null, offset: 0, units: 'years' },
      3: { field: 'height', type: 'uint8', scale: 100, offset: 0, units: 'm' },
      4: { field: 'weight', type: 'uint16', scale: 10, offset: 0, units: 'kg' },
      5: { field: 'language', type: 'language', scale: null, offset: 0, units: '' },
      6: { field: 'elev_setting', type: 'display_measure', scale: null, offset: 0, units: '' },
      7: { field: 'weight_setting', type: 'display_measure', scale: null, offset: 0, units: '' },
      8: { field: 'resting_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      9: { field: 'default_max_running_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      10: { field: 'default_max_biking_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      11: { field: 'default_max_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      12: { field: 'hr_setting', type: 'display_heart', scale: null, offset: 0, units: '' },
      13: { field: 'speed_setting', type: 'display_measure', scale: null, offset: 0, units: '' },
      14: { field: 'dist_setting', type: 'display_measure', scale: null, offset: 0, units: '' },
      16: { field: 'power_setting', type: 'display_power', scale: null, offset: 0, units: '' },
      17: { field: 'activity_class', type: 'activity_class', scale: null, offset: 0, units: '' },
      18: { field: 'position_setting', type: 'display_position', scale: null, offset: 0, units: '' },
      21: { field: 'temperature_setting', type: 'display_measure', scale: null, offset: 0, units: '' },
      22: { field: 'local_id', type: 'user_local_id', scale: null, offset: 0, units: '' },
      23: { field: 'global_id', type: 'byte', scale: null, offset: 0, units: '' },
      30: { field: 'height_setting', type: 'display_measure', scale: null, offset: 0, units: '' },
    },
    4: {
      name: 'hrm_profile',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: '', units: '' },
      0: { field: 'enabled', type: 'bool', scale: null, offset: '', units: '' },
      1: { field: 'hrm_ant_id', type: 'uint16z', scale: null, offset: '', units: '' },
      2: { field: 'log_hrv', type: 'bool', scale: null, offset: '', units: '' },
      3: { field: 'hrm_ant_id_trans_type', type: 'uint8z', scale: null, offset: '', units: '' },
    },
    5: {
      name: 'sdm_profile',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: '', units: '' },
      0: { field: 'enabled', type: 'bool', scale: null, offset: '', units: '' },
      1: { field: 'sdm_ant_id', type: 'uint16z', scale: null, offset: '', units: '' },
      2: { field: 'sdm_cal_factor', type: 'uint16', scale: 10, offset: '', units: '%' },
      3: { field: 'odometer', type: 'uint32', scale: 100, offset: '', units: 'm' },
      4: { field: 'speed_source', type: 'bool', scale: null, offset: '', units: '' },
      5: { field: 'sdm_ant_id_trans_type', type: 'uint8z', scale: null, offset: '', units: '' },
      7: { field: 'odometer_rollover', type: 'uint8', scale: null, offset: '', units: '' },
    },
    6: {
      name: 'bike_profile',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      0: { field: 'name', type: 'string', scale: null, offset: 0, units: '' },
      1: { field: 'sport', type: 'sport', scale: null, offset: 0, units: '' },
      2: { field: 'sub_sport', type: 'sub_sport', scale: null, offset: 0, units: '' },
      3: { field: 'odometer', type: 'uint32', scale: 100, offset: 0, units: 'm' },
      4: { field: 'bike_spd_ant_id', type: 'uint16z', scale: null, offset: 0, units: '' },
      5: { field: 'bike_cad_ant_id', type: 'uint16z', scale: null, offset: 0, units: '' },
      6: { field: 'bike_spdcad_ant_id', type: 'uint16z', scale: null, offset: 0, units: '' },
      7: { field: 'bike_power_ant_id', type: 'uint16z', scale: null, offset: 0, units: '' },
      8: { field: 'custom_wheelsize', type: 'uint16', scale: 1000, offset: 0, units: 'm' },
      9: { field: 'auto_wheelsize', type: 'uint16', scale: 1000, offset: 0, units: 'm' },
      10: { field: 'bike_weight', type: 'uint16', scale: 10, offset: 0, units: 'kg' },
      11: { field: 'power_cal_factor', type: 'uint16', scale: 10, offset: 0, units: '%' },
      12: { field: 'auto_wheel_cal', type: 'bool', scale: null, offset: 0, units: '' },
      13: { field: 'auto_power_zero', type: 'bool', scale: null, offset: 0, units: '' },
      14: { field: 'id', type: 'uint8', scale: null, offset: 0, units: '' },
      15: { field: 'spd_enabled', type: 'bool', scale: null, offset: 0, units: '' },
      16: { field: 'cad_enabled', type: 'bool', scale: null, offset: 0, units: '' },
      17: { field: 'spdcad_enabled', type: 'bool', scale: null, offset: 0, units: '' },
      18: { field: 'power_enabled', type: 'bool', scale: null, offset: 0, units: '' },
      19: { field: 'crank_length', type: 'uint8', scale: 2, offset: -110, units: 'mm' },
      20: { field: 'enabled', type: 'bool', scale: null, offset: 0, units: '' },
      21: { field: 'bike_spd_ant_id_trans_type', type: 'uint8z', scale: null, offset: 0, units: '' },
      22: { field: 'bike_cad_ant_id_trans_type', type: 'uint8z', scale: null, offset: 0, units: '' },
      23: { field: 'bike_spdcad_ant_id_trans_type', type: 'uint8z', scale: null, offset: 0, units: '' },
      24: { field: 'bike_power_ant_id_trans_type', type: 'uint8z', scale: null, offset: 0, units: '' },
      37: { field: 'odometer_rollover', type: 'uint8', scale: null, offset: 0, units: '' },
      38: { field: 'front_gear_num', type: 'uint8z', scale: null, offset: 0, units: '' },
      39: { field: 'front_gear', type: 'uint8z', scale: null, offset: 0, units: '' },
      40: { field: 'rear_gear_num', type: 'uint8z', scale: null, offset: 0, units: '' },
      41: { field: 'rear_gear', type: 'uint8z', scale: null, offset: 0, units: '' },
      44: { field: 'shimano_di2_enabled', type: 'bool', scale: null, offset: 0, units: '' },
    },
    7: {
      name: 'zones_target',
      1: { field: 'max_heart_rate', type: 'uint8', scale: null, offset: '', units: '' },
      2: { field: 'threshold_heart_rate', type: 'uint8', scale: null, offset: '', units: '' },
      3: { field: 'functional_threshold_power', type: 'uint16', scale: null, offset: '', units: '' },
      5: { field: 'hr_calc_type', type: 'hr_zone_calc', scale: null, offset: '', units: '' },
      7: { field: 'pwr_calc_type', type: 'pwr_zone_calc', scale: null, offset: '', units: '' },
    },
    8: {
      name: 'hr_zone',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      1: { field: 'high_bpm', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      2: { field: 'name', type: 'string', scale: null, offset: 0, units: '' },
    },
    9: {
      name: 'power_zone',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      1: { field: 'high_value', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      2: { field: 'name', type: 'string', scale: null, offset: 0, units: '' },
    },
    10: {
      name: 'met_zone',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      1: { field: 'high_bpm', type: 'uint8', scale: null, offset: 0, units: '' },
      2: { field: 'calories', type: 'uint16', scale: 10, offset: 0, units: 'kcal / min' },
      3: { field: 'fat_calories', type: 'uint8', scale: 10, offset: 0, units: 'kcal / min' },
    },
    12: {
      name: 'sport',
      0: { field: 'sport', type: 'sport', scale: null, offset: '', units: '' },
      1: { field: 'sub_sport', type: 'sub_sport', scale: null, offset: '', units: '' },
      3: { field: 'name', type: 'string', scale: null, offset: '', units: '' },
    },
    15: {
      name: 'goal',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: '', units: '' },
      0: { field: 'sport', type: 'sport', scale: null, offset: '', units: '' },
      1: { field: 'sub_sport', type: 'sub_sport', scale: null, offset: '', units: '' },
      2: { field: 'start_date', type: 'date_time', scale: null, offset: '', units: '' },
      3: { field: 'end_date', type: 'date_time', scale: null, offset: '', units: '' },
      4: { field: 'type', type: 'goal', scale: null, offset: '', units: '' },
      5: { field: 'value', type: 'uint32', scale: null, offset: '', units: '' },
      6: { field: 'repeat', type: 'bool', scale: null, offset: '', units: '' },
      7: { field: 'target_value', type: 'uint32', scale: null, offset: '', units: '' },
      8: { field: 'recurrence', type: 'goal_recurrence', scale: null, offset: '', units: '' },
      9: { field: 'recurrence_value', type: 'uint16', scale: null, offset: '', units: '' },
      10: { field: 'enabled', type: 'bool', scale: null, offset: '', units: '' },
    },
    18: {
      name: 'session',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
      0: { field: 'event', type: 'event', scale: null, offset: 0, units: '' },
      1: { field: 'event_type', type: 'event_type', scale: null, offset: 0, units: '' },
      2: { field: 'start_time', type: 'date_time', scale: null, offset: 0, units: '' },
      3: { field: 'start_position_lat', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      4: { field: 'start_position_long', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      5: { field: 'sport', type: 'sport', scale: null, offset: 0, units: '' },
      6: { field: 'sub_sport', type: 'sub_sport', scale: null, offset: 0, units: '' },
      7: { field: 'total_elapsed_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      8: { field: 'total_timer_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      9: { field: 'total_distance', type: 'uint32', scale: 100, offset: 0, units: 'm' },
      10: { field: 'total_cycles', type: 'uint32', scale: null, offset: 0, units: 'cycles' },
      11: { field: 'total_calories', type: 'uint16', scale: null, offset: 0, units: 'kcal' },
      13: { field: 'total_fat_calories', type: 'uint16', scale: null, offset: 0, units: 'kcal' },
      14: { field: 'avg_speed', type: 'uint16', scale: 1000, offset: 0, units: 'm/s' },
      15: { field: 'max_speed', type: 'uint16', scale: 1000, offset: 0, units: 'm/s' },
      16: { field: 'avg_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      17: { field: 'max_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      18: { field: 'avg_cadence', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      19: { field: 'max_cadence', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      20: { field: 'avg_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      21: { field: 'max_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      22: { field: 'total_ascent', type: 'uint16', scale: null, offset: 0, units: 'm' },
      23: { field: 'total_descent', type: 'uint16', scale: null, offset: 0, units: 'm' },
      24: { field: 'total_training_effect', type: 'uint8', scale: 10, offset: 0, units: '' },
      25: { field: 'first_lap_index', type: 'uint16', scale: null, offset: 0, units: '' },
      26: { field: 'num_laps', type: 'uint16', scale: null, offset: 0, units: '' },
      27: { field: 'event_group', type: 'uint8', scale: null, offset: 0, units: '' },
      28: { field: 'trigger', type: 'session_trigger', scale: null, offset: 0, units: '' },
      29: { field: 'nec_lat', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      30: { field: 'nec_long', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      31: { field: 'swc_lat', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      32: { field: 'swc_long', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      34: { field: 'normalized_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      35: { field: 'training_stress_score', type: 'uint16', scale: 10, offset: 0, units: 'tss' },
      36: { field: 'intensity_factor', type: 'uint16', scale: 1000, offset: 0, units: 'if' },
      37: { field: 'left_right_balance', type: 'left_right_balance_100', scale: null, offset: 0, units: '' },
      41: { field: 'avg_stroke_count', type: 'uint32', scale: 10, offset: 0, units: 'strokes/lap' },
      42: { field: 'avg_stroke_distance', type: 'uint16', scale: 100, offset: 0, units: 'm' },
      43: { field: 'swim_stroke', type: 'swim_stroke', scale: null, offset: 0, units: 'swim_stroke' },
      44: { field: 'pool_length', type: 'uint16', scale: 100, offset: 0, units: 'm' },
      45: { field: 'threshold_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      46: { field: 'pool_length_unit', type: 'display_measure', scale: null, offset: 0, units: '' },
      47: { field: 'num_active_lengths', type: 'uint16', scale: null, offset: 0, units: 'lengths' },
      48: { field: 'total_work', type: 'uint32', scale: null, offset: 0, units: 'J' },
      49: { field: 'avg_altitude', type: 'uint16', scale: 5, offset: 500, units: 'm' },
      50: { field: 'max_altitude', type: 'uint16', scale: 5, offset: 500, units: 'm' },
      51: { field: 'gps_accuracy', type: 'uint8', scale: null, offset: 0, units: 'm' },
      52: { field: 'avg_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      53: { field: 'avg_pos_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      54: { field: 'avg_neg_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      55: { field: 'max_pos_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      56: { field: 'max_neg_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      57: { field: 'avg_temperature', type: 'sint8', scale: null, offset: 0, units: 'C' },
      58: { field: 'max_temperature', type: 'sint8', scale: null, offset: 0, units: 'C' },
      59: { field: 'total_moving_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      60: { field: 'avg_pos_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      61: { field: 'avg_neg_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      62: { field: 'max_pos_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      63: { field: 'max_neg_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      64: { field: 'min_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      65: { field: 'time_in_hr_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      66: { field: 'time_in_speed_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      67: { field: 'time_in_cadence_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      68: { field: 'time_in_power_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      69: { field: 'avg_lap_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      70: { field: 'best_lap_index', type: 'uint16', scale: null, offset: 0, units: '' },
      71: { field: 'min_altitude', type: 'uint16', scale: 5, offset: 500, units: 'm' },
      82: { field: 'player_score', type: 'uint16', scale: null, offset: 0, units: '' },
      83: { field: 'opponent_score', type: 'uint16', scale: null, offset: 0, units: '' },
      84: { field: 'opponent_name', type: 'string', scale: null, offset: 0, units: '' },
      85: { field: 'stroke_count', type: 'uint16', scale: null, offset: 0, units: 'counts' },
      86: { field: 'zone_count', type: 'uint16', scale: null, offset: 0, units: 'counts' },
      87: { field: 'max_ball_speed', type: 'uint16', scale: 100, offset: 0, units: 'm/s' },
      88: { field: 'avg_ball_speed', type: 'uint16', scale: 100, offset: 0, units: 'm/s' },
      89: { field: 'avg_vertical_oscillation', type: 'uint16', scale: 10, offset: 0, units: 'mm' },
      90: { field: 'avg_stance_time_percent', type: 'uint16', scale: 100, offset: 0, units: 'percent' },
      91: { field: 'avg_stance_time', type: 'uint16', scale: 10, offset: 0, units: 'ms' },
      92: { field: 'avg_fractional_cadence', type: 'uint8', scale: 128, offset: 0, units: 'rpm' },
      93: { field: 'max_fractional_cadence', type: 'uint8', scale: 128, offset: 0, units: 'rpm' },
      94: { field: 'total_fractional_cycles', type: 'uint8', scale: 128, offset: 0, units: 'cycles' },
      95: { field: 'avg_total_hemoglobin_conc', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      96: { field: 'min_total_hemoglobin_conc', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      97: { field: 'max_total_hemoglobin_conc', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      98: { field: 'avg_saturated_hemoglobin_percent', type: 'uint16', scale: 10, offset: 0, units: '%' },
      99: { field: 'min_saturated_hemoglobin_percent', type: 'uint16', scale: 10, offset: 0, units: '%' },
      100: { field: 'max_saturated_hemoglobin_percent', type: 'uint16', scale: 10, offset: 0, units: '%' },
      101: { field: 'avg_left_torque_effectiveness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      102: { field: 'avg_right_torque_effectiveness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      103: { field: 'avg_left_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      104: { field: 'avg_right_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      105: { field: 'avg_combined_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      111: { field: 'sport_index', type: 'uint8', scale: null, offset: 0, units: '' },
      112: { field: 'time_standing', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      113: { field: 'stand_count', type: 'uint16', scale: null, offset: 0, units: '' },
      114: { field: 'avg_left_pco', type: 'sint8', scale: null, offset: 0, units: 'mm' },
      115: { field: 'avg_right_pco', type: 'sint8', scale: null, offset: 0, units: 'mm' },
      116: { field: 'avg_left_power_phase', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      117: { field: 'avg_left_power_phase_peak', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      118: { field: 'avg_right_power_phase', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      119: { field: 'avg_right_power_phase_peak', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      120: { field: 'avg_power_position', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      121: { field: 'max_power_position', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      122: { field: 'avg_cadence_position', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      123: { field: 'max_cadence_position', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      124: { field: 'enhanced_avg_speed', type: 'uint32', scale: 1000, offset: 0, units: 'm/s' },
      125: { field: 'enhanced_max_speed', type: 'uint32', scale: 1000, offset: 0, units: 'm/s' },
      126: { field: 'enhanced_avg_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
      127: { field: 'enhanced_min_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
      128: { field: 'enhanced_max_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
      129: { field: 'avg_lev_motor_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      130: { field: 'max_lev_motor_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      131: { field: 'lev_battery_consumption', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
    },
    19: {
      name: 'lap',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
      0: { field: 'event', type: 'event', scale: null, offset: 0, units: '' },
      1: { field: 'event_type', type: 'event_type', scale: null, offset: 0, units: '' },
      2: { field: 'start_time', type: 'date_time', scale: null, offset: 0, units: '' },
      3: { field: 'start_position_lat', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      4: { field: 'start_position_long', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      5: { field: 'end_position_lat', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      6: { field: 'end_position_long', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      7: { field: 'total_elapsed_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      8: { field: 'total_timer_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      9: { field: 'total_distance', type: 'uint32', scale: 100, offset: 0, units: 'm' },
      10: { field: 'total_cycles', type: 'uint32', scale: null, offset: 0, units: 'cycles' },
      11: { field: 'total_calories', type: 'uint16', scale: null, offset: 0, units: 'kcal' },
      12: { field: 'total_fat_calories', type: 'uint16', scale: null, offset: 0, units: 'kcal' },
      13: { field: 'avg_speed', type: 'uint16', scale: 1000, offset: 0, units: 'm/s' },
      14: { field: 'max_speed', type: 'uint16', scale: 1000, offset: 0, units: 'm/s' },
      15: { field: 'avg_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      16: { field: 'max_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      17: { field: 'avg_cadence', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      18: { field: 'max_cadence', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      19: { field: 'avg_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      20: { field: 'max_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      21: { field: 'total_ascent', type: 'uint16', scale: null, offset: 0, units: 'm' },
      22: { field: 'total_descent', type: 'uint16', scale: null, offset: 0, units: 'm' },
      23: { field: 'intensity', type: 'intensity', scale: null, offset: 0, units: '' },
      24: { field: 'lap_trigger', type: 'lap_trigger', scale: null, offset: 0, units: '' },
      25: { field: 'sport', type: 'sport', scale: null, offset: 0, units: '' },
      26: { field: 'event_group', type: 'uint8', scale: null, offset: 0, units: '' },
      32: { field: 'num_lengths', type: 'uint16', scale: null, offset: 0, units: 'lengths' },
      33: { field: 'normalized_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      34: { field: 'left_right_balance', type: 'left_right_balance_100', scale: null, offset: 0, units: '' },
      35: { field: 'first_length_index', type: 'uint16', scale: null, offset: 0, units: '' },
      37: { field: 'avg_stroke_distance', type: 'uint16', scale: 100, offset: 0, units: 'm' },
      38: { field: 'swim_stroke', type: 'swim_stroke', scale: null, offset: 0, units: '' },
      39: { field: 'sub_sport', type: 'sub_sport', scale: null, offset: 0, units: '' },
      40: { field: 'num_active_lengths', type: 'uint16', scale: null, offset: 0, units: 'lengths' },
      41: { field: 'total_work', type: 'uint32', scale: null, offset: 0, units: 'J' },
      42: { field: 'avg_altitude', type: 'uint16', scale: 5, offset: 500, units: 'm' },
      43: { field: 'max_altitude', type: 'uint16', scale: 5, offset: 500, units: 'm' },
      44: { field: 'gps_accuracy', type: 'uint8', scale: null, offset: 0, units: 'm' },
      45: { field: 'avg_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      46: { field: 'avg_pos_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      47: { field: 'avg_neg_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      48: { field: 'max_pos_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      49: { field: 'max_neg_grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      50: { field: 'avg_temperature', type: 'sint8', scale: null, offset: 0, units: 'C' },
      51: { field: 'max_temperature', type: 'sint8', scale: null, offset: 0, units: 'C' },
      52: { field: 'total_moving_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      53: { field: 'avg_pos_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      54: { field: 'avg_neg_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      55: { field: 'max_pos_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      56: { field: 'max_neg_vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      57: { field: 'time_in_hr_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      58: { field: 'time_in_speed_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      59: { field: 'time_in_cadence_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      60: { field: 'time_in_power_zone', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      61: { field: 'repetition_num', type: 'uint16', scale: null, offset: 0, units: '' },
      62: { field: 'min_altitude', type: 'uint16', scale: 5, offset: 500, units: 'm' },
      63: { field: 'min_heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      71: { field: 'wkt_step_index', type: 'message_index', scale: null, offset: 0, units: '' },
      74: { field: 'opponent_score', type: 'uint16', scale: null, offset: 0, units: '' },
      75: { field: 'stroke_count', type: 'uint16', scale: null, offset: 0, units: 'counts' },
      76: { field: 'zone_count', type: 'uint16', scale: null, offset: 0, units: 'counts' },
      77: { field: 'avg_vertical_oscillation', type: 'uint16', scale: 10, offset: 0, units: 'mm' },
      78: { field: 'avg_stance_time_percent', type: 'uint16', scale: 100, offset: 0, units: 'percent' },
      79: { field: 'avg_stance_time', type: 'uint16', scale: 10, offset: 0, units: 'ms' },
      80: { field: 'avg_fractional_cadence', type: 'uint8', scale: 128, offset: 0, units: 'rpm' },
      81: { field: 'max_fractional_cadence', type: 'uint8', scale: 128, offset: 0, units: 'rpm' },
      82: { field: 'total_fractional_cycles', type: 'uint8', scale: 128, offset: 0, units: 'cycles' },
      83: { field: 'player_score', type: 'uint16', scale: null, offset: 0, units: '' },
      84: { field: 'avg_total_hemoglobin_conc', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      85: { field: 'min_total_hemoglobin_conc', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      86: { field: 'max_total_hemoglobin_conc', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      87: { field: 'avg_saturated_hemoglobin_percent', type: 'uint16', scale: 10, offset: 0, units: '%' },
      88: { field: 'min_saturated_hemoglobin_percent', type: 'uint16', scale: 10, offset: 0, units: '%' },
      89: { field: 'max_saturated_hemoglobin_percent', type: 'uint16', scale: 10, offset: 0, units: '%' },
      91: { field: 'avg_left_torque_effectiveness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      92: { field: 'avg_right_torque_effectiveness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      93: { field: 'avg_left_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      94: { field: 'avg_right_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      95: { field: 'avg_combined_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      98: { field: 'time_standing', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      99: { field: 'stand_count', type: 'uint16', scale: null, offset: 0, units: '' },
      100: { field: 'avg_left_pco', type: 'sint8', scale: null, offset: 0, units: 'mm' },
      101: { field: 'avg_right_pco', type: 'sint8', scale: null, offset: 0, units: 'mm' },
      102: { field: 'avg_left_power_phase', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      103: { field: 'avg_left_power_phase_peak', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      104: { field: 'avg_right_power_phase', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      105: { field: 'avg_right_power_phase_peak', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      106: { field: 'avg_power_position', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      107: { field: 'max_power_position', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      108: { field: 'avg_cadence_position', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      109: { field: 'max_cadence_position', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      110: { field: 'enhanced_avg_speed', type: 'uint32', scale: 1000, offset: 0, units: 'm/s' },
      111: { field: 'enhanced_max_speed', type: 'uint32', scale: 1000, offset: 0, units: 'm/s' },
      112: { field: 'enhanced_avg_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
      113: { field: 'enhanced_min_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
      114: { field: 'enhanced_max_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
      115: { field: 'avg_lev_motor_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      116: { field: 'max_lev_motor_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      117: { field: 'lev_battery_consumption', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
    },
    20: {
      name: 'record',
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
      0: { field: 'position_lat', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      1: { field: 'position_long', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      2: { field: 'altitude', type: 'uint16', scale: 5, offset: -500, units: 'm' },
      3: { field: 'heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      4: { field: 'cadence', type: 'uint8', scale: null, offset: 0, units: 'rpm' },
      5: { field: 'distance', type: 'uint32', scale: 100, offset: 0, units: 'm' },
      6: { field: 'speed', type: 'uint16', scale: 1000, offset: 0, units: 'm/s' },
      7: { field: 'power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      8: { field: 'compressed_speed_distance', type: 'byte', scale: '100,16', offset: 0, units: 'm/s,m' },
      9: { field: 'grade', type: 'sint16', scale: 100, offset: 0, units: '%' },
      10: { field: 'resistance', type: 'uint8', scale: null, offset: 0, units: '' },
      11: { field: 'time_from_course', type: 'sint32', scale: 1000, offset: 0, units: 's' },
      12: { field: 'cycle_length', type: 'uint8', scale: 100, offset: 0, units: 'm' },
      13: { field: 'temperature', type: 'sint8', scale: null, offset: 0, units: 'C' },
      17: { field: 'speed_1s', type: 'uint8', scale: 16, offset: 0, units: 'm/s' },
      18: { field: 'cycles', type: 'uint8', scale: null, offset: 0, units: 'cycles' },
      19: { field: 'total_cycles', type: 'uint32', scale: null, offset: 0, units: 'cycles' },
      28: { field: 'compressed_accumulated_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
      29: { field: 'accumulated_power', type: 'uint32', scale: null, offset: 0, units: 'watts' },
      30: { field: 'left_right_balance', type: 'left_right_balance', scale: null, offset: 0, units: '' },
      31: { field: 'gps_accuracy', type: 'uint8', scale: null, offset: 0, units: 'm' },
      32: { field: 'vertical_speed', type: 'sint16', scale: 1000, offset: 0, units: 'm/s' },
      33: { field: 'calories', type: 'uint16', scale: null, offset: 0, units: 'kcal' },
      39: { field: 'vertical_oscillation', type: 'uint16', scale: 10, offset: 0, units: 'mm' },
      40: { field: 'stance_time_percent', type: 'uint16', scale: 100, offset: 0, units: 'percent' },
      41: { field: 'stance_time', type: 'uint16', scale: 10, offset: 0, units: 'ms' },
      42: { field: 'activity_type', type: 'activity_type', scale: null, offset: 0, units: '' },
      43: { field: 'left_torque_effectiveness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      44: { field: 'right_torque_effectiveness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      45: { field: 'left_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      46: { field: 'right_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      47: { field: 'combined_pedal_smoothness', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      48: { field: 'time128', type: 'uint8', scale: 128, offset: 0, units: 's' },
      49: { field: 'stroke_type', type: 'stroke_type', scale: null, offset: 0, units: '' },
      50: { field: 'zone', type: 'uint8', scale: null, offset: 0, units: '' },
      51: { field: 'ball_speed', type: 'uint16', scale: 100, offset: 0, units: 'm/s' },
      52: { field: 'cadence256', type: 'uint16', scale: 256, offset: 0, units: 'rpm' },
      53: { field: 'fractional_cadence', type: 'uint8', scale: 128, offset: 0, units: 'rpm' },
      54: { field: 'total_hemoglobin_conc', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      55: { field: 'total_hemoglobin_conc_min', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      56: { field: 'total_hemoglobin_conc_max', type: 'uint16', scale: 100, offset: 0, units: 'g/dL' },
      57: { field: 'saturated_hemoglobin_percent', type: 'uint16', scale: 10, offset: 0, units: '%' },
      58: { field: 'saturated_hemoglobin_percent_min', type: 'uint16', scale: 10, offset: 0, units: '%' },
      59: { field: 'saturated_hemoglobin_percent_max', type: 'uint16', scale: 10, offset: 0, units: '%' },
      62: { field: 'device_index', type: 'device_index', scale: null, offset: 0, units: '' },
      67: { field: 'left_pco', type: 'sint8', scale: null, offset: 0, units: 'mm' },
      68: { field: 'right_pco', type: 'sint8', scale: null, offset: 0, units: 'mm' },
      69: { field: 'left_power_phase', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      70: { field: 'left_power_phase_peak', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      71: { field: 'right_power_phase', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      72: { field: 'right_power_phase_peak', type: 'uint8', scale:  '0,7111111', offset: 0, units: 'degrees' },
      73: { field: 'enhanced_speed', type: 'uint32', scale: 1000, offset: 0, units: 'm/s' },
      78: { field: 'enhanced_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
      81: { field: 'battery_soc', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
      82: { field: 'motor_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
    },
    21: {
      name: 'event',
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: '', units: 's' },
      0: { field: 'event', type: 'event', scale: null, offset: '', units: '' },
      1: { field: 'event_type', type: 'event_type', scale: null, offset: '', units: '' },
      2: { field: 'data16', type: 'uint16', scale: null, offset: '', units: '' },
      3: { field: 'data', type: 'uint32', scale: null, offset: '', units: '' },
      4: { field: 'event_group', type: 'uint8', scale: null, offset: '', units: '' },
      7: { field: 'score', type: 'uint16', scale: null, offset: '', units: '' },
      8: { field: 'opponent_score', type: 'uint16', scale: null, offset: '', units: '' },
      9: { field: 'front_gear_num', type: 'uint8z', scale: null, offset: '', units: '' },
      10: { field: 'front_gear', type: 'uint8z', scale: null, offset: '', units: '' },
      11: { field: 'rear_gear_num', type: 'uint8z', scale: null, offset: '', units: '' },
      12: { field: 'rear_gear', type: 'uint8z', scale: null, offset: '', units: '' },
      13: { field: 'device_index', type: 'device_index', scale: null, offset: '', units: '' },
    },
    23: {
      name: 'device_info',
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
      0: { field: 'device_index', type: 'device_index', scale: null, offset: 0, units: '' },
      1: { field: 'device_type', type: 'uint8', scale: null, offset: 0, units: '' },
      2: { field: 'manufacturer', type: 'manufacturer', scale: null, offset: 0, units: '' },
      3: { field: 'serial_number', type: 'uint32z', scale: null, offset: 0, units: '' },
      4: { field: 'product', type: 'uint16', scale: null, offset: 0, units: '' },
      5: { field: 'software_version', type: 'uint16', scale: 100, offset: 0, units: '' },
      6: { field: 'hardware_version', type: 'uint8', scale: null, offset: 0, units: '' },
      7: { field: 'cum_operating_time', type: 'uint32', scale: null, offset: 0, units: 's' },
      10: { field: 'battery_voltage', type: 'uint16', scale: 256, offset: 0, units: 'V' },
      11: { field: 'battery_status', type: 'battery_status', scale: null, offset: 0, units: '' },
      18: { field: 'sensor_position', type: 'body_location', scale: null, offset: 0, units: '' },
      19: { field: 'descriptor', type: 'string', scale: null, offset: 0, units: '' },
      20: { field: 'ant_transmission_type', type: 'uint8z', scale: null, offset: 0, units: '' },
      21: { field: 'ant_device_number', type: 'uint16z', scale: null, offset: 0, units: '' },
      22: { field: 'ant_network', type: 'ant_network', scale: null, offset: 0, units: '' },
      25: { field: 'source_type', type: 'source_type', scale: null, offset: 0, units: '' },
      27: { field: 'product_name', type: 'string', scale: null, offset: 0, units: '' },
    },
    26: {
      name: 'workout',
      4: { field: 'sport', type: 'sport', scale: null, offset: '', units: '' },
      5: { field: 'capabilities', type: 'workout_capabilities', scale: null, offset: '', units: '' },
      6: { field: 'num_valid_steps', type: 'uint16', scale: null, offset: '', units: '' },
      8: { field: 'wkt_name', type: 'string', scale: null, offset: '', units: '' },
    },
    27: {
      name: 'workout_step',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      0: { field: 'wkt_step_name', type: 'string', scale: null, offset: 0, units: '' },
      1: { field: 'duration_type', type: 'wkt_step_duration', scale: null, offset: 0, units: '' },
      2: { field: 'duration_value', type: 'uint32', scale: null, offset: 0, units: '' },
      3: { field: 'target_type', type: 'wkt_step_target', scale: null, offset: 0, units: '' },
      4: { field: 'target_value', type: 'uint32', scale: null, offset: 0, units: '' },
      5: { field: 'custom_target_value_low', type: 'uint32', scale: null, offset: 0, units: '' },
      6: { field: 'custom_target_value_high', type: 'uint32', scale: null, offset: 0, units: '' },
      7: { field: 'intensity', type: 'intensity', scale: null, offset: 0, units: '' },
    },
    30: {
      name: 'weight_scale',
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
      0: { field: 'weight', type: 'weight', scale: 100, offset: 0, units: 'kg' },
      1: { field: 'percent_fat', type: 'uint16', scale: 100, offset: 0, units: '%' },
      2: { field: 'percent_hydration', type: 'uint16', scale: 100, offset: 0, units: '%' },
      3: { field: 'visceral_fat_mass', type: 'uint16', scale: 100, offset: 0, units: 'kg' },
      4: { field: 'bone_mass', type: 'uint16', scale: 100, offset: 0, units: 'kg' },
      5: { field: 'muscle_mass', type: 'uint16', scale: 100, offset: 0, units: 'kg' },
      7: { field: 'basal_met', type: 'uint16', scale: 4, offset: 0, units: 'kcal/day' },
      8: { field: 'physique_rating', type: 'uint8', scale: null, offset: 0, units: '' },
      9: { field: 'active_met', type: 'uint16', scale: 4, offset: 0, units: 'kcal/day' },
      10: { field: 'metabolic_age', type: 'uint8', scale: null, offset: 0, units: 'years' },
      11: { field: 'visceral_fat_rating', type: 'uint8', scale: null, offset: 0, units: '' },
      12: { field: 'user_profile_index', type: 'message_index', scale: null, offset: 0, units: '' },
    },
    31: {
      name: 'course',
      4: { field: 'sport', type: 'sport', scale: null, offset: '', units: '' },
      5: { field: 'name', type: 'string', scale: null, offset: '', units: '' },
      6: { field: 'capabilities', type: 'course_capabilities', scale: null, offset: '', units: '' },
    },
    32: {
      name: 'course_point',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      1: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: '' },
      2: { field: 'position_lat', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      3: { field: 'position_long', type: 'sint32', scale: null, offset: 0, units: 'semicircles' },
      4: { field: 'distance', type: 'uint32', scale: 100, offset: 0, units: 'm' },
      5: { field: 'type', type: 'course_point', scale: null, offset: 0, units: '' },
      6: { field: 'name', type: 'string', scale: null, offset: 0, units: '' },
      8: { field: 'favorite', type: 'bool', scale: null, offset: 0, units: '' },
    },
    33: {
      name: 'totals',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
      0: { field: 'timer_time', type: 'uint32', scale: null, offset: 0, units: 's' },
      1: { field: 'distance', type: 'uint32', scale: null, offset: 0, units: 'm' },
      2: { field: 'calories', type: 'uint32', scale: null, offset: 0, units: 'kcal' },
      3: { field: 'sport', type: 'sport', scale: null, offset: 0, units: '' },
      4: { field: 'elapsed_time', type: 'uint32', scale: null, offset: 0, units: 's' },
      5: { field: 'sessions', type: 'uint16', scale: null, offset: 0, units: '' },
      6: { field: 'active_time', type: 'uint32', scale: null, offset: 0, units: 's' },
      9: { field: 'sport_index', type: 'uint8', scale: null, offset: 0, units: '' },
    },
    34: {
      name: 'activity',
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: '' },
      0: { field: 'total_timer_time', type: 'uint32', scale: 1000, offset: 0, units: 's' },
      1: { field: 'num_sessions', type: 'uint16', scale: null, offset: 0, units: '' },
      2: { field: 'type', type: 'activity', scale: null, offset: 0, units: '' },
      3: { field: 'event', type: 'event', scale: null, offset: 0, units: '' },
      4: { field: 'event_type', type: 'event_type', scale: null, offset: 0, units: '' },
      5: { field: 'local_timestamp', type: 'local_date_time', scale: null, offset: 0, units: '' },
      6: { field: 'event_group', type: 'uint8', scale: null, offset: 0, units: '' },
    },
    35: {
      name: 'software',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: '', units: '' },
      3: { field: 'version', type: 'uint16', scale: 100, offset: '', units: '' },
      5: { field: 'part_number', type: 'string', scale: null, offset: '', units: '' },
    },
    37: {
      name: 'file_capabilities',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: 0, units: '' },
      0: { field: 'type', type: 'file', scale: null, offset: 0, units: '' },
      1: { field: 'flags', type: 'file_flags', scale: null, offset: 0, units: '' },
      2: { field: 'directory', type: 'string', scale: null, offset: 0, units: '' },
      3: { field: 'max_count', type: 'uint16', scale: null, offset: 0, units: '' },
      4: { field: 'max_size', type: 'uint32', scale: null, offset: 0, units: 'bytes' },
    },
    38: {
      name: 'mesg_capabilities',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: '', units: '' },
      0: { field: 'file', type: 'file', scale: null, offset: '', units: '' },
      1: { field: 'mesg_num', type: 'mesg_num', scale: null, offset: '', units: '' },
      2: { field: 'count_type', type: 'mesg_count', scale: null, offset: '', units: '' },
      3: { field: 'count', type: 'uint16', scale: null, offset: '', units: '' },
    },
    39: {
      name: 'field_capabilities',
      254: { field: 'message_index', type: 'message_index', scale: null, offset: '', units: '' },
      0: { field: 'file', type: 'file', scale: null, offset: '', units: '' },
      1: { field: 'mesg_num', type: 'mesg_num', scale: null, offset: '', units: '' },
      2: { field: 'field_num', type: 'uint8', scale: null, offset: '', units: '' },
      3: { field: 'count', type: 'uint16', scale: null, offset: '', units: '' },
    },
    49: {
      name: 'file_creator',
      0: { field: 'software_version', type: 'uint16', scale: null, offset: '', units: '' },
      1: { field: 'hardware_version', type: 'uint8', scale: null, offset: '', units: '' },
    },
    51: {
      name: 'blood_pressure',
      253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
      0: { field: 'systolic_pressure', type: 'uint16', scale: null, offset: 0, units: 'mmHg' },
      1: { field: 'diastolic_pressure', type: 'uint16', scale: null, offset: 0, units: 'mmHg' },
      2: { field: 'mean_arterial_pressure', type: 'uint16', scale: null, offset: 0, units: 'mmHg' },
      3: { field: 'map_3_sample_mean', type: 'uint16', scale: null, offset: 0, units: 'mmHg' },
      4: { field: 'map_morning_values', type: 'uint16', scale: null, offset: 0, units: 'mmHg' },
      5: { field: 'map_evening_values', type: 'uint16', scale: null, offset: 0, units: 'mmHg' },
      6: { field: 'heart_rate', type: 'uint8', scale: null, offset: 0, units: 'bpm' },
      7: { field: 'heart_rate_type', type: 'hr_type', scale: null, offset: 0, units: '' },
      8: { field: 'status', type: 'bp_status', scale: null, offset: 0, units: '' },
      9: { field: 'user_profile_index', type: 'message_index', scale: null, offset: 0, units: '' },
    },
  },
  types: {
    file: {
      1: 'device',
      2: 'settings',
      3: 'sport',
      4: 'activity',
      5: 'workout',
      6: 'course',
      7: 'schedules',
      9: 'weight',
      10: 'totals',
      11: 'goals',
      14: 'blood_pressure',
      15: 'monitoring_a',
      20: 'activity_summary',
      28: 'monitoring_daily',
      32: 'monitoring_b',
      34: 'segment',
      35: 'segment_list',
      40: 'exd_configuration',
      247: 'mfg_range_min',
      254: 'mfg_range_max',
    },
    mesg_num: {
      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',
      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',
      200: 'exd_screen_configuration',
      201: 'exd_data_field_configuration',
      202: 'exd_data_concept_configuration',
      206: 'field_description',
      207: 'developer_data_id',
      65280: 'mfg_range_min',
      65534: 'mfg_range_max',
    },
    checksum: {
      0: 'clear',
      1: 'ok',
    },
    file_flags: {
      0: 0,
      2: 'read',
      4: 'write',
      8: 'erase',
    },
    mesg_count: {
      0: 'num_per_file',
      1: 'max_per_file',
      2: 'max_per_file_type',
    },
    date_time: {
      0: 0,
      268435456: 'min',
    },
    local_date_time: {
      0: 0,
      268435456: 'min',
    },
    message_index: {
      0: 0,
      4095: 'mask',
      28672: 'reserved',
      32768: 'selected',
    },
    device_index: {
      0: 'creator',
    },
    gender: {
      0: 'female',
      1: 'male',
    },
    language: {
      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',
      254: 'custom',
    },
    language_bits_0: {
      0: 0,
      1: 'english',
      2: 'french',
      4: 'italian',
      8: 'german',
      16: 'spanish',
      32: 'croatian',
      64: 'czech',
      128: 'danish',
    },
    language_bits_1: {
      0: 0,
      1: 'dutch',
      2: 'finnish',
      4: 'greek',
      8: 'hungarian',
      16: 'norwegian',
      32: 'polish',
      64: 'portuguese',
      128: 'slovakian'
    },
    language_bits_2: {
      0: 0,
      1: 'slovenian',
      2: 'swedish',
      4: 'russian',
      8: 'turkish',
      16: 'latvian',
      32: 'ukrainian',
      64: 'arabic',
      128: 'farsi',
    },
    language_bits_3: {
      0: 0,
      1: 'bulgarian',
      2: 'romanian',
      4: 'chinese',
      8: 'japanese',
      16: 'korean',
      32: 'taiwanese',
      64: 'thai',
      128: 'hebrew',
    },
    language_bits_4: {
      1: 'brazilian_portuguese',
      2: 'indonesian',
    },
    time_zone: {
      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',
    },
    display_measure: {
      0: 'metric',
      1: 'statute',
    },
    display_heart: {
      0: 'bpm',
      1: 'max',
      2: 'reserve',
    },
    display_power: {
      0: 'watts',
      1: 'percent_ftp',
    },
    display_position: {
      0: 'degree',
      1: 'degree_minute',
      2: 'degree_minute_second',
      3: 'austrian_grid',
      4: 'british_grid',
      5: 'dutch_grid',
      6: 'hungarian_grid',
      7: 'finnish_grid',
      8: 'german_grid',
      9: 'icelandic_grid',
      10: 'indonesian_equatorial',
      11: 'indonesian_irian',
      12: 'indonesian_southern',
      13: 'india_zone_0',
      14: 'india_zone_IA',
      15: 'india_zone_IB',
      16: 'india_zone_IIA',
      17: 'india_zone_IIB',
      18: 'india_zone_IIIA',
      19: 'india_zone_IIIB',
      20: 'india_zone_IVA',
      21: 'india_zone_IVB',
      22: 'irish_transverse',
      23: 'irish_grid',
      24: 'loran',
      25: 'maidenhead_grid',
      26: 'mgrs_grid',
      27: 'new_zealand_grid',
      28: 'new_zealand_transverse',
      29: 'qatar_grid',
      30: 'modified_swedish_grid',
      31: 'swedish_grid',
      32: 'south_african_grid',
      33: 'swiss_grid',
      34: 'taiwan_grid',
      35: 'united_states_grid',
      36: 'utm_ups_grid',
      37: 'west_malayan',
      38: 'borneo_rso',
      39: 'estonian_grid',
      40: 'latvian_grid',
      41: 'swedish_ref_99_grid',
    },
    sport: {
      0: 'generic',
      1: 'running',
      2: 'cycling',
      3: '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',
      254: 'all',
    },
    sport_bits_0: {
      0: 0,
      1: 'generic',
      2: 'running',
      4: 'cycling',
      8: 'transition',
      16: 'fitness_equipment',
      32: 'swimming',
      64: 'basketball',
      128: 'soccer'
    },
    sport_bits_1: {
      0: 0,
      1: 'tennis',
      2: 'american_football',
      4: 'training',
      8: 'walking',
      16: 'cross_country_skiing',
      32: 'alpine_skiing',
      64: 'snowboarding',
      128: 'rowing'
    },
    sport_bits_2: {
      0: 0,
      1: 'mountaineering',
      2: 'hiking',
      4: 'multisport',
      8: 'paddling',
      16: 'flying',
      32: 'e_biking',
      64: 'motorcycling',
      128: 'boating'
    },
    sport_bits_3: {
      0: 0,
      1: 'driving',
      2: 'golf',
      4: 'hang_gliding',
      8: 'horseback_riding',
      16: 'hunting',
      32: 'fishing',
      64: 'inline_skating',
      128: 'rock_climbing'
    },
    sport_bits_4: {
      0: 0,
      1: 'sailing',
      2: 'ice_skating',
      4: 'sky_diving',
      8: 'snowshoeing',
      16: 'snowmobiling',
      32: 'stand_up_paddleboarding',
      64: 'surfing',
      128: 'wakeboarding'
    },
    sport_bits_5: {
      0: 0,
      1: 'water_skiing',
      2: 'kayaking',
      4: 'rafting',
      8: 'windsurfing',
      16: 'kitesurfing',
      32: 'tactical',
      64: 'jumpmaster'
    },
    sub_sport: {
      0: 'generic',
      1: 'treadmill',
      2: 'street',
      3: 'trail',
      4: 'track',
      5: 'spin',
      6: 'indoor_cycling',
      7: 'road',
      8: 'mountain',
      9: 'downhill',
      10: 'recumbent',
      11: 'cyclocross',
      12: 'hand_cycling',
      13: 'track_cycling',
      14: 'indoor_rowing',
      15: 'elliptical',
      16: 'stair_climbing',
      17: 'lap_swimming',
      18: 'open_water',
      19: 'flexibility_training',
      20: 'strength_training',
      21: 'warm_up',
      22: 'match',
      23: 'exercise',
      24: 'challenge',
      25: 'indoor_skiing',
      26: 'cardio_training',
      27: 'indoor_walking',
      28: 'e_bike_fitness',
      29: 'bmx',
      30: 'casual_walking',
      31: 'speed_walking',
      32: 'bike_to_run_transition',
      33: 'run_to_bike_transition',
      34: 'swim_to_bike_transition',
      35: 'atv',
      36: 'motocross',
      37: 'backcountry',
      38: 'resort',
      39: 'rc_drone',
      40: 'wingsuit',
      41: 'whitewater',
      42: 'skate_skiing',
      43: 'yoga',
      44: 'pilates',
      45: 'indoor_running',
      46: 'gravel_cycling',
      47: 'e_bike_mountain',
      48: 'commuting',
      254: 'all'
    },
    sport_event: {
      0: 'uncategorized',
      1: 'geocaching',
      2: 'fitness',
      3: 'recreation',
      4: 'race',
      5: 'special_event',
      6: 'training',
      7: 'transportation',
      8: 'touring'
    },
    activity: {
      0: 'manual',
      1: 'auto_multi_sport'
    },
    intensity: {
      0: 'active',
      1: 'rest',
      2: 'warmup',
      3: 'cooldown'
    },
    session_trigger: {
      0: 'activity_end',
      1: 'manual',
      2: 'auto_multi_sport',
      3: 'fitness_equipment'
    },
    autolap_trigger: {
      0: 'time',
      1: 'distance',
      2: 'position_start',
      3: 'position_lap',
      4: 'position_waypoint',
      5: 'position_marked',
      6: 'off'
    },
    lap_trigger: {
      0: 'manual',
      1: 'time',
      2: 'distance',
      3: 'position_start',
      4: 'position_lap',
      5: 'position_waypoint',
      6: 'position_marked',
      7: 'session_end',
      8: 'fitness_equipment'
    },
    time_mode: {
      0: 'hour12',
      1: 'hour24',
      2: 'military',
      3: 'hour_12_with_seconds',
      4: 'hour_24_with_seconds'
    },
    event: {
      0: 'timer',
      3: 'workout',
      4: 'workout_step',
      5: 'power_down',
      6: 'power_up',
      7: 'off_course',
      8: 'session',
      9: 'lap',
      10: 'course_point',
      11: 'battery',
      12: 'virtual_partner_pace',
      13: 'hr_high_alert',
      14: 'hr_low_alert',
      15: 'speed_high_alert',
      16: 'speed_low_alert',
      17: 'cad_high_alert',
      18: 'cad_low_alert',
      19: 'power_high_alert',
      20: 'power_low_alert',
      21: 'recovery_hr',
      22: 'battery_low',
      23: 'time_duration_alert',
      24: 'distance_duration_alert',
      25: 'calorie_duration_alert',
      26: 'activity',
      27: 'fitness_equipment',
      28: 'length',
      32: 'user_marker',
      33: 'sport_point',
      36: 'calibration',
      42: 'front_gear_change',
      43: 'rear_gear_change',
      44: 'rider_position_change',
      45: 'elev_high_alert',
      46: 'elev_low_alert',
      47: 'comm_timeout'
    },
    event_type: {
      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'
    },
    timer_trigger: {
      0: 'manual',
      1: 'auto',
      2: 'fitness_equipment'
    },
    fitness_equipment_state: {
      0: 'ready',
      1: 'in_use',
      2: 'paused',
      3: 'unknown'
    },
    autoscroll: {
      0: 'none',
      1: 'slow',
      2: 'medium',
      3: 'fast'
    },
    activity_class: {
      0: 0,
      100: 'level_max',
      127: 'level',
      128: 'athlete'
    },
    hr_zone_calc: {
      0: 'custom',
      1: 'percent_max_hr',
      2: 'percent_hrr'
    },
    pwr_zone_calc: {
      0: 'custom',
      1: 'percent_ftp'
    },
    wkt_step_duration: {
      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',
      28: 'repetition_time'
    },
    wkt_step_target: {
      0: 'speed',
      1: 'heart_rate',
      2: 'open',
      3: 'cadence',
      4: 'power',
      5: 'grade',
      6: 'resistance'
    },
    goal: {
      0: 'time',
      1: 'distance',
      2: 'calories',
      3: 'frequency',
      4: 'steps'
    },
    goal_recurrence: {
      0: 'off',
      1: 'daily',
      2: 'weekly',
      3: 'monthly',
      4: 'yearly',
      5: 'custom'
    },
    schedule: {
      0: 'workout',
      1: 'course'
    },
    course_point: {
      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'
    },
    manufacturer: {
      0: 0,
      1: 'garmin',
      2: 'garmin_fr405_antfs',
      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',
      97: 'MiPulse',
      98: 'bsx_athletics',
      99: 'look',
      100: 'campagnolo_srl',
      101: 'body_bike_smart',
      102: 'praxisworks',
      103: 'limits_technology',
      104: 'topaction_technology',
      105: 'cosinuss',
      255: 'development',
      257: 'healthandlife',
      258: 'lezyne',
      259: 'scribe_labs',
      260: 'zwift',
      261: 'watteam',
      262: 'recon',
      263: 'favero_electronics',
      264: 'dynovelo',
      265: 'strava',
      266: 'precor',
      267: 'bryton',
      268: 'sram',
      269: 'navman',
      270: 'cobi',
      271: 'spivi',
      272: 'mio_magellan',
      273: 'evesports',
      5759: 'actigraphcorp'
    },
    garmin_product: {
      0: 0,
      1: 'hrm1',
      2: 'axh01',
      3: 'axb01',
      4: 'axb02',
      5: 'hrm2ss',
      6: 'dsi_alf02',
      7: 'hrm3ss',
      8: 'hrm_run_single_byte_product_id',
      9: 'bsm',
      10: 'bcm',
      11: 'axs01',
      12: 'hrm_tri_single_byte_product_id',
      14: 'fr225_single_byte_product_id',
      473: 'fr301_china',
      474: 'fr301_japan',
      475: 'fr301_korea',
      494: 'fr301_taiwan',
      717: 'fr405',
      782: 'fr50',
      987: 'fr405_japan',
      988: 'fr60',
      1011: 'dsi_alf01',
      1018: 'fr310xt',
      1036: 'edge500',
      1124: 'fr110',
      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',
      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',
      2348: 'vivo_smart_hr',
      2398: 'varia_vision',
      2406: 'vivo_fit3',
      2413: 'fenix3_hr',
      2429: 'index_smart_scale',
      2431: 'fr235',
      2496: 'nautix',
      10007: 'sdm4',
      10014: 'edge_remote',
      20119: 'training_center',
      65531: 'connectiq_simulator',
      65532: 'android_antplus_plugin',
      65534: 'connect'
    },
    antplus_device_type: {
      0: 0,
      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'
    },
    ant_network: {
      0: 'public',
      1: 'antplus',
      2: 'antfs',
      3: 'private'
    },
    workout_capabilities: {
      0: 0,
      1: 'interval',
      2: 'custom',
      4: 'fitness_equipment',
      8: 'firstbeat',
      16: 'new_leaf',
      32: 'tcx',
      128: 'speed',
      256: 'heart_rate',
      512: 'distance',
      1024: 'cadence',
      2048: 'power',
      4096: 'grade',
      8192: 'resistance',
      16384: 'protected'
    },
    battery_status: {
      0: 0,
      1: 'new',
      2: 'good',
      3: 'ok',
      4: 'low',
      5: 'critical',
      6: 'charging',
      7: 'unknown'
    },
    hr_type: {
      0: 'normal',
      1: 'irregular'
    },
    course_capabilities: {
      0: 0,
      1: 'processed',
      2: 'valid',
      4: 'time',
      8: 'distance',
      16: 'position',
      32: 'heart_rate',
      64: 'power',
      128: 'cadence',
      256: 'training',
      512: 'navigation',
      1024: 'bikeway'
    },
    weight: {
      0: 0,
      65534: 'calculating'
    },
    workout_hr: {
      0: 0,
      100: 'bpm_offset'
    },
    workout_power: {
      0: 0,
      1000: 'watts_offset'
    },
    bp_status: {
      0: 'no_error',
      1: 'error_incomplete_data',
      2: 'error_no_measurement',
      3: 'error_data_out_of_range',
      4: 'error_irregular_heart_rate'
    },
    user_local_id: {
      0: 'local_min',
      15: 'local_max',
      16: 'stationary_min',
      255: 'stationary_max',
      256: 'portable_min',
      65534: 'portable_max'
    },
    swim_stroke: {
      0: 'freestyle',
      1: 'backstroke',
      2: 'breaststroke',
      3: 'butterfly',
      4: 'drill',
      5: 'mixed',
      6: 'im'
    },
    activity_type: {
      0: 'generic',
      1: 'running',
      2: 'cycling',
      3: 'transition',
      4: 'fitness_equipment',
      5: 'swimming',
      6: 'walking',
      254: 'all'
    },
    activity_subtype: {
      0: 'generic',
      1: 'treadmill',
      2: 'street',
      3: 'trail',
      4: 'track',
      5: 'spin',
      6: 'indoor_cycling',
      7: 'road',
      8: 'mountain',
      9: 'downhill',
      10: 'recumbent',
      11: 'cyclocross',
      12: 'hand_cycling',
      13: 'track_cycling',
      14: 'indoor_rowing',
      15: 'elliptical',
      16: 'stair_climbing',
      17: 'lap_swimming',
      18: 'open_water',
      254: 'all'
    },
    activity_level: {
      0: 'low',
      1: 'medium',
      2: 'high'
    },
    side: {
      0: 'right',
      1: 'left'
    },
    left_right_balance: {
      0: 0,
      127: 'mask',
      128: 'right'
    },
    left_right_balance_100: {
      0: 0,
      16383: 'mask',
      32768: 'right'
    },
    length_type: {
      0: 'idle',
      1: 'active'
    },
    day_of_week: {
      0: 'sunday',
      1: 'monday',
      2: 'tuesday',
      3: 'wednesday',
      4: 'thursday',
      5: 'friday',
      6: 'saturday'
    },
    connectivity_capabilities: {
      0: 0,
      1: 'bluetooth',
      2: 'bluetooth_le',
      4: 'ant',
      8: 'activity_upload',
      16: 'course_download',
      32: 'workout_download',
      64: 'live_track',
      128: 'weather_conditions',
      256: 'weather_alerts',
      512: 'gps_ephemeris_download',
      1024: 'explicit_archive',
      2048: 'setup_incomplete',
      4096: 'continue_sync_after_software_update',
      8192: 'connect_iq_app_download',
      16384: 'golf_course_download',
      32768: 'device_initiates_sync',
      65536: 'connect_iq_watch_app_download',
      131072: 'connect_iq_widget_download',
      262144: 'connect_iq_watch_face_download',
      524288: 'connect_iq_data_field_download',
      1048576: 'connect_iq_app_managment',
      2097152: 'swing_sensor',
      4194304: 'swing_sensor_remote',
      8388608: 'incident_detection',
      16777216: 'audio_prompts',
      33554432: 'wifi_verification',
      67108864: 'true_up',
      134217728: 'find_my_watch',
      268435456: 'remote_manual_sync'
    },
    weather_report: {
      0: 'current',
      1: 'forecast',
      2: 'daily_forecast'
    },
    weather_status: {
      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'
    },
    weather_severity: {
      0: 'unknown',
      1: 'warning',
      2: 'watch',
      3: 'advisory',
      4: 'statement'
    },
    weather_severe_type: {
      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'
    },
    stroke_type: {
      0: 'no_event',
      1: 'other',
      2: 'serve',
      3: 'forehand',
      4: 'backhand',
      5: 'smash'
    },
    body_location: {
      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',
      27: 'left_forearm_extensors',
      28: 'right_arm',
      29: 'right_shoulder',
      30: 'right_bicep',
      31: 'right_tricep',
      32: 'right_brachioradialis',
      33: 'right_forearm_extensors',
      34: 'neck',
      35: 'throat'
    },
    segment_lap_status: {
      0: 'end',
      1: 'fail'
    },
    segment_leaderboard_type: {
      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_delete_status: {
      0: 'do_not_delete',
      1: 'delete_one',
      2: 'delete_all'
    },
    segment_selection_type: {
      0: 'starred',
      1: 'suggested'
    },
    source_type: {
      0: 'ant',
      1: 'antplus',
      2: 'bluetooth',
      3: 'bluetooth_low_energy',
      4: 'wifi',
      5: 'local'
    },
    display_orientation: {
      0: 'auto',
      1: 'portrait',
      2: 'landscape',
      3: 'portrait_flipped',
      4: 'landscape_flipped'
    },
    rider_position_type: {
      0: 'seated',
      1: 'standing'
    },
    power_phase_type: {
      0: 'power_phase_start_angle',
      1: 'power_phase_end_angle',
      2: 'power_phase_arc_length',
      3: 'power_phase_center'
    },
    camera_event_type: {
      0: 'video_start',
      1: 'video_split',
      2: 'video_end',
      3: 'photo_taken',
      4: 'video_second_stream_start',
      5: 'video_second_stream_split',
      6: 'video_second_stream_end',
      7: 'video_split_start',
      8: 'video_second_stream_split_start'
    },
    sensor_type: {
      0: 'accelerometer',
      1: 'gyroscope',
      2: 'compass'
    },
    bike_light_network_config_type: {
      0: 'auto',
      4: 'individual',
      5: 'high_visibility'
    },
    comm_timeout_type: {
      0: 'wildcard_pairing_timeout',
      1: 'pairing_timeout',
      2: 'connection_lost',
      3: 'connection_timeout'
    },
    camera_orientation_type: {
      0: 'camera_orientation_0',
      1: 'camera_orientation_90',
      2: 'camera_orientation_180',
      3: 'camera_orientation_270'
    },
    attitude_stage: {
      0: 'failed',
      1: 'aligning',
      2: 'degraded',
      3: 'valid'
    },
    attitude_validity: {
      0: 0,
      1: 'track_angle_heading_valid',
      2: 'pitch_valid',
      4: 'roll_valid',
      8: 'lateral_body_accel_valid',
      16: 'normal_body_accel_valid',
      32: 'turn_rate_valid',
      64: 'hw_fail',
      128: 'mag_invalid',
      256: 'no_gps',
      512: 'gps_invalid',
      1024: 'solution_coasting',
      2048: 'true_track_angle',
      4096: 'magnetic_heading'
    },
    exd_layout: {
      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_display_type: {
      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_data_units: {
      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'
    },
    exd_qualifiers: {
      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',
      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'
    },
    exd_descriptors: {
      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',
      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',
    },
    supported_exd_screen_layouts: {
      0: 0,
      1: 'full_screen',
      2: 'half_vertical',
      4: 'half_horizontal',
      8: 'half_vertical_right_split',
      16: 'half_horizontal_bottom_split',
      32: 'full_quarter_split',
      64: 'half_vertical_left_split',
      128: 'half_horizontal_top_split',
    },
    fit_base_type: {
      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',
    },
    turn_type: {
      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',
    },
    bike_light_beam_angle_mode: {
      0: 'manual',
      1: 'auto',
    },
    fit_base_unit: {
      0: 'other',
    },
  },
};

export function getMessageName(messageNum) {
  const message = FIT.messages[messageNum];
  return message ? message.name : '';
}

export function getFieldObject(fieldNum, messageNum) {
  const message = FIT.messages[messageNum];
  if (!message) {
    return '';
  }
  const fieldObj = message[fieldNum];
  return fieldObj ? fieldObj : {};
}