class F4R::GlobalFit::Helper

Helper class to get all types and messages in a usable format for F4R.

Public Instance Methods

get_base_types() click to toggle source

Provides base types to {GlobalFit.base_types}.

@return [Hash]

# File lib/f4r.rb, line 519
def get_base_types
  csv = CSV.read(Config.directory + '/base_types.csv', converters: %i[numeric])
  csv[1..-1].inject([]) do |r, row|
    r << {
      number: row[0],
      fit: row[1].to_sym,
      bindata: row[2].to_sym,
      bindata_en: row[3].to_sym,
      endian: row[4],
      bytes: row[5],
      undef: row[6],
    };r
  end
end
get_messages() click to toggle source

Provides messages to {GlobalFit.messages}.

@return [Array<Hash>]

# File lib/f4r.rb, line 457
      def get_messages
        messages = {}

        profile_messages.keys.each do |name|
          messages[name] = []
          if undocumented_messages[name]
            messages[name] = profile_messages[name] | undocumented_messages[name]
          else
            messages[name] = profile_messages[name]
          end
        end

        (undocumented_messages.keys - messages.keys).each do |name|
          messages[name] = undocumented_messages[name]
        end

        messages.keys.inject([]) do |r, name|
          type = GlobalFit.types[:mesg_num][:values].find { |v| v[:value_name] == name }
          source = undocumented_types[:mesg_num][:values].
            find { |t| t[:value_name] == name }

          unless type
            Log.error <<~ERROR
              Message "#{name}" not found in FIT profile or undocumented messages types.
            ERROR
          end

          r << {
            name: name,
            number: type[:value].to_i,
            source: source ? "F4R #{VERSION}" : "FIT SDK #{FIT_PROFILE_REV}",
            fields: messages[name.to_sym].select { |f| f[:field_def] }
          };r
        end
      end
get_types() click to toggle source

Provides types to {GlobalFit.types}.

@return [Hash]

# File lib/f4r.rb, line 498
def get_types
  types = {}

  profile_types.keys.each do |name|
    types[name] = {}
    if undocumented_types[name]
      values = profile_types[name][:values] | undocumented_types[name][:values]
      types[name][:values] = values
    else
      types[name] = profile_types[name]
    end
  end

  types
end

Private Instance Methods

messages_csv_to_hash(csv, source) click to toggle source

Converts CSV messages into a Hash.

@return [Hash]

# File lib/f4r.rb, line 593
def messages_csv_to_hash(csv, source)
  current_message = ''
  csv[2..-1].inject({}) do |r, row|
    if row[0].is_a? String
      current_message = row[0].to_sym
      r[current_message] = []
    else
      if row[1] && row[2]
        r[current_message] << {
          source: source,
          field_def: row[1],
          field_name: row[2].to_sym,
          field_type: row[3].to_sym,
          array: row[4],
          components: row[5],
          scale: row[6],
          offset: row[7],
          units: row[8],
          bits: row[9],
          accumulate: row[10],
          ref_field_name: row[11],
          ref_field_value: row[12],
          comment: row[13],
          products: row[14],
          example: row[15]
        }
      end
    end
    r
  end
end
profile_messages() click to toggle source

Provides FIT SDK messages to {GlobalFit.messages}.

@return [Hash]

# File lib/f4r.rb, line 541
def profile_messages
  @profile_messages ||= messages_csv_to_hash(
  CSV.read(
    Config.directory + '/profile_messages.csv',
    converters: %i[numeric]),
   "FIT SDK #{FIT_PROFILE_REV}")
end
profile_types() click to toggle source

Provides FIT SDK types to {GlobalFit.types}.

@return [Hash]

# File lib/f4r.rb, line 567
def profile_types
  @profile_types ||= types_csv_to_hash(
  CSV.read(
    Config.directory + '/profile_types.csv',
    converters: %i[numeric]),
   "FIT SDK #{FIT_PROFILE_REV}")
end
types_csv_to_hash(csv, source) click to toggle source

Converts CSV types into a Hash.

@return [Hash]

# File lib/f4r.rb, line 630
def types_csv_to_hash(csv, source)
  current_type = ''
  csv[1..-1].inject({}) do |r, row|
    if row[0].is_a? String
      current_type = row[0].to_sym
      r[current_type] = {
        base_type: row[1].to_sym,
        values: []
      }
    else
      unless row.compact.size.zero?
        r[current_type][:values] << {
          source: source,
          value_name: row[2].to_sym,
          value: row[3],
          comment: row[4]
        }
      end
    end
    r
  end
end
undocumented_messages() click to toggle source

Provides undocumented messages to {GlobalFit.messages}.

@return [Hash]

# File lib/f4r.rb, line 554
def undocumented_messages
 @undocumented_messages ||= messages_csv_to_hash(
  CSV.read(
    Config.directory + '/undocumented_messages.csv',
    converters: %i[numeric]),
   "F4R #{VERSION}")
end
undocumented_types() click to toggle source

Provides undocumented types to {GlobalFit.types}.

@return [Hash]

# File lib/f4r.rb, line 580
def undocumented_types
  @undocumented_types ||= types_csv_to_hash(
  CSV.read(
    Config.directory + '/undocumented_types.csv',
    converters: %i[numeric]),
    "F4R #{VERSION}")
end