fit-file-parser 2.1.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,7 @@ export interface MessageIndex {
16
16
  selected: boolean;
17
17
  }
18
18
  export type File = 'device' | 'settings' | 'sport' | 'activity' | 'workout' | 'course' | 'schedules' | 'weight' | 'totals' | 'goals' | 'blood_pressure' | 'monitoring_a' | 'activity_summary' | 'monitoring_daily' | 'monitoring_b' | 'segment' | 'segment_list' | 'exd_configuration' | 'mfg_range_min' | 'mfg_range_max';
19
- export type MesgNum = 'file_id' | 'capabilities' | 'device_settings' | 'user_profile' | 'hrm_profile' | 'sdm_profile' | 'bike_profile' | 'zones_target' | 'hr_zone' | 'power_zone' | 'met_zone' | 'sport' | 'goal' | 'session' | 'lap' | 'record' | 'event' | 'device_info' | 'workout' | 'workout_step' | 'schedule' | 'weight_scale' | 'course' | 'course_point' | 'totals' | 'activity' | 'software' | 'file_capabilities' | 'mesg_capabilities' | 'field_capabilities' | 'file_creator' | 'blood_pressure' | 'speed_zone' | 'monitoring' | 'training_file' | 'hrv' | 'ant_rx' | 'ant_tx' | 'ant_channel_id' | 'length' | 'monitoring_info' | 'pad' | 'slave_device' | 'connectivity' | 'weather_conditions' | 'weather_alert' | 'cadence_zone' | 'hr' | 'segment_lap' | 'memo_glob' | 'segment_id' | 'segment_leaderboard_entry' | 'segment_point' | 'segment_file' | 'workout_session' | 'watchface_settings' | 'gps_metadata' | 'camera_event' | 'timestamp_correlation' | 'gyroscope_data' | 'accelerometer_data' | 'three_d_sensor_calibration' | 'video_frame' | 'obdii_data' | 'nmea_sentence' | 'aviation_attitude' | 'video' | 'video_title' | 'video_description' | 'video_clip' | 'exd_screen_configuration' | 'exd_data_field_configuration' | 'exd_data_concept_configuration' | 'field_description' | 'developer_data_id' | 'magnetometer_data' | 'barometer_data' | 'one_d_sensor_calibration' | 'set' | 'stress_level' | 'dive_settings' | 'dive_gas' | 'dive_alarm' | 'exercise_title' | 'dive_summary' | 'jump' | 'climb_pro' | 'tank_pressure' | 'tank_summary' | 'mfg_range_min' | 'mfg_range_max' | 'o_hr_settings' | 'tank_update' | 'definition';
19
+ export type MesgNum = 'file_id' | 'capabilities' | 'device_settings' | 'user_profile' | 'hrm_profile' | 'sdm_profile' | 'bike_profile' | 'zones_target' | 'hr_zone' | 'power_zone' | 'met_zone' | 'sport' | 'goal' | 'session' | 'lap' | 'record' | 'event' | 'device_info' | 'workout' | 'workout_step' | 'schedule' | 'weight_scale' | 'course' | 'course_point' | 'totals' | 'activity' | 'software' | 'file_capabilities' | 'mesg_capabilities' | 'field_capabilities' | 'file_creator' | 'blood_pressure' | 'speed_zone' | 'monitoring' | 'training_file' | 'hrv' | 'ant_rx' | 'ant_tx' | 'ant_channel_id' | 'length' | 'monitoring_info' | 'pad' | 'slave_device' | 'connectivity' | 'weather_conditions' | 'weather_alert' | 'cadence_zone' | 'hr' | 'segment_lap' | 'memo_glob' | 'segment_id' | 'segment_leaderboard_entry' | 'segment_point' | 'segment_file' | 'workout_session' | 'watchface_settings' | 'gps_metadata' | 'camera_event' | 'timestamp_correlation' | 'gyroscope_data' | 'accelerometer_data' | 'three_d_sensor_calibration' | 'video_frame' | 'obdii_data' | 'nmea_sentence' | 'aviation_attitude' | 'video' | 'video_title' | 'video_description' | 'video_clip' | 'exd_screen_configuration' | 'exd_data_field_configuration' | 'exd_data_concept_configuration' | 'field_description' | 'developer_data_id' | 'magnetometer_data' | 'barometer_data' | 'one_d_sensor_calibration' | 'time_in_zone' | 'set' | 'stress_level' | 'dive_settings' | 'dive_gas' | 'dive_alarm' | 'exercise_title' | 'dive_summary' | 'jump' | 'climb_pro' | 'tank_update' | 'tank_summary' | 'o_hr_settings' | 'mfg_range_min' | 'mfg_range_max' | 'definition';
20
20
  export type Checksum = 'clear' | 'ok';
21
21
  export type FileFlags = '0' | 'read' | 'write' | 'erase';
22
22
  export type MesgCount = 'num_per_file' | 'max_per_file' | 'max_per_file_type';
@@ -363,6 +363,8 @@ export interface ParsedSession {
363
363
  training_stress_score?: number;
364
364
  intensity_factor?: number;
365
365
  left_right_balance?: LeftRightBalance100;
366
+ end_position_lat?: number;
367
+ end_position_long?: number;
366
368
  avg_stroke_count?: number;
367
369
  avg_stroke_distance?: number;
368
370
  swim_stroke?: SwimStroke;
@@ -387,10 +389,10 @@ export interface ParsedSession {
387
389
  max_pos_vertical_speed?: number;
388
390
  max_neg_vertical_speed?: number;
389
391
  min_heart_rate?: number;
390
- time_in_hr_zone?: Uint32Array;
391
- time_in_speed_zone?: Uint32Array;
392
- time_in_cadence_zone?: Uint32Array;
393
- time_in_power_zone?: Uint32Array;
392
+ time_in_hr_zone?: number[];
393
+ time_in_speed_zone?: number[];
394
+ time_in_cadence_zone?: number[];
395
+ time_in_power_zone?: number[];
394
396
  avg_lap_time?: number;
395
397
  best_lap_index?: number;
396
398
  min_altitude?: number;
@@ -418,6 +420,7 @@ export interface ParsedSession {
418
420
  avg_left_pedal_smoothness?: number;
419
421
  avg_right_pedal_smoothness?: number;
420
422
  avg_combined_pedal_smoothness?: number;
423
+ sport_profile_name?: string;
421
424
  sport_index?: number;
422
425
  time_standing?: number;
423
426
  stand_count?: number;
@@ -442,10 +445,24 @@ export interface ParsedSession {
442
445
  avg_vertical_ratio?: number;
443
446
  avg_stance_time_balance?: number;
444
447
  avg_step_length?: number;
445
- total_anaerobic_effect?: number;
448
+ total_anaerobic_training_effect?: number;
446
449
  avg_vam?: number;
450
+ recovery_advisor?: number;
451
+ min_temperature?: number;
452
+ training_load_peak?: number;
453
+ enhanced_avg_respiration_rate?: number;
454
+ enhanced_max_respiration_rate?: number;
455
+ est_sweat_loss?: number;
456
+ enhanced_min_respiration_rate?: number;
457
+ total_grit?: number;
458
+ jump_count?: number;
459
+ avg_flow?: number;
460
+ primary_benefit?: number;
447
461
  workout_feel?: number;
448
462
  workout_rpe?: number;
463
+ resting_calories?: number;
464
+ avg_grit?: number;
465
+ avg_flow?: number;
449
466
  timestamp: string;
450
467
  message_index?: MessageIndex;
451
468
  laps?: ParsedLap[];
@@ -502,10 +519,10 @@ export interface ParsedLap {
502
519
  avg_neg_vertical_speed?: number;
503
520
  max_pos_vertical_speed?: number;
504
521
  max_neg_vertical_speed?: number;
505
- time_in_hr_zone?: Uint32Array;
506
- time_in_speed_zone?: Uint32Array;
507
- time_in_cadence_zone?: Uint32Array;
508
- time_in_power_zone?: Uint32Array;
522
+ time_in_hr_zone?: number[];
523
+ time_in_speed_zone?: number[];
524
+ time_in_cadence_zone?: number[];
525
+ time_in_power_zone?: number[];
509
526
  repetition_num?: number;
510
527
  min_altitude?: number;
511
528
  min_heart_rate?: number;
@@ -627,6 +644,8 @@ export interface ParsedRecord {
627
644
  ndl_time?: number;
628
645
  cns_load?: number;
629
646
  n2_load?: number;
647
+ grit?: number;
648
+ flow?: number;
630
649
  timestamp: string;
631
650
  }
632
651
  export interface ParsedEvent {
@@ -660,8 +679,10 @@ export interface ParsedDeviceInfo {
660
679
  ant_transmission_type?: number;
661
680
  ant_device_number?: number;
662
681
  ant_network?: AntNetwork;
682
+ ant_id?: number;
663
683
  source_type?: SourceType;
664
684
  product_name?: string;
685
+ battery_level?: number;
665
686
  timestamp: string;
666
687
  }
667
688
  export interface ParsedWorkout {
@@ -816,7 +837,7 @@ export interface ParsedMonitoring {
816
837
  timestamp: number;
817
838
  }
818
839
  export interface ParsedHrv {
819
- time?: Uint16Array;
840
+ time?: number[];
820
841
  }
821
842
  export interface ParsedLength {
822
843
  event?: Event;
@@ -850,6 +871,13 @@ export interface ParsedOHrSettings {
850
871
  enabled?: number;
851
872
  timestamp: string;
852
873
  }
874
+ export interface ParsedJump {
875
+ enhanced_mets?: number;
876
+ distance?: number;
877
+ height?: number;
878
+ score?: number;
879
+ timestamp: string;
880
+ }
853
881
  export interface ParsedFieldDescription {
854
882
  developer_data_index?: number;
855
883
  field_definition_number?: number;
@@ -862,11 +890,30 @@ export interface ParsedFieldDescription {
862
890
  }
863
891
  export interface ParsedDeveloperDataId {
864
892
  developer_id?: number;
865
- application_id?: unknown[];
893
+ application_id?: number[];
866
894
  manufacturer_id?: Manufacturer;
867
895
  developer_data_index?: number;
868
896
  application_version?: number;
869
897
  }
898
+ export interface ParsedTimeInZone {
899
+ reference_mesg?: number;
900
+ reference_index?: number;
901
+ time_in_hr_zone?: number[];
902
+ time_in_speed_zone?: number[];
903
+ time_in_power_zone?: number[];
904
+ hr_zone_high_boundary_deprecated?: number[];
905
+ hr_zone_high_boundary?: number[];
906
+ speed_zone_high_boundary?: number[];
907
+ power_zone_high_boundary?: number[];
908
+ hr_calc_type?: HrZoneCalc;
909
+ max_heart_rate_deprecated?: number;
910
+ max_heart_rate?: number;
911
+ resting_heart_rate?: number;
912
+ threshold_heart_rate?: number;
913
+ pwr_calc_type?: PwrZoneCalc;
914
+ functional_threshold_power?: number;
915
+ timestamp: string;
916
+ }
870
917
  export interface ParsedStressLevel {
871
918
  stress_level_value?: number;
872
919
  stress_level_time?: string;
@@ -971,4 +1018,6 @@ export interface ParsedFit {
971
1018
  definitions?: unknown[];
972
1019
  tank_updates?: ParsedTankUpdate[];
973
1020
  tank_summaries?: ParsedTankSummary[];
1021
+ jumps?: ParsedJump[];
1022
+ time_in_zone?: ParsedTimeInZone[];
974
1023
  }
@@ -60,8 +60,14 @@ function generateArrayProperty(name, type, optional = true) {
60
60
  }
61
61
  function generateTypeFromField(def) {
62
62
  switch (def.type) {
63
+ case 'uint32_array':
64
+ case 'uint16_array':
65
+ case 'uint8_array':
66
+ case 'sint32_array':
67
+ case 'sint16_array':
68
+ case 'sint8_array':
63
69
  case 'byte_array':
64
- return typescript_1.default.factory.createArrayTypeNode(typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.UnknownKeyword));
70
+ return typescript_1.default.factory.createArrayTypeNode(typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.NumberKeyword));
65
71
  case 'bool':
66
72
  return typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.BooleanKeyword);
67
73
  case 'date_time':
@@ -104,11 +110,7 @@ function generateTypes(types) {
104
110
  const typeAlias = typescript_1.default.factory.createTypeAliasDeclaration([
105
111
  typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword),
106
112
  ], snakeToCamel(name), undefined, typescript_1.default.factory.createUnionTypeNode([...names.map(n => typescript_1.default.factory.createLiteralTypeNode(typescript_1.default.factory.createStringLiteral(String(n)))), ...(name === 'mesg_num'
107
- // TODO those are somehow missing in the FIT.types.mesg_num definition
108
- // especially 'tank_update' (319 in messages) is mapped to 'tank_pressure' a bug?
109
113
  ? [
110
- typescript_1.default.factory.createLiteralTypeNode(typescript_1.default.factory.createStringLiteral('o_hr_settings')),
111
- typescript_1.default.factory.createLiteralTypeNode(typescript_1.default.factory.createStringLiteral('tank_update')),
112
114
  typescript_1.default.factory.createLiteralTypeNode(typescript_1.default.factory.createStringLiteral('definition')),
113
115
  ]
114
116
  : [])]));
@@ -206,6 +208,8 @@ function generateFitType() {
206
208
  definitions: 'unknown',
207
209
  tank_updates: 'parsed_tank_update',
208
210
  tank_summaries: 'parsed_tank_summary',
211
+ jumps: 'parsed_jump',
212
+ time_in_zone: 'parsed_time_in_zone',
209
213
  };
210
214
  const referenceProperties = {
211
215
  file_creator: 'parsed_file_creator',
@@ -99,6 +99,8 @@ export default class FitParser {
99
99
  const lengths = [];
100
100
  const tank_updates = [];
101
101
  const tank_summaries = [];
102
+ const jumps = [];
103
+ const time_in_zone = [];
102
104
  let loopIndex = headerLength;
103
105
  const messageTypes = [];
104
106
  const developerFields = [];
@@ -194,6 +196,12 @@ export default class FitParser {
194
196
  case 'tank_summary':
195
197
  tank_summaries.push(message);
196
198
  break;
199
+ case 'jump':
200
+ jumps.push(message);
201
+ break;
202
+ case 'time_in_zone':
203
+ time_in_zone.push(message);
204
+ break;
197
205
  default:
198
206
  if (messageType !== '') {
199
207
  fitObj[messageType] = message;
@@ -213,6 +221,8 @@ export default class FitParser {
213
221
  fitObj.definitions = definitions;
214
222
  fitObj.tank_updates = tank_updates;
215
223
  fitObj.tank_summaries = tank_summaries;
224
+ fitObj.jumps = jumps;
225
+ fitObj.time_in_zone = time_in_zone;
216
226
  if (isCascadeNeeded) {
217
227
  laps = mapDataIntoLap(laps, 'records', records);
218
228
  laps = mapDataIntoLap(laps, 'lengths', lengths);
package/dist/fit.js CHANGED
@@ -1080,6 +1080,20 @@ export const FIT = {
1080
1080
  offset: 0,
1081
1081
  units: '%',
1082
1082
  },
1083
+ 38: {
1084
+ field: 'end_position_lat',
1085
+ type: 'sint32',
1086
+ scale: null,
1087
+ offset: 0,
1088
+ units: 'semicircles',
1089
+ },
1090
+ 39: {
1091
+ field: 'end_position_long',
1092
+ type: 'sint32',
1093
+ scale: null,
1094
+ offset: 0,
1095
+ units: 'semicircles',
1096
+ },
1083
1097
  41: {
1084
1098
  field: 'avg_stroke_count',
1085
1099
  type: 'uint32',
@@ -1634,7 +1648,7 @@ export const FIT = {
1634
1648
  units: 'mm',
1635
1649
  },
1636
1650
  137: {
1637
- field: 'total_anaerobic_effect',
1651
+ field: 'total_anaerobic_training_effect',
1638
1652
  type: 'uint8',
1639
1653
  scale: 10,
1640
1654
  offset: 0,
@@ -1643,9 +1657,9 @@ export const FIT = {
1643
1657
  139: {
1644
1658
  field: 'avg_vam',
1645
1659
  type: 'uint16',
1646
- scale: 1000,
1660
+ scale: 1, // Raw 100 -> 100 (User specific m/h)
1647
1661
  offset: 0,
1648
- units: 'm/s',
1662
+ units: 'm/h',
1649
1663
  },
1650
1664
  192: {
1651
1665
  field: 'workout_feel',
@@ -1661,6 +1675,111 @@ export const FIT = {
1661
1675
  offset: 0,
1662
1676
  units: '',
1663
1677
  },
1678
+ 110: {
1679
+ field: 'sport_profile_name',
1680
+ type: 'string',
1681
+ scale: null,
1682
+ offset: 0,
1683
+ units: '',
1684
+ },
1685
+ 168: {
1686
+ field: 'training_load_peak',
1687
+ type: 'uint32',
1688
+ scale: 1,
1689
+ offset: 0,
1690
+ units: '',
1691
+ },
1692
+ 169: {
1693
+ field: 'enhanced_avg_respiration_rate',
1694
+ type: 'uint16',
1695
+ scale: 100,
1696
+ offset: 0,
1697
+ units: 'breaths/min',
1698
+ },
1699
+ 150: {
1700
+ field: 'min_temperature',
1701
+ type: 'sint8',
1702
+ scale: null,
1703
+ offset: 0,
1704
+ units: 'C',
1705
+ },
1706
+ 170: {
1707
+ field: 'enhanced_max_respiration_rate',
1708
+ type: 'uint16',
1709
+ scale: 100,
1710
+ offset: 0,
1711
+ units: 'breaths/min',
1712
+ },
1713
+ 178: {
1714
+ field: 'est_sweat_loss',
1715
+ type: 'uint16',
1716
+ scale: 1, // ml
1717
+ offset: 0,
1718
+ units: 'ml',
1719
+ },
1720
+ 180: {
1721
+ field: 'enhanced_min_respiration_rate',
1722
+ type: 'uint16',
1723
+ scale: 100,
1724
+ offset: 0,
1725
+ units: 'breaths/min',
1726
+ },
1727
+ 181: {
1728
+ field: 'total_grit',
1729
+ type: 'float32',
1730
+ scale: 1,
1731
+ offset: 0,
1732
+ units: 'kGrit',
1733
+ },
1734
+ 183: {
1735
+ field: 'jump_count',
1736
+ type: 'uint16',
1737
+ scale: 1,
1738
+ offset: 0,
1739
+ units: '',
1740
+ },
1741
+ 187: {
1742
+ field: 'avg_flow',
1743
+ type: 'float32',
1744
+ scale: 1,
1745
+ offset: 0,
1746
+ units: 'Flow',
1747
+ },
1748
+ 188: {
1749
+ field: 'primary_benefit',
1750
+ type: 'uint8',
1751
+ scale: 1,
1752
+ offset: 0,
1753
+ units: '',
1754
+ },
1755
+ 196: {
1756
+ field: 'resting_calories',
1757
+ type: 'uint16',
1758
+ scale: 1,
1759
+ offset: 0,
1760
+ units: 'kcal',
1761
+ },
1762
+ 214: {
1763
+ field: 'avg_grit',
1764
+ type: 'float32',
1765
+ scale: null,
1766
+ offset: 0,
1767
+ units: '',
1768
+ },
1769
+ 215: {
1770
+ field: 'avg_flow',
1771
+ type: 'float32',
1772
+ scale: null,
1773
+ offset: 0,
1774
+ units: '',
1775
+ },
1776
+ 140: {
1777
+ field: 'recovery_advisor',
1778
+ type: 'uint16', // Minutes?
1779
+ scale: 1,
1780
+ offset: 0,
1781
+ units: 'min',
1782
+ },
1664
1783
  },
1665
1784
  19: {
1666
1785
  name: 'lap',
@@ -2404,6 +2523,20 @@ export const FIT = {
2404
2523
  offset: 0,
2405
2524
  units: 's',
2406
2525
  },
2526
+ 114: {
2527
+ field: 'grit',
2528
+ type: 'float32',
2529
+ scale: null,
2530
+ offset: 0,
2531
+ units: '',
2532
+ },
2533
+ 115: {
2534
+ field: 'flow',
2535
+ type: 'float32',
2536
+ scale: null,
2537
+ offset: 0,
2538
+ units: '',
2539
+ },
2407
2540
  0: {
2408
2541
  field: 'position_lat',
2409
2542
  type: 'sint32',
@@ -2855,6 +2988,14 @@ export const FIT = {
2855
2988
  units: 'percent',
2856
2989
  },
2857
2990
  },
2991
+ 140: {
2992
+ name: 'jump',
2993
+ 253: { field: 'timestamp', type: 'date_time', scale: null, offset: 0, units: 's' },
2994
+ 9: { field: 'distance', type: 'uint16', scale: 100, offset: 0, units: 'm' },
2995
+ 10: { field: 'height', type: 'uint16', scale: 1000, offset: 0, units: 'm' },
2996
+ 37: { field: 'score', type: 'sint32', scale: null, offset: 0, units: '' },
2997
+ 7: { field: 'enhanced_mets', type: 'uint32', scale: 65536, offset: 0, units: 'METs' },
2998
+ },
2858
2999
  21: {
2859
3000
  name: 'event',
2860
3001
  253: {
@@ -3046,6 +3187,13 @@ export const FIT = {
3046
3187
  offset: 0,
3047
3188
  units: '',
3048
3189
  },
3190
+ 24: {
3191
+ field: 'ant_id',
3192
+ type: 'uint32z',
3193
+ scale: null,
3194
+ offset: 0,
3195
+ units: '',
3196
+ },
3049
3197
  25: {
3050
3198
  field: 'source_type',
3051
3199
  type: 'source_type',
@@ -4490,6 +4638,128 @@ export const FIT = {
4490
4638
  units: 'cbar',
4491
4639
  },
4492
4640
  },
4641
+ 216: {
4642
+ name: 'time_in_zone',
4643
+ 253: {
4644
+ field: 'timestamp',
4645
+ type: 'date_time',
4646
+ scale: null,
4647
+ offset: 0,
4648
+ units: 's',
4649
+ },
4650
+ 0: {
4651
+ field: 'reference_mesg',
4652
+ type: 'uint16',
4653
+ scale: null,
4654
+ offset: 0,
4655
+ units: '',
4656
+ },
4657
+ 1: {
4658
+ field: 'reference_index',
4659
+ type: 'uint16',
4660
+ scale: null,
4661
+ offset: 0,
4662
+ units: '',
4663
+ },
4664
+ 2: {
4665
+ field: 'time_in_hr_zone',
4666
+ type: 'uint32_array',
4667
+ scale: 1000,
4668
+ offset: 0,
4669
+ units: 's',
4670
+ },
4671
+ 3: {
4672
+ field: 'time_in_speed_zone',
4673
+ type: 'uint32_array',
4674
+ scale: 1000,
4675
+ offset: 0,
4676
+ units: 's',
4677
+ },
4678
+ 4: {
4679
+ field: 'time_in_power_zone',
4680
+ type: 'uint32_array',
4681
+ scale: 1000,
4682
+ offset: 0,
4683
+ units: 's',
4684
+ },
4685
+ 5: {
4686
+ field: 'hr_zone_high_boundary_deprecated',
4687
+ type: 'uint8_array',
4688
+ scale: null,
4689
+ offset: 0,
4690
+ units: '',
4691
+ },
4692
+ 6: {
4693
+ field: 'hr_zone_high_boundary',
4694
+ type: 'uint8_array',
4695
+ scale: null,
4696
+ offset: 0,
4697
+ units: 'bpm',
4698
+ },
4699
+ 7: {
4700
+ field: 'speed_zone_high_boundary',
4701
+ type: 'uint16_array',
4702
+ scale: 1000,
4703
+ offset: 0,
4704
+ units: 'm/s',
4705
+ },
4706
+ 8: {
4707
+ field: 'power_zone_high_boundary',
4708
+ type: 'uint16_array',
4709
+ scale: null,
4710
+ offset: 0,
4711
+ units: 'watts',
4712
+ },
4713
+ 9: {
4714
+ field: 'hr_calc_type',
4715
+ type: 'hr_zone_calc',
4716
+ scale: null,
4717
+ offset: 0,
4718
+ units: '',
4719
+ },
4720
+ 10: {
4721
+ field: 'max_heart_rate_deprecated',
4722
+ type: 'uint8',
4723
+ scale: null,
4724
+ offset: 0,
4725
+ units: 'bpm',
4726
+ },
4727
+ 11: {
4728
+ field: 'max_heart_rate',
4729
+ type: 'uint8',
4730
+ scale: null,
4731
+ offset: 0,
4732
+ units: 'bpm',
4733
+ },
4734
+ 12: {
4735
+ field: 'resting_heart_rate',
4736
+ type: 'uint8',
4737
+ scale: null,
4738
+ offset: 0,
4739
+ units: 'bpm',
4740
+ },
4741
+ 13: {
4742
+ field: 'threshold_heart_rate',
4743
+ type: 'uint8',
4744
+ scale: null,
4745
+ offset: 0,
4746
+ units: 'bpm',
4747
+ },
4748
+ 14: {
4749
+ field: 'pwr_calc_type',
4750
+ type: 'pwr_zone_calc',
4751
+ scale: null,
4752
+ offset: 0,
4753
+ units: '',
4754
+ },
4755
+ 15: {
4756
+ field: 'functional_threshold_power',
4757
+ type: 'uint16',
4758
+ scale: null,
4759
+ offset: 0,
4760
+ units: 'watts',
4761
+ },
4762
+ },
4493
4763
  },
4494
4764
  types: {
4495
4765
  file: {
@@ -4602,8 +4872,10 @@ export const FIT = {
4602
4872
  268: 'dive_summary',
4603
4873
  285: 'jump',
4604
4874
  317: 'climb_pro',
4605
- 319: 'tank_pressure',
4875
+ 319: 'tank_update',
4606
4876
  323: 'tank_summary',
4877
+ 216: 'time_in_zone',
4878
+ 347: 'o_hr_settings',
4607
4879
  65280: 'mfg_range_min',
4608
4880
  65534: 'mfg_range_max',
4609
4881
  },