nmea_plus 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8b9332e5d45ba59ff6572c20801c15205fcfc674
4
- data.tar.gz: ddc8d5117a0b4c4774eb5ffe552b07a1ce2873ed
3
+ metadata.gz: 4995804e2eba3842192e6ca02309efe1867b439a
4
+ data.tar.gz: ff77b5f6dee8dc838fd7a62c321c0655f4c81033
5
5
  SHA512:
6
- metadata.gz: 4163c6ee8e9d1ba684cd30f18a94e4d8b42b11c5401a23c57ff0d82b27ce18b9b0ce2a21090e95f9fe96316bda9034f4224ae1b0d12176e75b90309f4369e09b
7
- data.tar.gz: 538f7e47902a954c116d1c7d630c51b32a821b5d2cdc1b95e54ad9148ddb3e4b6ef2546b550bda734680e6f0da806d0bf3a87edc947d67ebdc47f1b2ce2d15d5
6
+ metadata.gz: c0354acd88c7ca3c349d12d6be23e127ec8468e3db846eb99156ce8a15be2b6f461a60d3cd4473542f0ce6303ebdd6f15dcbcc8ac1aa9c0c27f6306843cf88a3
7
+ data.tar.gz: fdbdb7dfbbc1164242a9226d0d19583f25180141b554db6681c4573219039a9a7fa0ec4198b1684dea6f8d47b86e9ea90935b2dbcd39a2a6cbfac434bda0f4ad
data/.yardopts CHANGED
@@ -1 +1 @@
1
- lib/nmea_plus.rb lib/nmea_plus/message/nmea/base_nmea.rb lib/nmea_plus/message/ais/vdm_payload/vdm_msg.rb lib/**/*.rb
1
+ lib/nmea_plus.rb lib/nmea_plus/message/nmea/base_nmea.rb lib/nmea_plus/message/ais/vdm_payload/payload.rb lib/nmea_plus/message/ais/vdm_payload/*_dynamic_payload.rb lib/nmea_plus/message/ais/vdm_payload/subarea.rb lib/**/*.rb
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/nmea_plus.svg)](https://rubygems.org/gems/nmea_plus)
4
4
  [![Build Status](https://travis-ci.org/ifreecarve/nmea_plus.svg)](https://travis-ci.org/ifreecarve/nmea_plus)
5
- [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/nmea_plus/1.0.9)
5
+ [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/nmea_plus/1.0.10)
6
6
 
7
7
  [NMEA Plus](https://github.com/ifreecarve/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.
8
8
 
@@ -89,7 +89,7 @@ end
89
89
  This gem was coded to accept the standard NMEA messages defined in the unoffical spec found here:
90
90
  http://www.catb.org/gpsd/NMEA.txt
91
91
 
92
- Because the message types are standard, if no override is found for a particular talker ID then the message will parse according to the command (the last 3 characters) of the data type. In other words, $GPGLL will use the general GLL message type. Currently, the following standard message types are supported:
92
+ Because the message types are standard, if no override is found for a particular talker ID then the message will parse according to the command (the last 3 characters) of the data type. In other words, `$GPGLL` will use the general `GLL` message type. Currently, the following standard message types are supported:
93
93
 
94
94
  > AAM, ALM, APA, APB, BOD, BWC, BWR, BWW, DBK, DBS, DBT, DCN, DPT, DTM, FSI, GBS, GGA, GLC, GLL, GNS, GRS, GSA, GST, GSV, GTD, GXA, HDG, HDM, HDT, HFB, HSC, ITS, LCD, MSK, MSS, MTW, MWV, OLN, OSD, R00, RMA, RMB, RMC, ROT, RPM, RSA, RSD, RTE, SFI, STN, TDS, TFI, TPC, TPR, TPT, TRF, TTM, VBW, VDR, VHW, VLW, VPW, VTG, VWR, WCV, WNC, WPL, XDR, XTE, XTR, ZDA, ZFO, ZTG
95
95
 
@@ -101,18 +101,18 @@ Support for proprietary NMEA messages is also possible. PASHR is included as pr
101
101
  AIS message type definitions were implemented from the unofficial spec found here:
102
102
  http://catb.org/gpsd/AIVDM.html
103
103
 
104
- The AIS payload can be found in the AIVDM message's payload field. Currently, the following AIS message types are supported:
104
+ The AIS payload can be found in the payload field of a `VDM` message (aka `!AIVDM`, `!ABVDM`, `!SAVDM`). Currently, the following AIS message types are supported:
105
105
 
106
106
  > 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 18, 19, 20, 21, 24, 27
107
107
 
108
108
  > Type 6 subtypes for DAC/FID: 235/10, 1022/61
109
109
 
110
- > Type 8 subtypes for DAC/FID: 1/31, 366/56, 366/57
110
+ > Type 8 subtypes for DAC/FID: 1/22, 1/31, 366/56, 366/57
111
111
 
112
112
 
113
113
  ## Disclaimer
114
114
 
115
- This module was written from information scraped together on the web, not from testing on actual devices. A lack of test cases -- especially for more obscure message types -- is a barrier to completeness. Please don't entrust your life or the safety of a ship to this code without doing your own rigorous testing.
115
+ This module was written primarily from information scraped together on the web, with minimal testing on an actual device (an SR161 AIS receiver). A lack of test cases -- especially for more obscure message types -- is a barrier to completeness. Please don't entrust your life or the safety of a ship to this code without doing your own rigorous testing.
116
116
 
117
117
 
118
118
  ## Author
@@ -2,6 +2,9 @@
2
2
  module NMEAPlus
3
3
  module Message
4
4
  module AIS
5
+
6
+ # This module contains all the VDM payload types and subtypes.
7
+ # @see VDMMsg
5
8
  module VDMPayload
6
9
  # Basic tools for interpreting the armored (binary) payload encoding of AIS.
7
10
  # This class provides convenience functions for accessing the fields as the appropriate data type,
@@ -0,0 +1,140 @@
1
+
2
+ module NMEAPlus
3
+ module Message
4
+ module AIS
5
+ module VDMPayload
6
+ # A sub-structure in a payload: 87 bits describing a shape
7
+ class SubArea < Payload
8
+
9
+ payload_reader :shape_id, 0, 3, :_e
10
+
11
+ # @!parse attr_reader :shape_description
12
+ # @return [String] Shape description
13
+ def shape_description
14
+ case shape_id
15
+ when 0 then "Circle or point"
16
+ when 1 then "Rectangle"
17
+ when 2 then "Sector"
18
+ when 3 then "Polyline"
19
+ when 4 then "Polygon"
20
+ when 5 then "Associated text"
21
+ when 6, 7 then "Reserved"
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ # Catch-all for undefined shape IDs
28
+ class SubAreaUndefined < SubArea; end
29
+
30
+ # SubArea structure base type for a region with scale
31
+ class SubAreaScaled < SubArea
32
+ payload_reader :scale_factor, 3, 2, :_u
33
+
34
+ # @!parse attr_reader :scale_meters
35
+ # @return [Integer] Scale factor represented in meters to multiply by
36
+ def scale_meters
37
+ 10**scale_factor
38
+ end
39
+ end
40
+
41
+ # SubArea structure base type for a region anchored to a point
42
+ 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
45
+ payload_reader :precision, 54, 3, :_u
46
+ end
47
+
48
+ # SubArea structure type 0: Circle or point
49
+ class SubArea0 < SubAreaAnchored
50
+ payload_reader :radius, 57, 12, :_u
51
+
52
+ # @!parse attr_reader :radius_meters
53
+ # @return [Integer] Radius in meters, according to scale factor
54
+ def radius_meters
55
+ radius * scale_meters
56
+ end
57
+ end
58
+
59
+ # SubArea structure type 1: Rectangle
60
+ class SubArea1 < SubAreaAnchored
61
+ payload_reader :dimension_east, 57, 8, :_u
62
+ payload_reader :dimension_north, 65, 8, :_u
63
+
64
+ payload_reader :orientation, 73, 9, :_u
65
+
66
+ # @!parse attr_reader :dimension_east_meters
67
+ # @return [Integer] Box dimension in meters, according to scale factor
68
+ def dimension_east_meters
69
+ dimension_east * scale_meters
70
+ end
71
+
72
+ # @!parse attr_reader :dimension_east_meters
73
+ # @return [Integer] Box dimension in meters, according to scale factor
74
+ def dimension_north_meters
75
+ dimension_north * scale_meters
76
+ end
77
+ end
78
+
79
+ # SubArea structure type 2: Sector
80
+ class SubArea2 < SubAreaAnchored
81
+ payload_reader :radius, 57, 12, :_u
82
+ payload_reader :boundary_left, 69, 9, :_u
83
+ payload_reader :boundary_right, 78, 9, :_u
84
+
85
+ # @!parse attr_reader :radius_meters
86
+ # @return [Integer] Radius in meters, according to scale factor
87
+ def radius_meters
88
+ radius * scale_meters
89
+ end
90
+
91
+ end
92
+
93
+ # SubArea structure type 3: Polyline
94
+ class SubArea3 < SubAreaScaled
95
+
96
+ payload_reader :bearing1, 5, 10, :_u, 720
97
+ payload_reader :distance1, 15, 10, :_u
98
+ payload_reader :bearing2, 25, 10, :_u, 720
99
+ payload_reader :distance2, 35, 10, :_u
100
+ payload_reader :bearing3, 45, 10, :_u, 720
101
+ payload_reader :distance3, 55, 10, :_u
102
+ payload_reader :bearing4, 65, 10, :_u, 720
103
+ payload_reader :distance4, 75, 10, :_u
104
+
105
+ class ShapePoint
106
+ attr_accessor :bearing
107
+ attr_accessor :distance
108
+ attr_accessor :distance_meters
109
+ end
110
+
111
+ # @!parse attr_reader :points
112
+ # @return [Array] Array of points
113
+ def points
114
+ ret = []
115
+
116
+ # load up from existing properties
117
+ (1..4).each do |i|
118
+ d = send("distance#{i}")
119
+ sp = ShapePoint.new
120
+ sp.bearing = send("bearing#{i}")
121
+ sp.distance = d
122
+ sp.distance_meters = d * scale_meters
123
+ ret << sp
124
+ end
125
+ ret
126
+ end
127
+ end
128
+
129
+ # SubArea structure type 4: Polygon
130
+ class SubArea4 < SubArea3; end
131
+
132
+ # SubArea structure type 5: Associated text
133
+ class SubArea5 < SubArea
134
+ payload_reader :text, 3, 84, :_t
135
+ end
136
+
137
+ end
138
+ end
139
+ end
140
+ end
@@ -3,8 +3,6 @@ require_relative "payload"
3
3
  module NMEAPlus
4
4
  module Message
5
5
  module AIS
6
- # This module contains all the VDM payload types and subtypes.
7
- # @see {VDMMsg}
8
6
  module VDMPayload
9
7
 
10
8
  # The base class for the {NMEAPlus::Message::AIS::VDM#ais AIS payload}, which uses its own encoding for its own subtypes
@@ -19,7 +19,7 @@ module NMEAPlus
19
19
  # Dynamic Payload containing fields for the appropriate message 6 subtype.
20
20
  # This is a factory method for the container class
21
21
  # @!parse attr_reader :dp
22
- # @return [VDMPayload::VDMMsg::VDMMsg8DynamicPayload]
22
+ # @return [VDMMsg6DynamicPayload]
23
23
  def dp
24
24
  ret = _dynamic_payload_container
25
25
  ret.payload_bitstring = payload_bitstring
@@ -34,21 +34,10 @@ module NMEAPlus
34
34
  ret = _object_by_name(class_identifier)
35
35
  return ret unless ret.nil?
36
36
 
37
- _object_by_name("NMEAPlus::Message::AIS::VDMPayload::VDMMsg8Undefined") # generic
37
+ _object_by_name("NMEAPlus::Message::AIS::VDMPayload::VDMMsg6Undefined") # generic
38
38
  end
39
39
 
40
40
  end
41
-
42
- # Base class for dynamic payloads (subtypes) of AIS VDM message 6
43
- class VDMMsg6DynamicPayload < NMEAPlus::Message::AIS::VDMPayload::Payload; end
44
-
45
- # Placeholder for undefined message 8 payload subtypes
46
- class VDMMsg6Undefined < NMEAPlus::Message::AIS::VDMPayload::VDMMsg6DynamicPayload
47
- payload_reader :application_data_2b, 56, 952, :_d
48
- payload_reader :application_data_6b, 56, 952, :_6b_string
49
- payload_reader :application_data_8b, 56, 952, :_8b_data_string
50
- end
51
-
52
41
  end
53
42
  end
54
43
  end
@@ -0,0 +1,21 @@
1
+ require_relative 'payload'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # Base class for dynamic payloads (subtypes) of AIS VDM message 6
9
+ class VDMMsg6DynamicPayload < NMEAPlus::Message::AIS::VDMPayload::Payload; end
10
+
11
+ # Placeholder for undefined message 6 payload subtypes
12
+ class VDMMsg6Undefined < NMEAPlus::Message::AIS::VDMPayload::VDMMsg6DynamicPayload
13
+ payload_reader :application_data_2b, 56, 952, :_d
14
+ payload_reader :application_data_6b, 56, 952, :_6b_string
15
+ payload_reader :application_data_8b, 56, 952, :_8b_data_string
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,4 +1,4 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg6_dynamic_payload'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
@@ -7,7 +7,7 @@ module NMEAPlus
7
7
 
8
8
  # Type 6: Binary Addressed Message Subtype: Sealite SL125 Lantern or 155 Apollo Lantern
9
9
  # This message has an ascii CSV payload wrapped in an armored AIS payload, wrapped in the NMEA CSV payload.
10
- class VDMMsg6d1022f61 < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
10
+ class VDMMsg6d1022f61 < NMEAPlus::Message::AIS::VDMPayload::VDMMsg6DynamicPayload
11
11
 
12
12
  def initialize
13
13
  super
@@ -1,4 +1,4 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg6_dynamic_payload'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
@@ -6,7 +6,7 @@ module NMEAPlus
6
6
  module VDMPayload
7
7
 
8
8
  # Type 6: Binary Addressed Message Subtype: GLA Aid to Navigation Monitoring Data
9
- class VDMMsg6d235f10 < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
9
+ class VDMMsg6d235f10 < NMEAPlus::Message::AIS::VDMPayload::VDMMsg6DynamicPayload
10
10
 
11
11
  payload_reader :analog_internal, 88, 10, :_U, 20, 0
12
12
  payload_reader :analog_external1, 98, 10, :_U, 20, 0
@@ -1,4 +1,5 @@
1
1
  require_relative 'vdm_msg'
2
+ require_relative 'vdm_msg8d1f22'
2
3
  require_relative 'vdm_msg8d1f31'
3
4
  require_relative 'vdm_msg8d366f56'
4
5
 
@@ -16,7 +17,7 @@ module NMEAPlus
16
17
  # Dynamic Payload containing fields for the appropriate message 8 subtype.
17
18
  # This is a factory method for the container class
18
19
  # @!parse attr_reader :dp
19
- # @return [VDMPayload::VDMMsg::VDMMsg8DynamicPayload]
20
+ # @return [VDMMsg8DynamicPayload]
20
21
  def dp
21
22
  ret = _dynamic_payload_container
22
23
  ret.payload_bitstring = payload_bitstring
@@ -26,6 +27,7 @@ module NMEAPlus
26
27
 
27
28
  # Dynamically calculate what message subtype to use
28
29
  # which depends on the designated_area_code and functional_id
30
+ # @private
29
31
  def _dynamic_payload_container
30
32
  class_identifier = "NMEAPlus::Message::AIS::VDMPayload::VDMMsg8d#{designated_area_code}f#{functional_id}"
31
33
  ret = _object_by_name(class_identifier)
@@ -42,17 +44,6 @@ module NMEAPlus
42
44
  end
43
45
 
44
46
  end
45
-
46
- # Base class for {VDMMsg8#dp dynamic payload}s (subtypes) of {VDMMsg8 AIS VDM message 8}
47
- class VDMMsg8DynamicPayload < NMEAPlus::Message::AIS::VDMPayload::Payload; end
48
-
49
- # Placeholder for undefined message 8 payload subtypes
50
- class VDMMsg8Undefined < NMEAPlus::Message::AIS::VDMPayload::VDMMsg8DynamicPayload
51
- payload_reader :application_data_2b, 56, 952, :_d
52
- payload_reader :application_data_6b, 56, 952, :_6b_string
53
- payload_reader :application_data_8b, 56, 952, :_8b_data_string
54
- end
55
-
56
47
  end
57
48
  end
58
49
  end
@@ -0,0 +1,21 @@
1
+ require_relative 'payload'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # Base class for {VDMMsg8#dp dynamic payload}s (subtypes) of {VDMMsg8 AIS VDM message 8}
9
+ class VDMMsg8DynamicPayload < NMEAPlus::Message::AIS::VDMPayload::Payload; end
10
+
11
+ # Placeholder for undefined message 8 payload subtypes
12
+ class VDMMsg8Undefined < VDMMsg8DynamicPayload
13
+ payload_reader :application_data_2b, 56, 952, :_d
14
+ payload_reader :application_data_6b, 56, 952, :_6b_string
15
+ payload_reader :application_data_8b, 56, 952, :_8b_data_string
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,210 @@
1
+ require_relative 'vdm_msg8_dynamic_payload'
2
+ require_relative 'sub_area'
3
+
4
+ module NMEAPlus
5
+ module Message
6
+ module AIS
7
+ module VDMPayload
8
+ # Type 8: Binary Broadcast Message Subtype: Area Notice (addressed)
9
+ class VDMMsg8d1f22 < NMEAPlus::Message::AIS::VDMPayload::VDMMsg8DynamicPayload
10
+
11
+ def initialize
12
+ super
13
+ @sub_areas = []
14
+ end
15
+
16
+ def payload_bitstring=(val)
17
+ # Override default bitstring setting to dynamically calculate what SubArea fields belong in this message
18
+ super
19
+
20
+ @sub_areas = []
21
+ (111...val.length).step(87).each do |pos|
22
+ shape_id = _u(pos, 3) # 3 bits at the beginning form the shape ID
23
+ container = _dynamic_subarea_container(shape_id)
24
+ container.payload_bitstring = payload_bitstring[pos..(pos + 87)]
25
+ @sub_areas << container
26
+ end
27
+ end
28
+
29
+ # Dynamically calculate what subarea type to use
30
+ # which depends on the designated_area_code and functional_id
31
+ # @private
32
+ def _dynamic_subarea_container(shape_id)
33
+ class_identifier = "NMEAPlus::Message::AIS::VDMPayload::SubArea#{shape_id}"
34
+ ret = _object_by_name(class_identifier)
35
+ return ret unless ret.nil?
36
+
37
+ _object_by_name("NMEAPlus::Message::AIS::VDMPayload::SubAreaUndefined") # generic
38
+ end
39
+
40
+ payload_reader :linkage_id, 56, 10, :_u
41
+ payload_reader :notice_id, 66, 7, :_u
42
+
43
+ # @!parse attr_reader :notice_description
44
+ # @return [String] Area notice description
45
+ def notice_description
46
+ case notice_id
47
+ when 0 then "Caution Area: Marine mammals habitat"
48
+ when 1 then "Caution Area: Marine mammals in area - reduce speed"
49
+ when 2 then "Caution Area: Marine mammals in area - stay clear"
50
+ when 3 then "Caution Area: Marine mammals in area - report sightings"
51
+ when 4 then "Caution Area: Protected habitat - reduce speed"
52
+ when 5 then "Caution Area: Protected habitat - stay clear"
53
+ when 6 then "Caution Area: Protected habitat - no fishing or anchoring"
54
+ when 7 then "Caution Area: Derelicts (drifting objects)"
55
+ when 8 then "Caution Area: Traffic congestion"
56
+ when 9 then "Caution Area: Marine event"
57
+ when 10 then "Caution Area: Divers down"
58
+ when 11 then "Caution Area: Swim area"
59
+ when 12 then "Caution Area: Dredge operations"
60
+ when 13 then "Caution Area: Survey operations"
61
+ when 14 then "Caution Area: Underwater operation"
62
+ when 15 then "Caution Area: Seaplane operations"
63
+ when 16 then "Caution Area: Fishery - nets in water"
64
+ when 17 then "Caution Area: Cluster of fishing vessels"
65
+ when 18 then "Caution Area: Fairway closed"
66
+ when 19 then "Caution Area: Harbour closed"
67
+ when 20 then "Caution Area: Risk (define in associated text field)"
68
+ when 21 then "Caution Area: Underwater vehicle operation"
69
+ when 22 then "(reserved for future use)"
70
+ when 23 then "Environmental Caution Area: Storm front (line squall)"
71
+ when 24 then "Environmental Caution Area: Hazardous sea ice"
72
+ when 25 then "Environmental Caution Area: Storm warning (storm cell or line of storms)"
73
+ when 26 then "Environmental Caution Area: High wind"
74
+ when 27 then "Environmental Caution Area: High waves"
75
+ when 28 then "Environmental Caution Area: Restricted visibility (fog, rain, etc.)"
76
+ when 29 then "Environmental Caution Area: Strong currents"
77
+ when 30 then "Environmental Caution Area: Heavy icing"
78
+ when 31 then "(reserved for future use)"
79
+ when 32 then "Restricted Area: Fishing prohibited"
80
+ when 33 then "Restricted Area: No anchoring."
81
+ when 34 then "Restricted Area: Entry approval required prior to transit"
82
+ when 35 then "Restricted Area: Entry prohibited"
83
+ when 36 then "Restricted Area: Active military OPAREA"
84
+ when 37 then "Restricted Area: Firing - danger area."
85
+ when 38 then "Restricted Area: Drifting Mines"
86
+ when 39 then "(reserved for future use)"
87
+ when 40 then "Anchorage Area: Anchorage open"
88
+ when 41 then "Anchorage Area: Anchorage closed"
89
+ when 42 then "Anchorage Area: Anchorage prohibited"
90
+ when 43 then "Anchorage Area: Deep draft anchorage"
91
+ when 44 then "Anchorage Area: Shallow draft anchorage"
92
+ when 45 then "Anchorage Area: Vessel transfer operations"
93
+ when 46 then "(reserved for future use)"
94
+ when 47 then "(reserved for future use)"
95
+ when 48 then "(reserved for future use)"
96
+ when 49 then "(reserved for future use)"
97
+ when 50 then "(reserved for future use)"
98
+ when 51 then "(reserved for future use)"
99
+ when 52 then "(reserved for future use)"
100
+ when 53 then "(reserved for future use)"
101
+ when 54 then "(reserved for future use)"
102
+ when 55 then "(reserved for future use)"
103
+ when 56 then "Security Alert - Level 1"
104
+ when 57 then "Security Alert - Level 2"
105
+ when 57 then "Security Alert - Level 3"
106
+ when 59 then "(reserved for future use)"
107
+ when 60 then "(reserved for future use)"
108
+ when 61 then "(reserved for future use)"
109
+ when 62 then "(reserved for future use)"
110
+ when 63 then "(reserved for future use)"
111
+ when 64 then "Distress Area: Vessel disabled and adrift"
112
+ when 65 then "Distress Area: Vessel sinking"
113
+ when 66 then "Distress Area: Vessel abandoning ship"
114
+ when 67 then "Distress Area: Vessel requests medical assistance"
115
+ when 68 then "Distress Area: Vessel flooding"
116
+ when 69 then "Distress Area: Vessel fire/explosion"
117
+ when 70 then "Distress Area: Vessel grounding"
118
+ when 71 then "Distress Area: Vessel collision"
119
+ when 72 then "Distress Area: Vessel listing/capsizing"
120
+ when 73 then "Distress Area: Vessel under assault"
121
+ when 74 then "Distress Area: Person overboard"
122
+ when 75 then "Distress Area: SAR area"
123
+ when 76 then "Distress Area: Pollution response area"
124
+ when 77 then "(reserved for future use)"
125
+ when 78 then "(reserved for future use)"
126
+ when 79 then "(reserved for future use)"
127
+ when 80 then "Instruction: Contact VTS at this point/juncture"
128
+ when 81 then "Instruction: Contact Port Administration at this point/juncture"
129
+ when 82 then "Instruction: Do not proceed beyond this point/juncture"
130
+ when 83 then "Instruction: Await instructions prior to proceeding beyond this point/juncture"
131
+ when 84 then "Proceed to this location - await instructions"
132
+ when 85 then "Clearance granted - proceed to berth"
133
+ when 86 then "(reserved for future use)"
134
+ when 87 then "(reserved for future use)"
135
+ when 88 then "Information: Pilot boarding position"
136
+ when 89 then "Information: Icebreaker waiting area"
137
+ when 90 then "Information: Places of refuge"
138
+ when 91 then "Information: Position of icebreakers"
139
+ when 92 then "Information: Location of response units"
140
+ when 93 then "VTS active target"
141
+ when 94 then "Rogue or suspicious vessel"
142
+ when 95 then "Vessel requesting non-distress assistance"
143
+ when 96 then "Chart Feature: Sunken vessel"
144
+ when 97 then "Chart Feature: Submerged object"
145
+ when 98 then "Chart Feature:Semi-submerged object"
146
+ when 99 then "Chart Feature: Shoal area"
147
+ when 100 then "Chart Feature: Shoal area due north"
148
+ when 101 then "Chart Feature: Shoal area due east"
149
+ when 102 then "Chart Feature: Shoal area due south"
150
+ when 103 then "Chart Feature: Shoal area due west"
151
+ when 104 then "Chart Feature: Channel obstruction"
152
+ when 105 then "Chart Feature: Reduced vertical clearance"
153
+ when 106 then "Chart Feature: Bridge closed"
154
+ when 107 then "Chart Feature: Bridge partially open"
155
+ when 108 then "Chart Feature: Bridge fully open"
156
+ when 109 then "(reserved for future use)"
157
+ when 110 then "(reserved for future use)"
158
+ when 111 then "(reserved for future use)"
159
+ when 112 then "Report from ship: Icing info"
160
+ when 113 then "(reserved for future use)"
161
+ when 114 then "Report from ship: Miscellaneous information - define in associated text field"
162
+ when 115 then "(reserved for future use)"
163
+ when 116 then "(reserved for future use)"
164
+ when 117 then "(reserved for future use)"
165
+ when 118 then "(reserved for future use)"
166
+ when 119 then "(reserved for future use)"
167
+ when 120 then "Route: Recommended route"
168
+ when 121 then "Route: Alternative route"
169
+ when 122 then "Route: Recommended route through ice"
170
+ when 123 then "(reserved for future use)"
171
+ when 124 then "(reserved for future use)"
172
+ when 125 then "Other - Define in associated text field"
173
+ when 126 then "Cancellation - cancel area as identified by Message Linkage ID"
174
+ when 127 then "Undefined (default)"
175
+ end
176
+ end
177
+
178
+ # @!parse attr_reader :utc_time
179
+ # @return [Time] utc time
180
+ def utc_time
181
+ now = Time.now
182
+ month = _u(73, 4)
183
+ day = _u(77, 5)
184
+ hour = _u(82, 5)
185
+ minute = _u(87, 6)
186
+ return nil if 0 == month
187
+ return nil if 24 == hour
188
+ return nil if 60 == minute
189
+ Time.new(now.year, month, day, hour, minute, 0)
190
+ end
191
+
192
+ payload_reader :duration, 93, 18, :_u, 262_143
193
+
194
+ # Sub-areas defined by this message
195
+ # @return [Array] An array of {SubArea} objects
196
+ attr_accessor :sub_areas
197
+
198
+ # @!parse attr_reader :sub_area_text
199
+ # @return [String] The concatenated text of all subarea texts
200
+ def sub_area_text
201
+ texts = sub_areas.select { |a| a.shape_id == 5 }
202
+ return nil if texts.empty?
203
+ texts.collect(&:text).join
204
+ end
205
+
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
@@ -1,11 +1,11 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg8_dynamic_payload'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
5
5
  module AIS
6
6
  module VDMPayload
7
7
  # Type 8: Binary Broadcast Message Subtype: Meteorological and Hydrological Data (IMO289)
8
- class VDMMsg8d1f31 < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
8
+ class VDMMsg8d1f31 < NMEAPlus::Message::AIS::VDMPayload::VDMMsg8DynamicPayload
9
9
 
10
10
  payload_reader :longitude, 56, 25, :_I, 60 * 10**3, 181
11
11
  payload_reader :latitude, 81, 24, :_I, 60 * 10**3, 91
@@ -1,28 +1,25 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg8_dynamic_payload'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
5
5
  module AIS
6
6
  module VDMPayload
7
- class VDMMsg8USCGEncrypted < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
7
+
8
+ # Basic decoding of "blue force" encrypted binary messages.
9
+ # Note that this module is incapable of decrypting the messages. It can only deocde and return
10
+ # the encrypted payload to be decrypted elsewhere.
11
+ class VDMMsg8USCGEncrypted < VDMMsg8DynamicPayload
8
12
  payload_reader :encrypted_data_2b, 56, 952, :_d
9
13
  payload_reader :encrypted_data_6b, 56, 952, :_6b_string
10
14
  payload_reader :encrypted_data_8b, 56, 952, :_8b_data_string
11
15
  end
12
16
 
13
17
  # Type 8: Binary Broadcast Message Subtype: US Coast Guard (USCG) blue force encrypted position report
14
- class VDMMsg8d366f56 < VDMMsg8USCGEncrypted
15
- payload_reader :encrypted_data_2b, 56, 952, :_d
16
- payload_reader :encrypted_data_6b, 56, 952, :_6b_string
17
- payload_reader :encrypted_data_8b, 56, 952, :_8b_data_string
18
- end
18
+ class VDMMsg8d366f56 < VDMMsg8USCGEncrypted; end
19
19
 
20
20
  # Type 8: Binary Broadcast Message Subtype: US Coast Guard (USCG) blue force encrypted data
21
- class VDMMsg8d366f57 < VDMMsg8USCGEncrypted
22
- payload_reader :encrypted_data_2b, 56, 952, :_d
23
- payload_reader :encrypted_data_6b, 56, 952, :_6b_string
24
- payload_reader :encrypted_data_8b, 56, 952, :_8b_data_string
25
- end
21
+ class VDMMsg8d366f57 < VDMMsg8USCGEncrypted; end
22
+
26
23
  end
27
24
  end
28
25
  end
@@ -1,3 +1,3 @@
1
1
  module NMEAPlus
2
- VERSION = '1.0.9'
2
+ VERSION = '1.0.10'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nmea_plus
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Katz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-13 00:00:00.000000000 Z
11
+ date: 2016-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: racc
@@ -197,6 +197,7 @@ files:
197
197
  - lib/nmea_plus/message/ais/base_ais.rb
198
198
  - lib/nmea_plus/message/ais/vdm.rb
199
199
  - lib/nmea_plus/message/ais/vdm_payload/payload.rb
200
+ - lib/nmea_plus/message/ais/vdm_payload/sub_area.rb
200
201
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg.rb
201
202
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg1.rb
202
203
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg12.rb
@@ -209,10 +210,13 @@ files:
209
210
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg4.rb
210
211
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg5.rb
211
212
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg6.rb
213
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg6_dynamic_payload.rb
212
214
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d1022f61.rb
213
215
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg6d235f10.rb
214
216
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg7.rb
215
217
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg8.rb
218
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg8_dynamic_payload.rb
219
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d1f22.rb
216
220
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d1f31.rb
217
221
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d366f56.rb
218
222
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg9.rb