mirror of https://github.com/noisymime/Arduino.git
Merge remote branch 'ricklon/platforms' into new-extension
This commit is contained in:
commit
f7f9f78b5a
|
@ -956,8 +956,20 @@ public class Base {
|
||||||
importToLibraryTable = new HashMap<String, File>();
|
importToLibraryTable = new HashMap<String, File>();
|
||||||
|
|
||||||
// Add from the "libraries" subfolder in the Processing directory
|
// Add from the "libraries" subfolder in the Processing directory
|
||||||
|
//Choose which library to add by chip platform
|
||||||
|
|
||||||
try {
|
try {
|
||||||
addLibraries(importMenu, librariesFolder);
|
//Find the current target. Get the platform, and then select the correct name and core path.
|
||||||
|
String platformname = this.getBoardPreferences().get("platform");
|
||||||
|
String targetname = this.getPlatformPreferences(platformname).get("name");
|
||||||
|
String libraryPath = this.getPlatformPreferences(platformname).get("library.core.path");
|
||||||
|
|
||||||
|
JMenuItem platformItem = new JMenuItem(targetname);
|
||||||
|
platformItem.setEnabled(false);
|
||||||
|
importMenu.add(platformItem);
|
||||||
|
importMenu.addSeparator();
|
||||||
|
addLibraries(importMenu, getCoreLibraries(libraryPath));
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -1005,6 +1017,8 @@ public class Base {
|
||||||
//System.out.println("Switching to " + target + ":" + board);
|
//System.out.println("Switching to " + target + ":" + board);
|
||||||
Preferences.set("target", (String) getValue("target"));
|
Preferences.set("target", (String) getValue("target"));
|
||||||
Preferences.set("board", (String) getValue("board"));
|
Preferences.set("board", (String) getValue("board"));
|
||||||
|
//Debug: created new imports menu based on board
|
||||||
|
rebuildImportMenu(activeEditor.importMenu);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
action.putValue("target", target.getName());
|
action.putValue("target", target.getName());
|
||||||
|
@ -1518,6 +1532,10 @@ public class Base {
|
||||||
return getContentFile("hardware");
|
return getContentFile("hardware");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Get the core libraries
|
||||||
|
static public File getCoreLibraries(String path) {
|
||||||
|
return getContentFile(path);
|
||||||
|
}
|
||||||
|
|
||||||
static public String getHardwarePath() {
|
static public String getHardwarePath() {
|
||||||
return getHardwareFolder().getAbsolutePath();
|
return getHardwareFolder().getAbsolutePath();
|
||||||
|
@ -1535,20 +1553,105 @@ public class Base {
|
||||||
|
|
||||||
|
|
||||||
static public Target getTarget() {
|
static public Target getTarget() {
|
||||||
return Base.targetsTable.get(Preferences.get("target"));
|
System.out.println("Base.targetsTable.get(Preferences.get(\"target\"))" + Base.targetsTable.get(Preferences.get("target")));
|
||||||
|
System.out.println("Preferences.get(\"target\")" + Preferences.get("target"));
|
||||||
|
Target target = Base.targetsTable.get(Preferences.get("target"));
|
||||||
|
if (target == null) {
|
||||||
|
System.out.println("default target is not in list. Replace with default.");
|
||||||
|
Preferences.set("target", "arduino");
|
||||||
|
target = Base.targetsTable.get(Preferences.get("target"));
|
||||||
|
}
|
||||||
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static public Map<String, String> getBoardPreferences() {
|
static public Map<String, String> getPlatformPreferences() {
|
||||||
|
System.out.println("getPlatformPreferences() no arguments: start");
|
||||||
Target target = getTarget();
|
Target target = getTarget();
|
||||||
if (target == null) return new LinkedHashMap();
|
//if (target == null) return new LinkedHashMap();
|
||||||
Map map = target.getBoards();
|
Map map = target.getPlatforms();
|
||||||
if (map == null) return new LinkedHashMap();
|
/*
|
||||||
map = (Map) map.get(Preferences.get("board"));
|
if (map == null)
|
||||||
if (map == null) return new LinkedHashMap();
|
{
|
||||||
|
System.err.println("Error loading platforms preference from Target");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//if (map == null) return new LinkedHashMap();
|
||||||
|
map = (Map) map.get(Preferences.get("platform"));
|
||||||
|
//if (map == null) return new LinkedHashMap();
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Get a specific platform
|
||||||
|
static public Map<String, String> getPlatformPreferences(String platformname) {
|
||||||
|
if (platformname == null) {
|
||||||
|
platformname = Preferences.get("platform");
|
||||||
|
|
||||||
|
}
|
||||||
|
System.out.println("getlatformPreferences(String platformname)): start: platformname = " + platformname );
|
||||||
|
Target target = getTarget();
|
||||||
|
if (target == null ) {
|
||||||
|
System.out.println("get target is null. trouble! ");
|
||||||
|
}
|
||||||
|
Map map = target.getPlatforms();
|
||||||
|
map = (Map) map.get(platformname);
|
||||||
|
|
||||||
|
//What if null or defaults to nonexisent platform
|
||||||
|
System.out.println("PlatformName: " + platformname);
|
||||||
|
if (map == null)
|
||||||
|
{
|
||||||
|
System.err.println("Error loading platforms preference from Target");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public Map<String, String> bogusgetBoardPreferences() {
|
||||||
|
System.out.println("getBoardPrefences method: start");
|
||||||
|
Target target = getTarget();
|
||||||
|
if (target == null) {
|
||||||
|
System.out.println("getBoardPrefereces method: target == null");
|
||||||
|
return new LinkedHashMap();
|
||||||
|
}
|
||||||
|
Map map = target.getBoards();
|
||||||
|
if (map == null) {
|
||||||
|
System.out.println("getBoardPrefereces method: target.getBoards() == null");
|
||||||
|
return new LinkedHashMap();
|
||||||
|
}
|
||||||
|
map = (Map) map.get(Preferences.get("board"));
|
||||||
|
if (map == null) {
|
||||||
|
System.out.println("getBoardPrefereces method: Preferences.get(board) == null");
|
||||||
|
return new LinkedHashMap();
|
||||||
|
}
|
||||||
|
//Debug iterate the map
|
||||||
|
Iterator iterator = map.entrySet().iterator();
|
||||||
|
while(iterator.hasNext())
|
||||||
|
{
|
||||||
|
Map.Entry pair = (Map.Entry)iterator.next();
|
||||||
|
if (pair.getValue() == null)
|
||||||
|
{
|
||||||
|
System.out.println("KeyName: " + pair.getKey() + " val: null");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.out.println("KeyName: " + pair.getKey() + " val" + pair.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public Map<String, String> getBoardPreferences() {
|
||||||
|
Target target = getTarget();
|
||||||
|
Map map = new LinkedHashMap();
|
||||||
|
if (target != null) {
|
||||||
|
map = target.getBoards();
|
||||||
|
map = (Map) map.get(Preferences.get("board"));
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
static public File getSketchbookFolder() {
|
static public File getSketchbookFolder() {
|
||||||
return new File(Preferences.get("sketchbook.path"));
|
return new File(Preferences.get("sketchbook.path"));
|
||||||
|
|
|
@ -684,6 +684,9 @@ public class Editor extends JFrame implements RunnerListener {
|
||||||
if (boardsMenu == null) {
|
if (boardsMenu == null) {
|
||||||
boardsMenu = new JMenu("Board");
|
boardsMenu = new JMenu("Board");
|
||||||
base.rebuildBoardsMenu(boardsMenu);
|
base.rebuildBoardsMenu(boardsMenu);
|
||||||
|
//Debug: rebuild imports
|
||||||
|
importMenu.removeAll();
|
||||||
|
base.rebuildImportMenu(importMenu);
|
||||||
}
|
}
|
||||||
menu.add(boardsMenu);
|
menu.add(boardsMenu);
|
||||||
|
|
||||||
|
|
|
@ -776,4 +776,22 @@ public class Preferences {
|
||||||
|
|
||||||
return new SyntaxStyle(color, italic, bold);
|
return new SyntaxStyle(color, italic, bold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//get a Map of the Preferences
|
||||||
|
static public Map<String, String> getMap()
|
||||||
|
{
|
||||||
|
Map globalpreferences = new LinkedHashMap();
|
||||||
|
Enumeration e = table.keys();
|
||||||
|
|
||||||
|
while (e.hasMoreElements())
|
||||||
|
{
|
||||||
|
String key = (String) e.nextElement();
|
||||||
|
//System.out.println("Key: " + key + "Val: " + table.get(key));
|
||||||
|
String value = (String) table.get(key);
|
||||||
|
globalpreferences.put(key, value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return globalpreferences;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1328,9 +1328,12 @@ public class Sketch {
|
||||||
// grab the imports from the code just preproc'd
|
// grab the imports from the code just preproc'd
|
||||||
|
|
||||||
importedLibraries = new ArrayList<File>();
|
importedLibraries = new ArrayList<File>();
|
||||||
|
//Remember to clear library path before building it.
|
||||||
|
libraryPath = "";
|
||||||
for (String item : preprocessor.getExtraImports()) {
|
for (String item : preprocessor.getExtraImports()) {
|
||||||
|
|
||||||
File libFolder = (File) Base.importToLibraryTable.get(item);
|
File libFolder = (File) Base.importToLibraryTable.get(item);
|
||||||
|
//If needed can Debug libraryPath here
|
||||||
|
|
||||||
if (libFolder != null && !importedLibraries.contains(libFolder)) {
|
if (libFolder != null && !importedLibraries.contains(libFolder)) {
|
||||||
importedLibraries.add(libFolder);
|
importedLibraries.add(libFolder);
|
||||||
|
|
|
@ -32,6 +32,7 @@ import processing.core.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.zip.*;
|
import java.util.zip.*;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
|
||||||
|
|
||||||
public class Compiler implements MessageConsumer {
|
public class Compiler implements MessageConsumer {
|
||||||
|
@ -43,10 +44,23 @@ public class Compiler implements MessageConsumer {
|
||||||
Sketch sketch;
|
Sketch sketch;
|
||||||
String buildPath;
|
String buildPath;
|
||||||
String primaryClassName;
|
String primaryClassName;
|
||||||
|
String platform;
|
||||||
|
String board;
|
||||||
|
|
||||||
boolean verbose;
|
boolean verbose;
|
||||||
|
|
||||||
RunnerException exception;
|
RunnerException exception;
|
||||||
|
|
||||||
|
HashMap<String, String> configPreferences;
|
||||||
|
HashMap<String, String> boardPreferences;
|
||||||
|
HashMap<String, String> platformPreferences;
|
||||||
|
|
||||||
|
String avrBasePath;
|
||||||
|
String corePath;
|
||||||
|
|
||||||
|
List<File> objectFiles;
|
||||||
|
ArrayList<String> includePaths;
|
||||||
|
|
||||||
public Compiler() { }
|
public Compiler() { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,13 +80,56 @@ public class Compiler implements MessageConsumer {
|
||||||
this.buildPath = buildPath;
|
this.buildPath = buildPath;
|
||||||
this.primaryClassName = primaryClassName;
|
this.primaryClassName = primaryClassName;
|
||||||
this.verbose = verbose;
|
this.verbose = verbose;
|
||||||
|
objectFiles = new ArrayList<File>();
|
||||||
|
|
||||||
// the pms object isn't used for anything but storage
|
// the pms object isn't used for anything but storage
|
||||||
MessageStream pms = new MessageStream(this);
|
MessageStream pms = new MessageStream(this);
|
||||||
|
|
||||||
String avrBasePath = Base.getAvrBasePath();
|
|
||||||
Map<String, String> boardPreferences = Base.getBoardPreferences();
|
Map<String, String> boardPreferences = Base.getBoardPreferences();
|
||||||
String core = boardPreferences.get("build.core");
|
|
||||||
|
//Check for null platform, and use system default if not found
|
||||||
|
platform = boardPreferences.get("platform");
|
||||||
|
if (platform == null)
|
||||||
|
{
|
||||||
|
platformPreferences = new HashMap(Base.getPlatformPreferences());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
platformPreferences = new HashMap(Base.getPlatformPreferences(platform));
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("////////////////////////////compiler.java is doing stuff/////////////////");
|
||||||
|
//Put all the global preference configuration into one Master configpreferences
|
||||||
|
configPreferences = mergePreferences( Preferences.getMap(), platformPreferences, boardPreferences);
|
||||||
|
avrBasePath = configPreferences.get("compiler.path");
|
||||||
|
if (avrBasePath == null)
|
||||||
|
{
|
||||||
|
avrBasePath = Base.getAvrBasePath();
|
||||||
|
System.out.println("avrBasePath: " + avrBasePath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.out.println("avrBasePath:exists: " + avrBasePath);
|
||||||
|
|
||||||
|
//Put in the system path in the compiler path if available
|
||||||
|
MessageFormat compileFormat = new MessageFormat(avrBasePath);
|
||||||
|
String basePath = System.getProperty("user.dir");
|
||||||
|
if (Base.isMacOS()) {
|
||||||
|
//logger.debug("basePath: " + basePath);
|
||||||
|
basePath += "/Arduino.app/Contents/Resources/Java";
|
||||||
|
}
|
||||||
|
Object[] Args = {basePath};
|
||||||
|
avrBasePath = compileFormat.format( Args );
|
||||||
|
System.out.println("avrBasePath:new: " + avrBasePath);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
this.board = configPreferences.get("board");
|
||||||
|
if (this.board == "")
|
||||||
|
{
|
||||||
|
this.board = "_UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
|
String core = configPreferences.get("build.core");
|
||||||
if (core == null) {
|
if (core == null) {
|
||||||
RunnerException re = new RunnerException("No board selected; please choose a board from the Tools > Board menu.");
|
RunnerException re = new RunnerException("No board selected; please choose a board from the Tools > Board menu.");
|
||||||
re.hideStackTrace();
|
re.hideStackTrace();
|
||||||
|
@ -91,7 +148,7 @@ public class Compiler implements MessageConsumer {
|
||||||
corePath = coreFolder.getAbsolutePath();
|
corePath = coreFolder.getAbsolutePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
String pins = boardPreferences.get("build.pins");
|
String pins = configPreferences.get("build.pins");
|
||||||
String pinsPath = null;
|
String pinsPath = null;
|
||||||
|
|
||||||
if (pins != null) {
|
if (pins != null) {
|
||||||
|
@ -107,11 +164,10 @@ public class Compiler implements MessageConsumer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<File> objectFiles = new ArrayList<File>();
|
|
||||||
|
|
||||||
// 0. include paths for core + all libraries
|
// 0. include paths for core + all libraries
|
||||||
|
|
||||||
List includePaths = new ArrayList();
|
ArrayList<String> includePaths = new ArrayList();
|
||||||
includePaths.add(corePath);
|
includePaths.add(corePath);
|
||||||
if (pinsPath != null) includePaths.add(pinsPath);
|
if (pinsPath != null) includePaths.add(pinsPath);
|
||||||
for (File file : sketch.getImportedLibraries()) {
|
for (File file : sketch.getImportedLibraries()) {
|
||||||
|
@ -119,15 +175,17 @@ public class Compiler implements MessageConsumer {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. compile the sketch (already in the buildPath)
|
// 1. compile the sketch (already in the buildPath)
|
||||||
|
System.out.println("1. compileSketch");
|
||||||
|
compileSketch(avrBasePath, buildPath, includePaths, configPreferences);
|
||||||
|
|
||||||
objectFiles.addAll(
|
|
||||||
compileFiles(avrBasePath, buildPath, includePaths,
|
|
||||||
findFilesInPath(buildPath, "S", false),
|
|
||||||
findFilesInPath(buildPath, "c", false),
|
|
||||||
findFilesInPath(buildPath, "cpp", false),
|
|
||||||
boardPreferences));
|
|
||||||
|
|
||||||
// 2. compile the libraries, outputting .o files to: <buildPath>/<library>/
|
// 2. compile the libraries, outputting .o files to: <buildPath>/<library>/
|
||||||
|
// 2. compile the libraries, outputting .o files to:
|
||||||
|
// <buildPath>/<library>/
|
||||||
|
//Doesn't really use configPreferences
|
||||||
|
System.out.println("2. compileLibraries");
|
||||||
|
compileLibraries(avrBasePath, buildPath, includePaths, configPreferences);
|
||||||
|
/*
|
||||||
|
|
||||||
for (File libraryFolder : sketch.getImportedLibraries()) {
|
for (File libraryFolder : sketch.getImportedLibraries()) {
|
||||||
File outputFolder = new File(buildPath, libraryFolder.getName());
|
File outputFolder = new File(buildPath, libraryFolder.getName());
|
||||||
|
@ -152,10 +210,16 @@ public class Compiler implements MessageConsumer {
|
||||||
// other libraries should not see this library's utility/ folder
|
// other libraries should not see this library's utility/ folder
|
||||||
includePaths.remove(includePaths.size() - 1);
|
includePaths.remove(includePaths.size() - 1);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// 3. compile the core, outputting .o files to <buildPath> and then
|
// 3. compile the core, outputting .o files to <buildPath> and then
|
||||||
// collecting them into the core.a library file.
|
// collecting them into the core.a library file.
|
||||||
|
System.out.println("3. compileCore");
|
||||||
|
System.out.println("corePath: " + corePath);
|
||||||
|
compileCore(avrBasePath, buildPath, corePath, pins, pinsPath, configPreferences);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
includePaths.clear();
|
includePaths.clear();
|
||||||
includePaths.add(corePath); // include path for core only
|
includePaths.add(corePath); // include path for core only
|
||||||
if (pinsPath != null) includePaths.add(pinsPath);
|
if (pinsPath != null) includePaths.add(pinsPath);
|
||||||
|
@ -177,9 +241,12 @@ public class Compiler implements MessageConsumer {
|
||||||
commandAR.add(file.getAbsolutePath());
|
commandAR.add(file.getAbsolutePath());
|
||||||
execAsynchronously(commandAR);
|
execAsynchronously(commandAR);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
// 4. link it all together into the .elf file
|
// 4. link it all together into the .elf file
|
||||||
|
System.out.println("4. compileLink");
|
||||||
|
compileLink(avrBasePath, buildPath, corePath, includePaths, configPreferences);
|
||||||
|
|
||||||
|
/*
|
||||||
List baseCommandLinker = new ArrayList(Arrays.asList(new String[] {
|
List baseCommandLinker = new ArrayList(Arrays.asList(new String[] {
|
||||||
avrBasePath + "avr-gcc",
|
avrBasePath + "avr-gcc",
|
||||||
"-Os",
|
"-Os",
|
||||||
|
@ -206,36 +273,24 @@ public class Compiler implements MessageConsumer {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
List commandObjcopy;
|
List commandObjcopy;
|
||||||
|
*/
|
||||||
|
|
||||||
// 5. extract EEPROM data (from EEMEM directive) to .eep file.
|
// 5. extract EEPROM data (from EEMEM directive) to .eep file.
|
||||||
commandObjcopy = new ArrayList(baseCommandObjcopy);
|
System.out.println("5. compileEep");
|
||||||
commandObjcopy.add(2, "ihex");
|
compileEep(avrBasePath, buildPath, includePaths, configPreferences);
|
||||||
commandObjcopy.set(3, "-j");
|
|
||||||
commandObjcopy.add(".eeprom");
|
|
||||||
commandObjcopy.add("--set-section-flags=.eeprom=alloc,load");
|
|
||||||
commandObjcopy.add("--no-change-warnings");
|
|
||||||
commandObjcopy.add("--change-section-lma");
|
|
||||||
commandObjcopy.add(".eeprom=0");
|
|
||||||
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".elf");
|
|
||||||
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".eep");
|
|
||||||
execAsynchronously(commandObjcopy);
|
|
||||||
|
|
||||||
// 6. build the .hex file
|
// 6. build the .hex file
|
||||||
commandObjcopy = new ArrayList(baseCommandObjcopy);
|
System.out.println("6. compileHex");
|
||||||
commandObjcopy.add(2, "ihex");
|
compileHex(avrBasePath, buildPath, includePaths, configPreferences);
|
||||||
commandObjcopy.add(".eeprom"); // remove eeprom data
|
|
||||||
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".elf");
|
|
||||||
commandObjcopy.add(buildPath + File.separator + primaryClassName + ".hex");
|
|
||||||
execAsynchronously(commandObjcopy);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<File> compileFiles(String avrBasePath,
|
private List<File> compileFiles(String avrBasePath,
|
||||||
String buildPath, List<File> includePaths,
|
String buildPath, ArrayList<String> includePaths,
|
||||||
List<File> sSources,
|
ArrayList<File> sSources,
|
||||||
List<File> cSources, List<File> cppSources,
|
ArrayList<File> cSources, ArrayList<File> cppSources,
|
||||||
Map<String, String> boardPreferences)
|
Map<String, String> boardPreferences)
|
||||||
throws RunnerException {
|
throws RunnerException {
|
||||||
|
|
||||||
|
@ -247,7 +302,7 @@ public class Compiler implements MessageConsumer {
|
||||||
execAsynchronously(getCommandCompilerS(avrBasePath, includePaths,
|
execAsynchronously(getCommandCompilerS(avrBasePath, includePaths,
|
||||||
file.getAbsolutePath(),
|
file.getAbsolutePath(),
|
||||||
objectPath,
|
objectPath,
|
||||||
boardPreferences));
|
configPreferences));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File file : cSources) {
|
for (File file : cSources) {
|
||||||
|
@ -256,7 +311,7 @@ public class Compiler implements MessageConsumer {
|
||||||
execAsynchronously(getCommandCompilerC(avrBasePath, includePaths,
|
execAsynchronously(getCommandCompilerC(avrBasePath, includePaths,
|
||||||
file.getAbsolutePath(),
|
file.getAbsolutePath(),
|
||||||
objectPath,
|
objectPath,
|
||||||
boardPreferences));
|
configPreferences));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File file : cppSources) {
|
for (File file : cppSources) {
|
||||||
|
@ -265,7 +320,7 @@ public class Compiler implements MessageConsumer {
|
||||||
execAsynchronously(getCommandCompilerCPP(avrBasePath, includePaths,
|
execAsynchronously(getCommandCompilerCPP(avrBasePath, includePaths,
|
||||||
file.getAbsolutePath(),
|
file.getAbsolutePath(),
|
||||||
objectPath,
|
objectPath,
|
||||||
boardPreferences));
|
configPreferences));
|
||||||
}
|
}
|
||||||
|
|
||||||
return objectPaths;
|
return objectPaths;
|
||||||
|
@ -278,9 +333,18 @@ public class Compiler implements MessageConsumer {
|
||||||
/**
|
/**
|
||||||
* Either succeeds or throws a RunnerException fit for public consumption.
|
* Either succeeds or throws a RunnerException fit for public consumption.
|
||||||
*/
|
*/
|
||||||
private void execAsynchronously(List commandList) throws RunnerException {
|
private void execAsynchronously(String[] command) throws RunnerException {
|
||||||
String[] command = new String[commandList.size()];
|
|
||||||
commandList.toArray(command);
|
//eliminate any empty array entries
|
||||||
|
List<String> stringList = new ArrayList<String>();
|
||||||
|
for(String string : command) {
|
||||||
|
string = string.trim();
|
||||||
|
if(string != null && string.length() > 0) {
|
||||||
|
stringList.add(string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
command = stringList.toArray(new String[stringList.size()]);
|
||||||
|
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
if (verbose || Preferences.getBoolean("build.verbose")) {
|
if (verbose || Preferences.getBoolean("build.verbose")) {
|
||||||
|
@ -339,6 +403,7 @@ public class Compiler implements MessageConsumer {
|
||||||
re.hideStackTrace();
|
re.hideStackTrace();
|
||||||
throw re;
|
throw re;
|
||||||
}
|
}
|
||||||
|
System.out.println("execAsync: Done.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -403,7 +468,7 @@ public class Compiler implements MessageConsumer {
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
/*
|
||||||
static private List getCommandCompilerS(String avrBasePath, List includePaths,
|
static private List getCommandCompilerS(String avrBasePath, List includePaths,
|
||||||
String sourceName, String objectName, Map<String, String> boardPreferences) {
|
String sourceName, String objectName, Map<String, String> boardPreferences) {
|
||||||
List baseCommandCompiler = new ArrayList(Arrays.asList(new String[] {
|
List baseCommandCompiler = new ArrayList(Arrays.asList(new String[] {
|
||||||
|
@ -425,7 +490,39 @@ public class Compiler implements MessageConsumer {
|
||||||
|
|
||||||
return baseCommandCompiler;
|
return baseCommandCompiler;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ///////////////////////////////////////////////////////////////////////////
|
||||||
|
static private String[] getCommandCompilerS(String avrBasePath,
|
||||||
|
ArrayList<String> includePaths, String sourceName, String objectName,
|
||||||
|
HashMap<String, String> configPreferences)
|
||||||
|
{
|
||||||
|
System.out.println("getCommandCompilerS: start");
|
||||||
|
String baseCommandString = configPreferences.get("recipe.cpp.o.pattern");
|
||||||
|
MessageFormat compileFormat = new MessageFormat(baseCommandString);
|
||||||
|
//getIncludes to String
|
||||||
|
|
||||||
|
String includes = preparePaths(includePaths);
|
||||||
|
Object[] Args = {
|
||||||
|
avrBasePath,
|
||||||
|
configPreferences.get("compiler.cpp.cmd"),
|
||||||
|
configPreferences.get("compiler.S.flags"),
|
||||||
|
configPreferences.get("compiler.cpudef"),
|
||||||
|
configPreferences.get("build.mcu"),
|
||||||
|
configPreferences.get("build.f_cpu"),
|
||||||
|
configPreferences.get("software"),
|
||||||
|
Base.REVISION,
|
||||||
|
includes,
|
||||||
|
sourceName,
|
||||||
|
objectName
|
||||||
|
};
|
||||||
|
|
||||||
|
String command = compileFormat.format( Args );
|
||||||
|
String[] commandArray = command.split("\\|");
|
||||||
|
return commandArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
static private List getCommandCompilerC(String avrBasePath, List includePaths,
|
static private List getCommandCompilerC(String avrBasePath, List includePaths,
|
||||||
String sourceName, String objectName, Map<String, String> boardPreferences) {
|
String sourceName, String objectName, Map<String, String> boardPreferences) {
|
||||||
|
@ -452,7 +549,38 @@ public class Compiler implements MessageConsumer {
|
||||||
|
|
||||||
return baseCommandCompiler;
|
return baseCommandCompiler;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//removed static
|
||||||
|
private String[] getCommandCompilerC(String avrBasePath,
|
||||||
|
ArrayList<String> includePaths, String sourceName, String objectName,
|
||||||
|
HashMap<String, String> configPreferences)
|
||||||
|
{
|
||||||
|
System.out.println("getCommandCompilerC: start");
|
||||||
|
String baseCommandString = configPreferences.get("recipe.c.o.pattern");
|
||||||
|
MessageFormat compileFormat = new MessageFormat(baseCommandString);
|
||||||
|
//getIncludes to String
|
||||||
|
String includes = preparePaths(includePaths);
|
||||||
|
|
||||||
|
Object[] Args = {
|
||||||
|
avrBasePath,
|
||||||
|
configPreferences.get("compiler.c.cmd"),
|
||||||
|
configPreferences.get("compiler.c.flags"),
|
||||||
|
configPreferences.get("compiler.cpudef"),
|
||||||
|
configPreferences.get("build.mcu"),
|
||||||
|
configPreferences.get("build.f_cpu"),
|
||||||
|
configPreferences.get("software"),
|
||||||
|
Base.REVISION,
|
||||||
|
includes,
|
||||||
|
sourceName,
|
||||||
|
objectName
|
||||||
|
};
|
||||||
|
|
||||||
|
String command = compileFormat.format( Args );
|
||||||
|
String[] commandArray = command.split("\\|");
|
||||||
|
return commandArray;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
|
||||||
static private List getCommandCompilerCPP(String avrBasePath,
|
static private List getCommandCompilerCPP(String avrBasePath,
|
||||||
List includePaths, String sourceName, String objectName,
|
List includePaths, String sourceName, String objectName,
|
||||||
|
@ -481,7 +609,44 @@ public class Compiler implements MessageConsumer {
|
||||||
|
|
||||||
return baseCommandCompilerCPP;
|
return baseCommandCompilerCPP;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
static private String[] getCommandCompilerCPP(String avrBasePath,
|
||||||
|
ArrayList<String> includePaths, String sourceName, String objectName,
|
||||||
|
HashMap<String, String> configPreferences)
|
||||||
|
{
|
||||||
|
System.out.println("getCommandCompilerCPP: start");
|
||||||
|
String baseCommandString = configPreferences.get("recipe.cpp.o.pattern");
|
||||||
|
MessageFormat compileFormat = new MessageFormat(baseCommandString);
|
||||||
|
//getIncludes to String
|
||||||
|
String includes = preparePaths(includePaths);
|
||||||
|
|
||||||
|
Object[] Args = {
|
||||||
|
avrBasePath,
|
||||||
|
configPreferences.get("compiler.cpp.cmd"),
|
||||||
|
configPreferences.get("compiler.cpp.flags"),
|
||||||
|
configPreferences.get("compiler.cpudef"),
|
||||||
|
configPreferences.get("build.mcu"),
|
||||||
|
configPreferences.get("build.f_cpu"),
|
||||||
|
configPreferences.get("software"),
|
||||||
|
Base.REVISION,
|
||||||
|
includes,
|
||||||
|
sourceName,
|
||||||
|
objectName
|
||||||
|
};
|
||||||
|
|
||||||
|
String command = compileFormat.format( Args );
|
||||||
|
String[] commandArray = command.split("\\|");
|
||||||
|
|
||||||
|
/*
|
||||||
|
System.out.println("command:" + command);
|
||||||
|
for (int ii = 0; ii < commandArray.length; ii++)
|
||||||
|
{
|
||||||
|
System.out.println("'" + commandArray[ii] + "'");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return commandArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -509,6 +674,7 @@ public class Compiler implements MessageConsumer {
|
||||||
|
|
||||||
static public ArrayList<File> findFilesInPath(String path, String extension,
|
static public ArrayList<File> findFilesInPath(String path, String extension,
|
||||||
boolean recurse) {
|
boolean recurse) {
|
||||||
|
System.out.println("findFilesInPath: " + path);
|
||||||
return findFilesInFolder(new File(path), extension, recurse);
|
return findFilesInFolder(new File(path), extension, recurse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,4 +697,271 @@ public class Compiler implements MessageConsumer {
|
||||||
|
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 1. compile the sketch (already in the buildPath)
|
||||||
|
void compileSketch(String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<String, String> configPreferences)
|
||||||
|
throws RunnerException
|
||||||
|
{
|
||||||
|
System.out.println("compileSketch: start");
|
||||||
|
System.out.println("includePaths: ");
|
||||||
|
for (int i = 0; i < includePaths.size(); i++) {
|
||||||
|
System.out.println("-I" + (String) includePaths.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
//logger.debug("compileSketch: start");
|
||||||
|
this.objectFiles.addAll(compileFiles(avrBasePath, buildPath, includePaths,
|
||||||
|
findFilesInPath(buildPath, "S", false),
|
||||||
|
findFilesInPath(buildPath, "c", false),
|
||||||
|
findFilesInPath(buildPath, "cpp", false),
|
||||||
|
configPreferences));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. compile the libraries, outputting .o files to:
|
||||||
|
// <buildPath>/<library>/
|
||||||
|
void compileLibraries (String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<String, String> configPreferences)
|
||||||
|
throws RunnerException
|
||||||
|
{
|
||||||
|
System.out.println("compileLibraries: start");
|
||||||
|
|
||||||
|
for (File libraryFolder : sketch.getImportedLibraries()) {
|
||||||
|
System.out.println("libraryFolder: " + libraryFolder);
|
||||||
|
File outputFolder = new File(buildPath, libraryFolder.getName());
|
||||||
|
File utilityFolder = new File(libraryFolder, "utility");
|
||||||
|
createFolder(outputFolder);
|
||||||
|
// this library can use includes in its utility/ folder
|
||||||
|
includePaths.add(utilityFolder.getAbsolutePath());
|
||||||
|
//debug includePaths
|
||||||
|
System.out.println("includePaths: ");
|
||||||
|
for (int i = 0; i < includePaths.size(); i++) {
|
||||||
|
System.out.println("-I" + (String) includePaths.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
objectFiles.addAll(
|
||||||
|
compileFiles(avrBasePath, outputFolder.getAbsolutePath(), includePaths,
|
||||||
|
findFilesInFolder(libraryFolder, "S", false),
|
||||||
|
findFilesInFolder(libraryFolder, "c", false),
|
||||||
|
findFilesInFolder(libraryFolder, "cpp", false),
|
||||||
|
boardPreferences));
|
||||||
|
outputFolder = new File(outputFolder, "utility");
|
||||||
|
createFolder(outputFolder);
|
||||||
|
objectFiles.addAll(
|
||||||
|
compileFiles(avrBasePath, outputFolder.getAbsolutePath(), includePaths,
|
||||||
|
findFilesInFolder(utilityFolder, "S", false),
|
||||||
|
findFilesInFolder(utilityFolder, "c", false),
|
||||||
|
findFilesInFolder(utilityFolder, "cpp", false),
|
||||||
|
boardPreferences));
|
||||||
|
// other libraries should not see this library's utility/ folder
|
||||||
|
includePaths.remove(includePaths.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. compile the core, outputting .o files to <buildPath> and then
|
||||||
|
// collecting them into the core.a library file.
|
||||||
|
void compileCore (String avrBasePath, String buildPath, String corePath, String pins, String pinsPath, HashMap<String, String> configPreferences)
|
||||||
|
throws RunnerException
|
||||||
|
{
|
||||||
|
System.out.println("compileCore(...) start");
|
||||||
|
|
||||||
|
ArrayList<String> includePaths = new ArrayList();
|
||||||
|
includePaths.add(corePath); //include core path only
|
||||||
|
if (pinsPath != null) includePaths.add(pinsPath);
|
||||||
|
|
||||||
|
//debug includePaths
|
||||||
|
System.out.println("includePaths: ");
|
||||||
|
for (int i = 0; i < includePaths.size(); i++) {
|
||||||
|
System.out.println("-I" + (String) includePaths.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
String baseCommandString = configPreferences.get("recipe.ar.pattern");
|
||||||
|
String commandString = "";
|
||||||
|
MessageFormat compileFormat = new MessageFormat(baseCommandString);
|
||||||
|
System.out.println("corePath: " + corePath);
|
||||||
|
List<File> coreObjectFiles = compileFiles(
|
||||||
|
avrBasePath,
|
||||||
|
buildPath,
|
||||||
|
includePaths,
|
||||||
|
findFilesInPath(corePath, "S", true),
|
||||||
|
findFilesInPath(corePath, "c", true),
|
||||||
|
findFilesInPath(corePath, "cpp", true),
|
||||||
|
configPreferences);
|
||||||
|
|
||||||
|
for (File file : coreObjectFiles) {
|
||||||
|
//List commandAR = new ArrayList(baseCommandAR);
|
||||||
|
//commandAR = commandAR + file.getAbsolutePath();
|
||||||
|
|
||||||
|
Object[] Args = {
|
||||||
|
avrBasePath,
|
||||||
|
configPreferences.get("compiler.ar.cmd"),
|
||||||
|
configPreferences.get("compiler.ar.flags"),
|
||||||
|
//corePath,
|
||||||
|
buildPath + File.separator,
|
||||||
|
"core.a",
|
||||||
|
//objectName
|
||||||
|
file.getAbsolutePath()
|
||||||
|
};
|
||||||
|
System.out.println("compileCore(...) substitute");
|
||||||
|
|
||||||
|
commandString = compileFormat.format( Args );
|
||||||
|
String[] commandArray = commandString.split("\\|");
|
||||||
|
execAsynchronously(commandArray);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. link it all together into the .elf file
|
||||||
|
void compileLink(String avrBasePath, String buildPath, String corePath, ArrayList<String> includePaths, HashMap<String, String> configPreferences)
|
||||||
|
throws RunnerException
|
||||||
|
{
|
||||||
|
System.out.println("compileLink: start");
|
||||||
|
String baseCommandString = configPreferences.get("recipe.c.combine.pattern");
|
||||||
|
String commandString = "";
|
||||||
|
MessageFormat compileFormat = new MessageFormat(baseCommandString);
|
||||||
|
String objectFileList = "";
|
||||||
|
|
||||||
|
for (File file : objectFiles) {
|
||||||
|
objectFileList = objectFileList + file.getAbsolutePath() + "|";
|
||||||
|
}
|
||||||
|
System.out.println("objectFileList: " + objectFileList);
|
||||||
|
|
||||||
|
Object[] Args = {
|
||||||
|
avrBasePath,
|
||||||
|
configPreferences.get("compiler.c.elf.cmd"),
|
||||||
|
configPreferences.get("compiler.c.elf.flags"),
|
||||||
|
configPreferences.get("compiler.cpudef"),
|
||||||
|
configPreferences.get("build.mcu"),
|
||||||
|
buildPath + File.separator,
|
||||||
|
primaryClassName,
|
||||||
|
objectFileList,
|
||||||
|
buildPath + File.separator + "core.a",
|
||||||
|
buildPath,
|
||||||
|
corePath,
|
||||||
|
configPreferences.get("ldscript"),
|
||||||
|
};
|
||||||
|
commandString = compileFormat.format( Args );
|
||||||
|
String[] commandArray = commandString.split("\\|");
|
||||||
|
execAsynchronously(commandArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. extract EEPROM data (from EEMEM directive) to .eep file.
|
||||||
|
void compileEep (String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<String, String> configPreferences)
|
||||||
|
throws RunnerException
|
||||||
|
{
|
||||||
|
//logger.debug("compileEep: start");
|
||||||
|
String baseCommandString = configPreferences.get("recipe.objcopy.eep.pattern");
|
||||||
|
String commandString = "";
|
||||||
|
MessageFormat compileFormat = new MessageFormat(baseCommandString);
|
||||||
|
String objectFileList = "";
|
||||||
|
|
||||||
|
Object[] Args = {
|
||||||
|
avrBasePath,
|
||||||
|
configPreferences.get("compiler.objcopy.cmd"),
|
||||||
|
configPreferences.get("compiler.objcopy.eep.flags"),
|
||||||
|
buildPath + File.separator + primaryClassName,
|
||||||
|
buildPath + File.separator + primaryClassName
|
||||||
|
};
|
||||||
|
commandString = compileFormat.format( Args );
|
||||||
|
String[] commandArray = commandString.split("\\|");
|
||||||
|
execAsynchronously(commandArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. build the .hex file
|
||||||
|
void compileHex (String avrBasePath, String buildPath, ArrayList<String> includePaths, HashMap<String, String> configPreferences)
|
||||||
|
throws RunnerException
|
||||||
|
{
|
||||||
|
//logger.debug("compileHex: start");
|
||||||
|
String baseCommandString = configPreferences.get("recipe.objcopy.hex.pattern");
|
||||||
|
String commandString = "";
|
||||||
|
MessageFormat compileFormat = new MessageFormat(baseCommandString);
|
||||||
|
String objectFileList = "";
|
||||||
|
|
||||||
|
Object[] Args = {
|
||||||
|
avrBasePath,
|
||||||
|
configPreferences.get("compiler.elf2hex.cmd"),
|
||||||
|
configPreferences.get("compiler.elf2hex.flags"),
|
||||||
|
buildPath + File.separator + primaryClassName,
|
||||||
|
buildPath + File.separator + primaryClassName
|
||||||
|
};
|
||||||
|
commandString = compileFormat.format( Args );
|
||||||
|
String[] commandArray = commandString.split("\\|");
|
||||||
|
execAsynchronously(commandArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
//merge all the preferences file in the correct order of precedence
|
||||||
|
HashMap mergePreferences(Map Preferences, Map platformPreferences, Map boardPreferences)
|
||||||
|
{
|
||||||
|
HashMap _map = new HashMap();
|
||||||
|
|
||||||
|
Iterator iterator = Preferences.entrySet().iterator();
|
||||||
|
|
||||||
|
while(iterator.hasNext())
|
||||||
|
{
|
||||||
|
Map.Entry pair = (Map.Entry)iterator.next();
|
||||||
|
if (pair.getValue() == null)
|
||||||
|
{
|
||||||
|
_map.put(pair.getKey(), "");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_map.put(pair.getKey(), pair.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//logger.debug("Done: Preferences");
|
||||||
|
|
||||||
|
iterator = platformPreferences.entrySet().iterator();
|
||||||
|
|
||||||
|
while(iterator.hasNext())
|
||||||
|
{
|
||||||
|
Map.Entry pair = (Map.Entry)iterator.next();
|
||||||
|
|
||||||
|
if (pair.getValue() == null)
|
||||||
|
{
|
||||||
|
_map.put(pair.getKey(), "");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_map.put(pair.getKey(), pair.getValue());
|
||||||
|
}
|
||||||
|
//System.out.println(pair.getKey() + " = " + pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
//System.out.println("Done: platformPreferences");
|
||||||
|
iterator = boardPreferences.entrySet().iterator();
|
||||||
|
|
||||||
|
while(iterator.hasNext())
|
||||||
|
{
|
||||||
|
Map.Entry pair = (Map.Entry)iterator.next();
|
||||||
|
|
||||||
|
if (pair.getValue() == null)
|
||||||
|
{
|
||||||
|
_map.put(pair.getKey(), "");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_map.put(pair.getKey(), pair.getValue());
|
||||||
|
}
|
||||||
|
//System.out.println(pair.getKey() + " = " + pair.getValue());
|
||||||
|
}
|
||||||
|
//System.out.println("Done: boardPreferences");
|
||||||
|
|
||||||
|
|
||||||
|
return _map;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String preparePaths(ArrayList<String> includePaths) {
|
||||||
|
//getIncludes to String
|
||||||
|
//logger.debug("Start: Prepare paths");
|
||||||
|
String includes = "";
|
||||||
|
for (int i = 0; i < includePaths.size(); i++)
|
||||||
|
{
|
||||||
|
includes = includes + (" -I" + (String) includePaths.get(i)) + "|";
|
||||||
|
}
|
||||||
|
//logger.debug("Paths prepared: " + includes);
|
||||||
|
return includes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,18 +29,22 @@ import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import processing.app.Preferences;
|
import processing.app.Preferences;
|
||||||
|
//import processing.app.Base;
|
||||||
|
|
||||||
public class Target {
|
public class Target {
|
||||||
private String name;
|
private String name;
|
||||||
private File folder;
|
private File folder;
|
||||||
private Map boards;
|
private Map boards;
|
||||||
private Map programmers;
|
private Map programmers;
|
||||||
|
private Map platforms;
|
||||||
|
|
||||||
public Target(String name, File folder) {
|
public Target(String name, File folder) {
|
||||||
|
System.out.println("Target: constructor start, name: " + name);
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.folder = folder;
|
this.folder = folder;
|
||||||
this.boards = new LinkedHashMap();
|
this.boards = new LinkedHashMap();
|
||||||
this.programmers = new LinkedHashMap();
|
this.programmers = new LinkedHashMap();
|
||||||
|
this.platforms = new LinkedHashMap();
|
||||||
|
|
||||||
File boardsFile = new File(folder, "boards.txt");
|
File boardsFile = new File(folder, "boards.txt");
|
||||||
try {
|
try {
|
||||||
|
@ -58,8 +62,31 @@ public class Target {
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Error loading boards from " + boardsFile + ": " + e);
|
System.err.println("Error loading boards from " + boardsFile + ": " + e);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File platformsFile = new File(folder,"platforms.txt");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if(platformsFile.exists()){
|
||||||
|
Map platformPreferences = new LinkedHashMap();
|
||||||
|
Preferences.load(new FileInputStream(platformsFile), platformPreferences);
|
||||||
|
for(Object k : platformPreferences.keySet())
|
||||||
|
{
|
||||||
|
String key=(String) k;
|
||||||
|
String platform=key.substring(0,key.indexOf('.'));
|
||||||
|
if (!platforms.containsKey(platform)) platforms.put(platform, new HashMap());
|
||||||
|
((Map) platforms.get(platform)).put(key.substring(key.indexOf('.') + 1),platformPreferences.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("Error loading platforms from " +
|
||||||
|
platformsFile + ": " + e);
|
||||||
|
System.exit(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
File programmersFile = new File(folder, "programmers.txt");
|
File programmersFile = new File(folder, "programmers.txt");
|
||||||
try {
|
try {
|
||||||
if (programmersFile.exists()) {
|
if (programmersFile.exists()) {
|
||||||
|
@ -88,4 +115,8 @@ public class Target {
|
||||||
public Map<String, Map<String, String>> getProgrammers() {
|
public Map<String, Map<String, String>> getProgrammers() {
|
||||||
return programmers;
|
return programmers;
|
||||||
}
|
}
|
||||||
|
public Map<String, Map<String, String>> getPlatforms() {
|
||||||
|
return platforms;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -217,6 +217,10 @@
|
||||||
<exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="true"/>
|
<exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="true"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<target name="macosx-debug" depends="macosx-build" description="Run Mac OS X version">
|
||||||
|
<exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="false"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
<target name="macosx-dist" if="macosx" depends="macosx-build" description="Create a .dmg of the Mac OS X version">
|
<target name="macosx-dist" if="macosx" depends="macosx-build" description="Create a .dmg of the Mac OS X version">
|
||||||
<!-- now build the dmg -->
|
<!-- now build the dmg -->
|
||||||
<gunzip src="macosx/template.dmg.gz" dest="macosx/working.dmg" />
|
<gunzip src="macosx/template.dmg.gz" dest="macosx/working.dmg" />
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
Serial Event example
|
||||||
|
|
||||||
|
When new serial data arrives, this sketch adds it to a String.
|
||||||
|
When a newline is received, the loop prints the string and
|
||||||
|
clears it.
|
||||||
|
|
||||||
|
A good test for this is to try it with a GPS receiver
|
||||||
|
that sends out NMEA 0183 sentences.
|
||||||
|
|
||||||
|
Created 9 May 2011
|
||||||
|
by Tom Igoe
|
||||||
|
|
||||||
|
This example code is in the public domain.
|
||||||
|
|
||||||
|
http://www.arduino.cc/en/Tutorial/SerialEvent
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
String inputString = ""; // a string to hold incoming data
|
||||||
|
boolean stringComplete = false; // whether the string is complete
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// initialize serial:
|
||||||
|
Serial.begin(9600);
|
||||||
|
// reserve 200 bytes for the inputString:
|
||||||
|
inputString.reserve(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// print the string when a newline arrives:
|
||||||
|
if (stringComplete) {
|
||||||
|
Serial.println(inputString);
|
||||||
|
// clear the string:
|
||||||
|
inputString = "";
|
||||||
|
stringComplete = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SerialEvent occurs whenever a new byte comes in the
|
||||||
|
hardware serial RX. Don't do complex things here, as thge
|
||||||
|
processor halts the regular program to run this routine:
|
||||||
|
*/
|
||||||
|
void serialEvent() {
|
||||||
|
// get the new byte:
|
||||||
|
char inChar = (char)Serial.read();
|
||||||
|
// add it to the inputString:
|
||||||
|
inputString += inChar;
|
||||||
|
// if the incoming character is a newline, set a flag
|
||||||
|
// so the main loop can do something about it:
|
||||||
|
if (inChar == '\n') {
|
||||||
|
stringComplete = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -239,6 +239,8 @@ run.present.exclusive.macosx = true
|
||||||
# ARDUINO PREFERENCES
|
# ARDUINO PREFERENCES
|
||||||
board = uno
|
board = uno
|
||||||
target = arduino
|
target = arduino
|
||||||
|
platform = avr
|
||||||
|
software=ARDUINO
|
||||||
|
|
||||||
programmer = arduino:avrispmkii
|
programmer = arduino:avrispmkii
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
#########Compiler Recipe#################################
|
||||||
|
##compile c object files
|
||||||
|
##Default.recipe, overide if overide exists, these defauls should remain the same, if you need to change them do it as an overide.
|
||||||
|
|
||||||
|
#default.recipe.c.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
|
||||||
|
#default.recipe.cpp.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
|
||||||
|
#default.recipe.ar.pattern={0}{1}|{2}|{3}{4}|{5}
|
||||||
|
#default.recipe.c.combine.pattern={0}{1}|{2}|{3}{4}|-o|{5}{6}.elf|{7}|{8}|-L{9}|-lm
|
||||||
|
#default.recipe.objcopy.eep.pattern={0}{1}|{2}|{3}.elf|{4}.eep
|
||||||
|
#default.recipe.objcopy.hex.pattern={0}{1}|{2}|{3}.elf|{4}.hex
|
||||||
|
|
||||||
|
########avr compile pattern ##########
|
||||||
|
#avr.recipe.c.o.pattern={0=compiler.path}{1=compiler.c.cmd}{2=compiler.c.flags}{3=compiler.cpudef}{4=build.mcu}-DF_CPU={5=build.f_cpu}-D{7=ARDUINO}={6=Base.REVISION}{7=-I/INCLUDE_PATHS} {8=SOURCE_NAME} -o{9=OBJECT_NAME}
|
||||||
|
#object name seems to have build path in it.
|
||||||
|
avr.recipe.c.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
|
||||||
|
|
||||||
|
|
||||||
|
##compile cc object files
|
||||||
|
#avr.recipe.cc.o.pattern={0=compiler.path}{1=compiler.cc.cmd}{2=compiler.c.flags}{3=compiler.cpudef}{4=build.mcu}-DF_CPU={5=build.f_cpu}-DARDUINO={6=Base.REVISION}{-7=I/INCLUDE_PATHS} {8=SOURCE_NAME} -o{9=BUILD_PATH}{10=OBJECT_NAME}
|
||||||
|
avr.recipe.cpp.o.pattern={0}{1}|{2}|{3}{4}|-DF_CPU={5}|-D{6}={7}|{8}|{9}|-o|{10}
|
||||||
|
##create archives
|
||||||
|
#avr.recipe.ar.pattern={0=compiler.path}{1=compiler.ar.cmd}{2=compiler.ar.flags}{3=BUILD_PATH}{4=CORE_NAME=core.a}{5=BUILD_PATH}{6=OBJECT_NAME}
|
||||||
|
avr.recipe.ar.pattern={0}{1}|{2}|{3}{4}|{5}
|
||||||
|
|
||||||
|
##combine gc-sections| archives, and objects
|
||||||
|
#avr.recipe.c.combine.pattern={0=compiler.path}{1=compiler.c.cmd}{2=compiler.combine.flags}{3=compiler.cpudef}{4=build.mcu} -o {5=BUILD_PATH}{6=SOURCE_NAME}.elf {7=BUILD_PATH}{8=SOURCE_NAME}.o {9=BUILD_PATH}{10=CORE_NAME=core.a} -L{11=BUILD_PATH} -lm
|
||||||
|
#avr.recipe.c.combine.pattern={0}{1}|{2}|{3}{4}|-o|{5}{6}.elf|{7}{8}|{9}|-L{10}|-lm
|
||||||
|
avr.recipe.c.combine.pattern={0}{1}|{2}|{3}{4}|-o|{5}{6}.elf|{7}|{8}|-L{9}|-lm
|
||||||
|
|
||||||
|
##create eeprom
|
||||||
|
#avr.recipe.objcopy.eep.pattern={0=compiler.path}{1=compiler.objcopy.cmd}{2=compiler.objcopy.eep.flags} {3=BUILD_PATH}{4=SOURCE_NAME}.elf {5=BUILD_PATH}{6=SOURCE_NAME}.eep
|
||||||
|
avr.recipe.objcopy.eep.pattern={0}{1}|{2}|{3}.elf|{4}.eep
|
||||||
|
|
||||||
|
##create hex
|
||||||
|
#avr.recipe.objcopy.hex.pattern={0=compiler.path}{1=compiler.objcopy.cmd}{2=compiler.objcopy.elf.flags} {3=BUILD_PATH}{4=SOURCE_NAME}.elf {5=BUILD_PATH}{6=SOURCE_NAME}.hex
|
||||||
|
avr.recipe.objcopy.hex.pattern={0}{1}|{2}|{3}.elf|{4}.hex
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
avr.name=Arduino
|
||||||
|
#avr.compiler.path Official default is correct, only need to change this if you want to overide the initial default
|
||||||
|
#avr.compiler.path={0}/hardware/tools/avr/bin/
|
||||||
|
avr.compiler.c.cmd=avr-gcc
|
||||||
|
avr.compiler.c.flags=|-c|-g|-Os|-w|-ffunction-sections|-fdata-sections
|
||||||
|
avr.compiler.c.elf.flags=|-Os|-Wl|--gc-sections
|
||||||
|
avr.compiler.c.elf.cmd=avr-gcc
|
||||||
|
avr.compiler.S.flags=|-c|-g|-assembler-with-cpp
|
||||||
|
avr.compiler.cpp.cmd=avr-g++
|
||||||
|
avr.compiler.cpp.flags=|-c|-g|-Os|-w|-fno-exceptions|-ffunction-sections|-fdata-sections
|
||||||
|
avr.compiler.ar.cmd=avr-ar
|
||||||
|
avr.compiler.ar.flags=rcs
|
||||||
|
avr.compiler.objcopy.cmd=avr-objcopy
|
||||||
|
avr.compiler.objcopy.eep.flags=|-O|ihex|-j|.eeprom|--set-section-flags=.eeprom=alloc,load|--no-change-warnings|--change-section-lma|.eeprom=0
|
||||||
|
avr.compiler.elf2hex.flags=|-O|ihex|-R|.eeprom
|
||||||
|
avr.compiler.elf2hex.cmd=avr-objcopy
|
||||||
|
avr.compiler.ldflags=
|
||||||
|
avr.compiler.cpudef=-mmcu=
|
||||||
|
avr.compiler.upload.cmd=
|
||||||
|
avr.compiler.upload.flags=
|
||||||
|
avr.compiler.define=-DARDUINO=
|
||||||
|
avr.library.path=./hardware/arduino/cores/arduino
|
||||||
|
avr.library.core.path=./libraries
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
uno.name=Arduino Uno
|
uno.name=Arduino Uno
|
||||||
|
uno.platform=avr
|
||||||
uno.upload.protocol=stk500
|
uno.upload.protocol=stk500
|
||||||
uno.upload.maximum_size=32256
|
uno.upload.maximum_size=32256
|
||||||
uno.upload.speed=115200
|
uno.upload.speed=115200
|
||||||
|
@ -19,7 +20,7 @@ uno.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
atmega328.name=Arduino Duemilanove or Nano w/ ATmega328
|
atmega328.name=Arduino Duemilanove or Nano w/ ATmega328
|
||||||
|
atmega328.platform=avr
|
||||||
atmega328.upload.protocol=stk500
|
atmega328.upload.protocol=stk500
|
||||||
atmega328.upload.maximum_size=30720
|
atmega328.upload.maximum_size=30720
|
||||||
atmega328.upload.speed=57600
|
atmega328.upload.speed=57600
|
||||||
|
@ -40,7 +41,7 @@ atmega328.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
diecimila.name=Arduino Diecimila, Duemilanove, or Nano w/ ATmega168
|
diecimila.name=Arduino Diecimila, Duemilanove, or Nano w/ ATmega168
|
||||||
|
diecimila.platform=avr
|
||||||
diecimila.upload.protocol=stk500
|
diecimila.upload.protocol=stk500
|
||||||
diecimila.upload.maximum_size=14336
|
diecimila.upload.maximum_size=14336
|
||||||
diecimila.upload.speed=19200
|
diecimila.upload.speed=19200
|
||||||
|
@ -61,7 +62,7 @@ diecimila.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
mega2560.name=Arduino Mega 2560
|
mega2560.name=Arduino Mega 2560
|
||||||
|
mega2560.platform=avr
|
||||||
mega2560.upload.protocol=stk500v2
|
mega2560.upload.protocol=stk500v2
|
||||||
mega2560.upload.maximum_size=258048
|
mega2560.upload.maximum_size=258048
|
||||||
mega2560.upload.speed=115200
|
mega2560.upload.speed=115200
|
||||||
|
@ -82,7 +83,7 @@ mega2560.build.pins=mega
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
mega.name=Arduino Mega (ATmega1280)
|
mega.name=Arduino Mega (ATmega1280)
|
||||||
|
mega.platform=avr
|
||||||
mega.upload.protocol=stk500
|
mega.upload.protocol=stk500
|
||||||
mega.upload.maximum_size=126976
|
mega.upload.maximum_size=126976
|
||||||
mega.upload.speed=57600
|
mega.upload.speed=57600
|
||||||
|
@ -103,7 +104,7 @@ mega.build.pins=mega
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
mini.name=Arduino Mini
|
mini.name=Arduino Mini
|
||||||
|
mini.platform=avr
|
||||||
mini.upload.protocol=stk500
|
mini.upload.protocol=stk500
|
||||||
mini.upload.maximum_size=14336
|
mini.upload.maximum_size=14336
|
||||||
mini.upload.speed=19200
|
mini.upload.speed=19200
|
||||||
|
@ -124,7 +125,7 @@ mini.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
fio.name=Arduino Fio
|
fio.name=Arduino Fio
|
||||||
|
fio.platform=avr
|
||||||
fio.upload.protocol=stk500
|
fio.upload.protocol=stk500
|
||||||
fio.upload.maximum_size=30720
|
fio.upload.maximum_size=30720
|
||||||
fio.upload.speed=57600
|
fio.upload.speed=57600
|
||||||
|
@ -145,7 +146,7 @@ fio.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
bt328.name=Arduino BT w/ ATmega328
|
bt328.name=Arduino BT w/ ATmega328
|
||||||
|
bt328.platform=avr
|
||||||
bt328.upload.protocol=stk500
|
bt328.upload.protocol=stk500
|
||||||
bt328.upload.maximum_size=28672
|
bt328.upload.maximum_size=28672
|
||||||
bt328.upload.speed=19200
|
bt328.upload.speed=19200
|
||||||
|
@ -167,7 +168,7 @@ bt328.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
bt.name=Arduino BT w/ ATmega168
|
bt.name=Arduino BT w/ ATmega168
|
||||||
|
bt.platform=avr
|
||||||
bt.upload.protocol=stk500
|
bt.upload.protocol=stk500
|
||||||
bt.upload.maximum_size=14336
|
bt.upload.maximum_size=14336
|
||||||
bt.upload.speed=19200
|
bt.upload.speed=19200
|
||||||
|
@ -189,7 +190,7 @@ bt.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
lilypad328.name=LilyPad Arduino w/ ATmega328
|
lilypad328.name=LilyPad Arduino w/ ATmega328
|
||||||
|
lilypad328.platform=avr
|
||||||
lilypad328.upload.protocol=stk500
|
lilypad328.upload.protocol=stk500
|
||||||
lilypad328.upload.maximum_size=30720
|
lilypad328.upload.maximum_size=30720
|
||||||
lilypad328.upload.speed=57600
|
lilypad328.upload.speed=57600
|
||||||
|
@ -210,7 +211,7 @@ lilypad328.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
lilypad.name=LilyPad Arduino w/ ATmega168
|
lilypad.name=LilyPad Arduino w/ ATmega168
|
||||||
|
lilypad.platform=avr
|
||||||
lilypad.upload.protocol=stk500
|
lilypad.upload.protocol=stk500
|
||||||
lilypad.upload.maximum_size=14336
|
lilypad.upload.maximum_size=14336
|
||||||
lilypad.upload.speed=19200
|
lilypad.upload.speed=19200
|
||||||
|
@ -231,7 +232,7 @@ lilypad.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
|
pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
|
||||||
|
pro5v328.platform=avr
|
||||||
pro5v328.upload.protocol=stk500
|
pro5v328.upload.protocol=stk500
|
||||||
pro5v328.upload.maximum_size=30720
|
pro5v328.upload.maximum_size=30720
|
||||||
pro5v328.upload.speed=57600
|
pro5v328.upload.speed=57600
|
||||||
|
@ -252,7 +253,7 @@ pro5v328.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168
|
pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168
|
||||||
|
pro5v.platform=avr
|
||||||
pro5v.upload.protocol=stk500
|
pro5v.upload.protocol=stk500
|
||||||
pro5v.upload.maximum_size=14336
|
pro5v.upload.maximum_size=14336
|
||||||
pro5v.upload.speed=19200
|
pro5v.upload.speed=19200
|
||||||
|
@ -273,7 +274,7 @@ pro5v.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
|
pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
|
||||||
|
pro328.platform=avr
|
||||||
pro328.upload.protocol=stk500
|
pro328.upload.protocol=stk500
|
||||||
pro328.upload.maximum_size=30720
|
pro328.upload.maximum_size=30720
|
||||||
pro328.upload.speed=57600
|
pro328.upload.speed=57600
|
||||||
|
@ -294,7 +295,7 @@ pro328.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
|
pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
|
||||||
|
pro.platform=avr
|
||||||
pro.upload.protocol=stk500
|
pro.upload.protocol=stk500
|
||||||
pro.upload.maximum_size=14336
|
pro.upload.maximum_size=14336
|
||||||
pro.upload.speed=19200
|
pro.upload.speed=19200
|
||||||
|
@ -315,7 +316,7 @@ pro.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
atmega168.name=Arduino NG or older w/ ATmega168
|
atmega168.name=Arduino NG or older w/ ATmega168
|
||||||
|
atmega168.platform=avr
|
||||||
atmega168.upload.protocol=stk500
|
atmega168.upload.protocol=stk500
|
||||||
atmega168.upload.maximum_size=14336
|
atmega168.upload.maximum_size=14336
|
||||||
atmega168.upload.speed=19200
|
atmega168.upload.speed=19200
|
||||||
|
@ -336,7 +337,7 @@ atmega168.build.pins=standard
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
atmega8.name=Arduino NG or older w/ ATmega8
|
atmega8.name=Arduino NG or older w/ ATmega8
|
||||||
|
atmega8.platform=avr
|
||||||
atmega8.upload.protocol=stk500
|
atmega8.upload.protocol=stk500
|
||||||
atmega8.upload.maximum_size=7168
|
atmega8.upload.maximum_size=7168
|
||||||
atmega8.upload.speed=19200
|
atmega8.upload.speed=19200
|
||||||
|
|
|
@ -279,6 +279,8 @@ void HardwareSerial::begin(unsigned long baud)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
try_again:
|
||||||
|
|
||||||
if (use_u2x) {
|
if (use_u2x) {
|
||||||
*_ucsra = 1 << _u2x;
|
*_ucsra = 1 << _u2x;
|
||||||
baud_setting = (F_CPU / 4 / baud - 1) / 2;
|
baud_setting = (F_CPU / 4 / baud - 1) / 2;
|
||||||
|
@ -287,6 +289,12 @@ void HardwareSerial::begin(unsigned long baud)
|
||||||
baud_setting = (F_CPU / 8 / baud - 1) / 2;
|
baud_setting = (F_CPU / 8 / baud - 1) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((baud_setting > 4095) && use_u2x)
|
||||||
|
{
|
||||||
|
use_u2x = false;
|
||||||
|
goto try_again;
|
||||||
|
}
|
||||||
|
|
||||||
// assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
|
// assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
|
||||||
*_ubrrh = baud_setting >> 8;
|
*_ubrrh = baud_setting >> 8;
|
||||||
*_ubrrl = baud_setting;
|
*_ubrrl = baud_setting;
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
DHCP-based IP printer
|
||||||
|
|
||||||
|
This sketch uses the DHCP extensions to the Ethernet library
|
||||||
|
to get an IP address via DHCP and print the address obtained.
|
||||||
|
using an Arduino Wiznet Ethernet shield.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* Ethernet shield attached to pins 10, 11, 12, 13
|
||||||
|
|
||||||
|
created 12 April 2011
|
||||||
|
by Tom Igoe
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Ethernet.h>
|
||||||
|
|
||||||
|
// Enter a MAC address for your controller below.
|
||||||
|
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
|
||||||
|
byte mac[] = {
|
||||||
|
0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
|
||||||
|
|
||||||
|
// Initialize the Ethernet client library
|
||||||
|
// with the IP address and port of the server
|
||||||
|
// that you want to connect to (port 80 is default for HTTP):
|
||||||
|
Client client;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// start the serial library:
|
||||||
|
Serial.begin(9600);
|
||||||
|
// start the Ethernet connection:
|
||||||
|
Serial.println("Trying to get an IP address using DHCP");z
|
||||||
|
if (Ethernet.begin(mac) == 0) {
|
||||||
|
Serial.println("Failed to configure Ethernet using DHCP");
|
||||||
|
// no point in carrying on, so do nothing forevermore:
|
||||||
|
while(true);
|
||||||
|
}
|
||||||
|
// print your local IP address:
|
||||||
|
Serial.print("My IP address: ");
|
||||||
|
IPAddress myIPAddress = Ethernet.localIP();
|
||||||
|
for (byte thisByte = 0; thisByte < 4; thisByte++) {
|
||||||
|
// print the value of each byte of the IP address:
|
||||||
|
Serial.print(myIPAddress[thisByte], DEC);
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
DHCP Chat Server
|
||||||
|
|
||||||
|
A simple server that distributes any incoming messages to all
|
||||||
|
connected clients. To use telnet to your device's IP address and type.
|
||||||
|
You can see the client's input in the serial monitor as well.
|
||||||
|
Using an Arduino Wiznet Ethernet shield.
|
||||||
|
|
||||||
|
THis version attempts to get an IP address using DHCP
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* Ethernet shield attached to pins 10, 11, 12, 13
|
||||||
|
|
||||||
|
created 21 May 2011
|
||||||
|
by Tom Igoe
|
||||||
|
Based on ChatServer example by David A. Mellis
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Ethernet.h>
|
||||||
|
|
||||||
|
// Enter a MAC address and IP address for your controller below.
|
||||||
|
// The IP address will be dependent on your local network.
|
||||||
|
// gateway and subnet are optional:
|
||||||
|
byte mac[] = {
|
||||||
|
0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
|
||||||
|
IPAddress ip(192,168,1, 177);
|
||||||
|
IPAddress gateway(192,168,1, 1);
|
||||||
|
IPAddress subnet(255, 255, 0, 0);
|
||||||
|
|
||||||
|
// telnet defaults to port 23
|
||||||
|
Server server(23);
|
||||||
|
boolean gotAMessage = false; // whether or not you got a message from the client yet
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// open the serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
// start the Ethernet connection:
|
||||||
|
Serial.println("Trying to get an IP address using DHCP");
|
||||||
|
if (Ethernet.begin(mac) == 0) {
|
||||||
|
Serial.println("Failed to configure Ethernet using DHCP");
|
||||||
|
// initialize the ethernet device not using DHCP:
|
||||||
|
Ethernet.begin(mac, ip, gateway, subnet);
|
||||||
|
}
|
||||||
|
// print your local IP address:
|
||||||
|
Serial.print("My IP address: ");
|
||||||
|
ip = Ethernet.localIP();
|
||||||
|
for (byte thisByte = 0; thisByte < 4; thisByte++) {
|
||||||
|
// print the value of each byte of the IP address:
|
||||||
|
Serial.print(ip[thisByte], DEC);
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
// start listening for clients
|
||||||
|
server.begin();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// wait for a new client:
|
||||||
|
Client client = server.available();
|
||||||
|
|
||||||
|
// when the client sends the first byte, say hello:
|
||||||
|
if (client) {
|
||||||
|
if (!gotAMessage) {
|
||||||
|
Serial.println("We have a new client");
|
||||||
|
client.println("Hello, client!");
|
||||||
|
gotAMessage = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read the bytes incoming from the client:
|
||||||
|
char thisChar = client.read();
|
||||||
|
// echo the bytes back to the client:
|
||||||
|
server.write(thisChar);
|
||||||
|
// echo the bytes to the server as well:
|
||||||
|
Serial.print(thisChar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
Twitter Client with Strings
|
||||||
|
|
||||||
|
This sketch connects to Twitter using an Ethernet shield. It parses the XML
|
||||||
|
returned, and looks for <text>this is a tweet</text>
|
||||||
|
|
||||||
|
You can use the Arduino Ethernet shield, or the Adafruit Ethernet shield,
|
||||||
|
either one will work, as long as it's got a Wiznet Ethernet module on board.
|
||||||
|
|
||||||
|
This example uses the DHCP routines in the Ethernet library which is part of the
|
||||||
|
Arduino core from version 1.0 beta 1
|
||||||
|
|
||||||
|
This example uses the String library, which is part of the Arduino core from
|
||||||
|
version 0019.
|
||||||
|
|
||||||
|
Circuit:
|
||||||
|
* Ethernet shield attached to pins 10, 11, 12, 13
|
||||||
|
|
||||||
|
created 21 May 2011
|
||||||
|
by Tom Igoe
|
||||||
|
|
||||||
|
This code is in the public domain.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Ethernet.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Enter a MAC address and IP address for your controller below.
|
||||||
|
// The IP address will be dependent on your local network:
|
||||||
|
byte mac[] = {
|
||||||
|
0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
|
||||||
|
IPAddress ip(192,168,1,20);
|
||||||
|
|
||||||
|
// initialize the library instance:
|
||||||
|
Client client;
|
||||||
|
|
||||||
|
const int requestInterval = 60000; // delay between requests
|
||||||
|
|
||||||
|
char serverName[] = "api.twitter.com"; // twitter URL
|
||||||
|
|
||||||
|
boolean requested; // whether you've made a request since connecting
|
||||||
|
long lastAttemptTime = 0; // last time you connected to the server, in milliseconds
|
||||||
|
|
||||||
|
String currentLine = ""; // string to hold the text from server
|
||||||
|
String tweet = ""; // string to hold the tweet
|
||||||
|
boolean readingTweet = false; // if you're currently reading the tweet
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// reserve space for the strings:
|
||||||
|
currentLine.reserve(256);
|
||||||
|
tweet.reserve(150);
|
||||||
|
|
||||||
|
// initialize serial:
|
||||||
|
Serial.begin(9600);
|
||||||
|
// attempt a DHCP connection:
|
||||||
|
if (!Ethernet.begin(mac)) {
|
||||||
|
// if DHCP fails, start with a hard-coded address:
|
||||||
|
Ethernet.begin(mac, ip);
|
||||||
|
}
|
||||||
|
// connect to Twitter:
|
||||||
|
connectToServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
if (client.connected()) {
|
||||||
|
if (client.available()) {
|
||||||
|
// read incoming bytes:
|
||||||
|
char inChar = client.read();
|
||||||
|
|
||||||
|
// add incoming byte to end of line:
|
||||||
|
currentLine += inChar;
|
||||||
|
|
||||||
|
// if you get a newline, clear the line:
|
||||||
|
if (inChar == '\n') {
|
||||||
|
currentLine = "";
|
||||||
|
}
|
||||||
|
// if the current line ends with <text>, it will
|
||||||
|
// be followed by the tweet:
|
||||||
|
if ( currentLine.endsWith("<text>")) {
|
||||||
|
// tweet is beginning. Clear the tweet string:
|
||||||
|
readingTweet = true;
|
||||||
|
tweet = "";
|
||||||
|
}
|
||||||
|
// if you're currently reading the bytes of a tweet,
|
||||||
|
// add them to the tweet String:
|
||||||
|
if (readingTweet) {
|
||||||
|
if (inChar != '<') {
|
||||||
|
tweet += inChar;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// if you got a "<" character,
|
||||||
|
// you've reached the end of the tweet:
|
||||||
|
readingTweet = false;
|
||||||
|
Serial.println(tweet);
|
||||||
|
// close the connection to the server:
|
||||||
|
client.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (millis() - lastAttemptTime > requestInterval) {
|
||||||
|
// if you're not connected, and two minutes have passed since
|
||||||
|
// your last connection, then attempt to connect again:
|
||||||
|
connectToServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void connectToServer() {
|
||||||
|
// attempt to connect, and wait a millisecond:
|
||||||
|
Serial.println("connecting to server...");
|
||||||
|
if (client.connect(serverName, 80)) {
|
||||||
|
Serial.println("making HTTP request...");
|
||||||
|
// make HTTP GET request to twitter:
|
||||||
|
client.println("GET /1/statuses/user_timeline.xml?screen_name=arduino&count=1 HTTP/1.1");
|
||||||
|
client.println("HOST: api.twitter.com");
|
||||||
|
client.println();
|
||||||
|
}
|
||||||
|
// note the time of this connect attempt:
|
||||||
|
lastAttemptTime = millis();
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
Software serial multple serial test
|
||||||
|
|
||||||
|
Receives from the two software serial ports,
|
||||||
|
sends to the hardware serial port.
|
||||||
|
|
||||||
|
In order to listen on a software port, you call port.listen().
|
||||||
|
When using two software serial ports, you have to switch ports
|
||||||
|
by listen()ing on each one in turn. Pick a logical time to switch
|
||||||
|
ports, like the end of an expected transmission, or when the
|
||||||
|
buffer is empty. This example switches ports when there is nothing
|
||||||
|
more to read from a port
|
||||||
|
|
||||||
|
The circuit:
|
||||||
|
Two devices which communicate serially are needed.
|
||||||
|
* First serial device's TX attached to digital pin 2, RX to pin 3
|
||||||
|
* Second serial device's TX attached to digital pin 4, RX to pin 5
|
||||||
|
|
||||||
|
created 18 Apr. 2011
|
||||||
|
by Tom Igoe
|
||||||
|
based on Mikal Hart's twoPortRXExample
|
||||||
|
|
||||||
|
This example code is in the public domain.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
// software serial #1: TX = digital pin 2, RX = digital pin 3
|
||||||
|
SoftwareSerial portOne(2, 3);
|
||||||
|
|
||||||
|
// software serial #2: TX = digital pin 4, RX = digital pin 5
|
||||||
|
SoftwareSerial portTwo(4, 5);
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
// Start the hardware serial port
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// Start each software serial port
|
||||||
|
portOne.begin(9600);
|
||||||
|
portTwo.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
// By default, the last intialized port is listening.
|
||||||
|
// when you want to listen on a port, explicitly select it:
|
||||||
|
portOne.listen();
|
||||||
|
Serial.println("Data from port one:");
|
||||||
|
// while there is data coming in, read it
|
||||||
|
// and send to the hardware serial port:
|
||||||
|
while (portOne.available() > 0) {
|
||||||
|
char inByte = portOne.read();
|
||||||
|
Serial.write(inByte);
|
||||||
|
}
|
||||||
|
|
||||||
|
// blank line to separate data from the two ports:
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// Now listen on the second port
|
||||||
|
portTwo.listen();
|
||||||
|
// while there is data coming in, read it
|
||||||
|
// and send to the hardware serial port:
|
||||||
|
Serial.println("Data from port two:");
|
||||||
|
while (portTwo.available() > 0) {
|
||||||
|
char inByte = portTwo.read();
|
||||||
|
Serial.write(inByte);
|
||||||
|
}
|
||||||
|
|
||||||
|
// blank line to separate data from the two ports:
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue