fit4ruby 1.4.0 → 1.5.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 +4 -4
- data/lib/fit4ruby/Activity.rb +28 -5
- data/lib/fit4ruby/FitDataRecord.rb +1 -4
- data/lib/fit4ruby/FitFile.rb +33 -26
- data/lib/fit4ruby/FitHeader.rb +2 -2
- data/lib/fit4ruby/GlobalFitMessages.rb +201 -1
- data/lib/fit4ruby/RecordAggregator.rb +4 -3
- data/lib/fit4ruby/UserProfile.rb +2 -2
- data/lib/fit4ruby/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56efcdbb75bdc51a4076b705b5ec9e4a421b384f
|
4
|
+
data.tar.gz: d3e18fcccdd8ce2dc99b9c31f162fdad6e093491
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 976290330339eb25fbd042b86954d4d8b83b45bcf0459a6fcfa73eca7ed1ec8fda5be43fa223cd7f12210098efeefa51ec25fb2e6ebfc6fc0cdb3dcddeff1bb6
|
7
|
+
data.tar.gz: 2e796850fe1332464e28694ed09f71fb1cfdb903764a1a5b8b0e05c6dad6d06b854965d3248832102625bdade88c3faff5f84837ef2e2e6674e8b0ea3b660f90
|
data/lib/fit4ruby/Activity.rb
CHANGED
@@ -87,20 +87,43 @@ module Fit4Ruby
|
|
87
87
|
# Records must have consecutively growing timestamps and distances.
|
88
88
|
ts = Time.parse('1989-12-31')
|
89
89
|
distance = nil
|
90
|
-
|
90
|
+
invalid_records = []
|
91
|
+
@records.each_with_index do |r, idx|
|
91
92
|
Log.fatal "Record has no timestamp" unless r.timestamp
|
92
93
|
if r.timestamp < ts
|
93
94
|
Log.fatal "Record has earlier timestamp than previous record"
|
94
95
|
end
|
95
96
|
if r.distance
|
96
97
|
if distance && r.distance < distance
|
97
|
-
|
98
|
-
|
98
|
+
# Normally this should be a fatal error as the FIT file is clearly
|
99
|
+
# broken. Unfortunately, the Skiing/Boarding app in the Fenix3
|
100
|
+
# produces such broken FIT files. So we just warn about this
|
101
|
+
# problem and discard the earlier records.
|
102
|
+
Log.error "Record #{r.timestamp} has smaller distance " +
|
103
|
+
"(#{r.distance}) than an earlier record (#{distance})."
|
104
|
+
# Index of the list record to be discarded.
|
105
|
+
(idx - 1).downto(0) do |i|
|
106
|
+
if (ri = @records[i]).distance > r.distance
|
107
|
+
# This is just an approximation. It looks like the app adds
|
108
|
+
# records to the FIT file for runs that it meant to discard.
|
109
|
+
# Maybe the two successive time start events are a better
|
110
|
+
# criteria. But this workaround works for now.
|
111
|
+
invalid_records << ri
|
112
|
+
else
|
113
|
+
# All broken records have been found.
|
114
|
+
break
|
115
|
+
end
|
116
|
+
end
|
99
117
|
end
|
100
118
|
distance = r.distance
|
101
119
|
end
|
102
120
|
ts = r.timestamp
|
103
121
|
end
|
122
|
+
unless invalid_records.empty?
|
123
|
+
# Delete all the broken records from the @records Array.
|
124
|
+
Log.warn "Discarding #{invalid_records.length} earlier records"
|
125
|
+
@records.delete_if { |r| invalid_records.include?(r) }
|
126
|
+
end
|
104
127
|
|
105
128
|
# Laps must have a consecutively growing message index.
|
106
129
|
@laps.each.with_index do |lap, index|
|
@@ -294,7 +317,7 @@ module Fit4Ruby
|
|
294
317
|
# certain fields of the FitDataRecord.
|
295
318
|
# @return [UserProfile]
|
296
319
|
def new_user_profile(field_values = {})
|
297
|
-
new_fit_data_record('
|
320
|
+
new_fit_data_record('old_user_profile', field_values)
|
298
321
|
end
|
299
322
|
|
300
323
|
# Add a new Event to the Activity.
|
@@ -376,7 +399,7 @@ module Fit4Ruby
|
|
376
399
|
@device_infos << (record = DeviceInfo.new(field_values))
|
377
400
|
when 'data_sources'
|
378
401
|
@data_sources << (record = DataSources.new(field_values))
|
379
|
-
when '
|
402
|
+
when 'old_user_profile'
|
380
403
|
@user_profiles << (record = UserProfile.new(field_values))
|
381
404
|
when 'event'
|
382
405
|
@events << (record = Event.new(field_values))
|
data/lib/fit4ruby/FitFile.rb
CHANGED
@@ -36,31 +36,41 @@ module Fit4Ruby
|
|
36
36
|
rescue StandardError => e
|
37
37
|
Log.fatal "Cannot open FIT file '#{file_name}': #{e.message}"
|
38
38
|
end
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
record.
|
54
|
-
|
39
|
+
|
40
|
+
entities = []
|
41
|
+
while !io.eof?
|
42
|
+
offset = io.pos
|
43
|
+
|
44
|
+
header = FitHeader.read(io)
|
45
|
+
header.check
|
46
|
+
|
47
|
+
check_crc(io, io.pos, offset + header.end_pos)
|
48
|
+
|
49
|
+
entity = FitFileEntity.new
|
50
|
+
# This Array holds the raw data of the records that may be needed to
|
51
|
+
# dump a human readable form of the FIT file.
|
52
|
+
records = []
|
53
|
+
# This hash will hold a counter for each record type. The counter is
|
54
|
+
# incremented each time the corresponding record type is found.
|
55
|
+
record_counters = Hash.new { 0 }
|
56
|
+
while io.pos < offset + header.end_pos
|
57
|
+
record = FitRecord.new(definitions)
|
58
|
+
record.read(io, entity, filter, record_counters)
|
59
|
+
records << record if filter
|
60
|
+
end
|
61
|
+
# Skip the 2 CRC bytes
|
62
|
+
io.seek(2, :CUR)
|
63
|
+
|
64
|
+
header.dump if filter && filter.record_numbers.nil?
|
65
|
+
dump_records(records) if filter
|
66
|
+
|
67
|
+
entity.check
|
68
|
+
entities << entity
|
55
69
|
end
|
56
70
|
|
57
71
|
io.close
|
58
72
|
|
59
|
-
|
60
|
-
dump_records(records) if filter
|
61
|
-
|
62
|
-
entity.check
|
63
|
-
entity.top_level_record
|
73
|
+
entities[0].top_level_record
|
64
74
|
end
|
65
75
|
|
66
76
|
def write(file_name, top_level_record)
|
@@ -93,14 +103,11 @@ module Fit4Ruby
|
|
93
103
|
|
94
104
|
private
|
95
105
|
|
96
|
-
def check_crc(io, end_pos)
|
97
|
-
# Save the current file IO position
|
98
|
-
start_pos = io.pos
|
99
|
-
|
106
|
+
def check_crc(io, start_pos, end_pos)
|
100
107
|
crc = compute_crc(io, start_pos, end_pos)
|
101
108
|
|
102
109
|
# Read the 2 CRC bytes from the end of the file
|
103
|
-
io.seek(
|
110
|
+
io.seek(end_pos)
|
104
111
|
crc_ref = io.readbyte.to_i | (io.readbyte.to_i << 8)
|
105
112
|
io.seek(start_pos)
|
106
113
|
|
data/lib/fit4ruby/FitHeader.rb
CHANGED
@@ -28,10 +28,10 @@ module Fit4Ruby
|
|
28
28
|
|
29
29
|
def check
|
30
30
|
unless header_size == 14
|
31
|
-
Log.fatal
|
31
|
+
Log.fatal "Unsupported header size #{header_size}"
|
32
32
|
end
|
33
33
|
unless data_type == '.FIT'
|
34
|
-
Log.fatal
|
34
|
+
Log.fatal "Unknown file type #{data_type}"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -28,6 +28,103 @@ module Fit4Ruby
|
|
28
28
|
field 6, 'uint16', 'undocumented_field_6'
|
29
29
|
field 7, 'uint32', 'undocumented_field_7'
|
30
30
|
|
31
|
+
message 2, 'device_settings'
|
32
|
+
field 0, 'uint8', 'active_time_zone'
|
33
|
+
field 1, 'uint32', 'utc_offset'
|
34
|
+
field 2, 'uint32', 'time_offset', :array => true
|
35
|
+
field 3, 'enum', 'undocumented_field_3'
|
36
|
+
field 4, 'enum', 'time_mode', :array => true
|
37
|
+
field 5, 'sint8', 'time_zone_offset', :array => true
|
38
|
+
field 8, 'uint16', 'undocumented_field_8'
|
39
|
+
field 9, 'enum', 'undocumented_field_9'
|
40
|
+
field 10, 'enum', 'undocumented_field_10'
|
41
|
+
field 11, 'enum', 'undocumented_field_11'
|
42
|
+
field 12, 'enum', 'backlight_mode'
|
43
|
+
field 13, 'uint8', 'undocumented_field_13'
|
44
|
+
field 14, 'uint8', 'undocumented_field_14'
|
45
|
+
field 15, 'uint8', 'undocumented_field_15'
|
46
|
+
field 22, 'enum', 'undocumented_field_22'
|
47
|
+
field 26, 'enum', 'undocumented_field_26'
|
48
|
+
field 28, 'enum', 'undocumented_field_28'
|
49
|
+
field 34, 'enum', 'undocumented_field_34'
|
50
|
+
field 35, 'enum', 'undocumented_field_35'
|
51
|
+
field 36, 'enum', 'activity_tracker_enabled'
|
52
|
+
field 38, 'enum', 'undocumented_field_38'
|
53
|
+
field 41, 'enum', 'undocumented_field_41'
|
54
|
+
field 42, 'enum', 'undocumented_field_42'
|
55
|
+
field 43, 'enum', 'undocumented_field_43'
|
56
|
+
field 44, 'enum', 'undocumented_field_44'
|
57
|
+
field 45, 'enum', 'undocumented_field_45'
|
58
|
+
field 46, 'enum', 'move_alert_enabled'
|
59
|
+
field 48, 'enum', 'undocumented_field_48'
|
60
|
+
field 49, 'uint16', 'undocumented_field_49'
|
61
|
+
field 51, 'enum', 'undocumented_field_51'
|
62
|
+
field 52, 'enum', 'undocumented_field_52'
|
63
|
+
field 53, 'enum', 'undocumented_field_53'
|
64
|
+
field 56, 'enum', 'mounting_side'
|
65
|
+
field 58, 'uint16', 'autosync_min_steps'
|
66
|
+
field 59, 'uint16', 'autosync_min_time'
|
67
|
+
field 62, 'enum', 'undocumented_field_62'
|
68
|
+
field 63, 'enum', 'undocumented_field_63'
|
69
|
+
field 64, 'enum', 'undocumented_field_64'
|
70
|
+
field 65, 'enum', 'undocumented_field_65'
|
71
|
+
field 66, 'enum', 'undocumented_field_66'
|
72
|
+
field 67, 'enum', 'undocumented_field_67'
|
73
|
+
field 68, 'enum', 'undocumented_field_68'
|
74
|
+
field 69, 'enum', 'undocumented_field_69'
|
75
|
+
field 80, 'enum', 'lactate_threshold_autodetect_enabled'
|
76
|
+
field 81, 'enum', 'undocumented_field_81'
|
77
|
+
field 82, 'enum', 'undocumented_field_82'
|
78
|
+
field 83, 'enum', 'undocumented_field_83'
|
79
|
+
field 84, 'enum', 'undocumented_field_84'
|
80
|
+
field 85, 'enum', 'undocumented_field_85'
|
81
|
+
field 87, 'enum', 'undocumented_field_87'
|
82
|
+
field 94, 'uint8', 'number_of_screens'
|
83
|
+
|
84
|
+
message 3, 'user_profile'
|
85
|
+
field 1, 'enum', 'gender', :dict => 'gender'
|
86
|
+
field 3, 'uint8', 'height'
|
87
|
+
field 4, 'uint16', 'weight'
|
88
|
+
field 5, 'enum', 'language'
|
89
|
+
field 6, 'enum', 'elev_setting'
|
90
|
+
field 7, 'enum', 'weight_setting'
|
91
|
+
field 8, 'uint8', 'resting_heart_rate'
|
92
|
+
field 12, 'enum', 'hr_setting'
|
93
|
+
field 13, 'enum', 'speed_setting'
|
94
|
+
field 14, 'enum', 'dist_setting'
|
95
|
+
field 17, 'enum', 'activity_class'
|
96
|
+
field 18, 'enum', 'position_setting'
|
97
|
+
field 21, 'enum', 'temperature_setting'
|
98
|
+
field 24, 'uint8', 'undocumented_field_24'
|
99
|
+
field 28, 'uint32', 'wake_time'
|
100
|
+
field 29, 'uint32', 'sleep_time'
|
101
|
+
field 30, 'enum', 'height_setting'
|
102
|
+
field 31, 'uint16', 'user_running_step_length'
|
103
|
+
field 32, 'uint16', 'user_walking_step_length'
|
104
|
+
field 33, 'uint16', 'undocumented_field_33'
|
105
|
+
field 34, 'uint16', 'undocumented_field_34'
|
106
|
+
field 35, 'uint32', 'undocumented_field_35'
|
107
|
+
field 36, 'uint8', 'undocumented_field_36'
|
108
|
+
field 37, 'uint16', 'undocumented_field_37'
|
109
|
+
field 38, 'uint16', 'undocumented_field_38'
|
110
|
+
field 39, 'float32', 'undocumented_field_39'
|
111
|
+
field 40, 'float32', 'undocumented_field_40'
|
112
|
+
field 41, 'uint32', 'undocumented_field_41'
|
113
|
+
field 42, 'uint32', 'undocumented_field_42'
|
114
|
+
|
115
|
+
message 7, 'zones_target'
|
116
|
+
field 1, 'uint8', 'max_heart_rate'
|
117
|
+
field 2, 'uint8', 'threshold_heart_rate'
|
118
|
+
field 3, 'uint16', 'functional_threshold_power'
|
119
|
+
field 5, 'enum', 'hr_zone_calc'
|
120
|
+
field 7, 'enum', 'pwr_zone_calc'
|
121
|
+
field 8, 'uint16', 'undocumented_field_8'
|
122
|
+
field 9, 'enum', 'undocumented_field_9'
|
123
|
+
field 10, 'enum', 'undocumented_field_10'
|
124
|
+
field 11, 'enum', 'undocumented_field_11'
|
125
|
+
field 12, 'enum', 'undocumented_field_12'
|
126
|
+
field 254, 'uint16', 'message_index'
|
127
|
+
|
31
128
|
message 12, 'sport'
|
32
129
|
field 0, 'enum', 'sport', :dict => 'sport'
|
33
130
|
field 1, 'enum', 'sub_sport', :dict => 'sub_sport'
|
@@ -38,6 +135,45 @@ module Fit4Ruby
|
|
38
135
|
field 10, 'uint8', 'undocumented_field_10', :array => true
|
39
136
|
field 11, 'enum', 'undocumented_field_11'
|
40
137
|
|
138
|
+
# Not part of the official ANT SDK doc.
|
139
|
+
message 13, 'undocumented_13'
|
140
|
+
field 1, 'enum', 'undocumented_field_1'
|
141
|
+
field 2, 'uint16', 'undocumented_field_2'
|
142
|
+
field 3, 'enum', 'undocumented_field_3'
|
143
|
+
field 4, 'uint32', 'undocumented_field_4'
|
144
|
+
field 5, 'sint32', 'undocumented_field_5'
|
145
|
+
field 6, 'sint32', 'undocumented_field_6'
|
146
|
+
field 7, 'enum', 'undocumented_field_7'
|
147
|
+
field 8, 'uint16', 'undocumented_field_8'
|
148
|
+
field 11, 'uint8', 'undocumented_field_11'
|
149
|
+
field 12, 'enum', 'undocumented_field_12'
|
150
|
+
field 13, 'enum', 'undocumented_field_13'
|
151
|
+
field 14, 'enum', 'undocumented_field_14'
|
152
|
+
field 15, 'enum', 'undocumented_field_15'
|
153
|
+
field 16, 'enum', 'undocumented_field_16'
|
154
|
+
field 21, 'enum', 'undocumented_field_21'
|
155
|
+
field 22, 'uint16', 'undocumented_field_22'
|
156
|
+
field 23, 'enum', 'undocumented_field_23'
|
157
|
+
field 24, 'enum', 'undocumented_field_24'
|
158
|
+
field 27, 'enum', 'undocumented_field_27'
|
159
|
+
field 28, 'enum', 'undocumented_field_28'
|
160
|
+
field 29, 'enum', 'undocumented_field_29'
|
161
|
+
field 30, 'enum', 'undocumented_field_30'
|
162
|
+
field 31, 'uint32', 'undocumented_field_31'
|
163
|
+
field 32, 'uint16', 'undocumented_field_32'
|
164
|
+
field 33, 'uint32', 'undocumented_field_33'
|
165
|
+
field 34, 'enum', 'undocumented_field_34'
|
166
|
+
field 35, 'enum', 'undocumented_field_35'
|
167
|
+
field 36, 'enum', 'undocumented_field_36'
|
168
|
+
field 37, 'enum', 'undocumented_field_37'
|
169
|
+
field 38, 'uint8', 'undocumented_field_38'
|
170
|
+
field 39, 'uint8', 'undocumented_field_39'
|
171
|
+
field 40, 'enum', 'undocumented_field_40'
|
172
|
+
field 41, 'sint32', 'undocumented_field_41'
|
173
|
+
field 42, 'uint8', 'undocumented_field_42'
|
174
|
+
field 46, 'enum', 'undocumented_field_46'
|
175
|
+
field 254, 'uint16', 'message_index'
|
176
|
+
|
41
177
|
message 18, 'session'
|
42
178
|
field 0, 'enum', 'event', :dict => 'event'
|
43
179
|
field 1, 'enum', 'event_type', :dict => 'event_type'
|
@@ -336,6 +472,7 @@ module Fit4Ruby
|
|
336
472
|
field 21, 'uint16z', 'ant_device_number'
|
337
473
|
field 22, 'enum', 'ant_network', :dict => 'ant_network'
|
338
474
|
field 23, 'uint8', 'undocumented_field_23'
|
475
|
+
field 24, 'uint32z', 'undocumented_field_24'
|
339
476
|
field 25, 'enum', 'source_type', :dict => 'source_type'
|
340
477
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
341
478
|
|
@@ -435,7 +572,7 @@ module Fit4Ruby
|
|
435
572
|
field 0, 'uint16', 'time', :array => true, :scale => 1000, :unit => 's'
|
436
573
|
|
437
574
|
# Not part of the official ANT SDK doc
|
438
|
-
message 79, '
|
575
|
+
message 79, 'old_user_profile'
|
439
576
|
field 0, 'uint16', 'metmax', :scale => 1000, :unit => 'MET' # VO2max / 3.5
|
440
577
|
field 1, 'uint8', 'age', :unit => 'years'
|
441
578
|
field 2, 'uint8', 'height', :scale => 100, :unit => 'm'
|
@@ -479,6 +616,8 @@ module Fit4Ruby
|
|
479
616
|
field 5, 'uint16', 'resting_metabolic_rate', :unit => 'kcal/day'
|
480
617
|
# Just a guess, not officially documented
|
481
618
|
field 7, 'uint32', 'goal_cycles', :array => true
|
619
|
+
# Showed up in Fenix3HR firmware 3.84. Haven't seen a value yet.
|
620
|
+
field 8, 'enum', 'undocumented_field_8', :array => true
|
482
621
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
483
622
|
|
484
623
|
# Not part of the official ANT SDK doc
|
@@ -539,11 +678,72 @@ module Fit4Ruby
|
|
539
678
|
field 5, 'sint32', 'undocumented_field_5'
|
540
679
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
541
680
|
|
681
|
+
# Not part of the official ANT SDK doc.
|
682
|
+
message 147, 'undocumented_147'
|
683
|
+
field 0, 'uint32z', 'undocumented_field_0'
|
684
|
+
field 1, 'uint8', 'undocumented_field_1'
|
685
|
+
field 2, 'string', 'undocumented_field_2'
|
686
|
+
field 3, 'enum', 'undocumented_field_3'
|
687
|
+
field 4, 'enum', 'undocumented_field_4'
|
688
|
+
field 5, 'enum', 'undocumented_field_5'
|
689
|
+
field 6, 'enum', 'undocumented_field_6'
|
690
|
+
field 7, 'enum', 'undocumented_field_7'
|
691
|
+
field 8, 'uint8', 'undocumented_field_8'
|
692
|
+
field 9, 'uint8', 'undocumented_field_9'
|
693
|
+
field 10, 'uint16', 'undocumented_field_10'
|
694
|
+
field 11, 'uint16', 'undocumented_field_11'
|
695
|
+
field 12, 'uint8', 'undocumented_field_12'
|
696
|
+
field 13, 'uint32', 'undocumented_field_13'
|
697
|
+
field 14, 'uint8', 'undocumented_field_14'
|
698
|
+
field 15, 'uint8', 'undocumented_field_15'
|
699
|
+
field 16, 'uint8', 'undocumented_field_16'
|
700
|
+
field 17, 'uint8z', 'undocumented_field_17'
|
701
|
+
field 18, 'uint8z', 'undocumented_field_18'
|
702
|
+
field 19, 'uint8z', 'undocumented_field_19'
|
703
|
+
field 20, 'uint8z', 'undocumented_field_20'
|
704
|
+
field 21, 'uint16', 'undocumented_field_21'
|
705
|
+
field 24, 'enum', 'undocumented_field_24'
|
706
|
+
field 31, 'uint8', 'undocumented_field_31'
|
707
|
+
field 32, 'uint16', 'undocumented_field_32'
|
708
|
+
field 33, 'uint16', 'undocumented_field_33'
|
709
|
+
field 34, 'uint16', 'undocumented_field_34'
|
710
|
+
field 35, 'uint16', 'undocumented_field_35'
|
711
|
+
field 36, 'enum', 'undocumented_field_36'
|
712
|
+
field 37, 'enum', 'undocumented_field_37'
|
713
|
+
field 38, 'enum', 'undocumented_field_38'
|
714
|
+
field 39, 'enum', 'undocumented_field_39'
|
715
|
+
field 40, 'uint16z', 'undocumented_field_40'
|
716
|
+
field 41, 'uint8', 'undocumented_field_41'
|
717
|
+
field 42, 'enum', 'undocumented_field_42'
|
718
|
+
field 43, 'enum', 'undocumented_field_43'
|
719
|
+
field 44, 'uint8z', 'undocumented_field_44'
|
720
|
+
field 45, 'enum', 'undocumented_field_45'
|
721
|
+
field 46, 'enum', 'undocumented_field_46'
|
722
|
+
field 47, 'enum', 'undocumented_field_47'
|
723
|
+
field 254, 'uint16', 'message_index'
|
724
|
+
|
725
|
+
# Not part of the official ANT SDK doc.
|
542
726
|
message 211, 'undocumented_211'
|
543
727
|
field 0, 'uint8', 'undocumented_field_0'
|
544
728
|
field 1, 'uint8', 'undocumented_field_1'
|
545
729
|
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
546
730
|
|
731
|
+
# Not part of the official ANT SDK doc.
|
732
|
+
message 216, 'undocumented_216'
|
733
|
+
field 0, 'uint16', 'undocumented_field_0'
|
734
|
+
field 1, 'uint16', 'undocumented_field_1'
|
735
|
+
field 2, 'uint32', 'undocumented_field_2'
|
736
|
+
field 5, 'uint32', 'undocumented_field_5'
|
737
|
+
field 6, 'uint8', 'undocumented_field_6'
|
738
|
+
field 9, 'uint16', 'undocumented_field_9'
|
739
|
+
field 10, 'enum', 'undocumented_field_10'
|
740
|
+
field 11, 'uint8', 'undocumented_field_11'
|
741
|
+
field 12, 'uint8', 'undocumented_field_12'
|
742
|
+
field 13, 'uint8', 'undocumented_field_13'
|
743
|
+
field 14, 'enum', 'undocumented_field_14'
|
744
|
+
field 15, 'uint16', 'undocumented_field_15'
|
745
|
+
field 253, 'uint32', 'timestamp', :type => 'date_time'
|
746
|
+
|
547
747
|
end
|
548
748
|
|
549
749
|
end
|
@@ -162,9 +162,10 @@ module Fit4Ruby
|
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
165
|
-
@avg_stance_time =
|
166
|
-
|
167
|
-
|
165
|
+
@avg_stance_time = stance_time_count > 0 ?
|
166
|
+
total_stance_time / stance_time_count : 0
|
167
|
+
@avg_stance_time_percent = stance_time_percent_count > 0 ?
|
168
|
+
total_stance_time_percent / stance_time_percent_count : 0
|
168
169
|
end
|
169
170
|
|
170
171
|
end
|
data/lib/fit4ruby/UserProfile.rb
CHANGED
@@ -14,14 +14,14 @@ require 'fit4ruby/FitDataRecord'
|
|
14
14
|
|
15
15
|
module Fit4Ruby
|
16
16
|
|
17
|
-
# This class corresponds to the
|
17
|
+
# This class corresponds to the old_user_profile FIT message.
|
18
18
|
class UserProfile < FitDataRecord
|
19
19
|
|
20
20
|
# Create a new UserProfile object.
|
21
21
|
# @param field_values [Hash] Hash that provides initial values for certain
|
22
22
|
# fields.
|
23
23
|
def initialize(field_values = {})
|
24
|
-
super('
|
24
|
+
super('old_user_profile')
|
25
25
|
set_field_values(field_values)
|
26
26
|
end
|
27
27
|
|
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: 1.
|
4
|
+
version: 1.5.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:
|
11
|
+
date: 2017-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|