nmea_plus 1.0.25 → 1.1.0
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 +5 -5
- data/README.md +2 -2
- data/lib/nmea_plus/ais_message_factory.rb +3 -4
- data/lib/nmea_plus/generated_parser/parser.rb +7 -5
- data/lib/nmea_plus/generated_parser/tokenizer.rb +76 -75
- data/lib/nmea_plus/message/ais/base_ais.rb +1 -2
- data/lib/nmea_plus/message/ais/vdm.rb +30 -27
- data/lib/nmea_plus/message/ais/vdm_payload/mmsi_info.rb +9 -3
- data/lib/nmea_plus/message/ais/vdm_payload/payload.rb +8 -2
- data/lib/nmea_plus/message/ais/vdm_payload/sub_area.rb +2 -3
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg.rb +3 -2
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg1.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg10.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg11.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg12.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg13.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg14.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg15.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg16.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg17.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg18.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg19.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg2.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg20.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg21.rb +3 -3
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg24.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg27.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg3.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg4.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg5.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6.rb +8 -8
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6_dynamic_payload.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d1022f61.rb +7 -2
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d1f0.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d1f2.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d1f3.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d1f4.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d1f5.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d235f10.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg7.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8.rb +6 -6
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8_dynamic_payload.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d1f0.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d1f22.rb +5 -2
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d1f31.rb +7 -3
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d200f10.rb +2 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d366f56.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg9.rb +3 -3
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg_binary_acknowledgement.rb +1 -1
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg_class_b_cs_position.rb +3 -3
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg_cnb.rb +5 -4
- data/lib/nmea_plus/message/ais/vdm_payload/vdm_msg_station_report.rb +4 -4
- data/lib/nmea_plus/message/ais/vdo.rb +1 -1
- data/lib/nmea_plus/message/base.rb +14 -6
- data/lib/nmea_plus/message/nmea/aam.rb +1 -2
- data/lib/nmea_plus/message/nmea/alm.rb +1 -1
- data/lib/nmea_plus/message/nmea/apa.rb +1 -1
- data/lib/nmea_plus/message/nmea/apb.rb +1 -1
- data/lib/nmea_plus/message/nmea/base_nmea.rb +5 -6
- data/lib/nmea_plus/message/nmea/bec.rb +1 -1
- data/lib/nmea_plus/message/nmea/ber.rb +1 -1
- data/lib/nmea_plus/message/nmea/bod.rb +1 -1
- data/lib/nmea_plus/message/nmea/bpi.rb +1 -1
- data/lib/nmea_plus/message/nmea/bwc.rb +2 -2
- data/lib/nmea_plus/message/nmea/bwr.rb +1 -1
- data/lib/nmea_plus/message/nmea/bww.rb +2 -2
- data/lib/nmea_plus/message/nmea/dbk.rb +1 -1
- data/lib/nmea_plus/message/nmea/dbs.rb +2 -2
- data/lib/nmea_plus/message/nmea/dbt.rb +2 -2
- data/lib/nmea_plus/message/nmea/dcn.rb +1 -1
- data/lib/nmea_plus/message/nmea/dpt.rb +1 -1
- data/lib/nmea_plus/message/nmea/dru.rb +1 -1
- data/lib/nmea_plus/message/nmea/dtm.rb +1 -1
- data/lib/nmea_plus/message/nmea/fsi.rb +1 -1
- data/lib/nmea_plus/message/nmea/gbs.rb +1 -1
- data/lib/nmea_plus/message/nmea/gda.rb +1 -1
- data/lib/nmea_plus/message/nmea/gdf.rb +1 -1
- data/lib/nmea_plus/message/nmea/gdp.rb +1 -1
- data/lib/nmea_plus/message/nmea/gga.rb +1 -2
- data/lib/nmea_plus/message/nmea/gla.rb +1 -1
- data/lib/nmea_plus/message/nmea/glc.rb +1 -1
- data/lib/nmea_plus/message/nmea/glf.rb +1 -1
- data/lib/nmea_plus/message/nmea/gll.rb +1 -1
- data/lib/nmea_plus/message/nmea/glp.rb +1 -1
- data/lib/nmea_plus/message/nmea/gns.rb +1 -2
- data/lib/nmea_plus/message/nmea/goa.rb +1 -1
- data/lib/nmea_plus/message/nmea/gof.rb +1 -1
- data/lib/nmea_plus/message/nmea/gop.rb +1 -1
- data/lib/nmea_plus/message/nmea/grs.rb +4 -1
- data/lib/nmea_plus/message/nmea/gsa.rb +1 -1
- data/lib/nmea_plus/message/nmea/gst.rb +1 -1
- data/lib/nmea_plus/message/nmea/gsv.rb +1 -1
- data/lib/nmea_plus/message/nmea/gtd.rb +1 -1
- data/lib/nmea_plus/message/nmea/gxa.rb +1 -1
- data/lib/nmea_plus/message/nmea/gxf.rb +1 -1
- data/lib/nmea_plus/message/nmea/gxp.rb +1 -1
- data/lib/nmea_plus/message/nmea/hcc.rb +1 -1
- data/lib/nmea_plus/message/nmea/hcd.rb +1 -1
- data/lib/nmea_plus/message/nmea/hdg.rb +1 -1
- data/lib/nmea_plus/message/nmea/hdm.rb +1 -1
- data/lib/nmea_plus/message/nmea/hdt.rb +1 -1
- data/lib/nmea_plus/message/nmea/hfb.rb +1 -1
- data/lib/nmea_plus/message/nmea/hsc.rb +1 -1
- data/lib/nmea_plus/message/nmea/htc.rb +1 -1
- data/lib/nmea_plus/message/nmea/hvd.rb +1 -1
- data/lib/nmea_plus/message/nmea/hvm.rb +1 -1
- data/lib/nmea_plus/message/nmea/ima.rb +1 -1
- data/lib/nmea_plus/message/nmea/its.rb +1 -1
- data/lib/nmea_plus/message/nmea/lcd.rb +1 -1
- data/lib/nmea_plus/message/nmea/mda.rb +1 -1
- data/lib/nmea_plus/message/nmea/mhu.rb +1 -1
- data/lib/nmea_plus/message/nmea/mmb.rb +1 -1
- data/lib/nmea_plus/message/nmea/msk.rb +1 -1
- data/lib/nmea_plus/message/nmea/mss.rb +1 -1
- data/lib/nmea_plus/message/nmea/mta.rb +1 -1
- data/lib/nmea_plus/message/nmea/mtw.rb +1 -1
- data/lib/nmea_plus/message/nmea/mwh.rb +1 -1
- data/lib/nmea_plus/message/nmea/mws.rb +1 -1
- data/lib/nmea_plus/message/nmea/mwv.rb +1 -1
- data/lib/nmea_plus/message/nmea/oln.rb +1 -1
- data/lib/nmea_plus/message/nmea/olw.rb +1 -1
- data/lib/nmea_plus/message/nmea/omp.rb +1 -1
- data/lib/nmea_plus/message/nmea/onz.rb +1 -1
- data/lib/nmea_plus/message/nmea/osd.rb +1 -1
- data/lib/nmea_plus/message/nmea/proprietary/pashr.rb +1 -1
- data/lib/nmea_plus/message/nmea/r00.rb +1 -1
- data/lib/nmea_plus/message/nmea/rma.rb +1 -1
- data/lib/nmea_plus/message/nmea/rmb.rb +1 -1
- data/lib/nmea_plus/message/nmea/rmc.rb +1 -1
- data/lib/nmea_plus/message/nmea/rnn.rb +1 -1
- data/lib/nmea_plus/message/nmea/rot.rb +1 -1
- data/lib/nmea_plus/message/nmea/rpm.rb +1 -1
- data/lib/nmea_plus/message/nmea/rsa.rb +1 -1
- data/lib/nmea_plus/message/nmea/rsd.rb +1 -1
- data/lib/nmea_plus/message/nmea/rte.rb +1 -1
- data/lib/nmea_plus/message/nmea/sbk.rb +1 -1
- data/lib/nmea_plus/message/nmea/scd.rb +2 -2
- data/lib/nmea_plus/message/nmea/scy.rb +1 -1
- data/lib/nmea_plus/message/nmea/sdb.rb +1 -1
- data/lib/nmea_plus/message/nmea/sfi.rb +1 -1
- data/lib/nmea_plus/message/nmea/sgd.rb +1 -1
- data/lib/nmea_plus/message/nmea/sgr.rb +2 -1
- data/lib/nmea_plus/message/nmea/siu.rb +1 -1
- data/lib/nmea_plus/message/nmea/slc.rb +2 -2
- data/lib/nmea_plus/message/nmea/snc.rb +3 -3
- data/lib/nmea_plus/message/nmea/snu.rb +1 -1
- data/lib/nmea_plus/message/nmea/sps.rb +1 -1
- data/lib/nmea_plus/message/nmea/ssf.rb +1 -1
- data/lib/nmea_plus/message/nmea/stc.rb +1 -1
- data/lib/nmea_plus/message/nmea/stn.rb +1 -1
- data/lib/nmea_plus/message/nmea/str.rb +1 -1
- data/lib/nmea_plus/message/nmea/sys.rb +6 -6
- data/lib/nmea_plus/message/nmea/tds.rb +1 -1
- data/lib/nmea_plus/message/nmea/tec.rb +1 -1
- data/lib/nmea_plus/message/nmea/tep.rb +1 -1
- data/lib/nmea_plus/message/nmea/tfi.rb +1 -1
- data/lib/nmea_plus/message/nmea/tga.rb +1 -1
- data/lib/nmea_plus/message/nmea/tif.rb +14 -11
- data/lib/nmea_plus/message/nmea/tpc.rb +1 -1
- data/lib/nmea_plus/message/nmea/tpr.rb +1 -1
- data/lib/nmea_plus/message/nmea/tpt.rb +1 -1
- data/lib/nmea_plus/message/nmea/trf.rb +1 -1
- data/lib/nmea_plus/message/nmea/trp.rb +1 -1
- data/lib/nmea_plus/message/nmea/trs.rb +20 -17
- data/lib/nmea_plus/message/nmea/ttm.rb +1 -1
- data/lib/nmea_plus/message/nmea/vbw.rb +1 -1
- data/lib/nmea_plus/message/nmea/vcd.rb +1 -1
- data/lib/nmea_plus/message/nmea/vdr.rb +1 -1
- data/lib/nmea_plus/message/nmea/vhw.rb +1 -1
- data/lib/nmea_plus/message/nmea/vlw.rb +1 -1
- data/lib/nmea_plus/message/nmea/vpe.rb +1 -1
- data/lib/nmea_plus/message/nmea/vpw.rb +1 -1
- data/lib/nmea_plus/message/nmea/vta.rb +1 -1
- data/lib/nmea_plus/message/nmea/vtg.rb +6 -2
- data/lib/nmea_plus/message/nmea/vti.rb +1 -1
- data/lib/nmea_plus/message/nmea/vwe.rb +1 -1
- data/lib/nmea_plus/message/nmea/vwr.rb +1 -1
- data/lib/nmea_plus/message/nmea/vwt.rb +1 -1
- data/lib/nmea_plus/message/nmea/wcv.rb +1 -1
- data/lib/nmea_plus/message/nmea/wdc.rb +1 -1
- data/lib/nmea_plus/message/nmea/wdr.rb +1 -1
- data/lib/nmea_plus/message/nmea/wfm.rb +1 -1
- data/lib/nmea_plus/message/nmea/wnc.rb +1 -1
- data/lib/nmea_plus/message/nmea/wnr.rb +1 -1
- data/lib/nmea_plus/message/nmea/wpl.rb +1 -1
- data/lib/nmea_plus/message/nmea/xdr.rb +1 -1
- data/lib/nmea_plus/message/nmea/xte.rb +1 -1
- data/lib/nmea_plus/message/nmea/xtr.rb +1 -1
- data/lib/nmea_plus/message/nmea/ywp.rb +1 -1
- data/lib/nmea_plus/message/nmea/yws.rb +1 -1
- data/lib/nmea_plus/message/nmea/zaa.rb +1 -1
- data/lib/nmea_plus/message/nmea/zcd.rb +8 -6
- data/lib/nmea_plus/message/nmea/zda.rb +5 -3
- data/lib/nmea_plus/message/nmea/zev.rb +8 -6
- data/lib/nmea_plus/message/nmea/zfi.rb +1 -1
- data/lib/nmea_plus/message/nmea/zfo.rb +1 -1
- data/lib/nmea_plus/message/nmea/zlz.rb +1 -1
- data/lib/nmea_plus/message/nmea/zpi.rb +1 -1
- data/lib/nmea_plus/message/nmea/zta.rb +1 -1
- data/lib/nmea_plus/message/nmea/zte.rb +1 -1
- data/lib/nmea_plus/message/nmea/ztg.rb +1 -1
- data/lib/nmea_plus/message/nmea/zti.rb +1 -1
- data/lib/nmea_plus/message/nmea/zwp.rb +1 -1
- data/lib/nmea_plus/message/nmea/zzu.rb +1 -1
- data/lib/nmea_plus/message_factory.rb +4 -4
- data/lib/nmea_plus/nmea_message_factory.rb +152 -153
- data/lib/nmea_plus/version.rb +1 -1
- data/lib/nmea_plus.rb +6 -4
- metadata +13 -167
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cb281d4016ac12b0aceba18a59c9db5093319742bdf06619f5f16d1030939e38
|
4
|
+
data.tar.gz: bc20490025d2a92fee9f545fe4a147f4043ab0d8e220daf821bdf9d446048404
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a85275556747da743ea2b77f61a8d73b6a227be80be17c87b4c220d58cd2a2f3fd34c2cee9c7407ee0acb14bbf61ed21b676a5e261b5ce568cea9962ef7cd5af
|
7
|
+
data.tar.gz: 5551674f7e846c8cfcd7ae68edc08382acd36647fb6c642eec9f9aee96ffbbb7d010b61197a006c6647e1ccb4464f2eab4af83dfc4c27b323385bdbe0b67bcb6
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# NMEA (GPS) and AIS Parser / Decoder for Ruby (nmea_plus)
|
2
2
|
|
3
3
|
[](https://rubygems.org/gems/nmea_plus)
|
4
|
-
[](http://www.rubydoc.info/gems/nmea_plus/1.0
|
4
|
+
[](https://github.com/ianfixes/nmea_plus/actions/workflows/ruby.yml)
|
5
|
+
[](http://www.rubydoc.info/gems/nmea_plus/1.1.0)
|
6
6
|
[](http://inch-ci.org/github/ianfixes/nmea_plus)
|
7
7
|
|
8
8
|
[NMEA Plus](https://github.com/ianfixes/nmea_plus) is a Ruby gem for parsing and decoding "GPS" messages: NMEA, AIS, and any other similar formats of short messaging typically used by marine equipment. It provides convenient access (by name) to the fields of each message type, and a stream reader designed for use with Ruby Blocks.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by Racc 1.
|
4
|
-
# from Racc
|
3
|
+
# This file is automatically generated by Racc 1.8.1
|
4
|
+
# from Racc grammar file "parser.y".
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'racc/parser.rb'
|
@@ -88,6 +88,7 @@ Racc_arg = [
|
|
88
88
|
racc_shift_n,
|
89
89
|
racc_reduce_n,
|
90
90
|
racc_use_result_var ]
|
91
|
+
Ractor.make_shareable(Racc_arg) if defined?(Ractor)
|
91
92
|
|
92
93
|
Racc_token_to_s_table = [
|
93
94
|
"$end",
|
@@ -98,6 +99,7 @@ Racc_token_to_s_table = [
|
|
98
99
|
"DATA",
|
99
100
|
"$start",
|
100
101
|
"start" ]
|
102
|
+
Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
|
101
103
|
|
102
104
|
Racc_debug_parser = false
|
103
105
|
|
@@ -107,14 +109,14 @@ Racc_debug_parser = false
|
|
107
109
|
|
108
110
|
module_eval(<<'.,.,', 'parser.y', 8)
|
109
111
|
def _reduce_1(val, _values, result)
|
110
|
-
result = NMEAPlus::NMEAMessageFactory.create(val[0], val[1], val[2])
|
112
|
+
result = NMEAPlus::NMEAMessageFactory.create(val[0], val[1], val[2])
|
111
113
|
result
|
112
114
|
end
|
113
115
|
.,.,
|
114
116
|
|
115
117
|
module_eval(<<'.,.,', 'parser.y', 9)
|
116
118
|
def _reduce_2(val, _values, result)
|
117
|
-
result = NMEAPlus::AISMessageFactory.create(val[0], val[1], val[2])
|
119
|
+
result = NMEAPlus::AISMessageFactory.create(val[0], val[1], val[2])
|
118
120
|
result
|
119
121
|
end
|
120
122
|
.,.,
|
@@ -124,4 +126,4 @@ def _reduce_none(val, _values, result)
|
|
124
126
|
end
|
125
127
|
|
126
128
|
end # class Parser
|
127
|
-
|
129
|
+
end # module NMEAPlus
|
@@ -1,85 +1,86 @@
|
|
1
1
|
#--
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by rex 1.0.
|
4
|
-
# from lexical definition file "/Users/
|
3
|
+
# This file is automatically generated by rex 1.0.8
|
4
|
+
# from lexical definition file "/Users/ian/Development/nmea_plus/parser/tokenizer.rex".
|
5
5
|
#++
|
6
6
|
|
7
7
|
|
8
8
|
module NMEAPlus
|
9
9
|
class Decoder < Parser # The source file is in .rex format -- indentation and most yard documentation is impossible. This class does a very basic parse of an input line, calling {NMEAPlus::MessageFactory.create} on the result. In parser.y, this is currently defined to be a {NMEAPlus::NMEAMessageFactory} if the line begins with `$` and {NMEAPlus::AISMessageFactory} if the line begins with `!`. In pratice, you should be using {NMEAPlus::SourceDecoder} (which wraps this class) to parse messages from an IO object; this class can only parse individual strings.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
10
|
+
require 'strscan'
|
11
|
+
|
12
|
+
class ScanError < StandardError ; end
|
13
|
+
|
14
|
+
attr_reader :lineno
|
15
|
+
attr_reader :filename
|
16
|
+
attr_accessor :state
|
17
|
+
|
18
|
+
def scan_setup(str)
|
19
|
+
@ss = StringScanner.new(str)
|
20
|
+
@lineno = 1
|
21
|
+
@state = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def action
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
|
28
|
+
def scan_str(str)
|
29
|
+
scan_setup(str)
|
30
|
+
do_parse
|
31
|
+
end
|
32
|
+
alias :scan :scan_str
|
33
|
+
|
34
|
+
def load_file( filename )
|
35
|
+
@filename = filename
|
36
|
+
File.open(filename, "r") do |f|
|
37
|
+
scan_setup(f.read)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def scan_file( filename )
|
42
|
+
load_file(filename)
|
43
|
+
do_parse
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def next_token
|
48
|
+
return if @ss.eos?
|
49
|
+
|
50
|
+
# skips empty actions
|
51
|
+
until token = _next_token or @ss.eos?; end
|
52
|
+
token
|
53
|
+
end
|
54
|
+
|
55
|
+
def _next_token
|
56
|
+
text = @ss.peek(1)
|
57
|
+
@lineno += 1 if text == "\n"
|
58
|
+
token = case @state
|
59
|
+
when nil
|
60
|
+
case
|
61
|
+
when (text = @ss.scan(/\*[0-9A-F]{2}[\w\n\r]*/i))
|
62
|
+
action { [:CSUM, text[1..2]] }
|
63
|
+
|
64
|
+
when (text = @ss.scan(/\$/i))
|
65
|
+
action { [:CASH, text] }
|
66
|
+
|
67
|
+
when (text = @ss.scan(/!/i))
|
68
|
+
action { [:BANG, text] }
|
69
|
+
|
70
|
+
when (text = @ss.scan(/[^\*]+/i))
|
71
|
+
action { [:DATA, text] }
|
72
|
+
|
73
|
+
|
74
|
+
else
|
75
|
+
text = @ss.string[@ss.pos .. -1]
|
76
|
+
raise ScanError, "can not match: '" + text + "'"
|
77
|
+
end # if
|
78
|
+
|
79
|
+
else
|
80
|
+
raise ScanError, "undefined state: '" + state.to_s + "'"
|
81
|
+
end # case state
|
82
|
+
token
|
83
|
+
end # def _next_token
|
83
84
|
|
84
85
|
def parse(input)
|
85
86
|
@yydebug = true if ENV['DEBUG_RACC']
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "nmea_plus/message/ais/base_ais"
|
2
2
|
|
3
3
|
=begin boilerplate for vdm payload objects
|
4
4
|
require 'nmea_plus/message/ais/vdm_payload/vdm_msg'
|
@@ -17,29 +17,29 @@ end
|
|
17
17
|
|
18
18
|
=end
|
19
19
|
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
33
|
-
require
|
34
|
-
require
|
35
|
-
require
|
36
|
-
require
|
37
|
-
require
|
38
|
-
require
|
39
|
-
require
|
40
|
-
require
|
41
|
-
require
|
42
|
-
require
|
20
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg1"
|
21
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg2"
|
22
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg3"
|
23
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg4"
|
24
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg5"
|
25
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg6"
|
26
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg7"
|
27
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg8"
|
28
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg9"
|
29
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg10"
|
30
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg11"
|
31
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg12"
|
32
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg13"
|
33
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg14"
|
34
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg15"
|
35
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg16"
|
36
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg17"
|
37
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg18"
|
38
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg19"
|
39
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg20"
|
40
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg21"
|
41
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg24"
|
42
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg27"
|
43
43
|
|
44
44
|
module NMEAPlus
|
45
45
|
module Message
|
@@ -76,8 +76,10 @@ module NMEAPlus
|
|
76
76
|
ret = ""
|
77
77
|
loop do
|
78
78
|
break if ptr.raw_ais_payload.nil? # guard against rare instances of message corruption
|
79
|
+
|
79
80
|
ret << ptr.raw_ais_payload
|
80
81
|
break if ptr.next_part.nil? # stop when we run out of messages in the chain
|
82
|
+
|
81
83
|
ptr = ptr.next_part
|
82
84
|
end
|
83
85
|
ret
|
@@ -104,17 +106,18 @@ module NMEAPlus
|
|
104
106
|
loop do
|
105
107
|
fill_bits = ptr.ais_payload_fill_bits
|
106
108
|
break if ptr.next_part.nil?
|
109
|
+
|
107
110
|
ptr = ptr.next_part
|
108
111
|
end
|
109
112
|
fill_bits.to_i
|
110
113
|
end
|
111
114
|
|
112
115
|
# perform the 6-bit to 8-bit conversion defined in the spec
|
113
|
-
# @param
|
116
|
+
# @param char [String] a character
|
114
117
|
# @param len [Integer] The number of bits to consider
|
115
118
|
# @return [String] a binary encoded string
|
116
|
-
def _dearmor6b(
|
117
|
-
val =
|
119
|
+
def _dearmor6b(char, len = 6)
|
120
|
+
val = char.ord
|
118
121
|
ret = val - (val >= 96 ? 56 : 48) # Mapped to 2 separate contiguous blocks of ascii, so choose which
|
119
122
|
ret.to_s(2).rjust(6, "0")[0..(len - 1)]
|
120
123
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module NMEAPlus
|
3
2
|
module Message
|
4
3
|
module AIS
|
@@ -22,7 +21,8 @@ module NMEAPlus
|
|
22
21
|
# @!parse attr_reader :category
|
23
22
|
# @return [Symbol] The symbol for the MMSI category
|
24
23
|
def category
|
25
|
-
|
24
|
+
# rubocop:disable Lint/DuplicateBranch
|
25
|
+
case id.to_s.rjust(9, "0") # formatted as 9 digit string with leading 0s
|
26
26
|
when /[2-7]......../ then :individual_ship
|
27
27
|
when /00...1.../ then :coast_station
|
28
28
|
when /00...2.../ then :harbor_station
|
@@ -43,6 +43,7 @@ module NMEAPlus
|
|
43
43
|
else
|
44
44
|
:unknown_mmsi_category
|
45
45
|
end
|
46
|
+
# rubocop:enable Lint/DuplicateBranch
|
46
47
|
end
|
47
48
|
|
48
49
|
# The MMSI category as defined by ITU-R M.585-7
|
@@ -76,6 +77,7 @@ module NMEAPlus
|
|
76
77
|
# @!parse attr_reader :mid
|
77
78
|
# @return [Integer] the MID
|
78
79
|
def mid
|
80
|
+
# rubocop:disable Lint/DuplicateBranch
|
79
81
|
range = case category
|
80
82
|
when :individual_ship then 0..2
|
81
83
|
when :coast_station, :harbor_station, :pilot_station, :ais_repeater_station then 2..4
|
@@ -85,8 +87,10 @@ module NMEAPlus
|
|
85
87
|
when :handheld then 1..3
|
86
88
|
when :sar_transmitter, :man_overboard, :epirb then 3..5
|
87
89
|
end
|
90
|
+
# rubocop:enable Lint/DuplicateBranch
|
88
91
|
return nil if range.nil?
|
89
|
-
|
92
|
+
|
93
|
+
id.to_s.rjust(9, "0")[range].to_i
|
90
94
|
end
|
91
95
|
|
92
96
|
# The ISO 3166-1 country ID indicated by the MMSI Maritime Identification Digits (MID)
|
@@ -96,6 +100,7 @@ module NMEAPlus
|
|
96
100
|
# https://github.com/S73417H/MIDs
|
97
101
|
# https://github.com/alexrabarts/iso_country_codes
|
98
102
|
# JSON.parse(IO.read("mids.json")).each {|k, v| puts "when #{k} then #{IsoCountryCodes.find(v[1]).numeric.to_i}" }
|
103
|
+
# rubocop:disable Lint/DuplicateBranch
|
99
104
|
case mid
|
100
105
|
when 201 then 8
|
101
106
|
when 202 then 20
|
@@ -384,6 +389,7 @@ module NMEAPlus
|
|
384
389
|
when 770 then 858
|
385
390
|
when 775 then 862
|
386
391
|
end
|
392
|
+
# rubocop:enable Lint/DuplicateBranch
|
387
393
|
end
|
388
394
|
|
389
395
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module NMEAPlus
|
3
2
|
module Message
|
4
3
|
module AIS
|
@@ -67,6 +66,7 @@ module NMEAPlus
|
|
67
66
|
def _access(start, length)
|
68
67
|
part = @payload_bitstring[start, length]
|
69
68
|
return nil if part.nil? || part.empty?
|
69
|
+
|
70
70
|
block_given? ? (yield part) : part
|
71
71
|
end
|
72
72
|
|
@@ -115,6 +115,7 @@ module NMEAPlus
|
|
115
115
|
def _6b_unsigned_integer(start, length, equiv_nil = nil)
|
116
116
|
ret = _access(start, length) { |bits| bits.to_i(2) }
|
117
117
|
return nil if ret == equiv_nil
|
118
|
+
|
118
119
|
ret
|
119
120
|
end
|
120
121
|
|
@@ -133,6 +134,7 @@ module NMEAPlus
|
|
133
134
|
# two's complement: flip bits, then add 1
|
134
135
|
ret = _access(start, length) { |bits| (bits.tr("01", "10").to_i(2) + 1) * -1 }
|
135
136
|
return nil if ret == equiv_nil
|
137
|
+
|
136
138
|
ret
|
137
139
|
end
|
138
140
|
end
|
@@ -147,6 +149,7 @@ module NMEAPlus
|
|
147
149
|
def _6b_integer_scaled(start, length, denominator, equiv_nil = nil)
|
148
150
|
ret = _6b_integer(start, length, equiv_nil)
|
149
151
|
return nil if ret.nil?
|
152
|
+
|
150
153
|
ret.to_f / denominator
|
151
154
|
end
|
152
155
|
|
@@ -160,6 +163,7 @@ module NMEAPlus
|
|
160
163
|
def _6b_unsigned_integer_scaled(start, length, denominator, equiv_nil = nil)
|
161
164
|
ret = _6b_unsigned_integer(start, length, equiv_nil)
|
162
165
|
return nil if ret.nil?
|
166
|
+
|
163
167
|
ret.to_f / denominator
|
164
168
|
end
|
165
169
|
|
@@ -174,6 +178,7 @@ module NMEAPlus
|
|
174
178
|
def _6b_integer_scaled_shifted(start, length, denominator, shift, equiv_nil = nil)
|
175
179
|
ret = _6b_integer_scaled(start, length, denominator, equiv_nil)
|
176
180
|
return nil if ret.nil?
|
181
|
+
|
177
182
|
ret + shift
|
178
183
|
end
|
179
184
|
|
@@ -188,6 +193,7 @@ module NMEAPlus
|
|
188
193
|
def _6b_unsigned_integer_scaled_shifted(start, length, denominator, shift, equiv_nil = nil)
|
189
194
|
ret = _6b_unsigned_integer_scaled(start, length, denominator, equiv_nil)
|
190
195
|
return nil if ret.nil?
|
196
|
+
|
191
197
|
ret + shift
|
192
198
|
end
|
193
199
|
|
@@ -253,7 +259,7 @@ module NMEAPlus
|
|
253
259
|
rollover = 0
|
254
260
|
rollover = 1 if now.month > month
|
255
261
|
rollover = -1 if now.month == 1 && month == 12
|
256
|
-
Time.new(now.year + rollover, month, day, hour, minute, 0,
|
262
|
+
Time.new(now.year + rollover, month, day, hour, minute, 0, "+00:00")
|
257
263
|
end
|
258
264
|
|
259
265
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module NMEAPlus
|
3
2
|
module Message
|
4
3
|
module AIS
|
@@ -40,8 +39,8 @@ module NMEAPlus
|
|
40
39
|
|
41
40
|
# SubArea structure base type for a region anchored to a point
|
42
41
|
class SubAreaAnchored < SubAreaScaled
|
43
|
-
payload_reader :longitude, 5, 25, :_I, 60 * 10**3, 181
|
44
|
-
payload_reader :latitude, 30, 24, :_I, 60 * 10**3, 91
|
42
|
+
payload_reader :longitude, 5, 25, :_I, 60 * (10**3), 181
|
43
|
+
payload_reader :latitude, 30, 24, :_I, 60 * (10**3), 91
|
45
44
|
payload_reader :precision, 54, 3, :_u
|
46
45
|
end
|
47
46
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "nmea_plus/message/ais/vdm_payload/payload"
|
2
|
+
require "nmea_plus/message/ais/vdm_payload/mmsi_info"
|
3
3
|
|
4
4
|
module NMEAPlus
|
5
5
|
module Message
|
@@ -98,6 +98,7 @@ module NMEAPlus
|
|
98
98
|
# @return [String] Navigational status description
|
99
99
|
def get_navigational_status_description(code)
|
100
100
|
return nil if code.nil?
|
101
|
+
|
101
102
|
case code
|
102
103
|
when 0 then "Under way using engine"
|
103
104
|
when 1 then "At anchor"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "nmea_plus/message/ais/vdm_payload/vdm_msg"
|
2
2
|
|
3
3
|
module NMEAPlus
|
4
4
|
module Message
|
@@ -13,8 +13,8 @@ module NMEAPlus
|
|
13
13
|
payload_reader :name, 43, 120, :_t
|
14
14
|
|
15
15
|
payload_reader :position_10m_accuracy?, 163, 1, :_b
|
16
|
-
payload_reader :longitude, 164, 28, :_I, 60 * 10**4, 181
|
17
|
-
payload_reader :latitude, 192, 27, :_I, 60 * 10**4, 91
|
16
|
+
payload_reader :longitude, 164, 28, :_I, 60 * (10**4), 181
|
17
|
+
payload_reader :latitude, 192, 27, :_I, 60 * (10**4), 91
|
18
18
|
|
19
19
|
payload_reader :ship_dimension_to_bow, 219, 9, :_u
|
20
20
|
payload_reader :ship_dimension_to_stern, 228, 9, :_u
|