Class: Fit

Inherits:
Object
  • Object
show all
Defined in:
lib/fitreader/fit.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(io) ⇒ Fit

Returns a new instance of Fit.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/fitreader/fit.rb', line 15

def initialize(io)
  @header = FileHeader.new(io)
  finished = []
  begin
    defs = {}
    dev_field_defs = {}
    # until (io.pos - 14) >= header.num_record_bytes
    until ((@header.num_record_bytes + 14) - io.pos) == 0
      h = RecordHeader.new(io)
      if h.definition?
        if h.has_dev_defs?
          d = DefinitionRecord.new(io, h.local_message_type, dev_field_defs)
        else
          d = DefinitionRecord.new(io, h.local_message_type)
        end
        finished << defs[d.local_num] if defs.key? d.local_num
        defs[d.local_num] = d
      elsif h.data?
        d = defs[h.local_message_type]
        data_record = DataRecord.new(io, d)
        if d.global_msg_num == 206
          dev_field = make_developer_fields(data_record.fields)
          dev_field_defs[dev_field[:dev_data_idx].raw] = dev_field
        else
          d.data_records << data_record
        end
      else
        # TODO implement timestamps
      end
    end
    finished.push(*defs.values)
    io.close
    @messages = finished.group_by(&:global_msg_num)
                        .map { |x| Message.new x }
                        .reject { |x| x.data.nil? }
  rescue => e
    binding.pry
    puts "error: #{e}\n#{e.backtrace}"
  end
end

Instance Attribute Details

#headerObject (readonly)

Returns the value of attribute header.



13
14
15
# File 'lib/fitreader/fit.rb', line 13

def header
  @header
end

#messagesObject (readonly)

Returns the value of attribute messages.



13
14
15
# File 'lib/fitreader/fit.rb', line 13

def messages
  @messages
end

Instance Method Details

#digestObject



56
57
58
# File 'lib/fitreader/fit.rb', line 56

def digest
  Hash[@messages.map { |x| [x.name, x.data.count] }]
end

#make_developer_fields(data_records) ⇒ Object



64
65
66
67
68
69
70
71
72
# File 'lib/fitreader/fit.rb', line 64

def make_developer_fields(data_records)
  lookup = {0 => :dev_data_idx, 1 => :field_def_num, 2 => :base_type_id, 3 => :field_name, 8 => :units}
  map = {}
  data_records.each do |k,v|
    key = lookup[k]
    map[key] = v
  end
  map
end

#type(name) ⇒ Object



60
61
62
# File 'lib/fitreader/fit.rb', line 60

def type(name)
  messages.find { |x| x.name == name }
end