trackswap 0.2.3 → 0.2.4

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.
Files changed (53) hide show
  1. package/README.md +20 -0
  2. package/dist/FIT/base.d.ts +30 -0
  3. package/dist/FIT/decoder.d.ts +48 -0
  4. package/dist/FIT/encoder.d.ts +96 -0
  5. package/dist/FIT/encoderCourse.d.ts +45 -0
  6. package/dist/FIT/encoderWorkout.d.ts +45 -0
  7. package/dist/FIT/health.d.ts +195 -7
  8. package/dist/FIT/index.d.ts +1 -1
  9. package/dist/FIT/mesg.d.ts +3 -0
  10. package/dist/FIT/middleware.d.ts +15 -0
  11. package/dist/FIT/plugins.d.ts +9 -0
  12. package/dist/FIT/processor.d.ts +24 -0
  13. package/dist/FIT/types/checksum_type.d.ts +6 -0
  14. package/dist/FIT/types/date_time_type.d.ts +3 -0
  15. package/dist/FIT/types/file.d.ts +63 -0
  16. package/dist/FIT/types/file_flags_type.d.ts +9 -0
  17. package/dist/FIT/types/local_date_time_type.d.ts +3 -0
  18. package/dist/FIT/types/mesg_count_type.d.ts +6 -0
  19. package/dist/FIT/types/mesg_num.d.ts +369 -0
  20. package/dist/FIT/types/message_index_type.d.ts +6591 -0
  21. package/dist/FIT/types/sport.d.ts +44 -44
  22. package/dist/FIT/types.d.ts +509 -0
  23. package/dist/GPX/base.d.ts +24 -0
  24. package/dist/GPX/converters.d.ts +44 -0
  25. package/dist/GPX/decoder.d.ts +66 -0
  26. package/dist/GPX/encoder.d.ts +109 -0
  27. package/dist/GPX/middleware.d.ts +9 -0
  28. package/dist/GPX/processor.d.ts +18 -0
  29. package/dist/GPX/types.d.ts +138 -0
  30. package/dist/TCX/base.d.ts +33 -0
  31. package/dist/TCX/converters.d.ts +33 -0
  32. package/dist/TCX/decoder.d.ts +54 -0
  33. package/dist/TCX/encoder.d.ts +116 -0
  34. package/dist/TCX/middleware.d.ts +12 -0
  35. package/dist/TCX/processor.d.ts +30 -0
  36. package/dist/TCX/types.d.ts +13 -0
  37. package/dist/TrackSwap.d.ts +4 -0
  38. package/dist/activity/base.d.ts +54 -0
  39. package/dist/activity/converters.d.ts +57 -0
  40. package/dist/activity/encoders.d.ts +34 -0
  41. package/dist/activity/metrics/MetricsCalculator.d.ts +30 -0
  42. package/dist/activity/processor.d.ts +31 -0
  43. package/dist/core/base.d.ts +46 -0
  44. package/dist/core/builtin-adapters.d.ts +1 -0
  45. package/dist/core/xml-utils.d.ts +24 -0
  46. package/dist/errors.d.ts +1 -1
  47. package/dist/fit-debug.d.ts +3 -0
  48. package/dist/index.cjs +4 -4
  49. package/dist/index.d.ts +2 -2
  50. package/dist/index.js +29 -29
  51. package/dist/types.d.ts +102 -1
  52. package/dist/util.d.ts +9 -0
  53. package/package.json +4 -3
@@ -1,4 +1,7 @@
1
1
  import { IProcessingContext } from "../core/base.js";
2
+ /**
3
+ * Session corresponds to AbstractTrackType, Lap corresponds to RouteSegType, Records corresponds to RouteType, each Record corresponds to PointType
4
+ */
2
5
  export interface FITFileType {
3
6
  fileIdMesgs?: FileIdMesgType[];
4
7
  fileCreatorMesgs?: FileCreatorMesgType[];
@@ -7,24 +10,45 @@ export interface FITFileType {
7
10
  deviceSettingsMesgs?: DeviceSettingsMesgType[];
8
11
  userProfileMesgs?: UserProfileMesgType[];
9
12
  sessionMesgs?: SessionMesgType[];
13
+ lapMesgs?: LapMesgType[];
14
+ recordMesgs?: RecordMesgType[];
15
+ lengthMesgs?: LengthMesgType[];
16
+ setMesgs?: SetMesgType[];
10
17
  courseMesgs?: any[];
11
18
  healthDocument?: import("./health.js").HealthDocumentV1;
12
19
  fitDocumentMetadata?: {
13
20
  detectedKinds: import("./health.js").FITPrimaryKind[];
14
21
  messageCounts: Record<string, number>;
15
22
  };
23
+ [key: string]: unknown;
16
24
  }
17
25
  export type FITDecoderMesgs = {
26
+ /**
27
+ *
28
+ */
18
29
  fileIdMesgs?: FileIdMesgType[];
19
30
  fileCreatorMesgs?: FileCreatorMesgType[];
20
31
  eventMesgs?: EventMesgType[];
21
32
  deviceInfoMesgs?: DeviceInfoMesgType[];
22
33
  deviceSettingsMesgs?: DeviceSettingsMesgType[];
23
34
  userProfileMesgs?: UserProfileMesgType[];
35
+ /**
36
+ * Session 消息数组
37
+ */
24
38
  sessionMesgs?: Omit<SessionMesgType, "lapMesgs">[];
39
+ /**
40
+ * Lap 消息数组
41
+ */
25
42
  lapMesgs?: Omit<LapMesgType, "recordMesgs">[];
43
+ /**
44
+ * Record 消息数组
45
+ */
26
46
  recordMesgs?: RecordMesgType[];
47
+ /**
48
+ * Length 消息数组
49
+ */
27
50
  lengthMesgs?: LengthMesgType[];
51
+ setMesgs?: SetMesgType[];
28
52
  courseMesgs?: any[];
29
53
  [key: string]: any[] | undefined;
30
54
  };
@@ -65,6 +89,9 @@ export interface DeviceSettingsMesgType {
65
89
  timeZoneOffset?: number;
66
90
  backlightMode?: string;
67
91
  }
92
+ /**
93
+ * FIT userProfileMesg
94
+ */
68
95
  export interface UserProfileMesgType {
69
96
  friendlyName?: string;
70
97
  weight?: number;
@@ -84,406 +111,880 @@ export interface UserProfileMesgType {
84
111
  positionSetting?: string;
85
112
  temperatureSetting?: string;
86
113
  }
114
+ /** FIT strength-training set phase. Active and rest phases share this message. */
115
+ export interface SetMesgType {
116
+ /** Timestamp of the parent strength-training session. */
117
+ timestamp?: Date;
118
+ /** Duration of this active or rest phase in seconds. */
119
+ duration?: number;
120
+ /** Repetitions completed during an active phase. */
121
+ repetitions?: number;
122
+ /** External load in kilograms. */
123
+ weight?: number;
124
+ setType?: string;
125
+ startTime?: Date;
126
+ /** One or more FIT exercise categories associated with the phase. */
127
+ category?: Array<string | number> | string | number;
128
+ /** Category-specific FIT exercise-name enum values, aligned by index. */
129
+ categorySubtype?: Array<number | null | undefined> | number | null;
130
+ weightDisplayUnit?: string | number;
131
+ messageIndex?: number;
132
+ wktStepIndex?: number;
133
+ }
134
+ /**
135
+ * FIT SessionMesg
136
+ */
137
+ /**
138
+ * FIT 文件 session 消息(整场活动汇总)TypeScript 定义
139
+ * 字段顺序与协议保持一致,全部驼峰命名 + 中文注释
140
+ * 单位已换算为常用展示值,无效值(255/65535)请在前端显示为“–”
141
+ */
87
142
  export interface SessionMesgType {
143
+ /** 消息索引(通常 0) */
88
144
  messageIndex?: number;
145
+ /** 活动结束时间戳(UTC) */
89
146
  timestamp: Date;
147
+ /** 事件类型 – session */
90
148
  event: string;
149
+ /** 事件子类型 – stop/activityEnd 等 */
91
150
  eventType: string;
151
+ /** 活动开始时间戳(UTC) */
92
152
  startTime: Date;
153
+ /** 起点纬度 ° */
93
154
  startPositionLat?: number;
155
+ /** 起点经度 ° */
94
156
  startPositionLong?: number;
157
+ /** 主运动类型 running/cycling 等 */
95
158
  sport?: string;
159
+ /** 子运动类型 generic/interval 等 */
96
160
  subSport?: string;
161
+ /** 总耗时(含暂停)s */
97
162
  totalElapsedTime?: number;
163
+ /** 总计时(不含暂停)s */
98
164
  totalTimerTime?: number;
165
+ /** 总距离 m */
99
166
  totalDistance?: number;
167
+ /** 总圈数/总步数/总划水数(见子字段) */
100
168
  totalCycles?: number;
169
+ /** 总步数(running) */
101
170
  totalStrides?: number;
171
+ /** 总划水数(swimming) */
102
172
  totalStrokes?: number;
173
+ /** 总热量 kcal */
103
174
  totalCalories?: number;
175
+ /** 脂肪热量 kcal */
104
176
  totalFatCalories?: number;
177
+ /** 平均速度 m/s;enhancedAvgSpeed 优先 */
105
178
  avgSpeed?: number;
179
+ /** 高精度平均速度 m/s */
106
180
  enhancedAvgSpeed?: number;
181
+ /** 最大速度 m/s;enhancedMaxSpeed 优先 */
107
182
  maxSpeed?: number;
183
+ /** 高精度最大速度 m/s */
108
184
  enhancedMaxSpeed?: number;
185
+ /** 平均心率 bpm */
109
186
  avgHeartRate?: number;
187
+ /** 最大心率 bpm */
110
188
  maxHeartRate?: number;
189
+ /** 平均踏频/步频 rpm;子字段 avgRunningCadence */
111
190
  avgCadence?: number;
191
+ /** 平均步频 spm(running) */
112
192
  avgRunningCadence?: number;
193
+ /** 最大踏频/步频 rpm;子字段 maxRunningCadence */
113
194
  maxCadence?: number;
195
+ /** 最大步频 spm(running) */
114
196
  maxRunningCadence?: number;
197
+ /** 平均功率 W */
115
198
  avgPower?: number;
199
+ /** 最大功率 W */
116
200
  maxPower?: number;
201
+ /** 累计爬升 m */
117
202
  totalAscent?: number;
203
+ /** 累计下降 m */
118
204
  totalDescent?: number;
205
+ /** 训练效果 0–5 */
119
206
  totalTrainingEffect?: number;
207
+ /** 第一圈索引 */
120
208
  firstLapIndex?: number;
209
+ /** 圈数 */
121
210
  numLaps?: number;
211
+ /** 事件组(通常 0) */
122
212
  eventGroup?: number;
213
+ /** 触发方式 activityEnd/manual 等 */
123
214
  trigger?: string;
215
+ /** 东北角纬度 °(边界框) */
124
216
  necLat?: number;
217
+ /** 东北角经度 °(边界框) */
125
218
  necLong?: number;
219
+ /** 西南角纬度 °(边界框) */
126
220
  swcLat?: number;
221
+ /** 西南角经度 °(边界框) */
127
222
  swcLong?: number;
223
+ /** 游泳趟数 */
128
224
  numLengths?: number;
225
+ /** 标准化功率 W */
129
226
  normalizedPower?: number;
227
+ /** 训练压力分数 TSS */
130
228
  trainingStressScore?: number;
229
+ /** 强度系数 IF */
131
230
  intensityFactor?: number;
231
+ /** 左右平衡 %(左 50-右 50) */
132
232
  leftRightBalance?: number;
233
+ /** 终点纬度 ° */
133
234
  endPositionLat?: number;
235
+ /** 终点经度 ° */
134
236
  endPositionLong?: number;
237
+ /** 平均每趟划水数 */
135
238
  avgStrokeCount?: number;
239
+ /** 平均每划距离 m */
136
240
  avgStrokeDistance?: number;
241
+ /** 游泳划水类型 */
137
242
  swimStroke?: string;
243
+ /** 泳池长度 m */
138
244
  poolLength?: number;
245
+ /** 阈值功率 W */
139
246
  thresholdPower?: number;
247
+ /** 泳池长度单位 metric/imperial */
140
248
  poolLengthUnit?: string;
249
+ /** 有效趟数 */
141
250
  numActiveLengths?: number;
251
+ /** 总做功 J */
142
252
  totalWork?: number;
253
+ /** 平均海拔 m;enhancedAvgAltitude 优先 */
143
254
  avgAltitude?: number;
255
+ /** 高精度平均海拔 m */
144
256
  enhancedAvgAltitude?: number;
257
+ /** 最大海拔 m;enhancedMaxAltitude 优先 */
145
258
  maxAltitude?: number;
259
+ /** 高精度最大海拔 m */
146
260
  enhancedMaxAltitude?: number;
261
+ /** GPS 精度 m */
147
262
  gpsAccuracy?: number;
263
+ /** 平均坡度 % */
148
264
  avgGrade?: number;
265
+ /** 平均正坡度 % */
149
266
  avgPosGrade?: number;
267
+ /** 平均负坡度 % */
150
268
  avgNegGrade?: number;
269
+ /** 最大正坡度 % */
151
270
  maxPosGrade?: number;
271
+ /** 最大负坡度 % */
152
272
  maxNegGrade?: number;
273
+ /** 平均温度 °C */
153
274
  avgTemperature?: number;
275
+ /** 最高温度 °C */
154
276
  maxTemperature?: number;
277
+ /** 最低温度 °C */
155
278
  minTemperature?: number;
279
+ /** 总移动时间 s */
156
280
  totalMovingTime?: number;
281
+ /** 平均上升速度 m/s */
157
282
  avgPosVerticalSpeed?: number;
283
+ /** 平均下降速度 m/s */
158
284
  avgNegVerticalSpeed?: number;
285
+ /** 最大上升速度 m/s */
159
286
  maxPosVerticalSpeed?: number;
287
+ /** 最大下降速度 m/s */
160
288
  maxNegVerticalSpeed?: number;
289
+ /** 最小心率 bpm */
161
290
  minHeartRate?: number;
291
+ /** 各心率区间停留时间 s 数组 */
162
292
  timeInHrZone?: number[];
293
+ /** 各速度区间停留时间 s 数组 */
163
294
  timeInSpeedZone?: number[];
295
+ /** 各踏频区间停留时间 s 数组 */
164
296
  timeInCadenceZone?: number[];
297
+ /** 各功率区间停留时间 s 数组 */
165
298
  timeInPowerZone?: number[];
299
+ /** 平均圈时 s */
166
300
  avgLapTime?: number;
301
+ /** 最快圈索引 */
167
302
  bestLapIndex?: number;
303
+ /** 最小海拔 m;enhancedMinAltitude 优先 */
168
304
  minAltitude?: number;
305
+ /** 高精度最小海拔 m */
169
306
  enhancedMinAltitude?: number;
307
+ /** 玩家得分(球类) */
170
308
  playerScore?: number;
309
+ /** 对手得分(球类) */
171
310
  opponentScore?: number;
311
+ /** 对手名称(球类) */
172
312
  opponentName?: string;
313
+ /** 划水次数(游泳) */
173
314
  strokeCount?: number[];
315
+ /** 区间计数 */
174
316
  zoneCount?: number[];
317
+ /** 最大球速 m/s */
175
318
  maxBallSpeed?: number;
319
+ /** 平均球速 m/s */
176
320
  avgBallSpeed?: number;
321
+ /** 平均垂直振幅 cm */
177
322
  avgVerticalOscillation?: number;
323
+ /** 平均触地时间占比 % */
178
324
  avgStanceTimePercent?: number;
325
+ /** 平均触地时间 ms */
179
326
  avgStanceTime?: number;
327
+ /** 平均小数步频 rpm */
180
328
  avgFractionalCadence?: number;
329
+ /** 最大小数步频 rpm */
181
330
  maxFractionalCadence?: number;
331
+ /** 总小数步/圈 */
182
332
  totalFractionalCycles?: number;
333
+ /** 平均总血红蛋白 g/dL */
183
334
  avgTotalHemoglobinConc?: number;
335
+ /** 最小总血红蛋白 g/dL */
184
336
  minTotalHemoglobinConc?: number;
337
+ /** 最大总血红蛋白 g/dL */
185
338
  maxTotalHemoglobinConc?: number;
339
+ /** 平均血红蛋白氧饱和度 % */
186
340
  avgSaturatedHemoglobinPercent?: number;
341
+ /** 最小氧饱和度 % */
187
342
  minSaturatedHemoglobinPercent?: number;
343
+ /** 最大氧饱和度 % */
188
344
  maxSaturatedHemoglobinPercent?: number;
345
+ /** 左腿力矩效率 % */
189
346
  avgLeftTorqueEffectiveness?: number;
347
+ /** 右腿力矩效率 % */
190
348
  avgRightTorqueEffectiveness?: number;
349
+ /** 左踩踏平滑度 % */
191
350
  avgLeftPedalSmoothness?: number;
351
+ /** 右踩踏平滑度 % */
192
352
  avgRightPedalSmoothness?: number;
353
+ /** 综合踩踏平滑度 % */
193
354
  avgCombinedPedalSmoothness?: number;
355
+ /** 运动配置文件名称 */
194
356
  sportProfileName?: string;
357
+ /** 运动配置索引 */
195
358
  sportIndex?: number;
359
+ /** 总站立时间 s(骑行) */
196
360
  timeStanding?: number;
361
+ /** 站立次数(骑行) */
197
362
  standCount?: number;
363
+ /** 平均左踏板中心偏移 mm */
198
364
  avgLeftPco?: number;
365
+ /** 平均右踏板中心偏移 mm */
199
366
  avgRightPco?: number;
367
+ /** 平均左发力相位 ° */
200
368
  avgLeftPowerPhase?: number[];
369
+ /** 平均左峰值相位 ° */
201
370
  avgLeftPowerPhasePeak?: number[];
371
+ /** 平均右发力相位 ° */
202
372
  avgRightPowerPhase?: number[];
373
+ /** 平均右峰值相位 ° */
203
374
  avgRightPowerPhasePeak?: number[];
375
+ /** 坐/站平均功率 W */
204
376
  avgPowerPosition?: number[];
377
+ /** 坐/站最大功率 W */
205
378
  maxPowerPosition?: number[];
379
+ /** 坐/站平均踏频 rpm */
206
380
  avgCadencePosition?: number[];
381
+ /** 坐/站最大踏频 rpm */
207
382
  maxCadencePosition?: number[];
383
+ /** 平均电机功率 W(eBike) */
208
384
  avgLevMotorPower?: number;
385
+ /** 最大电机功率 W(eBike) */
209
386
  maxLevMotorPower?: number;
387
+ /** 电池消耗 %(eBike) */
210
388
  levBatteryConsumption?: number;
389
+ /** 平均垂直率 % */
211
390
  avgVerticalRatio?: number;
391
+ /** 平均左右触地平衡 %(左 50-右 50) */
212
392
  avgStanceTimeBalance?: number;
393
+ /** 平均步长 cm */
213
394
  avgStepLength?: number;
395
+ /** 无氧训练效果 0–5 */
214
396
  totalAnaerobicTrainingEffect?: number;
397
+ /** 平均 VAM m/s */
215
398
  avgVam?: number;
399
+ /** 平均深度 m(潜水) */
216
400
  avgDepth?: number;
401
+ /** 最大深度 m(潜水) */
217
402
  maxDepth?: number;
403
+ /** 水面休息时间 s(潜水) */
218
404
  surfaceInterval?: number;
405
+ /** 起潜 CNS%(潜水) */
219
406
  startCns?: number;
407
+ /** 结束 CNS%(潜水) */
220
408
  endCns?: number;
409
+ /** 起潜 N2%(潜水) */
221
410
  startN2?: number;
411
+ /** 结束 N2%(潜水) */
222
412
  endN2?: number;
413
+ /** 平均呼吸率 breaths/min;255=无效 */
223
414
  avgRespirationRate?: number;
415
+ /** 最大呼吸率 breaths/min;255=无效 */
224
416
  maxRespirationRate?: number;
417
+ /** 最小呼吸率 breaths/min;255=无效 */
225
418
  minRespirationRate?: number;
419
+ /** 高精度平均呼吸率 breaths/min;65535=无效 */
226
420
  enhancedAvgRespirationRate?: number;
421
+ /** 高精度最大呼吸率 breaths/min;65535=无效 */
227
422
  enhancedMaxRespirationRate?: number;
423
+ /** 高精度最小呼吸率 breaths/min;65535=无效 */
228
424
  enhancedMinRespirationRate?: number;
425
+ /** 氧毒性单位 OTUs(潜水) */
229
426
  o2Toxicity?: number;
427
+ /** 潜水编号 */
230
428
  diveNumber?: number;
429
+ /** 训练负荷峰值 EPOC·min */
231
430
  trainingLoadPeak?: number;
431
+ /** 总地形崎岖度 kGrit */
232
432
  totalGrit?: number;
433
+ /** 总流畅度 Flow */
233
434
  totalFlow?: number;
435
+ /** 跳跃次数(山地车) */
234
436
  jumpCount?: number;
437
+ /** 平均崎岖度 kGrit */
235
438
  avgGrit?: number;
439
+ /** 平均流畅度 Flow */
236
440
  avgFlow?: number;
441
+ /** 主观感觉 0-100 */
237
442
  workoutFeel?: number;
443
+ /** 主观用力 0-10 */
238
444
  workoutRpe?: number;
445
+ /** 平均血氧饱和度 % */
239
446
  avgSpo2?: number;
447
+ /** 平均压力 % */
240
448
  avgStress?: number;
449
+ /** HRV SDNN ms */
241
450
  sdrrHrv?: number;
451
+ /** HRV RMSSD ms */
242
452
  rmssdHrv?: number;
453
+ /** 小数爬升 m */
243
454
  totalFractionalAscent?: number;
455
+ /** 小数下降 m */
244
456
  totalFractionalDescent?: number;
457
+ /** 平均核心体温 °C */
245
458
  avgCoreTemperature?: number;
459
+ /** 最低核心体温 °C */
246
460
  minCoreTemperature?: number;
461
+ /** 最高核心体温 °C */
247
462
  maxCoreTemperature?: number;
248
463
  lapMesgs?: LapMesgType[];
464
+ setMesgs?: SetMesgType[];
249
465
  }
466
+ /**
467
+ * FIT 文件 record 消息(单条采样点)TypeScript 定义
468
+ * 字段顺序与协议保持一致,全部驼峰命名 + 中文注释
469
+ * 单位已换算为常用展示值,无效值(255/65535)请在前端显示为“–”
470
+ */
250
471
  export interface RecordMesgType {
472
+ /** 采样时间戳(UTC) */
251
473
  timestamp?: Date;
474
+ /** 纬度 ° */
252
475
  positionLat?: number;
476
+ /** 经度 ° */
253
477
  positionLong?: number;
478
+ /** 海拔 m;enhancedAltitude 优先 */
254
479
  altitude?: number;
480
+ /** 高精度海拔 m */
255
481
  enhancedAltitude?: number;
482
+ /** 瞬时心率 bpm */
256
483
  heartRate?: number;
484
+ /** 步频/踏频 rpm(跑步=spm) */
257
485
  cadence?: number;
486
+ /** 累计距离 m */
258
487
  distance?: number;
488
+ /** 速度 m/s;enhancedSpeed 优先 */
259
489
  speed?: number;
490
+ /** 高精度速度 m/s */
260
491
  enhancedSpeed?: number;
492
+ /** 瞬时功率 W */
261
493
  power?: number;
494
+ /** 压缩速距(内部) */
262
495
  compressedSpeedDistance?: Uint8Array;
496
+ /** 坡度 % */
263
497
  grade?: number;
498
+ /** 阻力级别 0-100 */
264
499
  resistance?: number;
500
+ /** 偏离航线时间 s */
265
501
  timeFromCourse?: number;
502
+ /** 单圈长度 m */
266
503
  cycleLength?: number;
504
+ /** 环境温度 °C */
267
505
  temperature?: number;
506
+ /** 1 秒平均速度 m/s */
268
507
  speed1s?: number;
508
+ /** 单圈圈数 */
269
509
  cycles?: number;
510
+ /** 总圈数 */
270
511
  totalCycles?: number;
512
+ /** 压缩累计功率(内部) */
271
513
  compressedAccumulatedPower?: number;
514
+ /** 累计功率 W */
272
515
  accumulatedPower?: number;
516
+ /** 左右平衡 %(左 50-右 50) */
273
517
  leftRightBalance?: number;
518
+ /** GPS 精度 m */
274
519
  gpsAccuracy?: number;
520
+ /** 垂直速度 m/s(正=上升) */
275
521
  verticalSpeed?: number;
522
+ /** 瞬时热量 kcal */
276
523
  calories?: number;
524
+ /** 垂直振幅 cm(mm→cm) */
277
525
  verticalOscillation?: number;
526
+ /** 触地时间占比 % */
278
527
  stanceTimePercent?: number;
528
+ /** 触地时间 ms */
279
529
  stanceTime?: number;
530
+ /** 活动类型 running/cycling 等 */
280
531
  activityType?: string;
532
+ /** 左腿力矩效率 % */
281
533
  leftTorqueEffectiveness?: number;
534
+ /** 右腿力矩效率 % */
282
535
  rightTorqueEffectiveness?: number;
536
+ /** 左踩踏平滑度 % */
283
537
  leftPedalSmoothness?: number;
538
+ /** 右踩踏平滑度 % */
284
539
  rightPedalSmoothness?: number;
540
+ /** 综合踩踏平滑度 % */
285
541
  combinedPedalSmoothness?: number;
542
+ /** 128 分度时间(内部) */
286
543
  time128?: number;
544
+ /** 游泳划水类型 */
287
545
  strokeType?: string;
546
+ /** 训练区间 1-5 */
288
547
  zone?: number;
548
+ /** 球速 m/s */
289
549
  ballSpeed?: number;
550
+ /** 高分辨率踏频 rpm */
290
551
  cadence256?: number;
552
+ /** 小数步频/踏频 rpm(需加回 cadence) */
291
553
  fractionalCadence?: number;
554
+ /** 总血红蛋白浓度 g/dL */
292
555
  totalHemoglobinConc?: number;
556
+ /** 最小总血红蛋白 g/dL */
293
557
  totalHemoglobinConcMin?: number;
558
+ /** 最大总血红蛋白 g/dL */
294
559
  totalHemoglobinConcMax?: number;
560
+ /** 血红蛋白氧饱和度 % */
295
561
  saturatedHemoglobinPercent?: number;
562
+ /** 最小氧饱和度 % */
296
563
  saturatedHemoglobinPercentMin?: number;
564
+ /** 最大氧饱和度 % */
297
565
  saturatedHemoglobinPercentMax?: number;
566
+ /** 设备索引 */
298
567
  deviceIndex?: number;
568
+ /** 左踏板中心偏移 mm */
299
569
  leftPco?: number;
570
+ /** 右踏板中心偏移 mm */
300
571
  rightPco?: number;
572
+ /** 左发力相位 ° */
301
573
  leftPowerPhase?: number;
574
+ /** 左峰值相位 ° */
302
575
  leftPowerPhasePeak?: number;
576
+ /** 右发力相位 ° */
303
577
  rightPowerPhase?: number;
578
+ /** 右峰值相位 ° */
304
579
  rightPowerPhasePeak?: number;
580
+ /** 电池电量 % */
305
581
  batterySoc?: number;
582
+ /** 电机功率 W */
306
583
  motorPower?: number;
584
+ /** 垂直率 % */
307
585
  verticalRatio?: number;
586
+ /** 左右触地平衡 %(左 50-右 50) */
308
587
  stanceTimeBalance?: number;
588
+ /** 步长 cm(mm→cm) */
309
589
  stepLength?: number;
590
+ /** 16 分度步幅 m */
310
591
  cycleLength16?: number;
592
+ /** 绝对气压 Pa */
311
593
  absolutePressure?: number;
594
+ /** 潜水深度 m */
312
595
  depth?: number;
596
+ /** 下一减压停深度 m */
313
597
  nextStopDepth?: number;
598
+ /** 下一减压停时间 s */
314
599
  nextStopTime?: number;
600
+ /** 升水时间 s */
315
601
  timeToSurface?: number;
602
+ /** 免减压极限时间 s */
316
603
  ndlTime?: number;
604
+ /** 中枢神经系统毒性负荷 % */
317
605
  cnsLoad?: number;
606
+ /** 氮气负荷 % */
318
607
  n2Load?: number;
608
+ /** 呼吸率 breaths/min;255=无效 */
319
609
  respirationRate?: number;
610
+ /** 高精度呼吸率 breaths/min;65535=无效 */
320
611
  enhancedRespirationRate?: number;
612
+ /** 地形崎岖度(0-1) */
321
613
  grit?: number;
614
+ /** 流畅度(0-1) */
322
615
  flow?: number;
616
+ /** 实时压力指数 */
323
617
  currentStress?: number;
618
+ /** 预估续航 km */
324
619
  ebikeTravelRange?: number;
620
+ /** 电池电量 % */
325
621
  ebikeBatteryLevel?: number;
622
+ /** 助力模式 */
326
623
  ebikeAssistMode?: number;
624
+ /** 助力等级 % */
327
625
  ebikeAssistLevelPercent?: number;
626
+ /** 剩余气体时间 s */
328
627
  airTimeRemaining?: number;
628
+ /** 水面耗气率 bar/min */
329
629
  pressureSac?: number;
630
+ /** 体积耗气率 L/min */
330
631
  volumeSac?: number;
632
+ /** 每分通气量 L/min */
331
633
  rmv?: number;
634
+ /** 上升速率 m/s */
332
635
  ascentRate?: number;
636
+ /** 氧分压 % */
333
637
  po2?: number;
638
+ /** 核心体温 °C(×100→°C) */
334
639
  coreTemperature?: number;
335
640
  }
641
+ /**
642
+ * FIT 文件 lengthMesg 消息
643
+ * 字段顺序与协议保持一致,全部驼峰命名 + 中文注释
644
+ */
336
645
  export interface LengthMesgType {
337
646
  timestamp: Date;
338
647
  messageIndex: number;
648
+ /**
649
+ * 事件类型,通常为 length,表示记录的是泳池长度相关数据
650
+ */
339
651
  event?: string;
652
+ /**
653
+ * 事件结束类型,如 stop 表示该趟游泳已经结束
654
+ */
340
655
  eventType?: string;
656
+ /**
657
+ * 该趟游泳的开始时间。
658
+ */
341
659
  startTime?: Date;
660
+ /**
661
+ * 从开始到结束的总经过时间(秒)。
662
+ */
342
663
  totalElapsedTime?: number;
664
+ /**
665
+ * 计时器记录的总时间(秒),通常与 totalElapsedTime 相同
666
+ */
343
667
  totalTimerTime?: number;
668
+ /**
669
+ * 完成该趟游泳的总划水次数
670
+ */
344
671
  totalStrokes?: number;
672
+ /**
673
+ * 平均速度(米/秒)
674
+ */
345
675
  avgSpeed?: number;
676
+ /**
677
+ * 游泳姿势,如蛙泳(breaststroke)、自由泳(freestyle)等
678
+ */
346
679
  swimStroke?: "breaststroke" | "freestyle" | "backstroke" | "butterfly" | "drill" | "mixed" | "im" | "invalid";
680
+ /**
681
+ * 平均划水频率(次/分钟)
682
+ */
347
683
  avgSwimmingCadence?: number;
684
+ /**
685
+ * 事件组,用于将相关事件分组
686
+ */
348
687
  eventGroup?: number;
688
+ /**
689
+ * 该趟游泳消耗的总卡路里
690
+ */
349
691
  totalCalories?: number;
692
+ /**
693
+ * 长度类型,如 active 表示活动状态,idle 表示空闲状态
694
+ */
350
695
  lengthType?: "active" | "idle";
696
+ /**
697
+ * 玩家得分,通常用于比赛或训练中的计分
698
+ */
351
699
  playerScore?: number;
700
+ /**
701
+ * 对手得分,通常用于比赛或训练中的计分
702
+ */
352
703
  opponentScore?: number;
704
+ /**
705
+ * 划水次数,与 totalStrokes 类似,但可能更具体
706
+ */
353
707
  strokeCount?: number;
708
+ /**
709
+ * 在特定训练强度区间(如心率区间)中的计数
710
+ */
354
711
  zoneCount?: number;
712
+ /**
713
+ * 更精确的平均呼吸频率(次/分钟)
714
+ */
355
715
  enhancedAvgRespirationRate?: number;
716
+ /**
717
+ * 更精确的最大呼吸频率(次/分钟)
718
+ */
356
719
  enHancedMaxRespirationRate?: number;
720
+ /**
721
+ * 平均呼吸频率(次/分钟)
722
+ */
357
723
  avgRespirationRate?: number;
724
+ /**
725
+ * 最大呼吸频率(次/分钟)
726
+ */
358
727
  maxRespirationRate?: number;
359
728
  }
729
+ /**
730
+ * FIT 文件 lap 消息(单圈数据)TypeScript 定义
731
+ * 字段顺序与协议保持一致,全部驼峰命名 + 中文注释
732
+ * 单位已换算为常用展示值,无效值(255/65535)请在前端显示为“–”
733
+ */
360
734
  export interface LapMesgType {
735
+ /** 圈索引(0 起) */
361
736
  messageIndex: number;
737
+ /** 圈结束时间戳(UTC) */
362
738
  timestamp?: Date;
739
+ /** 事件类型 – lap */
363
740
  event?: string;
741
+ /** 事件子类型 – stop 等 */
364
742
  eventType?: string;
743
+ /** 圈开始时间戳(UTC) */
365
744
  startTime?: Date;
745
+ /** 起点纬度 ° */
366
746
  startPositionLat?: number;
747
+ /** 起点经度 ° */
367
748
  startPositionLong?: number;
749
+ /** 终点纬度 ° */
368
750
  endPositionLat?: number;
751
+ /** 终点经度 ° */
369
752
  endPositionLong?: number;
753
+ /** 圈耗时(含暂停)s */
370
754
  totalElapsedTime?: number;
755
+ /** 圈计时(不含暂停)s */
371
756
  totalTimerTime?: number;
757
+ /** 圈距离 m */
372
758
  totalDistance?: number;
759
+ /** 圈步/踏/划次数(见子字段) */
373
760
  totalCycles?: number;
761
+ /** 圈步数(running) */
374
762
  totalStrides?: number;
763
+ /** 圈划水数(swimming) */
375
764
  totalStrokes?: number;
765
+ /** 圈热量 kcal */
376
766
  totalCalories?: number;
767
+ /** 圈脂肪热量 kcal */
377
768
  totalFatCalories?: number;
769
+ /** 圈平均速度 m/s;enhancedAvgSpeed 优先 */
378
770
  avgSpeed?: number;
771
+ /** 高精度圈平均速度 m/s */
379
772
  enhancedAvgSpeed?: number;
773
+ /** 圈最大速度 m/s;enhancedMaxSpeed 优先 */
380
774
  maxSpeed?: number;
775
+ /** 高精度圈最大速度 m/s */
381
776
  enhancedMaxSpeed?: number;
777
+ /** 圈平均心率 bpm */
382
778
  avgHeartRate?: number;
779
+ /** 圈最大心率 bpm */
383
780
  maxHeartRate?: number;
781
+ /** 圈平均踏频/步频 rpm;子字段 avgRunningCadence */
384
782
  avgCadence?: number;
783
+ /** 圈平均步频 spm(running) */
385
784
  avgRunningCadence?: number;
785
+ /** 圈最大踏频/步频 rpm;子字段 maxRunningCadence */
386
786
  maxCadence?: number;
787
+ /** 圈最大步频 spm(running) */
387
788
  maxRunningCadence?: number;
789
+ /** 圈平均功率 W */
388
790
  avgPower?: number;
791
+ /** 圈最大功率 W */
389
792
  maxPower?: number;
793
+ /** 圈爬升 m */
390
794
  totalAscent?: number;
795
+ /** 圈下降 m */
391
796
  totalDescent?: number;
797
+ /** 强度区间(Active/Rest) */
392
798
  intensity?: string;
799
+ /** 圈触发方式 time/distance/position 等 */
393
800
  lapTrigger?: string;
801
+ /** 运动类型(与 session 相同) */
394
802
  sport?: string;
803
+ /** 事件组(通常 0) */
395
804
  eventGroup?: number;
805
+ /** 游泳趟数 */
396
806
  numLengths?: number;
807
+ /** 圈标准化功率 W */
397
808
  normalizedPower?: number;
809
+ /** 圈左右平衡 %(左 50-右 50) */
398
810
  leftRightBalance?: number;
811
+ /** 第一趟索引(游泳) */
399
812
  firstLengthIndex?: number;
813
+ /** 平均每趟划水距离 m(游泳) */
400
814
  avgStrokeDistance?: number;
815
+ /** 游泳划水类型 */
401
816
  swimStroke?: string;
817
+ /** 子运动类型 */
402
818
  subSport?: string;
819
+ /** 有效趟数(游泳) */
403
820
  numActiveLengths?: number;
821
+ /** 圈做功 J */
404
822
  totalWork?: number;
823
+ /** 圈平均海拔 m;enhancedAvgAltitude 优先 */
405
824
  avgAltitude?: number;
825
+ /** 高精度圈平均海拔 m */
406
826
  enhancedAvgAltitude?: number;
827
+ /** 圈最大海拔 m;enhancedMaxAltitude 优先 */
407
828
  maxAltitude?: number;
829
+ /** 高精度圈最大海拔 m */
408
830
  enhancedMaxAltitude?: number;
831
+ /** GPS 精度 m */
409
832
  gpsAccuracy?: number;
833
+ /** 圈平均坡度 % */
410
834
  avgGrade?: number;
835
+ /** 圈平均正坡度 % */
411
836
  avgPosGrade?: number;
837
+ /** 圈平均负坡度 % */
412
838
  avgNegGrade?: number;
839
+ /** 圈最大正坡度 % */
413
840
  maxPosGrade?: number;
841
+ /** 圈最大负坡度 % */
414
842
  maxNegGrade?: number;
843
+ /** 圈平均温度 °C */
415
844
  avgTemperature?: number;
845
+ /** 圈最高温度 °C */
416
846
  maxTemperature?: number;
847
+ /** 圈总移动时间 s */
417
848
  totalMovingTime?: number;
849
+ /** 圈平均上升速度 m/s */
418
850
  avgPosVerticalSpeed?: number;
851
+ /** 圈平均下降速度 m/s */
419
852
  avgNegVerticalSpeed?: number;
853
+ /** 圈最大上升速度 m/s */
420
854
  maxPosVerticalSpeed?: number;
855
+ /** 圈最大下降速度 m/s */
421
856
  maxNegVerticalSpeed?: number;
857
+ /** 圈最小心率 bpm */
422
858
  minHeartRate?: number;
859
+ /** 各心率区间停留时间 s 数组 */
423
860
  timeInHrZone?: number[];
861
+ /** 各速度区间停留时间 s 数组 */
424
862
  timeInSpeedZone?: number[];
863
+ /** 各踏频区间停留时间 s 数组 */
425
864
  timeInCadenceZone?: number[];
865
+ /** 各功率区间停留时间 s 数组 */
426
866
  timeInPowerZone?: number[];
867
+ /** 重复次数(间歇) */
427
868
  repetitionNum?: number;
869
+ /** 圈最小海拔 m;enhancedMinAltitude 优先 */
428
870
  minAltitude?: number;
871
+ /** 高精度圈最小海拔 m */
429
872
  enhancedMinAltitude?: number;
873
+ /** 训练课索引(结构化训练) */
430
874
  wktStepIndex?: number;
875
+ /** 对手得分(球类) */
431
876
  opponentScore?: number;
877
+ /** 每趟划水次数(游泳) */
432
878
  strokeCount?: number[];
879
+ /** 各区间的次数 */
433
880
  zoneCount?: number[];
881
+ /** 平均垂直振幅 cm */
434
882
  avgVerticalOscillation?: number;
883
+ /** 平均触地时间占比 % */
435
884
  avgStanceTimePercent?: number;
885
+ /** 平均触地时间 ms */
436
886
  avgStanceTime?: number;
887
+ /** 平均小数步频 rpm */
437
888
  avgFractionalCadence?: number;
889
+ /** 最大小数步频 rpm */
438
890
  maxFractionalCadence?: number;
891
+ /** 圈小数步/踏次数 */
439
892
  totalFractionalCycles?: number;
893
+ /** 玩家得分(球类) */
440
894
  playerScore?: number;
895
+ /** 平均总血红蛋白 g/dL */
441
896
  avgTotalHemoglobinConc?: number;
897
+ /** 最小总血红蛋白 g/dL */
442
898
  minTotalHemoglobinConc?: number;
899
+ /** 最大总血红蛋白 g/dL */
443
900
  maxTotalHemoglobinConc?: number;
901
+ /** 平均血红蛋白氧饱和度 % */
444
902
  avgSaturatedHemoglobinPercent?: number;
903
+ /** 最小氧饱和度 % */
445
904
  minSaturatedHemoglobinPercent?: number;
905
+ /** 最大氧饱和度 % */
446
906
  maxSaturatedHemoglobinPercent?: number;
907
+ /** 左腿力矩效率 % */
447
908
  avgLeftTorqueEffectiveness?: number;
909
+ /** 右腿力矩效率 % */
448
910
  avgRightTorqueEffectiveness?: number;
911
+ /** 左踩踏平滑度 % */
449
912
  avgLeftPedalSmoothness?: number;
913
+ /** 右踩踏平滑度 % */
450
914
  avgRightPedalSmoothness?: number;
915
+ /** 综合踩踏平滑度 % */
451
916
  avgCombinedPedalSmoothness?: number;
917
+ /** 圈站立时间 s(骑行) */
452
918
  timeStanding?: number;
919
+ /** 圈站立次数(骑行) */
453
920
  standCount?: number;
921
+ /** 平均左踏板中心偏移 mm */
454
922
  avgLeftPco?: number;
923
+ /** 平均右踏板中心偏移 mm */
455
924
  avgRightPco?: number;
925
+ /** 平均左发力相位 ° */
456
926
  avgLeftPowerPhase?: number[];
927
+ /** 平均左峰值相位 ° */
457
928
  avgLeftPowerPhasePeak?: number[];
929
+ /** 平均右发力相位 ° */
458
930
  avgRightPowerPhase?: number[];
931
+ /** 平均右峰值相位 ° */
459
932
  avgRightPowerPhasePeak?: number[];
933
+ /** 坐/站平均功率 W */
460
934
  avgPowerPosition?: number[];
935
+ /** 坐/站最大功率 W */
461
936
  maxPowerPosition?: number[];
937
+ /** 坐/站平均踏频 rpm */
462
938
  avgCadencePosition?: number[];
939
+ /** 坐/站最大踏频 rpm */
463
940
  maxCadencePosition?: number[];
941
+ /** 平均电机功率 W(eBike) */
464
942
  avgLevMotorPower?: number;
943
+ /** 最大电机功率 W(eBike) */
465
944
  maxLevMotorPower?: number;
945
+ /** 电池消耗 %(eBike) */
466
946
  levBatteryConsumption?: number;
947
+ /** 平均垂直率 % */
467
948
  avgVerticalRatio?: number;
949
+ /** 平均左右触地平衡 % */
468
950
  avgStanceTimeBalance?: number;
951
+ /** 平均步长 cm */
469
952
  avgStepLength?: number;
953
+ /** 平均 VAM m/s */
470
954
  avgVam?: number;
955
+ /** 平均深度 m(潜水) */
471
956
  avgDepth?: number;
957
+ /** 最大深度 m(潜水) */
472
958
  maxDepth?: number;
959
+ /** 最低温度 °C */
473
960
  minTemperature?: number;
961
+ /** 高精度平均呼吸率 breaths/min;65535=无效 */
474
962
  enhancedAvgRespirationRate?: number;
963
+ /** 高精度最大呼吸率 breaths/min;65535=无效 */
475
964
  enhancedMaxRespirationRate?: number;
965
+ /** 平均呼吸率 breaths/min;255=无效 */
476
966
  avgRespirationRate?: number;
967
+ /** 最大呼吸率 breaths/min;255=无效 */
477
968
  maxRespirationRate?: number;
969
+ /** 总地形崎岖度 kGrit */
478
970
  totalGrit?: number;
971
+ /** 总流畅度 Flow */
479
972
  totalFlow?: number;
973
+ /** 跳跃次数(山地车) */
480
974
  jumpCount?: number;
975
+ /** 平均崎岖度 kGrit */
481
976
  avgGrit?: number;
977
+ /** 平均流畅度 Flow */
482
978
  avgFlow?: number;
979
+ /** 小数爬升 m */
483
980
  totalFractionalAscent?: number;
981
+ /** 小数下降 m */
484
982
  totalFractionalDescent?: number;
983
+ /** 平均核心体温 °C */
485
984
  avgCoreTemperature?: number;
985
+ /** 最低核心体温 °C */
486
986
  minCoreTemperature?: number;
987
+ /** 最高核心体温 °C */
487
988
  maxCoreTemperature?: number;
488
989
  recordMesgs?: RecordMesgType[];
489
990
  lengthMesgs?: LengthMesgType[];
@@ -497,15 +998,23 @@ export interface ActivityMesgType {
497
998
  eventType?: string;
498
999
  [key: string]: number | string | undefined | any;
499
1000
  }
1001
+ /**
1002
+ * FIT message processing context
1003
+ */
500
1004
  export interface FITContext extends IProcessingContext {
1005
+ /** Raw binary data */
501
1006
  rawData?: Buffer;
1007
+ /** Raw messages parsed by FIT SDK */
502
1008
  rawMessages?: FITDecoderMesgs;
1009
+ /** Final result */
503
1010
  result?: FITFileType;
1011
+ /** FIT file header information */
504
1012
  fileHeader?: {
505
1013
  type?: string;
506
1014
  manufacturer?: string;
507
1015
  product?: number;
508
1016
  };
1017
+ /** FIT specific performance statistics */
509
1018
  performance: {
510
1019
  startTime: number;
511
1020
  parseTime?: number;