fit-parser 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.md +27 -0
  7. data/Rakefile +2 -0
  8. data/fit.gemspec +30 -0
  9. data/lib/fit.rb +23 -0
  10. data/lib/fit/file.rb +29 -0
  11. data/lib/fit/file/data.rb +99 -0
  12. data/lib/fit/file/definition.rb +120 -0
  13. data/lib/fit/file/definitions.rb +705 -0
  14. data/lib/fit/file/header.rb +18 -0
  15. data/lib/fit/file/record.rb +37 -0
  16. data/lib/fit/file/record_header.rb +27 -0
  17. data/lib/fit/file/type.rb +41 -0
  18. data/lib/fit/file/types.rb +954 -0
  19. data/lib/fit/version.rb +3 -0
  20. data/spec/file/data_spec.rb +111 -0
  21. data/spec/file/definition_spec.rb +26 -0
  22. data/spec/file/definitions_spec.rb +81 -0
  23. data/spec/file/header_spec.rb +28 -0
  24. data/spec/file/record_header_spec.rb +20 -0
  25. data/spec/file/record_spec.rb +56 -0
  26. data/spec/file/type_spec.rb +99 -0
  27. data/spec/file/types_spec.rb +100 -0
  28. data/spec/file_spec.rb +21 -0
  29. data/spec/fit_spec.rb +10 -0
  30. data/spec/spec_helper.rb +19 -0
  31. data/spec/support/examples/file/full_file_with_wrong_crc.fit +0 -0
  32. data/spec/support/examples/file/header +0 -0
  33. data/spec/support/examples/file/header_14b.fit +0 -0
  34. data/spec/support/examples/record/data_record_2.fit +0 -0
  35. data/spec/support/examples/record/data_record_2bis.fit +0 -0
  36. data/spec/support/examples/record/definition_record +0 -0
  37. data/spec/support/examples/record/definition_record_2.fit +0 -0
  38. data/spec/support/examples/record/message/data_dynamic_fields.fit +0 -0
  39. data/spec/support/examples/record/message/data_field_array.fit +0 -0
  40. data/spec/support/examples/record/message/data_file_capabilities_activities.fit +0 -0
  41. data/spec/support/examples/record/message/data_file_capabilities_settings.fit +0 -0
  42. data/spec/support/examples/record/message/definition +0 -0
  43. data/spec/support/examples/record/message/definition_dynamic_fields.fit +0 -0
  44. data/spec/support/examples/record/message/definition_field_array.fit +0 -0
  45. data/spec/support/examples/record/message/definition_file_capabilities.fit +0 -0
  46. data/spec/support/examples/record/normal_header +1 -0
  47. metadata +228 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a64b20cfef0af6c8a870b8f6ff14089305cd9c59
4
+ data.tar.gz: cceb35dd56050fc6a027538381f28a32c1add0fd
5
+ SHA512:
6
+ metadata.gz: 0b8874a3a4ea197ee232a1a83c9e092692928dcc2095acb641cb2199779c935baff30b4a34028c07d266a33e9ecf6d1a799bcc3527a7f648637b59545ee0ef8f
7
+ data.tar.gz: eec35ccf55acff6491ffc85889ec311cfa918e17dfcb8d8d2023e11f235b063a5b1a0693903195c50365d4f5519d70b3f9fcd0145f1dccfeacf3bf454b3027c8
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fit.gemspec
4
+ gemspec
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Jeff Wallace
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,27 @@
1
+ # fit
2
+
3
+ A ruby gem for parsing [fit files](http://www.thisisant.com/pages/products/fit-sdk). It makes heavy use of the [bindata gem](http://bindata.rubyforge.org/).
4
+
5
+ ## Example usage
6
+
7
+ ```ruby
8
+ require 'fit'
9
+
10
+ fit_file = Fit.load_file(ARGV[0])
11
+
12
+ records = fit_file.records.select{ |r| r.content.record_type != :definition }.map{ |r| r.content }
13
+ ```
14
+
15
+ ## Contributing to fit
16
+
17
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
18
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
19
+ * Fork the project
20
+ * Start a feature/bugfix branch
21
+ * Commit and push until you are happy with your contribution
22
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
23
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
24
+
25
+ ## Copyright
26
+
27
+ Copyright (c) 2011 Jeff Wallace. See LICENSE.txt for further details.
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fit/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "fit-parser"
8
+ spec.version = Fit::VERSION
9
+ spec.authors = ["Jeff Wallace"]
10
+ spec.email = ["jeff@tjwallace.ca"]
11
+ spec.description = %q{Ruby gem for reading Garmin FIT files}
12
+ spec.summary = %q{Ruby gem for reading Garmin FIT files}
13
+ spec.homepage = "https://github.com/tjwallace/fit"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "bindata", "~> 2.1.0"
22
+ spec.add_dependency "activesupport", "~> 4.2.0"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec", "~> 3.2.0"
27
+ spec.add_development_dependency "rspec-its"
28
+ spec.add_development_dependency "simplecov"
29
+ spec.add_development_dependency "pry"
30
+ end
@@ -0,0 +1,23 @@
1
+ require 'bindata'
2
+ require 'active_support'
3
+ require 'active_support/core_ext/class'
4
+
5
+ require 'fit/file'
6
+ require 'fit/file/header'
7
+ require 'fit/file/record'
8
+ require 'fit/file/record_header'
9
+ require 'fit/file/types'
10
+ require 'fit/file/type'
11
+ require 'fit/file/definition'
12
+ require 'fit/file/data'
13
+ require 'fit/file/definitions'
14
+
15
+ require 'fit/version'
16
+
17
+ module Fit
18
+
19
+ def self.load_file(path)
20
+ File.read ::File.open(path)
21
+ end
22
+
23
+ end
@@ -0,0 +1,29 @@
1
+ module Fit
2
+ class File
3
+
4
+ def self.read(io)
5
+ new.read(io)
6
+ end
7
+
8
+ attr_reader :header, :records, :crc
9
+
10
+ def initialize
11
+ @records = []
12
+ end
13
+
14
+ def read(io)
15
+ @header = Header.read(io)
16
+
17
+ Record.clear_definitions!
18
+
19
+ while io.pos < @header.end_pos
20
+ @records << Record.read(io)
21
+ end
22
+
23
+ @crc = io.read(2)
24
+
25
+ self
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,99 @@
1
+ module Fit
2
+ class File
3
+ class Data < BinData::Record
4
+
5
+ class_attribute :global_message_number, :instance_writer => false
6
+
7
+ def self.generate(definition)
8
+ msg_num = definition.global_message_number.snapshot
9
+ type = Definitions.get_name(msg_num) || "data_record_#{msg_num}"
10
+
11
+ Class.new(self) do
12
+ self.global_message_number = msg_num
13
+
14
+ endian definition.endianness
15
+
16
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
17
+ def record_type
18
+ :#{type}
19
+ end
20
+ RUBY
21
+
22
+ definition.fields.each do |field|
23
+ code = ""
24
+
25
+ # in case the field size is a multiple of the field length, we must build an array
26
+ if (field.type != "string" and field.size > field.length)
27
+ code << "array :#{field.raw_name}, :type => :#{field.type}, :initial_length => #{field.size/field.length}\n"
28
+ else
29
+ # string are not null terminated when they have exactly the lenght of the field
30
+ code << "#{field.type} :#{field.raw_name}"
31
+ if field.type == "string"
32
+ code << ", :read_length => #{field.size}, :trim_padding => true"
33
+ end
34
+ code << "\n"
35
+ end
36
+
37
+ code << "def #{field.name}\n"
38
+
39
+ if field.scale && field.scale != 1
40
+ code << "scale = #{field.scale.inspect}.0\n"
41
+ else
42
+ code << "scale = nil\n"
43
+ end
44
+
45
+ if field.dyn_data
46
+ code << "dyn = #{field.dyn_data}\n"
47
+ else
48
+ code << "dyn = nil\n"
49
+ end
50
+ code << <<-RUBY
51
+ get_value #{field.raw_name}.snapshot, '#{field.real_type}', scale, dyn
52
+ end
53
+ RUBY
54
+
55
+ class_eval code , __FILE__, __LINE__ + 1
56
+ end
57
+
58
+ private
59
+ # return the dynamic value if relevant
60
+ # otherwise, it returns value (scaled if necessary)
61
+ def get_value raw_value, raw_type, raw_scale, dyn_data
62
+ val = get_dyn_value(dyn_data, raw_value)
63
+ return val unless val.nil?
64
+ if raw_scale
65
+ if raw_value.is_a? Enumerable
66
+ raw_value.map { |elt| elt / raw_scale }
67
+ else
68
+ raw_value / raw_scale
69
+ end
70
+ else
71
+ get_real_value raw_type, raw_value
72
+ end
73
+ end
74
+
75
+ # return the value based on real type
76
+ def get_real_value( real_type, raw_value)
77
+ type = Type.get_type(real_type.to_sym)
78
+ # TODO: manage case where an array is returned
79
+ type ? type.value(raw_value) : raw_value
80
+ end
81
+
82
+ def get_dyn_value dyn_data, raw_value
83
+ return nil if dyn_data.nil?
84
+ dyn_data.each do |key, dyn|
85
+ # make sure method exist before calling send (all fields are not always defined)
86
+ if( self.respond_to?("raw_#{dyn[:ref_field_name]}") &&
87
+ dyn[:ref_field_values].include?(self.send("raw_#{dyn[:ref_field_name]}")))
88
+ return get_real_value(dyn[:type], raw_value)
89
+ end
90
+ end
91
+ nil
92
+ end
93
+
94
+ end
95
+ end
96
+
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,120 @@
1
+ module Fit
2
+ class File
3
+ class Definition < BinData::Record
4
+
5
+ class Field < BinData::Record
6
+ hide :reserved_bits
7
+
8
+ uint8 :field_definition_number
9
+ uint8 :field_size
10
+ bit1 :endian_ability
11
+ bit2 :reserved_bits
12
+ bit5 :base_type_number
13
+
14
+ def data
15
+ @data ||= Definitions.get_field(parent.parent.global_message_number.snapshot,
16
+ field_definition_number.snapshot) ||
17
+ { :name => "field_#{field_definition_number.snapshot}", :scale => nil }
18
+ end
19
+
20
+ def dyn_data
21
+ @dyn_data ||= Definitions.get_dynamic_fields(parent.parent.global_message_number.snapshot,
22
+ field_definition_number.snapshot)
23
+ end
24
+
25
+ def name
26
+ data[:name]
27
+ end
28
+
29
+ def raw_name
30
+ "raw_#{name}"
31
+ end
32
+
33
+ def scale
34
+ data[:scale]
35
+ end
36
+
37
+ def real_type
38
+ data[:type]
39
+ end
40
+
41
+ def type
42
+ case base_type_number.snapshot
43
+ when 0 # enum
44
+ build_int_type 8, false
45
+ when 1
46
+ build_int_type 8, true
47
+ when 2
48
+ build_int_type 8, false
49
+ when 3
50
+ build_int_type 16, true
51
+ when 4
52
+ build_int_type 16, false
53
+ when 5
54
+ build_int_type 32, true
55
+ when 6
56
+ build_int_type 32, false
57
+ when 7
58
+ # some cases found where string has the max field length
59
+ # and is therefore not null terminated
60
+ @length = 1
61
+ "string"
62
+ when 8
63
+ @length = 4
64
+ "float"
65
+ when 9
66
+ @length = 8
67
+ "double"
68
+ when 10 # uint8z
69
+ build_int_type 8, false
70
+ when 11 # uint16z
71
+ build_int_type 16, false
72
+ when 12 # uint32z
73
+ build_int_type 32, false
74
+ when 13 # array of bytes
75
+ build_int_type 8, false
76
+ else
77
+ raise "Can't map base_type_number #{base_type_number} to a data type"
78
+ end
79
+ end
80
+
81
+ # field_size is in byte
82
+ def size
83
+ field_size
84
+ end
85
+
86
+ # return the length in byte of the given type
87
+ def length
88
+ @length
89
+ end
90
+
91
+ private
92
+
93
+ def build_int_type(length, signed)
94
+ # @length is in byte not in bits, so divide by 8
95
+ @length = length/8
96
+ (signed ? '' : 'u') << 'int' << length.to_s
97
+ end
98
+ end
99
+
100
+ skip :length => 1
101
+ bit8 :architecture
102
+ choice :global_message_number, :selection => :architecture do
103
+ uint16le 0
104
+ uint16be 1
105
+ end
106
+ bit8 :field_count
107
+ array :fields, :type => Field, :initial_length => :field_count
108
+
109
+ def endianness
110
+ architecture.snapshot == 0 ? :little : :big
111
+ end
112
+
113
+ def record_type
114
+ :definition
115
+ end
116
+
117
+ end
118
+ end
119
+ end
120
+
@@ -0,0 +1,705 @@
1
+ module Fit
2
+ class File
3
+ module Definitions
4
+
5
+ @@fields = Hash.new{ |h,k| h[k]= {} }
6
+ @@dyn_fields = Hash.new{ |h,k| h[k]= {} }
7
+ @@names = Hash.new
8
+
9
+ class << self
10
+ def add_field(global_msg_num, field_def_num, name, options = {})
11
+ if @@fields[global_msg_num].has_key? field_def_num
12
+ raise "bad definition of dynamic field (#{name}) without :ref_field_name or :ref_field_values" unless options.has_key?(:ref_field_name) && options.has_key?(:ref_field_values)
13
+ @@dyn_fields[global_msg_num][field_def_num] ||= {}
14
+ @@dyn_fields[global_msg_num][field_def_num][name.to_sym] = options
15
+ # let's put the ref_field_values with the raw_value instead of the real value
16
+ type = Types.get_type_definition(options[:ref_field_name].to_sym) if options[:ref_field_name]
17
+ # basic types are not found and returns nil (also some rspec dummy tests)
18
+ if type
19
+ type = type[:values].invert
20
+ @@dyn_fields[global_msg_num][field_def_num][name.to_sym][:ref_field_values] = options[:ref_field_values].map { |elt| type[elt.to_s] }
21
+ end
22
+ else
23
+ @@fields[global_msg_num][field_def_num] = options.merge(:name => name)
24
+ end
25
+ end
26
+
27
+ def get_field(global_msg_num, field_def_num)
28
+ @@fields[global_msg_num][field_def_num]
29
+ end
30
+
31
+ def get_dynamic_fields(global_msg_num, field_def_num)
32
+ @@dyn_fields[global_msg_num][field_def_num]
33
+ end
34
+
35
+ def add_name(global_msg_num, name)
36
+ @@names[global_msg_num] = name
37
+ end
38
+
39
+ def get_name(global_msg_num)
40
+ @@names[global_msg_num]
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+
48
+ # DATA
49
+ Fit::File::Definitions.add_name 0, 'file_id'
50
+ Fit::File::Definitions.add_field 0, 0, 'type', :type => :file
51
+ Fit::File::Definitions.add_field 0, 1, 'manufacturer', :type => :manufacturer
52
+ Fit::File::Definitions.add_field 0, 2, 'product', :type => :uint16
53
+ Fit::File::Definitions.add_field 0, 2, 'garmin_product', :type => :garmin_product, :ref_field_name => 'manufacturer', :ref_field_values => [:garmin, :dynastream, :dynastream_oem]
54
+ Fit::File::Definitions.add_field 0, 3, 'serial_number', :type => :uint32z
55
+ Fit::File::Definitions.add_field 0, 4, 'time_created', :type => :date_time
56
+ Fit::File::Definitions.add_field 0, 5, 'number', :type => :uint16
57
+
58
+ Fit::File::Definitions.add_name 49, 'file_creator'
59
+ Fit::File::Definitions.add_field 49, 0, 'software_version', :type => :uint16
60
+ Fit::File::Definitions.add_field 49, 1, 'hardware_version', :type => :uint8
61
+
62
+ Fit::File::Definitions.add_name 35, 'software'
63
+ Fit::File::Definitions.add_field 35, 254, 'message_index', :type => :message_index
64
+ Fit::File::Definitions.add_field 35, 3, 'version', :type => :uint16, :scale => 100
65
+ Fit::File::Definitions.add_field 35, 5, 'part_number', :type => :string
66
+
67
+ Fit::File::Definitions.add_name 106, 'slave_device'
68
+ Fit::File::Definitions.add_field 106, 0, 'manufacturer', :type => :manufacturer
69
+ Fit::File::Definitions.add_field 106, 1, 'product', :type => :uint16
70
+ Fit::File::Definitions.add_field 106, 1, 'garmin_product', :type => :garmin_product, :ref_field_name => 'manufacturer', :ref_field_values => [:garmin, :dynastream, :dynastream_oem]
71
+
72
+ Fit::File::Definitions.add_name 1, 'capabilities'
73
+ Fit::File::Definitions.add_field 1, 0, 'languages', :type => :uint8z
74
+ Fit::File::Definitions.add_field 1, 1, 'sports', :type => :sport_bits_0
75
+ Fit::File::Definitions.add_field 1, 21, 'workouts_supported', :type => :workout_capabilities
76
+ Fit::File::Definitions.add_field 1, 23, 'connectivity_supported', :type => :connectivity_capabilities
77
+
78
+ Fit::File::Definitions.add_name 37, 'file_capabilities'
79
+ Fit::File::Definitions.add_field 37, 254, 'message_index', :type => :message_index
80
+ Fit::File::Definitions.add_field 37, 0, 'type', :type => :file
81
+ Fit::File::Definitions.add_field 37, 1, 'flags', :type => :file_flags
82
+ Fit::File::Definitions.add_field 37, 2, 'directory', :type => :string
83
+ Fit::File::Definitions.add_field 37, 3, 'max_count', :type => :uint16
84
+ Fit::File::Definitions.add_field 37, 4, 'max_size', :type => :uint32, :unit => 'bytes'
85
+
86
+ Fit::File::Definitions.add_name 38, 'mesg_capabilities'
87
+ Fit::File::Definitions.add_field 38, 254, 'message_index', :type => :message_index
88
+ Fit::File::Definitions.add_field 38, 0, 'file', :type => :file
89
+ Fit::File::Definitions.add_field 38, 1, 'mesg_num', :type => :mesg_num
90
+ Fit::File::Definitions.add_field 38, 2, 'count_type', :type => :mesg_count
91
+ Fit::File::Definitions.add_field 38, 3, 'count', :type => :uint16
92
+ Fit::File::Definitions.add_field 38, 3, 'num_per_file', :type => :uint16, :ref_field_name => 'count_type', :ref_field_values => [:num_per_file]
93
+ Fit::File::Definitions.add_field 38, 3, 'max_per_file', :type => :uint16, :ref_field_name => 'count_type', :ref_field_values => [:max_per_file]
94
+ Fit::File::Definitions.add_field 38, 3, 'max_per_file_type', :type => :uint16, :ref_field_name => 'count_type', :ref_field_values => [:max_per_file_type]
95
+
96
+ Fit::File::Definitions.add_name 39, 'field_capabilities'
97
+ Fit::File::Definitions.add_field 39, 254, 'message_index', :type => :message_index
98
+ Fit::File::Definitions.add_field 39, 0, 'file', :type => :file
99
+ Fit::File::Definitions.add_field 39, 1, 'mesg_num', :type => :mesg_num
100
+ Fit::File::Definitions.add_field 39, 2, 'field_num', :type => :uint8
101
+ Fit::File::Definitions.add_field 39, 3, 'count', :type => :uint16
102
+
103
+ Fit::File::Definitions.add_name 2, 'device_settings'
104
+ Fit::File::Definitions.add_field 2, 0, 'active_time_zone', :type => :uint8, :scale => 1
105
+ Fit::File::Definitions.add_field 2, 1, 'utc_offset', :type => :uint32
106
+ Fit::File::Definitions.add_field 2, 5, 'time_zone_offset', :type => :sint8, :scale => 4, :unit => 'hr'
107
+
108
+ Fit::File::Definitions.add_name 3, 'user_profile'
109
+ Fit::File::Definitions.add_field 3, 254, 'message_index', :type => :message_index
110
+ Fit::File::Definitions.add_field 3, 0, 'friendly_name', :type => :string, :scale => 1
111
+ Fit::File::Definitions.add_field 3, 1, 'gender', :type => :gender, :scale => 1
112
+ Fit::File::Definitions.add_field 3, 2, 'age', :type => :uint8, :scale => 1, :unit => 'years'
113
+ Fit::File::Definitions.add_field 3, 3, 'height', :type => :uint8, :scale => 100, :unit => 'm'
114
+ Fit::File::Definitions.add_field 3, 4, 'weight', :type => :uint16, :scale => 10, :unit => 'kg'
115
+ Fit::File::Definitions.add_field 3, 5, 'language', :type => :language, :scale => 1
116
+ Fit::File::Definitions.add_field 3, 6, 'elev_setting', :type => :display_measure, :scale => 1
117
+ Fit::File::Definitions.add_field 3, 7, 'weight_setting', :type => :display_measure, :scale => 1
118
+ Fit::File::Definitions.add_field 3, 8, 'resting_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
119
+ Fit::File::Definitions.add_field 3, 9, 'default_max_running_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
120
+ Fit::File::Definitions.add_field 3, 10, 'default_max_biking_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
121
+ Fit::File::Definitions.add_field 3, 11, 'default_max_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
122
+ Fit::File::Definitions.add_field 3, 12, 'hr_setting', :type => :display_heart, :scale => 1
123
+ Fit::File::Definitions.add_field 3, 13, 'speed_setting', :type => :display_measure, :scale => 1
124
+ Fit::File::Definitions.add_field 3, 14, 'dist_setting', :type => :display_measure, :scale => 1
125
+ Fit::File::Definitions.add_field 3, 16, 'power_setting', :type => :display_power, :scale => 1
126
+ Fit::File::Definitions.add_field 3, 17, 'activity_class', :type => :activity_class, :scale => 1
127
+ Fit::File::Definitions.add_field 3, 18, 'position_setting', :type => :display_position, :scale => 1
128
+ Fit::File::Definitions.add_field 3, 21, 'temperature_setting', :type => :display_measure, :scale => 1
129
+ Fit::File::Definitions.add_field 3, 22, 'local_id', :type => :user_local_id
130
+ Fit::File::Definitions.add_field 3, 23, 'global_id', :type => :byte
131
+ Fit::File::Definitions.add_field 3, 30, 'height_setting', :type => :display_measure
132
+
133
+ Fit::File::Definitions.add_name 4, 'hrm_profile'
134
+ Fit::File::Definitions.add_field 4, 254, 'message_index', :type => :message_index, :scale => 1
135
+ Fit::File::Definitions.add_field 4, 0, 'enabled', :type => :bool
136
+ Fit::File::Definitions.add_field 4, 1, 'hrm_ant_id', :type => :uint16z, :scale => 1
137
+ Fit::File::Definitions.add_field 4, 2, 'log_hrv', :type => :bool
138
+ Fit::File::Definitions.add_field 4, 3, 'hrm_ant_id_trans_type', :type => :uint8z
139
+
140
+ Fit::File::Definitions.add_name 5, 'sdm_profile'
141
+ Fit::File::Definitions.add_field 5, 254, 'message_index', :type => :message_index, :scale => 1
142
+ Fit::File::Definitions.add_field 5, 0, 'enabled', :type => :bool
143
+ Fit::File::Definitions.add_field 5, 1, 'sdm_ant_id', :type => :uint16z, :scale => 1
144
+ Fit::File::Definitions.add_field 5, 2, 'sdm_cal_factor', :type => :uint16, :scale => 10, :unit => '%'
145
+ Fit::File::Definitions.add_field 5, 3, 'odometer', :type => :uint32, :scale => 100, :unit => 'm'
146
+ Fit::File::Definitions.add_field 5, 4, 'speed_source', :type => :bool
147
+ Fit::File::Definitions.add_field 5, 5, 'sdm_ant_id_trans_type', :type => :uint8z
148
+ Fit::File::Definitions.add_field 5, 7, 'odometer_rollover', :type => :uint8
149
+
150
+ Fit::File::Definitions.add_name 6, 'bike_profile'
151
+ Fit::File::Definitions.add_field 6, 254, 'message_index', :type => :message_index, :scale => 1
152
+ Fit::File::Definitions.add_field 6, 0, 'name', :type => :string, :scale => 1
153
+ Fit::File::Definitions.add_field 6, 1, 'sport', :type => :sport, :scale => 1
154
+ Fit::File::Definitions.add_field 6, 2, 'sub_sport', :type => :sub_sport, :scale => 1
155
+ Fit::File::Definitions.add_field 6, 3, 'odometer', :type => :uint32, :scale => 100, :unit => 'm'
156
+ Fit::File::Definitions.add_field 6, 4, 'bike_spd_ant_id', :type => :uint16z, :scale => 1
157
+ Fit::File::Definitions.add_field 6, 5, 'bike_cad_ant_id', :type => :uint16z, :scale => 1
158
+ Fit::File::Definitions.add_field 6, 6, 'bike_spdcad_ant_id', :type => :uint16z, :scale => 1
159
+ Fit::File::Definitions.add_field 6, 7, 'bike_power_ant_id', :type => :uint16z, :scale => 1
160
+ Fit::File::Definitions.add_field 6, 8, 'custom_wheelsize', :type => :uint16, :scale => 1000, :unit => 'm'
161
+ Fit::File::Definitions.add_field 6, 9, 'auto_wheelsize', :type => :uint16, :scale => 1000, :unit => 'm'
162
+ Fit::File::Definitions.add_field 6, 10, 'bike_weight', :type => :uint16, :scale => 10, :unit => 'kg'
163
+ Fit::File::Definitions.add_field 6, 11, 'power_cal_factor', :type => :uint16, :scale => 10, :unit => '%'
164
+ Fit::File::Definitions.add_field 6, 12, 'auto_wheel_cal', :type => :bool, :scale => 1
165
+ Fit::File::Definitions.add_field 6, 13, 'auto_power_zero', :type => :bool, :scale => 1
166
+ Fit::File::Definitions.add_field 6, 14, 'id', :type => :uint8
167
+ Fit::File::Definitions.add_field 6, 15, 'spd_enabled', :type => :bool
168
+ Fit::File::Definitions.add_field 6, 16, 'cad_enabled', :type => :bool
169
+ Fit::File::Definitions.add_field 6, 17, 'spdcad_enabled', :type => :bool
170
+ Fit::File::Definitions.add_field 6, 18, 'power_enabled', :type => :bool
171
+ Fit::File::Definitions.add_field 6, 19, 'crank_length', :type => :uint8, :scale => 2, :offset => -110, :unit => 'mm'
172
+ Fit::File::Definitions.add_field 6, 20, 'enabled', :type => :bool
173
+ Fit::File::Definitions.add_field 6, 21, 'bike_spd_ant_id_trans_type', :type => :uint8z
174
+ Fit::File::Definitions.add_field 6, 22, 'bike_cad_ant_id_trans_type', :type => :uint8z
175
+ Fit::File::Definitions.add_field 6, 23, 'bike_spdcad_ant_id_trans_type', :type => :uint8z
176
+ Fit::File::Definitions.add_field 6, 24, 'bike_power_ant_id_trans_type', :type => :uint8z
177
+ Fit::File::Definitions.add_field 6, 37, 'odometer_rollover', :type => :uint8
178
+ Fit::File::Definitions.add_field 6, 38, 'front_gear_num', :type => :uint8z
179
+ Fit::File::Definitions.add_field 6, 39, 'front_gear', :type => :uint8z
180
+ Fit::File::Definitions.add_field 6, 40, 'rear_gear_num', :type => :uint8z
181
+ Fit::File::Definitions.add_field 6, 41, 'rear_gear', :type => :uint8z
182
+
183
+ Fit::File::Definitions.add_name 7, 'zones_target'
184
+ Fit::File::Definitions.add_field 7, 1, 'max_heart_rate', :type => :uint8, :scale => 1
185
+ Fit::File::Definitions.add_field 7, 2, 'threshold_heart_rate', :type => :uint8, :scale => 1
186
+ Fit::File::Definitions.add_field 7, 3, 'functional_threshold_power', :type => :uint16, :scale => 1
187
+ Fit::File::Definitions.add_field 7, 5, 'hr_calc_type', :type => :hr_zone_calc, :scale => 1
188
+ Fit::File::Definitions.add_field 7, 7, 'pwr_calc_type', :type => :pwr_zone_calc, :scale => 1
189
+
190
+ Fit::File::Definitions.add_name 12, 'sport'
191
+ Fit::File::Definitions.add_field 12, 0, 'sport', :type => :sport, :scale => 1
192
+ Fit::File::Definitions.add_field 12, 1, 'sub_sport', :type => :sub_sport, :scale => 1
193
+ Fit::File::Definitions.add_field 12, 3, 'name', :type => :string
194
+
195
+ Fit::File::Definitions.add_name 8, 'hr_zone'
196
+ Fit::File::Definitions.add_field 8, 254, 'message_index', :type => :message_index, :scale => 1
197
+ Fit::File::Definitions.add_field 8, 1, 'high_bpm', :type => :uint8, :scale => 1, :unit => 'bpm'
198
+ Fit::File::Definitions.add_field 8, 2, 'name', :type => :string, :scale => 1
199
+
200
+ Fit::File::Definitions.add_name 53, 'speed_zone'
201
+ Fit::File::Definitions.add_field 53, 254, 'message_index', :type => :message_index, :scale => 1
202
+ Fit::File::Definitions.add_field 53, 0, 'high_value', :type => :uint16, :scale => 1000, :unit => 'm/s'
203
+ Fit::File::Definitions.add_field 53, 1, 'name', :type => :string, :scale => 1
204
+
205
+ Fit::File::Definitions.add_name 131, 'cadence_zone'
206
+ Fit::File::Definitions.add_field 131, 254, 'message_index', :type => :message_index, :scale => 1
207
+ Fit::File::Definitions.add_field 131, 0, 'high_value', :type => :uint8, :scale => 1, :unit => 'rpm'
208
+ Fit::File::Definitions.add_field 131, 1, 'name', :type => :string, :scale => 1
209
+
210
+ Fit::File::Definitions.add_name 9, 'power_zone'
211
+ Fit::File::Definitions.add_field 9, 254, 'message_index', :type => :message_index, :scale => 1
212
+ Fit::File::Definitions.add_field 9, 1, 'high_value', :type => :uint16, :scale => 1, :unit => 'watts'
213
+ Fit::File::Definitions.add_field 9, 2, 'name', :type => :string, :scale => 1
214
+
215
+ Fit::File::Definitions.add_name 10, 'met_zone'
216
+ Fit::File::Definitions.add_field 10, 254, 'message_index', :type => :message_index, :scale => 1
217
+ Fit::File::Definitions.add_field 10, 1, 'high_bpm', :type => :uint8, :scale => 1
218
+ Fit::File::Definitions.add_field 10, 2, 'calories', :type => :uint16, :scale => 10, :unit => 'kcal / min'
219
+ Fit::File::Definitions.add_field 10, 3, 'fat_calories', :type => :uint8, :scale => 10, :unit => 'kcal / min'
220
+
221
+ Fit::File::Definitions.add_name 15, 'goal'
222
+ Fit::File::Definitions.add_field 15, 254, 'message_index', :type => :message_index, :scale => 1
223
+ Fit::File::Definitions.add_field 15, 0, 'sport', :type => :sport, :scale => 1
224
+ Fit::File::Definitions.add_field 15, 1, 'sub_sport', :type => :sub_sport, :scale => 1
225
+ Fit::File::Definitions.add_field 15, 2, 'start_date', :type => :date_time
226
+ Fit::File::Definitions.add_field 15, 3, 'end_date', :type => :date_time
227
+ Fit::File::Definitions.add_field 15, 4, 'type', :type => :goal
228
+ Fit::File::Definitions.add_field 15, 5, 'value', :type => :uint32, :scale => 1
229
+ Fit::File::Definitions.add_field 15, 6, 'repeat', :type => :bool
230
+ Fit::File::Definitions.add_field 15, 7, 'target_value', :type => :uint32, :scale => 1
231
+ Fit::File::Definitions.add_field 15, 8, 'recurrence', :type => :goal_recurrence, :scale => 1
232
+ Fit::File::Definitions.add_field 15, 9, 'recurrence_value', :type => :uint16, :scale => 1
233
+ Fit::File::Definitions.add_field 15, 10, 'enabled', :type => :bool, :scale => 1
234
+
235
+ Fit::File::Definitions.add_name 34, 'activity'
236
+ Fit::File::Definitions.add_field 34, 253, 'timestamp', :type => :date_time
237
+ Fit::File::Definitions.add_field 34, 0, 'total_timer_time', :type => :uint32, :scale => 1000, :unit => 's'
238
+ Fit::File::Definitions.add_field 34, 1, 'num_sessions', :type => :uint16, :scale => 1
239
+ Fit::File::Definitions.add_field 34, 2, 'type', :type => :activity
240
+ Fit::File::Definitions.add_field 34, 3, 'event', :type => :event
241
+ Fit::File::Definitions.add_field 34, 4, 'event_type', :type => :event_type
242
+ Fit::File::Definitions.add_field 34, 5, 'local_timestamp', :type => :local_date_time
243
+ Fit::File::Definitions.add_field 34, 6, 'event_group', :type => :uint8
244
+
245
+ Fit::File::Definitions.add_name 18, 'session'
246
+ Fit::File::Definitions.add_field 18, 254, 'message_index', :type => :message_index, :scale => 1
247
+ Fit::File::Definitions.add_field 18, 253, 'timestamp', :type => :date_time, :unit => 's'
248
+ Fit::File::Definitions.add_field 18, 0, 'event', :type => :event
249
+ Fit::File::Definitions.add_field 18, 1, 'event_type', :type => :event_type
250
+ Fit::File::Definitions.add_field 18, 2, 'start_time', :type => :date_time, :scale => 1
251
+ Fit::File::Definitions.add_field 18, 3, 'start_position_lat', :type => :sint32, :scale => 1, :unit => 'semicircles'
252
+ Fit::File::Definitions.add_field 18, 4, 'start_position_long', :type => :sint32, :scale => 1, :unit => 'semicircles'
253
+ Fit::File::Definitions.add_field 18, 5, 'sport', :type => :sport, :scale => 1
254
+ Fit::File::Definitions.add_field 18, 6, 'sub_sport', :type => :sub_sport, :scale => 1
255
+ Fit::File::Definitions.add_field 18, 7, 'total_elapsed_time', :type => :uint32, :scale => 1000, :unit => 's'
256
+ Fit::File::Definitions.add_field 18, 8, 'total_timer_time', :type => :uint32, :scale => 1000, :unit => 's'
257
+ Fit::File::Definitions.add_field 18, 9, 'total_distance', :type => :uint32, :scale => 100, :unit => 'm'
258
+ Fit::File::Definitions.add_field 18, 10, 'total_cycles', :type => :uint32, :scale => 1, :unit => 'cycles'
259
+ Fit::File::Definitions.add_field 18, 10, 'total_strides', :type => :uint32, :scale => 1, :unit => 'strides', :ref_field_name => 'sport', :ref_field_values => [:running]
260
+ Fit::File::Definitions.add_field 18, 11, 'total_calories', :type => :uint16, :scale => 1, :unit => 'kcal'
261
+ Fit::File::Definitions.add_field 18, 13, 'total_fat_calories', :type => :uint16, :scale => 1, :unit => 'kcal'
262
+ Fit::File::Definitions.add_field 18, 14, 'avg_speed', :type => :uint16, :scale => 1000, :unit => 'm/s'
263
+ Fit::File::Definitions.add_field 18, 15, 'max_speed', :type => :uint16, :scale => 1000, :unit => 'm/s'
264
+ Fit::File::Definitions.add_field 18, 16, 'avg_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
265
+ Fit::File::Definitions.add_field 18, 17, 'max_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
266
+ Fit::File::Definitions.add_field 18, 18, 'avg_cadence', :type => :uint8, :scale => 1, :unit => 'rpm'
267
+ Fit::File::Definitions.add_field 18, 18, 'avg_running_cadence', :type => :uint8, :scale => 1, :unit => 'strides/min', :ref_field_name => 'sport', :ref_field_values => [:running]
268
+ Fit::File::Definitions.add_field 18, 19, 'max_cadence', :type => :uint8, :scale => 1, :unit => 'rpm'
269
+ Fit::File::Definitions.add_field 18, 18, 'max_running_cadence', :type => :uint8, :scale => 1, :unit => 'strides/min', :ref_field_name => 'sport', :ref_field_values => [:running]
270
+ Fit::File::Definitions.add_field 18, 20, 'avg_power', :type => :uint16, :scale => 1, :unit => 'watts'
271
+ Fit::File::Definitions.add_field 18, 21, 'max_power', :type => :uint16, :scale => 1, :unit => 'watts'
272
+ Fit::File::Definitions.add_field 18, 22, 'total_ascent', :type => :uint16, :scale => 1, :unit => 'm'
273
+ Fit::File::Definitions.add_field 18, 23, 'total_descent', :type => :uint16, :scale => 1, :unit => 'm'
274
+ Fit::File::Definitions.add_field 18, 24, 'total_training_effect', :type => :uint8, :scale => 10
275
+ Fit::File::Definitions.add_field 18, 25, 'first_lap_index', :type => :uint16, :scale => 1
276
+ Fit::File::Definitions.add_field 18, 26, 'num_laps', :type => :uint16, :scale => 1
277
+ Fit::File::Definitions.add_field 18, 27, 'event_group', :type => :uint8
278
+ Fit::File::Definitions.add_field 18, 28, 'trigger', :type => :session_trigger
279
+ Fit::File::Definitions.add_field 18, 29, 'nec_lat', :type => :sint32, :unit => 'semicircles'
280
+ Fit::File::Definitions.add_field 18, 30, 'nec_long', :type => :sint32, :unit => 'semicircles'
281
+ Fit::File::Definitions.add_field 18, 31, 'swc_lat', :type => :sint32, :unit => 'semicircles'
282
+ Fit::File::Definitions.add_field 18, 32, 'swc_long', :type => :sint32, :unit => 'semicircles'
283
+ Fit::File::Definitions.add_field 18, 34, 'normalized_power', :type => :uint16, :unit => 'watts'
284
+ Fit::File::Definitions.add_field 18, 35, 'training_stress_score', :type => :uint16, :scale => 10, :unit => 'tss'
285
+ Fit::File::Definitions.add_field 18, 36, 'intensity_factor', :type => :uint16, :scale => 1000, :unit => 'if'
286
+ Fit::File::Definitions.add_field 18, 37, 'left_right_balance', :type => :left_right_balance_100
287
+ Fit::File::Definitions.add_field 18, 41, 'avg_stroke_count', :type => :uint32, :scale => 10, :unit => 'strokes/lap'
288
+ Fit::File::Definitions.add_field 18, 42, 'avg_stroke_distance', :type => :uint16, :scale => 100, :unit => 'm'
289
+ Fit::File::Definitions.add_field 18, 43, 'swim_stroke', :type => :swim_stroke, :unit => 'swim_stroke', :ref_field_name => 'sport', :ref_field_values => [:swimming]
290
+ Fit::File::Definitions.add_field 18, 44, 'pool_length', :type => :uint16, :scale => 100, :unit => 'm'
291
+ Fit::File::Definitions.add_field 18, 46, 'pool_length_unit', :type => :display_measure, :scale => 1
292
+ Fit::File::Definitions.add_field 18, 47, 'num_active_lengths', :type => :uint16, :unit => 'lengths'
293
+ Fit::File::Definitions.add_field 18, 48, 'total_work', :type => :uint32, :unit => 'J'
294
+ Fit::File::Definitions.add_field 18, 49, 'avg_altitude', :type => :uint16, :scale => 5, :offset => 500, :unit => 'm'
295
+ Fit::File::Definitions.add_field 18, 50, 'max_altitude', :type => :uint16, :scale => 5, :offset => 500, :unit => 'm'
296
+ Fit::File::Definitions.add_field 18, 51, 'gps_accuracy', :type => :uint8, :unit => 'm'
297
+ Fit::File::Definitions.add_field 18, 52, 'avg_grade', :type => :sint16, :scale => 100, :unit => '%'
298
+ Fit::File::Definitions.add_field 18, 53, 'avg_pos_grade', :type => :sint16, :scale => 100, :unit => '%'
299
+ Fit::File::Definitions.add_field 18, 54, 'avg_neg_grade', :type => :sint16, :scale => 100, :unit => '%'
300
+ Fit::File::Definitions.add_field 18, 55, 'max_pos_grade', :type => :sint16, :scale => 100, :unit => '%'
301
+ Fit::File::Definitions.add_field 18, 56, 'max_neg_grade', :type => :sint16, :scale => 100, :unit => '%'
302
+ Fit::File::Definitions.add_field 18, 57, 'avg_temperature', :type => :sint8, :unit => 'C'
303
+ Fit::File::Definitions.add_field 18, 58, 'max_temperature', :type => :sint8, :unit => 'C'
304
+ Fit::File::Definitions.add_field 18, 59, 'total_moving_time', :type => :uint32, :scale => 1000, :unit => 's'
305
+ Fit::File::Definitions.add_field 18, 60, 'avg_pos_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
306
+ Fit::File::Definitions.add_field 18, 61, 'avg_neg_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
307
+ Fit::File::Definitions.add_field 18, 62, 'max_pos_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
308
+ Fit::File::Definitions.add_field 18, 63, 'max_neg_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
309
+ Fit::File::Definitions.add_field 18, 64, 'min_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
310
+ Fit::File::Definitions.add_field 18, 65, 'time_in_hr_zone', :type => :uint32, :scale => 1000, :unit => 's'
311
+ Fit::File::Definitions.add_field 18, 66, 'time_in_speed_zone', :type => :uint32, :scale => 1000, :unit => 's'
312
+ Fit::File::Definitions.add_field 18, 67, 'time_in_cadence_zone', :type => :uint32, :scale => 1000, :unit => 's'
313
+ Fit::File::Definitions.add_field 18, 68, 'time_in_power_zone', :type => :uint32, :scale => 1000, :unit => 's'
314
+ Fit::File::Definitions.add_field 18, 69, 'avg_lap_time', :type => :uint32, :scale => 1000, :unit => 's'
315
+ Fit::File::Definitions.add_field 18, 70, 'best_lap_index', :type => :uint16
316
+ Fit::File::Definitions.add_field 18, 71, 'min_altitude', :type => :uint16, :scale => 5, :offset => 500, :unit => 'm'
317
+ Fit::File::Definitions.add_field 18, 82, 'player_score', :type => :uint16
318
+ Fit::File::Definitions.add_field 18, 83, 'opponent_score', :type => :uint16
319
+ Fit::File::Definitions.add_field 18, 84, 'opponent_name', :type => :string
320
+ Fit::File::Definitions.add_field 18, 85, 'stroke_count', :type => :uint16, :unit => 'counts'
321
+ Fit::File::Definitions.add_field 18, 86, 'zone_count', :type => :uint16, :unit => 'counts'
322
+ Fit::File::Definitions.add_field 18, 87, 'max_ball_speed', :type => :uint16, :scale => 100, :unit => 'm/s'
323
+ Fit::File::Definitions.add_field 18, 88, 'avg_ball_speed', :type => :uint16, :scale => 100, :unit => 'm/s'
324
+ Fit::File::Definitions.add_field 18, 89, 'avg_vertical_oscillation', :type => :uint16, :scale => 10, :unit => 'mm'
325
+ Fit::File::Definitions.add_field 18, 90, 'avg_stance_time_percent', :type => :uint16, :scale => 100, :unit => 'percent'
326
+ Fit::File::Definitions.add_field 18, 91, 'avg_stance_time', :type => :uint16, :scale => 10, :unit => 'ms'
327
+ Fit::File::Definitions.add_field 18, 92, 'avg_fractional_cadence', :type => :uint8, :scale => 128, :unit => 'rpm'
328
+ Fit::File::Definitions.add_field 18, 93, 'max_fractional_cadence', :type => :uint8, :scale => 128, :unit => 'rpm'
329
+ Fit::File::Definitions.add_field 18, 94, 'total_fractional_cycles', :type => :uint8, :scale => 128, :unit => 'cycles'
330
+ Fit::File::Definitions.add_field 18, 95, 'avg_total_hemoglobin_conc', :type => :uint16, :scale => 100, :unit => 'g/dL'
331
+ Fit::File::Definitions.add_field 18, 96, 'min_total_hemoglobin_conc', :type => :uint16, :scale => 100, :unit => 'g/dL'
332
+ Fit::File::Definitions.add_field 18, 97, 'max_total_hemoglobin_conc', :type => :uint16, :scale => 100, :unit => 'g/dL'
333
+ Fit::File::Definitions.add_field 18, 98, 'avg_saturated_hemoglobin_percent', :type => :uint16, :scale => 10, :unit => '%'
334
+ Fit::File::Definitions.add_field 18, 99, 'min_saturated_hemoglobin_percent', :type => :uint16, :scale => 10, :unit => '%'
335
+ Fit::File::Definitions.add_field 18, 100, 'max_saturated_hemoglobin_percent', :type => :uint16, :scale => 10, :unit => '%'
336
+ Fit::File::Definitions.add_field 18, 101, 'avg_left_torque_effectiveness', :type => :uint8, :scale => 2, :unit => 'percent'
337
+ Fit::File::Definitions.add_field 18, 102, 'avg_right_torque_effectiveness', :type => :uint8, :scale => 2, :unit => 'percent'
338
+ Fit::File::Definitions.add_field 18, 103, 'avg_left_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
339
+ Fit::File::Definitions.add_field 18, 104, 'avg_right_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
340
+ Fit::File::Definitions.add_field 18, 105, 'avg_combined_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
341
+
342
+ Fit::File::Definitions.add_name 19, 'lap'
343
+ Fit::File::Definitions.add_field 19, 254, 'message_index', :type => :message_index, :scale => 1
344
+ Fit::File::Definitions.add_field 19, 253, 'timestamp', :type => :date_time, :unit => 's'
345
+ Fit::File::Definitions.add_field 19, 0, 'event', :type => :event
346
+ Fit::File::Definitions.add_field 19, 1, 'event_type', :type => :event_type
347
+ Fit::File::Definitions.add_field 19, 2, 'start_time', :type => :date_time, :scale => 1
348
+ Fit::File::Definitions.add_field 19, 3, 'start_position_lat', :type => :sint32, :scale => 1, :unit => 'semicircles'
349
+ Fit::File::Definitions.add_field 19, 4, 'start_position_long', :type => :sint32, :scale => 1, :unit => 'semicircles'
350
+ Fit::File::Definitions.add_field 19, 5, 'end_position_lat', :type => :sint32, :scale => 1, :unit => 'semicircles'
351
+ Fit::File::Definitions.add_field 19, 6, 'end_position_long', :type => :sint32, :scale => 1, :unit => 'semicircles'
352
+ Fit::File::Definitions.add_field 19, 7, 'total_elapsed_time', :type => :uint32, :scale => 1000, :unit => 's'
353
+ Fit::File::Definitions.add_field 19, 8, 'total_timer_time', :type => :uint32, :scale => 1000, :unit => 's'
354
+ Fit::File::Definitions.add_field 19, 9, 'total_distance', :type => :uint32, :scale => 100, :unit => 'm'
355
+ Fit::File::Definitions.add_field 19, 10, 'total_cycles', :type => :uint32, :unit => 'cycles'
356
+ Fit::File::Definitions.add_field 19, 10, 'total_strides', :type => :uint32, :unit => 'strides', :ref_field_name => 'sport', :ref_field_values => [:running]
357
+ Fit::File::Definitions.add_field 19, 11, 'total_calories', :type => :uint16, :unit => 'kcal'
358
+ Fit::File::Definitions.add_field 19, 12, 'total_fat_calories', :type => :uint16, :unit => 'kcal'
359
+ Fit::File::Definitions.add_field 19, 13, 'avg_speed', :type => :uint16, :scale => 1000, :unit => 'm/s'
360
+ Fit::File::Definitions.add_field 19, 14, 'max_speed', :type => :uint16, :scale => 1000, :unit => 'm/s'
361
+ Fit::File::Definitions.add_field 19, 15, 'avg_heart_rate', :type => :uint8, :unit => 'bpm'
362
+ Fit::File::Definitions.add_field 19, 16, 'max_heart_rate', :type => :uint8, :unit => 'bpm'
363
+ Fit::File::Definitions.add_field 19, 17, 'avg_cadence', :type => :uint8, :unit => 'rpm'
364
+ Fit::File::Definitions.add_field 19, 17, 'avg_running_cadence', :type => :uint8, :unit => 'strides/min', :ref_field_name => 'sport', :ref_field_values => [:running]
365
+ Fit::File::Definitions.add_field 19, 18, 'max_cadence', :type => :uint8, :unit => 'rpm'
366
+ Fit::File::Definitions.add_field 19, 18, 'max_running_cadence', :type => :uint8, :unit => 'strides/min', :ref_field_name => 'sport', :ref_field_values => [:running]
367
+ Fit::File::Definitions.add_field 19, 19, 'avg_power', :type => :uint16, :unit => 'watts'
368
+ Fit::File::Definitions.add_field 19, 20, 'max_power', :type => :uint16, :unit => 'watts'
369
+ Fit::File::Definitions.add_field 19, 21, 'total_ascent', :type => :uint16, :unit => 'm'
370
+ Fit::File::Definitions.add_field 19, 22, 'total_descent', :type => :uint16, :unit => 'm'
371
+ Fit::File::Definitions.add_field 19, 23, 'intensity', :type => :intensity
372
+ Fit::File::Definitions.add_field 19, 24, 'lap_trigger', :type => :lap_trigger
373
+ Fit::File::Definitions.add_field 19, 25, 'sport', :type => :sport
374
+ Fit::File::Definitions.add_field 19, 26, 'event_group', :type => :uint8
375
+ Fit::File::Definitions.add_field 19, 32, 'num_lengths', :type => :uint16, :unit => 'lengths'
376
+ Fit::File::Definitions.add_field 19, 33, 'normalized_power', :type => :uint16, :unit => 'watts'
377
+ Fit::File::Definitions.add_field 19, 34, 'left_right_balance', :type => :left_right_balance_100
378
+ Fit::File::Definitions.add_field 19, 35, 'first_length_index', :type => :uint16, :scale => 1
379
+ Fit::File::Definitions.add_field 19, 37, 'avg_stroke_distance', :type => :uint16, :scale => 100, :unit => 'm'
380
+ Fit::File::Definitions.add_field 19, 38, 'swim_stroke', :type => :swim_stroke
381
+ Fit::File::Definitions.add_field 19, 39, 'sub_sport', :type => :sub_sport, :scale => 1
382
+ Fit::File::Definitions.add_field 19, 40, 'num_active_lengths', :type => :uint16, :unit => 'lengths'
383
+ Fit::File::Definitions.add_field 19, 41, 'total_work', :type => :uint32, :unit => 'J'
384
+ Fit::File::Definitions.add_field 19, 42, 'avg_altitude', :type => :uint16, :scale => 5, :offset => 500, :unit => 'm'
385
+ Fit::File::Definitions.add_field 19, 43, 'max_altitude', :type => :uint16, :scale => 5, :offset => 500, :unit => 'm'
386
+ Fit::File::Definitions.add_field 19, 44, 'gps_accuracy', :type => :uint8, :unit => 'm'
387
+ Fit::File::Definitions.add_field 19, 45, 'avg_grade', :type => :sint16, :scale => 100, :unit => '%'
388
+ Fit::File::Definitions.add_field 19, 46, 'avg_pos_grade', :type => :sint16, :scale => 100, :unit => '%'
389
+ Fit::File::Definitions.add_field 19, 47, 'avg_neg_grade', :type => :sint16, :scale => 100, :unit => '%'
390
+ Fit::File::Definitions.add_field 19, 48, 'max_pos_grade', :type => :sint16, :scale => 100, :unit => '%'
391
+ Fit::File::Definitions.add_field 19, 49, 'max_neg_grade', :type => :sint16, :scale => 100, :unit => '%'
392
+ Fit::File::Definitions.add_field 19, 50, 'avg_temperature', :type => :sint8, :unit => 'C'
393
+ Fit::File::Definitions.add_field 19, 51, 'max_temperature', :type => :sint8, :unit => 'C'
394
+ Fit::File::Definitions.add_field 19, 52, 'total_moving_time', :type => :uint32, :scale => 1000, :unit => 's'
395
+ Fit::File::Definitions.add_field 19, 53, 'avg_pos_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
396
+ Fit::File::Definitions.add_field 19, 54, 'avg_neg_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
397
+ Fit::File::Definitions.add_field 19, 55, 'max_pos_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
398
+ Fit::File::Definitions.add_field 19, 56, 'max_neg_vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
399
+ Fit::File::Definitions.add_field 19, 57, 'time_in_hr_zone', :type => :uint32, :scale => 1000, :unit => 's'
400
+ Fit::File::Definitions.add_field 19, 58, 'time_in_speed_zone', :type => :uint32, :scale => 1000, :unit => 's'
401
+ Fit::File::Definitions.add_field 19, 59, 'time_in_cadence_zone', :type => :uint32, :scale => 1000, :unit => 's'
402
+ Fit::File::Definitions.add_field 19, 60, 'time_in_power_zone', :type => :uint32, :scale => 1000, :unit => 's'
403
+ Fit::File::Definitions.add_field 19, 61, 'repetition_num', :type => :uint16
404
+ Fit::File::Definitions.add_field 19, 62, 'min_altitude', :type => :uint16, :scale => 5, :offset => 500, :unit => 'm'
405
+ Fit::File::Definitions.add_field 19, 63, 'min_heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
406
+ Fit::File::Definitions.add_field 19, 71, 'wkt_step_index', :type => :message_index
407
+ Fit::File::Definitions.add_field 19, 74, 'opponent_score', :type => :uint16
408
+ Fit::File::Definitions.add_field 19, 75, 'stroke_count', :type => :uint16, :unit => 'counts'
409
+ Fit::File::Definitions.add_field 19, 76, 'zone_count', :type => :uint16, :unit => 'counts'
410
+ Fit::File::Definitions.add_field 19, 77, 'avg_vertical_oscillation', :type => :uint16, :scale => 10, :unit => 'mm'
411
+ Fit::File::Definitions.add_field 19, 78, 'avg_stance_time_percent', :type => :uint16, :scale => 100, :unit => 'percent'
412
+ Fit::File::Definitions.add_field 19, 79, 'avg_stance_time', :type => :uint16, :scale => 10, :unit => 'ms'
413
+ Fit::File::Definitions.add_field 19, 80, 'avg_fractional_cadence', :type => :uint8, :scale => 128, :unit => 'rpm'
414
+ Fit::File::Definitions.add_field 19, 81, 'max_fractional_cadence', :type => :uint8, :scale => 128, :unit => 'rpm'
415
+ Fit::File::Definitions.add_field 19, 82, 'total_fractional_cycles', :type => :uint8, :scale => 128, :unit => 'cycles'
416
+ Fit::File::Definitions.add_field 19, 83, 'player_score', :type => :uint16
417
+ Fit::File::Definitions.add_field 19, 84, 'avg_total_hemoglobin_conc', :type => :uint16, :scale => 100, :unit => 'g/dL'
418
+ Fit::File::Definitions.add_field 19, 85, 'min_total_hemoglobin_conc', :type => :uint16, :scale => 100, :unit => 'g/dL'
419
+ Fit::File::Definitions.add_field 19, 86, 'max_total_hemoglobin_conc', :type => :uint16, :scale => 100, :unit => 'g/dL'
420
+ Fit::File::Definitions.add_field 19, 87, 'avg_saturated_hemoglobin_percent', :type => :uint16, :scale => 10, :unit => '%'
421
+ Fit::File::Definitions.add_field 19, 88, 'min_saturated_hemoglobin_percent', :type => :uint16, :scale => 10, :unit => '%'
422
+ Fit::File::Definitions.add_field 19, 89, 'max_saturated_hemoglobin_percent', :type => :uint16, :scale => 10, :unit => '%'
423
+ Fit::File::Definitions.add_field 19, 91, 'avg_left_torque_effectiveness', :type => :uint8, :scale => 2, :unit => 'percent'
424
+ Fit::File::Definitions.add_field 19, 92, 'avg_right_torque_effectiveness', :type => :uint8, :scale => 2, :unit => 'percent'
425
+ Fit::File::Definitions.add_field 19, 93, 'avg_left_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
426
+ Fit::File::Definitions.add_field 19, 94, 'avg_right_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
427
+ Fit::File::Definitions.add_field 19, 95, 'avg_combined_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
428
+
429
+ Fit::File::Definitions.add_name 101, 'length'
430
+ Fit::File::Definitions.add_field 101, 254, 'message_index', :type => :message_index, :scale => 1
431
+ Fit::File::Definitions.add_field 101, 253, 'timestamp', :type => :date_time, :scale => 1
432
+ Fit::File::Definitions.add_field 101, 0, 'event', :type => :event
433
+ Fit::File::Definitions.add_field 101, 1, 'event_type', :type => :event_type
434
+ Fit::File::Definitions.add_field 101, 2, 'start_time', :type => :date_time, :scale => 1
435
+ Fit::File::Definitions.add_field 101, 3, 'total_elapsed_time', :type => :uint32, :scale => 1000, :unit => 's'
436
+ Fit::File::Definitions.add_field 101, 4, 'total_timer_time', :type => :uint32, :scale => 1000, :unit => 's'
437
+ Fit::File::Definitions.add_field 101, 5, 'total_strokes', :type => :uint16, :scale => 1, :unit => 'strokes'
438
+ Fit::File::Definitions.add_field 101, 6, 'avg_speed', :type => :uint16, :scale => 1000, :unit => 'm/s'
439
+ Fit::File::Definitions.add_field 101, 7, 'swim_stroke', :type => :swim_stroke, :unit => 'swim_stroke'
440
+ Fit::File::Definitions.add_field 101, 9, 'avg_swimming_cadence', :type => :uint8, :unit => 'strokes/min'
441
+ Fit::File::Definitions.add_field 101, 10, 'event_group', :type => :uint8
442
+ Fit::File::Definitions.add_field 101, 11, 'total_calories', :type => :uint16, :unit => 'kcal'
443
+ Fit::File::Definitions.add_field 101, 12, 'length_type', :type => :length_type
444
+ Fit::File::Definitions.add_field 101, 18, 'player_score', :type => :uint16
445
+ Fit::File::Definitions.add_field 101, 19, 'opponent_score', :type => :uint16
446
+ Fit::File::Definitions.add_field 101, 20, 'stroke_count', :type => :uint16, :unit => 'counts'
447
+ Fit::File::Definitions.add_field 101, 21, 'zone_count', :type => :uint16, :unit => 'counts'
448
+
449
+ Fit::File::Definitions.add_name 20, 'record'
450
+ Fit::File::Definitions.add_field 20, 253, 'timestamp', :type => :date_time, :scale => 1, :unit => 's'
451
+ Fit::File::Definitions.add_field 20, 0, 'position_lat', :type => :sint32, :scale => 1, :unit => 'semicircles'
452
+ Fit::File::Definitions.add_field 20, 1, 'position_long', :type => :sint32, :scale => 1, :unit => 'semicircles'
453
+ Fit::File::Definitions.add_field 20, 2, 'altitude', :type => :uint16, :scale => 5, :offset => 500, :unit => 'm'
454
+ Fit::File::Definitions.add_field 20, 3, 'heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
455
+ Fit::File::Definitions.add_field 20, 4, 'cadence', :type => :uint8, :scale => 1, :unit => 'rpm'
456
+ Fit::File::Definitions.add_field 20, 5, 'distance', :type => :uint32, :scale => 100, :unit => 'm'
457
+ Fit::File::Definitions.add_field 20, 6, 'speed', :type => :uint16, :scale => 1000, :unit => 'm/s'
458
+ Fit::File::Definitions.add_field 20, 7, 'power', :type => :uint16, :unit => 'watts'
459
+ Fit::File::Definitions.add_field 20, 8, 'compressed_speed_distance', :type => :byte, :unit => 'm/s,m'
460
+ Fit::File::Definitions.add_field 20, 9, 'grade', :type => :sint16, :scale => 100, :unit => '%'
461
+ Fit::File::Definitions.add_field 20, 10, 'resistance', :type => :uint8, :scale => 1
462
+ Fit::File::Definitions.add_field 20, 11, 'time_from_course', :type => :sint32, :scale => 1000, :unit => 's'
463
+ Fit::File::Definitions.add_field 20, 12, 'cycle_length', :type => :uint8, :scale => 100, :unit => 'm'
464
+ Fit::File::Definitions.add_field 20, 13, 'temperature', :type => :sint8, :unit => 'C'
465
+ Fit::File::Definitions.add_field 20, 17, 'speed_1s', :type => :uint8, :scale => 16, :unit => 'm/s'
466
+ Fit::File::Definitions.add_field 20, 18, 'cycles', :type => :uint8, :unit => 'cycles'
467
+ Fit::File::Definitions.add_field 20, 19, 'total_cycles', :type => :uint32, :unit => 'cycles'
468
+ Fit::File::Definitions.add_field 20, 28, 'compressed_accumulated_power', :type => :uint16, :unit => 'watts'
469
+ Fit::File::Definitions.add_field 20, 29, 'accumulated_power', :type => :uint32, :unit => 'watts'
470
+ Fit::File::Definitions.add_field 20, 30, 'left_right_balance', :type => :left_right_balance
471
+ Fit::File::Definitions.add_field 20, 31, 'gps_accuracy', :type => :uint8, :unit => 'm'
472
+ Fit::File::Definitions.add_field 20, 32, 'vertical_speed', :type => :sint16, :scale => 1000, :unit => 'm/s'
473
+ Fit::File::Definitions.add_field 20, 33, 'calories', :type => :uint16, :scale => 1, :unit => 'kcal'
474
+ Fit::File::Definitions.add_field 20, 39, 'vertical_oscillation', :type => :uint16, :scale => 10, :unit => 'mm'
475
+ Fit::File::Definitions.add_field 20, 40, 'stance_time_percent', :type => :uint16, :scale => 100, :unit => 'percent'
476
+ Fit::File::Definitions.add_field 20, 41, 'stance_time', :type => :uint16, :scale => 10, :unit => 'ms'
477
+ Fit::File::Definitions.add_field 20, 42, 'activity_type', :type => :activity_type
478
+ Fit::File::Definitions.add_field 20, 43, 'left_torque_effectiveness', :type => :uint8, :scale => 2, :unit => 'percent'
479
+ Fit::File::Definitions.add_field 20, 44, 'right_torque_effectiveness', :type => :uint8, :scale => 2, :unit => 'percent'
480
+ Fit::File::Definitions.add_field 20, 45, 'left_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
481
+ Fit::File::Definitions.add_field 20, 46, 'right_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
482
+ Fit::File::Definitions.add_field 20, 47, 'combined_pedal_smoothness', :type => :uint8, :scale => 2, :unit => 'percent'
483
+ Fit::File::Definitions.add_field 20, 48, 'time128', :type => :uint8, :scale => 128, :unit => 's'
484
+ Fit::File::Definitions.add_field 20, 49, 'stroke_type', :type => :stroke_type
485
+ Fit::File::Definitions.add_field 20, 50, 'zone', :type => :uint8
486
+ Fit::File::Definitions.add_field 20, 51, 'ball_speed', :type => :uint16, :scale => 100, :unit => 'm/s'
487
+ Fit::File::Definitions.add_field 20, 52, 'cadence256', :type => :uint16, :scale => 256, :unit => 'rpm'
488
+ Fit::File::Definitions.add_field 20, 53, 'fractional_cadence', :type => :uint8, :scale => 128, :unit => 'rpm'
489
+ Fit::File::Definitions.add_field 20, 54, 'total_hemoglobin_conc', :type => :uint16, :scale => 100, :unit => 'g/dL'
490
+ Fit::File::Definitions.add_field 20, 55, 'total_hemoglobin_conc_min', :type => :uint16, :scale => 100, :unit => 'g/dL'
491
+ Fit::File::Definitions.add_field 20, 56, 'total_hemoglobin_conc_max', :type => :uint16, :scale => 100, :unit => 'g/dL'
492
+ Fit::File::Definitions.add_field 20, 57, 'saturated_hemoglobin_percent', :type => :uint16, :scale => 10, :unit => '%'
493
+ Fit::File::Definitions.add_field 20, 58, 'saturated_hemoglobin_percent_min', :type => :uint16, :scale => 10, :unit => '%'
494
+ Fit::File::Definitions.add_field 20, 59, 'saturated_hemoglobin_percent_max', :type => :uint16, :scale => 10, :unit => '%'
495
+ Fit::File::Definitions.add_field 20, 62, 'device_index', :type => :device_index
496
+
497
+ Fit::File::Definitions.add_name 21, 'event'
498
+ Fit::File::Definitions.add_field 21, 253, 'timestamp', :type => :date_time, :unit => 's'
499
+ Fit::File::Definitions.add_field 21, 0, 'event', :type => :event
500
+ Fit::File::Definitions.add_field 21, 1, 'event_type', :type => :event_type
501
+ Fit::File::Definitions.add_field 21, 2, 'data16', :type => :uint16, :scale => 1
502
+ Fit::File::Definitions.add_field 21, 3, 'data', :type => :uint32, :scale => 1
503
+ Fit::File::Definitions.add_field 21, 3, 'timer_trigger', :type => :timer_trigger, :scale => 1, :ref_field_name => 'event', :ref_field_values => [:timer]
504
+ Fit::File::Definitions.add_field 21, 3, 'course_point_index', :type => :message_index, :scale => 1, :ref_field_name => 'event', :ref_field_values => [:course_point]
505
+ Fit::File::Definitions.add_field 21, 3, 'battery_level', :type => :uint16, :scale => 1000, :unit => 'V', :ref_field_name => 'event', :ref_field_values => [:battery]
506
+ Fit::File::Definitions.add_field 21, 3, 'virtual_partner_speed', :type => :uint16, :scale => 1000, :unit => 'm/s', :ref_field_name => 'event', :ref_field_values => [:virtual_partner_pace]
507
+ Fit::File::Definitions.add_field 21, 3, 'hr_high_alert', :type => :uint8, :scale => 1, :unit => 'bpm', :ref_field_name => 'event', :ref_field_values => [:hr_high_alert]
508
+ Fit::File::Definitions.add_field 21, 3, 'hr_low_alert', :type => :uint8, :scale => 1, :unit => 'bpm', :ref_field_name => 'event', :ref_field_values => [:hr_low_alert]
509
+ Fit::File::Definitions.add_field 21, 3, 'speed_high_alert', :type => :uint16, :scale => 1000, :unit => 'm/s', :ref_field_name => 'event', :ref_field_values => [:speed_high_alert]
510
+ Fit::File::Definitions.add_field 21, 3, 'speed_low_alert', :type => :uint16, :scale => 1000, :unit => 'm/s', :ref_field_name => 'event', :ref_field_values => [:speed_low_alert]
511
+ Fit::File::Definitions.add_field 21, 3, 'cad_high_alert', :type => :uint16, :scale => 1, :unit => 'rpm', :ref_field_name => 'event', :ref_field_values => [:cad_high_alert]
512
+ Fit::File::Definitions.add_field 21, 3, 'cad_low_alert', :type => :uint16, :scale => 1, :unit => 'rpm', :ref_field_name => 'event', :ref_field_values => [:cad_low_alert]
513
+ Fit::File::Definitions.add_field 21, 3, 'power_high_alert', :type => :uint16, :scale => 1, :unit => 'watts', :ref_field_name => 'event', :ref_field_values => [:power_high_alert]
514
+ Fit::File::Definitions.add_field 21, 3, 'power_low_alert', :type => :uint16, :scale => 1, :unit => 'watts', :ref_field_name => 'event', :ref_field_values => [:power_low_alert]
515
+ Fit::File::Definitions.add_field 21, 3, 'time_duration_alert', :type => :uint32, :scale => 1000, :unit => 's', :ref_field_name => 'event', :ref_field_values => [:time_duration_alert]
516
+ Fit::File::Definitions.add_field 21, 3, 'distance_duration_alert', :type => :uint32, :scale => 100, :unit => 'm', :ref_field_name => 'event', :ref_field_values => [:distance_duration_alert]
517
+ Fit::File::Definitions.add_field 21, 3, 'calorie_duration_alert', :type => :uint32, :scale => 1, :unit => 'calories', :ref_field_name => 'event', :ref_field_values => [:calorie_duration_alert]
518
+ Fit::File::Definitions.add_field 21, 3, 'fitness_equipment_state', :type => :fitness_equipment_state, :scale => 1, :ref_field_name => 'event', :ref_field_values => [:fitness_equipment]
519
+ Fit::File::Definitions.add_field 21, 3, 'sport_point', :type => :uint32, :scale => 1, :ref_field_name => 'event', :ref_field_values => [:sport_point]
520
+ Fit::File::Definitions.add_field 21, 3, 'gear_change_data', :type => :uint32, :scale => 1, :ref_field_name => 'event', :ref_field_values => [:front_gear_change, :rear_gear_change]
521
+ Fit::File::Definitions.add_field 21, 4, 'event_group', :type => :uint8
522
+ Fit::File::Definitions.add_field 21, 7, 'score', :type => :uint16
523
+ Fit::File::Definitions.add_field 21, 8, 'opponent_score', :type => :uint16
524
+ Fit::File::Definitions.add_field 21, 9, 'front_gear_num', :type => :uint8z
525
+ Fit::File::Definitions.add_field 21, 10, 'front_gear', :type => :uint8z
526
+ Fit::File::Definitions.add_field 21, 11, 'rear_gear_num', :type => :uint8z
527
+ Fit::File::Definitions.add_field 21, 12, 'rear_gear', :type => :uint8z
528
+
529
+ Fit::File::Definitions.add_name 23, 'device_info'
530
+ Fit::File::Definitions.add_field 23, 253, 'timestamp', :type => :date_time, :scale => 1, :unit => 's'
531
+ Fit::File::Definitions.add_field 23, 0, 'device_index', :type => :device_index, :scale => 1
532
+ Fit::File::Definitions.add_field 23, 1, 'device_type', :type => :uint8, :scale => 1
533
+ Fit::File::Definitions.add_field 23, 1, 'antplus_device_type', :type => :antplus_device_type, :ref_field_name => 'source_type', :ref_field_values => [:antplus]
534
+ Fit::File::Definitions.add_field 23, 1, 'ant_device_type', :type => :uint8, :ref_field_name => 'source_type', :ref_field_values => [:ant]
535
+ Fit::File::Definitions.add_field 23, 2, 'manufacturer', :type => :manufacturer, :scale => 1
536
+ Fit::File::Definitions.add_field 23, 3, 'serial_number', :type => :uint32z, :scale => 1
537
+ Fit::File::Definitions.add_field 23, 4, 'product', :type => :uint16, :scale => 1
538
+ Fit::File::Definitions.add_field 23, 5, 'software_version', :type => :uint16, :scale => 100
539
+ Fit::File::Definitions.add_field 23, 6, 'hardware_version', :type => :uint8, :scale => 1
540
+ Fit::File::Definitions.add_field 23, 7, 'cum_operating_time', :type => :uint32, :scale => 1, :unit => 's'
541
+ Fit::File::Definitions.add_field 23, 10, 'battery_voltage', :type => :uint16, :scale => 256, :unit => 'V'
542
+ Fit::File::Definitions.add_field 23, 11, 'battery_status', :type => :battery_status
543
+ Fit::File::Definitions.add_field 23, 18, 'sensor_position', :type => :body_location
544
+ Fit::File::Definitions.add_field 23, 19, 'descriptor', :type => :string
545
+ Fit::File::Definitions.add_field 23, 20, 'ant_transmission_type', :type => :uint8z
546
+ Fit::File::Definitions.add_field 23, 21, 'ant_device_number', :type => :uint16z
547
+ Fit::File::Definitions.add_field 23, 22, 'ant_network', :type => :ant_network
548
+ Fit::File::Definitions.add_field 23, 25, 'source_type', :type => :source_type
549
+
550
+ Fit::File::Definitions.add_name 72, 'training_file'
551
+ Fit::File::Definitions.add_field 72, 253, 'timestamp', :type => :date_time
552
+ Fit::File::Definitions.add_field 72, 0, 'type', :type => :file
553
+ Fit::File::Definitions.add_field 72, 1, 'manufacturer', :type => :manufacturer
554
+ Fit::File::Definitions.add_field 72, 2, 'product', :type => :uint16
555
+ Fit::File::Definitions.add_field 72, 2, 'garmin_product', :type => :garmin_product, :ref_field_name => 'manufacturer', :ref_field_values => [:garmin, :dynastream, :dynastream_oem]
556
+ Fit::File::Definitions.add_field 72, 3, 'serial_number', :type => :uint32z
557
+ Fit::File::Definitions.add_field 72, 4, 'time_created', :type => :date_time
558
+
559
+ Fit::File::Definitions.add_name 78, 'hrv'
560
+ Fit::File::Definitions.add_field 78, 0, 'time', :type => :uint16, :scale => 1000, :unit => 's'
561
+
562
+ Fit::File::Definitions.add_name 31, 'course'
563
+ Fit::File::Definitions.add_field 31, 4, 'sport', :type => :sport
564
+ Fit::File::Definitions.add_field 31, 5, 'name', :type => :string
565
+ Fit::File::Definitions.add_field 31, 6, 'capabilities', :type => :course_capabilities
566
+
567
+ Fit::File::Definitions.add_name 32, 'course_point'
568
+ Fit::File::Definitions.add_field 32, 254, 'message_index', :type => :message_index
569
+ Fit::File::Definitions.add_field 32, 1, 'timestamp', :type => :date_time, :scale => 1
570
+ Fit::File::Definitions.add_field 32, 2, 'position_lat', :type => :sint32, :scale => 1, :unit => 'semicircles'
571
+ Fit::File::Definitions.add_field 32, 3, 'position_long', :type => :sint32, :scale => 1, :unit => 'semicircles'
572
+ Fit::File::Definitions.add_field 32, 4, 'distance', :type => :uint32, :scale => 100, :unit => 'm'
573
+ Fit::File::Definitions.add_field 32, 5, 'type', :type => :course_point, :scale => 1
574
+ Fit::File::Definitions.add_field 32, 6, 'name', :type => :string
575
+
576
+ Fit::File::Definitions.add_name 26, 'workout'
577
+ Fit::File::Definitions.add_field 26, 4, 'sport', :type => :sport, :scale => 1
578
+ Fit::File::Definitions.add_field 26, 5, 'capabilities', :type => :workout_capabilities
579
+ Fit::File::Definitions.add_field 26, 6, 'num_valid_steps', :type => :uint16, :scale => 1
580
+ Fit::File::Definitions.add_field 26, 8, 'wkt_name', :type => :string, :scale => 1
581
+
582
+ Fit::File::Definitions.add_name 27, 'workout_step'
583
+ Fit::File::Definitions.add_field 27, 254, 'message_index', :type => :message_index
584
+ Fit::File::Definitions.add_field 27, 0, 'wkt_step_name', :type => :string, :scale => 1
585
+ Fit::File::Definitions.add_field 27, 1, 'duration_type', :type => :wkt_step_duration, :scale => 1
586
+ Fit::File::Definitions.add_field 27, 2, 'duration_value', :type => :uint32, :scale => 1
587
+ Fit::File::Definitions.add_field 27, 2, 'duration_time', :type => :uint32, :scale => 1000, :unit => 's', :ref_field_name => 'duration_type', :ref_field_values => [:time, :repetition_time]
588
+ Fit::File::Definitions.add_field 27, 2, 'duration_distance', :type => :uint32, :scale => 100, :unit => 'm', :ref_field_name => 'duration_type', :ref_field_values => [:distance]
589
+ Fit::File::Definitions.add_field 27, 2, 'duration_hr', :type => :workout_hr, :scale => 1, :unit => '% or bpm', :ref_field_name => 'duration_type', :ref_field_values => [:hr_less_than, :hr_greater_than]
590
+ Fit::File::Definitions.add_field 27, 2, 'duration_calories', :type => :uint32, :scale => 1, :unit => 'calories', :ref_field_name => 'duration_type', :ref_field_values => [:calories]
591
+ Fit::File::Definitions.add_field 27, 2, 'duration_step', :type => :uint32, :ref_field_name => 'duration_type', :ref_field_values => [:repeat_until_steps_cmplt, :repeat_until_time, :repeat_until_distance, :repeat_until_calories, :repeat_until_hr_less_than, :repeat_until_hr_greater_than, :repeat_until_power_less_than,:repeat_until_power_greater_than]
592
+ Fit::File::Definitions.add_field 27, 2, 'duration_power', :type => :workout_power, :scale => 1, :unit => '% or watts', :ref_field_name => 'duration_type', :ref_field_values => [:power_less_than, :power_greater_than]
593
+ Fit::File::Definitions.add_field 27, 3, 'target_type', :type => :wkt_step_target, :scale => 1
594
+ Fit::File::Definitions.add_field 27, 4, 'target_value', :type => :uint32, :scale => 1
595
+ Fit::File::Definitions.add_field 27, 4, 'target_hr_zone', :type => :uint32, :ref_field_name => 'target_type', :ref_field_values => [:heart_rate]
596
+ Fit::File::Definitions.add_field 27, 4, 'target_power_zone', :type => :uint32, :ref_field_name => 'target_type', :ref_field_values => [:power]
597
+ Fit::File::Definitions.add_field 27, 4, 'repeat_steps', :type => :uint32, :ref_field_name => 'duration_type', :ref_field_values => [:repeat_until_steps_cmplt]
598
+ Fit::File::Definitions.add_field 27, 4, 'repeat_time', :type => :uint32, :scale => 1000, :unit => 's', :ref_field_name => 'duration_type', :ref_field_values => [:repeat_until_time]
599
+ Fit::File::Definitions.add_field 27, 4, 'repeat_distance', :type => :uint32, :scale => 100, :unit => 'm', :ref_field_name => 'duration_type', :ref_field_values => [:repeat_until_distance]
600
+ Fit::File::Definitions.add_field 27, 4, 'repeat_calories', :type => :uint32, :scale => 1, :unit => 'calories', :ref_field_name => 'duration_type', :ref_field_values => [:repeat_until_calories]
601
+ Fit::File::Definitions.add_field 27, 4, 'repeat_hr', :type => :workout_hr, :scale => 1, :unit => '% or bpm', :ref_field_name => 'duration_type', :ref_field_values => [:repeat_until_hr_less_than, :repeat_until_hr_greater_than]
602
+ Fit::File::Definitions.add_field 27, 4, 'repeat_power', :type => :workout_power, :scale => 1, :unit => '% or watts', :ref_field_name => 'duration_type', :ref_field_values => [:repeat_until_power_less_than, :repeat_until_power_greater_than]
603
+ Fit::File::Definitions.add_field 27, 5, 'custom_target_value_low', :type => :uint32, :scale => 1
604
+ Fit::File::Definitions.add_field 27, 5, 'custom_target_speed_low', :type => :uint32, :scale => 1000, :unit => 'm/s', :ref_field_name => 'target_type', :ref_field_values => [:speed]
605
+ Fit::File::Definitions.add_field 27, 5, 'custom_target_heart_rate_low', :type => :workout_hr, :scale => 1, :unit => '% or bpm', :ref_field_name => 'target_type', :ref_field_values => [:heart_rate]
606
+ Fit::File::Definitions.add_field 27, 5, 'custom_target_cadence_low', :type => :uint32, :scale => 1, :unit => 'rpm', :ref_field_name => 'target_type', :ref_field_values => [:cadence]
607
+ Fit::File::Definitions.add_field 27, 5, 'custom_target_power_low', :type => :workout_power, :scale => 1, :unit => '% or watts', :ref_field_name => 'target_type', :ref_field_values => [:power]
608
+ Fit::File::Definitions.add_field 27, 6, 'custom_target_value_high', :type => :uint32, :scale => 1
609
+ Fit::File::Definitions.add_field 27, 6, 'custom_target_speed_high', :type => :uint32, :scale => 1000, :unit => 'm/s', :ref_field_name => 'target_type', :ref_field_values => [:speed]
610
+ Fit::File::Definitions.add_field 27, 6, 'custom_target_heart_rate_high', :type => :workout_hr, :scale => 1, :unit => '% or bpm', :ref_field_name => 'target_type', :ref_field_values => [:heart_rate]
611
+ Fit::File::Definitions.add_field 27, 6, 'custom_target_cadence_high', :type => :uint32, :scale => 1, :unit => 'rpm', :ref_field_name => 'target_type', :ref_field_values => [:cadence]
612
+ Fit::File::Definitions.add_field 27, 6, 'custom_target_power_high', :type => :workout_power, :scale => 1, :unit => '% or watts', :ref_field_name => 'target_type', :ref_field_values => [:power]
613
+ Fit::File::Definitions.add_field 27, 7, 'intensity', :type => :intensity, :scale => 1
614
+
615
+ Fit::File::Definitions.add_name 28, 'schedule'
616
+ Fit::File::Definitions.add_field 28, 0, 'manufacturer', :type => :manufacturer
617
+ Fit::File::Definitions.add_field 28, 1, 'product', :type => :uint16
618
+ Fit::File::Definitions.add_field 28, 1, 'garmin_product', :type => :garmin_product, :ref_field_name => 'manufacturer', :ref_field_values => [:garmin, :dynastream, :dynastream_oem]
619
+ Fit::File::Definitions.add_field 28, 2, 'serial_number', :type => :uint32z
620
+ Fit::File::Definitions.add_field 28, 3, 'time_created', :type => :date_time
621
+ Fit::File::Definitions.add_field 28, 4, 'completed', :type => :bool, :scale => 1
622
+ Fit::File::Definitions.add_field 28, 5, 'type', :type => :schedule, :scale => 1
623
+ Fit::File::Definitions.add_field 28, 6, 'scheduled_time', :type => :local_date_time
624
+
625
+ Fit::File::Definitions.add_name 33, 'totals'
626
+ Fit::File::Definitions.add_field 33, 254, 'message_index', :type => :message_index
627
+ Fit::File::Definitions.add_field 33, 253, 'timestamp', :type => :date_time, :unit => 's'
628
+ Fit::File::Definitions.add_field 33, 0, 'timer_time', :type => :uint32, :unit => 's'
629
+ Fit::File::Definitions.add_field 33, 1, 'distance', :type => :uint32, :unit => 'm'
630
+ Fit::File::Definitions.add_field 33, 2, 'calories', :type => :uint32, :unit => 'kcal'
631
+ Fit::File::Definitions.add_field 33, 3, 'sport', :type => :sport
632
+ Fit::File::Definitions.add_field 33, 4, 'elapsed_time', :type => :uint32, :unit => 's'
633
+ Fit::File::Definitions.add_field 33, 5, 'sessions', :type => :uint16
634
+ Fit::File::Definitions.add_field 33, 6, 'active_time', :type => :uint32, :unit => 's'
635
+
636
+ Fit::File::Definitions.add_name 30, 'weight_scale'
637
+ Fit::File::Definitions.add_field 30, 253, 'timestamp', :type => :date_time, :scale => 1, :unit => 's'
638
+ Fit::File::Definitions.add_field 30, 0, 'weight', :type => :weight, :scale => 100, :unit => 'kg'
639
+ Fit::File::Definitions.add_field 30, 1, 'percent_fat', :type => :uint16, :scale => 100, :unit => '%'
640
+ Fit::File::Definitions.add_field 30, 2, 'percent_hydration', :type => :uint16, :scale => 100, :unit => '%'
641
+ Fit::File::Definitions.add_field 30, 3, 'visceral_fat_mass', :type => :uint16, :scale => 100, :unit => 'kg'
642
+ Fit::File::Definitions.add_field 30, 4, 'bone_mass', :type => :uint16, :scale => 100, :unit => 'kg'
643
+ Fit::File::Definitions.add_field 30, 5, 'muscle_mass', :type => :uint16, :scale => 100, :unit => 'kg'
644
+ Fit::File::Definitions.add_field 30, 7, 'basal_met', :type => :uint16, :scale => 4, :unit => 'kcal/day'
645
+ Fit::File::Definitions.add_field 30, 8, 'physique_rating', :type => :uint8, :scale => 1
646
+ Fit::File::Definitions.add_field 30, 9, 'active_met', :type => :uint16, :scale => 4, :unit => 'kcal/day'
647
+ Fit::File::Definitions.add_field 30, 10, 'metabolic_age', :type => :uint8, :scale => 1, :unit => 'years'
648
+ Fit::File::Definitions.add_field 30, 11, 'visceral_fat_rating', :type => :uint8, :scale => 1
649
+ Fit::File::Definitions.add_field 30, 12, 'user_profile_index', :type => :message_index
650
+
651
+ Fit::File::Definitions.add_name 51, 'blood_pressure'
652
+ Fit::File::Definitions.add_field 51, 253, 'timestamp', :type => :date_time, :scale => 1, :unit => 's'
653
+ Fit::File::Definitions.add_field 51, 0, 'systolic_pressure', :type => :uint16, :scale => 1, :unit => 'mmHg'
654
+ Fit::File::Definitions.add_field 51, 1, 'diastolic_pressure', :type => :uint16, :scale => 1, :unit => 'mmHg'
655
+ Fit::File::Definitions.add_field 51, 2, 'mean_arterial_pressure', :type => :uint16, :scale => 1, :unit => 'mmHg'
656
+ Fit::File::Definitions.add_field 51, 3, 'map_3_sample_mean', :type => :uint16, :scale => 1, :unit => 'mmHg'
657
+ Fit::File::Definitions.add_field 51, 4, 'map_morning_values', :type => :uint16, :scale => 1, :unit => 'mmHg'
658
+ Fit::File::Definitions.add_field 51, 5, 'map_evening_values', :type => :uint16, :scale => 1, :unit => 'mmHg'
659
+ Fit::File::Definitions.add_field 51, 6, 'heart_rate', :type => :uint8, :scale => 1, :unit => 'bpm'
660
+ Fit::File::Definitions.add_field 51, 7, 'heart_rate_type', :type => :hr_type
661
+ Fit::File::Definitions.add_field 51, 8, 'status', :type => :bp_status
662
+ Fit::File::Definitions.add_field 51, 9, 'user_profile_index', :type => :message_index
663
+
664
+ Fit::File::Definitions.add_name 103, 'monitoring_info'
665
+ Fit::File::Definitions.add_field 103, 253, 'timestamp', :type => :date_time
666
+ Fit::File::Definitions.add_field 103, 0, 'local_timestamp', :type => :local_date_time
667
+ Fit::File::Definitions.add_field 103, 1, 'activity_type', :type => :activity_type
668
+ Fit::File::Definitions.add_field 103, 3, 'cycles_to_distance', :type => :uint16, :scale => 5000, :unit => 'm/cycle'
669
+ Fit::File::Definitions.add_field 103, 4, 'cycles_to_calories', :type => :uint16, :scale => 5000, :unit => 'kcal/cycle'
670
+ Fit::File::Definitions.add_field 103, 5, 'resting_metabolic_rate', :type => :uint16, :unit => 'kcal / day'
671
+
672
+ Fit::File::Definitions.add_name 55, 'monitoring'
673
+ Fit::File::Definitions.add_field 55, 253, 'timestamp', :type => :date_time, :unit => 's'
674
+ Fit::File::Definitions.add_field 55, 0, 'device_index', :type => :device_index
675
+ Fit::File::Definitions.add_field 55, 1, 'calories', :type => :uint16, :unit => 'kcal'
676
+ Fit::File::Definitions.add_field 55, 2, 'distance', :type => :uint32, :scale => 100, :unit => 'm'
677
+ Fit::File::Definitions.add_field 55, 3, 'cycles', :type => :uint32, :scale => 2, :unit => 'cycles'
678
+ Fit::File::Definitions.add_field 55, 3, 'steps', :type => :uint32, :scale => 1, :unit => 'steps', :ref_field_name => 'activity_type', :ref_field_values => [:walking, :running]
679
+ Fit::File::Definitions.add_field 55, 3, 'strokes', :type => :uint32, :scale => 2, :unit => 'strokes', :ref_field_name => 'activity_type', :ref_field_values => [:cycling, :swimming]
680
+ Fit::File::Definitions.add_field 55, 4, 'active_time', :type => :uint32, :scale => 1000, :unit => 's'
681
+ Fit::File::Definitions.add_field 55, 5, 'activity_type', :type => :activity_type
682
+ Fit::File::Definitions.add_field 55, 6, 'activity_subtype', :type => :activity_subtype
683
+ Fit::File::Definitions.add_field 55, 7, 'activity_level', :type => :activity_level
684
+ Fit::File::Definitions.add_field 55, 8, 'distance_16', :type => :uint16, :unit => '100 * m'
685
+ Fit::File::Definitions.add_field 55, 9, 'cycles_16', :type => :uint16, :unit => '2 * cycles ', :unit => '(steps)'
686
+ Fit::File::Definitions.add_field 55, 10, 'active_time_16', :type => :uint16, :unit => 's'
687
+ Fit::File::Definitions.add_field 55, 11, 'local_timestamp', :type => :local_date_time
688
+ Fit::File::Definitions.add_field 55, 12, 'temperature', :type => :sint16, :scale => 100, :unit => 'C'
689
+ Fit::File::Definitions.add_field 55, 14, 'temperature_min', :type => :sint16, :scale => 100, :unit => 'C'
690
+ Fit::File::Definitions.add_field 55, 15, 'temperature_max', :type => :sint16, :scale => 100, :unit => 'C'
691
+ Fit::File::Definitions.add_field 55, 16, 'activity_time', :type => :uint16, :unit => 'minutes'
692
+ Fit::File::Definitions.add_field 55, 19, 'active_calories', :type => :uint16, :unit => 'kcal'
693
+ Fit::File::Definitions.add_field 55, 24, 'current_activity_type_intensity', :type => :byte
694
+ Fit::File::Definitions.add_field 55, 25, 'timestamp_min_8', :type => :uint8, :unit => 'min'
695
+ Fit::File::Definitions.add_field 55, 26, 'timestamp_16', :type => :uint16, :unit => 's'
696
+ Fit::File::Definitions.add_field 55, 27, 'heart_rate', :type => :uint8, :unit => 'bpm'
697
+ Fit::File::Definitions.add_field 55, 28, 'intensity', :type => :uint8, :scale => 10
698
+ Fit::File::Definitions.add_field 55, 29, 'duration_min', :type => :uint16, :unit => 'min'
699
+ Fit::File::Definitions.add_field 55, 30, 'duration', :type => :uint32, :unit => 's'
700
+
701
+ Fit::File::Definitions.add_name 145, 'memo_glob'
702
+ Fit::File::Definitions.add_field 145, 250, 'part_index', :type => :uint32
703
+ Fit::File::Definitions.add_field 145, 0, 'memo', :type => :byte
704
+ Fit::File::Definitions.add_field 145, 1, 'message_number', :type => :uint16
705
+ Fit::File::Definitions.add_field 145, 2, 'message_index', :type => :message_index