nmea_gps 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 057dc086fbc62478f210459a628ca8837798717e
4
- data.tar.gz: 4b4bdd5adf65ae06517a9c78db1ec70d1e8bd432
3
+ metadata.gz: 07cb0192771b8e1e90ea379ecb8ae3493ec37788
4
+ data.tar.gz: 020a505200c28173a4614717dcbac765ff9311a8
5
5
  SHA512:
6
- metadata.gz: a8d32f4bdce6f704592d7be01c7ff2a2e00d1b342813649b65a16946de5daf3b540bfc8d922a2663230a304235d60ac68726e2f082f8ccf7710f968db36cadf3
7
- data.tar.gz: 6d108b7a93ceed09b3050e36d75a92a0f1353293f20260769828759eb219f989c2741c64c6cc37da142bbe340586fac0e4323b748acac4a48f5a35390ea6b159
6
+ metadata.gz: 553f60e8a1047a338ddadae3cb042c0909b144f6ea836451690b4d34f78c7393b6a7040e612e6ec6541fcc9776a05494589874fa26c9817fd182b656414ede4c
7
+ data.tar.gz: 7d544a2e0931dfd50e5435cdc914b00a025ad5a01fa287d957e0f90172c03b193cf301f9045da87c1350784a024d59874371390118d07539953209faf523c9b5
data/README.md CHANGED
@@ -35,12 +35,22 @@ gps = Nmea::Gps.new serialport update_hz: 10
35
35
 
36
36
  # this will be called automatically!!
37
37
  gps.rmc do |rmc|
38
+ # you will get a sentence object as a parameter
39
+ # for gsv callback, it will be an array containing multiple gsv objects [gsv, gsv, gsv]
38
40
  p rmc.time
39
41
  p rmc.latitude
40
42
  p rmc.longitude
41
43
  p rmc.heading
42
44
  p rmc.date
43
45
  end
46
+ # sentences > https://github.com/github0013/nmea_gps/tree/master/lib/nmea_gps/sentences
47
+ # you have a callback on each sentence such as gga, gll ...,
48
+
49
+ # built-in error callback (catch errors in the internal thread)
50
+ gps.error do |exception|
51
+ p exception.message
52
+ puts exception.backtrace.join "\n"
53
+ end
44
54
 
45
55
  # start the tracking
46
56
  gps.track!
@@ -79,6 +89,9 @@ gps.track!
79
89
  # serialport.close
80
90
  ```
81
91
 
92
+ ## sentences
93
+ [click here](https://github.com/github0013/nmea_gps/tree/master/lib/nmea_gps/sentences) for details
94
+
82
95
  ## Contributing
83
96
 
84
97
  1. Fork it ( https://github.com/[my-github-username]/nmea_gps/fork )
data/lib/nmea_gps/gps.rb CHANGED
@@ -3,15 +3,15 @@ module Nmea
3
3
  class Gps
4
4
  TALKER_ID = "GP"
5
5
 
6
- def initialize(serial_port, update_hz: 1)
6
+ def initialize(serial_port, hz: 1)
7
7
  self.callbacks = {}
8
8
  self.gps_serial_port = serial_port
9
- self.update_hz = 1.second.to_f / update_hz.to_i
9
+ self.update_hz = 1.second.to_f / (hz.to_i.zero? ? 1 : hz.to_i)
10
10
  end
11
11
 
12
12
  Dir[Pathname(__FILE__).join("../sentences/*.rb")].collect do |path|
13
13
  Pathname(path).basename(".rb").to_s
14
- end.each do |sentence|
14
+ end.tap{|array| array << "error" }.each do |sentence|
15
15
  define_method(sentence) do |&block|
16
16
  self.callbacks[__callee__] = block
17
17
  end
@@ -31,36 +31,47 @@ module Nmea
31
31
  end
32
32
 
33
33
  protected
34
- attr_accessor :gps_serial_port, :update_hz, :callbacks, :track_thread
34
+ attr_accessor :gps_serial_port, :update_hz, :callbacks, :track_thread, :initial_sentence
35
35
 
36
36
  private
37
37
 
38
- def hz
39
- self.update_hz
40
- end
41
-
42
38
  def frequency
43
- sleep hz
39
+ sleep self.update_hz
44
40
  end
45
41
 
46
- def line_set
42
+ def sentences_in_a_cycle
47
43
  Hash.new{|hash, key| hash[key] = [] }.tap do |set|
48
- loop do
49
- line = self.gps_serial_port.gets("\r\n").strip
50
- # %w[ GLL RMC VTG GGA GSA GSV ZDA].join.chars.uniq.sort.join
51
- next unless match = line.match(/\A\$#{TALKER_ID}([ACDGLMRSTVZ]{3})/)
52
-
53
- sentence = match[1].downcase.to_sym
54
- set[sentence] << line
55
- break if sentence == :gga
44
+ catch(:done_one_cycle) do
45
+ loop do
46
+ ensure_sentence do |sentence, line|
47
+ set[sentence] << line
48
+ end
49
+ end
56
50
  end
57
51
  end
58
52
  end
59
53
 
54
+ def ensure_sentence
55
+ yield *@buffer if @buffer
56
+
57
+ line = self.gps_serial_port.gets("\r\n").strip
58
+ # %w[ GLL RMC VTG GGA GSA GSV ZDA].join.chars.uniq.sort.join
59
+ return unless match = line.match(/\A\$#{TALKER_ID}([ACDGLMRSTVZ]{3})/)
60
+
61
+ sentence = match[1].downcase.to_sym
62
+ if sentence == self.initial_sentence
63
+ @buffer = [sentence, line]
64
+ throw :done_one_cycle
65
+ end
66
+
67
+ yield sentence, line
68
+
69
+ self.initial_sentence ||= sentence unless sentence == :gsv
70
+ end
71
+
60
72
  def callback!
61
- this_set = line_set
73
+ this_set = sentences_in_a_cycle
62
74
  this_set.keys.each do |sentence|
63
- # TODO: error handling
64
75
  begin
65
76
  this_callback = self.callbacks[sentence]
66
77
  next unless this_callback
@@ -77,10 +88,12 @@ module Nmea
77
88
 
78
89
  this_callback.call object
79
90
  rescue => ex
80
- puts "#{ex.message} sentence:#{sentence} / #{this_set[sentence]}"
81
- puts ex.backtrace.join "\n"
91
+ self.callbacks[:error].call ex
82
92
  end
83
93
  end
94
+
95
+ rescue => ex
96
+ self.callbacks[:error].call ex
84
97
  end
85
98
 
86
99
 
@@ -1,3 +1,3 @@
1
1
  module NmeaGps
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -10,28 +10,20 @@ require 'nmea_gps/sentences/zda'
10
10
 
11
11
  describe Nmea::Gps do
12
12
  let(:serial_port){ double("serial_port") }
13
- let(:update_hz){ 1 }
14
- let(:gps){ Nmea::Gps.new serial_port, update_hz: update_hz }
15
-
16
- describe "hz" do
17
- subject{ gps.send :hz }
18
- it{ expect(subject).to eq 1 }
19
-
20
- context "10Hz" do
21
- let(:update_hz){ 10 }
22
- it{ expect(subject).to eq 0.1 }
23
- end
24
- end
13
+ let(:hz){ 1 }
14
+ let(:how_long_to_sleep){ nil }
15
+ let(:gps){ Nmea::Gps.new serial_port, hz: hz }
25
16
 
26
17
  describe "frequency" do
27
- before{ expect(gps).to receive(:sleep).with(hz).at_least 1 }
18
+ before{ expect(gps).to receive(:sleep).with(how_long_to_sleep).at_least 1 }
28
19
 
29
- let(:hz){ 1 / 1 }
20
+ let(:hz){ 1 }
21
+ let(:how_long_to_sleep){ 1 }
30
22
  it{ gps.send :frequency }
31
23
 
32
24
  context "10Hz" do
33
- let(:update_hz){ 10 }
34
- let(:hz){ 1 / 10.0 }
25
+ let(:hz){ 10 }
26
+ let(:how_long_to_sleep){ 0.1 }
35
27
  it{ gps.send :frequency }
36
28
  end
37
29
  end
@@ -47,23 +39,24 @@ describe Nmea::Gps do
47
39
  it{ expect(gps).to respond_to :zda }
48
40
  end
49
41
 
50
- describe "line_set" do
42
+ describe "sentences_in_a_cycle" do
51
43
  before do
52
- allow(serial_port).to receive(:gets).and_return *lines.collect{|line| "#{line}\r\n" }
44
+ allow(serial_port).to receive(:gets).and_return *sentences.collect{|sentence| "#{sentence}\r\n" }
53
45
  end
54
46
 
55
- subject{ gps.send :line_set }
47
+ subject{ gps.send :sentences_in_a_cycle }
56
48
 
57
- context "single line" do
58
- let(:lines) do
49
+ context "single sentence" do
50
+ let(:sentences) do
59
51
  ["$GPGGA,075800.000,3357.7401,N,13112.3701,E,2,9,1.04,-3.6,M,27.5,M,0000,0000*74"]
60
52
  end
61
53
  it{ expect(subject.keys).to eq [:gga] }
62
54
  end
63
55
 
64
- context "multiple lines" do
65
- let(:lines) do
56
+ context "multiple sentences" do
57
+ let(:sentences) do
66
58
  [
59
+ "$GPGGA,075800.000,3357.7401,N,13112.3701,E,2,9,1.04,-3.6,M,27.5,M,0000,0000*74",
67
60
  "$GPGLL,3539.51480,N,13944.72598,E,075247.000,A,A*5D",
68
61
  "$GPGSA,A,3,24,26,05,13,21,12,15,18,,,,,1.29,0.97,0.86*00",
69
62
  "$GPGSV,3,1,11,24,70,198,52,15,63,016,,50,47,156,38,21,44,270,39*78",
@@ -97,7 +90,7 @@ describe Nmea::Gps do
97
90
 
98
91
  describe "callback!" do
99
92
  before do
100
- allow(gps).to receive(:line_set).and_return(
93
+ allow(gps).to receive(:sentences_in_a_cycle).and_return(
101
94
  {
102
95
  gga: ["$GPGGA,075800.000,3357.7401,N,13112.3701,E,2,9,1.04,-3.6,M,27.5,M,0000,0000*74"],
103
96
  gsv: [
@@ -109,14 +102,14 @@ describe Nmea::Gps do
109
102
  )
110
103
  end
111
104
 
112
- it "single line callback" do
105
+ it "single sentence callback" do
113
106
  gps.gga do |gga|
114
107
  expect(gga.class).to eq Nmea::Gps::Gga
115
108
  end
116
109
  gps.send :callback!
117
110
  end
118
111
 
119
- it "multiple line callback" do
112
+ it "multiple sentence callback" do
120
113
  gps.gsv do |gsvs|
121
114
  expect(gsvs.count).to eq 3
122
115
  expect(gsvs.first.class).to eq Nmea::Gps::Gsv
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'nmea_gps/sentences/gga'
3
+ Time.zone = "UTC"
3
4
 
4
5
  describe Nmea::Gps::Gga do
5
6
  let(:line){ "$GPGGA,075247.000,3539.51480,N,13944.72598,E,1,8,0.97,-15.6,M,27.5,M,13,X*44" }
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'nmea_gps/sentences/gll'
3
+ Time.zone = "UTC"
3
4
 
4
5
  describe Nmea::Gps::Gll do
5
6
  let(:line){ "$GPGLL,3539.51480,N,13944.72598,E,075247.000,A,A*5D" }
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'nmea_gps/sentences/rmc'
3
+ Time.zone = "UTC"
3
4
 
4
5
  describe Nmea::Gps::Rmc do
5
6
  let(:line){ "$GPRMC,075333.000,A,3539.51480,N,13944.72598,E,32.84,151.55,171214,,,A*68" }
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'nmea_gps/sentences/zda'
3
+ Time.zone = "UTC"
3
4
 
4
5
  describe Nmea::Gps::Zda do
5
6
  let(:line){ "$GPZDA,075936.000,17,12,2014,,*5A" }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nmea_gps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ore
@@ -151,7 +151,6 @@ files:
151
151
  - lib/nmea_gps/version.rb
152
152
  - nmea_gps.gemspec
153
153
  - spec/ddd_formatable_spec.rb
154
- - spec/lib/gps_spec.rb
155
154
  - spec/lib/nmea_gps/gps_spec.rb
156
155
  - spec/lib/nmea_gps/sentence_base_spec.rb
157
156
  - spec/lib/nmea_gps/sentences/gga_spec.rb
@@ -190,7 +189,6 @@ specification_version: 4
190
189
  summary: NMEA GPS logs to trigger a callback on each NMEA 0183 sentence.
191
190
  test_files:
192
191
  - spec/ddd_formatable_spec.rb
193
- - spec/lib/gps_spec.rb
194
192
  - spec/lib/nmea_gps/gps_spec.rb
195
193
  - spec/lib/nmea_gps/sentence_base_spec.rb
196
194
  - spec/lib/nmea_gps/sentences/gga_spec.rb
data/spec/lib/gps_spec.rb DELETED
@@ -1,97 +0,0 @@
1
- require 'spec_helper'
2
- require 'nmea_gps/gps'
3
-
4
- describe Nmea::Gps do
5
- let(:serial_port){ double("serial_port") }
6
- let(:update_hz){ 1 }
7
- let(:gps){ Nmea::Gps.new serial_port, update_hz: update_hz }
8
-
9
- describe "hz" do
10
- subject{ gps.send :hz }
11
- it{ expect(subject).to eq 1 }
12
-
13
- context "10Hz" do
14
- let(:update_hz){ 10 }
15
- it{ expect(subject).to eq 0.1 }
16
- end
17
- end
18
-
19
- describe "frequency" do
20
- let(:hz){ 1 / 1 }
21
- before{ allow(Kernel).to receive(:sleep).with(hz) }
22
- it{ expect{ gps.send :frequency }.not_to raise_error }
23
-
24
- context "10Hz" do
25
- let(:hz){ 1 / 10 }
26
- it{ expect{ gps.send :frequency }.not_to raise_error }
27
- end
28
- end
29
-
30
- describe "dynamic sentence methods" do
31
- it{ expect(gps).to respond_to :gga }
32
- it{ expect(gps).to respond_to :gll }
33
- it{ expect(gps).to respond_to :gsa }
34
- it{ expect(gps).to respond_to :gsv }
35
- it{ expect(gps).to respond_to :rmc }
36
- it{ expect(gps).to respond_to :gga }
37
- it{ expect(gps).to respond_to :vtg }
38
- it{ expect(gps).to respond_to :zda }
39
- end
40
-
41
- describe "line_set" do
42
- before do
43
- allow(serial_port).to receive(:gets).and_return *lines.collect{|line| "#{line}\r\n" }
44
- end
45
-
46
- subject{ gps.send :line_set }
47
-
48
- context "single" do
49
- let(:lines){ ["$GPGGA,075247.000,3539.51480,N,13944.72598,E,1,8,0.97,-15.6,M,27.5,M,13,X*44"] }
50
-
51
- it{ expect(subject.keys).to eq [:gga] }
52
- it{ expect(subject.values).to eq [lines] }
53
- end
54
-
55
- context "multiple lines", focus: true do
56
- let(:lines) do
57
- [
58
- "$GPGLL,3539.51480,N,13944.72598,E,075247.000,A,A*5D",
59
- "$GPGSA,A,3,24,26,05,13,21,12,15,18,,,,,1.29,0.97,0.86*00",
60
- "$GPGSV,3,1,11,24,70,198,52,15,63,016,,50,47,156,38,21,44,270,39*78",
61
- "$GPGSV,3,2,11,18,40,314,30,26,27,058,46,05,19,124,42,12,09,159,35*73",
62
- "$GPGSV,3,3,11,13,07,067,35,28,07,041,15,22,05,309,28*42",
63
- "$GPRMC,075333.000,A,3539.51480,N,13944.72598,E,32.84,151.55,171214,,,A*68",
64
- "$GPVTG,93.98,T,,M,32.84,N,60.85,K,D*05",
65
- "$GPZDA,075936.000,17,12,2014,,*5A",
66
- "$GPGGA,075247.000,3539.51480,N,13944.72598,E,1,8,0.97,-15.6,M,27.5,M,13,X*44",
67
- ]
68
- end
69
-
70
-
71
- it{ expect(subject.keys.sort).to eq [:gga, :gll, :gsa, :gsv, :rmc, :vtg, :zda] }
72
- it do
73
- expect(subject).to eq({
74
- gll: ["$GPGLL,3539.51480,N,13944.72598,E,075247.000,A,A*5D"],
75
- gsa: ["$GPGSA,A,3,24,26,05,13,21,12,15,18,,,,,1.29,0.97,0.86*00"],
76
- gsv: [
77
- "$GPGSV,3,1,11,24,70,198,52,15,63,016,,50,47,156,38,21,44,270,39*78",
78
- "$GPGSV,3,2,11,18,40,314,30,26,27,058,46,05,19,124,42,12,09,159,35*73",
79
- "$GPGSV,3,3,11,13,07,067,35,28,07,041,15,22,05,309,28*42",
80
- ],
81
- rmc: ["$GPRMC,075333.000,A,3539.51480,N,13944.72598,E,32.84,151.55,171214,,,A*68"],
82
- vtg: ["$GPVTG,93.98,T,,M,32.84,N,60.85,K,D*05"],
83
- zda: ["$GPZDA,075936.000,17,12,2014,,*5A"],
84
- gga: ["$GPGGA,075247.000,3539.51480,N,13944.72598,E,1,8,0.97,-15.6,M,27.5,M,13,X*44"],
85
- })
86
- end
87
-
88
- end
89
- end
90
-
91
- describe "" do
92
- end
93
-
94
- describe "" do
95
- end
96
-
97
- end