From 205ce5940a270325f7e0844c05cef747a9c28ea0 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 16:15:40 +0100 Subject: [PATCH 01/12] Removed dead-code in comments --- .../src/cc/arduino/packages/uploaders/SerialUploader.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java index cd5e285c415..88c3923a36c 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -332,12 +332,6 @@ private boolean uploadUsingProgrammer(String buildPath, String className) throws prefs.put("program.verify", prefs.get("program.params.noverify", "")); try { - // if (prefs.get("program.disable_flushing") == null - // || prefs.get("program.disable_flushing").toLowerCase().equals("false")) - // { - // flushSerialBuffer(); - // } - String pattern = prefs.getOrExcept("program.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); return executeUploadCommand(cmd); From eefe8dd3b318a464ba7f305665ccd183571b956a Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 12:39:37 +0100 Subject: [PATCH 02/12] Refactor: simplified TargetBoard retrieve --- arduino-core/src/cc/arduino/UploaderUtils.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/arduino-core/src/cc/arduino/UploaderUtils.java b/arduino-core/src/cc/arduino/UploaderUtils.java index 108d7c137b3..9987354a37d 100644 --- a/arduino-core/src/cc/arduino/UploaderUtils.java +++ b/arduino-core/src/cc/arduino/UploaderUtils.java @@ -35,7 +35,7 @@ import processing.app.BaseNoGui; import processing.app.PreferencesData; import processing.app.Sketch; -import processing.app.debug.TargetPlatform; +import processing.app.debug.TargetBoard; import java.util.LinkedList; import java.util.List; @@ -45,9 +45,6 @@ public class UploaderUtils { public Uploader getUploaderByPreferences(boolean noUploadPort) { - TargetPlatform target = BaseNoGui.getTargetPlatform(); - String board = PreferencesData.get("board"); - BoardPort boardPort = null; if (!noUploadPort) { String port = PreferencesData.get("serial.port"); @@ -57,7 +54,8 @@ public Uploader getUploaderByPreferences(boolean noUploadPort) { boardPort = BaseNoGui.getDiscoveryManager().find(port); } - return new UploaderFactory().newUploader(target.getBoards().get(board), boardPort, noUploadPort); + TargetBoard board = BaseNoGui.getTargetBoard(); + return new UploaderFactory().newUploader(board, boardPort, noUploadPort); } public boolean upload(Sketch data, Uploader uploader, String suggestedClassName, boolean usingProgrammer, boolean noUploadPort, List warningsAccumulator) throws Exception { From 0310ec10d3b5e9072f3c41fd3d105f471080ebcc Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 12:40:32 +0100 Subject: [PATCH 03/12] Refactor: simplified bool prefs retrieval --- .../src/cc/arduino/packages/uploaders/SerialUploader.java | 7 ++----- 1 file changed, 2 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 88c3923a36c..88c77e65a50 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -124,11 +124,8 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String // this wait a moment for the bootloader to enumerate. On Windows, also must // deal with the fact that the COM port number changes from bootloader to // sketch. - String t = prefs.get("upload.use_1200bps_touch"); - boolean doTouch = t != null && t.equals("true"); - - t = prefs.get("upload.wait_for_upload_port"); - boolean waitForUploadPort = (t != null) && t.equals("true"); + boolean doTouch = prefs.getBoolean("upload.use_1200bps_touch"); + boolean waitForUploadPort = prefs.getBoolean("upload.wait_for_upload_port"); String userSelectedUploadPort = prefs.getOrExcept("serial.port"); String actualUploadPort = null; From aebdba266eae43f6a2639c9c2b46aadd9478b872 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 14:40:08 +0100 Subject: [PATCH 04/12] Refactor: removed useless parameter from StringReplacer.formatAndSplit --- arduino-core/src/cc/arduino/Compiler.java | 2 +- .../packages/uploaders/GenericNetworkUploader.java | 2 +- .../src/cc/arduino/packages/uploaders/SSHUploader.java | 2 +- .../cc/arduino/packages/uploaders/SerialUploader.java | 10 +++++----- arduino-core/src/processing/app/debug/Sizer.java | 2 +- .../src/processing/app/helpers/StringReplacer.java | 5 +---- 6 files changed, 10 insertions(+), 13 deletions(-) diff --git a/arduino-core/src/cc/arduino/Compiler.java b/arduino-core/src/cc/arduino/Compiler.java index ad7a964b466..d1aa1f2bdce 100644 --- a/arduino-core/src/cc/arduino/Compiler.java +++ b/arduino-core/src/cc/arduino/Compiler.java @@ -405,7 +405,7 @@ private void runRecipe(String recipe, PreferencesMap prefs) throws RunnerExcepti String[] cmdArray; String cmd = prefs.getOrExcept(recipe); try { - cmdArray = StringReplacer.formatAndSplit(cmd, dict, true); + cmdArray = StringReplacer.formatAndSplit(cmd, dict); } catch (Exception e) { throw new RunnerException(e); } diff --git a/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java index ab7667787dc..0cf2ba04be5 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/GenericNetworkUploader.java @@ -95,7 +95,7 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String pattern = prefs.get("upload.network_pattern"); if(pattern == null) pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); uploadResult = executeUploadCommand(cmd); } catch (RunnerException e) { throw e; diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java index b3152a75539..cf6416c2f29 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SSHUploader.java @@ -165,7 +165,7 @@ private boolean runUploadTool(SSH ssh, PreferencesMap prefs) throws Exception { } String pattern = prefs.getOrExcept("upload.pattern"); - String command = StringUtils.join(StringReplacer.formatAndSplit(pattern, prefs, true), " "); + String command = StringUtils.join(StringReplacer.formatAndSplit(pattern, prefs), " "); if (verbose) { System.out.println(command); } diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java index 88c77e65a50..9d6c29eaa88 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -108,7 +108,7 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String boolean uploadResult; try { String pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); uploadResult = executeUploadCommand(cmd); } catch (Exception e) { throw new RunnerException(e); @@ -200,7 +200,7 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String boolean uploadResult; try { String pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); uploadResult = executeUploadCommand(cmd); } catch (RunnerException e) { throw e; @@ -330,7 +330,7 @@ private boolean uploadUsingProgrammer(String buildPath, String className) throws try { String pattern = prefs.getOrExcept("program.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); return executeUploadCommand(cmd); } catch (RunnerException e) { throw e; @@ -394,12 +394,12 @@ public boolean burnBootloader() throws Exception { new LoadVIDPIDSpecificPreferences().load(prefs); String pattern = prefs.getOrExcept("erase.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); if (!executeUploadCommand(cmd)) return false; pattern = prefs.getOrExcept("bootloader.pattern"); - cmd = StringReplacer.formatAndSplit(pattern, prefs, true); + cmd = StringReplacer.formatAndSplit(pattern, prefs); return executeUploadCommand(cmd); } } diff --git a/arduino-core/src/processing/app/debug/Sizer.java b/arduino-core/src/processing/app/debug/Sizer.java index 4d54d8d52c8..6e748a94162 100644 --- a/arduino-core/src/processing/app/debug/Sizer.java +++ b/arduino-core/src/processing/app/debug/Sizer.java @@ -60,7 +60,7 @@ public long[] computeSize() throws RunnerException { int r = 0; try { String pattern = prefs.get("recipe.size.pattern"); - String cmd[] = StringReplacer.formatAndSplit(pattern, prefs, true); + String cmd[] = StringReplacer.formatAndSplit(pattern, prefs); exception = null; textSize = -1; diff --git a/arduino-core/src/processing/app/helpers/StringReplacer.java b/arduino-core/src/processing/app/helpers/StringReplacer.java index 159289d1d5b..6c90e255888 100644 --- a/arduino-core/src/processing/app/helpers/StringReplacer.java +++ b/arduino-core/src/processing/app/helpers/StringReplacer.java @@ -27,16 +27,13 @@ public class StringReplacer { - public static String[] formatAndSplit(String src, Map dict, - boolean recursive) throws Exception { + public static String[] formatAndSplit(String src, Map dict) throws Exception { String res; // Recursive replace with a max depth of 10 levels. for (int i = 0; i < 10; i++) { // Do a replace with dictionary res = StringReplacer.replaceFromMapping(src, dict); - if (!recursive) - break; if (res.equals(src)) break; src = res; From 6ea66ea8dcdec4d6694766299518bf365d40e20c Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 16:06:37 +0100 Subject: [PATCH 05/12] Refactor: Removed code duplication in Export(App)Handlers --- app/src/processing/app/Editor.java | 73 ++++++------------------------ 1 file changed, 15 insertions(+), 58 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 9500ddd695a..cfaea455e03 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -226,8 +226,8 @@ public boolean test(SketchController sketch) { Runnable presentHandler; private Runnable runAndSaveHandler; private Runnable presentAndSaveHandler; - Runnable exportHandler; - private Runnable exportAppHandler; + private UploadHandler uploadHandler; + private UploadHandler uploadUsingProgrammerHandler; private Runnable timeoutUploadHandler; private Map internalToolCache = new HashMap(); @@ -1376,8 +1376,10 @@ private void resetHandlers() { presentHandler = new BuildHandler(true); runAndSaveHandler = new BuildHandler(false, true); presentAndSaveHandler = new BuildHandler(true, true); - exportHandler = new DefaultExportHandler(); - exportAppHandler = new DefaultExportAppHandler(); + uploadHandler = new UploadHandler(); + uploadHandler.setUsingProgrammer(false); + uploadUsingProgrammerHandler = new UploadHandler(); + uploadUsingProgrammerHandler.setUsingProgrammer(true); timeoutUploadHandler = new TimeoutUploadHandler(); } @@ -2007,13 +2009,17 @@ synchronized public void handleExport(final boolean usingProgrammer) { avoidMultipleOperations = true; new Thread(timeoutUploadHandler).start(); - new Thread(usingProgrammer ? exportAppHandler : exportHandler).start(); + new Thread(usingProgrammer ? uploadUsingProgrammerHandler : uploadHandler).start(); } - // DAM: in Arduino, this is upload - class DefaultExportHandler implements Runnable { - public void run() { + class UploadHandler implements Runnable { + boolean usingProgrammer = false; + + public void setUsingProgrammer(boolean usingProgrammer) { + this.usingProgrammer = usingProgrammer; + } + public void run() { try { removeAllLineHighlights(); if (serialMonitor != null) { @@ -2025,7 +2031,7 @@ public void run() { uploading = true; - boolean success = sketchController.exportApplet(false); + boolean success = sketchController.exportApplet(usingProgrammer); if (success) { statusNotice(tr("Done uploading.")); } @@ -2108,55 +2114,6 @@ private void resumeOrCloseSerialPlotter() { } } - // DAM: in Arduino, this is upload (with verbose output) - class DefaultExportAppHandler implements Runnable { - public void run() { - - try { - if (serialMonitor != null) { - serialMonitor.suspend(); - } - if (serialPlotter != null) { - serialPlotter.suspend(); - } - - uploading = true; - - boolean success = sketchController.exportApplet(true); - if (success) { - statusNotice(tr("Done uploading.")); - } - } catch (SerialNotFoundException e) { - if (portMenu.getItemCount() == 0) statusError(e); - else if (serialPrompt()) run(); - else statusNotice(tr("Upload canceled.")); - } catch (PreferencesMapException e) { - statusError(I18n.format( - tr("Error while uploading: missing '{0}' configuration parameter"), - e.getMessage())); - } catch (RunnerException e) { - //statusError("Error during upload."); - //e.printStackTrace(); - status.unprogress(); - statusError(e); - } catch (Exception e) { - e.printStackTrace(); - } finally { - avoidMultipleOperations = false; - populatePortMenu(); - } - status.unprogress(); - uploading = false; - //toolbar.clear(); - toolbar.deactivateExport(); - - resumeOrCloseSerialMonitor(); - resumeOrCloseSerialPlotter(); - - base.onBoardOrPortChange(); - } - } - class TimeoutUploadHandler implements Runnable { public void run() { From 2cf63e7b4d027f70d916d371d2f49bb9f8968c44 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 16:12:08 +0100 Subject: [PATCH 06/12] Added StringReplacer.checkIfRequiredKeyIsMissingOrExcept helper method --- .../app/helpers/StringReplacer.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/arduino-core/src/processing/app/helpers/StringReplacer.java b/arduino-core/src/processing/app/helpers/StringReplacer.java index 6c90e255888..1e1dd9eab3d 100644 --- a/arduino-core/src/processing/app/helpers/StringReplacer.java +++ b/arduino-core/src/processing/app/helpers/StringReplacer.java @@ -24,9 +24,50 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.UUID; public class StringReplacer { + public static void checkIfRequiredKeyIsMissingOrExcept(String key, String src, PreferencesMap inDict) throws PreferencesMapException { + // If the key is not missing -> everything is OK + String checkedValue = inDict.get(key); + if (checkedValue != null && !checkedValue.isEmpty()) + return; + + PreferencesMap dict = new PreferencesMap(inDict); + + // Find a random tag that is not contained in the dictionary and the src pattern + String tag; + while (true) { + tag = UUID.randomUUID().toString(); + if (src.contains(tag)) + continue; + if (dict.values().contains(tag)) + continue; + if (dict.keySet().contains(tag)) + continue; + break; + } + + // Inject tag inside the dictionary + dict.put(key, tag); + + // Recursive replace with a max depth of 10 levels. + String res; + for (int i = 0; i < 10; i++) { + // Do a replace with dictionary + res = StringReplacer.replaceFromMapping(src, dict); + if (res.equals(src)) + break; + src = res; + } + + // If the resulting string contains the tag, then the key is required + if (src.contains(tag)) { + throw new PreferencesMapException(key); + } + } + public static String[] formatAndSplit(String src, Map dict) throws Exception { String res; From 459c17378cf9f3b7d4e23c83ce0441ff0e089aaa Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 16:15:47 +0100 Subject: [PATCH 07/12] Fix 'Select port on upload' error message --- app/src/processing/app/Editor.java | 2 + app/src/processing/app/SketchController.java | 4 -- .../src/cc/arduino/UploaderUtils.java | 3 - .../packages/uploaders/SerialUploader.java | 57 +++++++++---------- build/shared/lib/preferences.txt | 4 +- 5 files changed, 30 insertions(+), 40 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index cfaea455e03..fef31f2c05c 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -2345,6 +2345,8 @@ private void handleBurnBootloader() { SwingUtilities.invokeLater(() -> statusError(tr("Error while burning bootloader."))); // error message will already be visible } + } catch (SerialNotFoundException e) { + SwingUtilities.invokeLater(() -> statusError(tr("Error while burning bootloader: please select a serial port."))); } catch (PreferencesMapException e) { SwingUtilities.invokeLater(() -> { statusError(I18n.format( diff --git a/app/src/processing/app/SketchController.java b/app/src/processing/app/SketchController.java index 392422c5923..89f1a35167f 100644 --- a/app/src/processing/app/SketchController.java +++ b/app/src/processing/app/SketchController.java @@ -709,10 +709,6 @@ private boolean upload(String suggestedClassName, boolean usingProgrammer) throw UploaderUtils uploaderInstance = new UploaderUtils(); Uploader uploader = uploaderInstance.getUploaderByPreferences(false); - if (uploader == null) { - editor.statusError(tr("Please select a Port before Upload")); - return false; - } EditorConsole.setCurrentEditorConsole(editor.console); diff --git a/arduino-core/src/cc/arduino/UploaderUtils.java b/arduino-core/src/cc/arduino/UploaderUtils.java index 9987354a37d..875f41d7676 100644 --- a/arduino-core/src/cc/arduino/UploaderUtils.java +++ b/arduino-core/src/cc/arduino/UploaderUtils.java @@ -48,9 +48,6 @@ public Uploader getUploaderByPreferences(boolean noUploadPort) { BoardPort boardPort = null; if (!noUploadPort) { String port = PreferencesData.get("serial.port"); - if (port == null || port.isEmpty()) { - return null; - } boardPort = BaseNoGui.getDiscoveryManager().find(port); } diff --git a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java index 9d6c29eaa88..4a322fcbe0b 100644 --- a/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -41,6 +41,7 @@ import processing.app.debug.RunnerException; import processing.app.debug.TargetPlatform; import processing.app.helpers.PreferencesMap; +import processing.app.helpers.PreferencesMapException; import processing.app.helpers.StringReplacer; import java.io.File; @@ -105,17 +106,11 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String else prefs.put("upload.verify", prefs.get("upload.params.noverify", "")); - boolean uploadResult; try { - String pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); - uploadResult = executeUploadCommand(cmd); - } catch (Exception e) { - throw new RunnerException(e); + return runCommand("upload.pattern", prefs); } finally { BaseNoGui.getDiscoveryManager().getSerialDiscoverer().pausePolling(false); } - return uploadResult; } // need to do a little dance for Leonardo and derivatives: @@ -127,7 +122,7 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String boolean doTouch = prefs.getBoolean("upload.use_1200bps_touch"); boolean waitForUploadPort = prefs.getBoolean("upload.wait_for_upload_port"); - String userSelectedUploadPort = prefs.getOrExcept("serial.port"); + String userSelectedUploadPort = prefs.get("serial.port", ""); String actualUploadPort = null; if (doTouch) { @@ -177,7 +172,7 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String Thread.sleep(100); } - BoardPort boardPort = BaseNoGui.getDiscoveryManager().find(PreferencesData.get("serial.port")); + BoardPort boardPort = BaseNoGui.getDiscoveryManager().find(PreferencesData.get("serial.port", "")); try { prefs.put("serial.port.iserial", boardPort.getPrefs().getOrExcept("iserial")); } catch (Exception e) { @@ -199,13 +194,7 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String boolean uploadResult; try { - String pattern = prefs.getOrExcept("upload.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); - uploadResult = executeUploadCommand(cmd); - } catch (RunnerException e) { - throw e; - } catch (Exception e) { - throw new RunnerException(e); + uploadResult = runCommand("upload.pattern", prefs); } finally { BaseNoGui.getDiscoveryManager().getSerialDiscoverer().pausePolling(false); } @@ -328,15 +317,7 @@ private boolean uploadUsingProgrammer(String buildPath, String className) throws else prefs.put("program.verify", prefs.get("program.params.noverify", "")); - try { - String pattern = prefs.getOrExcept("program.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); - return executeUploadCommand(cmd); - } catch (RunnerException e) { - throw e; - } catch (Exception e) { - throw new RunnerException(e); - } + return runCommand("program.pattern", prefs); } @Override @@ -393,13 +374,27 @@ public boolean burnBootloader() throws Exception { new LoadVIDPIDSpecificPreferences().load(prefs); - String pattern = prefs.getOrExcept("erase.pattern"); - String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); - if (!executeUploadCommand(cmd)) + if (!runCommand("erase.pattern", prefs)) return false; - pattern = prefs.getOrExcept("bootloader.pattern"); - cmd = StringReplacer.formatAndSplit(pattern, prefs); - return executeUploadCommand(cmd); + return runCommand("bootloader.pattern", prefs); + } + + private boolean runCommand(String patternKey, PreferencesMap prefs) throws Exception, RunnerException { + try { + String pattern = prefs.getOrExcept(patternKey); + StringReplacer.checkIfRequiredKeyIsMissingOrExcept("serial.port", pattern, prefs); + String[] cmd = StringReplacer.formatAndSplit(pattern, prefs); + return executeUploadCommand(cmd); + } catch (RunnerException e) { + throw e; + } catch (PreferencesMapException e) { + if (e.getMessage().equals("serial.port")) { + throw new SerialNotFoundException(e); + } + throw e; + } catch (Exception e) { + throw new RunnerException(e); + } } } diff --git a/build/shared/lib/preferences.txt b/build/shared/lib/preferences.txt index 7e7fd7c381c..156775c1d41 100644 --- a/build/shared/lib/preferences.txt +++ b/build/shared/lib/preferences.txt @@ -267,8 +267,8 @@ programmer = arduino:avrispmkii upload.using = bootloader upload.verify = true -#default port is empty to prevent running AVRDUDE before Port selected (issue #7943) -serial.port= +# default port is not defined to prevent running AVRDUDE before Port selected (issue #7943) +#serial.port= serial.databits=8 serial.stopbits=1 serial.parity=N From 89ff7b24a2865508a09d20a1e43ddc981e28c855 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 12:41:48 +0100 Subject: [PATCH 08/12] Show port on status bar only when selected --- app/src/processing/app/EditorLineStatus.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/processing/app/EditorLineStatus.java b/app/src/processing/app/EditorLineStatus.java index 7d4e80b6577..f71dd4573fe 100644 --- a/app/src/processing/app/EditorLineStatus.java +++ b/app/src/processing/app/EditorLineStatus.java @@ -110,11 +110,17 @@ public void paintComponent(Graphics graphics) { g.drawString(text, scale(6), baseline); g.setColor(messageForeground); - String tmp = I18n.format(tr("{0} on {1}"), name, serialport); - - Rectangle2D bounds = g.getFontMetrics().getStringBounds(tmp, null); - - g.drawString(tmp, size.width - (int) bounds.getWidth() - RESIZE_IMAGE_SIZE, + + String statusText; + if (serialport != null && !serialport.isEmpty()) { + statusText = I18n.format(tr("{0} on {1}"), name, serialport); + } else { + statusText = name; + } + + Rectangle2D bounds = g.getFontMetrics().getStringBounds(statusText, null); + + g.drawString(statusText, size.width - (int) bounds.getWidth() - RESIZE_IMAGE_SIZE, baseline); if (OSUtils.isMacOS()) { From d903d6b397f189ee9113818f0a7d8dc278a5c882 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 9 Nov 2018 18:36:47 +0100 Subject: [PATCH 09/12] Nicer serial port selection dialog box --- app/src/processing/app/Editor.java | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index fef31f2c05c..b96b349b80d 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -1961,26 +1961,24 @@ private boolean serialPrompt() { names[i] = portMenu.getItem(i).getText(); } - // FIXME: This is horribly unreadable - String result = (String) - JOptionPane.showInputDialog(this, - I18n.format( - tr("Serial port {0} not found.\n" + - "Retry the upload with another serial port?"), - PreferencesData.get("serial.port") - ), - "Serial port not found", - JOptionPane.PLAIN_MESSAGE, - null, - names, - 0); - if (result == null) return false; + String port = PreferencesData.get("serial.port"); + String title; + if (port == null || port.isEmpty()) { + title = tr("Serial port not selected."); + } else { + title = I18n.format(tr("Serial port {0} not found."), port); + } + String question = tr("Retry the upload with another serial port?"); + String result = (String) JOptionPane + .showInputDialog(this, title + "\n" + question, title, + JOptionPane.PLAIN_MESSAGE, null, names, 0); + if (result == null) + return false; selectSerialPort(result); base.onBoardOrPortChange(); return true; } - /** * Called by Sketch → Export. * Handles calling the export() function on sketch, and From c1c8d5fdf91b160564c3dc8089ddf1ad7ed7a5e9 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 12 Nov 2018 13:33:10 +0100 Subject: [PATCH 10/12] Editor: the serial port selection dialog now works --- app/src/processing/app/Editor.java | 53 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index b96b349b80d..f39bdb90e70 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -35,7 +35,6 @@ import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; @@ -983,21 +982,6 @@ private void addInternalTools(JMenu menu) { } - class SerialMenuListener implements ActionListener { - - private final String serialPort; - - public SerialMenuListener(String serialPort) { - this.serialPort = serialPort; - } - - public void actionPerformed(ActionEvent e) { - selectSerialPort(serialPort); - base.onBoardOrPortChange(); - } - - } - private void selectSerialPort(String name) { if(portMenu == null) { System.out.println(tr("serialMenu is null")); @@ -1045,6 +1029,24 @@ private void selectSerialPort(String name) { //System.out.println("set to " + get("serial.port")); } + class BoardPortJCheckBoxMenuItem extends JCheckBoxMenuItem { + private BoardPort port; + + public BoardPortJCheckBoxMenuItem(BoardPort port) { + super(port.getLabel()); + addActionListener(e -> { + selectSerialPort(port.getAddress()); + base.onBoardOrPortChange(); + }); + this.port = port; + } + + @Override + public String toString() { + // This is required for serialPrompt() + return port.getLabel(); + } + } private void populatePortMenu() { portMenu.removeAll(); @@ -1081,10 +1083,9 @@ public int compare(BoardPort o1, BoardPort o2) { portMenu.add(lastProtocolMenuItem); } String address = port.getAddress(); - String label = port.getLabel(); - JCheckBoxMenuItem item = new JCheckBoxMenuItem(label, address.equals(selectedPort)); - item.addActionListener(new SerialMenuListener(address)); + BoardPortJCheckBoxMenuItem item = new BoardPortJCheckBoxMenuItem(port); + item.setSelected(address.equals(selectedPort)); portMenu.add(item); } @@ -1955,10 +1956,10 @@ public boolean handleSaveAs() { private boolean serialPrompt() { - int count = portMenu.getItemCount(); - Object[] names = new Object[count]; - for (int i = 0; i < count; i++) { - names[i] = portMenu.getItem(i).getText(); + List items = new ArrayList<>(); + for (int i = 0; i < portMenu.getItemCount(); i++) { + if (portMenu.getItem(i) instanceof BoardPortJCheckBoxMenuItem) + items.add((BoardPortJCheckBoxMenuItem) portMenu.getItem(i)); } String port = PreferencesData.get("serial.port"); @@ -1969,12 +1970,12 @@ private boolean serialPrompt() { title = I18n.format(tr("Serial port {0} not found."), port); } String question = tr("Retry the upload with another serial port?"); - String result = (String) JOptionPane + BoardPortJCheckBoxMenuItem result = (BoardPortJCheckBoxMenuItem) JOptionPane .showInputDialog(this, title + "\n" + question, title, - JOptionPane.PLAIN_MESSAGE, null, names, 0); + JOptionPane.PLAIN_MESSAGE, null, items.toArray(), 0); if (result == null) return false; - selectSerialPort(result); + result.doClick(); base.onBoardOrPortChange(); return true; } From 13e72be7bf8a45d09e52871b7097e0c8583347c0 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 12 Nov 2018 13:40:43 +0100 Subject: [PATCH 11/12] Editor: fixed port ordering in tools menu --- app/src/processing/app/Editor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index f39bdb90e70..043b7285569 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -1060,7 +1060,8 @@ private void populatePortMenu() { Collections.sort(ports, new Comparator() { @Override public int compare(BoardPort o1, BoardPort o2) { - return BOARD_PROTOCOLS_ORDER.indexOf(o1.getProtocol()) - BOARD_PROTOCOLS_ORDER.indexOf(o2.getProtocol()); + return (BOARD_PROTOCOLS_ORDER.indexOf(o1.getProtocol()) - BOARD_PROTOCOLS_ORDER.indexOf(o2.getProtocol())) * 10 + + o1.getAddress().compareTo(o2.getAddress()); } }); From d99a31c2cf0307b0b20e4b60e919da4730928ffc Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 13 Nov 2018 10:38:05 +0100 Subject: [PATCH 12/12] Better error for 'no serial ports available' See https://github.com/arduino/Arduino/pull/8194#issuecomment-438180384 --- app/src/processing/app/Editor.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 043b7285569..5a53e90bd46 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -2036,9 +2036,15 @@ public void run() { statusNotice(tr("Done uploading.")); } } catch (SerialNotFoundException e) { - if (portMenu.getItemCount() == 0) statusError(e); - else if (serialPrompt()) run(); - else statusNotice(tr("Upload canceled.")); + if (portMenu.getItemCount() == 0) { + statusError(tr("Serial port not selected.")); + } else { + if (serialPrompt()) { + run(); + } else { + statusNotice(tr("Upload canceled.")); + } + } } catch (PreferencesMapException e) { statusError(I18n.format( tr("Error while uploading: missing '{0}' configuration parameter"),