fit4ruby 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|