fit4ruby 3.5.0 → 3.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/fit4ruby.gemspec +1 -1
- data/lib/fit4ruby/DeviceInfo.rb +19 -0
- data/lib/fit4ruby/FieldDescription.rb +7 -1
- data/lib/fit4ruby/FitDefinitionField.rb +2 -2
- data/lib/fit4ruby/FitMessageRecord.rb +3 -3
- data/lib/fit4ruby/GlobalFitDictionaries.rb +276 -22
- data/lib/fit4ruby/GlobalFitMessage.rb +5 -0
- data/lib/fit4ruby/GlobalFitMessages.rb +81 -1
- data/lib/fit4ruby/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6c0eeaa643f6448d85589f5dd3eba27f05b5b98c9612df717c6105941d37c04
|
4
|
+
data.tar.gz: af7fb428ac6490e2e0ffa239d3f6135e7a66362e35a630f1b83020fed43a9a50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 251d1d4bf916e08744f3609bf4ee9eec766094b937dc9094fe2f1215d7971ad4a7ae94b2d047370d62d79bf8e9b3e250cb54fb08da036e0444ef37685cbe7736
|
7
|
+
data.tar.gz: 9c61be05a87a745b3509458ac56f4798c1afb1065d9f1d9808d7fd2e860a400b224e901a57f97263912d15b9199b5f14e9a9c7fab9ee7737f1872ed6dd78f6f5
|
data/Gemfile.lock
CHANGED
data/fit4ruby.gemspec
CHANGED
@@ -26,7 +26,7 @@ EOT
|
|
26
26
|
|
27
27
|
spec.add_dependency('bindata', '=2.3.0')
|
28
28
|
spec.add_development_dependency('yard', '~>0.9.20')
|
29
|
-
spec.add_development_dependency('rake', '~>0.
|
29
|
+
spec.add_development_dependency('rake', '~>12.0.0')
|
30
30
|
spec.add_development_dependency('bundler', '>=1.6.4')
|
31
31
|
spec.add_development_dependency('rspec', '>=3.8')
|
32
32
|
spec.add_development_dependency('pry', '>=0.12')
|
data/lib/fit4ruby/DeviceInfo.rb
CHANGED
@@ -32,6 +32,25 @@ module Fit4Ruby
|
|
32
32
|
@timestamp <=> fdr.timestamp
|
33
33
|
end
|
34
34
|
|
35
|
+
def numeric_manufacturer
|
36
|
+
if @manufacturer.is_a?(String)
|
37
|
+
GlobalFitDictionaries['manufacturer'].value_by_name(@manufacturer)
|
38
|
+
else
|
39
|
+
@manufacturer
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def numeric_product
|
44
|
+
if @garmin_product && @garmin_product.is_a?(String)
|
45
|
+
return GlobalFitDictionaries['garmin_product'].
|
46
|
+
value_by_name(@garmin_product)
|
47
|
+
elsif @product.is_a?(String)
|
48
|
+
return GlobalFitDictionaries['product'].value_by_name(@product)
|
49
|
+
else
|
50
|
+
return @product
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
35
54
|
def check(index)
|
36
55
|
unless @device_index
|
37
56
|
Log.fatal 'device info record must have a device_index'
|
@@ -47,6 +47,12 @@ module Fit4Ruby
|
|
47
47
|
Log.error "fit_base_type_id #{@fit_base_type_id} is too large"
|
48
48
|
return
|
49
49
|
end
|
50
|
+
|
51
|
+
name = "_#{@developer_data_index}_#{@field_name}"
|
52
|
+
# A fit file may include multiple definitions of the same field. We
|
53
|
+
# ignore all subsequent definitions.
|
54
|
+
return if msg.has_field?(name)
|
55
|
+
|
50
56
|
options = {}
|
51
57
|
options[:scale] = @scale if @scale
|
52
58
|
options[:offset] = @offset if @offset
|
@@ -54,7 +60,7 @@ module Fit4Ruby
|
|
54
60
|
options[:unit] = @units
|
55
61
|
msg.field(@field_definition_number,
|
56
62
|
FIT_TYPE_DEFS[@fit_base_type_id & 0x7F][1],
|
57
|
-
|
63
|
+
name, options)
|
58
64
|
end
|
59
65
|
|
60
66
|
end
|
@@ -54,8 +54,8 @@ module Fit4Ruby
|
|
54
54
|
else
|
55
55
|
@name = "field#{field_definition_number.snapshot}"
|
56
56
|
@type = nil
|
57
|
-
Log.
|
58
|
-
|
57
|
+
Log.debug { "Unknown field number #{field_definition_number} " +
|
58
|
+
"in global message #{@global_message_number}" }
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -36,7 +36,7 @@ module Fit4Ruby
|
|
36
36
|
@name = @gfm.name
|
37
37
|
else
|
38
38
|
@name = "message#{@global_message_number}"
|
39
|
-
Log.
|
39
|
+
Log.debug { "Unknown global message number #{@global_message_number}" }
|
40
40
|
end
|
41
41
|
@message_record = produce(definition)
|
42
42
|
end
|
@@ -59,8 +59,8 @@ module Fit4Ruby
|
|
59
59
|
end
|
60
60
|
obj = entity.new_fit_data_record(@name)
|
61
61
|
|
62
|
-
# It's important to ensure that alternative fields processed after
|
63
|
-
# regular fields so that the decision field has already been
|
62
|
+
# It's important to ensure that alternative fields are processed after
|
63
|
+
# the regular fields so that the decision field has already been set.
|
64
64
|
sorted_fields = @definition.data_fields.sort do |f1, f2|
|
65
65
|
f1alt = is_alt_field?(f1)
|
66
66
|
f2alt = is_alt_field?(f2)
|
@@ -312,52 +312,306 @@ module Fit4Ruby
|
|
312
312
|
entry 144, 'uint64z'
|
313
313
|
|
314
314
|
dict 'garmin_product'
|
315
|
+
entry 1, 'hrm1'
|
316
|
+
entry 2, 'axh01'
|
317
|
+
entry 3, 'axb01'
|
318
|
+
entry 4, 'axb02'
|
319
|
+
entry 5, 'hrm2ss'
|
320
|
+
entry 6, 'dsi_alf02'
|
321
|
+
entry 7, 'hrm3ss'
|
315
322
|
entry 8, 'hrm_run_single_byte_product_id'
|
316
323
|
entry 9, 'bsm'
|
317
324
|
entry 10, 'bcm'
|
325
|
+
entry 11, 'axs01'
|
326
|
+
entry 12, 'hrm_tri_single_byte_product_id'
|
327
|
+
entry 13, 'hrm4_run_single_byte_product_id'
|
328
|
+
entry 14, 'fr225_single_byte_product_id'
|
329
|
+
entry 473, 'fr301_china'
|
330
|
+
entry 474, 'fr301_japan'
|
331
|
+
entry 475, 'fr301_korea'
|
332
|
+
entry 494, 'fr301_taiwan'
|
333
|
+
entry 717, 'fr405'
|
334
|
+
entry 782, 'fr50'
|
335
|
+
entry 987, 'fr405_japan'
|
336
|
+
entry 988, 'fr60'
|
337
|
+
entry 1011, 'dsi_alf01'
|
338
|
+
entry 1018, 'fr310xt'
|
339
|
+
entry 1036, 'edge500'
|
340
|
+
entry 1124, 'fr110'
|
341
|
+
entry 1169, 'edge800'
|
342
|
+
entry 1199, 'edge500_taiwan'
|
343
|
+
entry 1213, 'edge500_japan'
|
344
|
+
entry 1253, 'chirp'
|
345
|
+
entry 1274, 'fr110_japan'
|
346
|
+
entry 1325, 'edge200'
|
347
|
+
entry 1328, 'fr910xt'
|
348
|
+
entry 1333, 'edge800_taiwan'
|
349
|
+
entry 1334, 'edge800_japan'
|
350
|
+
entry 1341, 'alf04'
|
351
|
+
entry 1345, 'fr610'
|
352
|
+
entry 1360, 'fr210_japan'
|
353
|
+
entry 1380, 'vector_ss'
|
354
|
+
entry 1381, 'vector_cp'
|
355
|
+
entry 1386, 'edge800_china'
|
356
|
+
entry 1387, 'edge500_china'
|
357
|
+
entry 1405, 'approach_g10'
|
358
|
+
entry 1410, 'fr610_japan'
|
359
|
+
entry 1422, 'edge500_korea'
|
360
|
+
entry 1436, 'fr70'
|
361
|
+
entry 1446, 'fr310xt_4t'
|
362
|
+
entry 1461, 'amx'
|
363
|
+
entry 1482, 'fr10'
|
364
|
+
entry 1497, 'edge800_korea'
|
365
|
+
entry 1499, 'swim'
|
366
|
+
entry 1537, 'fr910xt_china'
|
318
367
|
entry 1551, 'fenix'
|
368
|
+
entry 1555, 'edge200_taiwan'
|
369
|
+
entry 1561, 'edge510'
|
370
|
+
entry 1567, 'edge810'
|
371
|
+
entry 1570, 'tempe'
|
372
|
+
entry 1600, 'fr910xt_japan'
|
319
373
|
# The Fenix3 is rumored to have a Mediatek MT3333 GPS chipset. Not sure if
|
320
374
|
# that would be a beter name.
|
321
375
|
entry 1620, 'fenix3_gps' # Just a guess
|
322
376
|
entry 1621, 'fenix5_gps' # Just a guess
|
323
377
|
entry 1623, 'fr620'
|
324
378
|
entry 1632, 'fr220'
|
379
|
+
entry 1664, 'fr910xt_korea'
|
380
|
+
entry 1688, 'fr10_japan'
|
325
381
|
# The FR620 is rumored to have a MediaTek MT3339 GPS chipset while the
|
326
382
|
# FR920XT is rumored to have a MT3333. Not sure why they have the same ID
|
327
383
|
# in the FIT file for the GPS device.
|
328
384
|
entry 1689, 'fr620_fr920xt_gps' # Just a guess
|
385
|
+
entry 1721, 'edge810_japan'
|
386
|
+
entry 1735, 'virb_elite'
|
387
|
+
entry 1736, 'edge_touring'
|
388
|
+
entry 1742, 'edge510_japan'
|
329
389
|
entry 1743, 'hrm_tri'
|
330
390
|
entry 1752, 'hrm_run'
|
331
391
|
entry 1765, 'fr920xt'
|
392
|
+
entry 1821, 'edge510_asia'
|
393
|
+
entry 1822, 'edge810_china'
|
394
|
+
entry 1823, 'edge810_taiwan'
|
395
|
+
entry 1836, 'edge1000'
|
396
|
+
entry 1837, 'vivo_fit'
|
397
|
+
entry 1853, 'virb_remote'
|
398
|
+
entry 1885, 'vivo_ki'
|
399
|
+
entry 1903, 'fr15'
|
400
|
+
entry 1907, 'vivo_active'
|
401
|
+
entry 1918, 'edge510_korea'
|
332
402
|
entry 1928, 'fr620_japan'
|
333
403
|
entry 1929, 'fr620_china'
|
334
404
|
entry 1930, 'fr220_japan'
|
335
405
|
entry 1931, 'fr220_china'
|
406
|
+
entry 1936, 'approach_s6'
|
407
|
+
entry 1956, 'vivo_smart'
|
336
408
|
entry 1967, 'fenix2'
|
337
409
|
entry 1988, 'epix'
|
338
410
|
entry 2050, 'fenix3'
|
411
|
+
entry 2052, 'edge1000_taiwan'
|
412
|
+
entry 2053, 'edge1000_japan'
|
413
|
+
entry 2061, 'fr15_japan'
|
414
|
+
entry 2067, 'edge520'
|
415
|
+
entry 2070, 'edge1000_china'
|
339
416
|
entry 2072, 'fr620_russia'
|
340
417
|
entry 2073, 'fr220_russia'
|
418
|
+
entry 2079, 'vector_s'
|
419
|
+
entry 2100, 'edge1000_korea'
|
341
420
|
entry 2130, 'fr920xt_taiwan'
|
342
421
|
entry 2131, 'fr920xt_china'
|
343
422
|
entry 2132, 'fr920xt_japan'
|
423
|
+
entry 2134, 'virbx'
|
424
|
+
entry 2135, 'vivo_smart_apac'
|
425
|
+
entry 2140, 'etrex_touch'
|
426
|
+
entry 2147, 'edge25'
|
427
|
+
entry 2148, 'fr25'
|
428
|
+
entry 2150, 'vivo_fit2'
|
429
|
+
entry 2153, 'fr225'
|
430
|
+
entry 2156, 'fr630'
|
431
|
+
entry 2157, 'fr230'
|
432
|
+
entry 2158, 'fr735xt'
|
433
|
+
entry 2160, 'vivo_active_apac'
|
434
|
+
entry 2161, 'vector_2'
|
435
|
+
entry 2162, 'vector_2s'
|
436
|
+
entry 2172, 'virbxe'
|
344
437
|
entry 2173, 'fr620_taiwan'
|
438
|
+
entry 2174, 'fr220_taiwan'
|
439
|
+
entry 2175, 'truswing'
|
345
440
|
entry 2188, 'fenix3_china'
|
346
441
|
entry 2189, 'fenix3_twn'
|
442
|
+
entry 2192, 'varia_headlight'
|
443
|
+
entry 2193, 'varia_taillight_old'
|
444
|
+
entry 2204, 'edge_explore_1000'
|
445
|
+
entry 2219, 'fr225_asia'
|
446
|
+
entry 2225, 'varia_radar_taillight'
|
447
|
+
entry 2226, 'varia_radar_display'
|
448
|
+
entry 2238, 'edge20'
|
449
|
+
entry 2260, 'edge520_asia'
|
450
|
+
entry 2261, 'edge520_japan'
|
451
|
+
entry 2262, 'd2_bravo'
|
452
|
+
entry 2266, 'approach_s20'
|
453
|
+
entry 2271, 'vivo_smart2'
|
454
|
+
entry 2274, 'edge1000_thai'
|
455
|
+
entry 2276, 'varia_remote'
|
456
|
+
entry 2288, 'edge25_asia'
|
457
|
+
entry 2289, 'edge25_jpn'
|
458
|
+
entry 2290, 'edge20_asia'
|
459
|
+
entry 2292, 'approach_x40'
|
460
|
+
entry 2293, 'fenix3_japan'
|
461
|
+
entry 2294, 'vivo_smart_emea'
|
462
|
+
entry 2310, 'fr630_asia'
|
463
|
+
entry 2311, 'fr630_jpn'
|
464
|
+
entry 2313, 'fr230_jpn'
|
347
465
|
entry 2327, 'hrm4_run'
|
466
|
+
entry 2332, 'epix_japan'
|
467
|
+
entry 2337, 'vivo_active_hr'
|
468
|
+
entry 2347, 'vivo_smart_gps_hr'
|
469
|
+
entry 2348, 'vivo_smart_hr'
|
470
|
+
entry 2361, 'vivo_smart_hr_asia'
|
471
|
+
entry 2362, 'vivo_smart_gps_hr_asia'
|
472
|
+
entry 2368, 'vivo_move'
|
473
|
+
entry 2379, 'varia_taillight'
|
474
|
+
entry 2397, 'fr235_japan'
|
475
|
+
entry 2398, 'varia_vision'
|
476
|
+
entry 2406, 'vivo_fit3'
|
477
|
+
entry 2407, 'fenix3_korea'
|
478
|
+
entry 2408, 'fenix3_sea'
|
348
479
|
entry 2413, 'fenix3_hr'
|
480
|
+
entry 2417, 'virb_ultra_30'
|
481
|
+
entry 2429, 'index_smart_scale'
|
349
482
|
entry 2431, 'fr235'
|
350
483
|
entry 2432, 'fenix3_chronos'
|
484
|
+
entry 2441, 'oregon7xx'
|
485
|
+
entry 2444, 'rino7xx'
|
486
|
+
entry 2457, 'epix_korea'
|
487
|
+
entry 2473, 'fenix3_hr_chn'
|
488
|
+
entry 2474, 'fenix3_hr_twn'
|
489
|
+
entry 2475, 'fenix3_hr_jpn'
|
490
|
+
entry 2476, 'fenix3_hr_sea'
|
491
|
+
entry 2477, 'fenix3_hr_kor'
|
492
|
+
entry 2496, 'nautix'
|
493
|
+
entry 2497, 'vivo_active_hr_apac'
|
494
|
+
entry 2512, 'oregon7xx_ww'
|
495
|
+
entry 2530, 'edge_820'
|
496
|
+
entry 2531, 'edge_explore_820'
|
497
|
+
entry 2533, 'fr735xt_apac'
|
498
|
+
entry 2534, 'fr735xt_japan'
|
351
499
|
entry 2544, 'fenix5s'
|
352
|
-
entry
|
500
|
+
entry 2547, 'd2_bravo_titanium'
|
501
|
+
entry 2567, 'varia_ut800'
|
353
502
|
entry 2593, 'running_dynamics_pod'
|
503
|
+
entry 2599, 'edge_820_china'
|
504
|
+
entry 2600, 'edge_820_japan'
|
505
|
+
entry 2604, 'fenix5x'
|
506
|
+
entry 2606, 'vivo_fit_jr'
|
507
|
+
entry 2622, 'vivo_smart3'
|
508
|
+
entry 2623, 'vivo_sport'
|
509
|
+
entry 2628, 'edge_820_taiwan'
|
510
|
+
entry 2629, 'edge_820_korea'
|
511
|
+
entry 2630, 'edge_820_sea'
|
512
|
+
entry 2650, 'fr35_hebrew'
|
513
|
+
entry 2656, 'approach_s60'
|
514
|
+
entry 2667, 'fr35_apac'
|
515
|
+
entry 2668, 'fr35_japan'
|
516
|
+
entry 2675, 'fenix3_chronos_asia'
|
517
|
+
entry 2687, 'virb_360'
|
354
518
|
entry 2691, 'fr935'
|
355
519
|
entry 2697, 'fenix5'
|
520
|
+
entry 2700, 'vivoactive3'
|
521
|
+
entry 2733, 'fr235_china_nfc'
|
522
|
+
entry 2769, 'foretrex_601_701'
|
523
|
+
entry 2772, 'vivo_move_hr'
|
524
|
+
entry 2713, 'edge_1030'
|
525
|
+
entry 2796, 'fenix5_asia'
|
526
|
+
entry 2797, 'fenix5s_asia'
|
527
|
+
entry 2798, 'fenix5x_asia'
|
528
|
+
entry 2806, 'approach_z80'
|
529
|
+
entry 2814, 'fr35_korea'
|
530
|
+
entry 2819, 'd2charlie'
|
531
|
+
entry 2831, 'vivo_smart3_apac'
|
532
|
+
entry 2832, 'vivo_sport_apac'
|
533
|
+
entry 2833, 'fr935_asia'
|
534
|
+
entry 2859, 'descent'
|
535
|
+
entry 2886, 'fr645'
|
536
|
+
entry 2888, 'fr645m'
|
537
|
+
entry 2891, 'fr30'
|
538
|
+
entry 2900, 'fenix5s_plus'
|
539
|
+
entry 2909, 'Edge_130'
|
540
|
+
entry 2924, 'edge_1030_asia'
|
541
|
+
entry 2927, 'vivosmart_4'
|
542
|
+
entry 2945, 'vivo_move_hr_asia'
|
356
543
|
entry 2957, 'fenix5_gps_galileo' # Just a guess
|
544
|
+
entry 2962, 'approach_x10'
|
545
|
+
entry 2977, 'fr30_asia'
|
546
|
+
entry 2988, 'vivoactive3m_w'
|
547
|
+
entry 3003, 'fr645_asia'
|
548
|
+
entry 3004, 'fr645m_asia'
|
549
|
+
entry 3011, 'edge_explore'
|
550
|
+
entry 3028, 'gpsmap66'
|
551
|
+
entry 3049, 'approach_s10'
|
552
|
+
entry 3066, 'vivoactive3m_l'
|
553
|
+
entry 3085, 'approach_g80'
|
554
|
+
entry 3092, 'edge_130_asia'
|
555
|
+
entry 3095, 'edge_1030_bontrager'
|
556
|
+
entry 3110, 'fenix5_plus'
|
357
557
|
entry 3111, 'fenix5x_plus'
|
358
|
-
entry
|
558
|
+
entry 3112, 'edge_520_plus'
|
559
|
+
entry 3121, 'edge_530'
|
560
|
+
entry 3122, 'edge_830'
|
561
|
+
entry 3134, 'fenix5s_plus_apac'
|
562
|
+
entry 3135, 'fenix5x_plus_apac'
|
563
|
+
entry 3142, 'edge_520_plus_apac'
|
564
|
+
entry 3144, 'fr235l_asia'
|
565
|
+
entry 3145, 'fr245_asia'
|
566
|
+
entry 3163, 'vivo_active3m_apac'
|
567
|
+
entry 3218, 'vivo_smart4_asia'
|
568
|
+
entry 3224, 'vivoactive4_small'
|
569
|
+
entry 3225, 'vivoactive4_large'
|
570
|
+
entry 3226, 'venu'
|
571
|
+
entry 3246, 'marq_driver'
|
572
|
+
entry 3247, 'marq_aviator'
|
573
|
+
entry 3248, 'marq_captain'
|
574
|
+
entry 3249, 'marq_commander'
|
575
|
+
entry 3250, 'marq_expedition'
|
576
|
+
entry 3251, 'marq_athlete'
|
577
|
+
entry 3287, 'fenix6S_sport'
|
578
|
+
entry 3288, 'fenix6S'
|
579
|
+
entry 3289, 'fenix6_sport'
|
580
|
+
entry 3290, 'fenix6'
|
359
581
|
entry 3291, 'fenix6x'
|
582
|
+
entry 3299, 'hrm_dual'
|
583
|
+
entry 3308, 'vivo_move3_premium'
|
584
|
+
entry 3314, 'approach_s40'
|
585
|
+
entry 3321, 'fr245m_asia'
|
586
|
+
entry 3349, 'edge_530_apac'
|
587
|
+
entry 3350, 'edge_830_apac'
|
588
|
+
entry 3378, 'vivo_move3'
|
589
|
+
entry 3387, 'vivo_active4_small_asia'
|
590
|
+
entry 3388, 'vivo_active4_large_asia'
|
591
|
+
entry 3389, 'vivo_active4_oled_asia'
|
592
|
+
entry 3405, 'swim2'
|
593
|
+
entry 3420, 'marq_driver_asia'
|
594
|
+
entry 3421, 'marq_aviator_asia'
|
595
|
+
entry 3422, 'vivo_move3_asia'
|
596
|
+
entry 3446, 'vivo_active3t_chn'
|
597
|
+
entry 3448, 'marq_captain_asia'
|
598
|
+
entry 3449, 'marq_commander_asia'
|
599
|
+
entry 3450, 'marq_expedition_asia'
|
600
|
+
entry 3451, 'marq_athlete_asia'
|
601
|
+
entry 3469, 'fr45_asia'
|
602
|
+
entry 3473, 'vivoactive3_daimler'
|
603
|
+
entry 3512, 'fenix6s_sport_asia'
|
604
|
+
entry 3513, 'fenix6s_asia'
|
605
|
+
entry 3514, 'fenix6_sport_asia'
|
606
|
+
entry 3515, 'fenix6_asia'
|
607
|
+
entry 3516, 'fenix6x_asia'
|
608
|
+
entry 3624, 'marq_adventurer'
|
609
|
+
entry 3648, 'marq_adventurer_asia'
|
610
|
+
entry 3639, 'swim2_apac'
|
611
|
+
entry 3737, 'venu_daimler_asia'
|
612
|
+
entry 3740, 'venu_daimler'
|
360
613
|
entry 10007, 'sdm4'
|
614
|
+
entry 10014, 'edge_remote'
|
361
615
|
entry 20119, 'training_center'
|
362
616
|
entry 65532, 'android_antplus_plugin'
|
363
617
|
entry 65534, 'connect'
|
@@ -629,39 +883,39 @@ module Fit4Ruby
|
|
629
883
|
entry 24, 'challenge'
|
630
884
|
entry 25, 'indoor_skiing'
|
631
885
|
entry 26, 'cardio_training'
|
632
|
-
entry 27, 'indoor_walking
|
633
|
-
entry 28, 'e_bike_fitness
|
886
|
+
entry 27, 'indoor_walking'
|
887
|
+
entry 28, 'e_bike_fitness'
|
634
888
|
entry 29, 'bmx'
|
635
|
-
entry 30, 'casual_walking
|
889
|
+
entry 30, 'casual_walking'
|
636
890
|
entry 31, 'speed_walking'
|
637
|
-
entry 32, 'bike_to_run_transition
|
638
|
-
entry 33, 'run_to_bike_transition
|
891
|
+
entry 32, 'bike_to_run_transition'
|
892
|
+
entry 33, 'run_to_bike_transition'
|
639
893
|
entry 34, 'swim_to_bike_transition'
|
640
894
|
entry 35, 'atv'
|
641
895
|
entry 36, 'motocross'
|
642
896
|
entry 37, 'backcountry'
|
643
|
-
entry 38, 'resort
|
644
|
-
entry 39, 'rc_drone
|
645
|
-
entry 40, 'wingsuit
|
646
|
-
entry 41, 'whitewater
|
647
|
-
entry 42, 'skate_skiing
|
648
|
-
entry 43, 'yoga
|
897
|
+
entry 38, 'resort'
|
898
|
+
entry 39, 'rc_drone'
|
899
|
+
entry 40, 'wingsuit'
|
900
|
+
entry 41, 'whitewater'
|
901
|
+
entry 42, 'skate_skiing'
|
902
|
+
entry 43, 'yoga'
|
649
903
|
entry 44, 'pilates'
|
650
|
-
entry 45, 'indoor_running
|
651
|
-
entry 46, 'gravel_cycling
|
904
|
+
entry 45, 'indoor_running'
|
905
|
+
entry 46, 'gravel_cycling'
|
652
906
|
entry 47, 'e_bike_mountain'
|
653
907
|
entry 48, 'commuting'
|
654
908
|
entry 49, 'mixed_surface'
|
655
|
-
entry 50, 'navigate
|
656
|
-
entry 51, 'track_me
|
909
|
+
entry 50, 'navigate'
|
910
|
+
entry 51, 'track_me'
|
657
911
|
entry 52, 'map'
|
658
912
|
entry 53, 'single_gas_diving'
|
659
|
-
entry 54, 'multi_gas_diving
|
660
|
-
entry 55, 'gauge_diving
|
661
|
-
entry 56, 'apnea_diving
|
913
|
+
entry 54, 'multi_gas_diving'
|
914
|
+
entry 55, 'gauge_diving'
|
915
|
+
entry 56, 'apnea_diving'
|
662
916
|
entry 57, 'apnea_hunting'
|
663
|
-
entry 58, 'virtual_activity
|
664
|
-
entry 59, 'obstacle
|
917
|
+
entry 58, 'virtual_activity'
|
918
|
+
entry 59, 'obstacle'
|
665
919
|
entry 254, 'all'
|
666
920
|
|
667
921
|
dict 'training_status'
|
@@ -223,6 +223,11 @@ module Fit4Ruby
|
|
223
223
|
register_field_by_number(field, number)
|
224
224
|
end
|
225
225
|
|
226
|
+
# Check if a field with the given name already exists?
|
227
|
+
def has_field?(name)
|
228
|
+
return @fields_by_name.include?(name)
|
229
|
+
end
|
230
|
+
|
226
231
|
# Define a new set of Field alternatives for this message definition.
|
227
232
|
def alt_field(number, ref_field, &block)
|
228
233
|
unless @fields_by_name.include?(ref_field)
|
@@ -133,8 +133,12 @@ module Fit4Ruby
|
|
133
133
|
field 148, 'enum', 'undocumented_field_148'
|
134
134
|
field 149, 'enum', 'undocumented_field_149'
|
135
135
|
field 151, 'enum', 'undocumented_field_151'
|
136
|
+
field 160, 'enum', 'undocumented_field_160'
|
137
|
+
field 163, 'enum', 'undocumented_field_163'
|
138
|
+
field 164, 'uint8', 'undocumented_field_164'
|
136
139
|
field 167, 'string', 'undocumented_field_167'
|
137
140
|
field 168, 'enum', 'undocumented_field_168'
|
141
|
+
field 170, 'uint8', 'undocumented_field_170'
|
138
142
|
|
139
143
|
message 3, 'user_profile'
|
140
144
|
field 0, 'string', 'friendly_name'
|
@@ -175,6 +179,10 @@ module Fit4Ruby
|
|
175
179
|
field 44, 'uint8', 'undocumented_field_44'
|
176
180
|
field 45, 'uint8z', 'undocumented_field_45'
|
177
181
|
field 47, 'enum', 'undocumented_field_47'
|
182
|
+
field 52, 'enum', 'undocumented_field_52'
|
183
|
+
field 53, 'uint8', 'undocumented_field_53'
|
184
|
+
field 54, 'uint8', 'undocumented_field_54'
|
185
|
+
field 57, 'enum', 'undocumented_field_57'
|
178
186
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
179
187
|
|
180
188
|
message 5, 'sdm_profile'
|
@@ -231,6 +239,8 @@ module Fit4Ruby
|
|
231
239
|
field 11, 'enum', 'undocumented_field_11'
|
232
240
|
field 12, 'enum', 'undocumented_field_12'
|
233
241
|
field 13, 'enum', 'undocumented_field_13'
|
242
|
+
field 15, 'uint16', 'undocumented_field_15'
|
243
|
+
field 16, 'uint32', 'undocumented_field_16'
|
234
244
|
field 254, 'uint16', 'message_index'
|
235
245
|
|
236
246
|
message 12, 'sport'
|
@@ -251,6 +261,7 @@ module Fit4Ruby
|
|
251
261
|
field 17, 'enum', 'undocumented_field_17'
|
252
262
|
field 18, 'enum', 'undocumented_field_18'
|
253
263
|
field 19, 'enum', 'undocumented_field_19', :array => true
|
264
|
+
field 21, 'enum', 'undocumented_field_21'
|
254
265
|
|
255
266
|
# Not part of the official ANT SDK doc.
|
256
267
|
message 13, 'undocumented_13'
|
@@ -318,10 +329,17 @@ module Fit4Ruby
|
|
318
329
|
field 68, 'sint32','undocumented_field_68'
|
319
330
|
field 69, 'uint16', 'undocumented_field_69'
|
320
331
|
field 70, 'enum', 'undocumented_field_70'
|
332
|
+
field 71, 'enum', 'undocumented_field_71'
|
333
|
+
field 72, 'enum', 'undocumented_field_72'
|
321
334
|
field 73, 'sint32', 'undocumented_field_73'
|
322
335
|
field 74, 'sint32', 'undocumented_field_74'
|
323
336
|
field 75, 'enum', 'undocumented_field_75'
|
324
337
|
field 76, 'enum', 'undocumented_field_76'
|
338
|
+
field 78, 'enum', 'undocumented_field_78'
|
339
|
+
field 79, 'enum', 'undocumented_field_79'
|
340
|
+
field 81, 'enum', 'undocumented_field_81'
|
341
|
+
field 82, 'enum', 'undocumented_field_82'
|
342
|
+
field 83, 'enum', 'undocumented_field_83'
|
325
343
|
field 254, 'uint16', 'message_index'
|
326
344
|
|
327
345
|
message 18, 'session'
|
@@ -454,6 +472,8 @@ module Fit4Ruby
|
|
454
472
|
field 188, 'enum', 'undocumented_field_188'
|
455
473
|
field 189, 'uint16', 'undocumented_field_189'
|
456
474
|
field 190, 'uint16', 'undocumented_field_190'
|
475
|
+
field 194, 'uint8', 'undocumented_field_194'
|
476
|
+
field 195, 'uint8', 'undocumented_field_195'
|
457
477
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
458
478
|
field 254, 'uint16', 'message_index'
|
459
479
|
|
@@ -581,6 +601,7 @@ module Fit4Ruby
|
|
581
601
|
field 13, 'sint8', 'temperature', :unit => 'C'
|
582
602
|
field 14, 'uint32', 'undefined_field_14'
|
583
603
|
field 15, 'uint32', 'undefined_field_15'
|
604
|
+
field 18, 'uint8', 'undefined_field_18'
|
584
605
|
field 29, 'uint32', 'accumulated_power', :unit => 'watts'
|
585
606
|
field 30, 'uint8', 'left_right_balance', :dict => 'left_right_balance'
|
586
607
|
field 39, 'uint16', 'vertical_oscillation', :scale => 10, :unit => 'mm'
|
@@ -607,6 +628,12 @@ module Fit4Ruby
|
|
607
628
|
field 71, 'uint8', 'right_power_phase', :scale => 0.7111111, :unit => 'degrees', :array => true
|
608
629
|
field 72, 'uint8', 'right_power_phase_peak', :scale => 0.7111111, :unit => 'degrees', :array => true
|
609
630
|
field 73, 'uint32', 'enhanced_speed', :scale => 1000, :unit => 'm/s'
|
631
|
+
field 74, 'uint32', 'undefined_value_74'
|
632
|
+
field 75, 'uint32', 'undefined_value_75'
|
633
|
+
field 76, 'uint32', 'undefined_value_76'
|
634
|
+
field 77, 'uint32', 'undefined_value_77'
|
635
|
+
field 79, 'uint32', 'undefined_value_79'
|
636
|
+
field 80, 'uint32', 'undefined_value_80'
|
610
637
|
field 78, 'uint32', 'enhanced_elevation', :scale => 5, :offset => 500, :unit => 'm'
|
611
638
|
field 83, 'uint16', 'vertical_ratio', :scale => 100, :unit => '%' # guessed
|
612
639
|
field 84, 'uint16', 'gct_balance', :scale => 100, :unit => '%' # guessed
|
@@ -614,7 +641,13 @@ module Fit4Ruby
|
|
614
641
|
field 87, 'uint16', 'undefined_value_87' # first seen on F3 FW6.80
|
615
642
|
field 88, 'uint16', 'undefined_value_88' # first seen on F3HR FW3.60
|
616
643
|
field 90, 'sint8', 'performance_condition' # guessed
|
644
|
+
field 100, 'sint32', 'undocumented_field_100'
|
645
|
+
field 101, 'sint32', 'undocumented_field_101'
|
646
|
+
field 107, 'enum', 'undocumented_field_107'
|
647
|
+
field 116, 'uint16', 'undocumented_field_116'
|
617
648
|
field 108, 'uint16', 'respiration_rate', :scale => 100, :unit => 'brpm' # guessed
|
649
|
+
field 135, 'uint8', 'undocumented_field_135'
|
650
|
+
field 136, 'uint8', 'undocumented_field_136'
|
618
651
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
619
652
|
|
620
653
|
message 21, 'event'
|
@@ -826,6 +859,8 @@ module Fit4Ruby
|
|
826
859
|
field 18, 'sint32', 'undocumented_field_18'
|
827
860
|
field 19, 'sint32', 'undocumented_field_19'
|
828
861
|
field 20, 'uint16', 'undocumented_field_20'
|
862
|
+
field 21, 'sint32', 'undocumented_field_21'
|
863
|
+
field 22, 'sint32', 'undocumented_field_22'
|
829
864
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
830
865
|
|
831
866
|
message 101, 'length'
|
@@ -940,6 +975,12 @@ module Fit4Ruby
|
|
940
975
|
field 39, 'sint32', 'undocumented_field_39'
|
941
976
|
field 40, 'sint32', 'undocumented_field_40'
|
942
977
|
field 41, 'enum', 'undocumented_field_41'
|
978
|
+
field 42, 'uint8', 'undocumented_field_42'
|
979
|
+
field 43, 'sint16', 'undocumented_field_43'
|
980
|
+
field 44, 'sint16', 'undocumented_field_44'
|
981
|
+
field 45, 'sint16', 'undocumented_field_45'
|
982
|
+
field 46, 'uint8', 'undocumented_field_46'
|
983
|
+
field 48, 'uint32', 'undocumented_field_48'
|
943
984
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
944
985
|
|
945
986
|
# Not part of the official ANT SDK doc. The message name is guessed and
|
@@ -1004,7 +1045,12 @@ module Fit4Ruby
|
|
1004
1045
|
field 48, 'enum', 'undocumented_field_48'
|
1005
1046
|
field 50, 'uint8', 'undocumented_field_50'
|
1006
1047
|
field 51, 'enum', 'undocumented_field_51'
|
1007
|
-
field
|
1048
|
+
# The type of this field changed from 'uint8' to 'enum' in more recent
|
1049
|
+
# devices. No idea why and what the proper selection field should be.
|
1050
|
+
alt_field 52, 'undocumented_field_51' do
|
1051
|
+
field :default, 'uint8', 'undocumented_field_52_0'
|
1052
|
+
field 0, 'enum', 'undocumented_field_52_1'
|
1053
|
+
end
|
1008
1054
|
field 53, 'uint8', 'undocumented_field_53'
|
1009
1055
|
field 54, 'enum', 'undocumented_field_54'
|
1010
1056
|
field 55, 'uint16', 'undocumented_field_55'
|
@@ -1023,6 +1069,11 @@ module Fit4Ruby
|
|
1023
1069
|
field 73, 'uint16z', 'undocumented_field_73'
|
1024
1070
|
field 254, 'uint16', 'message_index'
|
1025
1071
|
|
1072
|
+
# Not part of the official ANT SDK doc.
|
1073
|
+
message 160, 'undocumented_160'
|
1074
|
+
field 3, 'uint32', 'undocumented_field_3'
|
1075
|
+
field 4, 'uint32', 'undocumented_field_4'
|
1076
|
+
|
1026
1077
|
# Not part of the official ANT SDK doc.
|
1027
1078
|
message 188, 'undocumented_188'
|
1028
1079
|
field 0, 'enum', 'undocumented_field_0'
|
@@ -1166,6 +1217,35 @@ module Fit4Ruby
|
|
1166
1217
|
field 252, 'uint8', 'undocumented_field_252'
|
1167
1218
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
1168
1219
|
|
1220
|
+
# Not part of the official ANT SDK doc.
|
1221
|
+
message 325, 'undocumented_325'
|
1222
|
+
field 0, 'uint8', 'undocumented_field_0'
|
1223
|
+
field 1, 'uint8', 'undocumented_field_1'
|
1224
|
+
field 2, 'uint8', 'undocumented_field_2'
|
1225
|
+
field 3, 'uint8', 'undocumented_field_3'
|
1226
|
+
field 4, 'uint8', 'undocumented_field_4'
|
1227
|
+
field 5, 'uint8', 'undocumented_field_5'
|
1228
|
+
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
1229
|
+
|
1230
|
+
# Not part of the official ANT SDK doc.
|
1231
|
+
message 326, 'undocumented_326'
|
1232
|
+
field 0, 'uint32', 'undocumented_field_0'
|
1233
|
+
field 1, 'uint32', 'undocumented_field_1'
|
1234
|
+
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
1235
|
+
|
1236
|
+
# Not part of the official ANT SDK doc.
|
1237
|
+
message 327, 'undocumented_327'
|
1238
|
+
field 0, 'uint8', 'undocumented_field_0'
|
1239
|
+
field 1, 'uint8', 'undocumented_field_1'
|
1240
|
+
field 2, 'uint8', 'undocumented_field_2'
|
1241
|
+
field 3, 'uint32', 'undocumented_field_3'
|
1242
|
+
field 4, 'uint32', 'undocumented_field_4'
|
1243
|
+
field 5, 'uint32', 'undocumented_field_5'
|
1244
|
+
field 6, 'enum', 'undocumented_field_6'
|
1245
|
+
field 251, 'byte', 'undocumented_field_251'
|
1246
|
+
field 252, 'uint8', 'undocumented_field_252'
|
1247
|
+
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
1248
|
+
|
1169
1249
|
# Not part of the official ANT SDK doc.
|
1170
1250
|
message 1024, 'undocumented_1024'
|
1171
1251
|
field 0, 'enum', 'undocumented_field_0'
|
data/lib/fit4ruby/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fit4ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Schlaeger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 12.0.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 12.0.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|