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 +4 -4
- data/README.md +13 -0
- data/lib/nmea_gps/gps.rb +35 -22
- data/lib/nmea_gps/version.rb +1 -1
- data/spec/lib/nmea_gps/gps_spec.rb +19 -26
- data/spec/lib/nmea_gps/sentences/gga_spec.rb +1 -0
- data/spec/lib/nmea_gps/sentences/gll_spec.rb +1 -0
- data/spec/lib/nmea_gps/sentences/rmc_spec.rb +1 -0
- data/spec/lib/nmea_gps/sentences/zda_spec.rb +1 -0
- metadata +1 -3
- data/spec/lib/gps_spec.rb +0 -97
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07cb0192771b8e1e90ea379ecb8ae3493ec37788
|
4
|
+
data.tar.gz: 020a505200c28173a4614717dcbac765ff9311a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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,
|
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 /
|
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
|
39
|
+
sleep self.update_hz
|
44
40
|
end
|
45
41
|
|
46
|
-
def
|
42
|
+
def sentences_in_a_cycle
|
47
43
|
Hash.new{|hash, key| hash[key] = [] }.tap do |set|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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 =
|
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
|
-
|
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
|
|
data/lib/nmea_gps/version.rb
CHANGED
@@ -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(:
|
14
|
-
let(:
|
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(
|
18
|
+
before{ expect(gps).to receive(:sleep).with(how_long_to_sleep).at_least 1 }
|
28
19
|
|
29
|
-
let(:hz){ 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(:
|
34
|
-
let(:
|
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 "
|
42
|
+
describe "sentences_in_a_cycle" do
|
51
43
|
before do
|
52
|
-
allow(serial_port).to receive(:gets).and_return *
|
44
|
+
allow(serial_port).to receive(:gets).and_return *sentences.collect{|sentence| "#{sentence}\r\n" }
|
53
45
|
end
|
54
46
|
|
55
|
-
subject{ gps.send :
|
47
|
+
subject{ gps.send :sentences_in_a_cycle }
|
56
48
|
|
57
|
-
context "single
|
58
|
-
let(:
|
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
|
65
|
-
let(:
|
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(:
|
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
|
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
|
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
|
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.
|
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
|