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.



14
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
# File 'lib/fitreader/fit.rb', line 14

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
    puts "error: #{e}\n#{e.backtrace}"
  end
end

Instance Attribute Details

#headerObject (readonly)

Returns the value of attribute header.



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

def header
  @header
end

#messagesObject (readonly)

Returns the value of attribute messages.



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

def messages
  @messages
end

Instance Method Details

#digestObject



54
55
56
# File 'lib/fitreader/fit.rb', line 54

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

#make_developer_fields(data_records) ⇒ Object



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

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



58
59
60
# File 'lib/fitreader/fit.rb', line 58

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