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

  1. Exception covariant

  2. 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