lib/prologix_gpib/discovery.rb in prologix_gpib-0.5.0 vs lib/prologix_gpib/discovery.rb in prologix_gpib-0.5.2
- old
+ new
@@ -58,20 +58,19 @@
ip_addr :netmask
string :ip_gw, read_length: 4
string :app_ver, read_length: 4
string :boot_ver, read_length: 4
string :hw_ver, read_length: 4
- stringz :name
end
NF_MAGIC = 0x5a
HEADER_FMT = 'CCna8'
NF_IDENTIFY = 0
NF_IDENTIFY_REPLY = 1
BROADCAST_PORT = 3040
BROADCAST_ADDRESS = '255.255.255.255'
- TIMEOUT = 1
+ TIMEOUT = 0.5
private
def lan_device_ips
seq = rand(0..65_535)
@@ -88,19 +87,28 @@
data.seq = seq
data.eth_addr = 'FF:FF:FF:FF:FF:FF'
sock.send(data.to_binary_s, 0, BROADCAST_ADDRESS, BROADCAST_PORT)
array = []
+ replies = []
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
+ data, addr = sock.recvfrom(1000)
+ replies << data
end
end
rescue Timeout::Error
+ replies.each do |data|
+ begin
+ reply = NFIdentifyReply.read(data)
+ rescue EOFError
+ # About 1% of responses are not always as expected from the controller
+ next
+ end
+ next if array.include?(reply.addr)
+ array << reply.addr if reply.header.seq == seq && reply.header.identify == NF_IDENTIFY_REPLY
+ end
sock.close
array
end
end