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.
- package/debug_output.json +413301 -0
- package/deep_probe.js +70 -0
- package/dist/binary.js +22 -4
- package/dist/cjs/binary.js +22 -4
- package/dist/cjs/fit-parser.js +10 -0
- package/dist/cjs/fit.js +276 -4
- package/dist/cjs/fit_types.d.ts +61 -12
- package/dist/cjs/type_generator.js +9 -5
- package/dist/fit-parser.js +10 -0
- package/dist/fit.js +276 -4
- package/dist/fit_types.d.ts +61 -12
- package/dist/type_generator.js +9 -5
- package/eslint.config.js +5 -0
- package/package.json +1 -1
- package/probe_session.js +49 -0
package/dist/cjs/fit_types.d.ts
CHANGED
|
@@ -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' | '
|
|
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?:
|
|
391
|
-
time_in_speed_zone?:
|
|
392
|
-
time_in_cadence_zone?:
|
|
393
|
-
time_in_power_zone?:
|
|
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
|
-
|
|
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?:
|
|
506
|
-
time_in_speed_zone?:
|
|
507
|
-
time_in_cadence_zone?:
|
|
508
|
-
time_in_power_zone?:
|
|
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?:
|
|
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?:
|
|
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.
|
|
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',
|
package/dist/fit-parser.js
CHANGED
|
@@ -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: '
|
|
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:
|
|
1660
|
+
scale: 1, // Raw 100 -> 100 (User specific m/h)
|
|
1647
1661
|
offset: 0,
|
|
1648
|
-
units: 'm/
|
|
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: '
|
|
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
|
},
|