From db942b936d4bde9173c95f5f7175cdb352822934 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Wed, 21 Nov 2018 17:43:20 +0100 Subject: [PATCH] Refactor port selection after 1200bps touch upload New behaviour: if upload failed or we are uploading through a "Programming" port (that does not disappear), leave the user selected port selected. if upload succeded and we are using 1200bps touch, wait for the first port that reappears, and if nothing reappears after the timeout select the bootloader port. Fixes #https://github.com/arduino/Arduino/issues/3495 --- .../packages/uploaders/SerialUploader.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java index 4a322fcbe0b..8e65b3e598f 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -199,9 +199,6 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String BaseNoGui.getDiscoveryManager().getSerialDiscoverer().pausePolling(false); } - BaseNoGui.getDiscoveryManager().getSerialDiscoverer().setUploadInProgress(false); - BaseNoGui.getDiscoveryManager().getSerialDiscoverer().pausePolling(false); - String finalUploadPort = null; if (uploadResult && doTouch) { try { @@ -210,34 +207,32 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String // sketch serial port reconnects (or timeout after a few seconds if the // sketch port never comes back). Doing this saves users from accidentally // opening Serial Monitor on the soon-to-be-orphaned bootloader port. - Thread.sleep(1000); - long started = System.currentTimeMillis(); - while (System.currentTimeMillis() - started < 2000) { - List portList = Serial.list(); - if (portList.contains(userSelectedUploadPort)) { - finalUploadPort = userSelectedUploadPort; - break; - } - Thread.sleep(250); - } + + // 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); } } catch (InterruptedException ex) { // noop } } - if (finalUploadPort == null) { - finalUploadPort = actualUploadPort; - } if (finalUploadPort == null) { finalUploadPort = userSelectedUploadPort; } BaseNoGui.selectSerialPort(finalUploadPort); + BaseNoGui.getDiscoveryManager().getSerialDiscoverer().setUploadInProgress(false); + BaseNoGui.getDiscoveryManager().getSerialDiscoverer().pausePolling(false); + return uploadResult; } private String waitForUploadPort(String uploadPort, List before) throws InterruptedException, RunnerException { + return waitForUploadPort(uploadPort, before, verbose); + } + + private String waitForUploadPort(String uploadPort, List before, boolean verbose) throws InterruptedException, RunnerException { // Wait for a port to appear on the list int elapsed = 0; while (elapsed < 10000) {