mm_gps 0.1.2 → 0.1.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 +1 -1
- data/ext/mm_gps/mm_gps.c +10 -0
- data/formulas.nb +1777 -0
- data/lib/mm_gps/mm_gps_beacon.rb +32 -5
- data/lib/mm_gps/mm_gps_module.rb +15 -3
- data/lib/mm_gps/version.rb +1 -1
- data/test.rb +10 -3
- metadata +3 -2
data/lib/mm_gps/mm_gps_beacon.rb
CHANGED
@@ -1,29 +1,50 @@
|
|
1
|
-
module MmGPS
|
1
|
+
module MmGPS
|
2
|
+
|
3
|
+
# Main interface. Represents a connection to a MarvelMind beacon/hedgehog.
|
4
|
+
# You may want (and can) to have more than one instance.
|
2
5
|
class Beacon
|
3
6
|
START_TOKEN = "\xFFG".force_encoding(Encoding::BINARY)
|
4
7
|
EMPTY = ''.force_encoding(Encoding::BINARY)
|
5
8
|
|
9
|
+
# Open a new connection on the given serial port. It also encapsulates
|
10
|
+
# the underlying SerialPort object instance, setting a read timeout of 1 s
|
11
|
+
# and enabling the binary mode.
|
12
|
+
#
|
13
|
+
# @param port [String] 'COM1' on Windows, '/dev/ttyNNN' on *nix
|
14
|
+
# @param baus [Fixnum] baudrate, value must be supported by the platform
|
6
15
|
def initialize(port, baud = 115200)
|
7
16
|
@sp = SerialPort.new(port, "baud" => baud)
|
8
17
|
@sp.read_timeout = 1000 #1 sec
|
9
18
|
@sp.binmode
|
10
19
|
end
|
11
20
|
|
12
|
-
|
13
|
-
|
21
|
+
# Istalls a signal handler for the given signal, default to SIGINT,
|
22
|
+
# which closes the serialport connection. Further readings are likely to
|
23
|
+
# trigger an IOError.
|
24
|
+
#
|
25
|
+
# @param signal [String] the signal to be trapped, default to 'SIGINT'
|
26
|
+
def trap(signal="INT")
|
27
|
+
Signal.trap(signal) do
|
14
28
|
@sp.close
|
15
|
-
puts "
|
29
|
+
puts "\nBeacon port: #{@sp.inspect}"
|
16
30
|
end
|
17
31
|
end
|
18
|
-
|
32
|
+
|
33
|
+
# Close the serialport
|
19
34
|
def close
|
20
35
|
@sp.close
|
21
36
|
end
|
22
37
|
|
38
|
+
# Check wether the serialport is closed
|
39
|
+
#
|
40
|
+
# @return [Bool] true if closed, false if open
|
23
41
|
def closed?
|
24
42
|
return @sp.closed?
|
25
43
|
end
|
26
44
|
|
45
|
+
# Reads and discards incoming bytes until the START_TOKEN marrker is
|
46
|
+
# received. Call this metod immediately after opening the connection
|
47
|
+
# and before start reading the data.
|
27
48
|
def sync
|
28
49
|
buf = EMPTY
|
29
50
|
begin
|
@@ -32,6 +53,9 @@ module MmGPS
|
|
32
53
|
end while buf != START_TOKEN
|
33
54
|
end
|
34
55
|
|
56
|
+
# Reads a raw packet.
|
57
|
+
#
|
58
|
+
# @return [String] a byte stream encoded with Encoding::BINARY
|
35
59
|
def get_raw_packet
|
36
60
|
buf = START_TOKEN.dup
|
37
61
|
while true do
|
@@ -41,6 +65,9 @@ module MmGPS
|
|
41
65
|
return buf[0...-2]
|
42
66
|
end
|
43
67
|
|
68
|
+
# Reads a raw packet, checks its CRC, and returns its contents as a Hash.
|
69
|
+
#
|
70
|
+
# @return [Hash] typically in the form `%I(ts x y z f).zip(payload).to_h`
|
44
71
|
def get_packet
|
45
72
|
return MmGPS::parse_packet(self.get_raw_packet)
|
46
73
|
end
|
data/lib/mm_gps/mm_gps_module.rb
CHANGED
@@ -1,12 +1,24 @@
|
|
1
|
-
|
1
|
+
# Local Exception class.
|
2
|
+
class MmGPSException < Exception; end
|
2
3
|
|
4
|
+
# Manage connection and data decoding with a MarvelMind beacon or hedgehog.
|
3
5
|
module MmGPS
|
6
|
+
# Checks a sbuffer for valid CRC16.
|
7
|
+
#
|
8
|
+
# @param str [String] the buffer to be checked
|
9
|
+
# @return [Bool] true if the buffer is self-consistent
|
4
10
|
def self.valid_crc16?(str)
|
5
11
|
crc16(str) == 0
|
6
12
|
end
|
7
13
|
|
14
|
+
# Parse the given buffer according to the MarvelMind protocol.
|
15
|
+
# See http://www.marvelmind.com/pics/marvelmind_beacon_interfaces_v2016_03_07a.pdf
|
16
|
+
#
|
17
|
+
# @param buf [String] the String buffer to be parsed
|
18
|
+
# @return [Hash|Array] if the system is running, return a Hash with
|
19
|
+
# timestamp, coordinates, and error code (data code 0x0001). Otherwise returns an Array of Hashes for beacons status (data code 0x0002).
|
8
20
|
def self.parse_packet(buf)
|
9
|
-
raise
|
21
|
+
raise MmGPSException, "Invalid CRC" unless valid_crc16?(buf)
|
10
22
|
# warn "Invalid CRC" unless valid_crc16?(buf)
|
11
23
|
header = buf[0..5].unpack('CCS<C')
|
12
24
|
if header[2] == 1 then # Regular GPS Data
|
@@ -25,7 +37,7 @@ module MmGPS
|
|
25
37
|
%I(x y z).each {|k| result.last[k] /= 100.0}
|
26
38
|
end
|
27
39
|
else
|
28
|
-
raise
|
40
|
+
raise MmGPSException, "Unexpected packet type #{header[2]}"
|
29
41
|
end
|
30
42
|
return result
|
31
43
|
end
|
data/lib/mm_gps/version.rb
CHANGED
data/test.rb
CHANGED
@@ -8,16 +8,23 @@ beacon = MmGPS::Beacon.new(PORT, BAUD)
|
|
8
8
|
beacon.trap # installs signal handler for CTRL-C
|
9
9
|
|
10
10
|
puts "Syncing..."
|
11
|
-
|
11
|
+
begin
|
12
|
+
beacon.sync # discards any byte until the starting sequence "\xFFG" arrives
|
13
|
+
rescue MmGPSException => e
|
14
|
+
puts "Packet Error: #{e.inspect}"
|
15
|
+
rescue IOError => e
|
16
|
+
puts "Port closed #{e.inspect}"
|
17
|
+
exit
|
18
|
+
end
|
12
19
|
|
13
20
|
puts "Reading..."
|
14
21
|
while not beacon.closed? do
|
15
22
|
begin
|
16
23
|
p beacon.get_packet
|
17
|
-
rescue
|
24
|
+
rescue MmGPSException => e
|
18
25
|
puts "Packet Error: #{e.inspect}"
|
19
26
|
rescue IOError => e
|
20
|
-
puts "Port closed
|
27
|
+
puts "Port closed #{e.inspect}"
|
21
28
|
exit
|
22
29
|
end
|
23
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mm_gps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paolo Bosetti
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: serialport
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- ext/mm_gps/extconf.rb
|
85
85
|
- ext/mm_gps/mm_gps.c
|
86
86
|
- ext/mm_gps/mm_gps.h
|
87
|
+
- formulas.nb
|
87
88
|
- lib/mm_gps.rb
|
88
89
|
- lib/mm_gps/mm_gps_beacon.rb
|
89
90
|
- lib/mm_gps/mm_gps_module.rb
|