nmea_gps 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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