class Digital::Transport::Adapters::Serial
Constants
- DEFAULTS
Public Class Methods
new(port, opt = {})
click to toggle source
# File lib/digital/transport/adapters/serial.rb, line 15 def initialize(port, opt = {}) @port = port.freeze @opts = DEFAULTS.merge(opt.dup).freeze @io = nil end
Public Instance Methods
close()
click to toggle source
# File lib/digital/transport/adapters/serial.rb, line 41 def close return !open? unless open? @io && @io.close @io = nil !open? end
connect()
click to toggle source
@return [Either] monad representing a value of one of two possible types
-
Exception covariant
-
Adapter interface invariant
@see Adapters#new_serial_adapter
# File lib/digital/transport/adapters/serial.rb, line 27 def connect @io = new_serial_port(@port, @opts).tap(&:connect) Either.right(self) rescue Exception => ex Either.left(ex) end
flush()
click to toggle source
# File lib/digital/transport/adapters/serial.rb, line 48 def flush @io && @io.flush end
open?()
click to toggle source
# File lib/digital/transport/adapters/serial.rb, line 52 def open? @io && @io.open? end
read(count, blocking = false)
click to toggle source
# File lib/digital/transport/adapters/serial.rb, line 56 def read(count, blocking = false) raise NotConnected unless open? f = blocking ? method(:read_blocking) : method(:read_non_blocking) Either.right f.(count) rescue => ex @io.close Either.left(ex) end
write(bytes)
click to toggle source
# File lib/digital/transport/adapters/serial.rb, line 34 def write(bytes) raise NotConnected unless open? Either.right(@io.write(bytes)) rescue => ex Either.left(ex) end
Private Instance Methods
read_blocking(count)
click to toggle source
todo: shouldn’t block forever.
# File lib/digital/transport/adapters/serial.rb, line 72 def read_blocking(count) bytes = '' while bytes.length < count bytes += read_non_blocking(count).to_s sleep 0.001 end bytes end
read_non_blocking(count)
click to toggle source
# File lib/digital/transport/adapters/serial.rb, line 67 def read_non_blocking(count) @io.read(count) end