Module: Seriamp

Defined in:
lib/seriamp/error.rb,
lib/seriamp/utils.rb,
lib/seriamp/detect.rb,
lib/seriamp/backend.rb,
lib/seriamp/version.rb,
lib/seriamp/sonamp/app.rb,
lib/seriamp/sonamp/cmd.rb,
lib/seriamp/yamaha/app.rb,
lib/seriamp/yamaha/cmd.rb,
lib/seriamp/backend/ffi.rb,
lib/seriamp/integra/cmd.rb,
lib/seriamp/sonamp/client.rb,
lib/seriamp/yamaha/client.rb,
lib/seriamp/faraday_facade.rb,
lib/seriamp/integra/client.rb,
lib/seriamp/sonamp/executor.rb,
lib/seriamp/yamaha/executor.rb,
lib/seriamp/integra/executor.rb,
lib/seriamp/sonamp/auto_power.rb,
lib/seriamp/backend/serial_port.rb,
lib/seriamp/yamaha/protocol/methods.rb,
lib/seriamp/integra/protocol/methods.rb,
lib/seriamp/yamaha/protocol/constants.rb,
lib/seriamp/integra/protocol/constants.rb

Defined Under Namespace

Modules: Backend, Integra, Sonamp, Utils, Yamaha Classes: BadDevice, CommunicationTimeout, Error, FaradayFacade, HandshakeFailure, InvalidCommand, InvalidOnOffValue, NoDevice, NotApplicable, UnexpectedResponse

Constant Summary collapse

DEFAULT_DEVICE_GLOB =
'/dev/ttyUSB*'
VERSION =
'0.2.2'

Class Method Summary collapse

Class Method Details

.detect_device(mod, *patterns, logger: nil, timeout: nil) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/seriamp/detect.rb', line 10

module_function def detect_device(mod, *patterns, logger: nil, timeout: nil)
  if patterns.empty?
    patterns = [DEFAULT_DEVICE_GLOB]
  end
  devices = patterns.map do |pattern|
    Dir.glob(pattern)
  end.flatten.uniq
  queue = Queue.new
  timeout ||= mod.const_get(:DEFAULT_RS232_TIMEOUT)
  client_cls = mod.const_get(:Client)
  threads = devices.map do |device|
    Thread.new do
      Timeout.timeout(timeout * 2, CommunicationTimeout) do
        logger&.debug("Trying #{device}")
        client_cls.new(device: device, logger: logger, retries: false, timeout: timeout).present?
        logger&.debug("Found #{mod} device at #{device}")
        queue << device
      end
    rescue CommunicationTimeout, IOError, SystemCallError => exc
      logger&.debug("Failed on #{mod} #{device}: #{exc.class}: #{exc}")
    end
  end
  wait_thread = Thread.new do
    threads.each do |thread|
      # Unhandled exceptions raised in threads are reraised by the join method
      thread.join rescue nil
    end
    queue << nil
  end
  queue.shift.tap do
    threads.map(&:kill)
    wait_thread.kill
  end
end