module PrologixGpib::Discovery

Constants

BROADCAST_ADDRESS
BROADCAST_PORT
HEADER_FMT
NF_IDENTIFY
NF_IDENTIFY_REPLY
NF_MAGIC
TIMEOUT

Public Instance Methods

avaliable_controllers() click to toggle source
# File lib/prologix_gpib/discovery.rb, line 10
def avaliable_controllers
  { usb: usb_device_paths, lan: lan_device_ips }
end

Private Instance Methods

lan_device_ips() click to toggle source
# File lib/prologix_gpib/discovery.rb, line 76
def lan_device_ips
  seq = rand(0..65_535)

  # puts "Seq = #{seq}"
  sock = UDPSocket.new
  sock.setsockopt(:SOL_SOCKET, :SO_BROADCAST, true)

  # data = [NF_MAGIC, NF_IDENTIFY, seq, "\xFF\xFF\xFF\xFF\xFF\xFF"].pack(HEADER_FMT)

  data = NFHeader.new
  data.magic = NF_MAGIC
  data.identify = NF_IDENTIFY
  data.seq = seq
  data.eth_addr = 'FF:FF:FF:FF:FF:FF'

  sock.send(data.to_binary_s, 0, BROADCAST_ADDRESS, BROADCAST_PORT)
  array = []
  begin
    Timeout.timeout(TIMEOUT) do
      while true
        data, addr = sock.recvfrom(256)
        reply = NFIdentifyReply.read(data)
        next if array.include?(reply.addr)
        array << reply.addr if reply.header.seq == seq && reply.header.identify == NF_IDENTIFY_REPLY
      end
    end
  rescue Timeout::Error
    sock.close
    array
  end
end
usb_device_paths() click to toggle source
# File lib/prologix_gpib/discovery.rb, line 108
def usb_device_paths
  path_str, dir =
    if RubySerial::ON_LINUX
      %w[ttyUSB /dev/]
    elsif RubySerial::ON_WINDOWS
      ['TODO: Implement find device for Windows', 'You lazy bugger']
    else
      %w[tty.usbserial /dev/]
    end

  Dir.glob("#{dir}#{path_str}*")
end