mm_gps 0.1.3 → 0.1.4
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 -4
- data/lib/mm_gps/mm_gps_beacon.rb +18 -3
- data/lib/mm_gps/mm_gps_module.rb +40 -3
- data/lib/mm_gps/version.rb +1 -1
- data/test.rb +6 -4
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f68f04c6955bd3be0fac1c0e6c9f6744efb2463a
|
4
|
+
data.tar.gz: 44d139c72d2ec7fec9eba8a1b9f12c72659bdc5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8c3dc05456bd59a303cae8b5d4cd082e0b51a82c3a8533d0308c4ba0202a7cb67c254fb63cce29f1397e9a1f89961616c20f6f7eb674db5e1b6fdaa1c1311b3
|
7
|
+
data.tar.gz: 51b785d6a816b966cb183f5235346ced4496dc510a020e2472994c7181ed7c6580db6ef6067d4ac1c8fdfa79b6986660dc29dae3fabbf13c5a0db0d0c9ebe07d
|
data/README.md
CHANGED
@@ -33,16 +33,25 @@ beacon = MmGPS::Beacon.new(PORT, BAUD)
|
|
33
33
|
beacon.trap # installs signal handler for CTRL-C
|
34
34
|
|
35
35
|
puts "Syncing..."
|
36
|
-
|
36
|
+
begin
|
37
|
+
beacon.sync # discards any byte until the starting sequence "\xFFG" arrives
|
38
|
+
rescue MmGPSError => e
|
39
|
+
puts "Packet Error: #{e.inspect}"
|
40
|
+
p e.data[:packet]
|
41
|
+
rescue IOError => e
|
42
|
+
puts "Port closed #{e.inspect}"
|
43
|
+
exit
|
44
|
+
end
|
37
45
|
|
38
46
|
puts "Reading..."
|
39
47
|
while not beacon.closed? do
|
40
48
|
begin
|
41
49
|
p beacon.get_packet
|
42
|
-
rescue
|
50
|
+
rescue MmGPSError => e
|
43
51
|
puts "Packet Error: #{e.inspect}"
|
52
|
+
p e.data
|
44
53
|
rescue IOError => e
|
45
|
-
puts "Port closed
|
54
|
+
puts "Port closed #{e.inspect}"
|
46
55
|
exit
|
47
56
|
end
|
48
57
|
end
|
@@ -50,7 +59,7 @@ end
|
|
50
59
|
|
51
60
|
## Contributing
|
52
61
|
|
53
|
-
Bug reports and pull requests are welcome on GitHub
|
62
|
+
Bug reports and pull requests are welcome [on GitHub ](https://github.com/pbosetti/ruby_mm_gps).
|
54
63
|
|
55
64
|
|
56
65
|
## License
|
data/lib/mm_gps/mm_gps_beacon.rb
CHANGED
@@ -5,17 +5,19 @@ module MmGPS
|
|
5
5
|
class Beacon
|
6
6
|
START_TOKEN = "\xFFG".force_encoding(Encoding::BINARY)
|
7
7
|
EMPTY = ''.force_encoding(Encoding::BINARY)
|
8
|
+
attr_reader :last_pkt
|
8
9
|
|
9
10
|
# Open a new connection on the given serial port. It also encapsulates
|
10
11
|
# the underlying SerialPort object instance, setting a read timeout of 1 s
|
11
12
|
# and enabling the binary mode.
|
12
13
|
#
|
13
14
|
# @param port [String] 'COM1' on Windows, '/dev/ttyNNN' on *nix
|
14
|
-
# @param
|
15
|
+
# @param baud [Fixnum] baudrate, value must be supported by the platform
|
15
16
|
def initialize(port, baud = 115200)
|
16
17
|
@sp = SerialPort.new(port, "baud" => baud)
|
17
18
|
@sp.read_timeout = 1000 #1 sec
|
18
19
|
@sp.binmode
|
20
|
+
@last_pkt = ''.force_encoding(Encoding::BINARY)
|
19
21
|
end
|
20
22
|
|
21
23
|
# Istalls a signal handler for the given signal, default to SIGINT,
|
@@ -59,10 +61,17 @@ module MmGPS
|
|
59
61
|
def get_raw_packet
|
60
62
|
buf = START_TOKEN.dup
|
61
63
|
while true do
|
62
|
-
|
64
|
+
char = @sp.read(1)
|
65
|
+
unless char
|
66
|
+
raise MmGPSError.new("Data unavailable",
|
67
|
+
{reason: :noavail, packet:nil})
|
68
|
+
else
|
69
|
+
buf << char
|
70
|
+
end
|
63
71
|
break if buf[-2..-1] == START_TOKEN
|
64
72
|
end
|
65
|
-
|
73
|
+
@last_pkt = buf[0...-2]
|
74
|
+
return @last_pkt
|
66
75
|
end
|
67
76
|
|
68
77
|
# Reads a raw packet, checks its CRC, and returns its contents as a Hash.
|
@@ -70,6 +79,12 @@ module MmGPS
|
|
70
79
|
# @return [Hash] typically in the form `%I(ts x y z f).zip(payload).to_h`
|
71
80
|
def get_packet
|
72
81
|
return MmGPS::parse_packet(self.get_raw_packet)
|
82
|
+
rescue MmGPSError => e
|
83
|
+
if e.data[:reason] == :noavail then
|
84
|
+
return nil
|
85
|
+
else
|
86
|
+
raise e
|
87
|
+
end
|
73
88
|
end
|
74
89
|
|
75
90
|
end
|
data/lib/mm_gps/mm_gps_module.rb
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
# Local Exception class.
|
2
|
-
|
2
|
+
#
|
3
|
+
# The +@data+ attribute holds a Hash with informative content. In particular,
|
4
|
+
# +@data [:reason]+ holds a Symbol providing the internal error code, currently
|
5
|
+
# one of the following:
|
6
|
+
#
|
7
|
+
# - +:notype+ when the packet type code is neither 1 nor 2
|
8
|
+
# - +:nocrc+ when the CRC16 check fails
|
9
|
+
# - +:noavail+ when the serialport was not available for reading (timeout)
|
10
|
+
#
|
11
|
+
# Typically, the last raw buffer is available in human readable format as:
|
12
|
+
#
|
13
|
+
# rescue MmGPSError => e
|
14
|
+
# puts MmGPS::hexify(e.data[:packet])
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
class MmGPSError < RuntimeError
|
18
|
+
attr_reader :data
|
19
|
+
def initialize(msg="Error in MmGPS class", data={})
|
20
|
+
@data = data
|
21
|
+
super(msg)
|
22
|
+
end
|
23
|
+
end
|
3
24
|
|
4
25
|
# Manage connection and data decoding with a MarvelMind beacon or hedgehog.
|
5
26
|
module MmGPS
|
@@ -11,6 +32,17 @@ module MmGPS
|
|
11
32
|
crc16(str) == 0
|
12
33
|
end
|
13
34
|
|
35
|
+
# Returns a HEX description of a binary buffer
|
36
|
+
#
|
37
|
+
# @param buf [String] the input buffer
|
38
|
+
# @return [String] the HEX description
|
39
|
+
def self.hexify(buf)
|
40
|
+
len = buf.length
|
41
|
+
return (("%02X " * len) % buf.unpack("C#{len}")).chop
|
42
|
+
rescue NoMethodError
|
43
|
+
return '--'
|
44
|
+
end
|
45
|
+
|
14
46
|
# Parse the given buffer according to the MarvelMind protocol.
|
15
47
|
# See http://www.marvelmind.com/pics/marvelmind_beacon_interfaces_v2016_03_07a.pdf
|
16
48
|
#
|
@@ -18,7 +50,9 @@ module MmGPS
|
|
18
50
|
# @return [Hash|Array] if the system is running, return a Hash with
|
19
51
|
# timestamp, coordinates, and error code (data code 0x0001). Otherwise returns an Array of Hashes for beacons status (data code 0x0002).
|
20
52
|
def self.parse_packet(buf)
|
21
|
-
|
53
|
+
unless valid_crc16?(buf) then
|
54
|
+
raise MmGPSError.new("Invalid CRC", {reason: :nocrc, packet:buf, crc:crc16(buf)})
|
55
|
+
end
|
22
56
|
# warn "Invalid CRC" unless valid_crc16?(buf)
|
23
57
|
header = buf[0..5].unpack('CCS<C')
|
24
58
|
if header[2] == 1 then # Regular GPS Data
|
@@ -37,7 +71,10 @@ module MmGPS
|
|
37
71
|
%I(x y z).each {|k| result.last[k] /= 100.0}
|
38
72
|
end
|
39
73
|
else
|
40
|
-
|
74
|
+
unless valid_crc16?(buf) then
|
75
|
+
raise MmGPSError.new("Unexpected packet type #{header[2]}",
|
76
|
+
{reason: :notype, packet:buf, crc:crc16(buf), type:header[2]})
|
77
|
+
end
|
41
78
|
end
|
42
79
|
return result
|
43
80
|
end
|
data/lib/mm_gps/version.rb
CHANGED
data/test.rb
CHANGED
@@ -10,8 +10,9 @@ beacon.trap # installs signal handler for CTRL-C
|
|
10
10
|
puts "Syncing..."
|
11
11
|
begin
|
12
12
|
beacon.sync # discards any byte until the starting sequence "\xFFG" arrives
|
13
|
-
rescue
|
14
|
-
puts "Packet Error: #{e.inspect}"
|
13
|
+
rescue MmGPSError => e
|
14
|
+
puts "Packet Error: #{e.inspect}, reason: #{e.data[:reason]}"
|
15
|
+
puts "Packet: #{MmGPS.hexify(e.data[:packet])}"
|
15
16
|
rescue IOError => e
|
16
17
|
puts "Port closed #{e.inspect}"
|
17
18
|
exit
|
@@ -21,8 +22,9 @@ puts "Reading..."
|
|
21
22
|
while not beacon.closed? do
|
22
23
|
begin
|
23
24
|
p beacon.get_packet
|
24
|
-
rescue
|
25
|
-
puts "Packet Error: #{e.inspect}"
|
25
|
+
rescue MmGPSError => e
|
26
|
+
puts "Packet Error: #{e.inspect}, reason: #{e.data[:reason]}"
|
27
|
+
puts "Packet: #{MmGPS.hexify(e.data[:packet])}"
|
26
28
|
rescue IOError => e
|
27
29
|
puts "Port closed #{e.inspect}"
|
28
30
|
exit
|