fit4ruby 0.0.8 → 0.0.9

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