nmea_gps 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/Guardfile +18 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +7 -0
- data/lib/nmea_gps/config.rb +11 -0
- data/lib/nmea_gps/gps.rb +82 -0
- data/lib/nmea_gps/sentence_base.rb +37 -0
- data/lib/nmea_gps/sentences/gga.rb +70 -0
- data/lib/nmea_gps/sentences/gll.rb +34 -0
- data/lib/nmea_gps/sentences/gsa.rb +57 -0
- data/lib/nmea_gps/sentences/gsv.rb +34 -0
- data/lib/nmea_gps/sentences/rmc.rb +65 -0
- data/lib/nmea_gps/sentences/vtg.rb +27 -0
- data/lib/nmea_gps/sentences/zda.rb +31 -0
- data/lib/nmea_gps/version.rb +3 -0
- data/lib/nmea_gps.rb +40 -0
- data/nmea_gps.gemspec +29 -0
- data/spec/ddd_formatable_spec.rb +18 -0
- data/spec/lib/gps_spec.rb +97 -0
- data/spec/lib/nmea_gps/gps_spec.rb +138 -0
- data/spec/lib/nmea_gps/sentence_base_spec.rb +25 -0
- data/spec/lib/nmea_gps/sentences/gga_spec.rb +59 -0
- data/spec/lib/nmea_gps/sentences/gll_spec.rb +37 -0
- data/spec/lib/nmea_gps/sentences/gsa_spec.rb +44 -0
- data/spec/lib/nmea_gps/sentences/gsv_spec.rb +36 -0
- data/spec/lib/nmea_gps/sentences/rmc_spec.rb +62 -0
- data/spec/lib/nmea_gps/sentences/vtg_spec.rb +28 -0
- data/spec/lib/nmea_gps/sentences/zda_spec.rb +32 -0
- data/spec/nmea_gps_spec.rb +8 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/utc_timeable_spec.rb +32 -0
- metadata +205 -0
data/nmea_gps.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'nmea_gps/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "nmea_gps"
|
8
|
+
spec.version = NmeaGps::VERSION
|
9
|
+
spec.authors = ["ore"]
|
10
|
+
spec.email = ["orenoimac@gmail.com"]
|
11
|
+
spec.summary = %q{NMEA GPS logs to trigger a callback on each NMEA 0183 sentence.}
|
12
|
+
spec.description = %q{add your serialport object, and you'll get callbacks every time the serialport gets logs.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "factory_girl"
|
25
|
+
spec.add_development_dependency "guard-rspec"
|
26
|
+
spec.add_development_dependency "timecop"
|
27
|
+
spec.add_dependency "serialport"
|
28
|
+
spec.add_dependency "activesupport"
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/gps'
|
3
|
+
|
4
|
+
describe Nmea::DddFormatable do
|
5
|
+
class Target
|
6
|
+
include Nmea::DddFormatable
|
7
|
+
end
|
8
|
+
|
9
|
+
subject{ Target.new }
|
10
|
+
|
11
|
+
describe "dmm_to_ddd" do
|
12
|
+
let(:dmm){ 3539.51480 }
|
13
|
+
let(:direction){ "N" }
|
14
|
+
|
15
|
+
it{ expect(subject.send :dmm_to_ddd, dmm, direction).to eq 35.65858 }
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,97 @@
|
|
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
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/gps'
|
3
|
+
require 'nmea_gps/sentences/gga'
|
4
|
+
require 'nmea_gps/sentences/gll'
|
5
|
+
require 'nmea_gps/sentences/gsa'
|
6
|
+
require 'nmea_gps/sentences/gsv'
|
7
|
+
require 'nmea_gps/sentences/rmc'
|
8
|
+
require 'nmea_gps/sentences/vtg'
|
9
|
+
require 'nmea_gps/sentences/zda'
|
10
|
+
|
11
|
+
describe Nmea::Gps do
|
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
|
25
|
+
|
26
|
+
describe "frequency" do
|
27
|
+
before{ expect(gps).to receive(:sleep).with(hz).at_least 1 }
|
28
|
+
|
29
|
+
let(:hz){ 1 / 1 }
|
30
|
+
it{ gps.send :frequency }
|
31
|
+
|
32
|
+
context "10Hz" do
|
33
|
+
let(:update_hz){ 10 }
|
34
|
+
let(:hz){ 1 / 10.0 }
|
35
|
+
it{ gps.send :frequency }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "dynamic sentence methods" do
|
40
|
+
it{ expect(gps).to respond_to :gga }
|
41
|
+
it{ expect(gps).to respond_to :gll }
|
42
|
+
it{ expect(gps).to respond_to :gsa }
|
43
|
+
it{ expect(gps).to respond_to :gsv }
|
44
|
+
it{ expect(gps).to respond_to :rmc }
|
45
|
+
it{ expect(gps).to respond_to :gga }
|
46
|
+
it{ expect(gps).to respond_to :vtg }
|
47
|
+
it{ expect(gps).to respond_to :zda }
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "line_set" do
|
51
|
+
before do
|
52
|
+
allow(serial_port).to receive(:gets).and_return *lines.collect{|line| "#{line}\r\n" }
|
53
|
+
end
|
54
|
+
|
55
|
+
subject{ gps.send :line_set }
|
56
|
+
|
57
|
+
context "single line" do
|
58
|
+
let(:lines) do
|
59
|
+
["$GPGGA,075800.000,3357.7401,N,13112.3701,E,2,9,1.04,-3.6,M,27.5,M,0000,0000*74"]
|
60
|
+
end
|
61
|
+
it{ expect(subject.keys).to eq [:gga] }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "multiple lines" do
|
65
|
+
let(:lines) do
|
66
|
+
[
|
67
|
+
"$GPGLL,3539.51480,N,13944.72598,E,075247.000,A,A*5D",
|
68
|
+
"$GPGSA,A,3,24,26,05,13,21,12,15,18,,,,,1.29,0.97,0.86*00",
|
69
|
+
"$GPGSV,3,1,11,24,70,198,52,15,63,016,,50,47,156,38,21,44,270,39*78",
|
70
|
+
"$GPGSV,3,2,11,18,40,314,30,26,27,058,46,05,19,124,42,12,09,159,35*73",
|
71
|
+
"$GPGSV,3,3,11,13,07,067,35,28,07,041,15,22,05,309,28*42",
|
72
|
+
"$GPRMC,075333.000,A,3539.51480,N,13944.72598,E,32.84,151.55,171214,,,A*68",
|
73
|
+
"$GPVTG,93.98,T,,M,32.84,N,60.85,K,D*05",
|
74
|
+
"$GPZDA,075936.000,17,12,2014,,*5A",
|
75
|
+
"$GPGGA,075800.000,3357.7401,N,13112.3701,E,2,9,1.04,-3.6,M,27.5,M,0000,0000*74",
|
76
|
+
]
|
77
|
+
end
|
78
|
+
it{ expect(subject.keys.sort).to eq [:gga, :gll, :gsa, :gsv, :rmc, :vtg, :zda] }
|
79
|
+
it do expect(subject).to eq({
|
80
|
+
|
81
|
+
gga: ["$GPGGA,075800.000,3357.7401,N,13112.3701,E,2,9,1.04,-3.6,M,27.5,M,0000,0000*74"],
|
82
|
+
gll: ["$GPGLL,3539.51480,N,13944.72598,E,075247.000,A,A*5D"],
|
83
|
+
gsa: ["$GPGSA,A,3,24,26,05,13,21,12,15,18,,,,,1.29,0.97,0.86*00"],
|
84
|
+
gsv: [
|
85
|
+
"$GPGSV,3,1,11,24,70,198,52,15,63,016,,50,47,156,38,21,44,270,39*78",
|
86
|
+
"$GPGSV,3,2,11,18,40,314,30,26,27,058,46,05,19,124,42,12,09,159,35*73",
|
87
|
+
"$GPGSV,3,3,11,13,07,067,35,28,07,041,15,22,05,309,28*42",
|
88
|
+
],
|
89
|
+
rmc: ["$GPRMC,075333.000,A,3539.51480,N,13944.72598,E,32.84,151.55,171214,,,A*68"],
|
90
|
+
vtg: ["$GPVTG,93.98,T,,M,32.84,N,60.85,K,D*05"],
|
91
|
+
zda: ["$GPZDA,075936.000,17,12,2014,,*5A"],
|
92
|
+
})
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "callback!" do
|
99
|
+
before do
|
100
|
+
allow(gps).to receive(:line_set).and_return(
|
101
|
+
{
|
102
|
+
gga: ["$GPGGA,075800.000,3357.7401,N,13112.3701,E,2,9,1.04,-3.6,M,27.5,M,0000,0000*74"],
|
103
|
+
gsv: [
|
104
|
+
"$GPGSV,3,1,11,24,70,198,52,15,63,016,,50,47,156,38,21,44,270,39*78",
|
105
|
+
"$GPGSV,3,2,11,18,40,314,30,26,27,058,46,05,19,124,42,12,09,159,35*73",
|
106
|
+
"$GPGSV,3,3,11,13,07,067,35,28,07,041,15,22,05,309,28*42",
|
107
|
+
],
|
108
|
+
}
|
109
|
+
)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "single line callback" do
|
113
|
+
gps.gga do |gga|
|
114
|
+
expect(gga.class).to eq Nmea::Gps::Gga
|
115
|
+
end
|
116
|
+
gps.send :callback!
|
117
|
+
end
|
118
|
+
|
119
|
+
it "multiple line callback" do
|
120
|
+
gps.gsv do |gsvs|
|
121
|
+
expect(gsvs.count).to eq 3
|
122
|
+
expect(gsvs.first.class).to eq Nmea::Gps::Gsv
|
123
|
+
end
|
124
|
+
gps.send :callback!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "kill!" do
|
129
|
+
before do
|
130
|
+
thread = double("thread")
|
131
|
+
expect(thread).to receive(:kill).at_least(1)
|
132
|
+
gps.instance_eval{ self.track_thread = thread }
|
133
|
+
end
|
134
|
+
|
135
|
+
it{ gps.stop! }
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentence_base'
|
3
|
+
|
4
|
+
describe Nmea::Gps::SentenceBase do
|
5
|
+
let(:line){ "" }
|
6
|
+
subject{ Nmea::Gps::SentenceBase.new line }
|
7
|
+
|
8
|
+
describe "initialize" do
|
9
|
+
let(:line){ "line" }
|
10
|
+
it{ expect(subject.instance_eval{@line}).to eq line }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "name" do
|
14
|
+
it{ expect{ subject.name }.to raise_error }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "raw_data" do
|
18
|
+
let(:line){ "$GPNAME,#{(0..9).to_a.join(",")}*sum" }
|
19
|
+
|
20
|
+
it{ expect(subject.raw_data.first).to eq "0" }
|
21
|
+
it{ expect(subject.raw_data.last).to eq "9" }
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentences/gga'
|
3
|
+
|
4
|
+
describe Nmea::Gps::Gga do
|
5
|
+
let(:line){ "$GPGGA,075247.000,3539.51480,N,13944.72598,E,1,8,0.97,-15.6,M,27.5,M,13,X*44" }
|
6
|
+
subject{ Nmea::Gps::Gga.new line }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it{ expect(subject.name).to eq "Global positioning system fixed data" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "time" do
|
13
|
+
# 2014/01/01 0:00:00
|
14
|
+
before{ Timecop.freeze Time.zone.at(TIMECOP_2014_01_01__0_00_00) }
|
15
|
+
after{ Timecop.return }
|
16
|
+
|
17
|
+
it{ expect(subject.time).to eq Time.zone.parse("2014/01/01 07:52:47") }
|
18
|
+
it{ expect(subject.time.zone).to eq "UTC" }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "latitude" do
|
22
|
+
it{ expect(subject.latitude).to eq 35.65858 }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "longitude" do
|
26
|
+
it{ expect(subject.longitude).to eq 139.74543299999996 }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "quality" do
|
30
|
+
it{ expect(subject.quality).to eq :gps_sps_fix }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "number_of_satellites" do
|
34
|
+
it{ expect(subject.number_of_satellites).to eq 8 }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "horizontal_dilution_of_precision" do
|
38
|
+
it{ expect(subject.horizontal_dilution_of_precision).to eq 0.97 }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "altitude_in_meters" do
|
42
|
+
it{ expect(subject.altitude_in_meters).to eq -15.6 }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "height_of_geoid_above_wgs84_ellipsoid" do
|
46
|
+
it{ expect(subject.height_of_geoid_above_wgs84_ellipsoid).to eq 27.5 }
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "time_in_seconds_since_last_dgps_update" do
|
50
|
+
it{ expect(subject.time_in_seconds_since_last_dgps_update).to eq 13 }
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "dgps_station_id" do
|
54
|
+
it{ expect(subject.dgps_station_id).to eq "X" }
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentences/gll'
|
3
|
+
|
4
|
+
describe Nmea::Gps::Gll do
|
5
|
+
let(:line){ "$GPGLL,3539.51480,N,13944.72598,E,075247.000,A,A*5D" }
|
6
|
+
subject{ Nmea::Gps::Gll.new line }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it{ expect(subject.name).to eq "Geographic position—latitude/longitude" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "latitude" do
|
13
|
+
it{ expect(subject.latitude).to eq 35.65858 }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "longitude" do
|
17
|
+
it{ expect(subject.longitude).to eq 139.74543299999996 }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "time" do
|
21
|
+
# 2014/01/01 0:00:00
|
22
|
+
before{ Timecop.freeze Time.zone.at(TIMECOP_2014_01_01__0_00_00) }
|
23
|
+
after{ Timecop.return }
|
24
|
+
|
25
|
+
it{ expect(subject.time).to eq Time.zone.parse("2014/01/01 07:52:47") }
|
26
|
+
it{ expect(subject.time.zone).to eq "UTC" }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "status" do
|
30
|
+
it{ expect(subject.status).to eq :valid }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "mode" do
|
34
|
+
it{ expect(subject.mode).to eq :autonomous }
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentences/gsa'
|
3
|
+
|
4
|
+
describe Nmea::Gps::Gsa do
|
5
|
+
let(:line){ "$GPGSA,A,3,24,26,05,13,21,12,15,18,,,,,1.29,0.97,0.86*00" }
|
6
|
+
subject{ Nmea::Gps::Gsa.new line }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it{ expect(subject.name).to eq "GNSS DOP and active satellites" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "mode_selection" do
|
13
|
+
it{ expect(subject.mode_selection).to eq :automatic }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "mode" do
|
17
|
+
it{ expect(subject.mode).to eq :fix_3D }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "ids_of_svs_used_in_position_fix" do
|
21
|
+
let(:at){ :all }
|
22
|
+
context "all" do
|
23
|
+
it{ expect(subject.ids_of_svs_used_in_position_fix.count).to eq 12 }
|
24
|
+
end
|
25
|
+
|
26
|
+
context "a position" do
|
27
|
+
it{ expect(subject.ids_of_svs_used_in_position_fix(3)).to eq 5 }
|
28
|
+
it{ expect(subject.ids_of_svs_used_in_position_fix(12)).to eq nil }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "position_dilution_of_precision" do
|
33
|
+
it{ expect(subject.position_dilution_of_precision).to eq 1.29 }
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "horizontal_dilution_of_precision" do
|
37
|
+
it{ expect(subject.horizontal_dilution_of_precision).to eq 0.97 }
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "vertical_dilution_of_precision" do
|
41
|
+
it{ expect(subject.vertical_dilution_of_precision).to eq 0.86 }
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentences/gsv'
|
3
|
+
|
4
|
+
describe Nmea::Gps::Gsv do
|
5
|
+
let(:line){ "$GPGSV,3,1,11,24,70,198,52,15,63,016,32,50,47,156,39,21,44,270,38*79" }
|
6
|
+
subject{ Nmea::Gps::Gsv.new line }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it{ expect(subject.name).to eq "GNSS satellites in view" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "number_of_message" do
|
13
|
+
it{ expect(subject.number_of_message).to eq 3 }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "message_number" do
|
17
|
+
it{ expect(subject.message_number).to eq 1 }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "number_of_satellites_in_view" do
|
21
|
+
it{ expect(subject.number_of_satellites_in_view).to eq 11 }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "satellites" do
|
25
|
+
it{ expect(subject.satellites.count).to eq 4 }
|
26
|
+
|
27
|
+
context "first satellite" do
|
28
|
+
let(:satellite){ subject.satellites.first }
|
29
|
+
it{ expect(satellite.id).to eq 24 }
|
30
|
+
it{ expect(satellite.elevation).to eq 70 }
|
31
|
+
it{ expect(satellite.azinmuth).to eq 198 }
|
32
|
+
it{ expect(satellite.signal_to_noise_ratio).to eq 52 }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentences/rmc'
|
3
|
+
|
4
|
+
describe Nmea::Gps::Rmc do
|
5
|
+
let(:line){ "$GPRMC,075333.000,A,3539.51480,N,13944.72598,E,32.84,151.55,171214,,,A*68" }
|
6
|
+
subject{ Nmea::Gps::Rmc.new line }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it{ expect(subject.name).to eq "Recommended minimum specific GNSS data" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "time" do
|
13
|
+
# 2014/01/01 0:00:00
|
14
|
+
before{ Timecop.freeze Time.zone.at(TIMECOP_2014_01_01__0_00_00) }
|
15
|
+
after{ Timecop.return }
|
16
|
+
|
17
|
+
it{ expect(subject.time).to eq Time.zone.parse("2014/01/01 07:53:33") }
|
18
|
+
it{ expect(subject.time.zone).to eq "UTC" }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "status" do
|
22
|
+
it{ expect(subject.status).to eq :valid }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "latitude" do
|
26
|
+
it{ expect(subject.latitude).to eq 35.65858 }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "longitude" do
|
30
|
+
it{ expect(subject.longitude).to eq 139.74543299999996 }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "knot_per_hour" do
|
34
|
+
it{ expect(subject.knot_per_hour).to eq 32.84}
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "km_per_hour" do
|
38
|
+
it{ expect(subject.km_per_hour).to eq(32.84 * 1.85200) }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "heading" do
|
42
|
+
it{ expect(subject.heading).to eq 151.55 }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "date" do
|
46
|
+
it{ expect(subject.date).to eq Date.parse("2014/12/17") }
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "magnetic_variation" do
|
50
|
+
it{ expect(subject.magnetic_variation).to eq nil }
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "magnetic_variation_direction" do
|
54
|
+
it{ expect(subject.magnetic_variation_direction).to eq nil }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "mode" do
|
58
|
+
it{ expect(subject.mode).to eq :autonomous }
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentences/vtg'
|
3
|
+
|
4
|
+
describe Nmea::Gps::Vtg do
|
5
|
+
let(:line){ "$GPVTG,93.98,T,,M,32.84,N,60.85,K,D*05" }
|
6
|
+
subject{ Nmea::Gps::Vtg.new line }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it{ expect(subject.name).to eq "Course over ground and ground speed" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "true_course" do
|
13
|
+
it{ expect(subject.true_course).to eq 93.98 }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "magnetic_course" do
|
17
|
+
it{ expect(subject.magnetic_course).to eq nil }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "knot_per_hour" do
|
21
|
+
it{ expect(subject.knot_per_hour).to eq 32.84 }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "km_per_hour" do
|
25
|
+
it{ expect(subject.km_per_hour).to eq 60.85 }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/sentences/zda'
|
3
|
+
|
4
|
+
describe Nmea::Gps::Zda do
|
5
|
+
let(:line){ "$GPZDA,075936.000,17,12,2014,,*5A" }
|
6
|
+
subject{ Nmea::Gps::Zda.new line }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it{ expect(subject.name).to eq "Date and Time" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "time" do
|
13
|
+
# 2014/01/01 0:00:00
|
14
|
+
before{ Timecop.freeze Time.zone.at(TIMECOP_2014_01_01__0_00_00) }
|
15
|
+
after{ Timecop.return }
|
16
|
+
|
17
|
+
it{ expect(subject.time).to eq Time.zone.parse("2014/01/01 07:59:36") }
|
18
|
+
it{ expect(subject.time.zone).to eq "UTC" }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "date" do
|
22
|
+
it{ expect(subject.date).to eq Date.parse("2014/12/17") }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "local_zone_hours" do
|
26
|
+
it{ expect(subject.local_zone_hours).to eq nil }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "local_zone_minutes" do
|
30
|
+
it{ expect(subject.local_zone_minutes).to eq nil }
|
31
|
+
end
|
32
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'factory_girl'
|
3
|
+
require 'timecop'
|
4
|
+
require 'nmea_gps'
|
5
|
+
|
6
|
+
TIMECOP_2014_01_01__0_00_00 = 1388534400
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.include FactoryGirl::Syntax::Methods
|
10
|
+
# config.filter_run :focus
|
11
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nmea_gps/gps'
|
3
|
+
|
4
|
+
describe Nmea::UtcTimeable do
|
5
|
+
class Target
|
6
|
+
include Nmea::UtcTimeable
|
7
|
+
end
|
8
|
+
|
9
|
+
subject{ Target.new }
|
10
|
+
|
11
|
+
describe "hhmmss_to_local_time" do
|
12
|
+
let(:text){ "101112.000" }
|
13
|
+
|
14
|
+
# 2014/01/01 0:00:00
|
15
|
+
before{ Timecop.freeze Time.zone.at(TIMECOP_2014_01_01__0_00_00) }
|
16
|
+
after{ Timecop.return }
|
17
|
+
|
18
|
+
context "when Nmea::Config.time_zone is nil" do
|
19
|
+
let(:time){ subject.send :hhmmss_to_local_time, text }
|
20
|
+
it{ expect(time).to eq Time.zone.parse("2014/01/01 10:11:12") }
|
21
|
+
it{ expect(time.zone).to eq "UTC" }
|
22
|
+
|
23
|
+
context "when 'Tokyo'" do
|
24
|
+
before{ Nmea::Config.time_zone = "Tokyo" }
|
25
|
+
it{ expect(time).to eq Time.zone.parse("2014/01/01 10:11:12").in_time_zone "Tokyo" }
|
26
|
+
it{ expect(time.zone).to eq "JST" }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|