nmea 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +62 -0
- data/Rakefile +119 -0
- data/ext/extconf.rb +3 -0
- data/ext/nmea.c +789 -0
- data/ext/nmea.h +20 -0
- data/ext/ruby_nmea.c +65 -0
- data/ext/test.rb +47 -0
- data/init.rb +2 -0
- data/setup.rb +1555 -0
- data/test/helper.rb +8 -0
- data/test/mocks.rb +62 -0
- data/test/test_scan.rb +145 -0
- metadata +61 -0
    
        data/README
    ADDED
    
    | @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            Author::    Max Lapshin  (mailto:max@maxidoors.ru)
         | 
| 2 | 
            +
            Copyright:: Copyright (c) 2007 Max Lapshin, Getalime
         | 
| 3 | 
            +
            License::   Distributes under the same terms as Ruby
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            To use NMEA parser, you should somehow get data stream from Yor gps device.
         | 
| 6 | 
            +
            For example, You can use ruby-serialport (which seems to be dead, but working).
         | 
| 7 | 
            +
            The example on Mac with installed USB-Serial driver:
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            	require 'serialport'
         | 
| 10 | 
            +
            	require 'nmea'
         | 
| 11 | 
            +
            	@sp = SerialPort.open("/dev/tty.usbserial", 4800, 8, 1, SerialPort::NONE)
         | 
| 12 | 
            +
            	@handler = NMEAHandler.new
         | 
| 13 | 
            +
            	while(@sentence = @sp.gets) do
         | 
| 14 | 
            +
            	  NMEA.scan(@sentence, @handler)
         | 
| 15 | 
            +
            	end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            NMEAHandler is a user class, that implements following interface:
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            	class NMEAHandler
         | 
| 20 | 
            +
            	  def rmc(time, latitude, longitude, speed, course, magnetic_variation)
         | 
| 21 | 
            +
            	    # read further about types of latitude and longitude
         | 
| 22 | 
            +
            	  end
         | 
| 23 | 
            +
            	  def gsv(flag, satellites)
         | 
| 24 | 
            +
            	  end
         | 
| 25 | 
            +
            	  def gsa(mode_state, mode, satellites, pdop, hdop, vdop)
         | 
| 26 | 
            +
            	  end
         | 
| 27 | 
            +
            	  def gga(time, latitude, longitude, gps_quality, active_satellite_count, gsa_hdop, altitude, geoidal_height, dgps_data_age, dgps_station_id)
         | 
| 28 | 
            +
            	  end
         | 
| 29 | 
            +
            	end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            As you can see, the following NMEA sentences are supported currently: $GPRMC, $GPGSV, $GPGSA, $GPGGA.
         | 
| 32 | 
            +
            If you need more, please contact me and provide me with several examples. I will add support for them.
         | 
| 33 | 
            +
            NMEA::scan will not try to call unexistent method on your handler, thus you can implement only those
         | 
| 34 | 
            +
            methods in your handler, you need to.
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            GSV handler has parameter flag. This flag can take one of the following values: <code>:start</code>, <code>:continue</code>
         | 
| 37 | 
            +
             and <code>:finish</code>. GSV messages appears in packs of several sentences, but NMEA::scan is stateless, 
         | 
| 38 | 
            +
            thus your NMEAHandler should keep accumulate these messages.
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            It is important to mention, that NMEA::scan assumes, that You have classes GPS::Latitude and GPS::Longitude,
         | 
| 41 | 
            +
            which initializer, takes two arguments: degrees and minutes. You can use this example:
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            	module GPS
         | 
| 44 | 
            +
            	  AngleValue = Struct.new :degrees, :minutes
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            	  class AngleValue
         | 
| 47 | 
            +
            	    def to_s
         | 
| 48 | 
            +
            	      "%d %.4f%s" % [degrees.abs, minutes, symbol]
         | 
| 49 | 
            +
            	    end
         | 
| 50 | 
            +
            	  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            	  class Latitude < AngleValue
         | 
| 53 | 
            +
            	    def symbol
         | 
| 54 | 
            +
            	      degrees >= 0 ? "N" : "S"
         | 
| 55 | 
            +
            	    end
         | 
| 56 | 
            +
            	  end
         | 
| 57 | 
            +
            	  class Longitude < AngleValue
         | 
| 58 | 
            +
            	    def symbol
         | 
| 59 | 
            +
            	      degrees >= 0 ? "E" : "W"
         | 
| 60 | 
            +
            	    end
         | 
| 61 | 
            +
            	  end
         | 
| 62 | 
            +
            	end
         | 
    
        data/Rakefile
    ADDED
    
    | @@ -0,0 +1,119 @@ | |
| 1 | 
            +
            require 'rubygems'
         | 
| 2 | 
            +
            require 'rake/gempackagetask'
         | 
| 3 | 
            +
            require 'rake/testtask'
         | 
| 4 | 
            +
            require 'rake/rdoctask'
         | 
| 5 | 
            +
            require 'rake/packagetask'
         | 
| 6 | 
            +
            require 'rake/contrib/rubyforgepublisher'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            PKG_NAME = "nmea"
         | 
| 9 | 
            +
            PKG_VERSION = "0.1"
         | 
| 10 | 
            +
            PKG_AUTHOR = "Max Lapshin"
         | 
| 11 | 
            +
            PKG_EMAIL = "max@maxidoors.ru"
         | 
| 12 | 
            +
            PKG_HOMEPAGE = "http://maxidoors.ru/"
         | 
| 13 | 
            +
            PKG_SUMMARY = "NMEA (GPS protocol) parser"
         | 
| 14 | 
            +
            PKG_SVN = "http://svn.maxidoors.ru/ruby-nmea/"
         | 
| 15 | 
            +
            PKG_RDOC_OPTS = ['--main=README',
         | 
| 16 | 
            +
                             '--line-numbers',
         | 
| 17 | 
            +
                             '--webcvs='+PKG_SVN,
         | 
| 18 | 
            +
                             '--charset=utf-8',
         | 
| 19 | 
            +
                             '--promiscuous']
         | 
| 20 | 
            +
             | 
| 21 | 
            +
             | 
| 22 | 
            +
            spec = Gem::Specification.new do |s|
         | 
| 23 | 
            +
              s.name = PKG_NAME
         | 
| 24 | 
            +
              s.version = PKG_VERSION
         | 
| 25 | 
            +
              s.author = PKG_AUTHOR
         | 
| 26 | 
            +
              s.email = PKG_EMAIL
         | 
| 27 | 
            +
              s.homepage = PKG_HOMEPAGE
         | 
| 28 | 
            +
              s.platform = Gem::Platform::RUBY
         | 
| 29 | 
            +
              s.summary = PKG_SUMMARY
         | 
| 30 | 
            +
              s.require_path = "lib"
         | 
| 31 | 
            +
              s.rubyforge_project = PKG_NAME
         | 
| 32 | 
            +
              s.files = %w(README Rakefile setup.rb init.rb) +
         | 
| 33 | 
            +
                Dir.glob("{test}/**/*") + 
         | 
| 34 | 
            +
                Dir.glob("ext/**/*.{h,c,cpp,rb,hpp}") +
         | 
| 35 | 
            +
                Dir.glob("lib/**/*.rb")
         | 
| 36 | 
            +
              s.test_files = FileList["test/test_*.rb"].to_a
         | 
| 37 | 
            +
              s.has_rdoc = true
         | 
| 38 | 
            +
              s.rdoc_options = PKG_RDOC_OPTS
         | 
| 39 | 
            +
              s.extensions << 'ext/extconf.rb'
         | 
| 40 | 
            +
            end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            Rake::GemPackageTask.new(spec) do |pkg|
         | 
| 43 | 
            +
              pkg.need_tar = true
         | 
| 44 | 
            +
            end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            task :default => [ :test ]
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            desc "Run all tests"
         | 
| 49 | 
            +
            Rake::TestTask.new("test") { |t|
         | 
| 50 | 
            +
              t.libs << "test"
         | 
| 51 | 
            +
              t.pattern = 'test/test_*.rb'
         | 
| 52 | 
            +
              t.verbose = true
         | 
| 53 | 
            +
            }
         | 
| 54 | 
            +
             | 
| 55 | 
            +
             | 
| 56 | 
            +
            desc "Report KLOCs"
         | 
| 57 | 
            +
            task :stats  do
         | 
| 58 | 
            +
              require 'code_statistics'
         | 
| 59 | 
            +
              CodeStatistics.new(
         | 
| 60 | 
            +
                ["Libraries", "lib"], 
         | 
| 61 | 
            +
                ["Units", "test"]
         | 
| 62 | 
            +
              ).to_s
         | 
| 63 | 
            +
            end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
             | 
| 66 | 
            +
             | 
| 67 | 
            +
            desc "Generate RDoc documentation"
         | 
| 68 | 
            +
            Rake::RDocTask.new("doc") do |rdoc|
         | 
| 69 | 
            +
              rdoc.rdoc_dir = 'doc'
         | 
| 70 | 
            +
              rdoc.title  = PKG_SUMMARY
         | 
| 71 | 
            +
              rdoc.rdoc_files.include('README')
         | 
| 72 | 
            +
            #  rdoc.rdoc_files.include('CHANGELOG')
         | 
| 73 | 
            +
            #  rdoc.rdoc_files.include('TODO')
         | 
| 74 | 
            +
              rdoc.options = PKG_RDOC_OPTS
         | 
| 75 | 
            +
              rdoc.rdoc_files.include "ext/ruby_nmea.c"
         | 
| 76 | 
            +
            end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            #Rake::GemPackageTask.new(spec) do |p|
         | 
| 79 | 
            +
            #  p.gem_spec = spec
         | 
| 80 | 
            +
            #  p.need_tar = true
         | 
| 81 | 
            +
            #  p.need_zip = true
         | 
| 82 | 
            +
            #end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            desc "Remove packaging products (doc and pkg) - they are not source-managed"
         | 
| 85 | 
            +
            task :clobber do
         | 
| 86 | 
            +
            	`rm -rf ./doc`
         | 
| 87 | 
            +
            	`rm -rf ./pkg`
         | 
| 88 | 
            +
            end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            desc "Publish the new docs"
         | 
| 91 | 
            +
            task :publish_docs => [:clobber, :doc] do
         | 
| 92 | 
            +
              push_docs
         | 
| 93 | 
            +
            end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
            desc "Push docs to servers"
         | 
| 96 | 
            +
            task :push_docs do
         | 
| 97 | 
            +
              user = "max_lapshin@nmea.rubyforge.org" 
         | 
| 98 | 
            +
              project = '/var/www/gforge-projects/nmea/doc'
         | 
| 99 | 
            +
              local_dir = 'doc'
         | 
| 100 | 
            +
              [ 
         | 
| 101 | 
            +
                Rake::SshDirPublisher.new( user, project, local_dir),
         | 
| 102 | 
            +
              ].each { |p| p.upload }
         | 
| 103 | 
            +
            end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            desc "Build binary driver"
         | 
| 106 | 
            +
            task :build do
         | 
| 107 | 
            +
              puts `cd ext; [ -e Makefile ] || ruby extconf.rb; make`
         | 
| 108 | 
            +
            end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            desc "Rebuild binary driver"
         | 
| 111 | 
            +
            task :rebuild do
         | 
| 112 | 
            +
              puts `cd ext; ruby extconf.rb; make clean all`
         | 
| 113 | 
            +
            end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            desc "Mark files in SVN"
         | 
| 116 | 
            +
            task :release => [:clobber, :package] do
         | 
| 117 | 
            +
                svn_aware_revision = 'r_' + PKG_VERSION.gsub(/-|\./, '_')
         | 
| 118 | 
            +
                puts `svn copy #{PKG_SVN}/trunk #{PKG_SVN}/tags/#{svn_aware_revision} -m "release #{svn_aware_revision}"`
         | 
| 119 | 
            +
            end
         | 
    
        data/ext/extconf.rb
    ADDED
    
    
    
        data/ext/nmea.c
    ADDED
    
    | @@ -0,0 +1,789 @@ | |
| 1 | 
            +
            #line 1 "nmea.rl"
         | 
| 2 | 
            +
            #include "nmea.h"
         | 
| 3 | 
            +
            #define TIME_NEW create_gmtime(utc_year, utc_month, utc_day, utc_hours, utc_minutes, utc_seconds, utc_useconds)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            static VALUE create_gmtime(int year, int month, int day, int hour, int minute, int second, int usec) {
         | 
| 6 | 
            +
            	return rb_funcall(rb_cTime, rb_intern("utc"), 7, INT2FIX(year ?: 1970), INT2FIX(month ?: 1), INT2FIX(day?:1), INT2FIX(hour), INT2FIX(minute), INT2FIX(second), INT2FIX(usec));
         | 
| 7 | 
            +
            }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
             | 
| 10 | 
            +
            #line 72 "nmea.rl"
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
            #line 16 "../ext/nmea.c"
         | 
| 16 | 
            +
            static const char _NMEA_actions[] = {
         | 
| 17 | 
            +
            	0, 1, 0, 1, 1, 1, 2, 1, 
         | 
| 18 | 
            +
            	3, 1, 4, 1, 5, 1, 6, 1, 
         | 
| 19 | 
            +
            	17, 1, 19, 1, 20, 1, 21, 1, 
         | 
| 20 | 
            +
            	23, 1, 24, 1, 25, 1, 26, 1, 
         | 
| 21 | 
            +
            	27, 1, 28, 1, 29, 1, 30, 1, 
         | 
| 22 | 
            +
            	31, 1, 33, 1, 34, 1, 35, 1, 
         | 
| 23 | 
            +
            	36, 1, 37, 1, 38, 1, 40, 1, 
         | 
| 24 | 
            +
            	42, 1, 43, 1, 44, 1, 45, 1, 
         | 
| 25 | 
            +
            	46, 1, 48, 1, 49, 1, 51, 1, 
         | 
| 26 | 
            +
            	52, 1, 53, 1, 54, 1, 55, 1, 
         | 
| 27 | 
            +
            	56, 1, 57, 1, 58, 1, 59, 1, 
         | 
| 28 | 
            +
            	60, 2, 3, 50, 2, 5, 8, 2, 
         | 
| 29 | 
            +
            	5, 9, 2, 5, 10, 2, 5, 12, 
         | 
| 30 | 
            +
            	2, 5, 13, 2, 5, 14, 2, 5, 
         | 
| 31 | 
            +
            	15, 2, 5, 39, 2, 6, 11, 2, 
         | 
| 32 | 
            +
            	6, 15, 2, 7, 61, 2, 16, 17, 
         | 
| 33 | 
            +
            	2, 18, 19, 2, 18, 30, 2, 22, 
         | 
| 34 | 
            +
            	32, 2, 22, 47, 2, 22, 62, 3, 
         | 
| 35 | 
            +
            	22, 40, 41
         | 
| 36 | 
            +
            };
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            static const short _NMEA_key_offsets[] = {
         | 
| 39 | 
            +
            	0, 0, 1, 2, 3, 5, 7, 8, 
         | 
| 40 | 
            +
            	9, 11, 13, 15, 17, 19, 21, 22, 
         | 
| 41 | 
            +
            	24, 26, 28, 29, 32, 33, 36, 37, 
         | 
| 42 | 
            +
            	41, 42, 45, 48, 51, 55, 56, 59, 
         | 
| 43 | 
            +
            	60, 63, 65, 67, 69, 71, 72, 78, 
         | 
| 44 | 
            +
            	84, 85, 88, 90, 93, 96, 98, 101, 
         | 
| 45 | 
            +
            	105, 106, 109, 111, 114, 118, 119, 122, 
         | 
| 46 | 
            +
            	124, 127, 129, 130, 132, 134, 136, 139, 
         | 
| 47 | 
            +
            	141, 144, 146, 148, 150, 153, 155, 158, 
         | 
| 48 | 
            +
            	160, 162, 163, 165, 166, 168, 169, 172, 
         | 
| 49 | 
            +
            	175, 178, 181, 184, 187, 190, 193, 196, 
         | 
| 50 | 
            +
            	199, 202, 205, 208, 211, 214, 220, 226, 
         | 
| 51 | 
            +
            	229, 231, 234, 237, 239, 242, 245, 247, 
         | 
| 52 | 
            +
            	250, 251, 253, 256, 258, 261, 263, 266, 
         | 
| 53 | 
            +
            	268, 271, 273, 276, 278, 281, 284, 286, 
         | 
| 54 | 
            +
            	289, 291, 294, 296, 299, 303, 309, 315, 
         | 
| 55 | 
            +
            	317, 319, 321, 322, 323, 324, 325, 327, 
         | 
| 56 | 
            +
            	329, 331, 333, 335, 337, 338, 340, 342, 
         | 
| 57 | 
            +
            	344, 345, 347, 348, 351, 352, 355, 356, 
         | 
| 58 | 
            +
            	359, 362, 364, 366, 368, 370, 372, 374, 
         | 
| 59 | 
            +
            	375, 378, 379, 385, 391, 394, 396, 399, 
         | 
| 60 | 
            +
            	401, 404, 406, 409, 412, 414, 417, 419, 
         | 
| 61 | 
            +
            	421, 423, 426, 428, 431, 433, 435, 437, 
         | 
| 62 | 
            +
            	440, 442, 445, 447, 450
         | 
| 63 | 
            +
            };
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            static const char _NMEA_trans_keys[] = {
         | 
| 66 | 
            +
            	36, 71, 80, 71, 82, 71, 83, 65, 
         | 
| 67 | 
            +
            	44, 48, 57, 48, 57, 48, 57, 48, 
         | 
| 68 | 
            +
            	57, 48, 57, 48, 57, 46, 48, 57, 
         | 
| 69 | 
            +
            	48, 57, 48, 57, 44, 44, 48, 57, 
         | 
| 70 | 
            +
            	44, 44, 48, 57, 44, 48, 49, 50, 
         | 
| 71 | 
            +
            	54, 44, 44, 48, 57, 44, 48, 57, 
         | 
| 72 | 
            +
            	44, 48, 57, 65, 90, 97, 122, 44, 
         | 
| 73 | 
            +
            	44, 48, 57, 44, 44, 48, 57, 48, 
         | 
| 74 | 
            +
            	57, 48, 57, 48, 57, 48, 57, 42, 
         | 
| 75 | 
            +
            	48, 57, 65, 90, 97, 122, 48, 57, 
         | 
| 76 | 
            +
            	65, 90, 97, 122, 10, 46, 48, 57, 
         | 
| 77 | 
            +
            	48, 57, 44, 48, 57, 46, 48, 57, 
         | 
| 78 | 
            +
            	48, 57, 44, 48, 57, 65, 90, 97, 
         | 
| 79 | 
            +
            	122, 44, 46, 48, 57, 48, 57, 44, 
         | 
| 80 | 
            +
            	48, 57, 65, 90, 97, 122, 44, 46, 
         | 
| 81 | 
            +
            	48, 57, 48, 57, 44, 48, 57, 48, 
         | 
| 82 | 
            +
            	57, 44, 48, 57, 48, 57, 48, 57, 
         | 
| 83 | 
            +
            	46, 48, 57, 48, 57, 44, 48, 57, 
         | 
| 84 | 
            +
            	69, 87, 48, 57, 48, 57, 46, 48, 
         | 
| 85 | 
            +
            	57, 48, 57, 44, 48, 57, 78, 83, 
         | 
| 86 | 
            +
            	65, 86, 44, 65, 77, 44, 49, 51, 
         | 
| 87 | 
            +
            	44, 44, 48, 57, 44, 48, 57, 44, 
         | 
| 88 | 
            +
            	48, 57, 44, 48, 57, 44, 48, 57, 
         | 
| 89 | 
            +
            	44, 48, 57, 44, 48, 57, 44, 48, 
         | 
| 90 | 
            +
            	57, 44, 48, 57, 44, 48, 57, 44, 
         | 
| 91 | 
            +
            	48, 57, 44, 48, 57, 44, 48, 57, 
         | 
| 92 | 
            +
            	44, 48, 57, 42, 48, 57, 48, 57, 
         | 
| 93 | 
            +
            	65, 90, 97, 122, 48, 57, 65, 90, 
         | 
| 94 | 
            +
            	97, 122, 46, 48, 57, 48, 57, 42, 
         | 
| 95 | 
            +
            	48, 57, 46, 48, 57, 48, 57, 44, 
         | 
| 96 | 
            +
            	48, 57, 46, 48, 57, 48, 57, 44, 
         | 
| 97 | 
            +
            	48, 57, 44, 48, 57, 44, 48, 57, 
         | 
| 98 | 
            +
            	48, 57, 44, 48, 57, 48, 57, 44, 
         | 
| 99 | 
            +
            	48, 57, 48, 57, 44, 48, 57, 48, 
         | 
| 100 | 
            +
            	57, 44, 48, 57, 48, 57, 44, 48, 
         | 
| 101 | 
            +
            	57, 44, 48, 57, 48, 57, 44, 48, 
         | 
| 102 | 
            +
            	57, 48, 57, 44, 48, 57, 48, 57, 
         | 
| 103 | 
            +
            	44, 48, 57, 42, 44, 48, 57, 48, 
         | 
| 104 | 
            +
            	57, 65, 90, 97, 122, 48, 57, 65, 
         | 
| 105 | 
            +
            	90, 97, 122, 48, 57, 42, 44, 48, 
         | 
| 106 | 
            +
            	57, 44, 77, 67, 44, 48, 57, 48, 
         | 
| 107 | 
            +
            	57, 48, 57, 48, 57, 48, 57, 48, 
         | 
| 108 | 
            +
            	57, 46, 48, 57, 48, 57, 48, 57, 
         | 
| 109 | 
            +
            	44, 65, 86, 44, 44, 48, 57, 44, 
         | 
| 110 | 
            +
            	44, 48, 57, 44, 44, 48, 57, 44, 
         | 
| 111 | 
            +
            	48, 57, 48, 57, 48, 57, 48, 57, 
         | 
| 112 | 
            +
            	48, 57, 48, 57, 48, 57, 44, 44, 
         | 
| 113 | 
            +
            	48, 57, 42, 48, 57, 65, 90, 97, 
         | 
| 114 | 
            +
            	122, 48, 57, 65, 90, 97, 122, 46, 
         | 
| 115 | 
            +
            	48, 57, 48, 57, 44, 48, 57, 69, 
         | 
| 116 | 
            +
            	87, 46, 48, 57, 48, 57, 44, 48, 
         | 
| 117 | 
            +
            	57, 46, 48, 57, 48, 57, 44, 48, 
         | 
| 118 | 
            +
            	57, 48, 57, 48, 57, 48, 57, 46, 
         | 
| 119 | 
            +
            	48, 57, 48, 57, 44, 48, 57, 69, 
         | 
| 120 | 
            +
            	87, 48, 57, 48, 57, 46, 48, 57, 
         | 
| 121 | 
            +
            	48, 57, 44, 48, 57, 78, 83, 10, 
         | 
| 122 | 
            +
            	13, 36, 36, 0
         | 
| 123 | 
            +
            };
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            static const char _NMEA_single_lengths[] = {
         | 
| 126 | 
            +
            	0, 1, 1, 1, 2, 2, 1, 1, 
         | 
| 127 | 
            +
            	0, 0, 0, 0, 0, 0, 1, 0, 
         | 
| 128 | 
            +
            	0, 0, 1, 1, 1, 1, 1, 4, 
         | 
| 129 | 
            +
            	1, 1, 1, 1, 0, 1, 1, 1, 
         | 
| 130 | 
            +
            	1, 0, 0, 0, 0, 1, 0, 0, 
         | 
| 131 | 
            +
            	1, 1, 0, 1, 1, 0, 1, 0, 
         | 
| 132 | 
            +
            	1, 1, 0, 1, 0, 1, 1, 0, 
         | 
| 133 | 
            +
            	1, 0, 1, 0, 0, 0, 1, 0, 
         | 
| 134 | 
            +
            	1, 2, 0, 0, 1, 0, 1, 2, 
         | 
| 135 | 
            +
            	2, 1, 2, 1, 0, 1, 1, 1, 
         | 
| 136 | 
            +
            	1, 1, 1, 1, 1, 1, 1, 1, 
         | 
| 137 | 
            +
            	1, 1, 1, 1, 1, 0, 0, 1, 
         | 
| 138 | 
            +
            	0, 1, 1, 0, 1, 1, 0, 1, 
         | 
| 139 | 
            +
            	1, 0, 1, 0, 1, 0, 1, 0, 
         | 
| 140 | 
            +
            	1, 0, 1, 0, 1, 1, 0, 1, 
         | 
| 141 | 
            +
            	0, 1, 0, 1, 2, 0, 0, 0, 
         | 
| 142 | 
            +
            	2, 0, 1, 1, 1, 1, 0, 0, 
         | 
| 143 | 
            +
            	0, 0, 0, 0, 1, 0, 0, 0, 
         | 
| 144 | 
            +
            	1, 2, 1, 1, 1, 1, 1, 1, 
         | 
| 145 | 
            +
            	1, 0, 0, 0, 0, 0, 0, 1, 
         | 
| 146 | 
            +
            	1, 1, 0, 0, 1, 0, 1, 2, 
         | 
| 147 | 
            +
            	1, 0, 1, 1, 0, 1, 0, 0, 
         | 
| 148 | 
            +
            	0, 1, 0, 1, 2, 0, 0, 1, 
         | 
| 149 | 
            +
            	0, 1, 2, 3, 1
         | 
| 150 | 
            +
            };
         | 
| 151 | 
            +
             | 
| 152 | 
            +
            static const char _NMEA_range_lengths[] = {
         | 
| 153 | 
            +
            	0, 0, 0, 0, 0, 0, 0, 0, 
         | 
| 154 | 
            +
            	1, 1, 1, 1, 1, 1, 0, 1, 
         | 
| 155 | 
            +
            	1, 1, 0, 1, 0, 1, 0, 0, 
         | 
| 156 | 
            +
            	0, 1, 1, 1, 2, 0, 1, 0, 
         | 
| 157 | 
            +
            	1, 1, 1, 1, 1, 0, 3, 3, 
         | 
| 158 | 
            +
            	0, 1, 1, 1, 1, 1, 1, 2, 
         | 
| 159 | 
            +
            	0, 1, 1, 1, 2, 0, 1, 1, 
         | 
| 160 | 
            +
            	1, 1, 0, 1, 1, 1, 1, 1, 
         | 
| 161 | 
            +
            	1, 0, 1, 1, 1, 1, 1, 0, 
         | 
| 162 | 
            +
            	0, 0, 0, 0, 1, 0, 1, 1, 
         | 
| 163 | 
            +
            	1, 1, 1, 1, 1, 1, 1, 1, 
         | 
| 164 | 
            +
            	1, 1, 1, 1, 1, 3, 3, 1, 
         | 
| 165 | 
            +
            	1, 1, 1, 1, 1, 1, 1, 1, 
         | 
| 166 | 
            +
            	0, 1, 1, 1, 1, 1, 1, 1, 
         | 
| 167 | 
            +
            	1, 1, 1, 1, 1, 1, 1, 1, 
         | 
| 168 | 
            +
            	1, 1, 1, 1, 1, 3, 3, 1, 
         | 
| 169 | 
            +
            	0, 1, 0, 0, 0, 0, 1, 1, 
         | 
| 170 | 
            +
            	1, 1, 1, 1, 0, 1, 1, 1, 
         | 
| 171 | 
            +
            	0, 0, 0, 1, 0, 1, 0, 1, 
         | 
| 172 | 
            +
            	1, 1, 1, 1, 1, 1, 1, 0, 
         | 
| 173 | 
            +
            	1, 0, 3, 3, 1, 1, 1, 0, 
         | 
| 174 | 
            +
            	1, 1, 1, 1, 1, 1, 1, 1, 
         | 
| 175 | 
            +
            	1, 1, 1, 1, 0, 1, 1, 1, 
         | 
| 176 | 
            +
            	1, 1, 0, 0, 0
         | 
| 177 | 
            +
            };
         | 
| 178 | 
            +
             | 
| 179 | 
            +
            static const short _NMEA_index_offsets[] = {
         | 
| 180 | 
            +
            	0, 0, 2, 4, 6, 9, 12, 14, 
         | 
| 181 | 
            +
            	16, 18, 20, 22, 24, 26, 28, 30, 
         | 
| 182 | 
            +
            	32, 34, 36, 38, 41, 43, 46, 48, 
         | 
| 183 | 
            +
            	53, 55, 58, 61, 64, 67, 69, 72, 
         | 
| 184 | 
            +
            	74, 77, 79, 81, 83, 85, 87, 91, 
         | 
| 185 | 
            +
            	95, 97, 100, 102, 105, 108, 110, 113, 
         | 
| 186 | 
            +
            	116, 118, 121, 123, 126, 129, 131, 134, 
         | 
| 187 | 
            +
            	136, 139, 141, 143, 145, 147, 149, 152, 
         | 
| 188 | 
            +
            	154, 157, 160, 162, 164, 167, 169, 172, 
         | 
| 189 | 
            +
            	175, 178, 180, 183, 185, 187, 189, 192, 
         | 
| 190 | 
            +
            	195, 198, 201, 204, 207, 210, 213, 216, 
         | 
| 191 | 
            +
            	219, 222, 225, 228, 231, 234, 238, 242, 
         | 
| 192 | 
            +
            	245, 247, 250, 253, 255, 258, 261, 263, 
         | 
| 193 | 
            +
            	266, 268, 270, 273, 275, 278, 280, 283, 
         | 
| 194 | 
            +
            	285, 288, 290, 293, 295, 298, 301, 303, 
         | 
| 195 | 
            +
            	306, 308, 311, 313, 316, 320, 324, 328, 
         | 
| 196 | 
            +
            	330, 333, 335, 337, 339, 341, 343, 345, 
         | 
| 197 | 
            +
            	347, 349, 351, 353, 355, 357, 359, 361, 
         | 
| 198 | 
            +
            	363, 365, 368, 370, 373, 375, 378, 380, 
         | 
| 199 | 
            +
            	383, 386, 388, 390, 392, 394, 396, 398, 
         | 
| 200 | 
            +
            	400, 403, 405, 409, 413, 416, 418, 421, 
         | 
| 201 | 
            +
            	424, 427, 429, 432, 435, 437, 440, 442, 
         | 
| 202 | 
            +
            	444, 446, 449, 451, 454, 457, 459, 461, 
         | 
| 203 | 
            +
            	464, 466, 469, 472, 476
         | 
| 204 | 
            +
            };
         | 
| 205 | 
            +
             | 
| 206 | 
            +
            static const unsigned char _NMEA_indicies[] = {
         | 
| 207 | 
            +
            	0, 1, 2, 1, 3, 1, 4, 5, 
         | 
| 208 | 
            +
            	1, 6, 7, 1, 8, 1, 9, 1, 
         | 
| 209 | 
            +
            	10, 1, 11, 1, 12, 1, 13, 1, 
         | 
| 210 | 
            +
            	14, 1, 15, 1, 16, 1, 17, 1, 
         | 
| 211 | 
            +
            	18, 1, 19, 1, 20, 1, 21, 22, 
         | 
| 212 | 
            +
            	1, 23, 1, 24, 25, 1, 26, 1, 
         | 
| 213 | 
            +
            	27, 28, 29, 30, 1, 31, 1, 32, 
         | 
| 214 | 
            +
            	33, 1, 34, 35, 1, 36, 37, 1, 
         | 
| 215 | 
            +
            	38, 38, 1, 39, 1, 40, 41, 1, 
         | 
| 216 | 
            +
            	42, 1, 43, 44, 1, 45, 1, 46, 
         | 
| 217 | 
            +
            	1, 47, 1, 48, 1, 49, 1, 50, 
         | 
| 218 | 
            +
            	50, 50, 1, 51, 51, 51, 1, 52, 
         | 
| 219 | 
            +
            	1, 53, 44, 1, 54, 1, 55, 54, 
         | 
| 220 | 
            +
            	1, 56, 41, 1, 57, 1, 58, 57, 
         | 
| 221 | 
            +
            	1, 59, 59, 1, 60, 1, 61, 37, 
         | 
| 222 | 
            +
            	1, 62, 1, 63, 62, 1, 64, 64, 
         | 
| 223 | 
            +
            	1, 65, 1, 66, 35, 1, 67, 1, 
         | 
| 224 | 
            +
            	68, 67, 1, 69, 1, 70, 1, 71, 
         | 
| 225 | 
            +
            	1, 72, 1, 73, 1, 74, 73, 1, 
         | 
| 226 | 
            +
            	75, 1, 76, 75, 1, 77, 78, 1, 
         | 
| 227 | 
            +
            	79, 1, 80, 1, 81, 80, 1, 82, 
         | 
| 228 | 
            +
            	1, 83, 82, 1, 84, 85, 1, 86, 
         | 
| 229 | 
            +
            	87, 1, 88, 1, 89, 90, 1, 91, 
         | 
| 230 | 
            +
            	1, 92, 1, 93, 1, 94, 95, 1, 
         | 
| 231 | 
            +
            	96, 97, 1, 98, 99, 1, 100, 101, 
         | 
| 232 | 
            +
            	1, 102, 103, 1, 104, 105, 1, 106, 
         | 
| 233 | 
            +
            	107, 1, 108, 109, 1, 110, 111, 1, 
         | 
| 234 | 
            +
            	112, 113, 1, 114, 115, 1, 116, 117, 
         | 
| 235 | 
            +
            	1, 118, 119, 1, 120, 121, 1, 122, 
         | 
| 236 | 
            +
            	123, 1, 124, 124, 124, 1, 125, 125, 
         | 
| 237 | 
            +
            	125, 1, 126, 123, 1, 127, 1, 122, 
         | 
| 238 | 
            +
            	127, 1, 128, 121, 1, 129, 1, 130, 
         | 
| 239 | 
            +
            	129, 1, 131, 119, 1, 132, 1, 133, 
         | 
| 240 | 
            +
            	132, 1, 134, 1, 135, 1, 136, 135, 
         | 
| 241 | 
            +
            	1, 137, 1, 138, 137, 1, 139, 1, 
         | 
| 242 | 
            +
            	140, 139, 1, 141, 1, 142, 141, 1, 
         | 
| 243 | 
            +
            	143, 1, 144, 143, 1, 145, 1, 146, 
         | 
| 244 | 
            +
            	145, 1, 147, 148, 1, 149, 1, 150, 
         | 
| 245 | 
            +
            	149, 1, 151, 1, 152, 151, 1, 153, 
         | 
| 246 | 
            +
            	1, 154, 153, 1, 155, 147, 156, 1, 
         | 
| 247 | 
            +
            	157, 157, 157, 1, 158, 158, 158, 1, 
         | 
| 248 | 
            +
            	159, 1, 155, 147, 1, 160, 1, 147, 
         | 
| 249 | 
            +
            	1, 161, 1, 162, 1, 163, 1, 164, 
         | 
| 250 | 
            +
            	1, 165, 1, 166, 1, 167, 1, 168, 
         | 
| 251 | 
            +
            	1, 169, 1, 170, 1, 171, 1, 172, 
         | 
| 252 | 
            +
            	1, 173, 1, 174, 1, 175, 176, 1, 
         | 
| 253 | 
            +
            	177, 1, 178, 179, 1, 180, 1, 181, 
         | 
| 254 | 
            +
            	182, 1, 183, 1, 184, 185, 1, 186, 
         | 
| 255 | 
            +
            	187, 1, 188, 1, 189, 1, 190, 1, 
         | 
| 256 | 
            +
            	191, 1, 192, 1, 193, 1, 194, 1, 
         | 
| 257 | 
            +
            	195, 196, 1, 197, 1, 198, 198, 198, 
         | 
| 258 | 
            +
            	1, 199, 199, 199, 1, 200, 196, 1, 
         | 
| 259 | 
            +
            	201, 1, 202, 201, 1, 203, 204, 1, 
         | 
| 260 | 
            +
            	205, 187, 1, 206, 1, 207, 206, 1, 
         | 
| 261 | 
            +
            	208, 185, 1, 209, 1, 210, 209, 1, 
         | 
| 262 | 
            +
            	211, 1, 212, 1, 213, 1, 214, 213, 
         | 
| 263 | 
            +
            	1, 215, 1, 216, 215, 1, 217, 218, 
         | 
| 264 | 
            +
            	1, 219, 1, 220, 1, 221, 220, 1, 
         | 
| 265 | 
            +
            	222, 1, 223, 222, 1, 224, 225, 1, 
         | 
| 266 | 
            +
            	52, 226, 0, 1, 0, 1, 0
         | 
| 267 | 
            +
            };
         | 
| 268 | 
            +
             | 
| 269 | 
            +
            static const unsigned char _NMEA_trans_targs_wi[] = {
         | 
| 270 | 
            +
            	2, 0, 3, 4, 5, 131, 6, 72, 
         | 
| 271 | 
            +
            	7, 8, 9, 10, 11, 12, 13, 14, 
         | 
| 272 | 
            +
            	15, 16, 17, 18, 19, 20, 66, 21, 
         | 
| 273 | 
            +
            	22, 59, 23, 24, 24, 24, 24, 25, 
         | 
| 274 | 
            +
            	26, 57, 27, 54, 28, 49, 29, 30, 
         | 
| 275 | 
            +
            	31, 44, 32, 33, 41, 34, 35, 36, 
         | 
| 276 | 
            +
            	37, 38, 39, 187, 188, 42, 43, 33, 
         | 
| 277 | 
            +
            	45, 46, 47, 48, 32, 50, 51, 52, 
         | 
| 278 | 
            +
            	53, 30, 55, 56, 27, 58, 26, 60, 
         | 
| 279 | 
            +
            	61, 62, 63, 64, 65, 22, 22, 67, 
         | 
| 280 | 
            +
            	68, 69, 70, 71, 20, 20, 73, 104, 
         | 
| 281 | 
            +
            	74, 75, 75, 76, 77, 78, 79, 78, 
         | 
| 282 | 
            +
            	80, 79, 81, 80, 82, 81, 83, 82, 
         | 
| 283 | 
            +
            	84, 83, 85, 84, 86, 85, 87, 86, 
         | 
| 284 | 
            +
            	88, 87, 89, 88, 90, 89, 91, 101, 
         | 
| 285 | 
            +
            	92, 98, 93, 95, 94, 187, 96, 97, 
         | 
| 286 | 
            +
            	99, 100, 92, 102, 103, 91, 105, 106, 
         | 
| 287 | 
            +
            	107, 108, 109, 110, 111, 112, 113, 114, 
         | 
| 288 | 
            +
            	115, 116, 117, 118, 129, 119, 120, 121, 
         | 
| 289 | 
            +
            	122, 123, 124, 125, 127, 126, 187, 128, 
         | 
| 290 | 
            +
            	130, 132, 133, 134, 135, 136, 137, 138, 
         | 
| 291 | 
            +
            	139, 140, 141, 142, 143, 144, 145, 146, 
         | 
| 292 | 
            +
            	146, 147, 148, 181, 149, 150, 174, 151, 
         | 
| 293 | 
            +
            	152, 171, 153, 168, 154, 155, 156, 157, 
         | 
| 294 | 
            +
            	158, 159, 160, 161, 164, 162, 163, 187, 
         | 
| 295 | 
            +
            	165, 166, 167, 161, 161, 169, 170, 153, 
         | 
| 296 | 
            +
            	172, 173, 152, 175, 176, 177, 178, 179, 
         | 
| 297 | 
            +
            	180, 150, 150, 182, 183, 184, 185, 186, 
         | 
| 298 | 
            +
            	148, 148, 40
         | 
| 299 | 
            +
            };
         | 
| 300 | 
            +
             | 
| 301 | 
            +
            static const unsigned char _NMEA_trans_actions_wi[] = {
         | 
| 302 | 
            +
            	0, 0, 0, 0, 0, 0, 0, 0, 
         | 
| 303 | 
            +
            	0, 0, 9, 92, 9, 95, 9, 98, 
         | 
| 304 | 
            +
            	0, 9, 11, 116, 0, 0, 9, 0, 
         | 
| 305 | 
            +
            	0, 9, 0, 69, 71, 73, 75, 0, 
         | 
| 306 | 
            +
            	0, 9, 0, 3, 0, 3, 0, 0, 
         | 
| 307 | 
            +
            	0, 3, 0, 0, 3, 9, 11, 13, 
         | 
| 308 | 
            +
            	122, 19, 21, 140, 1, 5, 7, 87, 
         | 
| 309 | 
            +
            	5, 7, 0, 83, 85, 5, 7, 0, 
         | 
| 310 | 
            +
            	79, 81, 5, 7, 67, 11, 77, 11, 
         | 
| 311 | 
            +
            	119, 3, 5, 7, 0, 17, 128, 110, 
         | 
| 312 | 
            +
            	3, 5, 7, 0, 15, 125, 0, 0, 
         | 
| 313 | 
            +
            	0, 57, 55, 0, 59, 61, 63, 3, 
         | 
| 314 | 
            +
            	63, 3, 63, 3, 63, 3, 63, 3, 
         | 
| 315 | 
            +
            	63, 3, 63, 3, 63, 3, 63, 3, 
         | 
| 316 | 
            +
            	63, 3, 63, 3, 63, 3, 0, 3, 
         | 
| 317 | 
            +
            	0, 3, 19, 3, 21, 137, 5, 89, 
         | 
| 318 | 
            +
            	5, 7, 67, 5, 7, 65, 0, 3, 
         | 
| 319 | 
            +
            	41, 3, 43, 3, 45, 3, 47, 3, 
         | 
| 320 | 
            +
            	49, 3, 51, 53, 9, 3, 47, 3, 
         | 
| 321 | 
            +
            	49, 3, 51, 19, 9, 21, 143, 113, 
         | 
| 322 | 
            +
            	113, 0, 0, 0, 9, 92, 9, 95, 
         | 
| 323 | 
            +
            	9, 98, 0, 9, 11, 116, 0, 23, 
         | 
| 324 | 
            +
            	25, 0, 0, 9, 0, 0, 9, 0, 
         | 
| 325 | 
            +
            	29, 3, 33, 3, 9, 101, 9, 104, 
         | 
| 326 | 
            +
            	9, 107, 0, 39, 3, 19, 21, 134, 
         | 
| 327 | 
            +
            	5, 7, 35, 37, 131, 5, 7, 31, 
         | 
| 328 | 
            +
            	5, 7, 27, 11, 119, 3, 5, 7, 
         | 
| 329 | 
            +
            	0, 17, 128, 110, 3, 5, 7, 0, 
         | 
| 330 | 
            +
            	15, 125, 0
         | 
| 331 | 
            +
            };
         | 
| 332 | 
            +
             | 
| 333 | 
            +
            static const int NMEA_start = 1;
         | 
| 334 | 
            +
             | 
| 335 | 
            +
            static const int NMEA_error = 0;
         | 
| 336 | 
            +
             | 
| 337 | 
            +
            #line 76 "nmea.rl"
         | 
| 338 | 
            +
             | 
| 339 | 
            +
             | 
| 340 | 
            +
            void nmea_scanner(char *p, VALUE handler) {
         | 
| 341 | 
            +
            	char *pe;
         | 
| 342 | 
            +
            	int cs;
         | 
| 343 | 
            +
            	
         | 
| 344 | 
            +
            	int line_counter = 0, curline = 0;
         | 
| 345 | 
            +
            	int current_digit = 0, current_frac = 0;
         | 
| 346 | 
            +
            	double current_float = 0;
         | 
| 347 | 
            +
            	int current_degrees = 0;
         | 
| 348 | 
            +
            	double current_minutes = 0.0;
         | 
| 349 | 
            +
            	int bcd = 0;
         | 
| 350 | 
            +
            	int utc_hours = 0, utc_minutes = 0;
         | 
| 351 | 
            +
            	int utc_day = 0, utc_month = 0, utc_year = 0, utc_seconds = 0, utc_useconds = 0;
         | 
| 352 | 
            +
            	VALUE latitude = Qnil, longitude = Qnil;
         | 
| 353 | 
            +
            	
         | 
| 354 | 
            +
            	char checksum[4];
         | 
| 355 | 
            +
            	checksum[3] = 0;
         | 
| 356 | 
            +
            	//RMC
         | 
| 357 | 
            +
            	int rmc_valid = 0;
         | 
| 358 | 
            +
            	VALUE knot_speed, course, magnetic_variation;
         | 
| 359 | 
            +
            	//GSV
         | 
| 360 | 
            +
            	VALUE satellites = Qnil;
         | 
| 361 | 
            +
            	int total_gsv_number, current_gsv_number, total_satellites, satellite_number, elevation, azimuth, snr_db;
         | 
| 362 | 
            +
            	//GSA
         | 
| 363 | 
            +
            	int gsa_manual, gsa_mode, gsa_prn_index;
         | 
| 364 | 
            +
            	VALUE gsa_pdop = Qnil, gsa_hdop = Qnil, gsa_vdop = Qnil;
         | 
| 365 | 
            +
            	VALUE gsa_prns[12];
         | 
| 366 | 
            +
            	//GGA
         | 
| 367 | 
            +
            	int gps_quality, dgps_station_id;
         | 
| 368 | 
            +
            	VALUE active_satellite_count = Qnil;
         | 
| 369 | 
            +
            	VALUE altitude = Qnil, geoidal_height = Qnil, dgps_data_age = Qnil;
         | 
| 370 | 
            +
            	char altitude_units, geoidal_height_units;
         | 
| 371 | 
            +
            	
         | 
| 372 | 
            +
            	
         | 
| 373 | 
            +
            	
         | 
| 374 | 
            +
            #line 375 "../ext/nmea.c"
         | 
| 375 | 
            +
            	{
         | 
| 376 | 
            +
            	cs = NMEA_start;
         | 
| 377 | 
            +
            	}
         | 
| 378 | 
            +
            #line 112 "nmea.rl"
         | 
| 379 | 
            +
            	
         | 
| 380 | 
            +
            	pe = p + strlen(p);
         | 
| 381 | 
            +
            	
         | 
| 382 | 
            +
            #line 383 "../ext/nmea.c"
         | 
| 383 | 
            +
            	{
         | 
| 384 | 
            +
            	int _klen;
         | 
| 385 | 
            +
            	unsigned int _trans;
         | 
| 386 | 
            +
            	const char *_acts;
         | 
| 387 | 
            +
            	unsigned int _nacts;
         | 
| 388 | 
            +
            	const char *_keys;
         | 
| 389 | 
            +
             | 
| 390 | 
            +
            	if ( p == pe )
         | 
| 391 | 
            +
            		goto _out;
         | 
| 392 | 
            +
            _resume:
         | 
| 393 | 
            +
            	if ( cs == 0 )
         | 
| 394 | 
            +
            		goto _out;
         | 
| 395 | 
            +
            	_keys = _NMEA_trans_keys + _NMEA_key_offsets[cs];
         | 
| 396 | 
            +
            	_trans = _NMEA_index_offsets[cs];
         | 
| 397 | 
            +
             | 
| 398 | 
            +
            	_klen = _NMEA_single_lengths[cs];
         | 
| 399 | 
            +
            	if ( _klen > 0 ) {
         | 
| 400 | 
            +
            		const char *_lower = _keys;
         | 
| 401 | 
            +
            		const char *_mid;
         | 
| 402 | 
            +
            		const char *_upper = _keys + _klen - 1;
         | 
| 403 | 
            +
            		while (1) {
         | 
| 404 | 
            +
            			if ( _upper < _lower )
         | 
| 405 | 
            +
            				break;
         | 
| 406 | 
            +
             | 
| 407 | 
            +
            			_mid = _lower + ((_upper-_lower) >> 1);
         | 
| 408 | 
            +
            			if ( (*p) < *_mid )
         | 
| 409 | 
            +
            				_upper = _mid - 1;
         | 
| 410 | 
            +
            			else if ( (*p) > *_mid )
         | 
| 411 | 
            +
            				_lower = _mid + 1;
         | 
| 412 | 
            +
            			else {
         | 
| 413 | 
            +
            				_trans += (_mid - _keys);
         | 
| 414 | 
            +
            				goto _match;
         | 
| 415 | 
            +
            			}
         | 
| 416 | 
            +
            		}
         | 
| 417 | 
            +
            		_keys += _klen;
         | 
| 418 | 
            +
            		_trans += _klen;
         | 
| 419 | 
            +
            	}
         | 
| 420 | 
            +
             | 
| 421 | 
            +
            	_klen = _NMEA_range_lengths[cs];
         | 
| 422 | 
            +
            	if ( _klen > 0 ) {
         | 
| 423 | 
            +
            		const char *_lower = _keys;
         | 
| 424 | 
            +
            		const char *_mid;
         | 
| 425 | 
            +
            		const char *_upper = _keys + (_klen<<1) - 2;
         | 
| 426 | 
            +
            		while (1) {
         | 
| 427 | 
            +
            			if ( _upper < _lower )
         | 
| 428 | 
            +
            				break;
         | 
| 429 | 
            +
             | 
| 430 | 
            +
            			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
         | 
| 431 | 
            +
            			if ( (*p) < _mid[0] )
         | 
| 432 | 
            +
            				_upper = _mid - 2;
         | 
| 433 | 
            +
            			else if ( (*p) > _mid[1] )
         | 
| 434 | 
            +
            				_lower = _mid + 2;
         | 
| 435 | 
            +
            			else {
         | 
| 436 | 
            +
            				_trans += ((_mid - _keys)>>1);
         | 
| 437 | 
            +
            				goto _match;
         | 
| 438 | 
            +
            			}
         | 
| 439 | 
            +
            		}
         | 
| 440 | 
            +
            		_trans += _klen;
         | 
| 441 | 
            +
            	}
         | 
| 442 | 
            +
             | 
| 443 | 
            +
            _match:
         | 
| 444 | 
            +
            	_trans = _NMEA_indicies[_trans];
         | 
| 445 | 
            +
            	cs = _NMEA_trans_targs_wi[_trans];
         | 
| 446 | 
            +
             | 
| 447 | 
            +
            	if ( _NMEA_trans_actions_wi[_trans] == 0 )
         | 
| 448 | 
            +
            		goto _again;
         | 
| 449 | 
            +
             | 
| 450 | 
            +
            	_acts = _NMEA_actions + _NMEA_trans_actions_wi[_trans];
         | 
| 451 | 
            +
            	_nacts = (unsigned int) *_acts++;
         | 
| 452 | 
            +
            	while ( _nacts-- > 0 )
         | 
| 453 | 
            +
            	{
         | 
| 454 | 
            +
            		switch ( *_acts++ )
         | 
| 455 | 
            +
            		{
         | 
| 456 | 
            +
            	case 0:
         | 
| 457 | 
            +
            #line 12 "nmea.rl"
         | 
| 458 | 
            +
            	{ curline++; }
         | 
| 459 | 
            +
            	break;
         | 
| 460 | 
            +
            	case 1:
         | 
| 461 | 
            +
            #line 16 "nmea.rl"
         | 
| 462 | 
            +
            	{
         | 
| 463 | 
            +
            		current_float = 0;
         | 
| 464 | 
            +
            		current_digit = current_digit*10 + ((*p) - '0');
         | 
| 465 | 
            +
            	}
         | 
| 466 | 
            +
            	break;
         | 
| 467 | 
            +
            	case 2:
         | 
| 468 | 
            +
            #line 20 "nmea.rl"
         | 
| 469 | 
            +
            	{
         | 
| 470 | 
            +
            		current_frac = 10;
         | 
| 471 | 
            +
            		current_float = current_digit;
         | 
| 472 | 
            +
            		current_digit = 0;
         | 
| 473 | 
            +
            	}
         | 
| 474 | 
            +
            	break;
         | 
| 475 | 
            +
            	case 3:
         | 
| 476 | 
            +
            #line 25 "nmea.rl"
         | 
| 477 | 
            +
            	{
         | 
| 478 | 
            +
            		current_float += ((*p) - '0')*1.0 / current_frac;
         | 
| 479 | 
            +
            		current_frac *= 10;
         | 
| 480 | 
            +
            	}
         | 
| 481 | 
            +
            	break;
         | 
| 482 | 
            +
            	case 4:
         | 
| 483 | 
            +
            #line 29 "nmea.rl"
         | 
| 484 | 
            +
            	{bcd = 10*((*p) - '0');}
         | 
| 485 | 
            +
            	break;
         | 
| 486 | 
            +
            	case 5:
         | 
| 487 | 
            +
            #line 29 "nmea.rl"
         | 
| 488 | 
            +
            	{bcd += (*p) - '0';}
         | 
| 489 | 
            +
            	break;
         | 
| 490 | 
            +
            	case 6:
         | 
| 491 | 
            +
            #line 30 "nmea.rl"
         | 
| 492 | 
            +
            	{bcd = bcd*10 + ((*p) - '0');}
         | 
| 493 | 
            +
            	break;
         | 
| 494 | 
            +
            	case 7:
         | 
| 495 | 
            +
            #line 31 "nmea.rl"
         | 
| 496 | 
            +
            	{bcd = bcd*10 + ((*p) - '0');}
         | 
| 497 | 
            +
            	break;
         | 
| 498 | 
            +
            	case 8:
         | 
| 499 | 
            +
            #line 35 "nmea.rl"
         | 
| 500 | 
            +
            	{ utc_hours = bcd; }
         | 
| 501 | 
            +
            	break;
         | 
| 502 | 
            +
            	case 9:
         | 
| 503 | 
            +
            #line 35 "nmea.rl"
         | 
| 504 | 
            +
            	{ utc_minutes = bcd;}
         | 
| 505 | 
            +
            	break;
         | 
| 506 | 
            +
            	case 10:
         | 
| 507 | 
            +
            #line 35 "nmea.rl"
         | 
| 508 | 
            +
            	{ utc_seconds = bcd; }
         | 
| 509 | 
            +
            	break;
         | 
| 510 | 
            +
            	case 11:
         | 
| 511 | 
            +
            #line 35 "nmea.rl"
         | 
| 512 | 
            +
            	{ utc_useconds = bcd;}
         | 
| 513 | 
            +
            	break;
         | 
| 514 | 
            +
            	case 12:
         | 
| 515 | 
            +
            #line 36 "nmea.rl"
         | 
| 516 | 
            +
            	{ utc_day = bcd; }
         | 
| 517 | 
            +
            	break;
         | 
| 518 | 
            +
            	case 13:
         | 
| 519 | 
            +
            #line 36 "nmea.rl"
         | 
| 520 | 
            +
            	{ utc_month = bcd;}
         | 
| 521 | 
            +
            	break;
         | 
| 522 | 
            +
            	case 14:
         | 
| 523 | 
            +
            #line 36 "nmea.rl"
         | 
| 524 | 
            +
            	{ utc_year = bcd > 70 ? 1900+bcd : 2000+bcd;}
         | 
| 525 | 
            +
            	break;
         | 
| 526 | 
            +
            	case 15:
         | 
| 527 | 
            +
            #line 38 "nmea.rl"
         | 
| 528 | 
            +
            	{
         | 
| 529 | 
            +
            		current_degrees = bcd;
         | 
| 530 | 
            +
            		bcd = 0;
         | 
| 531 | 
            +
            	}
         | 
| 532 | 
            +
            	break;
         | 
| 533 | 
            +
            	case 16:
         | 
| 534 | 
            +
            #line 43 "nmea.rl"
         | 
| 535 | 
            +
            	{current_degrees *= -1;}
         | 
| 536 | 
            +
            	break;
         | 
| 537 | 
            +
            	case 17:
         | 
| 538 | 
            +
            #line 44 "nmea.rl"
         | 
| 539 | 
            +
            	{
         | 
| 540 | 
            +
            		if(load_constants()) {
         | 
| 541 | 
            +
            			latitude = rb_funcall(cLatitude, id_new, 2, INT2FIX(current_degrees), rb_float_new(current_float));
         | 
| 542 | 
            +
            		}
         | 
| 543 | 
            +
            		current_float = 0;
         | 
| 544 | 
            +
            		current_degrees = 0;
         | 
| 545 | 
            +
            	}
         | 
| 546 | 
            +
            	break;
         | 
| 547 | 
            +
            	case 18:
         | 
| 548 | 
            +
            #line 53 "nmea.rl"
         | 
| 549 | 
            +
            	{current_degrees *= -1;}
         | 
| 550 | 
            +
            	break;
         | 
| 551 | 
            +
            	case 19:
         | 
| 552 | 
            +
            #line 54 "nmea.rl"
         | 
| 553 | 
            +
            	{
         | 
| 554 | 
            +
            		if(load_constants()) {
         | 
| 555 | 
            +
            			longitude = rb_funcall(cLongitude, id_new, 2, INT2FIX(current_degrees), rb_float_new(current_float));
         | 
| 556 | 
            +
            		}
         | 
| 557 | 
            +
            		current_degrees = 0;
         | 
| 558 | 
            +
            		current_float = 0;
         | 
| 559 | 
            +
            	}
         | 
| 560 | 
            +
            	break;
         | 
| 561 | 
            +
            	case 20:
         | 
| 562 | 
            +
            #line 63 "nmea.rl"
         | 
| 563 | 
            +
            	{checksum[0] = (*p);}
         | 
| 564 | 
            +
            	break;
         | 
| 565 | 
            +
            	case 21:
         | 
| 566 | 
            +
            #line 63 "nmea.rl"
         | 
| 567 | 
            +
            	{checksum[1] = (*p);}
         | 
| 568 | 
            +
            	break;
         | 
| 569 | 
            +
            	case 22:
         | 
| 570 | 
            +
            #line 63 "nmea.rl"
         | 
| 571 | 
            +
            	{checksum[2] = (*p);}
         | 
| 572 | 
            +
            	break;
         | 
| 573 | 
            +
            	case 23:
         | 
| 574 | 
            +
            #line 5 "nmea.rl"
         | 
| 575 | 
            +
            	{rmc_valid = 1;}
         | 
| 576 | 
            +
            	break;
         | 
| 577 | 
            +
            	case 24:
         | 
| 578 | 
            +
            #line 5 "nmea.rl"
         | 
| 579 | 
            +
            	{rmc_valid = 0;}
         | 
| 580 | 
            +
            	break;
         | 
| 581 | 
            +
            	case 25:
         | 
| 582 | 
            +
            #line 6 "nmea.rl"
         | 
| 583 | 
            +
            	{knot_speed = rb_float_new(current_float); current_float = 0;}
         | 
| 584 | 
            +
            	break;
         | 
| 585 | 
            +
            	case 26:
         | 
| 586 | 
            +
            #line 6 "nmea.rl"
         | 
| 587 | 
            +
            	{knot_speed = Qnil;}
         | 
| 588 | 
            +
            	break;
         | 
| 589 | 
            +
            	case 27:
         | 
| 590 | 
            +
            #line 7 "nmea.rl"
         | 
| 591 | 
            +
            	{course = rb_float_new(current_float); current_float = 0;}
         | 
| 592 | 
            +
            	break;
         | 
| 593 | 
            +
            	case 28:
         | 
| 594 | 
            +
            #line 7 "nmea.rl"
         | 
| 595 | 
            +
            	{course = Qnil;}
         | 
| 596 | 
            +
            	break;
         | 
| 597 | 
            +
            	case 29:
         | 
| 598 | 
            +
            #line 8 "nmea.rl"
         | 
| 599 | 
            +
            	{current_degrees = current_float; current_float = 0;}
         | 
| 600 | 
            +
            	break;
         | 
| 601 | 
            +
            	case 30:
         | 
| 602 | 
            +
            #line 8 "nmea.rl"
         | 
| 603 | 
            +
            	{ magnetic_variation = rb_float_new(current_degrees);}
         | 
| 604 | 
            +
            	break;
         | 
| 605 | 
            +
            	case 31:
         | 
| 606 | 
            +
            #line 8 "nmea.rl"
         | 
| 607 | 
            +
            	{magnetic_variation = Qnil;}
         | 
| 608 | 
            +
            	break;
         | 
| 609 | 
            +
            	case 32:
         | 
| 610 | 
            +
            #line 10 "nmea.rl"
         | 
| 611 | 
            +
            	{
         | 
| 612 | 
            +
            		if(rb_respond_to(handler, id_rmc)) {
         | 
| 613 | 
            +
            			rb_funcall(handler, id_rmc, 6, TIME_NEW, latitude, longitude, knot_speed, course, magnetic_variation);
         | 
| 614 | 
            +
            		}
         | 
| 615 | 
            +
            	}
         | 
| 616 | 
            +
            	break;
         | 
| 617 | 
            +
            	case 33:
         | 
| 618 | 
            +
            #line 4 "nmea.rl"
         | 
| 619 | 
            +
            	{total_gsv_number = current_digit; current_digit = 0;}
         | 
| 620 | 
            +
            	break;
         | 
| 621 | 
            +
            	case 34:
         | 
| 622 | 
            +
            #line 6 "nmea.rl"
         | 
| 623 | 
            +
            	{
         | 
| 624 | 
            +
            		current_gsv_number = current_digit;
         | 
| 625 | 
            +
            		current_digit = 0;
         | 
| 626 | 
            +
            		satellites = rb_ary_new();
         | 
| 627 | 
            +
            	}
         | 
| 628 | 
            +
            	break;
         | 
| 629 | 
            +
            	case 35:
         | 
| 630 | 
            +
            #line 12 "nmea.rl"
         | 
| 631 | 
            +
            	{total_satellites = current_digit; current_digit = 0;}
         | 
| 632 | 
            +
            	break;
         | 
| 633 | 
            +
            	case 36:
         | 
| 634 | 
            +
            #line 15 "nmea.rl"
         | 
| 635 | 
            +
            	{satellite_number = current_digit; current_digit = 0; }
         | 
| 636 | 
            +
            	break;
         | 
| 637 | 
            +
            	case 37:
         | 
| 638 | 
            +
            #line 16 "nmea.rl"
         | 
| 639 | 
            +
            	{elevation = current_digit; current_digit = 0;}
         | 
| 640 | 
            +
            	break;
         | 
| 641 | 
            +
            	case 38:
         | 
| 642 | 
            +
            #line 17 "nmea.rl"
         | 
| 643 | 
            +
            	{azimuth = current_digit; current_digit = 0; }
         | 
| 644 | 
            +
            	break;
         | 
| 645 | 
            +
            	case 39:
         | 
| 646 | 
            +
            #line 18 "nmea.rl"
         | 
| 647 | 
            +
            	{snr_db = bcd;}
         | 
| 648 | 
            +
            	break;
         | 
| 649 | 
            +
            	case 40:
         | 
| 650 | 
            +
            #line 19 "nmea.rl"
         | 
| 651 | 
            +
            	{
         | 
| 652 | 
            +
            		VALUE satellite = rb_funcall(cSatelliteInfo, id_new, 4, INT2FIX(satellite_number), INT2FIX(elevation), INT2FIX(azimuth), INT2FIX(snr_db));
         | 
| 653 | 
            +
            		rb_ary_push(satellites, satellite);
         | 
| 654 | 
            +
            	}
         | 
| 655 | 
            +
            	break;
         | 
| 656 | 
            +
            	case 41:
         | 
| 657 | 
            +
            #line 25 "nmea.rl"
         | 
| 658 | 
            +
            	{
         | 
| 659 | 
            +
            		VALUE flag = id_continue;
         | 
| 660 | 
            +
            		if(current_gsv_number == 1) {
         | 
| 661 | 
            +
            			flag = id_start;
         | 
| 662 | 
            +
            		} else if(current_gsv_number == total_gsv_number) {
         | 
| 663 | 
            +
            			flag = id_finish;
         | 
| 664 | 
            +
            		}
         | 
| 665 | 
            +
            		if(rb_respond_to(handler, id_gsv)) {
         | 
| 666 | 
            +
            			rb_funcall(handler, id_gsv, 2, flag, satellites);
         | 
| 667 | 
            +
            		}
         | 
| 668 | 
            +
            		satellites = Qnil;
         | 
| 669 | 
            +
            	}
         | 
| 670 | 
            +
            	break;
         | 
| 671 | 
            +
            	case 42:
         | 
| 672 | 
            +
            #line 3 "nmea.rl"
         | 
| 673 | 
            +
            	{gsa_manual = 1;}
         | 
| 674 | 
            +
            	break;
         | 
| 675 | 
            +
            	case 43:
         | 
| 676 | 
            +
            #line 3 "nmea.rl"
         | 
| 677 | 
            +
            	{gsa_manual = 0; }
         | 
| 678 | 
            +
            	break;
         | 
| 679 | 
            +
            	case 44:
         | 
| 680 | 
            +
            #line 4 "nmea.rl"
         | 
| 681 | 
            +
            	{gsa_mode = (*p)-'0';}
         | 
| 682 | 
            +
            	break;
         | 
| 683 | 
            +
            	case 45:
         | 
| 684 | 
            +
            #line 4 "nmea.rl"
         | 
| 685 | 
            +
            	{gsa_prn_index = 0;}
         | 
| 686 | 
            +
            	break;
         | 
| 687 | 
            +
            	case 46:
         | 
| 688 | 
            +
            #line 5 "nmea.rl"
         | 
| 689 | 
            +
            	{gsa_prns[gsa_prn_index++] = current_digit ? INT2NUM(current_digit) : Qnil; current_digit = 0; }
         | 
| 690 | 
            +
            	break;
         | 
| 691 | 
            +
            	case 47:
         | 
| 692 | 
            +
            #line 6 "nmea.rl"
         | 
| 693 | 
            +
            	{
         | 
| 694 | 
            +
            		VALUE satellites = rb_ary_new4(gsa_prn_index, gsa_prns);
         | 
| 695 | 
            +
            		gsa_prn_index = 0;
         | 
| 696 | 
            +
            		VALUE mode = Qnil;
         | 
| 697 | 
            +
            		switch(gsa_mode) {
         | 
| 698 | 
            +
            			case 1: mode = id_no_fix; break;
         | 
| 699 | 
            +
            			case 2: mode = id_2d; break;
         | 
| 700 | 
            +
            			case 3: mode = id_3d; break;
         | 
| 701 | 
            +
            		}
         | 
| 702 | 
            +
            		if(rb_respond_to(handler, id_gsa)) {
         | 
| 703 | 
            +
            			rb_funcall(handler, id_gsa, 6, gsa_manual ? id_manual : id_automatic, mode, satellites, 
         | 
| 704 | 
            +
            				gsa_pdop, gsa_hdop, gsa_vdop );
         | 
| 705 | 
            +
            		}
         | 
| 706 | 
            +
            	}
         | 
| 707 | 
            +
            	break;
         | 
| 708 | 
            +
            	case 48:
         | 
| 709 | 
            +
            #line 20 "nmea.rl"
         | 
| 710 | 
            +
            	{ gsa_pdop = rb_float_new(current_float); current_float = 0;}
         | 
| 711 | 
            +
            	break;
         | 
| 712 | 
            +
            	case 49:
         | 
| 713 | 
            +
            #line 21 "nmea.rl"
         | 
| 714 | 
            +
            	{ gsa_hdop = rb_float_new(current_float); current_float = 0;}
         | 
| 715 | 
            +
            	break;
         | 
| 716 | 
            +
            	case 50:
         | 
| 717 | 
            +
            #line 22 "nmea.rl"
         | 
| 718 | 
            +
            	{ gsa_vdop = rb_float_new(current_float); current_float = 0;}
         | 
| 719 | 
            +
            	break;
         | 
| 720 | 
            +
            	case 51:
         | 
| 721 | 
            +
            #line 3 "nmea.rl"
         | 
| 722 | 
            +
            	{gps_quality = 0;}
         | 
| 723 | 
            +
            	break;
         | 
| 724 | 
            +
            	case 52:
         | 
| 725 | 
            +
            #line 3 "nmea.rl"
         | 
| 726 | 
            +
            	{gps_quality = 1;}
         | 
| 727 | 
            +
            	break;
         | 
| 728 | 
            +
            	case 53:
         | 
| 729 | 
            +
            #line 3 "nmea.rl"
         | 
| 730 | 
            +
            	{gps_quality = 2;}
         | 
| 731 | 
            +
            	break;
         | 
| 732 | 
            +
            	case 54:
         | 
| 733 | 
            +
            #line 3 "nmea.rl"
         | 
| 734 | 
            +
            	{gps_quality = 6;}
         | 
| 735 | 
            +
            	break;
         | 
| 736 | 
            +
            	case 55:
         | 
| 737 | 
            +
            #line 4 "nmea.rl"
         | 
| 738 | 
            +
            	{active_satellite_count = INT2FIX(bcd); }
         | 
| 739 | 
            +
            	break;
         | 
| 740 | 
            +
            	case 56:
         | 
| 741 | 
            +
            #line 5 "nmea.rl"
         | 
| 742 | 
            +
            	{altitude_units = (*p);}
         | 
| 743 | 
            +
            	break;
         | 
| 744 | 
            +
            	case 57:
         | 
| 745 | 
            +
            #line 5 "nmea.rl"
         | 
| 746 | 
            +
            	{altitude = rb_float_new(current_float); current_float = 0;}
         | 
| 747 | 
            +
            	break;
         | 
| 748 | 
            +
            	case 58:
         | 
| 749 | 
            +
            #line 6 "nmea.rl"
         | 
| 750 | 
            +
            	{geoidal_height_units = (*p);}
         | 
| 751 | 
            +
            	break;
         | 
| 752 | 
            +
            	case 59:
         | 
| 753 | 
            +
            #line 6 "nmea.rl"
         | 
| 754 | 
            +
            	{geoidal_height = rb_float_new(current_float); current_float = 0;}
         | 
| 755 | 
            +
            	break;
         | 
| 756 | 
            +
            	case 60:
         | 
| 757 | 
            +
            #line 7 "nmea.rl"
         | 
| 758 | 
            +
            	{dgps_data_age = rb_float_new(current_float); current_float = 0;}
         | 
| 759 | 
            +
            	break;
         | 
| 760 | 
            +
            	case 61:
         | 
| 761 | 
            +
            #line 7 "nmea.rl"
         | 
| 762 | 
            +
            	{dgps_station_id = bcd;}
         | 
| 763 | 
            +
            	break;
         | 
| 764 | 
            +
            	case 62:
         | 
| 765 | 
            +
            #line 8 "nmea.rl"
         | 
| 766 | 
            +
            	{
         | 
| 767 | 
            +
            		if(rb_respond_to(handler, id_gga)) {
         | 
| 768 | 
            +
            			rb_funcall(handler, id_gga, 10, TIME_NEW, latitude, longitude,
         | 
| 769 | 
            +
            				INT2FIX(gps_quality), active_satellite_count,
         | 
| 770 | 
            +
            				gsa_hdop, altitude, geoidal_height,
         | 
| 771 | 
            +
            				dgps_data_age, INT2FIX(dgps_station_id));
         | 
| 772 | 
            +
            		}
         | 
| 773 | 
            +
            	}
         | 
| 774 | 
            +
            	break;
         | 
| 775 | 
            +
            #line 776 "../ext/nmea.c"
         | 
| 776 | 
            +
            		}
         | 
| 777 | 
            +
            	}
         | 
| 778 | 
            +
             | 
| 779 | 
            +
            _again:
         | 
| 780 | 
            +
            	if ( ++p != pe )
         | 
| 781 | 
            +
            		goto _resume;
         | 
| 782 | 
            +
            	_out: {}
         | 
| 783 | 
            +
            	}
         | 
| 784 | 
            +
            #line 115 "nmea.rl"
         | 
| 785 | 
            +
            	if(cs == NMEA_error) {
         | 
| 786 | 
            +
            		rb_raise(eParseError, "PARSE ERROR on line %d: '%s'\n", line_counter, p);
         | 
| 787 | 
            +
            	}
         | 
| 788 | 
            +
            }
         | 
| 789 | 
            +
             |