Module: Fit4Ruby

Defined in:
lib/fit4ruby/Lap.rb,
lib/fit4ruby.rb,
lib/fit4ruby/Log.rb,
lib/fit4ruby/Record.rb,
lib/fit4ruby/FitFile.rb,
lib/fit4ruby/Session.rb,
lib/fit4ruby/version.rb,
lib/fit4ruby/Activity.rb,
lib/fit4ruby/FitFileId.rb,
lib/fit4ruby/FitFilter.rb,
lib/fit4ruby/FitHeader.rb,
lib/fit4ruby/FitRecord.rb,
lib/fit4ruby/Converters.rb,
lib/fit4ruby/FitDataRecord.rb,
lib/fit4ruby/FitDefinition.rb,
lib/fit4ruby/FitRecordHeader.rb,
lib/fit4ruby/FitMessageRecord.rb,
lib/fit4ruby/GlobalFitMessage.rb,
lib/fit4ruby/GlobalFitDictList.rb,
lib/fit4ruby/GlobalFitMessages.rb,
lib/fit4ruby/FitDefinitionField.rb,
lib/fit4ruby/FitMessageIdMapper.rb,
lib/fit4ruby/GlobalFitDictionaries.rb

Overview

FitMessageIdMapper.rb – Fit4Ruby - FIT file processing library for Ruby

Copyright © 2014 by Chris Schlaeger <[email protected]>

This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation.

Defined Under Namespace

Modules: Converters Classes: Activity, Error, FitDataRecord, FitDefinition, FitDefinitionField, FitFile, FitFileId, FitFilter, FitHeader, FitMessageIdMapper, FitMessageRecord, FitRecord, FitRecordHeader, GlobalFitDict, GlobalFitDictList, GlobalFitMessage, GlobalFitMessageList, ILogger, Lap, Record, Session

Constant Summary collapse

Log =
ILogger.new(STDOUT)
VERSION =
'0.0.1'
GlobalFitMessages =
GlobalFitMessageList.new do
  message 0, 'file_id'
  field 0, 'enum', 'type', :dict => 'file'
  field 1, 'uint16', 'manufacturer', :dict => 'manufacturer'
  field 2, 'uint16', 'product', :dict => 'product'
  field 3, 'uint32z', 'serial_number'
  field 4, 'uint32', 'time_created', :type => 'date_time'
  field 5, 'uint16', 'number'

  message 18, 'session'
  field 0, 'enum', 'event', :dict => 'event'
  field 1, 'enum', 'event_type', :dict => 'event_type'
  field 2, 'uint32', 'start_time', :type => 'date_time'
  field 3, 'sint32', 'start_position_lat', :type => 'coordinate'
  field 4, 'sint32', 'start_position_long', :type => 'coordinate'
  field 5, 'enum', 'sport', :dict => 'sport'
  field 6, 'enum', 'sub_sport', :dict => 'sub_sport'
  field 7, 'uint32', 'total_elapsed_time', :type => 'duration', :scale => 1000
  field 8, 'uint32', 'total_timer_time', :type => 'duration', :scale => 1000
  field 9, 'uint32', 'total_distance', :scale => 100, :unit => 'm'
  field 10, 'uint32', 'total_strides', :unit => 'strides'
  field 11, 'uint16', 'total_calories', :unit => 'kcal'
  field 13, 'uint16', 'total_fat_calories', :unit => 'kcal'
  field 14, 'uint16', 'avg_speed', :scale => 1000, :unit => 'm/s'
  field 15, 'uint16', 'max_speed', :scale => 1000, :unit => 'm/s'
  field 16, 'uint8', 'avg_heart_rate', :unit => 'bpm'
  field 17, 'uint8', 'max_heart_rate', :unit => 'bpm'
  field 18, 'uint8', 'avg_running_cadence', :unit => 'strides/min'
  field 19, 'uint8', 'max_running_cadence', :unit => 'strides/min'
  field 22, 'uint16', 'total_ascent', :unit => 'm'
  field 23, 'uint16', 'total_descent', :unit => 'm'
  field 24, 'uint8', 'total_training_effect', :scale => 10
  field 25, 'uint16', 'first_lap_index'
  field 26, 'uint16', 'num_laps'
  field 27, 'uint8', 'event_group'
  field 28, 'enum', 'trigger', :dict => 'session_trigger'
  field 29, 'sint32', 'nec_lat', :type => 'coordinate'
  field 30, 'sint32', 'nec_long', :type => 'coordinate'
  field 31, 'sint32', 'swc_lat', :type => 'coordinate'
  field 32, 'sint32', 'swc_long', :type => 'coordinate'
  field 81, 'enum', 'undocumented_field_81'
  field 89, 'uint16', 'avg_vertical_oscillation', :scale => 10, :unit => 'mm'
  field 90, 'uint16', 'avg_stance_time_percent', :scale => 100, :unit => 'percent'
  field 91, 'uint16', 'avg_stance_time', :scale => 10, :unit => 'ms'
  field 92, 'uint8', 'avg_fraction_cadence', :scale => 128
  field 93, 'uint8', 'max_fractional_cadence', :scale => 128
  field 94, 'uint8', 'total_fractional_cycles', :scale => 128
  field 253, 'uint32', 'timestamp', :type => 'date_time'
  field 254, 'uint16', 'message_index'

  message 19, 'lap'
  field 0, 'enum', 'event', :dict => 'event'
  field 1, 'enum', 'event_type', :dict => 'event_type'
  field 2, 'uint32', 'start_time', :type => 'date_time'
  field 3, 'sint32', 'start_position_lat', :type => 'coordinate'
  field 4, 'sint32', 'start_position_long', :type => 'coordinate'
  field 5, 'sint32', 'end_position_lat', :type => 'coordinate'
  field 6, 'sint32', 'end_position_long', :type => 'coordinate'
  field 7, 'uint32', 'total_elapsed_time', :type => 'duration', :scale => 1000
  field 8, 'uint32', 'total_timer_time', :type => 'duration', :scale => 1000
  field 9, 'uint32', 'total_distance', :scale => 100, :unit => 'm'
  field 10, 'uint32', 'total_strides', :unit => 'strides'
  field 11, 'uint16', 'total_calories', :unit => 'kcal'
  field 12, 'uint16', 'total_fat_calories', :unit => 'kcal'
  field 13, 'uint16', 'avg_speed', :scale => 1000, :unit => 'm/s'
  field 14, 'uint16', 'max_speed', :scale => 1000, :unit => 'm/s'
  field 15, 'uint8', 'avg_heart_rate', :unit => 'bpm'
  field 16, 'uint8', 'max_heart_rate', :unit => 'bpm'
  field 17, 'uint8', 'avg_running_cadence', :unit => 'strides'
  field 18, 'uint8', 'max_running_cadence', :unit => 'strides'
  field 21, 'uint16', 'total_ascent', :unit => 'm'
  field 22, 'uint16', 'total_descent', :unit => 'm'
  field 23, 'enum', 'intensity', :dict => 'intensity'
  field 24, 'enum', 'lap_trigger', :dict => 'lap_trigger'
  field 25, 'enum', 'sport', :dict => 'sport'
  field 26, 'uint8', 'event_group'
  field 27, 'sint32', 'nec_lat', :type => 'coordinate'
  field 28, 'sint32', 'nec_long', :type => 'coordinate'
  field 29, 'sint32', 'swc_lat', :type => 'coordinate'
  field 30, 'sint32', 'swc_long', :type => 'coordinate'
  field 39, 'enum', 'sub_sport', :dict => 'sub_sport'
  field 71, 'uint16', 'wkt_step_index'
  field 72, 'enum', 'undocumented_field_72'
  field 77, 'uint16', 'avg_vertical_oscillation', :scale => 10, :unit => 'mm'
  field 78, 'uint16', 'avg_stance_time_percent', :scale => 100, :unit => 'percent'
  field 79, 'uint16', 'avg_stance_time', :scale => 10, :unit => 'ms'
  field 80, 'uint8', 'avg_fractional_cadence', :scale => 128
  field 81, 'uint8', 'max_fractional_cadence', :scale => 128
  field 82, 'uint8', 'total_fractional_cycles', :scale => 128
  field 253, 'uint32', 'timestamp', :type => 'date_time'
  field 254, 'uint16', 'message_index'

  message 20, 'record'
  field 0, 'sint32', 'position_lat', :type => 'coordinate'
  field 1, 'sint32', 'position_long', :type => 'coordinate'
  field 2, 'uint16', 'altitude', :scale => 5, :offset => 500, :unit => 'm'
  field 3, 'uint8', 'heart_rate', :unit => 'bpm'
  field 4, 'uint8', 'cadence', :unit => 'rpm'
  field 5, 'uint32', 'distance', :scale => 100, :unit => 'm'
  field 6, 'uint16', 'speed', :scale => 1000, :unit => 'm/s'
  field 39, 'uint16', 'vertical_oscillation', :scale => 10, :unit => 'mm'
  field 40, 'uint16', 'stance_time_percent', :scale => 100, :unit => 'percent'
  field 41, 'uint16', 'stance_time', :scale => 10, :unit => 'ms'
  field 42, 'enum', 'activity_type', :dict => 'activity_type'
  field 53, 'uint8', 'fractional_cadence', :scale => 128 # Just a guess
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  message 21, 'event'
  field 0, 'enum', 'event', :dict => 'event'
  field 1, 'enum', 'event_type', :dict => 'event_type'
  field 2, 'uint16', 'data16'
  field 3, 'uint32', 'data'
  field 4, 'uint8', 'event_group'
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  # Possibly the signal quality of the best 6 satellites; Not documented in
  # FIT SDK
  message 22, 'gps_signals'
  field 0, 'uint8', 'Satellite 1'
  field 1, 'uint8', 'Satellite 2'
  field 2, 'uint8', 'Satellite 3'
  field 3, 'uint8', 'Satellite 4'
  field 4, 'uint8', 'Satellite 5'
  field 5, 'enum', 'lock_status'
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  message 23, 'device_info'
  field 0, 'uint8', 'device_index'
  field 1, 'uint8', 'device_type', :dict => 'device_type'
  field 2, 'uint16', 'manufacturer', :dict => 'manufacturer'
  field 3, 'uint32z', 'serial_number'
  field 4, 'uint16', 'product', :dict => 'product'
  field 5, 'uint16', 'software_version', :scale => 100
  field 6, 'uint8', 'hardware_version'
  field 7, 'uint32', 'cum_operating_time', :type => 'duration'
  field 8, 'uint32', 'undocumented_field_8'
  field 9, 'uint8', 'undocumented_field_9'
  field 10, 'uint16', 'battery_voltage', :scale => 256, :unit => 'V'
  field 11, 'uint8', 'battery_status', :dict => 'battery_status'
  field 15, 'uint32', 'rx_packets_ok' # just a guess
  field 16, 'uint32', 'rx_packets_err' # just a guess
  field 20, 'uint8z', 'undocumented_field_20'
  field 21, 'uint16z', 'undocumented_field_21'
  field 22, 'enum', 'undocumented_field_22'
  field 23, 'uint8', 'undocumented_field_23'
  field 25, 'enum', 'undocumented_field_25'
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  message 34, 'activity'
  field 0, 'uint32', 'total_timer_time', :type => 'duration',  :scale => 1000
  field 1, 'uint16', 'num_sessions'
  field 2, 'enum', 'type', :dict => 'activity_type'
  field 3, 'enum', 'event', :dict => 'event'
  field 4, 'enum', 'event_type', :dict => 'event_type'
  field 5, 'uint32', 'local_timestamp', :type => 'date_time'
  field 6, 'uint8', 'event_group'
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  message 49, 'file_creator'
  field 0, 'uint16', 'software_version'
  field 1, 'uint8', 'hardware_version'

  # Not part of the official ANT SDK doc
  message 79, 'user_profile'
  field 0, 'uint16', 'undocumented_field_0' # seems to strongly correlate with vo2max
  field 1, 'uint8', 'age', :unit => 'years'
  field 2, 'uint8', 'height', :scale => 100, :unit => 'm'
  field 3, 'uint16', 'weight', :scale => 10, :unit => 'kg'
  field 4, 'enum', 'gender', :dict => 'gender'
  field 5, 'enum', 'activity_class', :scale => 10
  field 6, 'uint8', 'max_hr', :unit => 'bpm'
  field 7, 'sint8', 'undocumented_field_7' # seems to be always 1
  field 8, 'uint16', 'recovery_time', :scale => 60, :unit => 'hours'
  field 9, 'uint16', 'undocumented_field_9' # maybe activity measurement
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  # Not part of the official ANT SDK doc
  message 113, 'personal_records'
  field 0, 'uint16', 'longest_distance'
  field 1, 'enum', 'undocumented_field_1' # Seems to be always 1
  field 2, 'uint32', 'distance', :scale => 100, :unit => 'm'
  # If longest_distance is 1, field 3 is the distance, not a duration!
  field 3, 'uint32', 'duration', :scale => 1000, :type => 'duration'
  field 4, 'uint32', 'start_time', :type => 'date_time'
  field 5, 'enum', 'new_record'
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  # Not part of the official ANT SDK doc
  # The values in this message seem to be related to the activity history.
  # If no HRM is used, most of them are 0. Fields 4, 7, 9 and 10 always have
  # non-zero values.
  message 140, 'undocumented_140'
  field 0, 'uint8', 'max_heart_rate', :unit => 'bpm'
  field 1, 'uint8', 'undocumented_field_1'
  field 2, 'sint32', 'undocumented_field_2'
  field 3, 'sint32', 'undocumented_field_3'
  field 4, 'uint8', 'total_training_effect', :scale => 10
  field 5, 'sint32', 'undocumented_field_5'
  field 6, 'sint32', 'undocumented_field_6'
  field 7, 'sint32', 'undocumented_field_7'
  field 8, 'uint8', 'undocumented_field_8'
  field 9, 'uint16', 'recovery_time', :scale => 60, :unit => 'hours'
  field 10, 'uint16', 'undocumented_field_10' # always seems to be 340
  field 253, 'uint32', 'timestamp', :type => 'date_time'

  # Not part of the official ANT SDK doc
  message 141, 'gps_ephemeris'
  field 0, 'enum', 'valid' # 0 if no data cached, 1 else
  field 1, 'uint32', 'interval_start', :type => 'date_time'
  field 2, 'uint32', 'interval_end', :type => 'date_time'
  field 3, 'uint32', 'undocumented_field_3'
  field 4, 'sint32', 'undocumented_field_4'
  field 5, 'sint32', 'undocumented_field_5'
  field 253, 'uint32', 'timestamp', :type => 'date_time'

end
GlobalFitDictionaries =
GlobalFitDictList.new do

  dict 'activity_type'
  entry 0, 'generic'
  entry 1, 'running'
  entry 2, 'cycling'
  entry 3, 'transition'
  entry 4, 'fitness_equipment'
  entry 5, 'swimming'
  entry 6, 'walking'
  entry 254, 'all'

  dict 'battery_status'
  entry 1, 'new'
  entry 2, 'good'
  entry 3, 'ok'
  entry 4, 'low'
  entry 5, 'critical'

  dict 'device_type'
  entry 1, 'antfs'
  entry 11, 'bike_power'
  entry 12, 'environment_sensor_legacy'
  entry 13, 'multi_sport_speed_distance'
  entry 14, 'control'
  entry 17, 'fitness_equipment'
  entry 18, 'blood_pressure'
  entry 19, 'geocache_node'
  entry 20, 'light_electric_vehicle'
  entry 25, 'env_sensor'
  entry 26, 'racquet'
  entry 30, 'running_dynamics' # Just a guess
  entry 119, 'weight_scale'
  entry 120, 'heart_rate'
  entry 121, 'bike_speed_cadence'
  entry 122, 'bike_cadence'
  entry 123, 'bike_speed'
  entry 124, 'stride_speed_distance'

  dict 'event'
  entry 0, 'timer'
  entry 3, 'workout'
  entry 4, 'workout_step'
  entry 5, 'power_down'
  entry 6, 'power_up'
  entry 7, 'off_course'
  entry 8, 'session'
  entry 9, 'lap'
  entry 10, 'course_point'
  entry 11, 'battery'
  entry 12, 'virtual_partner_pace'
  entry 13, 'hr_high_alert'
  entry 14, 'hr_low_alert'
  entry 15, 'speed_high_alert'
  entry 16, 'speed_low_alert'
  entry 17, 'cad_high_alert'
  entry 18, 'cad_low_alert'
  entry 19, 'power_high_alert'
  entry 20, 'power_low_alert'
  entry 21, 'recovery_hr'
  entry 22, 'battery_low'
  entry 23, 'time_duration_alert'
  entry 24, 'distance_duration_alert'
  entry 25, 'calorie_duration_alert'
  entry 26, 'activity'
  entry 27, 'fitness_equipment'
  entry 28, 'length'
  entry 32, 'user_marker'
  entry 33, 'sport_point'
  entry 36, 'calibration'
  entry 37, 'vo2max' # guess
  entry 38, 'recovery_time' # guess (in minutes)
  entry 42, 'front_gear_change'
  entry 43, 'rear_gear_change'

  dict 'event_type'
  entry 0, 'start_time'
  entry 1, 'stop'
  entry 2, 'consecutive_depreciated'
  entry 3, 'marker'
  entry 4, 'stop_all'
  entry 5, 'begin_depreciated'
  entry 6, 'end_depreciated'
  entry 7, 'end_all_depreciated'
  entry 8, 'stop_disable'
  entry 9, 'stop_disable_all'

  dict 'file'
  entry 1, 'device'
  entry 2, 'settings'
  entry 3, 'sport'
  entry 4, 'activity'
  entry 5, 'workout'
  entry 6, 'course_point'
  entry 7, 'schedules'
  entry 9, 'weight_scale'
  entry 10, 'totals'
  entry 11, 'goals'
  entry 14, 'blood_pressure'
  entry 15, 'monitoring_a'
  entry 20, 'activity_summary'
  entry 28, 'monitoring_daily'
  entry 32, 'monitoring_b'

  dict 'gender'
  entry 0, 'female'
  entry 1, 'male'

  dict 'intensity'
  entry 0, 'active'
  entry 1, 'rest'
  entry 2, 'warmup'
  entry 3, 'cooldown'

  dict 'lap_trigger'
  entry 0, 'manual'
  entry 1, 'time'
  entry 2, 'distance'
  entry 3, 'position_start'
  entry 4, 'position_lap'
  entry 5, 'position_waypoint'
  entry 6, 'position_marked'
  entry 7, 'session_end'
  entry 8, 'fitness_equipment'

  dict 'manufacturer'
  entry 1, 'Garmin'
  entry 2, 'garmin_fr405_antfs'
  entry 3, 'zephyr'
  entry 4, 'dayton'
  entry 5, 'idt'
  entry 6, 'srm'
  entry 7, 'quarq'
  entry 8, 'ibike'
  entry 9, 'saris'
  entry 10, 'spark_hk'
  entry 11, 'tanita'
  entry 12, 'echowell'
  entry 13, 'dynastream_oem'
  entry 14, 'nautilus'
  entry 15, 'dynastream'
  entry 16, 'timex'
  entry 17, 'metrigear'
  entry 18, 'xelic'
  entry 19, 'beurer'
  entry 20, 'cardiosport'
  entry 21, 'a_and_d'
  entry 22, 'hmm'
  entry 23, 'suunto'
  entry 24, 'thita_elektronik'
  entry 25, 'gpulse'
  entry 26, 'clean_mobile'
  entry 27, 'pedal_brain'
  entry 28, 'peaksware'
  entry 29, 'saxonar'
  entry 30, 'lemond_fitness'
  entry 31, 'dexcom'
  entry 32, 'wahoo_fitness'
  entry 33, 'octane_fitness'
  entry 34, 'archinoetics'
  entry 35, 'the_hurt_box'
  entry 36, 'citizen_systems'
  entry 37, 'magellan'
  entry 38, 'osynce'
  entry 39, 'holux'
  entry 40, 'concept2'
  entry 42, 'one_giant_leap'
  entry 43, 'ace_sensor'
  entry 44, 'brim_brothers'
  entry 45, 'xplova'
  entry 46, 'perception_digital'
  entry 47, 'bf1systems'
  entry 48, 'pioneer'
  entry 49, 'spantec'
  entry 50, 'metalogics'
  entry 51, '4iiiis'
  entry 52, 'seiko_epson'
  entry 53, 'seiko_epson_oem'
  entry 54, 'ifor_powell'
  entry 55, 'maxwell_guider'
  entry 56, 'star_trac'
  entry 57, 'breakaway'
  entry 58, 'alatech_technology_ltd'
  entry 59, 'mio_technology_europe'
  entry 60, 'rotor'
  entry 61, 'geonaute'
  entry 62, 'id_bike'
  entry 63, 'specialized'
  entry 64, 'wtek'
  entry 65, 'physical_enterprises'
  entry 66, 'north_pole_engineering'
  entry 67, 'bkool'
  entry 68, 'cateye'
  entry 69, 'stages_cycling'
  entry 70, 'sigmasport'
  entry 71, 'tomtom'
  entry 72, 'peripedal'
  entry 73, 'wattbike'
  entry 74, 'moxy'
  entry 77, 'ciclosport'
  entry 78, 'powerbahn'
  entry 79, 'acorn_projects_aps'
  entry 80, 'lifebeam'
  entry 81, 'bontrager'
  entry 82, 'wellgo'
  entry 83, 'scosche'
  entry 84, 'magura'
  entry 85, 'woodway'
  entry 86, 'elite'
  entry 255, 'development'
  entry 5759, 'actigraphcorp'

  dict 'session_trigger'
  entry 0, 'activity_end'
  entry 1, 'manual'
  entry 2, 'auto_multi_sport'
  entry 3, 'fitness_equipment'

  dict 'sport'
  entry 0, 'generic'
  entry 1, 'running'
  entry 2, 'cycling'
  entry 3, 'transition'
  entry 4, 'fitness_equipment'
  entry 5, 'swimming'
  entry 6, 'basketball'
  entry 7, 'soccer'
  entry 8, 'tennis'
  entry 9, 'american_football'
  entry 10, 'training'
  entry 11, 'walking'
  entry 12, 'cross_country_skiing'
  entry 13, 'alpine_skiing'
  entry 14, 'snowboarding'
  entry 15, 'rowing'
  entry 16, 'mountaineering'
  entry 17, 'hiking'
  entry 18, 'multisport'
  entry 19, 'paddling'
  entry 254, 'all'

  dict 'sub_sport'
  entry 0, 'generic'
  entry 1, 'treadmill'
  entry 2, 'street'
  entry 3, 'trail'
  entry 4, 'track'
  entry 5, 'spin'
  entry 6, 'indoor_cycling'
  entry 7, 'road'
  entry 8, 'mountain'
  entry 9, 'downhill'
  entry 10, 'recumbent'
  entry 11, 'cyclocross'
  entry 12, 'hand_cycling'
  entry 13, 'track_cycling'
  entry 14, 'indoor_rowing'
  entry 15, 'elliptical'
  entry 16, 'stair_climbing'
  entry 17, 'lap_swimming'
  entry 18, 'open_water'
  entry 19, 'flexibility_training'
  entry 20, 'strength_training'
  entry 21, 'warm_up'
  entry 22, 'match'
  entry 23, 'exercise'
  entry 24, 'challenge'
  entry 25, 'indoor_skiing'
  entry 26, 'cardio_training'
  entry 254, 'all'

  dict 'product'
  entry 8, 'hrm_run_single_byte_product_id'
  entry 1623, 'fr620'
  entry 1632, 'fr220'
  entry 1752, 'hrm_run'
  entry 1928, 'fr620_japan'
  entry 1929, 'fr620_china'
  entry 1930, 'fr220_japan'
  entry 1931 , 'fr220_china'
  entry 10007, 'sdm4'

end

Class Method Summary collapse

Class Method Details

.read(file, dump = false) ⇒ Object



17
18
19
# File 'lib/fit4ruby.rb', line 17

def self.read(file, dump = false)
  FitFile.new.read(file, dump)
end

.write(file, activity) ⇒ Object



21
22
23
# File 'lib/fit4ruby.rb', line 21

def self.write(file, activity)
  FitFile.new.write(file, activity)
end