summaryrefslogtreecommitdiff
path: root/lib/postrunner/DataSources.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/postrunner/DataSources.rb')
-rw-r--r--lib/postrunner/DataSources.rb100
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/postrunner/DataSources.rb b/lib/postrunner/DataSources.rb
new file mode 100644
index 0000000..01ed9a8
--- /dev/null
+++ b/lib/postrunner/DataSources.rb
@@ -0,0 +1,100 @@
+#!/usr/bin/env ruby -w
+# encoding: UTF-8
+#
+# = DataSources.rb -- PostRunner - Manage the data from your Garmin sport devices.
+#
+# Copyright (c) 2015 by Chris Schlaeger <cs@taskjuggler.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of version 2 of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+
+require 'fit4ruby'
+
+require 'postrunner/FlexiTable'
+require 'postrunner/ViewFrame'
+require 'postrunner/DeviceList'
+
+module PostRunner
+
+ # The DataSources objects can generate a table that lists all the data
+ # sources in chronological order that were in use during a workout.
+ class DataSources
+
+ include Fit4Ruby::Converters
+
+ # Create a DataSources object.
+ # @param activity [Activity] The activity to analyze.
+ # @param unit_system [Symbol] The unit system to use (:metric or
+ # :imperial )
+ def initialize(activity, unit_system)
+ @activity = activity
+ @fit_activity = activity.fit_activity
+ @unit_system = unit_system
+ end
+
+ def to_s
+ data_sources.to_s
+ end
+
+ def to_html(doc)
+ ViewFrame.new("Data Sources", 1210, data_sources).to_html(doc)
+ end
+
+ private
+
+ def data_sources
+ session = @fit_activity.sessions[0]
+
+ t = FlexiTable.new
+ t.enable_frame(false)
+ t.body
+ t.row([ 'Time', 'Distance', 'Mode', 'Distance', 'Speed',
+ 'Cadence', 'Elevation', 'Heart Rate', 'Power', 'Calories' ])
+ start_time = session.start_time
+ @fit_activity.data_sources.each do |source|
+ t.cell(secsToHMS(source.timestamp - start_time))
+ t.cell(distance(source.timestamp))
+ t.cell(source.mode)
+ t.cell(device_name(source.distance))
+ t.cell(device_name(source.speed))
+ t.cell(device_name(source.cadence))
+ t.cell(device_name(source.elevation))
+ t.cell(device_name(source.heart_rate))
+ t.cell(device_name(source.power))
+ t.cell(device_name(source.calories))
+ t.new_row
+ end
+
+ t
+ end
+
+ def device_name(index)
+ @fit_activity.device_infos.each do |device|
+ if device.device_index == index
+ return (DeviceList::DeviceTypeNames[device.device_type] ||
+ device.device_type) + " [#{device.device_index}]"
+ end
+ end
+
+ ''
+ end
+
+ def distance(timestamp)
+ @fit_activity.records.each do |record|
+ if record.timestamp >= timestamp
+ unit = { :metric => 'km', :statute => 'mi'}[@unit_system]
+ value = record.get_as('distance', unit)
+ return '-' unless value
+ return "#{'%.2f %s' % [value, unit]}"
+ end
+ end
+
+ '-'
+ end
+
+ end
+
+end
+