Fit4Ruby

Fit4Ruby is a Ruby libary to read and write FIT files. It is currently only tested with FIT files generated by the Garmin Forerunner 620.

This libary is still work in progress and probably not yet ready to be used in your application. However, you are welcome to try it and send me comments and patches.

Usage

You can create an Activity.

require 'fit4ruby'

a = Fit4Ruby::Activity.new
a.total_timer_time = 30 * 60
a.({ :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 * 0.5,
    :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.

Fit4Ruby.write('TEST.FIT', a)

Or read an Activity from a file.

a = Fit4Ruby.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

Please see lib/fit4ruby/GlobalFitMessages.rb for the data fields that are supported for the various FIT record types.

License

See COPYING file.