Class: NMEAPlus::SourceDecoder
- Inherits:
-
Object
- Object
- NMEAPlus::SourceDecoder
- Defined in:
- lib/nmea_plus.rb
Overview
The SourceDecoder is meant as the primary entry point into the NMEAPlus module. It wraps a Decoder object and an IO object, converting IO’s #each_line functionality to #each_message and/or #each_complete_message, which yield Message objects representing the parsed data.
Instance Attribute Summary collapse
-
#throw_on_parse_fail ⇒ bool
Whether to raise an exception when lines don’t parse.
Instance Method Summary collapse
-
#each_complete_message {|NMEAPlus::Message| ... } ⇒ void
Attempts to group multipart NMEA messages into chains, and executes the block once for every complete chain.
-
#each_message {|NMEAPlus::Message| ... } ⇒ void
Executes the block for every valid NMEA message in the source stream.
-
#initialize(line_reader) ⇒ SourceDecoder
constructor
A new instance of SourceDecoder.
Constructor Details
permalink #initialize(line_reader) ⇒ SourceDecoder
Returns a new instance of SourceDecoder.
22 23 24 25 26 27 28 29 |
# File 'lib/nmea_plus.rb', line 22 def initialize(line_reader) unless line_reader.respond_to? :each_line raise ArgumentError, "line_reader must inherit from type IO (or implement each_line)" end @throw_on_parse_fail = false @source = line_reader @decoder = NMEAPlus::Decoder.new end |
Instance Attribute Details
permalink #throw_on_parse_fail ⇒ bool
Whether to raise an exception when lines don’t parse. False by default – ignore such errors.
19 20 21 |
# File 'lib/nmea_plus.rb', line 19 def throw_on_parse_fail @throw_on_parse_fail end |
Instance Method Details
permalink #each_complete_message {|NMEAPlus::Message| ... } ⇒ void
This method returns an undefined value.
Attempts to group multipart NMEA messages into chains, and executes the block once for every complete chain. To limit memory use (and be realistic about our ability to match up messages), only 1 message of chain of each NMEA message type can be in progress at any one time.
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/nmea_plus.rb', line 79 def partials = {} # hash of message type to message-chain-in-progress do |msg| # don't clutter things up if the message arrives already complete if msg. yield msg next end # put message into partials slot (merge if necessary) based on its data type slot = msg.data_type if partials[slot].nil? # no message in there partials[slot] = msg elsif 1 != (msg. - partials[slot].) # broken sequence # error! just overwrite what was there partials[slot] = msg else # chain on to what's there partials[slot].(msg) end # take action if we've completed the chain maybe_full = partials[slot] if maybe_full. partials[slot] = nil yield maybe_full end end end |
permalink #each_message {|NMEAPlus::Message| ... } ⇒ void
This method returns an undefined value.
Executes the block for every valid NMEA message in the source stream. In practice, you should use #each_complete_message unless you have a very compelling reason not to.
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/nmea_plus.rb', line 45 def @source.each_line do |line| if @throw_on_parse_fail yield @decoder.parse(line) else got_error = false begin y = @decoder.parse(line) rescue got_error = true end yield y unless got_error end end end |