From d0f6d43bbd95d03163196fa41dfe1960866efc1d Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 1 Oct 2018 13:26:06 +0200 Subject: [PATCH 1/4] Reopen serial monitor on correct port if changed from menu --- app/src/processing/app/Editor.java | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 49c092fd9d2..8ed2ccc736a 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -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(); From a61ed98d51ae7a9a1dfec68f8eab3f83aac941ee Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 1 Oct 2018 14:07:30 +0200 Subject: [PATCH 2/4] Handle suspend/resume if serial port disappears Similar to minicom behaviour. Automatically reopens the port only if it takes the same name (could be improved based on vid/pid) --- app/src/processing/app/AbstractMonitor.java | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/processing/app/AbstractMonitor.java b/app/src/processing/app/AbstractMonitor.java index 1efbec7e2d6..ad1ed87eb01 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) { + 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); From d56d80b14abeb18106501137da202893f04abf8b Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 9 Oct 2018 17:25:07 +0200 Subject: [PATCH 3/4] Don't try automatic resume during upload --- app/src/processing/app/AbstractMonitor.java | 2 +- app/src/processing/app/Editor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/AbstractMonitor.java b/app/src/processing/app/AbstractMonitor.java index ad1ed87eb01..4fb819a7346 100644 --- a/app/src/processing/app/AbstractMonitor.java +++ b/app/src/processing/app/AbstractMonitor.java @@ -85,7 +85,7 @@ public void actionPerformed(ActionEvent ae) { suspend(); } } else { - if (closed) { + if (closed && (Editor.avoidMultipleOperations == false)) { resume(boardPort); } } diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 8ed2ccc736a..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 From d2f8e15d9e5cc07e478e73e7a5f20b7f81e8560b Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 8 Jul 2019 12:07:33 +0200 Subject: [PATCH 4/4] Don't report an exception if waitForUploadPort fails after successfull upload Fixes #8851 --- .../cc/arduino/packages/uploaders/SerialUploader.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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);