diff --git a/app/src/cc/arduino/packages/Uploader.java b/app/src/cc/arduino/packages/Uploader.java index 225dc9869..d39df0d2b 100644 --- a/app/src/cc/arduino/packages/Uploader.java +++ b/app/src/cc/arduino/packages/Uploader.java @@ -72,9 +72,9 @@ public abstract class Uploader implements MessageConsumer { this.notFoundError = false; } - public abstract boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List warningsAccumulator) throws RunnerException; + public abstract boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List warningsAccumulator) throws Exception; - public abstract boolean burnBootloader() throws RunnerException; + public abstract boolean burnBootloader() throws Exception; public boolean requiresAuthorization() { return false; @@ -84,11 +84,11 @@ public abstract class Uploader implements MessageConsumer { return null; } - protected boolean executeUploadCommand(Collection command) throws RunnerException { + protected boolean executeUploadCommand(Collection command) throws Exception { return executeUploadCommand(command.toArray(new String[command.size()])); } - protected boolean executeUploadCommand(String command[]) throws RunnerException { + protected boolean executeUploadCommand(String command[]) throws Exception { notFoundError = false; int result = -1; diff --git a/app/src/cc/arduino/packages/uploaders/SerialUploader.java b/app/src/cc/arduino/packages/uploaders/SerialUploader.java index 7ef45f499..36ef989ea 100644 --- a/app/src/cc/arduino/packages/uploaders/SerialUploader.java +++ b/app/src/cc/arduino/packages/uploaders/SerialUploader.java @@ -33,6 +33,7 @@ import processing.app.*; 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; @@ -43,12 +44,12 @@ import static processing.app.I18n._; public class SerialUploader extends Uploader { - public boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List warningsAccumulator) throws RunnerException { + public boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List warningsAccumulator) 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"))); + prefs.putAll(targetPlatform.getTool(prefs.getOrExcept("upload.tool"))); // if no protocol is specified for this board, assume it lacks a // bootloader and upload using the selected programmer. @@ -69,7 +70,7 @@ public class SerialUploader 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(); @@ -105,9 +106,9 @@ public class SerialUploader 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 { @@ -116,7 +117,7 @@ public class SerialUploader 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) { @@ -207,7 +208,7 @@ public class SerialUploader extends Uploader { throw new RunnerException(_("Couldn't find a Board on the selected port. Check that you have the correct port selected. If it is correct, try pressing the board's reset button after initiating the upload.")); } - public boolean uploadUsingProgrammer(String buildPath, String className) throws RunnerException { + public boolean uploadUsingProgrammer(String buildPath, String className) throws Exception { TargetPlatform targetPlatform = Base.getTargetPlatform(); String programmer = Preferences.get("programmer"); @@ -220,15 +221,15 @@ public class SerialUploader 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 @@ -237,7 +238,7 @@ public class SerialUploader 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) { @@ -245,7 +246,7 @@ public class SerialUploader extends Uploader { } } - public boolean burnBootloader() throws RunnerException { + public boolean burnBootloader() throws Exception { TargetPlatform targetPlatform = Base.getTargetPlatform(); // Find preferences for the selected programmer @@ -267,7 +268,7 @@ public class SerialUploader 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]); @@ -283,20 +284,20 @@ public class SerialUploader 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/Base.java b/app/src/processing/app/Base.java index 6682ed8ed..a7346e7ca 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -1195,10 +1195,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 0dfac02df..d4ac32f99 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -26,6 +26,7 @@ import cc.arduino.packages.UploaderAndMonitorFactory; import com.jcraft.jsch.JSchException; import processing.app.debug.*; import processing.app.forms.PasswordAuthorizationDialog; +import processing.app.helpers.PreferencesMapException; import processing.app.syntax.*; import processing.app.tools.*; import processing.core.*; @@ -2403,6 +2404,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(); @@ -2439,6 +2444,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(); @@ -2541,9 +2550,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 2e1a3943c..8ffe6622e 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -24,7 +24,6 @@ package processing.app; import cc.arduino.packages.UploaderAndMonitorFactory; -import org.apache.commons.codec.digest.DigestUtils; import cc.arduino.packages.Uploader; import processing.app.debug.*; @@ -1583,7 +1582,7 @@ public class Sketch { * Handle export to applet. */ public boolean exportApplet(String appletPath, boolean usingProgrammer) - throws RunnerException, IOException { + throws Exception { prepare(); @@ -1661,7 +1660,7 @@ public class Sketch { System.out.println(_("Low memory available, stability problems may occur")); } - protected boolean upload(String buildPath, String suggestedClassName, boolean usingProgrammer) throws RunnerException { + protected boolean upload(String buildPath, String suggestedClassName, boolean usingProgrammer) throws Exception { TargetPlatform target = Base.getTargetPlatform(); String board = Preferences.get("board"); 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/libraries/SoftwareSerial/keywords.txt b/hardware/arduino/avr/libraries/SoftwareSerial/keywords.txt index 3f36dfc80..aaea17c20 100644 --- a/hardware/arduino/avr/libraries/SoftwareSerial/keywords.txt +++ b/hardware/arduino/avr/libraries/SoftwareSerial/keywords.txt @@ -1,6 +1,6 @@ ####################################### # Syntax Coloring Map for SoftwareSerial -# (formely NewSoftSerial) +# (formerly NewSoftSerial) ####################################### ####################################### 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}"