From 590e30992e9deeaa62dac33e534c50232063970a Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 13 May 2014 14:47:25 +0200 Subject: [PATCH 1/3] Merge "Upload" and "Upload using programmer" options This adds a special value "internal" for the "programmer" preference. When "programmer" is set to "internal", the regular bootloader upload is used, as defined by boards.txt. For other values of the "programmer" entry, the relevant info from programmers.txt is used. This resolves #2046. --- app/src/cc/arduino/packages/Uploader.java | 2 +- .../packages/uploaders/SSHUploader.java | 4 +- .../packages/uploaders/SerialUploader.java | 20 +++--- app/src/processing/app/Base.java | 32 +++++----- app/src/processing/app/Editor.java | 63 ++----------------- app/src/processing/app/EditorToolbar.java | 4 +- app/src/processing/app/Sketch.java | 12 ++-- 7 files changed, 47 insertions(+), 90 deletions(-) diff --git a/app/src/cc/arduino/packages/Uploader.java b/app/src/cc/arduino/packages/Uploader.java index 784869fbff6..d5812e79df5 100644 --- a/app/src/cc/arduino/packages/Uploader.java +++ b/app/src/cc/arduino/packages/Uploader.java @@ -71,7 +71,7 @@ protected Uploader() { this.notFoundError = false; } - public abstract boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List warningsAccumulator) throws Exception; + public abstract boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, List warningsAccumulator) throws Exception; public abstract boolean burnBootloader() throws Exception; diff --git a/app/src/cc/arduino/packages/uploaders/SSHUploader.java b/app/src/cc/arduino/packages/uploaders/SSHUploader.java index 213d7a6648d..c23ca51508e 100644 --- a/app/src/cc/arduino/packages/uploaders/SSHUploader.java +++ b/app/src/cc/arduino/packages/uploaders/SSHUploader.java @@ -70,8 +70,8 @@ public String getAuthorizationKey() { } @Override - public boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List warningsAccumulator) throws RunnerException { - if (usingProgrammer) { + public boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, List warningsAccumulator) throws RunnerException { + if (!Preferences.get("programmer").equals("internal")) { throw new RunnerException(_("Network upload using programmer not supported")); } diff --git a/app/src/cc/arduino/packages/uploaders/SerialUploader.java b/app/src/cc/arduino/packages/uploaders/SerialUploader.java index 5cc67afb047..c58f7ab5e89 100644 --- a/app/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/app/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -41,11 +41,23 @@ public class SerialUploader extends Uploader { - public boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List warningsAccumulator) throws Exception { + public boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, List warningsAccumulator) throws Exception { + if (Preferences.get("programmer").equals("internal")) + return uploadUsingBootloader(buildPath, className); + else + return uploadUsingProgrammer(buildPath, className); + } + + public boolean uploadUsingBootloader(String buildPath, String className) throws Exception { // FIXME: Preferences should be reorganized TargetPlatform targetPlatform = Base.getTargetPlatform(); PreferencesMap prefs = Preferences.getMap(); prefs.putAll(Base.getBoardPreferences()); + + // if no protocol is specified for this board, assume it lacks a bootloader + if (prefs.get("upload.protocol") == null) + throw new RunnerException(_("Upload using bootloader not supported for this board")); + String tool = prefs.getOrExcept("upload.tool"); if (tool.contains(":")) { String[] split = tool.split(":", 2); @@ -54,12 +66,6 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String } prefs.putAll(targetPlatform.getTool(tool)); - // if no protocol is specified for this board, assume it lacks a - // bootloader and upload using the selected programmer. - if (usingProgrammer || prefs.get("upload.protocol") == null) { - return uploadUsingProgrammer(buildPath, className); - } - // need to do a little dance for Leonardo and derivatives: // open then close the port at the magic baudrate (usually 1200 bps) first // to signal to the sketch that it should reset into bootloader. after doing diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index c0806157ec4..fbbdc4d6017 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -1588,28 +1588,32 @@ private void selectBoard(TargetBoard targetBoard) { rebuildExamplesMenu(Editor.examplesMenu); } + private void addProgrammerMenuOption(JMenu menu, ButtonGroup group, String id, String name) { + @SuppressWarnings("serial") + AbstractAction action = new AbstractAction(name) { + public void actionPerformed(ActionEvent actionevent) { + Preferences.set("programmer", "" + getValue("id")); + } + }; + action.putValue("id", id); + JMenuItem item = new JRadioButtonMenuItem(action); + if (Preferences.get("programmer").equals(id)) + item.setSelected(true); + group.add(item); + menu.add(item); + } public void rebuildProgrammerMenu(JMenu menu) { menu.removeAll(); ButtonGroup group = new ButtonGroup(); + addProgrammerMenuOption(menu, group, "internal", _("Internal (bootloader)")); + menu.addSeparator(); for (TargetPackage targetPackage : packages.values()) { for (TargetPlatform targetPlatform : targetPackage.platforms()) { for (String programmer : targetPlatform.getProgrammers().keySet()) { String id = targetPackage.getId() + ":" + programmer; - - @SuppressWarnings("serial") - AbstractAction action = new AbstractAction(targetPlatform - .getProgrammer(programmer).get("name")) { - public void actionPerformed(ActionEvent actionevent) { - Preferences.set("programmer", "" + getValue("id")); - } - }; - action.putValue("id", id); - JMenuItem item = new JRadioButtonMenuItem(action); - if (Preferences.get("programmer").equals(id)) - item.setSelected(true); - group.add(item); - menu.add(item); + String name = targetPlatform.getProgrammer(programmer).get("name"); + addProgrammerMenuOption(menu, group, id, name); } } } diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 278b548409e..61685b5583c 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -152,7 +152,6 @@ public class Editor extends JFrame implements RunnerListener { Runnable presentHandler; Runnable stopHandler; Runnable exportHandler; - Runnable exportAppHandler; public Editor(Base ibase, String path, int[] location) throws Exception { @@ -558,15 +557,7 @@ public void actionPerformed(ActionEvent e) { item = newJMenuItem(_("Upload"), 'U'); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - handleExport(false); - } - }); - fileMenu.add(item); - - item = newJMenuItemShift(_("Upload Using Programmer"), 'U'); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - handleExport(true); + handleExport(); } }); fileMenu.add(item); @@ -1410,12 +1401,11 @@ protected void updateRedoState() { public void setHandlers(Runnable runHandler, Runnable presentHandler, Runnable stopHandler, - Runnable exportHandler, Runnable exportAppHandler) { + Runnable exportHandler) { this.runHandler = runHandler; this.presentHandler = presentHandler; this.stopHandler = stopHandler; this.exportHandler = exportHandler; - this.exportAppHandler = exportAppHandler; } @@ -1424,7 +1414,6 @@ public void resetHandlers() { presentHandler = new DefaultPresentHandler(); stopHandler = new DefaultStopHandler(); exportHandler = new DefaultExportHandler(); - exportAppHandler = new DefaultExportAppHandler(); } @@ -2373,13 +2362,13 @@ public boolean serialPrompt() { * Made synchronized to (hopefully) avoid problems of people * hitting export twice, quickly, and horking things up. */ - synchronized public void handleExport(final boolean usingProgrammer) { + synchronized public void handleExport() { //if (!handleExportCheckModified()) return; toolbar.activate(EditorToolbar.EXPORT); console.clear(); status.progress(_("Uploading to I/O Board...")); - new Thread(usingProgrammer ? exportAppHandler : exportHandler).start(); + new Thread(exportHandler).start(); } // DAM: in Arduino, this is upload @@ -2394,49 +2383,7 @@ public void run() { uploading = true; - boolean success = sketch.exportApplet(false); - if (success) { - statusNotice(_("Done uploading.")); - } else { - // error message will already be visible - } - } catch (SerialNotFoundException e) { - populatePortMenu(); - if (serialMenu.getItemCount() == 0) statusError(e); - else if (serialPrompt()) run(); - else statusNotice(_("Upload canceled.")); - } catch (PreferencesMapException e) { - statusError(I18n.format( - _("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(); - } - status.unprogress(); - uploading = false; - //toolbar.clear(); - toolbar.deactivate(EditorToolbar.EXPORT); - } - } - - // DAM: in Arduino, this is upload (with verbose output) - class DefaultExportAppHandler implements Runnable { - public void run() { - - try { - if (serialMonitor != null) { - serialMonitor.close(); - serialMonitor.setVisible(false); - } - - uploading = true; - - boolean success = sketch.exportApplet(true); + boolean success = sketch.exportApplet(); if (success) { statusNotice(_("Done uploading.")); } else { diff --git a/app/src/processing/app/EditorToolbar.java b/app/src/processing/app/EditorToolbar.java index afb469a3bc4..a07be4f1061 100644 --- a/app/src/processing/app/EditorToolbar.java +++ b/app/src/processing/app/EditorToolbar.java @@ -43,7 +43,7 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key /** Titles for each button when the shift key is pressed. */ static final String titleShift[] = { - _("Verify"), _("Upload Using Programmer"), _("New Editor Window"), _("Open in Another Window"), _("Save"), _("Serial Monitor") + _("Verify"), _("Upload"), _("New Editor Window"), _("Open in Another Window"), _("Save"), _("Serial Monitor") }; static final int BUTTON_COUNT = title.length; @@ -350,7 +350,7 @@ public void mousePressed(MouseEvent e) { break; case EXPORT: - editor.handleExport(e.isShiftDown()); + editor.handleExport(); break; case SERIAL: diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index 11a63cae7fe..76cf065870b 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -1593,15 +1593,15 @@ public String build(String buildPath, boolean verbose) throws RunnerException { return null; } - protected boolean exportApplet(boolean usingProgrammer) throws Exception { - return exportApplet(tempBuildFolder.getAbsolutePath(), usingProgrammer); + protected boolean exportApplet() throws Exception { + return exportApplet(tempBuildFolder.getAbsolutePath()); } /** * Handle export to applet. */ - public boolean exportApplet(String appletPath, boolean usingProgrammer) + public boolean exportApplet(String appletPath) throws Exception { prepare(); @@ -1622,7 +1622,7 @@ public boolean exportApplet(String appletPath, boolean usingProgrammer) // } editor.status.progressNotice(_("Uploading...")); - boolean success = upload(appletPath, foundName, usingProgrammer); + boolean success = upload(appletPath, foundName); editor.status.progressUpdate(100); return success; } @@ -1685,7 +1685,7 @@ protected void size(PreferencesMap prefs) throws RunnerException { System.err.println(_("Low memory available, stability problems may occur.")); } - protected boolean upload(String buildPath, String suggestedClassName, boolean usingProgrammer) throws Exception { + protected boolean upload(String buildPath, String suggestedClassName) throws Exception { TargetPlatform target = Base.getTargetPlatform(); String board = Preferences.get("board"); @@ -1716,7 +1716,7 @@ protected boolean upload(String buildPath, String suggestedClassName, boolean us List warningsAccumulator = new LinkedList(); try { - success = uploader.uploadUsingPreferences(getFolder(), buildPath, suggestedClassName, usingProgrammer, warningsAccumulator); + success = uploader.uploadUsingPreferences(getFolder(), buildPath, suggestedClassName, warningsAccumulator); } finally { if (uploader.requiresAuthorization() && !success) { Preferences.remove(uploader.getAuthorizationKey()); From 47d51d57c093901d6d3b28a1580c10645ab8429a Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 13 May 2014 15:03:05 +0200 Subject: [PATCH 2/3] Document the "programmer" preference in the manpage --- build/shared/manpage.adoc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/build/shared/manpage.adoc b/build/shared/manpage.adoc index 30f5072cdce..c625a7899c5 100644 --- a/build/shared/manpage.adoc +++ b/build/shared/manpage.adoc @@ -154,6 +154,20 @@ Below, a few of them are documented but a lot more are available. new temporary build folder is created on every run and deleted again when the application is closed. +*programmer*:: + The programmer to use for programming the board. + +{empty}:: + The value should be in the form "__package__:__id__", where + __package__ is identifier of the vendor (the first level folders + inside the 'hardware' directory). __id__ is looked up in the + programmers.txt file(s) for that vendor. + +{empty}:: + The special value "internal" can be used to select the default + upload method for the board (defined by boards.txt), which + usually means through a serial port and bootloader. + EXIT STATUS ----------- *0*:: Success From 5859893fa5afb0de33b88e922c7dd2b94e282d48 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 13 May 2014 15:59:15 +0200 Subject: [PATCH 3/3] Change the default "programmer" pref to "internal" --- build/shared/lib/preferences.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/shared/lib/preferences.txt b/build/shared/lib/preferences.txt index 784565aaa34..3885cc85f0c 100644 --- a/build/shared/lib/preferences.txt +++ b/build/shared/lib/preferences.txt @@ -252,7 +252,7 @@ software=ARDUINO # Warn when data segment uses greater than this percentage build.warn_data_percentage = 75 -programmer = arduino:avrispmkii +programmer = internal upload.using = bootloader upload.verify = true