Skip to content
This repository has been archived by the owner on Aug 25, 2023. It is now read-only.

spurtli/fit

Repository files navigation

Fit

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.

Supported devices

Devices used to test:

  • Garmin fēnix® 5
  • Garmin fēnix® 5s

Our goal is to read FIT files from Garmin, Suunto and Polar.

Supported Operating Systems

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.

Usage

Read an Activity from a file.

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

You can create an Activity.

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.

License

See COPYING file.

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages