This library aims to read from wide range of FIT files, generated by different devices. We do follow the C# implementation from the official SDK. This repo has been forked from fit4ruby. All the credit should go Chris.
Devices used to test:
- Garmin fēnix® 5
- Garmin fēnix® 5s
Our goal is to read FIT files from Garmin, Suunto and Polar.
This library is developed and tested on Mac OS and runs on several linux distributions (including Alpine docker images), using Ruby 2.6.x (MRI).
Other operating systems that are supported by Ruby 2.0 may probably work as well.
a = Fit.read('TEST.FIT')
Then you can access the data in the file.
a.records.each do |r|
puts "Latitude: #{r['position_lat']}"
puts "Longitude: #{r['position_long']}"
end
require 'fit'
a = Fit::Activity.new
a.total_timer_time = 30 * 60
a.new_user_profile({ :age => 33, :height => 1.78, :weight => 73.0,
:gender => 'male', :activity_class => 4.0,
:max_hr => 178 })
a.new_event({ :event => 'timer', :event_type => 'start_time' })
a.new_device_info({ :device_index => 0 })
a.new_device_info({ :device_index => 1, :battery_status => 'ok' })
ts = Time.now
0.upto(a.total_timer_time / 60) do |mins|
ts += 60
a.new_record({
:timestamp => ts,
:position_lat => 51.5512 - mins * 0.0008,
:position_long => 11.647 + mins * 0.002,
:distance => 200.0 * mins,
:altitude => 100 + mins * 2,
:speed => 3.1,
:vertical_oscillation => 9 + mins * 0.02,
:stance_time => 235.0 * mins * 0.01,
:stance_time_percent => 32.0,
:heart_rate => 140 + mins,
:cadence => 75,
:activity_type => 'running',
:fractional_cadence => (mins % 2) / 2.0
})
if mins > 0 && mins % 5 == 0
a.new_lap({ :timestamp => ts })
end
end
a.new_session({ :timestamp => ts })
a.new_event({ :timestamp => ts, :event => 'recovery_time',
:event_type => 'marker',
:data => 2160 })
a.new_event({ :timestamp => ts, :event => 'vo2max',
:event_type => 'marker', :data => 52 })
a.new_event({ :timestamp => ts, :event => 'timer',
:event_type => 'stop_all' })
a.new_device_info({ :timestamp => ts, :device_index => 0 })
ts += 1
a.new_device_info({ :timestamp => ts, :device_index => 1,
:battery_status => 'low' })
ts += 120
a.new_event({ :timestamp => ts, :event => 'recovery_hr',
:event_type => 'marker', :data => 132 })
Now you can have the accumulated data for laps and sessions computed.
a.aggregate
Save it to a file.
Fit.write('TEST.FIT', a)
Please see lib/fit/GlobalFitMessages.rb for the data fields that are supported for the various FIT record types.
See COPYING file.