diff --git a/app/src/processing/app/AbstractMonitor.java b/app/src/processing/app/AbstractMonitor.java index 1efbec7e2d6..4fb819a7346 100644 --- a/app/src/processing/app/AbstractMonitor.java +++ b/app/src/processing/app/AbstractMonitor.java @@ -1,6 +1,7 @@ package processing.app; import cc.arduino.packages.BoardPort; +import cc.arduino.packages.DiscoveryManager; import processing.app.legacy.PApplet; import javax.swing.*; @@ -9,6 +10,7 @@ import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.util.List; @SuppressWarnings("serial") public abstract class AbstractMonitor extends JFrame implements ActionListener { @@ -17,6 +19,7 @@ public abstract class AbstractMonitor extends JFrame implements ActionListener { private StringBuffer updateBuffer; private Timer updateTimer; + private Timer portExistsTimer; private BoardPort boardPort; @@ -73,6 +76,26 @@ public void actionPerformed(ActionEvent event) { updateTimer = new Timer(33, this); // redraw serial monitor at 30 Hz updateTimer.start(); + ActionListener portExists = new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + try { + if (!Base.getDiscoveryManager().discovery().contains(boardPort)) { + if (!closed) { + suspend(); + } + } else { + if (closed && (Editor.avoidMultipleOperations == false)) { + resume(boardPort); + } + } + } catch (Exception e) {} + } + }; + + portExistsTimer = new Timer(1000, portExists); // check if the port is still there every second + portExistsTimer.start(); + closed = false; } @@ -92,6 +115,11 @@ public void suspend() throws Exception { close(); } + public void dispose() { + super.dispose(); + portExistsTimer.stop(); + } + public void resume(BoardPort boardPort) throws Exception { setBoardPort(boardPort); diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 49c092fd9d2..a8e5b7b7493 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -181,7 +181,7 @@ public boolean test(SketchController controller) { private int numTools = 0; - public boolean avoidMultipleOperations = false; + static public boolean avoidMultipleOperations = false; private final EditorToolbar toolbar; // these menus are shared so that they needn't be rebuilt for all windows @@ -1015,22 +1015,20 @@ private void selectSerialPort(String name) { //System.out.println(item.getLabel()); BaseNoGui.selectSerialPort(name); - if (serialMonitor != null) { - try { + try { + boolean reopenMonitor = ((serialMonitor != null && serialMonitor.isVisible()) || + serialPlotter != null && serialPlotter.isVisible()); + if (serialMonitor != null) { serialMonitor.close(); - serialMonitor.setVisible(false); - } catch (Exception e) { - // ignore } - } - - if (serialPlotter != null) { - try { + if (serialPlotter != null) { serialPlotter.close(); - serialPlotter.setVisible(false); - } catch (Exception e) { - // ignore } + if (reopenMonitor) { + handleSerial(); + } + } catch (Exception e) { + // ignore } onBoardOrPortChange(); diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java index 8e65b3e598f..96ba383aceb 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -210,9 +210,9 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String // Reuse waitForUploadPort for this task, but this time we are simply waiting // for one port to reappear. If no port reappears before the timeout, actualUploadPort is selected - finalUploadPort = waitForUploadPort(actualUploadPort, Serial.list(), false); + finalUploadPort = waitForUploadPort(actualUploadPort, Serial.list(), false, 2000); } - } catch (InterruptedException ex) { + } catch (RunnerException ex) { // noop } } @@ -229,13 +229,13 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String } private String waitForUploadPort(String uploadPort, List before) throws InterruptedException, RunnerException { - return waitForUploadPort(uploadPort, before, verbose); + return waitForUploadPort(uploadPort, before, verbose, 10000); } - private String waitForUploadPort(String uploadPort, List before, boolean verbose) throws InterruptedException, RunnerException { + private String waitForUploadPort(String uploadPort, List before, boolean verbose, int timeout) throws InterruptedException, RunnerException { // Wait for a port to appear on the list int elapsed = 0; - while (elapsed < 10000) { + while (elapsed < timeout) { List now = Serial.list(); List diff = new ArrayList<>(now); diff.removeAll(before);