postrunner 0.4.0 → 0.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/postrunner/DailySleepAnalyzer.rb +3 -1
- data/lib/postrunner/EventList.rb +20 -2
- data/lib/postrunner/FitFileStore.rb +29 -22
- data/lib/postrunner/Main.rb +2 -2
- data/lib/postrunner/MonitoringStatistics.rb +29 -8
- data/lib/postrunner/version.rb +1 -1
- data/postrunner.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9758b2893a319550c0ee7f653680bf2ccca06c32
|
4
|
+
data.tar.gz: 074ef7f186b98726a3519bd9c2c94d05d60ab7e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f2dfbc2814b86b58260b5ee431903b4cc784bfe3edac8b9f59204a10ffa238e4a7e372ca47e5fb9cf63266d50b9d3ef00ff4aa8fca043c27463100f1624630b
|
7
|
+
data.tar.gz: f19618a36b8b04c73ef7292b659e40fa5c7703a15e6e0163fad5fcb5a338378bbc6e637d471eb6f9507e4313db2224225111a8d2a81e1915fc00f972ca9b85fc
|
@@ -487,7 +487,9 @@ module PostRunner
|
|
487
487
|
def determine_resting_heart_rate
|
488
488
|
# Find the smallest heart rate. TODO: While being awake.
|
489
489
|
@heart_rate.each_with_index do |heart_rate, idx|
|
490
|
-
next unless heart_rate && heart_rate > 0
|
490
|
+
next unless heart_rate && heart_rate > 0 &&
|
491
|
+
@activity_type[idx] != :resting
|
492
|
+
|
491
493
|
if @resting_heart_rate.nil? || @resting_heart_rate > heart_rate
|
492
494
|
@resting_heart_rate = heart_rate
|
493
495
|
end
|
data/lib/postrunner/EventList.rb
CHANGED
@@ -96,10 +96,10 @@ module PostRunner
|
|
96
96
|
value = event.speed_low_alert
|
97
97
|
when 'cad_high_alert'
|
98
98
|
name = 'Cadence high alert'
|
99
|
-
value = "#{event.cad_high_alert} spm"
|
99
|
+
value = "#{2 * event.cad_high_alert} spm"
|
100
100
|
when 'cad_low_alert'
|
101
101
|
name = 'Cadence low alert'
|
102
|
-
value = "#{event.cad_low_alert} spm"
|
102
|
+
value = "#{2 * event.cad_low_alert} spm"
|
103
103
|
when 'power_high_alert'
|
104
104
|
name = 'Power high alert'
|
105
105
|
value = event.power_high_alert
|
@@ -134,6 +134,12 @@ module PostRunner
|
|
134
134
|
when 'vo2max'
|
135
135
|
name = 'VO2Max'
|
136
136
|
value = event.vo2max
|
137
|
+
when 'lactate_threshold_heart_rate'
|
138
|
+
name = 'Lactate Threshold Heart Rate'
|
139
|
+
value = "#{event.lactate_threshold_heart_rate} bpm"
|
140
|
+
when 'lactate_threshold_speed'
|
141
|
+
name = 'Lactate Threshold Pace'
|
142
|
+
value = pace(event, 'lactate_threshold_speed')
|
137
143
|
else
|
138
144
|
name = event.event
|
139
145
|
value = event.data
|
@@ -143,6 +149,18 @@ module PostRunner
|
|
143
149
|
table.cell(value)
|
144
150
|
end
|
145
151
|
|
152
|
+
def pace(fdr, field, show_unit = true)
|
153
|
+
speed = fdr.get(field)
|
154
|
+
case @unit_system
|
155
|
+
when :metric
|
156
|
+
"#{speedToPace(speed)}#{show_unit ? ' min/km' : ''}"
|
157
|
+
when :statute
|
158
|
+
"#{speedToPace(speed, 1609.34)}#{show_unit ? ' min/mi' : ''}"
|
159
|
+
else
|
160
|
+
Log.fatal "Unknown unit system #{@unit_system}"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
146
164
|
end
|
147
165
|
|
148
166
|
end
|
@@ -211,6 +211,23 @@ module PostRunner
|
|
211
211
|
list.sort
|
212
212
|
end
|
213
213
|
|
214
|
+
# Read in all Monitoring_B FIT files that overlap with the given interval.
|
215
|
+
# @param start_date [Time] Interval start time
|
216
|
+
# @param end_date [Time] Interval end date
|
217
|
+
# @return [Array of Monitoring_B] Content of Monitoring_B FIT files
|
218
|
+
def monitorings(start_date, end_date)
|
219
|
+
monitorings = []
|
220
|
+
@store['devices'].each do |id, device|
|
221
|
+
monitorings += device.monitorings(start_date.gmtime, end_date.gmtime)
|
222
|
+
end
|
223
|
+
|
224
|
+
monitorings.reverse.map do |m|
|
225
|
+
read_fit_file(File.join(fit_file_dir(m.fit_file_name, m.device.long_uid,
|
226
|
+
'monitor'), m.fit_file_name))
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
|
214
231
|
# Return the reference index of the given FFS_Activity.
|
215
232
|
# @param activity [FFS_Activity]
|
216
233
|
# @return [Fixnum] Reference index as used in the UI
|
@@ -320,7 +337,6 @@ module PostRunner
|
|
320
337
|
end
|
321
338
|
|
322
339
|
def daily_report(day)
|
323
|
-
monitorings = []
|
324
340
|
# 'day' specifies the current day. But we don't know what timezone the
|
325
341
|
# watch was set to for a given date. The files are always named after
|
326
342
|
# the moment of finishing the recording expressed as GMT time.
|
@@ -328,17 +344,12 @@ module PostRunner
|
|
328
344
|
# file. Recording is always flipped to a new file at midnight GMT but
|
329
345
|
# there are usually multiple files per GMT day.
|
330
346
|
day_as_time = Time.parse(day).gmtime
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
end
|
338
|
-
monitoring_files = monitorings.reverse.map do |m|
|
339
|
-
read_fit_file(File.join(fit_file_dir(m.fit_file_name, m.device.long_uid,
|
340
|
-
'monitor'), m.fit_file_name))
|
341
|
-
end
|
347
|
+
# To get weekly intensity minutes we need 7 days of data prior to the
|
348
|
+
# current date and 1 day after to include the following night. We add
|
349
|
+
# at least 12 extra hours to accomodate time zone changes.
|
350
|
+
monitoring_files = monitorings(day_as_time - 8 * 24 * 60 * 60,
|
351
|
+
day_as_time + 36 * 60 * 60)
|
352
|
+
|
342
353
|
puts MonitoringStatistics.new(monitoring_files).daily(day)
|
343
354
|
end
|
344
355
|
|
@@ -352,16 +363,12 @@ module PostRunner
|
|
352
363
|
# to a new file at midnight GMT but there are usually multiple files per
|
353
364
|
# GMT day.
|
354
365
|
day_as_time = Time.parse(day).gmtime
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
monitoring_files = monitorings.sort.map do |m|
|
362
|
-
read_fit_file(File.join(fit_file_dir(m.fit_file_name, m.device.long_uid,
|
363
|
-
'monitor'), m.fit_file_name))
|
364
|
-
end
|
366
|
+
# To get weekly intensity minutes we need 7 days of data prior to the
|
367
|
+
# current month start and 1 after to inclide the following night. We add
|
368
|
+
# at least 12 extra hours to accomondate time zone changes.
|
369
|
+
monitoring_files = monitorings(day_as_time - 8 * 24 * 60 * 60,
|
370
|
+
day_as_time + 32 * 24 * 60 * 60)
|
371
|
+
|
365
372
|
puts MonitoringStatistics.new(monitoring_files).monthly(day)
|
366
373
|
end
|
367
374
|
|
data/lib/postrunner/Main.rb
CHANGED
@@ -154,7 +154,7 @@ EOT
|
|
154
154
|
Log.level = Logger::DEBUG
|
155
155
|
end
|
156
156
|
opts.on('-h', '--help', 'Show this message') do
|
157
|
-
$
|
157
|
+
$stdout.puts opts
|
158
158
|
return nil
|
159
159
|
end
|
160
160
|
opts.on('--version', 'Show version number') do
|
@@ -189,7 +189,7 @@ import [ <fit file> | <directory> ]
|
|
189
189
|
previous import is being used.
|
190
190
|
|
191
191
|
list
|
192
|
-
List all FIT files stored in the
|
192
|
+
List all FIT files stored in the database.
|
193
193
|
|
194
194
|
monthly [ <YYYY-MM-DD> ]
|
195
195
|
|
@@ -197,11 +197,12 @@ module PostRunner
|
|
197
197
|
t = FlexiTable.new
|
198
198
|
left = { :halign => :left }
|
199
199
|
right = { :halign => :right }
|
200
|
-
t.set_column_attributes([ left ] + [ right ] *
|
200
|
+
t.set_column_attributes([ left ] + [ right ] * 10)
|
201
201
|
t.head
|
202
|
-
t.row([ 'Day', 'Steps', '%', 'Goal', '
|
203
|
-
'Floors', '% of
|
204
|
-
t.row([ '', '', '', '', 'Minutes', '
|
202
|
+
t.row([ 'Day', 'Steps', '% of', 'Goal', 'Wk. Int.', '% of',
|
203
|
+
'Floors', '% of', 'Floors', 'Dist.', 'Cals.' ])
|
204
|
+
t.row([ '', '', 'Goal', 'Steps', 'Minutes', '150', 'clmbd.', '10',
|
205
|
+
'descd.', 'km', 'kCal' ])
|
205
206
|
t.body
|
206
207
|
totals = Hash.new(0)
|
207
208
|
counted_days = 0
|
@@ -238,9 +239,23 @@ module PostRunner
|
|
238
239
|
|
239
240
|
floors = analyzer.total_floors
|
240
241
|
floors_climbed = floors[:floors_climbed]
|
241
|
-
totals[:
|
242
|
+
totals[:floors_climbed] += floors_climbed
|
242
243
|
t.cell(floors_climbed)
|
243
244
|
t.cell(percent(floors_climbed, 10))
|
245
|
+
|
246
|
+
floors_descended = floors[:floors_descended]
|
247
|
+
totals[:floors_descended] += floors_descended
|
248
|
+
t.cell(floors_descended)
|
249
|
+
|
250
|
+
|
251
|
+
distance = steps_distance_calories[:distance]
|
252
|
+
totals[:distance] += distance
|
253
|
+
t.cell(distance.to_i)
|
254
|
+
|
255
|
+
calories = steps_distance_calories[:calories]
|
256
|
+
totals[:calories] += calories
|
257
|
+
t.cell(calories.to_i)
|
258
|
+
|
244
259
|
t.new_row
|
245
260
|
counted_days += 1
|
246
261
|
end
|
@@ -252,8 +267,11 @@ module PostRunner
|
|
252
267
|
t.cell(totals[:steps_goal])
|
253
268
|
t.cell(totals[:intensity_minutes].to_i)
|
254
269
|
t.cell('')
|
255
|
-
t.cell(totals[:
|
270
|
+
t.cell(totals[:floors_climbed])
|
256
271
|
t.cell('')
|
272
|
+
t.cell(totals[:floors_descended])
|
273
|
+
t.cell(totals[:distance].to_i)
|
274
|
+
t.cell(totals[:calories].to_i)
|
257
275
|
t.new_row
|
258
276
|
|
259
277
|
if counted_days > 0
|
@@ -263,8 +281,11 @@ module PostRunner
|
|
263
281
|
t.cell((totals[:steps_goal] / counted_days).to_i)
|
264
282
|
t.cell((totals[:intensity_minutes] / counted_days).to_i)
|
265
283
|
t.cell(percent(totals[:intensity_minutes], (counted_days / 7.0) * 150))
|
266
|
-
t.cell((totals[:
|
284
|
+
t.cell((totals[:floors_climbed] / counted_days).to_i)
|
267
285
|
t.cell(percent(totals[:floors] / counted_days, 10))
|
286
|
+
t.cell((totals[:floors_descended] / counted_days).to_i)
|
287
|
+
t.cell('%.0f' % (totals[:distance] / counted_days))
|
288
|
+
t.cell((totals[:calories] / counted_days).to_i)
|
268
289
|
end
|
269
290
|
|
270
291
|
t
|
@@ -354,7 +375,7 @@ module PostRunner
|
|
354
375
|
ma.intensity_minutes[:moderate_minutes] +
|
355
376
|
2 * ma.intensity_minutes[:vigorous_minutes]
|
356
377
|
|
357
|
-
break if
|
378
|
+
break if date.wday == @first_day_of_week
|
358
379
|
end
|
359
380
|
end
|
360
381
|
|
data/lib/postrunner/version.rb
CHANGED
data/postrunner.gemspec
CHANGED
@@ -27,7 +27,7 @@ should work on other operating systems as well.}
|
|
27
27
|
spec.require_paths = ["lib"]
|
28
28
|
spec.required_ruby_version = '>=2.0'
|
29
29
|
|
30
|
-
spec.add_dependency 'fit4ruby', '~> 1.
|
30
|
+
spec.add_dependency 'fit4ruby', '~> 1.2.0'
|
31
31
|
spec.add_dependency 'perobs', '~> 2.2'
|
32
32
|
spec.add_dependency 'nokogiri', '~> 1.6'
|
33
33
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postrunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.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: 2016-
|
11
|
+
date: 2016-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fit4ruby
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.2.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
|
-
version: 1.
|
26
|
+
version: 1.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: perobs
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|