nmea_plus 1.0.11 → 1.0.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 49d631a6794e0a47ff2daef5fb5b4dac87623a5d
4
- data.tar.gz: 16636c7450ccb964cedd1a3d76462999af63e967
3
+ metadata.gz: d63a8c026e77ab29e6e6f71ce7fcb0602d7bca0a
4
+ data.tar.gz: 33155818b755bb4d9d0648bccd0b320c0f15cd55
5
5
  SHA512:
6
- metadata.gz: 5250074e41c49831996adbcc4e9f36990257e157c3980d3bb04b48db678e2c5e7c4bd26563c0a5174854f86605c5db5427b5961e697e35882c8d7afc40cd41bb
7
- data.tar.gz: 47e7032aaddbdb141fd4fd8175affc119ece1bd9d961f0434b8b6ff1ee7e7c47c79036187a5db93c262799218da2e37f66397386b8e342b85eab4c56689d2c2e
6
+ metadata.gz: 0114101601c7af5c05d516ecb1b1ced1e3c69bf1cdb5ccfa58faf81f216fb51311f712375005d7d1e83ce3706d57a94ee5df2d59194ef0d0540138cfc7d62fa2
7
+ data.tar.gz: 895f5c9fcbbc4fac5ab48426816b2201ad774d11ac0043686465351940c8fc53874cf7f95fe52f9a9f894fe7b27c664165d0b2d0272d217deffc636b1d3f4417
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # NMEA (GPS) and AIS Parser / Decoder for Ruby (nmea_plus)
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/nmea_plus.png)](https://rubygems.org/gems/nmea_plus)
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.11)
5
+ [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/nmea_plus/1.0.12)
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
 
data/lib/nmea_plus.rb CHANGED
@@ -14,18 +14,14 @@ module NMEAPlus
14
14
  # to {#each_message} and/or {#each_complete_message},
15
15
  # which yield {NMEAPlus::Message} objects representing the parsed data.
16
16
  class SourceDecoder
17
- # False by default.
17
+ # Whether to raise an exception when lines don't parse. False by default -- ignore such errors.
18
18
  # @return [bool] whether to throw an exception on lines that don't properly parse
19
19
  attr_accessor :throw_on_parse_fail
20
20
 
21
- # False by default. Typically for development.
22
- # @return [bool] whether to throw an exception on message types that aren't supported
23
- attr_accessor :throw_on_unrecognized_type
24
-
25
21
  # @param line_reader [IO] The source stream for messages
26
22
  def initialize(line_reader)
27
23
  unless line_reader.respond_to? :each_line
28
- fail ArgumentError, "line_reader must inherit from type IO (or implement each_line)"
24
+ raise ArgumentError, "line_reader must inherit from type IO (or implement each_line)"
29
25
  end
30
26
  @throw_on_parse_fail = false
31
27
  @source = line_reader
@@ -63,6 +59,8 @@ module NMEAPlus
63
59
  end
64
60
 
65
61
  # Attempts to group multipart NMEA messages into chains, and executes the block once for every complete chain.
62
+ # To limit memory use (and be realistic about our ability to match up messages), only 1 message of chain of
63
+ # each NMEA message type can be in progress at any one time.
66
64
  #
67
65
  # @yield [NMEAPlus::Message] A parsed message that may contain subsequent parts
68
66
  # @return [void]
@@ -81,8 +79,14 @@ module NMEAPlus
81
79
  def each_complete_message
82
80
  partials = {} # hash of message type to message-chain-in-progress
83
81
  each_message do |msg|
84
- slot = msg.data_type # the slot in the hash
82
+ # don't clutter things up if the message arrives already complete
83
+ if msg.all_messages_received?
84
+ yield msg
85
+ next
86
+ end
85
87
 
88
+ # put message into partials slot (merge if necessary) based on its data type
89
+ slot = msg.data_type
86
90
  if partials[slot].nil? # no message in there
87
91
  partials[slot] = msg
88
92
  elsif 1 != (msg.message_number - partials[slot].message_number) # broken sequence
@@ -17,16 +17,21 @@ end
17
17
 
18
18
  =end
19
19
 
20
- require_relative "vdm_payload/vdm_msg1" # also incldues 2 and 3
21
- require_relative "vdm_payload/vdm_msg4" # also includes 11
20
+ require_relative "vdm_payload/vdm_msg1"
21
+ require_relative "vdm_payload/vdm_msg2"
22
+ require_relative "vdm_payload/vdm_msg3"
23
+ require_relative "vdm_payload/vdm_msg4"
22
24
  require_relative "vdm_payload/vdm_msg5"
23
25
  require_relative "vdm_payload/vdm_msg6"
24
- require_relative "vdm_payload/vdm_msg7" # also includes 13
26
+ require_relative "vdm_payload/vdm_msg7"
25
27
  require_relative "vdm_payload/vdm_msg8"
26
28
  require_relative "vdm_payload/vdm_msg9"
29
+ require_relative "vdm_payload/vdm_msg11"
27
30
  require_relative "vdm_payload/vdm_msg12"
31
+ require_relative "vdm_payload/vdm_msg13"
28
32
  require_relative "vdm_payload/vdm_msg14"
29
- require_relative "vdm_payload/vdm_msg18" # also includes 19
33
+ require_relative "vdm_payload/vdm_msg18"
34
+ require_relative "vdm_payload/vdm_msg19"
30
35
  require_relative "vdm_payload/vdm_msg20"
31
36
  require_relative "vdm_payload/vdm_msg21"
32
37
  require_relative "vdm_payload/vdm_msg24"
@@ -1,78 +1,11 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg_cnb'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
5
5
  module AIS
6
6
  module VDMPayload
7
- # CNB - The Common Navigation Block, transmitted by AIS messages 1, 2, and 3.
8
- class VDMMsgCNB < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
9
-
10
- payload_reader :navigational_status, 38, 4, :_u
11
-
12
- # @!parse attr_reader :navigational_status_description
13
- # @return [String] the human-readable description of navigational status
14
- def navigational_status_description
15
- get_navigational_status_description(navigational_status)
16
- end
17
-
18
- # The rate of turn in degrees per minute
19
- # @!parse attr_reader :rate_of_turn
20
- # @return [Float]
21
- def rate_of_turn
22
- ret = _i(42, 8) # spec is wrong, we don't use I3
23
- return nil if ret == -128
24
- negative = ret < 0
25
- (ret / 4.733)**2 * (negative ? -1 : 1)
26
- end
27
-
28
- payload_reader :speed_over_ground, 50, 10, :_U, 10
29
- payload_reader :position_10m_accuracy?, 60, 1, :_b
30
- payload_reader :longitude, 61, 28, :_I, 60 * 10**4, 181
31
- payload_reader :latitude, 89, 27, :_I, 60 * 10**4, 91
32
- payload_reader :course_over_ground, 116, 12, :_U, 10, 3600
33
- payload_reader :true_heading, 128, 9, :_u, 511
34
-
35
- # @!visibility private
36
- payload_reader :_time_stamp, 137, 6, :_u
37
-
38
- # @!parse attr_reader :time_stamp
39
- # @return [Integer]
40
- def time_stamp
41
- ret = _time_stamp
42
- 59 < ret ? nil : ret
43
- end
44
-
45
- # @!parse attr_reader :position_manual_input?
46
- # @return [bool]
47
- def position_manual_input?
48
- 61 == _time_stamp
49
- end
50
-
51
- # @!parse attr_reader :position_estimated?
52
- # @return [bool]
53
- def position_estimated?
54
- 62 == _time_stamp
55
- end
56
-
57
- # @!parse attr_reader :position_inoperative?
58
- # @return [bool]
59
- def position_inoperative?
60
- 63 == _time_stamp
61
- end
62
-
63
- payload_reader :special_manoeuvre, 143, 2, :_e
64
- payload_reader :raim?, 148, 1, :_b
65
-
66
- end
67
-
68
7
  # AIS Type 1: Position report class A, which is really {VDMMsgCNB}
69
8
  class VDMMsg1 < VDMMsgCNB; end
70
-
71
- # AIS Type 2: Position report class A, which is really {VDMMsgCNB}
72
- class VDMMsg2 < VDMMsgCNB; end
73
-
74
- # AIS Type 3: Position report class A, which is really {VDMMsgCNB}
75
- class VDMMsg3 < VDMMsgCNB; end
76
9
  end
77
10
  end
78
11
  end
@@ -0,0 +1,16 @@
1
+ require_relative 'vdm_msg_station_report'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # AIS Type 11: UTC/Date Response
9
+ # According to the unoffical spec: "Identical to message 4, with the semantics of a response to inquiry."
10
+ # @see VDMMsgStationReport
11
+ class VDMMsg11 < VDMMsgStationReport; end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'vdm_msg_binary_acknowledgement'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # AIS Type 13: Safety-Related Acknowledgement
9
+ # According to the unoffical spec: "The message layout is identical to a type 7 Binary Acknowledge."
10
+ # @see VDMMsgBinaryAcknowledgement
11
+ class VDMMsg13 < VDMMsgBinaryAcknowledgement; end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,25 +1,10 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg_class_b_cs_position'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
5
5
  module AIS
6
6
  module VDMPayload
7
7
 
8
- # Base class for "Class B CS Position Report" messages (18 and 19)
9
- # @see NMEAPlus::Message::AIS::VDMPayload::VDMMsg18
10
- # @see NMEAPlus::Message::AIS::VDMPayload::VDMMsg19
11
- class VDMMsgClassBCSPosition < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
12
-
13
- payload_reader :speed_over_ground, 46, 10, :_U, 10
14
- payload_reader :position_10m_accuracy?, 56, 1, :_b
15
- payload_reader :longitude, 57, 28, :_I, 60 * 10**4, 181
16
- payload_reader :latitude, 85, 27, :_I, 60 * 10**4, 91
17
- payload_reader :course_over_ground, 112, 12, :_U, 10
18
- payload_reader :true_heading, 124, 9, :_u, 511
19
- payload_reader :time_stamp, 133, 6, :_u
20
-
21
- end
22
-
23
8
  # AIS Type 18: Standard Class B CS Position Report
24
9
  class VDMMsg18 < VDMMsgClassBCSPosition
25
10
  payload_reader :cs_unit?, 141, 1, :_b
@@ -31,27 +16,6 @@ module NMEAPlus
31
16
  payload_reader :raim?, 147, 1, :_b
32
17
  end
33
18
 
34
- # AIS Type 19: Extended Class B CS Position Report
35
- class VDMMsg19 < VDMMsgClassBCSPosition
36
- payload_reader :name, 143, 120, :_t
37
- payload_reader :ship_cargo_type, 263, 8, :_e
38
- payload_reader :ship_dimension_to_bow, 271, 9, :_u
39
- payload_reader :ship_dimension_to_stern, 280, 9, :_u
40
- payload_reader :ship_dimension_to_port, 289, 6, :_u
41
- payload_reader :ship_dimension_to_starboard, 295, 6, :_u
42
- payload_reader :epfd_type, 301, 4, :_e
43
- payload_reader :raim?, 305, 1, :_b
44
- payload_reader :dte_ready?, 306, 1, :_nb
45
- payload_reader :assigned?, 307, 1, :_b
46
-
47
- # @!parse attr_reader :ship_cargo_type_description
48
- # @return [String] Cargo type description
49
- def ship_cargo_type_description
50
- get_ship_cargo_type_description(ship_cargo_type)
51
- end
52
-
53
- end
54
-
55
19
  end
56
20
  end
57
21
  end
@@ -0,0 +1,32 @@
1
+ require_relative 'vdm_msg_class_b_cs_position'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # AIS Type 19: Extended Class B CS Position Report
9
+ class VDMMsg19 < VDMMsgClassBCSPosition
10
+ payload_reader :name, 143, 120, :_t
11
+ payload_reader :ship_cargo_type, 263, 8, :_e
12
+ payload_reader :ship_dimension_to_bow, 271, 9, :_u
13
+ payload_reader :ship_dimension_to_stern, 280, 9, :_u
14
+ payload_reader :ship_dimension_to_port, 289, 6, :_u
15
+ payload_reader :ship_dimension_to_starboard, 295, 6, :_u
16
+ payload_reader :epfd_type, 301, 4, :_e
17
+ payload_reader :raim?, 305, 1, :_b
18
+ payload_reader :dte_ready?, 306, 1, :_nb
19
+ payload_reader :assigned?, 307, 1, :_b
20
+
21
+ # @!parse attr_reader :ship_cargo_type_description
22
+ # @return [String] Cargo type description
23
+ def ship_cargo_type_description
24
+ get_ship_cargo_type_description(ship_cargo_type)
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'vdm_msg_cnb'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+ # AIS Type 2: Position report class A, which is really {VDMMsgCNB}
8
+ class VDMMsg2 < VDMMsgCNB; end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'vdm_msg_cnb'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+ # AIS Type 3: Position report class A, which is really {VDMMsgCNB}
8
+ class VDMMsg3 < VDMMsgCNB; end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,43 +1,14 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg_station_report'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
5
5
  module AIS
6
6
  module VDMPayload
7
7
 
8
- # Base class for station reports
9
- # @see VDMMsg4
10
- # @see VDMMsg11
11
- class VDMMsgStationReport < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
12
-
13
- # @!parse attr_reader :current_time
14
- # @return [Time] current time
15
- def current_time
16
- Time.new(_u(38, 14),
17
- _u(52, 4),
18
- _u(56, 5),
19
- _u(61, 5),
20
- _u(66, 6),
21
- _u(72, 6))
22
- end
23
-
24
- payload_reader :position_10m_accuracy?, 78, 1, :_b
25
- payload_reader :longitude, 79, 28, :_I, 60 * 10**4, 181
26
- payload_reader :latitude, 107, 27, :_I, 60 * 10**4, 91
27
- payload_reader :epfd_type, 134, 4, :_e
28
- payload_reader :raim?, 148, 1, :_b
29
-
30
- end
31
-
32
8
  # AIS Type 4: Base Station Report
33
9
  # @see VDMMsgStationReport
34
10
  class VDMMsg4 < VDMMsgStationReport; end
35
11
 
36
- # AIS Type 11: UTC/Date Response
37
- # According to the unoffical spec: "Identical to message 4, with the semantics of a response to inquiry."
38
- # @see VDMMsgStationReport
39
- class VDMMsg11 < VDMMsgStationReport; end
40
-
41
12
  end
42
13
  end
43
14
  end
@@ -20,7 +20,7 @@ module NMEAPlus
20
20
  payload_reader :epfd_type, 270, 4, :_e
21
21
 
22
22
  # @!parse attr_reader :eta
23
- # @return [Time] ETA
23
+ # @return [Time] Estimated Time of Arrival, in UTC
24
24
  def eta
25
25
  now = Time.now
26
26
  Time.new(now.year,
@@ -28,7 +28,8 @@ module NMEAPlus
28
28
  _u(278, 5),
29
29
  _u(283, 5),
30
30
  _u(288, 6),
31
- 0)
31
+ 0,
32
+ '+00:00')
32
33
  end
33
34
 
34
35
  payload_reader :static_draught, 294, 8, :_U, 10
@@ -1,35 +1,14 @@
1
- require_relative 'vdm_msg'
1
+ require_relative 'vdm_msg_binary_acknowledgement'
2
2
 
3
3
  module NMEAPlus
4
4
  module Message
5
5
  module AIS
6
6
  module VDMPayload
7
7
 
8
- # Base class for binary acknowledgement messages
9
- # @see VDMMsg7
10
- # @see VDMMsg13
11
- class VDMMsgBinaryAcknowledgement < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
12
-
13
- payload_reader :ack1_mmsi, 40, 30, :_u
14
- payload_reader :ack1_sequence_number, 70, 2, :_u
15
- payload_reader :ack2_mmsi, 72, 30, :_u
16
- payload_reader :ack2_sequence_number, 102, 2, :_u
17
- payload_reader :ack3_mmsi, 104, 30, :_u
18
- payload_reader :ack3_sequence_number, 134, 2, :_u
19
- payload_reader :ack4_mmsi, 136, 30, :_u
20
- payload_reader :ack4_sequence_number, 166, 2, :_u
21
-
22
- end
23
-
24
8
  # AIS Type 7: Binary Acknowledge
25
9
  # @see VDMMsgBinaryAcknowledgement
26
10
  class VDMMsg7 < VDMMsgBinaryAcknowledgement; end
27
11
 
28
- # AIS Type 13: Safety-Related Acknowledgement
29
- # According to the unoffical spec: "The message layout is identical to a type 7 Binary Acknowledge."
30
- # @see VDMMsgBinaryAcknowledgement
31
- class VDMMsg13 < VDMMsgBinaryAcknowledgement; end
32
-
33
12
  end
34
13
  end
35
14
  end
@@ -186,7 +186,7 @@ module NMEAPlus
186
186
  return nil if 0 == month
187
187
  return nil if 24 == hour
188
188
  return nil if 60 == minute
189
- Time.new(now.year, month, day, hour, minute, 0)
189
+ Time.new(now.year, month, day, hour, minute, 0, "+00:00")
190
190
  end
191
191
 
192
192
  payload_reader :duration, 93, 18, :_u, 262_143
@@ -12,7 +12,7 @@ module NMEAPlus
12
12
  payload_reader :position_10m_accuracy?, 105, 1, :_b
13
13
 
14
14
  # @!parse attr_reader :current_time
15
- # @return [Time] current time
15
+ # @return [Time] current time, assumed to be in UTC
16
16
  def current_time
17
17
  now = Time.now
18
18
  day = _u(106, 5)
@@ -21,7 +21,7 @@ module NMEAPlus
21
21
  return nil if 0 == day
22
22
  return nil if 24 == hour
23
23
  return nil if 60 == minute
24
- Time.new(now.year, now.month, day, hour, minute, 0)
24
+ Time.new(now.year, now.month, day, hour, minute, 0, "+00:00")
25
25
  end
26
26
 
27
27
  payload_reader :wind_speed_average, 122, 7, :_u, 127
@@ -0,0 +1,26 @@
1
+ require_relative 'vdm_msg'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # Base class for binary acknowledgement messages
9
+ # @see VDMMsg7
10
+ # @see VDMMsg13
11
+ class VDMMsgBinaryAcknowledgement < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
12
+
13
+ payload_reader :ack1_mmsi, 40, 30, :_u
14
+ payload_reader :ack1_sequence_number, 70, 2, :_u
15
+ payload_reader :ack2_mmsi, 72, 30, :_u
16
+ payload_reader :ack2_sequence_number, 102, 2, :_u
17
+ payload_reader :ack3_mmsi, 104, 30, :_u
18
+ payload_reader :ack3_sequence_number, 134, 2, :_u
19
+ payload_reader :ack4_mmsi, 136, 30, :_u
20
+ payload_reader :ack4_sequence_number, 166, 2, :_u
21
+
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ require_relative 'vdm_msg'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # Base class for "Class B CS Position Report" messages (18 and 19)
9
+ # @see NMEAPlus::Message::AIS::VDMPayload::VDMMsg18
10
+ # @see NMEAPlus::Message::AIS::VDMPayload::VDMMsg19
11
+ class VDMMsgClassBCSPosition < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
12
+ payload_reader :speed_over_ground, 46, 10, :_U, 10
13
+ payload_reader :position_10m_accuracy?, 56, 1, :_b
14
+ payload_reader :longitude, 57, 28, :_I, 60 * 10**4, 181
15
+ payload_reader :latitude, 85, 27, :_I, 60 * 10**4, 91
16
+ payload_reader :course_over_ground, 112, 12, :_U, 10
17
+ payload_reader :true_heading, 124, 9, :_u, 511
18
+ payload_reader :time_stamp, 133, 6, :_u
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,70 @@
1
+ require_relative 'vdm_msg'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+ # CNB - The Common Navigation Block, transmitted by AIS messages 1, 2, and 3.
8
+ class VDMMsgCNB < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
9
+
10
+ payload_reader :navigational_status, 38, 4, :_u
11
+
12
+ # @!parse attr_reader :navigational_status_description
13
+ # @return [String] the human-readable description of navigational status
14
+ def navigational_status_description
15
+ get_navigational_status_description(navigational_status)
16
+ end
17
+
18
+ # The rate of turn in degrees per minute
19
+ # @!parse attr_reader :rate_of_turn
20
+ # @return [Float]
21
+ def rate_of_turn
22
+ ret = _i(42, 8) # spec is wrong, we don't use I3
23
+ return nil if ret == -128
24
+ negative = ret < 0
25
+ (ret / 4.733)**2 * (negative ? -1 : 1)
26
+ end
27
+
28
+ payload_reader :speed_over_ground, 50, 10, :_U, 10
29
+ payload_reader :position_10m_accuracy?, 60, 1, :_b
30
+ payload_reader :longitude, 61, 28, :_I, 60 * 10**4, 181
31
+ payload_reader :latitude, 89, 27, :_I, 60 * 10**4, 91
32
+ payload_reader :course_over_ground, 116, 12, :_U, 10, 3600
33
+ payload_reader :true_heading, 128, 9, :_u, 511
34
+
35
+ # @!visibility private
36
+ payload_reader :_time_stamp, 137, 6, :_u
37
+
38
+ # @!parse attr_reader :time_stamp
39
+ # @return [Integer]
40
+ def time_stamp
41
+ ret = _time_stamp
42
+ 59 < ret ? nil : ret
43
+ end
44
+
45
+ # @!parse attr_reader :position_manual_input?
46
+ # @return [bool]
47
+ def position_manual_input?
48
+ 61 == _time_stamp
49
+ end
50
+
51
+ # @!parse attr_reader :position_estimated?
52
+ # @return [bool]
53
+ def position_estimated?
54
+ 62 == _time_stamp
55
+ end
56
+
57
+ # @!parse attr_reader :position_inoperative?
58
+ # @return [bool]
59
+ def position_inoperative?
60
+ 63 == _time_stamp
61
+ end
62
+
63
+ payload_reader :special_manoeuvre, 143, 2, :_e
64
+ payload_reader :raim?, 148, 1, :_b
65
+
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'vdm_msg'
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module AIS
6
+ module VDMPayload
7
+
8
+ # Base class for "base station reports"
9
+ # @see VDMMsg4
10
+ # @see VDMMsg11
11
+ class VDMMsgStationReport < NMEAPlus::Message::AIS::VDMPayload::VDMMsg
12
+
13
+ # @!parse attr_reader :current_time
14
+ # @return [Time] current time in UTC
15
+ def current_time
16
+ Time.new(_u(38, 14),
17
+ _u(52, 4),
18
+ _u(56, 5),
19
+ _u(61, 5),
20
+ _u(66, 6),
21
+ _u(72, 6),
22
+ '+00:00')
23
+ end
24
+
25
+ payload_reader :position_10m_accuracy?, 78, 1, :_b
26
+ payload_reader :longitude, 79, 28, :_I, 60 * 10**4, 181
27
+ payload_reader :latitude, 107, 27, :_I, 60 * 10**4, 91
28
+ payload_reader :epfd_type, 134, 4, :_e
29
+ payload_reader :raim?, 148, 1, :_b
30
+
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -200,7 +200,7 @@ module NMEAPlus
200
200
  now = Time.now
201
201
  begin
202
202
  hms = re_format.match(field)
203
- Time.new(now.year, now.month, now.day, hms[1].to_i, hms[2].to_i, hms[3].to_f)
203
+ Time.new(now.year, now.month, now.day, hms[1].to_i, hms[2].to_i, hms[3].to_f, '+00:00')
204
204
  rescue
205
205
  nil
206
206
  end
@@ -215,7 +215,7 @@ module NMEAPlus
215
215
  re_format = /(\d{2})(\d{2})(\d{2}(\.\d+)?)/
216
216
  begin
217
217
  hms = re_format.match(field)
218
- Time.new(0, 0, 0, hms[1].to_i, hms[2].to_i, hms[3].to_f)
218
+ Time.new(0, 0, 0, hms[1].to_i, hms[2].to_i, hms[3].to_f, '+00:00')
219
219
  rescue
220
220
  nil
221
221
  end
@@ -237,7 +237,7 @@ module NMEAPlus
237
237
  begin
238
238
  dmy = date_format.match(d_field)
239
239
  hms = time_format.match(t_field)
240
- Time.new(2000 + dmy[3].to_i, dmy[2].to_i, dmy[1].to_i, hms[1].to_i, hms[2].to_i, hms[3].to_f)
240
+ Time.new(2000 + dmy[3].to_i, dmy[2].to_i, dmy[1].to_i, hms[1].to_i, hms[2].to_i, hms[3].to_f, '+00:00')
241
241
  rescue
242
242
  nil
243
243
  end
@@ -76,7 +76,7 @@ module NMEAPlus
76
76
  # create message and make sure it's the right type
77
77
  message = self.dynamically_get_message_object(class_name)
78
78
  unless message.is_a? NMEAPlus::Message::Base
79
- fail ArgumentError, "Undefined message type #{data_type} (classname #{class_name})"
79
+ raise ArgumentError, "Undefined message type #{data_type} (classname #{class_name})"
80
80
  end
81
81
 
82
82
  # assign its data and return it
@@ -1,3 +1,3 @@
1
1
  module NMEAPlus
2
- VERSION = '1.0.11'.freeze
2
+ VERSION = '1.0.12'.freeze
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.11
4
+ version: 1.0.12
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-02-22 00:00:00.000000000 Z
11
+ date: 2016-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: racc
@@ -70,20 +70,20 @@ dependencies:
70
70
  requirements:
71
71
  - - ~>
72
72
  - !ruby/object:Gem::Version
73
- version: '0.36'
73
+ version: '0'
74
74
  - - '>='
75
75
  - !ruby/object:Gem::Version
76
- version: 0.31.0
76
+ version: 0.37.0
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - ~>
82
82
  - !ruby/object:Gem::Version
83
- version: '0.36'
83
+ version: '0'
84
84
  - - '>='
85
85
  - !ruby/object:Gem::Version
86
- version: 0.31.0
86
+ version: 0.37.0
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: rspec
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -201,13 +201,18 @@ files:
201
201
  - lib/nmea_plus/message/ais/vdm_payload/sub_area.rb
202
202
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg.rb
203
203
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg1.rb
204
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg11.rb
204
205
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg12.rb
206
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg13.rb
205
207
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg14.rb
206
208
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg18.rb
209
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg19.rb
210
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg2.rb
207
211
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg20.rb
208
212
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg21.rb
209
213
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg24.rb
210
214
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg27.rb
215
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg3.rb
211
216
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg4.rb
212
217
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg5.rb
213
218
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg6.rb
@@ -227,6 +232,10 @@ files:
227
232
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d1f31.rb
228
233
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg8d366f56.rb
229
234
  - lib/nmea_plus/message/ais/vdm_payload/vdm_msg9.rb
235
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg_binary_acknowledgement.rb
236
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg_class_b_cs_position.rb
237
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg_cnb.rb
238
+ - lib/nmea_plus/message/ais/vdm_payload/vdm_msg_station_report.rb
230
239
  - lib/nmea_plus/message/base.rb
231
240
  - lib/nmea_plus/message/nmea/aam.rb
232
241
  - lib/nmea_plus/message/nmea/alm.rb