Class: Fit4Ruby::FieldDescription

Inherits:
FitDataRecord show all
Defined in:
lib/fit4ruby/FieldDescription.rb

Overview

This class corresponds to the FieldDescription FIT message.

Constant Summary

Constants inherited from FitDataRecord

Fit4Ruby::FitDataRecord::RecordOrder

Constants included from BDFieldNameTranslator

BDFieldNameTranslator::BD_DICT

Instance Attribute Summary

Attributes inherited from FitDataRecord

#message, #timestamp

Instance Method Summary collapse

Methods inherited from FitDataRecord

#<=>, #==, #export, #get, #get_as, #get_unit_by_name, #set, #set_field_values, #write

Methods included from BDFieldNameTranslator

#to_bd_field_name

Methods included from Converters

#conversion_factor, #fit_time_to_time, #secsToDHMS, #secsToHM, #secsToHMS, #speedToPace, #time_to_fit_time

Constructor Details

#initialize(field_values = {}) ⇒ FieldDescription

Create a new FieldDescription object.

Parameters:

  • field_values (Hash) (defaults to: {})

    Hash that provides initial values for certain fields.



25
26
27
28
29
30
# File 'lib/fit4ruby/FieldDescription.rb', line 25

def initialize(field_values = {})
  super('field_description')
  set_field_values(field_values)

  @full_field_name = nil
end

Instance Method Details

#create_global_definition(fit_entity) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/fit4ruby/FieldDescription.rb', line 48

def create_global_definition(fit_entity)
  messages = fit_entity.developer_fit_messages
  unless (gfm = GlobalFitMessages[@native_mesg_num])
    Log.error "Developer field description references unknown global " +
      "message number #{@native_mesg_num}"
    return
  end

  msg = messages[@native_mesg_num] ||
    messages.message(@native_mesg_num, gfm.name)
  unless (@fit_base_type_id & 0x7F) < FIT_TYPE_DEFS.size
    Log.error "fit_base_type_id #{@fit_base_type_id} is too large"
    return
  end

  # A fit file may include multiple definitions of the same field. We
  # ignore all subsequent definitions.
  return if msg.has_field?(full_field_name(fit_entity.top_level_record.
                                           developer_data_ids))

  options = {}
  options[:scale] = @scale if @scale
  options[:offset] = @offset if @offset
  options[:array] = @array if @array
  options[:unit] = @units
  msg.field(@field_definition_number,
            FIT_TYPE_DEFS[@fit_base_type_id & 0x7F][1],
            @full_field_name, options)
end

#full_field_name(developer_data_ids) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/fit4ruby/FieldDescription.rb', line 32

def full_field_name(developer_data_ids)
  return @full_field_name if @full_field_name

  if @developer_data_index >=
       developer_data_ids.size
     Log.error "Developer data index #{@developer_data_index} is too large"
     return
  end

  app_id = developer_data_ids[@developer_data_index].application_id
  # Convert the byte array with the app ID into a 16 character hex string.
  app_id_str = app_id.map { |i| '%02X' % i }.join('')
  @full_field_name =
    "#{@field_name.gsub(/[^A-Za-z0-9_]/, '_')}_#{app_id_str}"
end