Skip to content

Commit d403c9a

Browse files
committed
greatly simplify Network discovery code
1 parent 162e2cb commit d403c9a

File tree

5 files changed

+54
-298
lines changed

5 files changed

+54
-298
lines changed

arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java

+53-92
Original file line numberDiff line numberDiff line change
@@ -31,89 +31,37 @@
3131

3232
import cc.arduino.packages.BoardPort;
3333
import cc.arduino.packages.Discovery;
34-
import cc.arduino.packages.discoverers.network.BoardReachabilityFilter;
35-
import cc.arduino.packages.discoverers.network.NetworkChecker;
36-
import org.apache.commons.compress.utils.IOUtils;
3734
import processing.app.BaseNoGui;
38-
import processing.app.zeroconf.jmdns.ArduinoDNSTaskStarter;
3935

4036
import javax.jmdns.*;
41-
import javax.jmdns.impl.DNSTaskStarter;
4237
import java.io.IOException;
4338
import java.net.InetAddress;
4439
import java.util.*;
4540

46-
public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.packages.discoverers.network.NetworkTopologyListener {
47-
48-
private static final int MAX_TIME_AWAITING_FOR_PACKAGES = 5000;
49-
50-
private final List<BoardPort> boardPortsDiscoveredWithJmDNS;
51-
private final Map<InetAddress, JmDNS> mappedJmDNSs;
52-
private Timer networkCheckerTimer;
53-
private Timer boardReachabilityFilterTimer;
54-
private final List<BoardPort> reachableBoardPorts;
55-
56-
public NetworkDiscovery() {
57-
DNSTaskStarter.Factory.setClassDelegate(new ArduinoDNSTaskStarter());
58-
this.boardPortsDiscoveredWithJmDNS = new LinkedList<>();
59-
this.mappedJmDNSs = new Hashtable<>();
60-
this.reachableBoardPorts = new LinkedList<>();
61-
}
41+
import cc.arduino.packages.discoverers.network.BoardReachabilityFilter;
6242

63-
@Override
64-
public List<BoardPort> listDiscoveredBoards() {
65-
synchronized (reachableBoardPorts) {
66-
return new LinkedList<>(reachableBoardPorts);
67-
}
68-
}
43+
public class NetworkDiscovery implements Discovery, ServiceListener {
6944

70-
@Override
71-
public List<BoardPort> listDiscoveredBoards(boolean complete) {
72-
synchronized (reachableBoardPorts) {
73-
return new LinkedList<>(reachableBoardPorts);
74-
}
75-
}
45+
private static final int MAX_TIME_AWAITING_FOR_PACKAGES = 5000;
7646

77-
public void setReachableBoardPorts(List<BoardPort> newReachableBoardPorts) {
78-
synchronized (reachableBoardPorts) {
79-
this.reachableBoardPorts.clear();
80-
this.reachableBoardPorts.addAll(newReachableBoardPorts);
81-
}
82-
}
47+
private final List<BoardPort> reachableBoardPorts = new LinkedList<>();
48+
private final List<BoardPort> boardPortsDiscoveredWithJmDNS = new LinkedList<>();
49+
private final Timer reachabilityTimer = new Timer();
8350

84-
public List<BoardPort> getBoardPortsDiscoveredWithJmDNS() {
51+
private void removeDuplicateBoards(BoardPort newBoard) {
8552
synchronized (boardPortsDiscoveredWithJmDNS) {
86-
return new LinkedList<>(boardPortsDiscoveredWithJmDNS);
53+
Iterator<BoardPort> iterator = boardPortsDiscoveredWithJmDNS.iterator();
54+
while (iterator.hasNext()) {
55+
BoardPort board = iterator.next();
56+
if (newBoard.getAddress().equals(board.getAddress())) {
57+
iterator.remove();
58+
}
59+
}
8760
}
8861
}
8962

90-
@Override
91-
public void start() throws IOException {
92-
this.networkCheckerTimer = new Timer(NetworkChecker.class.getName());
93-
new NetworkChecker(this, NetworkTopologyDiscovery.Factory.getInstance()).start(networkCheckerTimer);
94-
this.boardReachabilityFilterTimer = new Timer(BoardReachabilityFilter.class.getName());
95-
new BoardReachabilityFilter(this).start(boardReachabilityFilterTimer);
96-
}
97-
98-
@Override
99-
public void stop() throws IOException {
100-
this.networkCheckerTimer.purge();
101-
this.boardReachabilityFilterTimer.purge();
102-
// we don't close each JmDNS instance as it's too slow
103-
}
104-
10563
@Override
10664
public void serviceAdded(ServiceEvent serviceEvent) {
107-
String type = serviceEvent.getType();
108-
String name = serviceEvent.getName();
109-
110-
JmDNS dns = serviceEvent.getDNS();
111-
112-
dns.requestServiceInfo(type, name);
113-
ServiceInfo serviceInfo = dns.getServiceInfo(type, name);
114-
if (serviceInfo != null) {
115-
dns.requestServiceInfo(type, name);
116-
}
11765
}
11866

11967
@Override
@@ -126,11 +74,9 @@ public void serviceRemoved(ServiceEvent serviceEvent) {
12674

12775
@Override
12876
public void serviceResolved(ServiceEvent serviceEvent) {
129-
int sleptFor = 0;
130-
while (BaseNoGui.packages == null && sleptFor <= MAX_TIME_AWAITING_FOR_PACKAGES) {
77+
while (BaseNoGui.packages == null) {
13178
try {
13279
Thread.sleep(1000);
133-
sleptFor += 1000;
13480
} catch (InterruptedException e) {
13581
e.printStackTrace();
13682
}
@@ -151,7 +97,7 @@ public void serviceResolved(ServiceEvent serviceEvent) {
15197
port.getPrefs().put("board", board);
15298
port.getPrefs().put("distro_version", info.getPropertyString("distro_version"));
15399
port.getPrefs().put("port", "" + info.getPort());
154-
100+
155101
//Add additional fields to permit generic ota updates
156102
//and make sure we do not intefere with Arduino boards
157103
// define "ssh_upload=no" TXT property to use generic uploader
@@ -190,35 +136,50 @@ public void serviceResolved(ServiceEvent serviceEvent) {
190136
}
191137
}
192138

193-
private void removeDuplicateBoards(BoardPort newBoard) {
194-
synchronized (boardPortsDiscoveredWithJmDNS) {
195-
Iterator<BoardPort> iterator = boardPortsDiscoveredWithJmDNS.iterator();
196-
while (iterator.hasNext()) {
197-
BoardPort board = iterator.next();
198-
if (newBoard.getAddress().equals(board.getAddress())) {
199-
iterator.remove();
200-
}
201-
}
139+
public NetworkDiscovery() {
140+
final JmDNS jmdns;
141+
try {
142+
jmdns = JmDNS.create();
143+
jmdns.addServiceListener("_arduino._tcp.local.", this);
144+
} catch (IOException e) {
145+
e.printStackTrace();
202146
}
203147
}
204148

205149
@Override
206-
public void inetAddressAdded(InetAddress address) {
207-
if (mappedJmDNSs.containsKey(address)) {
208-
return;
209-
}
210-
try {
211-
JmDNS jmDNS = JmDNS.create(address);
212-
jmDNS.addServiceListener("_arduino._tcp.local.", this);
213-
mappedJmDNSs.put(address, jmDNS);
214-
} catch (Exception e) {
215-
e.printStackTrace();
150+
public void start() {
151+
new BoardReachabilityFilter(this).start(reachabilityTimer);
152+
}
153+
154+
@Override
155+
public void stop() {
156+
reachabilityTimer.cancel();
157+
}
158+
159+
@Override
160+
public List<BoardPort> listDiscoveredBoards() {
161+
synchronized (reachableBoardPorts) {
162+
return new LinkedList<>(reachableBoardPorts);
216163
}
217164
}
218165

219166
@Override
220-
public void inetAddressRemoved(InetAddress address) {
221-
JmDNS jmDNS = mappedJmDNSs.remove(address);
222-
IOUtils.closeQuietly(jmDNS);
167+
public List<BoardPort> listDiscoveredBoards(boolean complete) {
168+
synchronized (reachableBoardPorts) {
169+
return new LinkedList<>(reachableBoardPorts);
170+
}
171+
}
172+
173+
public void setReachableBoardPorts(List<BoardPort> newReachableBoardPorts) {
174+
synchronized (reachableBoardPorts) {
175+
this.reachableBoardPorts.clear();
176+
this.reachableBoardPorts.addAll(newReachableBoardPorts);
177+
}
178+
}
179+
180+
public List<BoardPort> getBoardPortsDiscoveredWithJmDNS() {
181+
synchronized (boardPortsDiscoveredWithJmDNS) {
182+
return new LinkedList<>(boardPortsDiscoveredWithJmDNS);
183+
}
223184
}
224185
}

arduino-core/src/cc/arduino/packages/discoverers/network/BoardReachabilityFilter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public BoardReachabilityFilter(NetworkDiscovery networkDiscovery) {
4646
}
4747

4848
public void start(Timer timer) {
49-
timer.schedule(this, 0, 3000);
49+
timer.schedule(this, 0, 5000);
5050
}
5151

5252
@Override

arduino-core/src/cc/arduino/packages/discoverers/network/NetworkChecker.java

-84
This file was deleted.

arduino-core/src/cc/arduino/packages/discoverers/network/NetworkTopologyListener.java

-40
This file was deleted.

0 commit comments

Comments
 (0)