fit4ruby 0.0.8 → 0.0.9

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
  SHA1:
3
- metadata.gz: 7f651054b5f16738a2ca5fc4146cdb817c4ef102
4
- data.tar.gz: b1af399d6335bcf932dfdeb3b35897191bfc6290
3
+ metadata.gz: 03a178c07a618005acb996433ce4c8d1dd4f1cce
4
+ data.tar.gz: 84ee7b840af9cfac5411bd4480737cdf8e4fcaff
5
5
  SHA512:
6
- metadata.gz: 773e7c729a6ecae371b03269da9da1312f9ca7da35f3e14e6cc6e2c8429955d5f4ea0f965a975bde69368853d9a7555280f4da9a630dd8e1525f827e090b06d1
7
- data.tar.gz: 2e4ea74d55a4496977133a15e0ccb5bf0902b4104c32587e783c3427c175cc123c70a498a8e0b0a56cc28451e3fb95b6c0a509b9b28431ff376194b2a94c0932
6
+ metadata.gz: cd71d3ffafc982031ae56a62ab8c76780a329346108717d2f54b3a2f7e82c866da5e424167530a4b5452bc48916ab24ec037ab43c4cdd4e6ce30259e3280bada
7
+ data.tar.gz: 5e9cab1af4d8a3bd048b73ab44a60cbc475d228e50c20746ca33cc027d0aa6c89d39e928d72ac111e438afc62c3ef0bf1dfd52bdccd46b8f3e18a89f3e2f7361
@@ -19,6 +19,7 @@ require 'fit4ruby/UserProfile'
19
19
  require 'fit4ruby/Session'
20
20
  require 'fit4ruby/Lap'
21
21
  require 'fit4ruby/Record'
22
+ require 'fit4ruby/HRV'
22
23
  require 'fit4ruby/Event'
23
24
  require 'fit4ruby/PersonalRecords'
24
25
 
@@ -30,7 +31,7 @@ module Fit4Ruby
30
31
  class Activity < FitDataRecord
31
32
 
32
33
  attr_accessor :file_id, :file_creator, :device_infos, :data_sources,
33
- :user_profiles, :sessions, :laps, :records,
34
+ :user_profiles, :sessions, :laps, :records, :hrv,
34
35
  :events, :personal_records
35
36
 
36
37
  # Create a new Activity object.
@@ -50,6 +51,7 @@ module Fit4Ruby
50
51
  @sessions = []
51
52
  @laps = []
52
53
  @records = []
54
+ @hrv = []
53
55
  @personal_records = []
54
56
 
55
57
  @cur_session_laps = []
@@ -111,24 +113,31 @@ module Fit4Ruby
111
113
  # the total distance purely on the GPS coordinates found in the records.
112
114
  d = 0.0
113
115
  last_lat = last_long = nil
116
+ last_timestamp = nil
114
117
 
115
118
  # Iterate over all the records and accumlate the distances between the
116
119
  # neiboring coordinates.
117
120
  @records.each do |r|
118
121
  if (lat = r.position_lat) && (long = r.position_long)
119
122
  if last_lat && last_long
120
- d += Fit4Ruby::GeoMath.distance(last_lat, last_long,
121
- lat, long)
123
+ distance = Fit4Ruby::GeoMath.distance(last_lat, last_long,
124
+ lat, long)
125
+ d += distance
126
+ end
127
+ if last_timestamp
128
+ speed = distance / (r.timestamp - last_timestamp)
122
129
  end
123
130
  if timer_stops[0] == r.timestamp
124
131
  # If a stop event was found for this record timestamp we clear the
125
132
  # last_* values so that the distance covered while being stopped
126
133
  # is not added to the total.
127
134
  last_lat = last_long = nil
135
+ last_timestamp = nil
128
136
  timer_stops.shift
129
137
  else
130
138
  last_lat = lat
131
139
  last_long = long
140
+ last_timestamp = r.timestamp
132
141
  end
133
142
  end
134
143
  end
@@ -163,6 +172,16 @@ module Fit4Ruby
163
172
  nil
164
173
  end
165
174
 
175
+ # Returns the remaining recovery time at the start of the activity.
176
+ # @return remaining recovery time in seconds.
177
+ def recovery_info
178
+ @events.each do |e|
179
+ return e.recovery_info if e.event == 'recovery_info'
180
+ end
181
+
182
+ nil
183
+ end
184
+
166
185
  # Returns the predicted recovery time needed after this activity.
167
186
  # @return recovery time in seconds.
168
187
  def recovery_time
@@ -350,6 +369,8 @@ module Fit4Ruby
350
369
  when 'record'
351
370
  @cur_lap_records << (record = Record.new(field_values))
352
371
  @records << record
372
+ when 'hrv'
373
+ @hrv << (record = HRV.new(field_values))
353
374
  when 'personal_records'
354
375
  @personal_records << (record = PersonalRecords.new(field_values))
355
376
  else
@@ -39,7 +39,9 @@ module Fit4Ruby
39
39
 
40
40
  def speedToPace(speed, distance = 1000.0)
41
41
  if speed && speed > 0.01
42
- pace = distance / (speed * 60.0)
42
+ # We only show 2 fractional digits, so make sure we round accordingly
43
+ # before we crack it up.
44
+ pace = (distance.to_f / (speed * 60.0)).round(2)
43
45
  int, dec = pace.divmod 1
44
46
  "#{int}:#{'%02d' % (dec * 60)}"
45
47
  else
@@ -11,6 +11,7 @@
11
11
  #
12
12
 
13
13
  require 'fit4ruby/Log'
14
+ require 'fit4ruby/FileNameCoder'
14
15
  require 'fit4ruby/FitHeader'
15
16
  require 'fit4ruby/FitFileEntity'
16
17
  require 'fit4ruby/FitRecord'
@@ -66,6 +66,13 @@ module Fit4Ruby
66
66
  entry 4, 'low'
67
67
  entry 5, 'critical'
68
68
 
69
+ dict 'comm_timeout_type'
70
+ entry 0, 'wildcard_paring_timeout'
71
+ entry 1, 'pairing_timeout'
72
+ entry 2, 'connection_lost'
73
+ entry 3, 'connection_timeout'
74
+
75
+
69
76
  dict 'device_type'
70
77
  entry 0, 'gps' # Just a guess
71
78
  entry 3, 'acceleration' # Just a guess
@@ -129,6 +136,10 @@ module Fit4Ruby
129
136
  entry 39, 'recovery_info' # guess (in minutes, < 24 good, > 24h poor)
130
137
  entry 42, 'front_gear_change'
131
138
  entry 43, 'rear_gear_change'
139
+ entry 44, 'rider_position_change'
140
+ entry 45, 'elev_high_alert'
141
+ entry 46, 'elev_low_alert'
142
+ entry 47, 'comm_timeout'
132
143
 
133
144
  dict 'event_type'
134
145
  entry 0, 'start_time'
@@ -159,6 +170,12 @@ module Fit4Ruby
159
170
  entry 28, 'monitoring_daily'
160
171
  entry 32, 'monitoring_b'
161
172
 
173
+ dict 'fitness_equipment_state'
174
+ entry 0, 'ready'
175
+ entry 1, 'in_use'
176
+ entry 2, 'paused'
177
+ entry 3, 'unknown'
178
+
162
179
  dict 'garmin_product'
163
180
  entry 8, 'hrm_run_single_byte_product_id'
164
181
  entry 1551, 'fenix'
@@ -314,6 +331,10 @@ module Fit4Ruby
314
331
  entry 0x7000, 'reserved'
315
332
  entry 0x8000, 'selected'
316
333
 
334
+ dict 'rider_position_type'
335
+ entry 0, 'seated'
336
+ entry 1, 'standing'
337
+
317
338
  dict 'session_trigger'
318
339
  entry 0, 'activity_end'
319
340
  entry 1, 'manual'
@@ -131,6 +131,9 @@ module Fit4Ruby
131
131
  field 121, 'uint16', 'max_power_position', :array => true, :unit => 'watts'
132
132
  field 122, 'uint8', 'avg_cadence_position', :array => true, :unit => 'rpm'
133
133
  field 123, 'uint8', 'max_cadence_position', :array => true, :unit => 'rpm'
134
+ field 132, 'uint16', 'vertical_ratio', :scale => 100, :unit => '%' # guessed
135
+ field 133, 'uint16', 'avg_gct_balance', :scale => 100, :unit => '%' # guessed
136
+ field 134, 'uint16', 'avg_stride_length', :scale => 10000, :unit => 'm' # guessed
134
137
  field 253, 'uint32', 'timestamp', :type => 'date_time'
135
138
  field 254, 'uint16', 'message_index'
136
139
 
@@ -216,6 +219,9 @@ module Fit4Ruby
216
219
  field 107, 'uint16', 'max_power_position', :array => true, :unit => 'watts'
217
220
  field 108, 'uint8', 'avg_cadence_position', :array => true, :unit => 'rpm'
218
221
  field 109, 'uint8', 'max_cadence_position', :array => true, :unit => 'rpm'
222
+ field 118, 'uint16', 'vertical_ratio', :scale => 100, :unit => '%' # guessed
223
+ field 119, 'uint16', 'avg_gct_balance', :scale => 100, :unit => '%' # guessed
224
+ field 120, 'uint16', 'avg_stride_length', :scale => 10000, :unit => 'm' # guessed
219
225
  field 253, 'uint32', 'timestamp', :type => 'date_time'
220
226
  field 254, 'uint16', 'message_index'
221
227
 
@@ -236,6 +242,9 @@ module Fit4Ruby
236
242
  field 53, 'uint8', 'fractional_cadence', :scale => 128
237
243
  field 61, 'uint16', 'undefined_value_61'
238
244
  field 66, 'sint16', 'undefined_value_66'
245
+ field 83, 'uint16', 'vertical_ratio', :scale => 100, :unit => '%' # guessed
246
+ field 84, 'uint16', 'gct_balance', :scale => 100, :unit => '%' # guessed
247
+ field 85, 'uint16', 'stride_length', :scale => 10000, :unit => 'm' # guessed
239
248
  field 253, 'uint32', 'timestamp', :type => 'date_time'
240
249
 
241
250
  message 21, 'event'
@@ -247,8 +256,22 @@ module Fit4Ruby
247
256
  field 'timer', 'enum', 'timer_trigger', :dict => 'timer_trigger'
248
257
  field 'course_point', 'enum', 'message_index', :dict => 'message_index'
249
258
  field 'battery', 'uint16', 'battery_level', :scale => 1000, :unit => 'V'
259
+ field 'hr_high_alert', 'uint8', 'hr_high_alert', :unit => 'bpm'
260
+ field 'hr_low_alert', 'uint8', 'hr_low_alert', :unit => 'bpm'
261
+ field 'speed_high_alert', 'uint16', 'speed_high_alert', :scale => 1000, :unit => 'm/s'
262
+ field 'speed_low_alert', 'uint16', 'speed_low_alert', :scale => 1000, :unit => 'm/s'
263
+ field 'cad_high_alert', 'uint16', 'cad_high_alert', :unit => 'bpm'
264
+ field 'cad_low_alert', 'uint16', 'cad_low_alert', :unit => 'bpm'
265
+ field 'power_high_alert', 'uint16', 'power_high_alert', :unit => 'watts'
266
+ field 'power_low_alert', 'uint16', 'power_low_alert', :unit => 'watts'
267
+ field 'time_duration_alert', 'uint32', 'time_duration_alert', :scale => 100, :unit => 's'
268
+ field 'calorie_duration_alert', 'uint32', 'calorie_duration_alert', :unit => 'calories'
269
+ field 'fitness_equipment', 'enum', 'fitness_equipment_state', :dict => 'fitness_equipment_state'
270
+ field 'rider_position', 'enum', 'rider_position', :dict => 'rider_position_type'
271
+ field 'comm_timeout', 'uint16', 'comm_timeout', :dict => 'comm_timeout_type'
250
272
  field 'recovery_hr', 'uint32', 'recovery_hr', :unit => 'bpm'
251
273
  field 'recovery_time', 'uint32', 'recovery_time', :unit => 'min'
274
+ field 'recovery_info', 'uint32', 'recovery_info', :unit => 'min'
252
275
  field 'vo2max', 'uint32', 'vo2max'
253
276
  end
254
277
  field 4, 'uint8', 'event_group'
@@ -355,6 +378,10 @@ module Fit4Ruby
355
378
  field 24, 'byte', 'current_activity_type_intensity', :type => 'activity_intensity'
356
379
  field 26, 'uint16', 'timestamp_16', :unit => 's'
357
380
  field 29, 'uint16', 'duration_min', :unit => 'min'
381
+ field 31, 'uint32', 'undocumented_field_31'
382
+ field 32, 'uint32', 'undocumented_field_32'
383
+ field 35, 'uint32', 'undocumented_field_35'
384
+ field 36, 'uint32', 'undocumented_field_36'
358
385
  field 253, 'uint32', 'timestamp', :type => 'date_time'
359
386
 
360
387
  message 72, 'training_file'
@@ -383,6 +410,11 @@ module Fit4Ruby
383
410
  field 7, 'sint8', 'undocumented_field_7' # seems to be always 1
384
411
  field 8, 'uint16', 'recovery_time', :scale => 60, :unit => 'hours'
385
412
  field 9, 'uint16', 'undocumented_field_9' # maybe activity measurement
413
+ field 10, 'uint8', 'undocumented_field_10'
414
+ field 11, 'uint16', 'undocumented_field_11'
415
+ field 12, 'uint16', 'undocumented_field_12'
416
+ field 13, 'uint16', 'undocumented_field_13'
417
+ field 14, 'uint8', 'undocumented_field_14'
386
418
  field 253, 'uint32', 'timestamp', :type => 'date_time'
387
419
 
388
420
  message 101, 'length'
@@ -424,6 +456,15 @@ module Fit4Ruby
424
456
  field 5, 'enum', 'new_record'
425
457
  field 253, 'uint32', 'timestamp', :type => 'date_time'
426
458
 
459
+ # Not part of the official ANT SDK doc
460
+ # It shows up in swimming activities.
461
+ message 125, 'undocumented_125'
462
+ field 1, 'uint8', 'undocumented_field_1', :array => true
463
+ field 2, 'uint16', 'undocumented_field_2', :array => true
464
+ field 3, 'uint16', 'undocumented_field_3'
465
+ field 4, 'uint8', 'undocumented_field_4'
466
+ field 253, 'uint32', 'timestamp', :type => 'date_time'
467
+
427
468
  # Not part of the official ANT SDK doc
428
469
  # The values in this message seem to be related to the activity history.
429
470
  # If no HRM is used, most of them are 0. Fields 4, 7, 9 and 10 always have
@@ -442,6 +483,13 @@ module Fit4Ruby
442
483
  field 10, 'uint16', 'undocumented_field_10' # always seems to be 340
443
484
  field 11, 'enum', 'undocumented_field_11'
444
485
  field 12, 'enum', 'undocumented_field_12'
486
+ field 13, 'uint8', 'undocumented_field_13'
487
+ field 14, 'uint16', 'undocumented_field_14'
488
+ field 15, 'uint16', 'undocumented_field_15'
489
+ field 16, 'uint16', 'undocumented_field_16'
490
+ field 17, 'sint8', 'undocumented_field_17'
491
+ field 18, 'uint8', 'undocumented_field_18'
492
+ field 19, 'uint8', 'undocumented_field_19'
445
493
  field 253, 'uint32', 'timestamp', :type => 'date_time'
446
494
 
447
495
  # Not part of the official ANT SDK doc
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = RR_Intervals.rb -- Fit4Ruby - FIT file processing library for Ruby
5
+ #
6
+ # Copyright (c) 2015 by Chris Schlaeger <cs@taskjuggler.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ require 'fit4ruby/FitDataRecord'
14
+
15
+ module Fit4Ruby
16
+
17
+ # The Heart Rate Variability or HRV data is contained in message number 78.
18
+ # It is an array of values that represent the time in seconds since the
19
+ # previous heart beat (R-R interval).
20
+ class HRV < FitDataRecord
21
+
22
+ def initialize(field_values = {})
23
+ super('hrv')
24
+ set_field_values(field_values)
25
+ end
26
+
27
+ def check(index)
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
data/lib/fit4ruby/Log.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Log.rb -- Fit4Ruby - FIT file processing library for Ruby
5
5
  #
6
- # Copyright (c) 2014 by Chris Schlaeger <cs@taskjuggler.org>
6
+ # Copyright (c) 2015 by Chris Schlaeger <cs@taskjuggler.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
@@ -30,6 +30,17 @@ module Fit4Ruby
30
30
 
31
31
  @@logger = Logger.new(STDOUT)
32
32
 
33
+ # Redirect all log messages to the given IO.
34
+ # @param io [IO] Output file descriptor
35
+ def open(io)
36
+ begin
37
+ @@logger = Logger.new(io)
38
+ rescue => e
39
+ @@logger = Logger.new(STDERR)
40
+ Log.fatal "Cannot open log file: #{e.message}"
41
+ end
42
+ end
43
+
33
44
  # Pass all calls to unknown methods to the @@logger object.
34
45
  def method_missing(method, *args, &block)
35
46
  @@logger.send(method, *args, &block)
@@ -42,8 +53,8 @@ module Fit4Ruby
42
53
 
43
54
  # Print an error message via the Logger and raise and Fit4Ruby::Error.
44
55
  # code 1.
45
- def fatal(msg)
46
- @@logger.error(msg)
56
+ def fatal(msg, &block)
57
+ @@logger.error(msg, &block)
47
58
  raise Error, msg
48
59
  end
49
60
 
@@ -1,4 +1,4 @@
1
1
  module Fit4Ruby
2
2
  # The version number of the library.
3
- VERSION = '0.0.8'
3
+ VERSION = '0.0.9'
4
4
  end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fit4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Schlaeger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-26 00:00:00.000000000 Z
11
+ date: 2016-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: yard
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.8.7
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.8.7
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 0.9.6
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
54
  version: 0.9.6
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.6.4
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.6.4
69
69
  description: |
@@ -106,6 +106,7 @@ files:
106
106
  - lib/fit4ruby/GlobalFitDictionaries.rb
107
107
  - lib/fit4ruby/GlobalFitMessage.rb
108
108
  - lib/fit4ruby/GlobalFitMessages.rb
109
+ - lib/fit4ruby/HRV.rb
109
110
  - lib/fit4ruby/Lap.rb
110
111
  - lib/fit4ruby/Log.rb
111
112
  - lib/fit4ruby/Monitoring.rb
@@ -135,17 +136,17 @@ require_paths:
135
136
  - lib
136
137
  required_ruby_version: !ruby/object:Gem::Requirement
137
138
  requirements:
138
- - - '>='
139
+ - - ">="
139
140
  - !ruby/object:Gem::Version
140
141
  version: '2.0'
141
142
  required_rubygems_version: !ruby/object:Gem::Requirement
142
143
  requirements:
143
- - - '>='
144
+ - - ">="
144
145
  - !ruby/object:Gem::Version
145
146
  version: '0'
146
147
  requirements: []
147
148
  rubyforge_project:
148
- rubygems_version: 2.0.3
149
+ rubygems_version: 2.2.2
149
150
  signing_key:
150
151
  specification_version: 4
151
152
  summary: Library to read GARMIN FIT files.