From cca59f7e91f87e4bb45b99752cc7f5d37d5381b9 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Fri, 14 Jun 2013 16:43:05 +0200 Subject: [PATCH] NetworkDiscovery is a bit more responsive when boards go OFFLINE --- .../discoverers/NetworkDiscovery.java | 69 ++++++++++++------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/app/src/cc/arduino/packages/discoverers/NetworkDiscovery.java b/app/src/cc/arduino/packages/discoverers/NetworkDiscovery.java index 7b0fb93fa..630109ade 100644 --- a/app/src/cc/arduino/packages/discoverers/NetworkDiscovery.java +++ b/app/src/cc/arduino/packages/discoverers/NetworkDiscovery.java @@ -1,33 +1,52 @@ package cc.arduino.packages.discoverers; -import java.io.IOException; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import javax.jmdns.JmDNS; -import javax.jmdns.NetworkTopologyDiscovery; -import javax.jmdns.ServiceEvent; -import javax.jmdns.ServiceInfo; -import javax.jmdns.ServiceListener; -import javax.jmdns.impl.DNSTaskStarter; - +import cc.arduino.packages.BoardPort; +import cc.arduino.packages.Discovery; import processing.app.Base; import processing.app.helpers.PreferencesMap; import processing.app.zeroconf.jmdns.ArduinoDNSTaskStarter; -import cc.arduino.packages.BoardPort; -import cc.arduino.packages.Discovery; + +import javax.jmdns.*; +import javax.jmdns.impl.DNSTaskStarter; +import java.io.IOException; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; public class NetworkDiscovery implements Discovery, ServiceListener { - private JmDNS jmDNS; - private List ports = new CopyOnWriteArrayList(); + private List ports; + + public NetworkDiscovery() { + DNSTaskStarter.Factory.setClassDelegate(new ArduinoDNSTaskStarter()); + this.ports = new ArrayList(); + } @Override public List discovery() { + List ports = clonePortsList(); + Iterator iterator = ports.iterator(); + while (iterator.hasNext()) { + try { + InetAddress address = Inet4Address.getByName(iterator.next().getAddress()); + if (!address.isReachable(100)) { + iterator.remove(); + } + } catch (UnknownHostException e) { + iterator.remove(); + } catch (IOException e) { + iterator.remove(); + } + } + return ports; + } + + private List clonePortsList() { synchronized (this) { - return new ArrayList(ports); + return new ArrayList(this.ports); } } @@ -37,10 +56,8 @@ public class NetworkDiscovery implements Discovery, ServiceListener { @Override public void start() throws IOException { - DNSTaskStarter.Factory.setClassDelegate(new ArduinoDNSTaskStarter()); - for (InetAddress addr : NetworkTopologyDiscovery.Factory.getInstance() - .getInetAddresses()) { - jmDNS = JmDNS.create(addr); + for (InetAddress addr : NetworkTopologyDiscovery.Factory.getInstance().getInetAddresses()) { + JmDNS jmDNS = JmDNS.create(addr); jmDNS.addServiceListener("_arduino._tcp.local.", this); } } @@ -65,8 +82,9 @@ public class NetworkDiscovery implements Discovery, ServiceListener { dns.requestServiceInfo(type, name); ServiceInfo serviceInfo = dns.getServiceInfo(type, name); - if (serviceInfo != null) + if (serviceInfo != null) { dns.requestServiceInfo(type, name); + } } @Override @@ -97,11 +115,10 @@ public class NetworkDiscovery implements Discovery, ServiceListener { String label = name + " at " + address; if (board != null) { - String boardName = Base.getPlatform() - .resolveDeviceByBoardID(Base.packages, board); + String boardName = Base.getPlatform().resolveDeviceByBoardID(Base.packages, board); label += " (" + boardName + ")"; } - + BoardPort port = new BoardPort(); port.setAddress(address); port.setBoardName(name);