diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 72eae3f18..d2be82822 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -1169,10 +1169,15 @@ public class Base { continue; } - Library lib = Library.create(subfolder); - // (also replace previously found libs with the same name) - if (lib != null) - res.addOrReplace(lib); + try { + Library lib = Library.create(subfolder); + // (also replace previously found libs with the same name) + if (lib != null) + res.addOrReplace(lib); + } catch (IOException e) { + System.out.println(I18n.format(_("Invalid library found in {0}: {1}"), + subfolder, e.getMessage())); + } } return res; } diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 621d1bfc9..42413b267 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -23,6 +23,7 @@ package processing.app; import processing.app.debug.*; +import processing.app.helpers.PreferencesMapException; import processing.app.syntax.*; import processing.app.tools.*; import processing.core.*; @@ -2432,6 +2433,10 @@ public class Editor extends JFrame implements RunnerListener { 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(); @@ -2468,6 +2473,10 @@ public class Editor extends JFrame implements RunnerListener { 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(); @@ -2543,9 +2552,10 @@ public class Editor extends JFrame implements RunnerListener { statusError(_("Error while burning bootloader.")); // error message will already be visible } - } catch (RunnerException e) { - statusError(_("Error while burning bootloader.")); - e.printStackTrace(); + } catch (PreferencesMapException e) { + statusError(I18n.format( + _("Error while burning bootloader: missing '{0}' configuration parameter"), + e.getMessage())); //statusError(e); } catch (Exception e) { statusError(_("Error while burning bootloader.")); diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index ee1c82f78..2fead5b88 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -1581,7 +1581,7 @@ public class Sketch { * Handle export to applet. */ public boolean exportApplet(String appletPath, boolean usingProgrammer) - throws RunnerException, IOException, SerialException { + throws Exception { prepare(); @@ -1660,7 +1660,7 @@ public class Sketch { } protected String upload(String buildPath, String suggestedClassName, boolean usingProgrammer) - throws RunnerException, SerialException { + throws Exception { Uploader uploader; diff --git a/app/src/processing/app/debug/BasicUploader.java b/app/src/processing/app/debug/BasicUploader.java index 1909c464a..6daa5b4e9 100644 --- a/app/src/processing/app/debug/BasicUploader.java +++ b/app/src/processing/app/debug/BasicUploader.java @@ -37,6 +37,7 @@ import processing.app.Preferences; import processing.app.Serial; import processing.app.SerialException; import processing.app.helpers.PreferencesMap; +import processing.app.helpers.PreferencesMapException; import processing.app.helpers.StringReplacer; import static processing.app.I18n._; @@ -45,12 +46,18 @@ public class BasicUploader extends Uploader { public boolean uploadUsingPreferences(String buildPath, String className, boolean usingProgrammer) - throws RunnerException, SerialException { + throws Exception { // FIXME: Preferences should be reorganized TargetPlatform targetPlatform = Base.getTargetPlatform(); PreferencesMap prefs = Preferences.getMap(); prefs.putAll(Base.getBoardPreferences()); - prefs.putAll(targetPlatform.getTool(prefs.get("upload.tool"))); + String tool = prefs.getOrExcept("upload.tool"); + if (tool.contains(":")) { + String[] split = tool.split(":", 2); + targetPlatform = Base.getCurrentTargetPlatformFromPackage(split[0]); + tool = split[1]; + } + prefs.putAll(targetPlatform.getTool(tool)); // if no protocol is specified for this board, assume it lacks a // bootloader and upload using the selected programmer. @@ -71,7 +78,7 @@ public class BasicUploader extends Uploader { boolean waitForUploadPort = (t != null) && t.equals("true"); if (doTouch) { - String uploadPort = prefs.get("serial.port"); + String uploadPort = prefs.getOrExcept("serial.port"); try { // Toggle 1200 bps on selected serial port to force board reset. List before = Serial.list(); @@ -109,9 +116,9 @@ public class BasicUploader extends Uploader { prefs.put("build.path", buildPath); prefs.put("build.project_name", className); if (verbose) - prefs.put("upload.verbose", prefs.get("upload.params.verbose")); + prefs.put("upload.verbose", prefs.getOrExcept("upload.params.verbose")); else - prefs.put("upload.verbose", prefs.get("upload.params.quiet")); + prefs.put("upload.verbose", prefs.getOrExcept("upload.params.quiet")); boolean uploadResult; try { @@ -120,7 +127,7 @@ public class BasicUploader extends Uploader { // flushSerialBuffer(); // } - String pattern = prefs.get("upload.pattern"); + String pattern = prefs.getOrExcept("upload.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); uploadResult = executeUploadCommand(cmd); } catch (Exception e) { @@ -211,7 +218,7 @@ public class BasicUploader extends Uploader { } public boolean uploadUsingProgrammer(String buildPath, String className) - throws RunnerException { + throws Exception { TargetPlatform targetPlatform = Base.getTargetPlatform(); String programmer = Preferences.get("programmer"); @@ -224,15 +231,15 @@ public class BasicUploader extends Uploader { PreferencesMap prefs = Preferences.getMap(); prefs.putAll(Base.getBoardPreferences()); prefs.putAll(targetPlatform.getProgrammer(programmer)); - prefs.putAll(targetPlatform.getTool(prefs.get("program.tool"))); + prefs.putAll(targetPlatform.getTool(prefs.getOrExcept("program.tool"))); prefs.put("build.path", buildPath); prefs.put("build.project_name", className); if (verbose) - prefs.put("program.verbose", prefs.get("program.params.verbose")); + prefs.put("program.verbose", prefs.getOrExcept("program.params.verbose")); else - prefs.put("program.verbose", prefs.get("program.params.quiet")); + prefs.put("program.verbose", prefs.getOrExcept("program.params.quiet")); try { // if (prefs.get("program.disable_flushing") == null @@ -241,7 +248,7 @@ public class BasicUploader extends Uploader { // flushSerialBuffer(); // } - String pattern = prefs.get("program.pattern"); + String pattern = prefs.getOrExcept("program.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); return executeUploadCommand(cmd); } catch (Exception e) { @@ -249,7 +256,7 @@ public class BasicUploader extends Uploader { } } - public boolean burnBootloader() throws RunnerException { + public boolean burnBootloader() throws RunnerException, PreferencesMapException { TargetPlatform targetPlatform = Base.getTargetPlatform(); // Find preferences for the selected programmer @@ -272,7 +279,7 @@ public class BasicUploader extends Uploader { // Create configuration for bootloader tool PreferencesMap toolPrefs = new PreferencesMap(); - String tool = prefs.get("bootloader.tool"); + String tool = prefs.getOrExcept("bootloader.tool"); if (tool.contains(":")) { String[] split = tool.split(":", 2); TargetPlatform platform = Base.getCurrentTargetPlatformFromPackage(split[0]); @@ -291,20 +298,20 @@ public class BasicUploader extends Uploader { // Merge tool with global configuration prefs.putAll(toolPrefs); if (verbose) { - prefs.put("erase.verbose", prefs.get("erase.params.verbose")); - prefs.put("bootloader.verbose", prefs.get("bootloader.params.verbose")); + prefs.put("erase.verbose", prefs.getOrExcept("erase.params.verbose")); + prefs.put("bootloader.verbose", prefs.getOrExcept("bootloader.params.verbose")); } else { - prefs.put("erase.verbose", prefs.get("erase.params.quiet")); - prefs.put("bootloader.verbose", prefs.get("bootloader.params.quiet")); + prefs.put("erase.verbose", prefs.getOrExcept("erase.params.quiet")); + prefs.put("bootloader.verbose", prefs.getOrExcept("bootloader.params.quiet")); } try { - String pattern = prefs.get("erase.pattern"); + String pattern = prefs.getOrExcept("erase.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); if (!executeUploadCommand(cmd)) return false; - pattern = prefs.get("bootloader.pattern"); + pattern = prefs.getOrExcept("bootloader.pattern"); cmd = StringReplacer.formatAndSplit(pattern, prefs, true); return executeUploadCommand(cmd); } catch (Exception e) { diff --git a/app/src/processing/app/debug/TargetPackage.java b/app/src/processing/app/debug/TargetPackage.java index 020cf89e3..68c1a488c 100644 --- a/app/src/processing/app/debug/TargetPackage.java +++ b/app/src/processing/app/debug/TargetPackage.java @@ -23,11 +23,14 @@ */ package processing.app.debug; +import static processing.app.I18n._; + import java.io.File; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; +import processing.app.I18n; import processing.app.helpers.filefilters.OnlyDirs; public class TargetPackage { @@ -47,8 +50,18 @@ public class TargetPackage { if (!subFolder.exists() || !subFolder.canRead()) continue; String arch = subFolder.getName(); - TargetPlatform platform = new TargetPlatform(arch, subFolder, this); - platforms.put(arch, platform); + try { + TargetPlatform platform = new TargetPlatform(arch, subFolder, this); + platforms.put(arch, platform); + } catch (TargetPlatformException e) { + System.out.println(e.getMessage()); + } + } + + if (platforms.size() == 0) { + throw new TargetPlatformException(I18n + .format(_("No valid hardware definitions found in folder {0}."), + _folder.getName())); } } diff --git a/app/src/processing/app/debug/Uploader.java b/app/src/processing/app/debug/Uploader.java index 50d7a5e13..1a240831f 100644 --- a/app/src/processing/app/debug/Uploader.java +++ b/app/src/processing/app/debug/Uploader.java @@ -35,7 +35,6 @@ import java.util.Collection; import processing.app.I18n; import processing.app.Preferences; import processing.app.Serial; -import processing.app.SerialException; import processing.app.SerialNotFoundException; public abstract class Uploader implements MessageConsumer { @@ -52,11 +51,11 @@ public abstract class Uploader implements MessageConsumer { boolean verbose; public abstract boolean uploadUsingPreferences(String buildPath, String className, boolean usingProgrammer) - throws RunnerException, SerialException; + throws Exception; - public abstract boolean burnBootloader() throws RunnerException; + public abstract boolean burnBootloader() throws Exception; - protected void flushSerialBuffer() throws RunnerException, SerialException { + protected void flushSerialBuffer() throws Exception { // Cleanup the serial buffer try { Serial serialPort = new Serial(); @@ -87,14 +86,14 @@ public abstract class Uploader implements MessageConsumer { } protected boolean executeUploadCommand(Collection commandDownloader) - throws RunnerException { + throws Exception { String[] commandArray = new String[commandDownloader.size()]; commandDownloader.toArray(commandArray); return executeUploadCommand(commandArray); } protected boolean executeUploadCommand(String commandArray[]) - throws RunnerException + throws Exception { firstErrorFound = false; // haven't found any errors yet secondErrorFound = false; diff --git a/app/src/processing/app/helpers/PreferencesMap.java b/app/src/processing/app/helpers/PreferencesMap.java index e4729c166..cd3bb7dd2 100644 --- a/app/src/processing/app/helpers/PreferencesMap.java +++ b/app/src/processing/app/helpers/PreferencesMap.java @@ -245,6 +245,22 @@ public class PreferencesMap extends LinkedHashMap { return res; } + /** + * Returns the value to which the specified key is mapped, or throws a + * PreferencesMapException if not found + * + * @param k + * the key whose associated value is to be returned + * @return the value to which the specified key is mapped + * @throws PreferencesMapException + */ + public String getOrExcept(String k) throws PreferencesMapException { + String r = get(k); + if (r == null) + throw new PreferencesMapException(k); + return r; + } + @Override public String toString() { return toString(""); diff --git a/app/src/processing/app/helpers/PreferencesMapException.java b/app/src/processing/app/helpers/PreferencesMapException.java new file mode 100644 index 000000000..456e476fc --- /dev/null +++ b/app/src/processing/app/helpers/PreferencesMapException.java @@ -0,0 +1,10 @@ +package processing.app.helpers; + +@SuppressWarnings("serial") +public class PreferencesMapException extends Exception { + + public PreferencesMapException(String message) { + super(message); + } + +} diff --git a/build/shared/examples/02.Digital/tonePitchFollower/tonePitchFollower.ino b/build/shared/examples/02.Digital/tonePitchFollower/tonePitchFollower.ino index e74c7b343..69caff744 100644 --- a/build/shared/examples/02.Digital/tonePitchFollower/tonePitchFollower.ino +++ b/build/shared/examples/02.Digital/tonePitchFollower/tonePitchFollower.ino @@ -4,7 +4,7 @@ Plays a pitch that changes based on a changing analog input circuit: - * 8-ohm speaker on digital pin 8 + * 8-ohm speaker on digital pin 9 * photoresistor on analog 0 to 5V * 4.7K resistor on analog 0 to ground diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index d9e9b863f..bad682ea5 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -17,6 +17,7 @@ ARDUINO 1.5.3 BETA * avr: Added support for Flash strings on String class (Jantje) * Added support for floating point numbers in String class (Tevin Zhang, SebiTimeWaster) * sam: Fixed String buffer overflows (Paul Stoffregen) +* avr: Added recipe for assembly files (C. A. Church) [libraries] * sam: Added CAN library (still in early stage of development) (Palliser) diff --git a/hardware/arduino/avr/platform.txt b/hardware/arduino/avr/platform.txt index 6bbe078ab..eaf946947 100644 --- a/hardware/arduino/avr/platform.txt +++ b/hardware/arduino/avr/platform.txt @@ -40,6 +40,9 @@ recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mmcu={b ## Compile c++ files recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" +## Compile S files +recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" + ## Create archives recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} "{build.path}/{archive_file}" "{object_file}" diff --git a/libraries/SoftwareSerial/keywords.txt b/libraries/SoftwareSerial/keywords.txt index 3f36dfc80..aaea17c20 100644 --- a/libraries/SoftwareSerial/keywords.txt +++ b/libraries/SoftwareSerial/keywords.txt @@ -1,6 +1,6 @@ ####################################### # Syntax Coloring Map for SoftwareSerial -# (formely NewSoftSerial) +# (formerly NewSoftSerial) ####################################### #######################################