fit4ruby 3.5.0 → 3.6.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3c3c8eeb82d8dcde4114e43cc7e99882c61eef8cbf204bff47abe8658523dbe
4
- data.tar.gz: 02aa11ffebeabab221d493199e402a51ffe3bcbf88d023ca2734c05b22e64362
3
+ metadata.gz: a6c0eeaa643f6448d85589f5dd3eba27f05b5b98c9612df717c6105941d37c04
4
+ data.tar.gz: af7fb428ac6490e2e0ffa239d3f6135e7a66362e35a630f1b83020fed43a9a50
5
5
  SHA512:
6
- metadata.gz: 209b75663bb89a9a52185c632971039651cf71a0ee9758a56b4accfa1559f360123beaa4f055b0d50f064adc43ca0c951050806aeed38d21b7db5a014b597288
7
- data.tar.gz: ac995d33edeb4c6c35bb808896933f5f76795efaeb500e73b95d9b270afcc68ff3eca04c1ddd95ae7367c27b6f531576c65d9407271277cadbc732cf5a457aa8
6
+ metadata.gz: 251d1d4bf916e08744f3609bf4ee9eec766094b937dc9094fe2f1215d7971ad4a7ae94b2d047370d62d79bf8e9b3e250cb54fb08da036e0444ef37685cbe7736
7
+ data.tar.gz: 9c61be05a87a745b3509458ac56f4798c1afb1065d9f1d9808d7fd2e860a400b224e901a57f97263912d15b9199b5f14e9a9c7fab9ee7737f1872ed6dd78f6f5
@@ -37,7 +37,7 @@ DEPENDENCIES
37
37
  bundler (>= 1.6.4)
38
38
  fit4ruby!
39
39
  pry (>= 0.12)
40
- rake (~> 0.9.6)
40
+ rake (~> 12.0.0)
41
41
  rspec (>= 3.8)
42
42
  yard (~> 0.9.20)
43
43
 
@@ -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.9.6')
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')
@@ -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
- "_#{@developer_data_index}_#{@field_name}", options)
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.warn { "Unknown field number #{field_definition_number} " +
58
- "in global message #{@global_message_number}" }
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.warn { "Unknown global message number #{@global_message_number}" }
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 the
63
- # regular fields so that the decision field has already been already set.
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 2604, 'fenix5x'
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 3126, 'instinct'
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 52, 'uint8', 'undocumented_field_52'
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'
@@ -1,4 +1,4 @@
1
1
  module Fit4Ruby
2
2
  # The version number of the library.
3
- VERSION = '3.5.0'
3
+ VERSION = '3.6.0'
4
4
  end
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.5.0
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-01-16 00:00:00.000000000 Z
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.9.6
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.9.6
54
+ version: 12.0.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement