Merge branch 'master' of github.com:arduino/Arduino into diskloader_reboot

Conflicts:
	app/src/processing/app/Editor.java
	app/src/processing/app/Sketch.java
	build/shared/examples/4.Communication/SerialCallResponse/SerialCallResponse.pde
	build/shared/lib/theme/theme.txt
	hardware/arduino/cores/arduino/HardwareSerial.h
	hardware/arduino/cores/arduino/Print.cpp
	hardware/arduino/cores/arduino/WString.h
	hardware/arduino/variants/mega/pins_arduino.h
	libraries/Ethernet/examples/PachubeClient/PachubeClient.ino
	libraries/Ethernet/examples/PachubeClientString/PachubeClientString.ino
	libraries/Firmata/examples/EchoString/EchoString.ino
	libraries/SD/File.cpp
	libraries/SoftwareSerial/SoftwareSerial.cpp
	libraries/SoftwareSerial/SoftwareSerial.h
	libraries/SoftwareSerial/examples/SoftwareSerialExample/SoftwareSerialExample.ino
	libraries/SoftwareSerial/keywords.txt
This commit is contained in:
Zach Eveland 2011-10-27 09:32:27 -04:00
commit df9835efaf
42 changed files with 2415 additions and 1992 deletions

View File

@ -545,7 +545,7 @@ public class Base {
newbieDir.mkdirs();
// Make an empty pde file
File newbieFile = new File(newbieDir, newbieName + ".ino");
File newbieFile = new File(newbieDir, newbieName + ".pde");
new FileOutputStream(newbieFile); // create the file
return newbieFile.getAbsolutePath();
}
@ -637,8 +637,7 @@ public class Base {
public boolean accept(File dir, String name) {
// TODO this doesn't seem to ever be used. AWESOME.
//System.out.println("check filter on " + dir + " " + name);
return name.toLowerCase().endsWith(".ino")
|| name.toLowerCase().endsWith(".pde");
return name.toLowerCase().endsWith(".pde");
}
});
@ -1025,28 +1024,22 @@ public class Base {
}
public void rebuildProgrammerMenu(JMenu menu) {
//System.out.println("rebuilding programmer menu");
public void rebuildBurnBootloaderMenu(JMenu menu) {
//System.out.println("rebuilding burn bootloader menu");
menu.removeAll();
ButtonGroup group = new ButtonGroup();
for (Target target : targetsTable.values()) {
for (String programmer : target.getProgrammers().keySet()) {
AbstractAction action =
new AbstractAction(
target.getProgrammers().get(programmer).get("name")) {
"w/ " + target.getProgrammers().get(programmer).get("name")) {
public void actionPerformed(ActionEvent actionevent) {
Preferences.set("programmer", getValue("target") + ":" +
getValue("programmer"));
activeEditor.handleBurnBootloader((String) getValue("target"),
(String) getValue("programmer"));
}
};
action.putValue("target", target.getName());
action.putValue("programmer", programmer);
JMenuItem item = new JRadioButtonMenuItem(action);
if (Preferences.get("programmer").equals(target.getName() + ":" +
programmer)) {
item.setSelected(true);
}
group.add(item);
JMenuItem item = new JMenuItem(action);
menu.add(item);
}
}
@ -1106,10 +1099,7 @@ public class Base {
File subfolder = new File(folder, list[i]);
if (!subfolder.isDirectory()) continue;
File entry = new File(subfolder, list[i] + ".ino");
if (!entry.exists() && (new File(subfolder, list[i] + ".pde")).exists()) {
entry = new File(subfolder, list[i] + ".pde");
}
File entry = new File(subfolder, list[i] + ".pde");
// if a .pde file of the same prefix as the folder exists..
if (entry.exists()) {
//String sanityCheck = sanitizedName(list[i]);

View File

@ -46,7 +46,6 @@ import gnu.io.*;
/**
* Main editor panel for the Processing Development Environment.
*/
@SuppressWarnings("serial")
public class Editor extends JFrame implements RunnerListener {
Base base;
@ -114,7 +113,7 @@ public class Editor extends JFrame implements RunnerListener {
EditorLineStatus lineStatus;
//JEditorPane editorPane;
JEditorPane editorPane;
JEditTextArea textarea;
EditorListener listener;
@ -196,10 +195,8 @@ public class Editor extends JFrame implements RunnerListener {
//PdeKeywords keywords = new PdeKeywords();
//sketchbook = new Sketchbook(this);
if (serialMonitor == null) {
if (serialMonitor == null)
serialMonitor = new SerialMonitor(Preferences.get("serial.port"));
serialMonitor.setIconImage(getIconImage());
}
buildMenuBar();
@ -541,7 +538,7 @@ public class Editor extends JFrame implements RunnerListener {
});
fileMenu.add(saveAsMenuItem);
item = newJMenuItem("Upload", 'U');
item = newJMenuItem("Upload to I/O Board", 'U');
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleExport(false);
@ -549,13 +546,13 @@ public class Editor extends JFrame implements RunnerListener {
});
fileMenu.add(item);
item = newJMenuItemShift("Upload Using Programmer", 'U');
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleExport(true);
}
});
fileMenu.add(item);
// item = newJMenuItemShift("Upload to I/O Board (verbose)", 'U');
// item.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// handleExport(true);
// }
// });
// fileMenu.add(item);
fileMenu.addSeparator();
@ -621,13 +618,13 @@ public class Editor extends JFrame implements RunnerListener {
// });
// sketchMenu.add(item);
// item = new JMenuItem("Stop");
// item.addActionListener(new ActionListener() {
// public void actionPerformed(ActionEvent e) {
// handleStop();
// }
// });
// sketchMenu.add(item);
item = new JMenuItem("Stop");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleStop();
}
});
sketchMenu.add(item);
sketchMenu.addSeparator();
@ -696,20 +693,12 @@ public class Editor extends JFrame implements RunnerListener {
serialMenu = new JMenu("Serial Port");
populateSerialMenu();
menu.add(serialMenu);
menu.addSeparator();
JMenu programmerMenu = new JMenu("Programmer");
base.rebuildProgrammerMenu(programmerMenu);
menu.add(programmerMenu);
item = new JMenuItem("Burn Bootloader");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleBurnBootloader();
}
});
menu.add(item);
JMenu bootloaderMenu = new JMenu("Burn Bootloader");
base.rebuildBurnBootloaderMenu(bootloaderMenu);
menu.add(bootloaderMenu);
menu.addMenuListener(new MenuListener() {
public void menuCanceled(MenuEvent e) {}
@ -910,7 +899,6 @@ public class Editor extends JFrame implements RunnerListener {
public void actionPerformed(ActionEvent e) {
selectSerialPort(((JCheckBoxMenuItem)e.getSource()).getText());
base.onBoardOrPortChange();
}
/*
@ -1001,8 +989,8 @@ public class Editor extends JFrame implements RunnerListener {
//serialMenu.addSeparator();
//serialMenu.add(item);
}
protected JMenu buildHelpMenu() {
// To deal with a Mac OS X 10.5 bug, add an extra space after the name
// so that the OS doesn't try to insert its slow help menu.
@ -1822,7 +1810,7 @@ public class Editor extends JFrame implements RunnerListener {
internalCloseRunner();
running = true;
toolbar.activate(EditorToolbar.RUN);
status.progress("Compiling sketch...");
statusNotice("Compiling...");
// do this to advance/clear the terminal window / dos prompt / etc
for (int i = 0; i < 10; i++) System.out.println();
@ -1842,14 +1830,12 @@ public class Editor extends JFrame implements RunnerListener {
public void run() {
try {
sketch.prepare();
sketch.build(false);
String appletClassName = sketch.build(false);
statusNotice("Done compiling.");
} catch (Exception e) {
status.unprogress();
statusError(e);
}
status.unprogress();
toolbar.deactivate(EditorToolbar.RUN);
}
}
@ -1859,14 +1845,12 @@ public class Editor extends JFrame implements RunnerListener {
public void run() {
try {
sketch.prepare();
sketch.build(true);
String appletClassName = sketch.build(true);
statusNotice("Done compiling.");
} catch (Exception e) {
status.unprogress();
statusError(e);
}
status.unprogress();
toolbar.deactivate(EditorToolbar.RUN);
}
}
@ -1903,12 +1887,12 @@ public class Editor extends JFrame implements RunnerListener {
* Implements Sketch &rarr; Stop, or pressing Stop on the toolbar.
*/
public void handleStop() { // called by menu or buttons
// toolbar.activate(EditorToolbar.STOP);
toolbar.activate(EditorToolbar.STOP);
internalCloseRunner();
toolbar.deactivate(EditorToolbar.RUN);
// toolbar.deactivate(EditorToolbar.STOP);
toolbar.deactivate(EditorToolbar.STOP);
// focus the PDE again after quitting presentation mode [toxi 030903]
toFront();
@ -2051,35 +2035,33 @@ public class Editor extends JFrame implements RunnerListener {
// check to make sure that this .pde file is
// in a folder of the same name
File file = new File(path);
String fileName = file.getName();
File parent = file.getParentFile();
String parentName = parent.getName();
File parentFile = new File(file.getParent());
String parentName = parentFile.getName();
String pdeName = parentName + ".pde";
File altPdeFile = new File(parent, pdeName);
String inoName = parentName + ".ino";
File altInoFile = new File(parent, pdeName);
if (pdeName.equals(fileName) || inoName.equals(fileName)) {
File altFile = new File(file.getParent(), pdeName);
if (pdeName.equals(file.getName())) {
// no beef with this guy
} else if (altPdeFile.exists()) {
// user selected a .java from the same sketch, but open the .pde instead
path = altPdeFile.getAbsolutePath();
} else if (altInoFile.exists()) {
path = altInoFile.getAbsolutePath();
} else if (!path.endsWith(".ino") && !path.endsWith(".pde")) {
} else if (altFile.exists()) {
// user selected a .java from the same sketch,
// but open the .pde instead
path = altFile.getAbsolutePath();
//System.out.println("found alt file in same folder");
} else if (!path.endsWith(".pde")) {
Base.showWarning("Bad file selected",
"Processing can only open its own sketches\n" +
"and other files ending in .ino or .pde", null);
"and other files ending in .pde", null);
return false;
} else {
String properParent =
fileName.substring(0, fileName.length() - 4);
file.getName().substring(0, file.getName().length() - 4);
Object[] options = { "OK", "Cancel" };
String prompt =
"The file \"" + fileName + "\" needs to be inside\n" +
"The file \"" + file.getName() + "\" needs to be inside\n" +
"a sketch folder named \"" + properParent + "\".\n" +
"Create this folder, move the file, and continue?";
@ -2174,7 +2156,7 @@ public class Editor extends JFrame implements RunnerListener {
// need to get the name, user might also cancel here
} else if (immediately) {
return handleSave2();
handleSave2();
} else {
SwingUtilities.invokeLater(new Runnable() {
@ -2187,16 +2169,15 @@ public class Editor extends JFrame implements RunnerListener {
}
protected boolean handleSave2() {
protected void handleSave2() {
toolbar.activate(EditorToolbar.SAVE);
statusNotice("Saving...");
boolean saved = false;
try {
saved = sketch.save();
if (saved)
if (sketch.save()) {
statusNotice("Done Saving.");
else
} else {
statusEmpty();
}
// rebuild sketch menu in case a save-as was forced
// Disabling this for 0125, instead rebuild the menu inside
// the Save As method of the Sketch object, since that's the
@ -2215,7 +2196,6 @@ public class Editor extends JFrame implements RunnerListener {
}
//toolbar.clear();
toolbar.deactivate(EditorToolbar.SAVE);
return saved;
}
@ -2272,7 +2252,6 @@ public class Editor extends JFrame implements RunnerListener {
0);
if (result == null) return false;
selectSerialPort(result);
base.onBoardOrPortChange();
return true;
}
@ -2292,13 +2271,13 @@ public class Editor extends JFrame implements RunnerListener {
* Made synchronized to (hopefully) avoid problems of people
* hitting export twice, quickly, and horking things up.
*/
synchronized public void handleExport(final boolean usingProgrammer) {
synchronized public void handleExport(final boolean verbose) {
//if (!handleExportCheckModified()) return;
toolbar.activate(EditorToolbar.EXPORT);
console.clear();
status.progress("Uploading to I/O Board...");
statusNotice("Uploading to I/O Board...");
new Thread(usingProgrammer ? exportAppHandler : exportHandler).start();
new Thread(verbose ? exportAppHandler : exportHandler).start();
}
// DAM: in Arduino, this is upload
@ -2325,12 +2304,10 @@ public class Editor extends JFrame implements RunnerListener {
} catch (RunnerException e) {
//statusError("Error during upload.");
//e.printStackTrace();
status.unprogress();
statusError(e);
} catch (Exception e) {
e.printStackTrace();
}
status.unprogress();
uploading = false;
//toolbar.clear();
toolbar.deactivate(EditorToolbar.EXPORT);
@ -2361,12 +2338,10 @@ public class Editor extends JFrame implements RunnerListener {
} catch (RunnerException e) {
//statusError("Error during upload.");
//e.printStackTrace();
status.unprogress();
statusError(e);
} catch (Exception e) {
e.printStackTrace();
}
status.unprogress();
uploading = false;
//toolbar.clear();
toolbar.deactivate(EditorToolbar.EXPORT);
@ -2420,14 +2395,14 @@ public class Editor extends JFrame implements RunnerListener {
}
protected void handleBurnBootloader() {
protected void handleBurnBootloader(final String target, final String programmer) {
console.clear();
statusNotice("Burning bootloader to I/O Board (this may take a minute)...");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
Uploader uploader = new AvrdudeUploader();
if (uploader.burnBootloader()) {
if (uploader.burnBootloader(target, programmer)) {
statusNotice("Done burning bootloader.");
} else {
statusError("Error while burning bootloader.");
@ -2581,49 +2556,30 @@ public class Editor extends JFrame implements RunnerListener {
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
protected void onBoardOrPortChange() {
Map<String, String> boardPreferences = Base.getBoardPreferences();
lineStatus.setBoardName(boardPreferences.get("name"));
lineStatus.setSerialPort(Preferences.get("serial.port"));
lineStatus.repaint();
}
/**
* Returns the edit popup menu.
*/
class TextAreaPopup extends JPopupMenu {
//private String currentDir = System.getProperty("user.dir");
private String referenceFile = null;
//String currentDir = System.getProperty("user.dir");
String referenceFile = null;
private JMenuItem cutItem;
private JMenuItem copyItem;
private JMenuItem discourseItem;
private JMenuItem referenceItem;
private JMenuItem openURLItem;
private JSeparator openURLItemSeparator;
JMenuItem cutItem;
JMenuItem copyItem;
JMenuItem discourseItem;
JMenuItem referenceItem;
private String clickedURL;
public TextAreaPopup() {
openURLItem = new JMenuItem("Open URL");
openURLItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Base.openURL(clickedURL);
}
});
add(openURLItem);
openURLItemSeparator = new JSeparator();
add(openURLItemSeparator);
JMenuItem item;
cutItem = new JMenuItem("Cut");
cutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleCut();
}
});
add(cutItem);
this.add(cutItem);
copyItem = new JMenuItem("Copy");
copyItem.addActionListener(new ActionListener() {
@ -2631,7 +2587,7 @@ public class Editor extends JFrame implements RunnerListener {
handleCopy();
}
});
add(copyItem);
this.add(copyItem);
discourseItem = new JMenuItem("Copy for Forum");
discourseItem.addActionListener(new ActionListener() {
@ -2639,7 +2595,7 @@ public class Editor extends JFrame implements RunnerListener {
handleDiscourseCopy();
}
});
add(discourseItem);
this.add(discourseItem);
discourseItem = new JMenuItem("Copy as HTML");
discourseItem.addActionListener(new ActionListener() {
@ -2647,15 +2603,15 @@ public class Editor extends JFrame implements RunnerListener {
handleHTMLCopy();
}
});
add(discourseItem);
this.add(discourseItem);
JMenuItem item = new JMenuItem("Paste");
item = new JMenuItem("Paste");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handlePaste();
}
});
add(item);
this.add(item);
item = new JMenuItem("Select All");
item.addActionListener(new ActionListener() {
@ -2663,9 +2619,9 @@ public class Editor extends JFrame implements RunnerListener {
handleSelectAll();
}
});
add(item);
this.add(item);
addSeparator();
this.addSeparator();
item = new JMenuItem("Comment/Uncomment");
item.addActionListener(new ActionListener() {
@ -2673,7 +2629,7 @@ public class Editor extends JFrame implements RunnerListener {
handleCommentUncomment();
}
});
add(item);
this.add(item);
item = new JMenuItem("Increase Indent");
item.addActionListener(new ActionListener() {
@ -2681,7 +2637,7 @@ public class Editor extends JFrame implements RunnerListener {
handleIndentOutdent(true);
}
});
add(item);
this.add(item);
item = new JMenuItem("Decrease Indent");
item.addActionListener(new ActionListener() {
@ -2689,9 +2645,9 @@ public class Editor extends JFrame implements RunnerListener {
handleIndentOutdent(false);
}
});
add(item);
this.add(item);
addSeparator();
this.addSeparator();
referenceItem = new JMenuItem("Find in Reference");
referenceItem.addActionListener(new ActionListener() {
@ -2699,23 +2655,11 @@ public class Editor extends JFrame implements RunnerListener {
handleFindReference();
}
});
add(referenceItem);
this.add(referenceItem);
}
// if no text is selected, disable copy and cut menu items
public void show(Component component, int x, int y) {
int lineNo = textarea.getLineOfOffset(textarea.xyToOffset(x, y));
int offset = textarea.xToOffset(lineNo, x);
String line = textarea.getLineText(lineNo);
clickedURL = textarea.checkClickedURL(line, offset);
if (clickedURL != null) {
openURLItem.setVisible(true);
openURLItemSeparator.setVisible(true);
} else {
openURLItem.setVisible(false);
openURLItemSeparator.setVisible(false);
}
if (textarea.isSelectionActive()) {
cutItem.setEnabled(true);
copyItem.setEnabled(true);

View File

@ -37,12 +37,12 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
/** Rollover titles for each button. */
static final String title[] = {
"Verify", "Upload", "New", "Open", "Save", "Serial Monitor"
"Verify", "Stop", "New", "Open", "Save", "Upload", "Serial Monitor"
};
/** Titles for each button when the shift key is pressed. */
static final String titleShift[] = {
"Verify", "Upload Using Programmer", "New Editor Window", "Open in Another Window", "Save", "Serial Monitor"
"Verify (w/ Verbose Output)", "Stop", "New Editor Window", "Open in Another Window", "Save", "Upload (w/ Verbose Output)", "Serial Monitor"
};
static final int BUTTON_COUNT = title.length;
@ -57,13 +57,14 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
static final int RUN = 0;
static final int EXPORT = 1;
static final int STOP = 1;
static final int NEW = 2;
static final int OPEN = 3;
static final int SAVE = 4;
static final int EXPORT = 5;
static final int SERIAL = 5;
static final int SERIAL = 6;
static final int INACTIVE = 0;
static final int ROLLOVER = 1;
@ -104,10 +105,11 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
//which[buttonCount++] = NOTHING;
which[buttonCount++] = RUN;
which[buttonCount++] = EXPORT;
which[buttonCount++] = STOP;
which[buttonCount++] = NEW;
which[buttonCount++] = OPEN;
which[buttonCount++] = SAVE;
which[buttonCount++] = EXPORT;
which[buttonCount++] = SERIAL;
currentRollover = -1;
@ -320,13 +322,13 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
switch (sel) {
case RUN:
editor.handleRun(false);
editor.handleRun(e.isShiftDown());
break;
case STOP:
editor.handleStop();
break;
// case STOP:
// editor.handleStop();
// break;
//
case OPEN:
popup = menu.getPopupMenu();
popup.show(EditorToolbar.this, x, y);

View File

@ -113,8 +113,6 @@ public class Preferences {
JTextField sketchbookLocationField;
JCheckBox exportSeparateBox;
JCheckBox verboseCompilationBox;
JCheckBox verboseUploadBox;
JCheckBox deletePreviousBox;
JCheckBox externalEditorBox;
JCheckBox memoryOverrideBox;
@ -282,21 +280,6 @@ public class Preferences {
top += d.height + GUI_BETWEEN;
// Show verbose output during: [ ] compilation [ ] upload
box = Box.createHorizontalBox();
label = new JLabel("Show verbose output during: ");
box.add(label);
verboseCompilationBox = new JCheckBox("compilation ");
box.add(verboseCompilationBox);
verboseUploadBox = new JCheckBox("upload");
box.add(verboseUploadBox);
pain.add(box);
d = box.getPreferredSize();
box.setBounds(left, top, d.width, d.height);
top += d.height + GUI_BETWEEN;
// [ ] Delete previous applet or application folder on export
deletePreviousBox =
@ -487,8 +470,6 @@ public class Preferences {
*/
protected void applyFrame() {
// put each of the settings into the table
setBoolean("build.verbose", verboseCompilationBox.isSelected());
setBoolean("upload.verbose", verboseUploadBox.isSelected());
setBoolean("export.delete_target_folder",
deletePreviousBox.isSelected());
@ -546,8 +527,6 @@ public class Preferences {
this.editor = editor;
// set all settings entry boxes to their actual status
verboseCompilationBox.setSelected(getBoolean("build.verbose"));
verboseUploadBox.setSelected(getBoolean("upload.verbose"));
deletePreviousBox.
setSelected(getBoolean("export.delete_target_folder"));

View File

@ -36,7 +36,6 @@ import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.util.*;
import java.util.List;
import java.util.zip.*;
import javax.swing.*;
@ -262,6 +261,7 @@ public class Sketch {
}
}
boolean renamingCode;
/**
@ -315,7 +315,7 @@ public class Sketch {
renamingCode = true;
String prompt = (currentIndex == 0) ?
"New name for sketch:" : "New name for file:";
String oldName = (current.isExtension("ino")) ?
String oldName = (current.isExtension("pde")) ?
current.getPrettyName() : current.getFileName();
editor.status.edit(prompt, oldName);
}
@ -495,7 +495,7 @@ public class Sketch {
}
// if successful, set base properties for the sketch
File newMainFile = new File(newFolder, newName + ".ino");
File newMainFile = new File(newFolder, newName + ".pde");
String newMainFilePath = newMainFile.getAbsolutePath();
// having saved everything and renamed the folder and the main .pde,
@ -707,68 +707,15 @@ public class Sketch {
"need to re-save this sketch to another location.");
// if the user cancels, give up on the save()
if (!saveAs()) return false;
} else {
// rename .pde files to .ino
File mainFile = new File(getMainFilePath());
File mainFolder = mainFile.getParentFile();
File[] pdeFiles = mainFolder.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".pde");
}
});
if (pdeFiles != null && pdeFiles.length > 0) {
if (Preferences.get("editor.update_extension") == null) {
Object[] options = { "OK", "Cancel" };
int result = JOptionPane.showOptionDialog(editor,
"In Arduino 1.0, the default file extension has changed\n" +
"from .pde to .ino. New sketches (including those created\n" +
"by \"Save-As\" will use the new extension. The extension\n" +
"of existing sketches will be updated on save, but you can\n" +
"disable this in the Preferences dialog.\n" +
"\n" +
"Save sketch and update its extension?",
".pde -> .ino",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[0]);
if (result != JOptionPane.OK_OPTION) return false; // save cancelled
Preferences.setBoolean("editor.update_extension", true);
}
if (Preferences.getBoolean("editor.update_extension")) {
// Do rename of all .pde files to new .ino extension
for (File pdeFile : pdeFiles)
renameCodeToInoExtension(pdeFile);
}
}
}
for (int i = 0; i < codeCount; i++) {
if (code[i].isModified())
code[i].save();
if (code[i].isModified()) code[i].save();
}
calcModified();
return true;
}
protected boolean renameCodeToInoExtension(File pdeFile) {
for (SketchCode c : code) {
if (!c.getFile().equals(pdeFile))
continue;
String pdeName = pdeFile.getPath();
pdeName = pdeName.substring(0, pdeName.length() - 4) + ".ino";
return c.renameTo(new File(pdeName), "ino");
}
return false;
}
/**
* Handles 'Save As' for a sketch.
@ -913,7 +860,7 @@ public class Sketch {
}
// save the main tab with its new name
File newFile = new File(newFolder, newName + ".ino");
File newFile = new File(newFolder, newName + ".pde");
code[0].saveAs(newFile);
editor.handleOpenUnchecked(newFile.getPath(),
@ -1314,7 +1261,7 @@ public class Sketch {
StringBuffer bigCode = new StringBuffer();
int bigCount = 0;
for (SketchCode sc : code) {
if (sc.isExtension("ino") || sc.isExtension("pde")) {
if (sc.isExtension("pde")) {
sc.setPreprocOffset(bigCount);
bigCode.append(sc.getProgram());
bigCode.append('\n');
@ -1410,7 +1357,7 @@ public class Sketch {
}
// sc.setPreprocName(filename);
} else if (sc.isExtension("ino") || sc.isExtension("pde")) {
} else if (sc.isExtension("pde")) {
// The compiler and runner will need this to have a proper offset
sc.addPreprocOffset(headerOffset);
}
@ -1439,7 +1386,7 @@ public class Sketch {
// SketchCode errorCode = null;
// if (filename.equals(appletJavaFile)) {
// for (SketchCode code : getCode()) {
// if (code.isExtension("ino")) {
// if (code.isExtension("pde")) {
// if (line >= code.getPreprocOffset()) {
// errorCode = code;
// }
@ -1560,7 +1507,6 @@ public class Sketch {
throws RunnerException {
// run the preprocessor
editor.status.progressUpdate(20);
String primaryClassName = preprocess(buildPath);
// compile the program. errors will happen as a RunnerException
@ -1574,15 +1520,15 @@ public class Sketch {
}
protected boolean exportApplet(boolean usingProgrammer) throws Exception {
return exportApplet(tempBuildFolder.getAbsolutePath(), usingProgrammer);
protected boolean exportApplet(boolean verbose) throws Exception {
return exportApplet(tempBuildFolder.getAbsolutePath(), verbose);
}
/**
* Handle export to applet.
*/
public boolean exportApplet(String appletPath, boolean usingProgrammer)
public boolean exportApplet(String appletPath, boolean verbose)
throws RunnerException, IOException, SerialException {
// Make sure the user didn't hide the sketch folder
@ -1606,7 +1552,6 @@ public class Sketch {
appletFolder.mkdirs();
// build the sketch
editor.status.progressNotice("Compiling sketch...");
String foundName = build(appletFolder.getPath(), false);
// (already reported) error during export, exit this function
if (foundName == null) return false;
@ -1620,18 +1565,12 @@ public class Sketch {
// return false;
// }
editor.status.progressNotice("Uploading...");
upload(appletFolder.getPath(), foundName, usingProgrammer);
editor.status.progressUpdate(100);
upload(appletFolder.getPath(), foundName, verbose);
return true;
}
public void setCompilingProgress(int percent) {
editor.status.progressUpdate(percent);
}
protected void size(String buildPath, String suggestedClassName)
throws RunnerException {
long size = 0;
@ -1653,7 +1592,7 @@ public class Sketch {
}
protected String upload(String buildPath, String suggestedClassName, boolean usingProgrammer)
protected String upload(String buildPath, String suggestedClassName, boolean verbose)
throws RunnerException, SerialException {
Uploader uploader;
@ -1663,7 +1602,7 @@ public class Sketch {
uploader = new AvrdudeUploader();
boolean success = uploader.uploadUsingPreferences(buildPath,
suggestedClassName,
usingProgrammer);
verbose);
return success ? suggestedClassName : null;
}
@ -1815,7 +1754,7 @@ public class Sketch {
* For Processing, this is true for .pde files. (Broken out for subclasses.)
*/
public boolean hideExtension(String what) {
return getHiddenExtensions().contains(what);
return what.equals(getDefaultExtension());
}
@ -1852,20 +1791,15 @@ public class Sketch {
* Returns the default extension for this editor setup.
*/
public String getDefaultExtension() {
return "ino";
return "pde";
}
static private List<String> hiddenExtensions = Arrays.asList("ino", "pde");
public List<String> getHiddenExtensions() {
return hiddenExtensions;
}
/**
* Returns a String[] array of proper extensions.
*/
public String[] getExtensions() {
return new String[] { "ino", "pde", "c", "cpp", "h" };
return new String[] { "pde", "c", "cpp", "h" };
}

View File

@ -42,28 +42,33 @@ public class AvrdudeUploader extends Uploader {
public AvrdudeUploader() {
}
public boolean uploadUsingPreferences(String buildPath, String className, boolean usingProgrammer)
// XXX: add support for uploading sketches using a programmer
public boolean uploadUsingPreferences(String buildPath, String className, boolean verbose)
throws RunnerException, SerialException {
this.verbose = verbose;
Map<String, String> boardPreferences = Base.getBoardPreferences();
String uploadUsing = boardPreferences.get("upload.using");
if (uploadUsing == null) {
// fall back on global preference
uploadUsing = Preferences.get("upload.using");
}
if (uploadUsing.equals("bootloader")) {
return uploadViaBootloader(buildPath, className);
} else {
Target t;
// if no protocol is specified for this board, assume it lacks a
// bootloader and upload using the selected programmer.
if (usingProgrammer || boardPreferences.get("upload.protocol") == null) {
String programmer = Preferences.get("programmer");
Target target = Base.getTarget();
if (programmer.indexOf(":") != -1) {
target = Base.targetsTable.get(programmer.substring(0, programmer.indexOf(":")));
programmer = programmer.substring(programmer.indexOf(":") + 1);
if (uploadUsing.indexOf(':') == -1) {
t = Base.getTarget(); // the current target (associated with the board)
} else {
String targetName = uploadUsing.substring(0, uploadUsing.indexOf(':'));
t = Base.targetsTable.get(targetName);
uploadUsing = uploadUsing.substring(uploadUsing.indexOf(':') + 1);
}
Collection params = getProgrammerCommands(target, programmer);
Collection params = getProgrammerCommands(t, uploadUsing);
params.add("-Uflash:w:" + buildPath + File.separator + className + ".hex:i");
return avrdude(params);
}
return uploadViaBootloader(buildPath, className);
}
private boolean uploadViaBootloader(String buildPath, String className)
@ -91,14 +96,8 @@ public class AvrdudeUploader extends Uploader {
return avrdude(commandDownloader);
}
public boolean burnBootloader() throws RunnerException {
String programmer = Preferences.get("programmer");
Target target = Base.getTarget();
if (programmer.indexOf(":") != -1) {
target = Base.targetsTable.get(programmer.substring(0, programmer.indexOf(":")));
programmer = programmer.substring(programmer.indexOf(":") + 1);
}
return burnBootloader(getProgrammerCommands(target, programmer));
public boolean burnBootloader(String targetName, String programmer) throws RunnerException {
return burnBootloader(getProgrammerCommands(Base.targetsTable.get(targetName), programmer));
}
private Collection getProgrammerCommands(Target target, String programmer) {

View File

@ -64,10 +64,10 @@ public abstract class Uploader implements MessageConsumer {
public Uploader() {
}
public abstract boolean uploadUsingPreferences(String buildPath, String className, boolean usingProgrammer)
public abstract boolean uploadUsingPreferences(String buildPath, String className, boolean verbose)
throws RunnerException, SerialException;
public abstract boolean burnBootloader() throws RunnerException;
public abstract boolean burnBootloader(String target, String programmer) throws RunnerException;
protected void flushSerialBuffer() throws RunnerException, SerialException {
// Cleanup the serial buffer

View File

@ -44,8 +44,8 @@ public class Platform extends processing.app.Platform {
static final String openCommand =
System.getProperty("user.dir").replace('/', '\\') +
"\\arduino.exe \"%1\"";
static final String DOC = "Arduino.Document";
"\\processing.exe \"%1\"";
static final String DOC = "Processing.Document";
public void init(Base base) {
super.init(base);
@ -86,13 +86,13 @@ public class Platform extends processing.app.Platform {
*/
protected void setAssociations() throws UnsupportedEncodingException {
if (Registry.createKey(REGISTRY_ROOT_KEY.CLASSES_ROOT,
"", ".ino") &&
"", ".pde") &&
Registry.setStringValue(REGISTRY_ROOT_KEY.CLASSES_ROOT,
".ino", "", DOC) &&
".pde", "", DOC) &&
Registry.createKey(REGISTRY_ROOT_KEY.CLASSES_ROOT, "", DOC) &&
Registry.setStringValue(REGISTRY_ROOT_KEY.CLASSES_ROOT, DOC, "",
"Arduino Source Code") &&
"Processing Source Code") &&
Registry.createKey(REGISTRY_ROOT_KEY.CLASSES_ROOT,
DOC, "shell") &&

View File

@ -35,15 +35,13 @@
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>ino</string>
<string>c</string>
<string>cpp</string>
<string>h</string>
<string>pde</string>
<string>java</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>pde.icns</string>
<key>CFBundleTypeName</key>
<string>Arduino Source File</string>
<string>Processing Source File</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>text/plain</string>

File diff suppressed because it is too large Load Diff

BIN
build/shared/lib/about.jpg Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 113 KiB

View File

@ -240,8 +240,6 @@ run.present.exclusive.macosx = true
board = uno
target = arduino
programmer = arduino:avrispmkii
upload.using = bootloader
serial.port=COM1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 B

After

Width:  |  Height:  |  Size: 869 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 B

After

Width:  |  Height:  |  Size: 832 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 B

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 B

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 B

After

Width:  |  Height:  |  Size: 834 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 B

After

Width:  |  Height:  |  Size: 844 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 B

After

Width:  |  Height:  |  Size: 896 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 B

After

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 B

After

Width:  |  Height:  |  Size: 842 B

View File

@ -1,35 +1,35 @@
# GUI - STATUS
status.notice.fgcolor = #002325
status.notice.bgcolor = #17A1A5
status.error.fgcolor = #FFFFFF
status.error.bgcolor = #E34C00
status.notice.fgcolor = #000000
status.notice.bgcolor = #54919e
status.error.fgcolor = #ffffff
status.error.bgcolor = #662000
status.edit.fgcolor = #000000
status.edit.bgcolor = #F1B500
status.edit.bgcolor = #cc9900
status.font = SansSerif,plain,12
# GUI - TABS
# settings for the tabs at the top
# (tab images are stored in the lib/theme folder)
header.bgcolor = #17A1A5
header.text.selected.color = #005B5B
header.text.unselected.color = #007e82
header.bgcolor = #216886
header.text.selected.color = #1a1a00
header.text.unselected.color = #ffffff
header.text.font = SansSerif,plain,12
# GUI - CONSOLE
console.font = Monospaced,plain,11
console.font.macosx = Monaco,plain,10
console.color = #000000
console.output.color = #eeeeee
console.error.color = #E34C00
console.output.color = #cccccc
console.error.color = #ff3000
# GUI - BUTTONS
buttons.bgcolor = #006468
buttons.bgcolor = #044f6f
buttons.status.font = SansSerif,plain,12
buttons.status.color = #ffffff
# GUI - LINESTATUS
# GUI - LINESTATUS
linestatus.color = #ffffff
linestatus.bgcolor = #006468
linestatus.bgcolor = #044f6f
# EDITOR - DETAILS
@ -83,9 +83,6 @@ editor.literal1.style = #006699,plain
# p5 built in variables: e.g. mouseX, width, pixels
editor.literal2.style = #006699,plain
# http://arduino.cc/
editor.url.style = #0000ff,underlined
# e.g. + - = /
editor.operator.style = #000000,plain

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 KiB

After

Width:  |  Height:  |  Size: 374 KiB

View File

@ -10,7 +10,7 @@ uno.bootloader.extended_fuses=0x05
uno.bootloader.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.lock_bits=0x2F
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.core=arduino

View File

@ -95,7 +95,8 @@ LICENSE:
#include "command.h"
#if defined(_MEGA_BOARD_) || defined(_BOARD_AMBER128_) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
//#if defined(_MEGA_BOARD_) || defined(_BOARD_AMBER128_) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
#if 0
#define ENABLE_MONITOR
static void RunMonitor(void);
#endif

View File

@ -1,513 +1,141 @@
:020000023000CC
:10E000000D94F6F20D941FF30D941FF30D941FF36E
:10E010000D941FF30D941FF30D941FF30D941FF334
:10E020000D941FF30D941FF30D941FF30D941FF324
:10E030000D941FF30D941FF30D941FF30D941FF314
:10E040000D941FF30D941FF30D941FF30D941FF304
:10E050000D941FF30D941FF30D941FF30D941FF3F4
:10E060000D941FF30D941FF30D941FF30D941FF3E4
:10E070000D941FF30D941FF30D941FF30D941FF3D4
:10E080000D941FF30D941FF30D941FF30D941FF3C4
:10E090000D941FF30D941FF30D941FF30D941FF3B4
:10E0A0000D941FF30D941FF30D941FF30D941FF3A4
:10E0B0000D941FF30D941FF30D941FF30D941FF394
:10E0C0000D941FF30D941FF30D941FF30D941FF384
:10E0D0000D941FF30D941FF30D941FF30D941FF374
:10E0E0000D941FF341546D65676132353630004140
:10E0F000726475696E6F206578706C6F72657220DE
:10E1000073746B3530305632206279204D4C530099
:10E11000426F6F746C6F616465723E004875683F52
:10E1200000436F6D70696C6564206F6E20203D2028
:10E1300000435055205479706520202020203D2038
:10E14000005F5F4156525F415243485F5F203D2070
:10E1500000415652204C69624320566572203D2092
:10E16000004743432056657273696F6E20203D203F
:10E1700000435055207369676E61747572653D2068
:10E18000004C6F77206675736520202020203D208D
:10E1900000486967682066757365202020203D204F
:10E1A00000457874206675736520202020203D206E
:10E1B000004C6F636B2066757365202020203D2026
:10E1C00000536570202039203230313000312E3636
:10E1D0002E3700342E332E33005623202020414486
:10E1E00044522020206F7020636F6465202020201F
:10E1F00020696E737472756374696F6E20616464F4
:10E2000072202020496E74657272757074006E6F92
:10E2100020766563746F7200726A6D702020006AE8
:10E220006D7020005768617420706F72743A0050EE
:10E230006F7274206E6F7420737570706F72746576
:10E2400064004D7573742062652061206C65747480
:10E2500065720020005772697474696E67204545C5
:10E260000052656164696E6720454500656570729E
:10E270006F6D206572726F7220636F756E743D00F2
:10E28000504F525400303D5A65726F206164647281
:10E290006573732063747273003F3D435055207360
:10E2A0007461747300403D454550524F4D20746574
:10E2B000737400423D426C696E6B204C45440045CE
:10E2C0003D44756D7020454550524F4D00463D44CC
:10E2D000756D7020464C41534800483D48656C7050
:10E2E000004C3D4C69737420492F4F20506F72745D
:10E2F0007300513D517569742026206A756D702038
:10E30000746F20757365722070676D00523D44759F
:10E310006D702052414D00563D73686F7720696ED5
:10E320007465727275707420566563746F727300D1
:10E33000593D506F727420626C696E6B002A0052F6
:10E340004553455400494E543000494E543100491C
:10E350004E543200494E543300494E543400494E15
:10E36000543500494E543600494E54370050434905
:10E370004E5430005043494E5431005043494E549E
:10E3800032005744540054494D45523020434F4DBC
:10E3900050410054494D45523020434F4D504200AA
:10E3A00054494D455230204F56460054494D455230
:10E3B0003120434150540054494D45523120434F80
:10E3C0004D50410054494D45523120434F4D50422C
:10E3D0000054494D45523120434F4D50430054495C
:10E3E0004D455231204F56460054494D455232203A
:10E3F000434F4D50410054494D45523220434F4DFB
:10E4000050420054494D455232204F56460054491F
:10E410004D45523320434150540054494D455233E9
:10E4200020434F4D50410054494D45523320434FF6
:10E430004D50420054494D45523320434F4D5043B7
:10E440000054494D455233204F56460054494D45DE
:10E45000523420434150540054494D4552342043D6
:10E460004F4D50410054494D45523420434F4D507B
:10E47000420054494D45523420434F4D50430054BF
:10E48000494D455234204F56460054494D4552356A
:10E4900020434150540054494D45523520434F4D7F
:10E4A00050410054494D45523520434F4D50420094
:10E4B00054494D45523520434F4D50430054494D2A
:10E4C000455235204F564600555341525430205244
:10E4D000580055534152543020554452450055532D
:10E4E0004152543020545800555341525431205217
:10E4F000580055534152543120554452450055530C
:10E5000041525431205458005553415254322052F4
:10E5100058005553415254322055445245005553EA
:10E5200041525432205458005553415254332052D2
:10E5300058005553415254332055445245005553C9
:10E5400041525433205458005350492053544300EF
:10E5500041444300414E414C4F4720434F4D5000F2
:10E560004545205245414459005457490053504DA8
:10E57000205245414459002A003FE345E34AE34F16
:10E58000E354E359E35EE363E368E36DE374E37B41
:10E59000E382E3E9E3F6E303E4ABE3B7E3C4E3D107
:10E5A000E3DEE386E393E3A0E348E5C8E4D2E4DEF8
:10E5B000E454E550E560E50EE41AE427E434E44170
:10E5C000E4E8E4F2E4FEE469E56DE54CE458E46572
:10E5D000E472E47FE48AE496E4A3E4B0E4BDE408F2
:10E5E000E512E51EE528E532E53EE50011241FBEF3
:10E5F000CFEFD1E2DEBFCDBF01E00CBF12E0A0E063
:10E60000B2E0EAEDFFEF03E00BBF02C007900D920E
:10E61000A030B107D9F712E0A0E0B2E001C01D922E
:10E62000AC30B107E1F70F94FBF40D94EBFF01E27E
:10E630000EBF0FEF0DBF11241FBE0D94FBF40D9400
:10E6400000F020E030E040ED57E005C0FA013197DE
:10E65000F1F72F5F3F4F28173907C0F308959C014A
:10E66000442737FD4095542FDA01C901860F911DCB
:10E67000A11DB11DABBFFC018791882369F0809378
:10E68000C6008091C00086FFFCCF8091C0008064EE
:10E690008093C0006F5FE8CF08958DE08093C6003F
:10E6A0008091C00086FFFCCF8091C0008064809381
:10E6B000C0008AE08093C6008091C00086FFFCCF36
:10E6C0008091C00080648093C00008950F942FF360
:10E6D0000F944DF30895FC019081992359F0909384
:10E6E000C6008091C00086FFFCCF8091C00080648E
:10E6F0008093C0003196992379F70895282F982F99
:10E7000092959F70892F805D8A3308F0895F80938E
:10E71000C6008091C00086FFFCCF8091C00080645D
:10E720008093C000822F8F70982F905D9A3308F0ED
:10E73000995F9093C6008091C00086FFFCCF8091C6
:10E74000C00080648093C00008959C01FB01853661
:10E7500091051CF46330710594F0C90164E670E022
:10E760000F948CFF605D7F4F6093C6008091C00066
:10E7700086FFFCCF8091C00080648093C0002B3066
:10E78000310514F43297B4F0C90164E670E00F94D7
:10E790008CFF6AE070E00F948CFF605D7F4F6093A8
:10E7A000C6008091C00086FFFCCF8091C0008064CD
:10E7B0008093C000C9016AE070E00F948CFFC0969E
:10E7C0008093C6008091C00086FFFCCF8091C0007E
:10E7D00080648093C0000895282F277020642093C0
:10E7E0007C0020917B0086958695869590E08170CF
:10E7F000907033E0880F991F3A95E1F7277F282B17
:10E8000020937B0080917A00806480937A008091CD
:10E810007A0086FDFCCF2091780040917900942FFA
:10E8200080E030E0282B392BC90108951F93182F61
:10E8300080E892EE60E00F942FF31093C600809171
:10E84000C00086FFFCCF8091C00080648093C00030
:10E850000F944DF31F9108952F923F924F925F9224
:10E860006F927F928F929F92AF92BF92CF92DF92E0
:10E87000EF92FF920F931F93DF93CF93CDB7DEB745
:10E8800062970FB6F894DEBF0FBECDBF382E622E52
:10E89000CA01DB015C016D01772460E2262E2E01A6
:10E8A0000894411C511C8BC081E0A81680E0B8067A
:10E8B00081E0C80680E0D80628F0C601AA27BB2759
:10E8C0000F947EF3BB27AD2D9C2D8B2D0F947EF3E3
:10E8D0008A2D0F947EF32092C6008091C00086FF9F
:10E8E000FCCF8091C00080648093C0009DE2909333
:10E8F000C6008091C00086FFFCCF8091C00080647C
:10E900008093C0002092C6008091C00086FFFCCF9B
:10E910008091C00080648093C000198286017501D7
:10E9200088249924A1E03A1651F03A1620F0B2E07A
:10E930003B1661F409C00BBFF701779007C0C70110
:10E940000F94D5FF782E02C0F7017080872D0F94A9
:10E950007EF32092C6008091C00086FFFCCF80919C
:10E96000C00080648093C000872D8052F401EF7056
:10E97000F0708F3520F4E40DF51D708204C0E40DB5
:10E98000F51D8EE280830894E11CF11C011D111D10
:10E990000894811C911C90E18916910409F0C2CF62
:10E9A00080E190E0A0E0B0E0A80EB91ECA1EDB1E18
:10E9B000198AC2010F946BF30F944DF36A94662089
:10E9C00009F072CF62960FB6F894DEBF0FBECDBFCE
:10E9D000CF91DF911F910F91FF90EF90DF90CF903B
:10E9E000BF90AF909F908F907F906F905F904F906F
:10E9F0003F902F9008952F923F924F925F926F9287
:10EA00007F928F929F92AF92BF92CF92DF92EF92BE
:10EA1000FF920F931F93DF93CF93CDB7DEB7CD5304
:10EA2000D1400FB6F894DEBF0FBECDBF279A2F9A04
:10EA30008091C00082608093C00080E18093C40018
:10EA400088E18093C1000000EE24FF248701B4E038
:10EA5000AB2EB12CCC24DD2424C0C5010197F1F7E5
:10EA60000894E11CF11C011D111D21E2E2162EE4A7
:10EA7000F20620E0020720E0120718F0A1E0CA2EFB
:10EA8000D12CC801B70128E53BE140E050E00F94EC
:10EA90009FFF611571058105910519F485B18058B5
:10EAA00085B98091C00087FD03C0C114D104A9F2CB
:10EAB000A6014F5F5F4FC25EDE4F59834883CE5140
:10EAC000D140C25EDE4F68817981CE51D140613044
:10EAD000710511F00D946EFFC05DDE4F1982188232
:10EAE000C053D14060E0C15DDE4F1882CF52D140AB
:10EAF000AA24BB24C05EDE4F188219821A821B82B0
:10EB0000C052D140CE5CDE4F188219821A821B821D
:10EB1000C253D14080E090E0A0E0B0E0ABBFFC0188
:10EB2000A791B691C45CDE4FB983A883CC53D14082
:10EB30000D9469FFC25EDE4FE881F981CE51D1406C
:10EB4000319709F52091C600C25EDE4F1982188206
:10EB5000CE51D14022C02F5F3F4F4F4F5F4F2130EA
:10EB6000F2E13F07FAE74F07F0E05F0780F0C45C8F
:10EB7000DE4F08811981CC53D1400F5F1F4F19F030
:10EB8000EE27FF27099420E030E040E050E080913C
:10EB9000C00087FFE0CF2091C600213209F094C663
:10EBA0000894A11CB11C33E0A316B10409F08EC671
:10EBB00000E010E018C041E24093C6008091C00020
:10EBC00086FFFCCF8091C00080648093C0002F5FDF
:10EBD0003F4F2931310579F70F944DF30F5F1F4FE8
:10EBE0000530110519F020E030E0E5CF1092080261
:10EBF0001092090210920A0210920B021092040263
:10EC00001092050210920602109207021092000262
:10EC10001092010210920202109203028FEE90EE07
:10EC200060E00F9466F380E191EE60E00F942FF3C3
:10EC30008091C00087FFFCCF9091C600903608F00D
:10EC40009F759032B8F09093C6008091C00086FF07
:10EC5000FCCF8091C00080648093C00080E28093EC
:10EC6000C6008091C00086FFFCCF8091C000806408
:10EC70008093C000983409F4DBC19934B8F492341D
:10EC800009F45DC1933458F4903319F1903308F4CA
:10EC900018C69F33A1F1903409F013C6BDC0953456
:10ECA00009F474C1963409F00CC69CC1923509F47C
:10ECB0002FC2933538F49C3409F4F9C1913509F029
:10ECC00000C61CC2963509F449C2993509F0F9C548
:10ECD0009CC485E892EE62E00F9466F31092040201
:10ECE000109205021092060210920702109208027A
:10ECF0001092090210920A0210920B0217C189E9C0
:10ED000092EE62E00F9466F38FEE90EE60E00F9467
:10ED100066F381E291EE60E00F942FF381EC91EEC7
:10ED200060E00F9466F381E391EE60E00F942FF3BF
:10ED300084EE90EE60E00F9466F381E491EE60E083
:10ED40000F942FF386E090E061E070E00F94A5F35C
:10ED50000F944DF381E691EE60E00F942FF383ED75
:10ED600091EE60E00F9466F381E591EE60E00F9420
:10ED70002FF38DEC91EE60E00F9466F381E791EE56
:10ED800060E00F942FF38EE10F947EF388E90F94E7
:10ED90007EF381E00F947EF30F944DF381E891EEC2
:10EDA00060E00F942FF319E0E0E0F0E010935700DB
:10EDB000E4918E2F0F947EF30F944DF381E991EE41
:10EDC00060E00F942FF3E3E0F0E010935700E4913C
:10EDD0008E2F0F947EF30F944DF381EA91EE60E055
:10EDE0000F942FF3E2E0F0E010935700E4918E2FA0
:10EDF0000F947EF30F944DF381EB91EE60E00F944E
:10EE00002FF3E1E0F0E0109357001491812F0F945D
:10EE10007EF30F944DF307CF85EA92EE62E00F94F4
:10EE200066F385E592EE60E00F9466F30F944DF380
:10EE300000E010E019C0C8016F2D0F94DDFFFF2026
:10EE400031F483E592EE60E00F942FF30BC0F09263
:10EE5000C6008091C00086FFFCCF8091C000806416
:10EE60008093C0000F5F1F4FC80181519F41AA27A7
:10EE700097FDA095BA2FABBFFC01F7905AE2F516AB
:10EE800021F062E000301607B1F60F944DF30F94B5
:10EE90004DF381E692EE60E00F9466F30F944DF32C
:10EEA000CC24DD2400E010E01EC0C8010F94D5FF83
:10EEB000F82E882331F483E592EE60E00F942FF36F
:10EEC0000BC08093C6008091C00086FFFCCF80916C
:10EED000C00080648093C000FE1419F00894C11C27
:10EEE000D11C0F5F1F4FC80181519F41AA2797FD79
:10EEF000A095BA2FABBFFC01E7907AE2E71621F0AC
:10EF000082E00030180789F60F944DF30F944DF30B
:10EF10008CE692EE60E00F942FF3C60161E070E0A2
:10EF20000F94A5F30F944DF30F944DF3109200023C
:10EF300010920102109202021092030274CE83EB2F
:10EF400092EE62E00F9466F3279A2F9A16C02F98DC
:10EF500080E090E0E0EDF7E03197F1F7019684363C
:10EF60009105C1F72F9A80E090E0E0EDF7E031974E
:10EF7000F1F7019684369105C1F78091C00087FFB3
:10EF8000E6CF8091C00087FFFCCF95C48FEB92EE57
:10EF900062E00F9466F3409100025091010260918B
:10EFA00002027091030281E020E10F942CF4809121
:10EFB000000290910102A0910202B09103028050E0
:10EFC0009F4FAF4FBF4F8093000290930102A093D9
:10EFD0000202B093030280509041A040B04008F478
:10EFE00022CEA4CF8DEC92EE62E00F9466F34091B6
:10EFF000040250910502609106027091070280E0C0
:10F0000020E10F942CF48091040290910502A091CC
:10F010000602B091070280509F4FAF4FBF4F8093C1
:10F02000040290930502A0930602B0930702FBCD61
:10F030008AED92EE62E00F9466F385E892EE60E06E
:10F040000F9466F389E992EE60E00F9466F385EA27
:10F0500092EE60E00F9466F383EB92EE60E00F9423
:10F0600066F38FEB92EE60E00F9466F38DEC92EE18
:10F0700060E00F9466F38AED92EE60E00F9466F321
:10F0800081EE92EE60E00F9466F382EF92EE60E024
:10F090000F9466F38CE093EE60E00F9466F387E1E3
:10F0A00093EE60E00F9466F380E393EEB9CD81EECA
:10F0B00092EE62E00F9466F381E40F9416F482E41A
:10F0C0000F9416F483E40F9416F484E40F9416F46A
:10F0D00085E40F9416F486E40F9416F487E40F94F5
:10F0E00016F488E40F9416F48AE40F9416F48BE473
:10F0F0000F9416F48CE40F9416F495CD82EF92EEF3
:10F1000062E00F9466F399249394AA24BB2445C427
:10F110008CE093EE62E00F9466F340910802509108
:10F12000090260910A0270910B0282E020E10F94C3
:10F130002CF48091080290910902A0910A02B091EA
:10F140000B0280509F4FAF4FBF4F809308029093A8
:10F150000902A0930A02B0930B0265CD87E193EEFA
:10F1600062E00F9466F384EE90EE60E00F9466F335
:10F1700089ED91EE60E00F9466F309E715EECC5D42
:10F18000DE4F19830883C452D1406624772443019B
:10F19000CA5DDE4F19821882C652D140A401930184
:10F1A0005695479537952795C85DDE4F2883398357
:10F1B0004A835B83C852D140CA5DDE4F4881598182
:10F1C000C652D1404F5F5F4FCA5DDE4F59834883BF
:10F1D000C652D140CA0162E070E00F94A5F350E23C
:10F1E0005093C6008091C00086FFFCCF8091C00084
:10F1F00080648093C0006DE26093C6008091C0007F
:10F2000086FFFCCF8091C00080648093C00070E2D4
:10F210007093C6008091C00086FFFCCF8091C00033
:10F2200080648093C000C85DDE4FE880F9800A8169
:10F230001B81C852D140BB27A12F902F8F2D0F9437
:10F240007EF3C85DDE4F8881C852D1400F947EF3B3
:10F2500070E2F72EF092C6008091C00086FFFCCFCE
:10F260008091C00080648093C0000DE30093C600CD
:10F270008091C00086FFFCCF8091C00080648093A5
:10F28000C00010E21093C6008091C00086FFFCCF42
:10F290008091C00080648093C0008BBEF3012791F1
:10F2A000C45DDE4F2883CC52D140A22EBB24CC2497
:10F2B000DD240894611C711C811C911C8BBEF30120
:10F2C0008791282E332444245524142D032DF22C09
:10F2D000EE24EA0CFB1C0C1D1D1D0894611C711C06
:10F2E000811C911C8BBEF3013791C35DDE4F3883C7
:10F2F000CD52D1400894611C711C811C911C8BBEA5
:10F30000F3014791C25DDE4F4883CE52D1402DEFCD
:10F310003FEF4FEF5FEF620E731E841E951E0F943A
:10F320007EF330E23093C6008091C00086FFFCCFB0
:10F330008091C00080648093C000C45DDE4F8881EE
:10F34000CC52D1400F947EF340E24093C6008091AE
:10F35000C00086FFFCCF8091C00080648093C00015
:10F36000C25DDE4F8881CE52D1400F947EF350E2D1
:10F370005093C6008091C00086FFFCCF8091C000F2
:10F3800080648093C000C35DDE4F8881CD52D14040
:10F390000F947EF360E26093C6008091C00086FF08
:10F3A000FCCF8091C00080648093C0007FEFE7169F
:10F3B0007FEFF70670E0070770E0170731F48EE083
:10F3C00092EE60E00F942FF3DFC0D801C701807088
:10F3D000907CA070B0708050904CA040B040D1F5AF
:10F3E0002FEF3FE340E050E0E222F3220423152315
:10F3F000C85DDE4FA880B980CA80DB80C852D1408A
:10F40000AE0CBF1CC01ED11EAA0CBB1CCC1CDD1C2C
:10F4100088E192EE60E00F942FF3BB27A12F902F8D
:10F420008F2D0F947EF38E2D0F947EF330E2309368
:10F43000C6008091C00086FFFCCF8091C000806430
:10F440008093C0004EE34093C6008091C00086FFC9
:10F45000FCCF87C06EE07EEF80E090E0E622F722EE
:10F46000082319237CE0E71674E9F70670E0070724
:10F4700070E0170709F088C0C25DDE4F8881CE5268
:10F48000D140E82EFF2400E010E0102F0F2DFE2CBD
:10F49000EE24C35DDE4F9881CD52D140E90EF11CC0
:10F4A000011D111DD601C50181709070A070B07052
:10F4B000DC0199278827E80EF91E0A1F1B1F20EF81
:10F4C00030E040E050E0A222B322C422D522F1E194
:10F4D000AA0CBB1CCC1CDD1CFA95D1F7EA0CFB1C5A
:10F4E0000C1D1D1D41E050E060E070E0242235223B
:10F4F00046225722E5E1220C331C441C551CEA9598
:10F50000D1F7E20CF31C041D151D57016801AA0C6C
:10F51000BB1CCC1CDD1C8FE192EE60E00F942FF33E
:10F52000C801AA27BB270F947EF3BB27A12F902FDA
:10F530008F2D0F947EF38E2D0F947EF350E2509317
:10F54000C6008091C00086FFFCCF8091C00080641F
:10F550008093C0006EE36093C6008091C00086FF78
:10F56000FCCF8091C00080648093C000C601AA27B0
:10F57000BB270F947EF3BB27AD2D9C2D8B2D0F94B5
:10F580007EF38A2D0F947EF370E27093C600809113
:10F59000C00086FFFCCF8091C00080648093C000D3
:10F5A000CC5DDE4FE881F981C452D140CF01AA275A
:10F5B00097FDA095BA2FABBFFC018791969160E0B3
:10F5C0000F942FF30F944DF3CC5DDE4F088119811A
:10F5D000C452D1400E5F1F4FCC5DDE4F19830883AC
:10F5E000C452D140CA5DDE4F28813981C652D14014
:10F5F0002933310509F417CB44E050E060E070E0B6
:10F60000640E751E861E971EC9CD80E393EE62E0E0
:10F610000F9466F384E292EE60E00F942FF38091F2
:10F62000C00087FFFCCF1091C6001F751093C60065
:10F630008091C00086FFFCCF8091C00080648093E1
:10F64000C0000F944DF3812F81548A3108F036C1E8
:10F65000163409F495C0173490F4133409F44EC0ED
:10F66000143430F41134F1F0123409F01DC130C0FB
:10F67000143409F459C0153409F016C16BC01A349A
:10F6800009F4C4C01B3438F4173409F48FC018349B
:10F6900009F00AC1A1C01B3409F4D2C01C3409F01E
:10F6A00003C1E8C08FEF81B90DC082B1809582B9E6
:10F6B00080E090E0E0EDF7E03197F1F70196883CCB
:10F6C0009105C1F78091C00087FFEFCF12B8EFC05E
:10F6D0008FEF84B90DC085B1809585B980E090E049
:10F6E000E0EDF7E03197F1F70196883C9105C1F71D
:10F6F0008091C00087FFEFCF15B8D9C08FEF87B9D1
:10F700000DC088B1809588B980E090E0E0EDF7E029
:10F710003197F1F70196883C9105C1F78091C000BF
:10F7200087FFEFCF18B8C3C08FEF8AB90DC08BB178
:10F7300080958BB980E090E0E0EDF7E03197F1F74C
:10F740000196883C9105C1F78091C00087FFEFCFFB
:10F750001BB8ADC08FEF8DB90DC08EB180958EB93D
:10F7600080E090E0E0EDF7E03197F1F70196883C1A
:10F770009105C1F78091C00087FFEFCF1EB897C0F9
:10F780008FEF80BB0DC081B3809581BB80E090E09E
:10F79000E0EDF7E03197F1F70196883C9105C1F76C
:10F7A0008091C00087FFEFCF11BA81C08FEF83BB7C
:10F7B0000DC084B3809584BB80E090E0E0EDF7E07D
:10F7C0003197F1F70196883C9105C1F78091C0000F
:10F7D00087FFEFCF14BA6BC08FEF809301010FC08A
:10F7E0008091020180958093020180E090E0E0ED3D
:10F7F000F7E03197F1F70196883C9105C1F78091C8
:10F80000C00087FFEDCF1092020151C08FEF8093AF
:10F8100004010FC08091050180958093050180E06F
:10F8200090E0E0EDF7E03197F1F70196883C910523
:10F83000C1F78091C00087FFEDCF1092050137C05E
:10F840008FEF809307010FC080910801809580930E
:10F85000080180E090E0E0EDF7E03197F1F70196E4
:10F86000883C9105C1F78091C00087FFEDCF1092D1
:10F8700008011DC08FEF80930A010FC080910B011A
:10F88000809580930B0180E090E0E0EDF7E0319708
:10F89000F1F70196883C9105C1F78091C00087FF80
:10F8A000EDCF10920B0103C08FE292EEB9C98091A7
:10F8B000C00087FFFCCF8091C600B5C982E492EEFC
:10F8C000AFC98CE191EEACC9AA24BB24933061F19D
:10F8D000943028F4913089F0923008F508C09530C2
:10F8E000B1F1953040F1963009F053C04EC02B3144
:10F8F00009F020C991E06BE11DC9213041F0C15DE3
:10F90000DE4F5881CF52D140251709F002C362273C
:10F91000C15DDE4F2883CF52D14092E00BC9B22F98
:10F92000A0E0622793E006C9822F90E0A82BB92BB4
:10F93000622794E0FFC82E3009F0EBC2622795E001
:10F94000C05DDE4F19821882C053D140F3C8E1E098
:10F95000F0E0EC0FFD1FC05DDE4FE880F980C05382
:10F96000D140EE0DFF1D208387010F5F1F4FC05D4B
:10F97000DE4F19830883C053D14062270A171B0743
:10F9800009F0D8C8D80196E0D5C8261709F0C1C239
:10F9900003C0973009F0CEC899248981833109F4D6
:10F9A000FCC08431C8F4863009F4C2C0873050F4FA
:10F9B000823009F4F0C0833009F458C0813009F076
:10F9C0000AC23EC0813109F462C0823108F0A6C08B
:10F9D000803109F000C2DFC0883109F472C089317A
:10F9E00050F4853109F4D9C0853108F477C18631E6
:10F9F00009F0F1C173C18A3109F457C08A3108F4A2
:10FA00007CC08B3109F446C08D3109F0E4C18D8191
:10FA1000803311F090E00AC08F81882311F49EE1B9
:10FA200005C0813011F091E001C098E91A821B8273
:10FA30008D818C831D829E831F8227E030E0CFC1A1
:10FA40001A8288E08B8381E48C8386E58D8382E54E
:10FA50008E8389E48F8383E5888780E589878FE5B6
:10FA60008A8782E38B872BE030E0B9C18A818139B4
:10FA700041F0823941F0803911F48FE005C080E017
:10FA800003C082E001C08AE01A828B8344C09924BB
:10FA9000939481C08D81882311F48EE12CC0813034
:10FAA00011F081E028C088E926C01A82E1E0F0E088
:10FAB00089E08093570084918B831C8224E030E09E
:10FAC0008EC18B81803589F48C81883039F4E2E0F5
:10FAD000F0E089E08093570084910DC0E0E0F0E011
:10FAE00089E080935700849106C0E3E0F0E089E06C
:10FAF0008093570084911A82DFCF8D81836C99E0C7
:10FB0000E1E0F0E0082E90935700E89507B600FC7E
:10FB1000FDCF1A821B8223E030E061C11A82CE5CE5
:10FB2000DE4F188219821A821B82C253D14055C1FE
:10FB30008A8190E0A0E0B0E0582F442733272227A5
:10FB40008B8190E0A0E0B0E0DC0199278827282B8A
:10FB5000392B4A2B5B2B8D8190E0A0E0B0E0282B65
:10FB6000392B4A2B5B2B8C8190E0A0E0B0E0BA2FC0
:10FB7000A92F982F8827282B392B4A2B5B2B220F54
:10FB8000331F441F551FC05EDE4F288339834A83CD
:10FB90005B83C052D1401A8220C19A812B8183316C
:10FBA00049F0C05EDE4F488159816A817B81C05235
:10FBB000D1408AC0CE5CDE4F488159816A817B8109
:10FBC000C253D140403080EC580783E0680780E0A2
:10FBD0007807F0F483E0FA0160935B0080935700AC
:10FBE000E89507B600FCFDCFCE5CDE4F4881598119
:10FBF0006A817B81C253D14040505F4F6F4F7F4F2E
:10FC0000CE5CDE4F488359836A837B83C253D140E5
:10FC1000C95CDE4F9883C753D140CA5CDE4F18825F
:10FC2000C653D140022F10E0CA5CDE4F6881798153
:10FC3000C653D140062B172BC05EDE4F4881598139
:10FC40006A817B81C052D140DE011B9631E08C91EC
:10FC500011962C9111971296C75CDE4F2883C953D9
:10FC6000D140C85CDE4F1882C853D14090E0C85CD8
:10FC7000DE4FE881F981C853D1408E2B9F2B0C01B8
:10FC8000FA0160935B0030935700E89511244E5FB2
:10FC90005F4F6F4F7F4F02501040C9F685E0C05E46
:10FCA000DE4FE880F9800A811B81C052D140F70104
:10FCB00000935B0080935700E89507B600FCFDCFEA
:10FCC00081E180935700E8951A82C05EDE4F488339
:10FCD00059836A837B83C052D1407FC0FA80C55C60
:10FCE000DE4FF882CB53D140C65CDE4F1882CA5338
:10FCF000D1408B81C82EDD24C65CDE4F088119817E
:10FD0000CA53D140C02AD12A1A828981BE016D5FAF
:10FD10007F4F843121F59601C05EDE4FE880F98087
:10FD20000A811B81C052D1400BBFF7018791969188
:10FD3000DB018C9311969C936E5F7F4FD801C701B6
:10FD40000296A11DB11DC05EDE4F88839983AA83F0
:10FD5000BB83C052D14022503040F1F636C0C05E65
:10FD6000DE4F288139814A815B81C052D14008949D
:10FD7000C108D108760100E010E00894C11CD11C34
:10FD80000894E11CF11C011D111DE20EF31E041F5D
:10FD9000151F21BDBB27A52F942F832F82BD2F5F59
:10FDA0003F4F4F4F5F4FF89A80B5DB018D93BD01F8
:10FDB0002E153F054007510761F7C05EDE4F2883CF
:10FDC00039834A835B83C052D14096012D5F3F4FF8
:10FDD000FB01108204C080EC8A8322E030E08BE1DA
:10FDE0008093C6008091C00086FFFCCF8091C00048
:10FDF00080648093C000C15DDE4FF881CF52D14056
:10FE0000F093C6008091C00086FFFCCF8091C000B7
:10FE100080648093C000432F3093C6008091C0005F
:10FE200086FFFCCF8091C00080648093C000922F39
:10FE30002093C6008091C00086FFFCCF8091C00057
:10FE400080648093C0008EE08093C6008091C000E3
:10FE500086FFFCCF8091C00080648093C00065E184
:10FE6000C15DDE4FE880CF52D1406E2569276427FF
:10FE7000FE01319610C090819093C6008091C00021
:10FE800086FFFCCF31968091C00080648093C000D3
:10FE90006927215030402115310569F76093C6006C
:10FEA0008091C00086FFFCCF8091C0008064809369
:10FEB000C00085B1805885B9992081F4C15DDE4FBD
:10FEC0000881CF52D1400F5FC15DDE4F0883CF5212
:10FED000D14090E0A0E0B0E00D949AF527982F98DB
:10FEE00080E090E020ED37E0F9013197F1F70196DD
:10FEF00084369105C9F700008091C0008D7F809302
:10FF0000C00081E180935700E895EE27FF27099410
:10FF1000FFCF90E00D949AF597FB092E07260AD0A3
:10FF200077FD04D02ED006D000201AF4709561958C
:10FF30007F4F0895F6F7909581959F4F0895A1E220
:10FF40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F53
:10FF5000FF1FA217B307E407F50720F0A21BB30B9E
:10FF6000E40BF50B661F771F881F991F1A9469F71A
:10FF700060957095809590959B01AC01BD01CF0176
:10FF80000895AA1BBB1B51E107C0AA1FBB1FA617E0
:10FF9000B70710F0A61BB70B881F991F5A95A9F732
:10FFA00080959095BC01CD010895F999FECF92BD41
:10FFB00081BDF89A992780B50895262FF999FECF2B
:10FFC0001FBA92BD81BD20BD0FB6F894FA9AF99A76
:0AFFD0000FBE01960895F894FFCFCC
:10E000000D9472F00D9493F00D9493F00D9493F0A1
:10E010000D9493F00D9493F00D9493F00D9493F070
:10E020000D9493F00D9493F00D9493F00D9493F060
:10E030000D9493F00D9493F00D9493F00D9493F050
:10E040000D9493F00D9493F00D9493F00D9493F040
:10E050000D9493F00D9493F00D9493F00D9493F030
:10E060000D9493F00D9493F00D9493F00D9493F020
:10E070000D9493F00D9493F00D9493F00D9493F010
:10E080000D9493F00D9493F00D9493F00D9493F000
:10E090000D9493F00D9493F00D9493F00D9493F0F0
:10E0A0000D9493F00D9493F00D9493F00D9493F0E0
:10E0B0000D9493F00D9493F00D9493F00D9493F0D0
:10E0C0000D9493F00D9493F00D9493F00D9493F0C0
:10E0D0000D9493F00D9493F00D9493F00D9493F0B0
:10E0E0000D9493F011241FBECFEFD1E2DEBFCDBF60
:10E0F00001E00CBF12E0A0E0B2E0E0EAF8EE03E0DD
:10E100000BBF02C007900D92A030B107D9F70F9452
:10E11000A3F00D944EF401E20EBF0FEF0DBF1124DA
:10E120001FBE0D94A3F00D9400F020E030E040ED10
:10E1300057E005C0FA013197F1F72F5F3F4F2817DD
:10E140003907C0F308952F923F924F925F926F92DA
:10E150007F928F929F92AF92BF92CF92DF92EF9277
:10E16000FF920F931F93DF93CF93CDB7DEB7C852C3
:10E17000D1400FB6F894DEBF0FBECDBF279A2F9ABD
:10E180008091C00082608093C00080E18093C400D1
:10E1900088E18093C1000000EE24FF248701E4E0C1
:10E1A000AE2EB12CCC24DD2424C0C5010197F1F79B
:10E1B0000894E11CF11C011D111D21E2E2162EE460
:10E1C000F20620E0020720E0120718F071E0C72EE7
:10E1D000D12CC801B70128E53BE140E050E00F94A5
:10E1E0002CF4611571058105910519F485B18058EC
:10E1F00085B98091C00087FD03C0C114D104A9F284
:10E20000A6014F5F5F4FC25EDE4F59834883CE51F8
:10E21000D140C25EDE4F68817981CE51D1406130FC
:10E22000710509F0FCC222243324A0E0C05EDE4F59
:10E230001882C052D1408824992454014424552482
:10E240003201ABBEF40187919691C95DDE4F99838F
:10E250008883C752D140DFC2C25EDE4FE881F981B8
:10E26000CE51D140319709F53091C600C25EDE4FE4
:10E2700019821882CE51D14022C04F5F5F4F6F4F3D
:10E280007F4F4130F2E15F07FAE76F07F0E07F0769
:10E2900080F0C95DDE4F28813981C752D1402F5FA0
:10E2A0003F4F19F0EE27FF27099440E050E060E06F
:10E2B00070E08091C00087FFE0CF3091C6009330BE
:10E2C00061F1943028F4913089F0923008F508C05B
:10E2D000953091F1953040F1963009F043C03EC041
:10E2E0003B3109F0B9CF91E0ABE1B6CF313041F02D
:10E2F000C05EDE4F5881C052D140351709F0AAC226
:10E30000A327C05EDE4F3883C052D14092E0A4CF35
:10E31000132F00E0A32793E09FCF832F90E0082BDB
:10E32000192BA32794E098CF3E3009F093C2A3277E
:10E3300095E02224332490CFE1E0F0E0EC0FFD1FC4
:10E34000E20DF31D30830894211C311CA3272016F5
:10E35000310609F081CF810196E07ECF3A1709F0AE
:10E3600079C203C0973009F077CF8981833109F4EE
:10E37000F4C08431C0F4863009F4C2C0873048F458
:10E38000823069F1833009F45BC0813009F0C4C187
:10E3900041C0813109F465C0823108F0ACC08031E0
:10E3A00009F0BAC11CC0883109F474C0893150F435
:10E3B000853109F4D2C0853108F443C1863109F0B2
:10E3C000ABC13FC18A3109F45CC08A3108F482C014
:10E3D0008B3109F44BC08D3109F09EC102C090E031
:10E3E00041C08D81803311F090E00AC08F81882375
:10E3F00011F49EE105C0813011F091E001C098E96F
:10E400001A821B828D818C831D829E831F8247E02E
:10E4100050E086C11A8288E08B8381E48C8386E594
:10E420008D8382E58E8389E48F8383E5888780E509
:10E4300089878FE58A8782E38B874BE050E070C144
:10E440008A81813941F0823941F0803911F48FE0BD
:10E4500005C080E003C082E001C08AE01A828B839D
:10E4600047C091E01A8242E050E05BC18D81882371
:10E4700011F48EE129C0813011F081E025C088E9D6
:10E4800023C01A82E1E0F0E069E060935700E49174
:10E49000EB831CC08B81803589F48C81883039F402
:10E4A00029E0E2E0F0E02093570084910DC029E0DC
:10E4B000E0E0F0E020935700849106C0E3E0F0E054
:10E4C00039E03093570084911A828B831C8244E098
:10E4D00050E026C18D81836C49E0E1E0F0E0082E38
:10E4E00040935700E89507B600FCFDCF1A821B82C7
:10E4F00043E050E015C11A824424552432010EC174
:10E500008A8190E0A0E0B0E0B82EAA249924882463
:10E510008B8190E0A0E0B0E0DC0199278827882A71
:10E52000992AAA2ABB2A8D8190E0A0E0B0E0882A2F
:10E53000992AAA2ABB2A8C8190E0A0E0B0E0BA2FE9
:10E54000A92F982F8827882A992AAA2ABB2A880CBB
:10E55000991CAA1CBB1C1A82E1C09A813B818331A1
:10E5600019F0B501A40169C050E0451650EC5506FC
:10E5700053E0650650E0750690F463E0F2016092A6
:10E580005B0060935700E89507B600FCFDCF40E0C4
:10E5900051E060E070E0440E551E661E771ECE5DB1
:10E5A000DE4F9883C252D140CF5DDE4F1882C152F8
:10E5B000D140032F10E0CF5DDE4F68817981C152D9
:10E5C000D140062B172BB501A401DE011B968C91BF
:10E5D00011962C9111971296CC5DDE4F2883C45270
:10E5E000D140CD5DDE4F1882C352D14090E0CD5D69
:10E5F000DE4FE881F981C352D1408E2B9F2B21E061
:10E600000C01FA0160935B0020935700E8951124F8
:10E610004E5F5F4F6F4F7F4F02501040C1F635E0A5
:10E62000F401A0925B0030935700E89507B600FC18
:10E63000FDCF81E180935700E8951A824A015B0182
:10E640006DC09A81CA5DDE4F9883C652D140CB5DC2
:10E65000DE4F1882C552D1408B81C82EDD24CB5DA0
:10E66000DE4FA881B981C552D140CA2ADB2A1A825D
:10E6700089818431E9F4A60123E0E22EF12CEC0E2D
:10E68000FD1EABBEF40187919691F70180839183C3
:10E6900022E030E0E20EF31E62E070E080E090E005
:10E6A000860E971EA81EB91E4250504051F72EC02C
:10E6B000B501A40193E0E92EF12CEC0EFD1E0894A7
:10E6C000C108D108860120E030E00894C11CD11CAB
:10E6D0000F5F1F4F2F4F3F4F080D191D2A1D3B1D68
:10E6E00041BDBB27A72F962F852F82BD4F5F5F4F60
:10E6F0006F4F7F4FF89A80B5D7018D937D014017FA
:10E7000051076207730761F74A015B01A6014D5F7C
:10E710005F4FF701108204C0F0ECFA8342E050E052
:10E7200090E02BE12093C6008091C00086FFFCCFD3
:10E730008091C00080648093C000C05EDE4F38814D
:10E74000C052D1403093C6008091C00086FFFCCFFC
:10E750008091C00080648093C000652F5093C600F4
:10E760008091C00086FFFCCF8091C00080648093C0
:10E77000C000342F4093C6008091C00086FFFCCFBC
:10E780008091C00080648093C0008EE08093C600BA
:10E790008091C00086FFFCCF8091C0008064809390
:10E7A000C000A5E1C05EDE4F7881C052D140A727EE
:10E7B000A327A627FE01319610C030813093C600F2
:10E7C0008091C00086FFFCCF31968091C0008064AC
:10E7D0008093C000A327415050404115510569F76F
:10E7E000A093C6008091C00086FFFCCF8091C0003E
:10E7F00080648093C00085B1805885B9992379F4ED
:10E80000C05EDE4F8881C052D1408F5FC05EDE4F58
:10E810008883C052D14090E000E010E01DCD2798E1
:10E820002F9880E090E020ED37E0F9013197F1F783
:10E83000019684369105C9F700008091C0008D7F54
:10E840008093C00081E180935700E895EE27FF2771
:10E850000994FFCF90E000CDA1E21A2EAA1BBB1BAA
:10E86000FD010DC0AA1FBB1FEE1FFF1FA217B3079C
:10E87000E407F50720F0A21BB30BE40BF50B661FB2
:10E88000771F881F991F1A9469F760957095809576
:10E8900090959B01AC01BD01CF010895F894FFCF85
:040000033000E000E9
:00000001FF

View File

@ -32,7 +32,6 @@ class HardwareSerial : public Stream
{
private:
ring_buffer *_rx_buffer;
ring_buffer *_tx_buffer;
volatile uint8_t *_ubrrh;
volatile uint8_t *_ubrrl;
volatile uint8_t *_ucsra;
@ -41,29 +40,28 @@ class HardwareSerial : public Stream
uint8_t _rxen;
uint8_t _txen;
uint8_t _rxcie;
uint8_t _udrie;
uint8_t _udre;
uint8_t _u2x;
public:
HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer,
HardwareSerial(ring_buffer *rx_buffer,
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
volatile uint8_t *udr,
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x);
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x);
void begin(unsigned long);
void end();
virtual int available(void);
virtual int peek(void);
virtual int read(void);
virtual void flush(void);
virtual size_t write(uint8_t);
virtual void write(uint8_t);
using Print::write; // pull in write(str) and write(buf, size) from Print
};
#if defined(UBRRH) || defined(UBRR0H)
extern HardwareSerial Serial;
#elif defined(USBCON)
#include "USBAPI.h"
// extern HardwareSerial Serial_;
#include "usb_api.h"
#endif
#if defined(UBRR1H)
extern HardwareSerial Serial1;
@ -75,6 +73,4 @@ class HardwareSerial : public Stream
extern HardwareSerial Serial3;
#endif
extern void serialEventRun(void) __attribute__((weak));
#endif

View File

@ -23,213 +23,173 @@
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "Arduino.h"
#include "wiring.h"
#include "Print.h"
// Public Methods //////////////////////////////////////////////////////////////
/* default implementation: may be overridden */
size_t Print::write(const uint8_t *buffer, size_t size)
void Print::write(const char *str)
{
size_t n = 0;
while (size--) {
n += write(*buffer++);
while (*str)
write(*str++);
}
/* default implementation: may be overridden */
void Print::write(const uint8_t *buffer, size_t size)
{
while (size--)
write(*buffer++);
}
void Print::print(const String &s)
{
for (unsigned int i = 0; i < s.length(); i++) {
write(s[i]);
}
return n;
}
size_t Print::print(const __FlashStringHelper *ifsh)
void Print::print(const char str[])
{
const prog_char *p = (const prog_char *)ifsh;
size_t n = 0;
while (1) {
unsigned char c = pgm_read_byte(p++);
if (c == 0) break;
n += write(c);
}
return n;
write(str);
}
size_t Print::print(const String &s)
void Print::print(char c, int base)
{
size_t n = 0;
for (uint16_t i = 0; i < s.length(); i++) {
n += write(s[i]);
}
return n;
print((long) c, base);
}
size_t Print::print(const char str[])
void Print::print(unsigned char b, int base)
{
return write(str);
print((unsigned long) b, base);
}
size_t Print::print(char c)
void Print::print(int n, int base)
{
return write(c);
print((long) n, base);
}
size_t Print::print(unsigned char b, int base)
void Print::print(unsigned int n, int base)
{
return print((unsigned long) b, base);
print((unsigned long) n, base);
}
size_t Print::print(int n, int base)
{
return print((long) n, base);
}
size_t Print::print(unsigned int n, int base)
{
return print((unsigned long) n, base);
}
size_t Print::print(long n, int base)
void Print::print(long n, int base)
{
if (base == 0) {
return write(n);
write(n);
} else if (base == 10) {
if (n < 0) {
int t = print('-');
print('-');
n = -n;
return printNumber(n, 10) + t;
}
return printNumber(n, 10);
printNumber(n, 10);
} else {
return printNumber(n, base);
printNumber(n, base);
}
}
size_t Print::print(unsigned long n, int base)
void Print::print(unsigned long n, int base)
{
if (base == 0) return write(n);
else return printNumber(n, base);
if (base == 0) write(n);
else printNumber(n, base);
}
size_t Print::print(double n, int digits)
void Print::print(double n, int digits)
{
return printFloat(n, digits);
printFloat(n, digits);
}
size_t Print::println(const __FlashStringHelper *ifsh)
void Print::println(void)
{
size_t n = print(ifsh);
n += println();
return n;
print('\r');
print('\n');
}
size_t Print::print(const Printable& x)
void Print::println(const String &s)
{
return x.printTo(*this);
print(s);
println();
}
size_t Print::println(void)
void Print::println(const char c[])
{
size_t n = print('\r');
n += print('\n');
return n;
print(c);
println();
}
size_t Print::println(const String &s)
void Print::println(char c, int base)
{
size_t n = print(s);
n += println();
return n;
print(c, base);
println();
}
size_t Print::println(const char c[])
void Print::println(unsigned char b, int base)
{
size_t n = print(c);
n += println();
return n;
print(b, base);
println();
}
size_t Print::println(char c)
void Print::println(int n, int base)
{
size_t n = print(c);
n += println();
return n;
print(n, base);
println();
}
size_t Print::println(unsigned char b, int base)
void Print::println(unsigned int n, int base)
{
size_t n = print(b, base);
n += println();
return n;
print(n, base);
println();
}
size_t Print::println(int num, int base)
void Print::println(long n, int base)
{
size_t n = print(num, base);
n += println();
return n;
print(n, base);
println();
}
size_t Print::println(unsigned int num, int base)
void Print::println(unsigned long n, int base)
{
size_t n = print(num, base);
n += println();
return n;
print(n, base);
println();
}
size_t Print::println(long num, int base)
void Print::println(double n, int digits)
{
size_t n = print(num, base);
n += println();
return n;
}
size_t Print::println(unsigned long num, int base)
{
size_t n = print(num, base);
n += println();
return n;
}
size_t Print::println(double num, int digits)
{
size_t n = print(num, digits);
n += println();
return n;
}
size_t Print::println(const Printable& x)
{
size_t n = print(x);
n += println();
return n;
print(n, digits);
println();
}
// Private Methods /////////////////////////////////////////////////////////////
size_t Print::printNumber(unsigned long n, uint8_t base) {
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
char *str = &buf[sizeof(buf) - 1];
void Print::printNumber(unsigned long n, uint8_t base)
{
unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
unsigned long i = 0;
*str = '\0';
if (n == 0) {
print('0');
return;
}
// prevent crash if called with base == 1
if (base < 2) base = 10;
do {
unsigned long m = n;
while (n > 0) {
buf[i++] = n % base;
n /= base;
char c = m - base * n;
*--str = c < 10 ? c + '0' : c + 'A' - 10;
} while(n);
}
return write(str);
for (; i > 0; i--)
print((char) (buf[i - 1] < 10 ?
'0' + buf[i - 1] :
'A' + buf[i - 1] - 10));
}
size_t Print::printFloat(double number, uint8_t digits)
void Print::printFloat(double number, uint8_t digits)
{
size_t n = 0;
// Handle negative numbers
if (number < 0.0)
{
n += print('-');
print('-');
number = -number;
}
@ -243,21 +203,18 @@ size_t Print::printFloat(double number, uint8_t digits)
// Extract the integer part of the number and print it
unsigned long int_part = (unsigned long)number;
double remainder = number - (double)int_part;
n += print(int_part);
print(int_part);
// Print the decimal point, but only if there are digits beyond
if (digits > 0) {
n += print(".");
}
if (digits > 0)
print(".");
// Extract digits from the remainder one at a time
while (digits-- > 0)
{
remainder *= 10.0;
int toPrint = int(remainder);
n += print(toPrint);
print(toPrint);
remainder -= toPrint;
}
return n;
}

View File

@ -1,8 +1,6 @@
/*
WString.h - String library for Wiring & Arduino
...mostly rewritten by Paul Stoffregen...
Copyright (c) 2009-10 Hernando Barragan. All right reserved.
Copyright 2011, Paul Stoffregen, paul@pjrc.com
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -19,187 +17,96 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef String_class_h
#define String_class_h
#ifdef __cplusplus
#ifndef String_h
#define String_h
//#include "WProgram.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <avr/pgmspace.h>
// When compiling programs with this class, the following gcc parameters
// dramatically increase performance and memory (RAM) efficiency, typically
// with little or no increase in code size.
// -felide-constructors
// -std=c++0x
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal)))
// An inherited class for holding the result of a concatenation. These
// result objects are assumed to be writable by subsequent concatenations.
class StringSumHelper;
// The string class
class String
{
// use a function pointer to allow for "if (s)" without the
// complications of an operator bool(). for more information, see:
// http://www.artima.com/cppsource/safebool.html
typedef void (String::*StringIfHelperType)() const;
void StringIfHelper() const {}
public:
// constructors
String( const char *value = "" );
String( const String &value );
String( const char );
String( const unsigned char );
String( const int, const int base=10);
String( const unsigned int, const int base=10 );
String( const long, const int base=10 );
String( const unsigned long, const int base=10 );
~String() { free(_buffer); _length = _capacity = 0;} //added _length = _capacity = 0;
public:
// constructors
// creates a copy of the initial value.
// if the initial value is null or invalid, or if memory allocation
// fails, the string will be marked as invalid (i.e. "if (s)" will
// be false).
String(const char *cstr = "");
String(const String &str);
#ifdef __GXX_EXPERIMENTAL_CXX0X__
String(String &&rval);
String(StringSumHelper &&rval);
#endif
explicit String(char c);
explicit String(unsigned char, unsigned char base=10);
explicit String(int, unsigned char base=10);
explicit String(unsigned int, unsigned char base=10);
explicit String(long, unsigned char base=10);
explicit String(unsigned long, unsigned char base=10);
~String(void);
// operators
const String & operator = ( const String &rhs );
const String & operator +=( const String &rhs );
//const String & operator +=( const char );
int operator ==( const String &rhs ) const;
int operator !=( const String &rhs ) const;
int operator < ( const String &rhs ) const;
int operator > ( const String &rhs ) const;
int operator <=( const String &rhs ) const;
int operator >=( const String &rhs ) const;
char operator []( unsigned int index ) const;
char& operator []( unsigned int index );
//operator const char *() const { return _buffer; }
// general methods
char charAt( unsigned int index ) const;
int compareTo( const String &anotherString ) const;
unsigned char endsWith( const String &suffix ) const;
unsigned char equals( const String &anObject ) const;
unsigned char equalsIgnoreCase( const String &anotherString ) const;
int indexOf( char ch ) const;
int indexOf( char ch, unsigned int fromIndex ) const;
int indexOf( const String &str ) const;
int indexOf( const String &str, unsigned int fromIndex ) const;
int lastIndexOf( char ch ) const;
int lastIndexOf( char ch, unsigned int fromIndex ) const;
int lastIndexOf( const String &str ) const;
int lastIndexOf( const String &str, unsigned int fromIndex ) const;
unsigned int length( ) const { return _length; }
void setCharAt(unsigned int index, const char ch);
unsigned char startsWith( const String &prefix ) const;
unsigned char startsWith( const String &prefix, unsigned int toffset ) const;
String substring( unsigned int beginIndex ) const;
String substring( unsigned int beginIndex, unsigned int endIndex ) const;
String toLowerCase( ) const;
String toUpperCase( ) const;
String trim( ) const;
void getBytes(unsigned char *buf, unsigned int bufsize);
void toCharArray(char *buf, unsigned int bufsize);
long toInt( );
const String& concat( const String &str );
String replace( char oldChar, char newChar );
String replace( const String& match, const String& replace );
friend String operator + ( String lhs, const String &rhs );
// memory management
// return true on success, false on failure (in which case, the string
// is left unchanged). reserve(0), if successful, will validate an
// invalid string (i.e., "if (s)" will be true afterwards)
unsigned char reserve(unsigned int size);
inline unsigned int length(void) const {return len;}
protected:
char *_buffer; // the actual char array
unsigned int _capacity; // the array length minus one (for the '\0')
unsigned int _length; // the String length (not counting the '\0')
// creates a copy of the assigned value. if the value is null or
// invalid, or if the memory allocation fails, the string will be
// marked as invalid ("if (s)" will be false).
String & operator = (const String &rhs);
String & operator = (const char *cstr);
#ifdef __GXX_EXPERIMENTAL_CXX0X__
String & operator = (String &&rval);
String & operator = (StringSumHelper &&rval);
#endif
void getBuffer(unsigned int maxStrLen);
// concatenate (works w/ built-in types)
// returns true on success, false on failure (in which case, the string
// is left unchanged). if the argument is null or invalid, the
// concatenation is considered unsucessful.
unsigned char concat(const String &str);
unsigned char concat(const char *cstr);
unsigned char concat(char c);
unsigned char concat(unsigned char c);
unsigned char concat(int num);
unsigned char concat(unsigned int num);
unsigned char concat(long num);
unsigned char concat(unsigned long num);
// if there's not enough memory for the concatenated value, the string
// will be left unchanged (but this isn't signalled in any way)
String & operator += (const String &rhs) {concat(rhs); return (*this);}
String & operator += (const char *cstr) {concat(cstr); return (*this);}
String & operator += (char c) {concat(c); return (*this);}
String & operator += (unsigned char num) {concat(num); return (*this);}
String & operator += (int num) {concat(num); return (*this);}
String & operator += (unsigned int num) {concat(num); return (*this);}
String & operator += (long num) {concat(num); return (*this);}
String & operator += (unsigned long num) {concat(num); return (*this);}
private:
friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);
friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
friend StringSumHelper & operator + (const StringSumHelper &lhs, char c);
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num);
friend StringSumHelper & operator + (const StringSumHelper &lhs, int num);
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
// comparison (only works w/ Strings and "strings")
operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; }
int compareTo(const String &s) const;
unsigned char equals(const String &s) const;
unsigned char equals(const char *cstr) const;
unsigned char operator == (const String &rhs) const {return equals(rhs);}
unsigned char operator == (const char *cstr) const {return equals(cstr);}
unsigned char operator != (const String &rhs) const {return !equals(rhs);}
unsigned char operator != (const char *cstr) const {return !equals(cstr);}
unsigned char operator < (const String &rhs) const;
unsigned char operator > (const String &rhs) const;
unsigned char operator <= (const String &rhs) const;
unsigned char operator >= (const String &rhs) const;
unsigned char equalsIgnoreCase(const String &s) const;
unsigned char startsWith( const String &prefix) const;
unsigned char startsWith(const String &prefix, unsigned int offset) const;
unsigned char endsWith(const String &suffix) const;
// character acccess
char charAt(unsigned int index) const;
void setCharAt(unsigned int index, char c);
char operator [] (unsigned int index) const;
char& operator [] (unsigned int index);
void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const;
void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const
{getBytes((unsigned char *)buf, bufsize, index);}
// search
int indexOf( char ch ) const;
int indexOf( char ch, unsigned int fromIndex ) const;
int indexOf( const String &str ) const;
int indexOf( const String &str, unsigned int fromIndex ) const;
int lastIndexOf( char ch ) const;
int lastIndexOf( char ch, unsigned int fromIndex ) const;
int lastIndexOf( const String &str ) const;
int lastIndexOf( const String &str, unsigned int fromIndex ) const;
String substring( unsigned int beginIndex ) const;
String substring( unsigned int beginIndex, unsigned int endIndex ) const;
// modification
void replace(char find, char replace);
void replace(const String& find, const String& replace);
void toLowerCase(void);
void toUpperCase(void);
void trim(void);
// parsing/conversion
long toInt(void) const;
protected:
char *buffer; // the actual char array
unsigned int capacity; // the array length minus one (for the '\0')
unsigned int len; // the String length (not counting the '\0')
unsigned char flags; // unused, for future features
protected:
void init(void);
void invalidate(void);
unsigned char changeBuffer(unsigned int maxStrLen);
unsigned char concat(const char *cstr, unsigned int length);
// copy and move
String & copy(const char *cstr, unsigned int length);
#ifdef __GXX_EXPERIMENTAL_CXX0X__
void move(String &rhs);
#endif
};
class StringSumHelper : public String
// allocate buffer space
inline void String::getBuffer(unsigned int maxStrLen)
{
public:
StringSumHelper(const String &s) : String(s) {}
StringSumHelper(const char *p) : String(p) {}
StringSumHelper(char c) : String(c) {}
StringSumHelper(unsigned char num) : String(num) {}
StringSumHelper(int num) : String(num) {}
StringSumHelper(unsigned int num) : String(num) {}
StringSumHelper(long num) : String(num) {}
StringSumHelper(unsigned long num) : String(num) {}
};
_capacity = maxStrLen;
_buffer = (char *) malloc(_capacity + 1);
if (_buffer == NULL) _length = _capacity = 0;
}
#endif // __cplusplus
#endif // String_class_h
inline String operator+( String lhs, const String &rhs )
{
return lhs += rhs;
}
#endif

228
hardware/arduino/variants/mega/pins_arduino.h Normal file → Executable file
View File

@ -1,8 +1,8 @@
/*
pins_arduino.h - Pin definition functions for Arduino
Part of Arduino - http://www.arduino.cc/
pins_arduino.c - pin definitions for the Arduino board
Part of Arduino / Wiring Lite
Copyright (c) 2007 David A. Mellis
Copyright (c) 2005 David A. Mellis
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -19,72 +19,66 @@
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
$Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
$Id$
*/
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <avr/io.h>
#include "wiring_private.h"
#include "pins_arduino.h"
#include <avr/pgmspace.h>
// On the Arduino board, digital pins are also used
// for the analog output (software PWM). Analog input
// pins are a separate set.
#define NUM_DIGITAL_PINS 70
#define NUM_ANALOG_INPUTS 16
#define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1)
#define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46))
// ATMEL ATMEGA8 & 168 / ARDUINO
//
// +-\/-+
// PC6 1| |28 PC5 (AI 5)
// (D 0) PD0 2| |27 PC4 (AI 4)
// (D 1) PD1 3| |26 PC3 (AI 3)
// (D 2) PD2 4| |25 PC2 (AI 2)
// PWM+ (D 3) PD3 5| |24 PC1 (AI 1)
// (D 4) PD4 6| |23 PC0 (AI 0)
// VCC 7| |22 GND
// GND 8| |21 AREF
// PB6 9| |20 AVCC
// PB7 10| |19 PB5 (D 13)
// PWM+ (D 5) PD5 11| |18 PB4 (D 12)
// PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
// (D 7) PD7 13| |16 PB2 (D 10) PWM
// (D 8) PB0 14| |15 PB1 (D 9) PWM
// +----+
//
// (PWM+ indicates the additional PWM pins on the ATmega168.)
const static uint8_t SS = 53;
const static uint8_t MOSI = 51;
const static uint8_t MISO = 50;
const static uint8_t SCK = 52;
// ATMEL ATMEGA1280 / ARDUINO
//
// 0-7 PE0-PE7 works
// 8-13 PB0-PB5 works
// 14-21 PA0-PA7 works
// 22-29 PH0-PH7 works
// 30-35 PG5-PG0 works
// 36-43 PC7-PC0 works
// 44-51 PJ7-PJ0 works
// 52-59 PL7-PL0 works
// 60-67 PD7-PD0 works
// A0-A7 PF0-PF7
// A8-A15 PK0-PK7
const static uint8_t SDA = 20;
const static uint8_t SCL = 21;
const static uint8_t LED = 13;
#define PA 1
#define PB 2
#define PC 3
#define PD 4
#define PE 5
#define PF 6
#define PG 7
#define PH 8
#define PJ 10
#define PK 11
#define PL 12
const static uint8_t A0 = 54;
const static uint8_t A1 = 55;
const static uint8_t A2 = 56;
const static uint8_t A3 = 57;
const static uint8_t A4 = 58;
const static uint8_t A5 = 59;
const static uint8_t A6 = 60;
const static uint8_t A7 = 61;
const static uint8_t A8 = 62;
const static uint8_t A9 = 63;
const static uint8_t A10 = 64;
const static uint8_t A11 = 65;
const static uint8_t A12 = 66;
const static uint8_t A13 = 67;
const static uint8_t A14 = 68;
const static uint8_t A15 = 69;
// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins)
// Only pins available for RECEIVE (TRANSMIT can be on any pin):
// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me)
// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \
(((p) >= 50) && ((p) <= 53)) || \
(((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) )
#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \
( (((p) >= 62) && ((p) <= 69)) ? 2 : \
0 ) )
#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \
( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \
((uint8_t *)0) ) )
#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \
( ((p) == 50) ? 3 : \
( ((p) == 51) ? 2 : \
( ((p) == 52) ? 1 : \
( ((p) == 53) ? 0 : \
( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \
0 ) ) ) ) ) )
#ifdef ARDUINO_MAIN
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
const uint16_t PROGMEM port_to_mode_PGM[] = {
NOT_A_PORT,
(uint16_t) &DDRA,
@ -357,7 +351,115 @@ const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
NOT_ON_TIMER , // PK 6 ** 68 ** A14
NOT_ON_TIMER , // PK 7 ** 69 ** A15
};
#else
// these arrays map port names (e.g. port B) to the
// appropriate addresses for various functions (e.g. reading
// and writing)
const uint16_t PROGMEM port_to_mode_PGM[] = {
NOT_A_PORT,
NOT_A_PORT,
(uint16_t) &DDRB,
(uint16_t) &DDRC,
(uint16_t) &DDRD,
};
const uint16_t PROGMEM port_to_output_PGM[] = {
NOT_A_PORT,
NOT_A_PORT,
(uint16_t) &PORTB,
(uint16_t) &PORTC,
(uint16_t) &PORTD,
};
const uint16_t PROGMEM port_to_input_PGM[] = {
NOT_A_PORT,
NOT_A_PORT,
(uint16_t) &PINB,
(uint16_t) &PINC,
(uint16_t) &PIND,
};
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PD, /* 0 */
PD,
PD,
PD,
PD,
PD,
PD,
PD,
PB, /* 8 */
PB,
PB,
PB,
PB,
PB,
PC, /* 14 */
PC,
PC,
PC,
PC,
PC,
};
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
_BV(0), /* 0, port D */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 8, port B */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(0), /* 14, port C */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
};
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
NOT_ON_TIMER, /* 0 - port D */
NOT_ON_TIMER,
NOT_ON_TIMER,
// on the ATmega168, digital pin 3 has hardware pwm
#if defined(__AVR_ATmega8__)
NOT_ON_TIMER,
#else
TIMER2B,
#endif
NOT_ON_TIMER,
// on the ATmega168, digital pins 5 and 6 have hardware pwm
#if defined(__AVR_ATmega8__)
NOT_ON_TIMER,
NOT_ON_TIMER,
#else
TIMER0B,
TIMER0A,
#endif
NOT_ON_TIMER,
NOT_ON_TIMER, /* 8 - port B */
TIMER1A,
TIMER1B,
#if defined(__AVR_ATmega8__)
TIMER2,
#else
TIMER2A,
#endif
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER, /* 14 - port C */
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
NOT_ON_TIMER,
};
#endif
#endif

View File

@ -23,28 +23,32 @@
#include <Ethernet.h>
// assign a MAC address for the ethernet controller.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// fill in your address here:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// assign an IP address for the controller:
byte ip[] = {
192,168,1,20 };
byte gateway[] = {
192,168,1,1};
byte subnet[] = {
255, 255, 255, 0 };
// The address of the server you want to connect to (pachube.com):
byte server[] = {
173,203,98,29 };
// initialize the library instance:
EthernetClient client;
Client client(server, 80);
long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
const int postingInterval = 10000; //delay between updates to Pachube.com
void setup() {
// start serial port:
// start the ethernet connection and serial port:
Ethernet.begin(mac, ip);
Serial.begin(9600);
// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
for(;;)
;
}
// give the ethernet module time to boot up:
delay(1000);
}
@ -82,7 +86,7 @@ void loop() {
// this method makes a HTTP connection to the server:
void sendData(int thisData) {
// if there's a successful connection:
if (client.connect("www.pachube.com", 80)) {
if (client.connect()) {
Serial.println("connecting...");
// send the HTTP PUT request.
// fill in your feed address here:

View File

@ -28,9 +28,20 @@
// fill in your address here:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// assign an IP address for the controller:
byte ip[] = {
192,168,1,20 };
byte gateway[] = {
192,168,1,1};
byte subnet[] = {
255, 255, 255, 0 };
// The address of the server you want to connect to (pachube.com):
byte server[] = {
173,203,98,29 };
// initialize the library instance:
EthernetClient client;
Client client(server, 80);
long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
@ -38,13 +49,8 @@ const int postingInterval = 10000; //delay between updates to Pachube.com
void setup() {
// start the ethernet connection and serial port:
Ethernet.begin(mac, ip);
Serial.begin(9600);
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
for(;;)
;
}
// give the ethernet module time to boot up:
delay(1000);
}
@ -90,7 +96,7 @@ void loop() {
// this method makes a HTTP connection to the server:
void sendData(String thisData) {
// if there's a successful connection:
if (client.connect("www.pachube.com", 80)) {
if (client.connect()) {
Serial.println("connecting...");
// send the HTTP PUT request.
// fill in your feed address here:

View File

@ -1,14 +1,3 @@
/*
* Firmata is a generic protocol for communicating with microcontrollers
* from software on a host computer. It is intended to work with
* any host computer software package.
*
* To download a host software package, please clink on the following link
* to open the download page in your default browser.
*
* http://firmata.org/wiki/Download
*/
/* This sketch accepts strings and raw sysex messages and echos them back.
*
* This example code is in the public domain.
@ -25,7 +14,12 @@ void stringCallback(char *myString)
void sysexCallback(byte command, byte argc, byte*argv)
{
Firmata.sendSysex(command, argc, argv);
Serial.write(START_SYSEX);
Serial.write(command);
for(byte i=0; i<argc; i++) {
Serial.write(argv[i]);
}
Serial.write(END_SYSEX);
}
void setup()

View File

@ -0,0 +1,138 @@
/*
LiquidCrystal Library - Custom Characters
Demonstrates how to add custom characters on an LCD display.
The LiquidCrystal library works with all LCD displays that are
compatible with the Hitachi HD44780 driver. There are many of
them out there, and you can usually tell them by the 16-pin interface.
This sketch prints "I <heart> Arduino!" and a little dancing man
to the LCD.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K potentiometer:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
* 10K poterntiometer on pin A0
created21 Mar 2011
by Tom Igoe
Based on Adafruit's example at
https://github.com/adafruit/SPI_VFD/blob/master/examples/createChar/createChar.pde
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
Also useful:
http://icontexto.com/charactercreator/
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// make some custom characters:
byte heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
byte smiley[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000
};
byte frownie[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b00000,
0b01110,
0b10001
};
byte armsDown[8] = {
0b00100,
0b01010,
0b00100,
0b00100,
0b01110,
0b10101,
0b00100,
0b01010
};
byte armsUp[8] = {
0b00100,
0b01010,
0b00100,
0b10101,
0b01110,
0b00100,
0b00100,
0b01010
};
void setup() {
// create a new character
lcd.createChar(0, heart);
// create a new character
lcd.createChar(1, smiley);
// create a new character
lcd.createChar(2, frownie);
// create a new character
lcd.createChar(3, armsDown);
// create a new character
lcd.createChar(4, armsUp);
// set up the lcd's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the lcd.
lcd.print("I ");
lcd.write(0);
lcd.print(" Arduino! ");
lcd.write(1);
}
void loop() {
// read the potentiometer on A0:
int sensorReading = analogRead(A0);
// map the result to 200 - 1000:
int delayTime = map(sensorReading, 0, 1023, 200, 1000);
// set the cursor to the bottom row, 5th position:
lcd.setCursor(4, 1);
// draw the little man, arms down:
lcd.write(3);
delay(delayTime);
lcd.setCursor(4, 1);
// draw him arms up:
lcd.write(4);
delay(delayTime);
}

View File

@ -14,137 +14,52 @@
#include <SD.h>
/* for debugging file open/close leaks
uint8_t nfilecount=0;
*/
File::File(SdFile f, const char *n) {
// oh man you are kidding me, new() doesnt exist? Ok we do it by hand!
_file = (SdFile *)malloc(sizeof(SdFile));
if (_file) {
memcpy(_file, &f, sizeof(SdFile));
strncpy(_name, n, 12);
_name[12] = 0;
/* for debugging file open/close leaks
nfilecount++;
Serial.print("Created \"");
Serial.print(n);
Serial.print("\": ");
Serial.println(nfilecount, DEC);
*/
}
void File::write(uint8_t val) {
SD.file.write(val);
}
File::File(void) {
_file = 0;
_name[0] = 0;
//Serial.print("Created empty file object");
void File::write(const char *str) {
SD.file.write(str);
}
File::~File(void) {
// Serial.print("Deleted file object");
}
// returns a pointer to the file name
char *File::name(void) {
return _name;
}
// a directory is a special type of file
boolean File::isDirectory(void) {
return (_file && _file->isDir());
}
size_t File::write(uint8_t val) {
return write(&val, 1);
}
size_t File::write(const uint8_t *buf, size_t size) {
size_t t;
if (!_file) {
setWriteError();
return 0;
}
_file->clearWriteError();
t = _file->write(buf, size);
if (_file->getWriteError()) {
setWriteError();
return 0;
}
return t;
void File::write(const uint8_t *buf, size_t size) {
SD.file.write(buf, size);
}
int File::peek() {
if (! _file)
return 0;
int c = _file->read();
if (c != -1) _file->seekCur(-1);
int c = SD.file.read();
if (c != -1) SD.file.seekCur(-1);
return c;
}
int File::read() {
if (_file)
return _file->read();
return -1;
}
// buffered read for more efficient, high speed reading
int File::read(void *buf, uint16_t nbyte) {
if (_file)
return _file->read(buf, nbyte);
return 0;
return SD.file.read();
}
int File::available() {
if (! _file) return 0;
uint32_t n = size() - position();
return n > 0X7FFF ? 0X7FFF : n;
return size() - position();
}
void File::flush() {
if (_file)
_file->sync();
SD.file.sync();
}
boolean File::seek(uint32_t pos) {
if (! _file) return false;
return _file->seekSet(pos);
return SD.file.seekSet(pos);
}
uint32_t File::position() {
if (! _file) return -1;
return _file->curPosition();
return SD.file.curPosition();
}
uint32_t File::size() {
if (! _file) return 0;
return _file->fileSize();
return SD.file.fileSize();
}
void File::close() {
if (_file) {
_file->close();
free(_file);
_file = 0;
/* for debugging file open/close leaks
nfilecount--;
Serial.print("Deleted ");
Serial.println(nfilecount, DEC);
*/
}
SD.file.close();
}
File::operator bool() {
if (_file)
return _file->isOpen();
return false;
return SD.file.isOpen();
}

View File

@ -0,0 +1,111 @@
/*
SD card test
This example shows how use the utility libraries on which the'
SD library is based in order to get info about your SD card.
Very useful for testing a card when you're not sure whether its working or not.
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
** CS - depends on your SD card shield or module.
Pin 4 used here for consistency with other Arduino examples
created 28 Mar 2011
by Limor Fried
modified 16 Mar 2011
by Tom Igoe
*/
// include the SD library:
#include <SD.h>
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 4;
void setup()
{
Serial.begin(9600);
Serial.print("\nInitializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT); // change this to 53 on a mega
// we'll use the initialization code from the utility libraries
// since we're just testing if the card is working!
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card is inserted?");
Serial.println("* Is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
return;
} else {
Serial.println("Wiring is correct and a card is present.");
}
// print the type of card
Serial.print("\nCard type: ");
switch(card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
return;
}
// print the type and size of the first FAT-type volume
long volumesize;
Serial.print("\nVolume type is FAT");
Serial.println(volume.fatType(), DEC);
Serial.println();
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize *= 512; // SD card blocks are always 512 bytes
Serial.print("Volume size (bytes): ");
Serial.println(volumesize);
Serial.print("Volume size (Kbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Mbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {
}

View File

@ -1,515 +1,227 @@
/*
SoftwareSerial.cpp (formerly NewSoftSerial.cpp) -
Multi-instance software serial library for Arduino/Wiring
-- Interrupt-driven receive and other improvements by ladyada
(http://ladyada.net)
-- Tuning, circular buffer, derivation from class Print/Stream,
multi-instance support, porting to 8MHz processors,
various optimizations, PROGMEM delay tables, inverse logic and
direct port writing by Mikal Hart (http://www.arduiniana.org)
-- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com)
-- 20MHz processor support by Garrett Mace (http://www.macetech.com)
-- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
The latest version of this library can always be found at
http://arduiniana.org.
*/
// When set, _DEBUG co-opts pins 11 and 13 for debugging with an
// oscilloscope or logic analyzer. Beware: it also slightly modifies
// the bit times, so don't rely on it too much at high baud rates
#define _DEBUG 0
#define _DEBUG_PIN1 11
#define _DEBUG_PIN2 13
//
// Includes
//
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
//
// Lookup table
//
typedef struct _DELAY_TABLE
{
long baud;
unsigned short rx_delay_centering;
unsigned short rx_delay_intrabit;
unsigned short rx_delay_stopbit;
unsigned short tx_delay;
} DELAY_TABLE;
#if F_CPU == 16000000
static const DELAY_TABLE PROGMEM table[] =
{
// baud rxcenter rxintra rxstop tx
{ 115200, 1, 17, 17, 12, },
{ 57600, 10, 37, 37, 33, },
{ 38400, 25, 57, 57, 54, },
{ 31250, 31, 70, 70, 68, },
{ 28800, 34, 77, 77, 74, },
{ 19200, 54, 117, 117, 114, },
{ 14400, 74, 156, 156, 153, },
{ 9600, 114, 236, 236, 233, },
{ 4800, 233, 474, 474, 471, },
{ 2400, 471, 950, 950, 947, },
{ 1200, 947, 1902, 1902, 1899, },
{ 300, 3804, 7617, 7617, 7614, },
};
const int XMIT_START_ADJUSTMENT = 5;
#elif F_CPU == 8000000
static const DELAY_TABLE table[] PROGMEM =
{
// baud rxcenter rxintra rxstop tx
{ 115200, 1, 5, 5, 3, },
{ 57600, 1, 15, 15, 13, },
{ 38400, 2, 25, 26, 23, },
{ 31250, 7, 32, 33, 29, },
{ 28800, 11, 35, 35, 32, },
{ 19200, 20, 55, 55, 52, },
{ 14400, 30, 75, 75, 72, },
{ 9600, 50, 114, 114, 112, },
{ 4800, 110, 233, 233, 230, },
{ 2400, 229, 472, 472, 469, },
{ 1200, 467, 948, 948, 945, },
{ 300, 1895, 3805, 3805, 3802, },
};
const int XMIT_START_ADJUSTMENT = 4;
#elif F_CPU == 20000000
// 20MHz support courtesy of the good people at macegr.com.
// Thanks, Garrett!
static const DELAY_TABLE PROGMEM table[] =
{
// baud rxcenter rxintra rxstop tx
{ 115200, 3, 21, 21, 18, },
{ 57600, 20, 43, 43, 41, },
{ 38400, 37, 73, 73, 70, },
{ 31250, 45, 89, 89, 88, },
{ 28800, 46, 98, 98, 95, },
{ 19200, 71, 148, 148, 145, },
{ 14400, 96, 197, 197, 194, },
{ 9600, 146, 297, 297, 294, },
{ 4800, 296, 595, 595, 592, },
{ 2400, 592, 1189, 1189, 1186, },
{ 1200, 1187, 2379, 2379, 2376, },
{ 300, 4759, 9523, 9523, 9520, },
};
const int XMIT_START_ADJUSTMENT = 6;
#else
#error This version of SoftwareSerial supports only 20, 16 and 8MHz processors
#endif
//
// Statics
//
SoftwareSerial *SoftwareSerial::active_object = 0;
char SoftwareSerial::_receive_buffer[_SS_MAX_RX_BUFF];
volatile uint8_t SoftwareSerial::_receive_buffer_tail = 0;
volatile uint8_t SoftwareSerial::_receive_buffer_head = 0;
//
// Debugging
//
// This function generates a brief pulse
// for debugging or measuring on an oscilloscope.
inline void DebugPulse(uint8_t pin, uint8_t count)
{
#if _DEBUG
volatile uint8_t *pport = portOutputRegister(digitalPinToPort(pin));
uint8_t val = *pport;
while (count--)
{
*pport = val | digitalPinToBitMask(pin);
*pport = val;
}
#endif
}
//
// Private methods
//
/* static */
inline void SoftwareSerial::tunedDelay(uint16_t delay) {
uint8_t tmp=0;
asm volatile("sbiw %0, 0x01 \n\t"
"ldi %1, 0xFF \n\t"
"cpi %A0, 0xFF \n\t"
"cpc %B0, %1 \n\t"
"brne .-10 \n\t"
: "+r" (delay), "+a" (tmp)
: "0" (delay)
);
}
// This function sets the current object as the "listening"
// one and returns true if it replaces another
bool SoftwareSerial::listen()
{
if (active_object != this)
{
_buffer_overflow = false;
uint8_t oldSREG = SREG;
cli();
_receive_buffer_head = _receive_buffer_tail = 0;
active_object = this;
SREG = oldSREG;
return true;
}
return false;
}
//
// The receive routine called by the interrupt handler
//
void SoftwareSerial::recv()
{
#if GCC_VERSION < 40302
// Work-around for avr-gcc 4.3.0 OSX version bug
// Preserve the registers that the compiler misses
// (courtesy of Arduino forum user *etracer*)
asm volatile(
"push r18 \n\t"
"push r19 \n\t"
"push r20 \n\t"
"push r21 \n\t"
"push r22 \n\t"
"push r23 \n\t"
"push r26 \n\t"
"push r27 \n\t"
::);
#endif
uint8_t d = 0;
// If RX line is high, then we don't see any start bit
// so interrupt is probably not for us
if (_inverse_logic ? rx_pin_read() : !rx_pin_read())
{
// Wait approximately 1/2 of a bit width to "center" the sample
tunedDelay(_rx_delay_centering);
DebugPulse(_DEBUG_PIN2, 1);
// Read each of the 8 bits
for (uint8_t i=0x1; i; i <<= 1)
{
tunedDelay(_rx_delay_intrabit);
DebugPulse(_DEBUG_PIN2, 1);
uint8_t noti = ~i;
if (rx_pin_read())
d |= i;
else // else clause added to ensure function timing is ~balanced
d &= noti;
}
// skip the stop bit
tunedDelay(_rx_delay_stopbit);
DebugPulse(_DEBUG_PIN2, 1);
if (_inverse_logic)
d = ~d;
// if buffer full, set the overflow flag and return
if ((_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF != _receive_buffer_head)
{
// save new data in buffer: tail points to where byte goes
_receive_buffer[_receive_buffer_tail] = d; // save new byte
_receive_buffer_tail = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF;
}
else
{
#if _DEBUG // for scope: pulse pin as overflow indictator
DebugPulse(_DEBUG_PIN1, 1);
#endif
_buffer_overflow = true;
}
}
#if GCC_VERSION < 40302
// Work-around for avr-gcc 4.3.0 OSX version bug
// Restore the registers that the compiler misses
asm volatile(
"pop r27 \n\t"
"pop r26 \n\t"
"pop r23 \n\t"
"pop r22 \n\t"
"pop r21 \n\t"
"pop r20 \n\t"
"pop r19 \n\t"
"pop r18 \n\t"
::);
#endif
}
void SoftwareSerial::tx_pin_write(uint8_t pin_state)
{
if (pin_state == LOW)
*_transmitPortRegister &= ~_transmitBitMask;
else
*_transmitPortRegister |= _transmitBitMask;
}
uint8_t SoftwareSerial::rx_pin_read()
{
return *_receivePortRegister & _receiveBitMask;
}
//
// Interrupt handling
//
/* static */
inline void SoftwareSerial::handle_interrupt()
{
if (active_object)
{
active_object->recv();
}
}
#if defined(PCINT0_vect)
ISR(PCINT0_vect)
{
SoftwareSerial::handle_interrupt();
}
#endif
#if defined(PCINT1_vect)
ISR(PCINT1_vect)
{
SoftwareSerial::handle_interrupt();
}
#endif
#if defined(PCINT2_vect)
ISR(PCINT2_vect)
{
SoftwareSerial::handle_interrupt();
}
#endif
#if defined(PCINT3_vect)
ISR(PCINT3_vect)
{
SoftwareSerial::handle_interrupt();
}
#endif
//
// Constructor
//
SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic /* = false */) :
_rx_delay_centering(0),
_rx_delay_intrabit(0),
_rx_delay_stopbit(0),
_tx_delay(0),
_buffer_overflow(false),
_inverse_logic(inverse_logic)
{
setTX(transmitPin);
setRX(receivePin);
}
//
// Destructor
//
SoftwareSerial::~SoftwareSerial()
{
end();
}
void SoftwareSerial::setTX(uint8_t tx)
{
pinMode(tx, OUTPUT);
digitalWrite(tx, HIGH);
_transmitBitMask = digitalPinToBitMask(tx);
uint8_t port = digitalPinToPort(tx);
_transmitPortRegister = portOutputRegister(port);
}
void SoftwareSerial::setRX(uint8_t rx)
{
pinMode(rx, INPUT);
if (!_inverse_logic)
digitalWrite(rx, HIGH); // pullup for normal logic!
_receivePin = rx;
_receiveBitMask = digitalPinToBitMask(rx);
uint8_t port = digitalPinToPort(rx);
_receivePortRegister = portInputRegister(port);
}
//
// Public methods
//
void SoftwareSerial::begin(long speed)
{
_rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0;
for (unsigned i=0; i<sizeof(table)/sizeof(table[0]); ++i)
{
long baud = pgm_read_dword(&table[i].baud);
if (baud == speed)
{
_rx_delay_centering = pgm_read_word(&table[i].rx_delay_centering);
_rx_delay_intrabit = pgm_read_word(&table[i].rx_delay_intrabit);
_rx_delay_stopbit = pgm_read_word(&table[i].rx_delay_stopbit);
_tx_delay = pgm_read_word(&table[i].tx_delay);
break;
}
}
// Set up RX interrupts, but only if we have a valid RX baud rate
if (_rx_delay_stopbit)
{
if (digitalPinToPCICR(_receivePin))
{
*digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
*digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
}
tunedDelay(_tx_delay); // if we were low this establishes the end
}
#if _DEBUG
pinMode(_DEBUG_PIN1, OUTPUT);
pinMode(_DEBUG_PIN2, OUTPUT);
#endif
listen();
}
void SoftwareSerial::end()
{
if (digitalPinToPCMSK(_receivePin))
*digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin));
}
// Read data from buffer
int SoftwareSerial::read()
{
if (!isListening())
return -1;
// Empty buffer?
if (_receive_buffer_head == _receive_buffer_tail)
return -1;
// Read from "head"
uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte
_receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF;
return d;
}
int SoftwareSerial::available()
{
if (!isListening())
return 0;
return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF;
}
size_t SoftwareSerial::write(uint8_t b)
{
if (_tx_delay == 0) {
setWriteError();
return 0;
}
uint8_t oldSREG = SREG;
cli(); // turn off interrupts for a clean txmit
// Write the start bit
tx_pin_write(_inverse_logic ? HIGH : LOW);
tunedDelay(_tx_delay + XMIT_START_ADJUSTMENT);
// Write each of the 8 bits
if (_inverse_logic)
{
for (byte mask = 0x01; mask; mask <<= 1)
{
if (b & mask) // choose bit
tx_pin_write(LOW); // send 1
else
tx_pin_write(HIGH); // send 0
tunedDelay(_tx_delay);
}
tx_pin_write(LOW); // restore pin to natural state
}
else
{
for (byte mask = 0x01; mask; mask <<= 1)
{
if (b & mask) // choose bit
tx_pin_write(HIGH); // send 1
else
tx_pin_write(LOW); // send 0
tunedDelay(_tx_delay);
}
tx_pin_write(HIGH); // restore pin to natural state
}
SREG = oldSREG; // turn interrupts back on
tunedDelay(_tx_delay);
return 1;
}
void SoftwareSerial::flush()
{
if (!isListening())
return;
uint8_t oldSREG = SREG;
cli();
_receive_buffer_head = _receive_buffer_tail = 0;
SREG = oldSREG;
}
int SoftwareSerial::peek()
{
if (!isListening())
return -1;
// Empty buffer?
if (_receive_buffer_head == _receive_buffer_tail)
return -1;
// Read from "head"
return _receive_buffer[_receive_buffer_head];
}
/*
SoftwareSerial.cpp - Software serial library
Copyright (c) 2006 David A. Mellis. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/******************************************************************************
* Includes
******************************************************************************/
#include "WConstants.h"
#include "SoftwareSerial.h"
/******************************************************************************
* Definitions
******************************************************************************/
/******************************************************************************
* Constructors
******************************************************************************/
SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin)
{
_receivePin = receivePin;
_transmitPin = transmitPin;
_baudRate = 0;
}
/******************************************************************************
* User API
******************************************************************************/
void SoftwareSerial::begin(long speed)
{
_baudRate = speed;
_bitPeriod = 1000000 / _baudRate;
digitalWrite(_transmitPin, HIGH);
delayMicroseconds( _bitPeriod); // if we were low this establishes the end
}
int SoftwareSerial::read()
{
int val = 0;
int bitDelay = _bitPeriod - clockCyclesToMicroseconds(50);
// one byte of serial data (LSB first)
// ...--\ /--\/--\/--\/--\/--\/--\/--\/--\/--...
// \--/\--/\--/\--/\--/\--/\--/\--/\--/
// start 0 1 2 3 4 5 6 7 stop
while (digitalRead(_receivePin));
// confirm that this is a real start bit, not line noise
if (digitalRead(_receivePin) == LOW) {
// frame start indicated by a falling edge and low start bit
// jump to the middle of the low start bit
delayMicroseconds(bitDelay / 2 - clockCyclesToMicroseconds(50));
// offset of the bit in the byte: from 0 (LSB) to 7 (MSB)
for (int offset = 0; offset < 8; offset++) {
// jump to middle of next bit
delayMicroseconds(bitDelay);
// read bit
val |= digitalRead(_receivePin) << offset;
}
delayMicroseconds(_bitPeriod);
return val;
}
return -1;
}
void SoftwareSerial::print(uint8_t b)
{
if (_baudRate == 0)
return;
int bitDelay = _bitPeriod - clockCyclesToMicroseconds(50); // a digitalWrite is about 50 cycles
byte mask;
digitalWrite(_transmitPin, LOW);
delayMicroseconds(bitDelay);
for (mask = 0x01; mask; mask <<= 1) {
if (b & mask){ // choose bit
digitalWrite(_transmitPin,HIGH); // send 1
}
else{
digitalWrite(_transmitPin,LOW); // send 1
}
delayMicroseconds(bitDelay);
}
digitalWrite(_transmitPin, HIGH);
delayMicroseconds(bitDelay);
}
void SoftwareSerial::print(const char *s)
{
while (*s)
print(*s++);
}
void SoftwareSerial::print(char c)
{
print((uint8_t) c);
}
void SoftwareSerial::print(int n)
{
print((long) n);
}
void SoftwareSerial::print(unsigned int n)
{
print((unsigned long) n);
}
void SoftwareSerial::print(long n)
{
if (n < 0) {
print('-');
n = -n;
}
printNumber(n, 10);
}
void SoftwareSerial::print(unsigned long n)
{
printNumber(n, 10);
}
void SoftwareSerial::print(long n, int base)
{
if (base == 0)
print((char) n);
else if (base == 10)
print(n);
else
printNumber(n, base);
}
void SoftwareSerial::println(void)
{
print('\r');
print('\n');
}
void SoftwareSerial::println(char c)
{
print(c);
println();
}
void SoftwareSerial::println(const char c[])
{
print(c);
println();
}
void SoftwareSerial::println(uint8_t b)
{
print(b);
println();
}
void SoftwareSerial::println(int n)
{
print(n);
println();
}
void SoftwareSerial::println(long n)
{
print(n);
println();
}
void SoftwareSerial::println(unsigned long n)
{
print(n);
println();
}
void SoftwareSerial::println(long n, int base)
{
print(n, base);
println();
}
// Private Methods /////////////////////////////////////////////////////////////
void SoftwareSerial::printNumber(unsigned long n, uint8_t base)
{
unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
unsigned long i = 0;
if (n == 0) {
print('0');
return;
}
while (n > 0) {
buf[i++] = n % base;
n /= base;
}
for (; i > 0; i--)
print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10));
}

View File

@ -1,112 +1,56 @@
/*
SoftwareSerial.h (formerly NewSoftSerial.h) -
Multi-instance software serial library for Arduino/Wiring
-- Interrupt-driven receive and other improvements by ladyada
(http://ladyada.net)
-- Tuning, circular buffer, derivation from class Print/Stream,
multi-instance support, porting to 8MHz processors,
various optimizations, PROGMEM delay tables, inverse logic and
direct port writing by Mikal Hart (http://www.arduiniana.org)
-- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com)
-- 20MHz processor support by Garrett Mace (http://www.macetech.com)
-- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
The latest version of this library can always be found at
http://arduiniana.org.
*/
#ifndef SoftwareSerial_h
#define SoftwareSerial_h
#include <inttypes.h>
#include <Stream.h>
/******************************************************************************
* Definitions
******************************************************************************/
#define _SS_MAX_RX_BUFF 64 // RX buffer size
#ifndef GCC_VERSION
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif
class SoftwareSerial : public Stream
{
private:
// per object data
uint8_t _receivePin;
uint8_t _receiveBitMask;
volatile uint8_t *_receivePortRegister;
uint8_t _transmitBitMask;
volatile uint8_t *_transmitPortRegister;
uint16_t _rx_delay_centering;
uint16_t _rx_delay_intrabit;
uint16_t _rx_delay_stopbit;
uint16_t _tx_delay;
uint16_t _buffer_overflow:1;
uint16_t _inverse_logic:1;
// static data
static char _receive_buffer[_SS_MAX_RX_BUFF];
static volatile uint8_t _receive_buffer_tail;
static volatile uint8_t _receive_buffer_head;
static SoftwareSerial *active_object;
// private methods
void recv();
uint8_t rx_pin_read();
void tx_pin_write(uint8_t pin_state);
void setTX(uint8_t transmitPin);
void setRX(uint8_t receivePin);
// private static method for timing
static inline void tunedDelay(uint16_t delay);
public:
// public methods
SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false);
~SoftwareSerial();
void begin(long speed);
bool listen();
void end();
bool isListening() { return this == active_object; }
bool overflow() { bool ret = _buffer_overflow; _buffer_overflow = false; return ret; }
int peek();
virtual size_t write(uint8_t byte);
virtual int read();
virtual int available();
virtual void flush();
using Print::write;
// public only for easy access by interrupt handlers
static inline void handle_interrupt();
};
// Arduino 0012 workaround
#undef int
#undef char
#undef long
#undef byte
#undef float
#undef abs
#undef round
#endif
/*
SoftwareSerial.h - Software serial library
Copyright (c) 2006 David A. Mellis. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef SoftwareSerial_h
#define SoftwareSerial_h
#include <inttypes.h>
class SoftwareSerial
{
private:
uint8_t _receivePin;
uint8_t _transmitPin;
long _baudRate;
int _bitPeriod;
void printNumber(unsigned long, uint8_t);
public:
SoftwareSerial(uint8_t, uint8_t);
void begin(long);
int read();
void print(char);
void print(const char[]);
void print(uint8_t);
void print(int);
void print(unsigned int);
void print(long);
void print(unsigned long);
void print(long, int);
void println(void);
void println(char);
void println(const char[]);
void println(uint8_t);
void println(int);
void println(long);
void println(unsigned long);
void println(long, int);
};
#endif

View File

@ -1,21 +0,0 @@
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
void setup()
{
Serial.begin(57600);
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println("Hello, world?");
}
void loop() // run over and over
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}

13
libraries/SoftwareSerial/keywords.txt Executable file → Normal file
View File

@ -1,26 +1,17 @@
#######################################
# Syntax Coloring Map for NewSoftSerial
# Syntax Coloring Map For Ultrasound
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
NewSoftSerial KEYWORD1
SoftwareSerial KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
begin KEYWORD2
end KEYWORD2
read KEYWORD2
available KEYWORD2
isListening KEYWORD2
overflow KEYWORD2
flush KEYWORD2
listen KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################