1
0
mirror of https://github.com/arduino/Arduino.git synced 2024-11-29 10:24:12 +01:00

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

View File

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

View File

@ -37,12 +37,12 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
/** Rollover titles for each button. */ /** Rollover titles for each button. */
static final String title[] = { 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. */ /** Titles for each button when the shift key is pressed. */
static final String titleShift[] = { 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; 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 RUN = 0;
static final int EXPORT = 1; static final int STOP = 1;
static final int NEW = 2; static final int NEW = 2;
static final int OPEN = 3; static final int OPEN = 3;
static final int SAVE = 4; 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 INACTIVE = 0;
static final int ROLLOVER = 1; static final int ROLLOVER = 1;
@ -104,10 +105,11 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
//which[buttonCount++] = NOTHING; //which[buttonCount++] = NOTHING;
which[buttonCount++] = RUN; which[buttonCount++] = RUN;
which[buttonCount++] = EXPORT; which[buttonCount++] = STOP;
which[buttonCount++] = NEW; which[buttonCount++] = NEW;
which[buttonCount++] = OPEN; which[buttonCount++] = OPEN;
which[buttonCount++] = SAVE; which[buttonCount++] = SAVE;
which[buttonCount++] = EXPORT;
which[buttonCount++] = SERIAL; which[buttonCount++] = SERIAL;
currentRollover = -1; currentRollover = -1;
@ -320,13 +322,13 @@ public class EditorToolbar extends JComponent implements MouseInputListener, Key
switch (sel) { switch (sel) {
case RUN: case RUN:
editor.handleRun(false); editor.handleRun(e.isShiftDown());
break;
case STOP:
editor.handleStop();
break; break;
// case STOP:
// editor.handleStop();
// break;
//
case OPEN: case OPEN:
popup = menu.getPopupMenu(); popup = menu.getPopupMenu();
popup.show(EditorToolbar.this, x, y); popup.show(EditorToolbar.this, x, y);

View File

@ -113,8 +113,6 @@ public class Preferences {
JTextField sketchbookLocationField; JTextField sketchbookLocationField;
JCheckBox exportSeparateBox; JCheckBox exportSeparateBox;
JCheckBox verboseCompilationBox;
JCheckBox verboseUploadBox;
JCheckBox deletePreviousBox; JCheckBox deletePreviousBox;
JCheckBox externalEditorBox; JCheckBox externalEditorBox;
JCheckBox memoryOverrideBox; JCheckBox memoryOverrideBox;
@ -282,21 +280,6 @@ public class Preferences {
top += d.height + GUI_BETWEEN; 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 // [ ] Delete previous applet or application folder on export
deletePreviousBox = deletePreviousBox =
@ -487,8 +470,6 @@ public class Preferences {
*/ */
protected void applyFrame() { protected void applyFrame() {
// put each of the settings into the table // put each of the settings into the table
setBoolean("build.verbose", verboseCompilationBox.isSelected());
setBoolean("upload.verbose", verboseUploadBox.isSelected());
setBoolean("export.delete_target_folder", setBoolean("export.delete_target_folder",
deletePreviousBox.isSelected()); deletePreviousBox.isSelected());
@ -546,8 +527,6 @@ public class Preferences {
this.editor = editor; this.editor = editor;
// set all settings entry boxes to their actual status // set all settings entry boxes to their actual status
verboseCompilationBox.setSelected(getBoolean("build.verbose"));
verboseUploadBox.setSelected(getBoolean("upload.verbose"));
deletePreviousBox. deletePreviousBox.
setSelected(getBoolean("export.delete_target_folder")); setSelected(getBoolean("export.delete_target_folder"));

View File

@ -36,7 +36,6 @@ import java.awt.event.*;
import java.beans.*; import java.beans.*;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import java.util.List;
import java.util.zip.*; import java.util.zip.*;
import javax.swing.*; import javax.swing.*;
@ -262,6 +261,7 @@ public class Sketch {
} }
} }
boolean renamingCode; boolean renamingCode;
/** /**
@ -315,7 +315,7 @@ public class Sketch {
renamingCode = true; renamingCode = true;
String prompt = (currentIndex == 0) ? String prompt = (currentIndex == 0) ?
"New name for sketch:" : "New name for file:"; "New name for sketch:" : "New name for file:";
String oldName = (current.isExtension("ino")) ? String oldName = (current.isExtension("pde")) ?
current.getPrettyName() : current.getFileName(); current.getPrettyName() : current.getFileName();
editor.status.edit(prompt, oldName); editor.status.edit(prompt, oldName);
} }
@ -495,7 +495,7 @@ public class Sketch {
} }
// if successful, set base properties for the 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(); String newMainFilePath = newMainFile.getAbsolutePath();
// having saved everything and renamed the folder and the main .pde, // having saved everything and renamed the folder and the main .pde,
@ -707,69 +707,16 @@ public class Sketch {
"need to re-save this sketch to another location."); "need to re-save this sketch to another location.");
// if the user cancels, give up on the save() // if the user cancels, give up on the save()
if (!saveAs()) return false; 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++) { for (int i = 0; i < codeCount; i++) {
if (code[i].isModified()) if (code[i].isModified()) code[i].save();
code[i].save();
} }
calcModified(); calcModified();
return true; 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. * Handles 'Save As' for a sketch.
* <P> * <P>
@ -913,7 +860,7 @@ public class Sketch {
} }
// save the main tab with its new name // 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); code[0].saveAs(newFile);
editor.handleOpenUnchecked(newFile.getPath(), editor.handleOpenUnchecked(newFile.getPath(),
@ -1314,7 +1261,7 @@ public class Sketch {
StringBuffer bigCode = new StringBuffer(); StringBuffer bigCode = new StringBuffer();
int bigCount = 0; int bigCount = 0;
for (SketchCode sc : code) { for (SketchCode sc : code) {
if (sc.isExtension("ino") || sc.isExtension("pde")) { if (sc.isExtension("pde")) {
sc.setPreprocOffset(bigCount); sc.setPreprocOffset(bigCount);
bigCode.append(sc.getProgram()); bigCode.append(sc.getProgram());
bigCode.append('\n'); bigCode.append('\n');
@ -1410,7 +1357,7 @@ public class Sketch {
} }
// sc.setPreprocName(filename); // 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 // The compiler and runner will need this to have a proper offset
sc.addPreprocOffset(headerOffset); sc.addPreprocOffset(headerOffset);
} }
@ -1439,7 +1386,7 @@ public class Sketch {
// SketchCode errorCode = null; // SketchCode errorCode = null;
// if (filename.equals(appletJavaFile)) { // if (filename.equals(appletJavaFile)) {
// for (SketchCode code : getCode()) { // for (SketchCode code : getCode()) {
// if (code.isExtension("ino")) { // if (code.isExtension("pde")) {
// if (line >= code.getPreprocOffset()) { // if (line >= code.getPreprocOffset()) {
// errorCode = code; // errorCode = code;
// } // }
@ -1560,7 +1507,6 @@ public class Sketch {
throws RunnerException { throws RunnerException {
// run the preprocessor // run the preprocessor
editor.status.progressUpdate(20);
String primaryClassName = preprocess(buildPath); String primaryClassName = preprocess(buildPath);
// compile the program. errors will happen as a RunnerException // compile the program. errors will happen as a RunnerException
@ -1574,15 +1520,15 @@ public class Sketch {
} }
protected boolean exportApplet(boolean usingProgrammer) throws Exception { protected boolean exportApplet(boolean verbose) throws Exception {
return exportApplet(tempBuildFolder.getAbsolutePath(), usingProgrammer); return exportApplet(tempBuildFolder.getAbsolutePath(), verbose);
} }
/** /**
* Handle export to applet. * Handle export to applet.
*/ */
public boolean exportApplet(String appletPath, boolean usingProgrammer) public boolean exportApplet(String appletPath, boolean verbose)
throws RunnerException, IOException, SerialException { throws RunnerException, IOException, SerialException {
// Make sure the user didn't hide the sketch folder // Make sure the user didn't hide the sketch folder
@ -1606,7 +1552,6 @@ public class Sketch {
appletFolder.mkdirs(); appletFolder.mkdirs();
// build the sketch // build the sketch
editor.status.progressNotice("Compiling sketch...");
String foundName = build(appletFolder.getPath(), false); String foundName = build(appletFolder.getPath(), false);
// (already reported) error during export, exit this function // (already reported) error during export, exit this function
if (foundName == null) return false; if (foundName == null) return false;
@ -1620,18 +1565,12 @@ public class Sketch {
// return false; // return false;
// } // }
editor.status.progressNotice("Uploading..."); upload(appletFolder.getPath(), foundName, verbose);
upload(appletFolder.getPath(), foundName, usingProgrammer);
editor.status.progressUpdate(100);
return true; return true;
} }
public void setCompilingProgress(int percent) {
editor.status.progressUpdate(percent);
}
protected void size(String buildPath, String suggestedClassName) protected void size(String buildPath, String suggestedClassName)
throws RunnerException { throws RunnerException {
long size = 0; 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 { throws RunnerException, SerialException {
Uploader uploader; Uploader uploader;
@ -1663,7 +1602,7 @@ public class Sketch {
uploader = new AvrdudeUploader(); uploader = new AvrdudeUploader();
boolean success = uploader.uploadUsingPreferences(buildPath, boolean success = uploader.uploadUsingPreferences(buildPath,
suggestedClassName, suggestedClassName,
usingProgrammer); verbose);
return success ? suggestedClassName : null; return success ? suggestedClassName : null;
} }
@ -1815,7 +1754,7 @@ public class Sketch {
* For Processing, this is true for .pde files. (Broken out for subclasses.) * For Processing, this is true for .pde files. (Broken out for subclasses.)
*/ */
public boolean hideExtension(String what) { 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. * Returns the default extension for this editor setup.
*/ */
public String getDefaultExtension() { 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. * Returns a String[] array of proper extensions.
*/ */
public String[] getExtensions() { 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 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 { throws RunnerException, SerialException {
this.verbose = verbose; this.verbose = verbose;
Map<String, String> boardPreferences = Base.getBoardPreferences(); 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 if (uploadUsing.indexOf(':') == -1) {
// bootloader and upload using the selected programmer. t = Base.getTarget(); // the current target (associated with the board)
if (usingProgrammer || boardPreferences.get("upload.protocol") == null) { } else {
String programmer = Preferences.get("programmer"); String targetName = uploadUsing.substring(0, uploadUsing.indexOf(':'));
Target target = Base.getTarget(); t = Base.targetsTable.get(targetName);
uploadUsing = uploadUsing.substring(uploadUsing.indexOf(':') + 1);
if (programmer.indexOf(":") != -1) {
target = Base.targetsTable.get(programmer.substring(0, programmer.indexOf(":")));
programmer = programmer.substring(programmer.indexOf(":") + 1);
} }
Collection params = getProgrammerCommands(target, programmer); Collection params = getProgrammerCommands(t, uploadUsing);
params.add("-Uflash:w:" + buildPath + File.separator + className + ".hex:i"); params.add("-Uflash:w:" + buildPath + File.separator + className + ".hex:i");
return avrdude(params); return avrdude(params);
} }
return uploadViaBootloader(buildPath, className);
} }
private boolean uploadViaBootloader(String buildPath, String className) private boolean uploadViaBootloader(String buildPath, String className)
@ -91,14 +96,8 @@ public class AvrdudeUploader extends Uploader {
return avrdude(commandDownloader); return avrdude(commandDownloader);
} }
public boolean burnBootloader() throws RunnerException { public boolean burnBootloader(String targetName, String programmer) throws RunnerException {
String programmer = Preferences.get("programmer"); return burnBootloader(getProgrammerCommands(Base.targetsTable.get(targetName), 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));
} }
private Collection getProgrammerCommands(Target target, String programmer) { private Collection getProgrammerCommands(Target target, String programmer) {

View File

@ -64,10 +64,10 @@ public abstract class Uploader implements MessageConsumer {
public Uploader() { 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; 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 { protected void flushSerialBuffer() throws RunnerException, SerialException {
// Cleanup the serial buffer // Cleanup the serial buffer

View File

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

View File

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

View File

@ -0,0 +1,1197 @@
/*
Serial Call and Response
Language: Wiring/Arduino
This program sends an ASCII A (byte of value 65) on startup
and repeats that until it gets some data in.
Then it waits for a byte in the serial port, and
sends three sensor values whenever it gets a byte in.
Thanks to Greg Shakar and Scott Fitzgerald for the improvements
The circuit:
* potentiometers attached to analog inputs 0 and 1
* pushbutton attached to digital I/O 2
Created 26 Sept. 2005
by Tom Igoe
Modified 4 Sep 2010
by Tom Igoe and Scott Fitzgerald
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/SerialCallResponse
*/
int firstSensor = 0; // first analog sensor
int secondSensor = 0; // second analog sensor
int thirdSensor = 0; // digital sensor
int inByte = 0; // incoming serial byte
void setup()
{
// start serial port at 9600 bps:
Serial.begin(9600);
pinMode(2, INPUT); // digital sensor is on digital pin 2
establishContact(); // send a byte to establish contact until receiver responds
}
void loop()
{
// if we get a valid byte, read analog ins:
if (Serial.available() > 0) {
// get incoming byte:
inByte = Serial.read();
// read first analog input, divide by 4 to make the range 0-255:
firstSensor = analogRead(A0)/4;
// delay 10ms to let the ADC recover:
delay(10);
// read second analog input, divide by 4 to make the range 0-255:
secondSensor = analogRead(1)/4;
// read switch, map it to 0 or 255L
thirdSensor = map(digitalRead(2), 0, 1, 0, 255);
// send sensor values:
Serial.write(firstSensor);
Serial.write(secondSensor);
Serial.write(thirdSensor);
}
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.print('A'); // send a capital A
delay(300);
}
}
/*
Processing sketch to run with this example:
// This example code is in the public domain.
import processing.serial.*;
int bgcolor; // Background color
int fgcolor; // Fill color
Serial myPort; // The serial port
int[] serialInArray = new int[3]; // Where we'll put what we receive
int serialCount = 0; // A count of how many bytes we receive
int xpos, ypos; // Starting position of the ball
boolean firstContact = false; // Whether we've heard from the microcontroller
void setup() {
size(256, 256); // Stage size
noStroke(); // No border on the next thing drawn
// Set the starting position of the ball (middle of the stage)
xpos = width/2;
ypos = height/2;
// Print a list of the serial ports, for debugging purposes:
println(Serial.list());
// I know that the first port in the serial list on my mac
// is always my FTDI adaptor, so I open Serial.list()[0].
// On Windows machines, this generally opens COM1.
// Open whatever port is the one you're using.
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
}
void draw() {
background(bgcolor);
fill(fgcolor);
// Draw the shape
ellipse(xpos, ypos, 20, 20);
}
void serialEvent(Serial myPort) {
// read a byte from the serial port:
int inByte = myPort.read();
// if this is the first byte received, and it's an A,
// clear the serial buffer and note that you've
// had first contact from the microcontroller.
// Otherwise, add the incoming byte to the array:
if (firstContact == false) {
if (inByte == 'A') {
myPort.clear(); // clear the serial port buffer
firstContact = true; // you've had first contact from the microcontroller
myPort.write('A'); // ask for more
}
}
else {
// Add the latest byte from the serial port to array:
serialInArray[serialCount] = inByte;
serialCount++;
// If we have 3 bytes:
if (serialCount > 2 ) {
xpos = serialInArray[0];
ypos = serialInArray[1];
fgcolor = serialInArray[2];
// print the values (for debugging purposes only):
println(xpos + "\t" + ypos + "\t" + fgcolor);
// Send a capital A to request new sensor readings:
myPort.write('A');
// Reset serialCount:
serialCount = 0;
}
}
}
*/
/*
Max/MSP version 5 patch to run with this example:
{
"boxes" : [ {
"box" : {
"maxclass" : "message",
"text" : "65",
"patching_rect" : [ 339.0, 466.0, 32.5, 18.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "" ],
"id" : "obj-9",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "sel 1",
"patching_rect" : [ 339.0, 437.0, 36.0, 20.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "bang", "" ],
"id" : "obj-6",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "Serial Call-Response \n\nSends a byte out the serial port, and reads 3 bytes in. Sets foregound color, xpos, and ypos of a circle using the values returned from the serial port. \n\nNote: This patch assumes that the device on the other end of the serial port is going to send a single byte of value 65 (ASCII A) on startup. The sketch waits for that byte, then sends an ASCII A whenever it wants more data. \n\ncreated 14 Apr 2009\nby Scott Fitzgerald and Tom Igoe",
"linecount" : 11,
"patching_rect" : [ 404.0, 52.0, 464.0, 158.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-5",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "trigger (or [t]) forces right-left conventions. All the drawing and processing will happen before Max requests new values. When this trigger fires, it sends an ASCII A to ask Arduino for new values.",
"linecount" : 3,
"patching_rect" : [ 239.0, 505.0, 425.0, 48.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-65",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "reinitializes the gates when turned on and off",
"linecount" : 2,
"patching_rect" : [ 170.0, 370.0, 135.0, 34.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-64",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "checks for the ascii value of \"A\" to begin cominucation. After initial communication is made, this block shuts down.",
"linecount" : 3,
"patching_rect" : [ 460.0, 355.0, 233.0, 48.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-63",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "p \"draw the circle\"",
"patching_rect" : [ 217.0, 645.0, 269.0, 19.0 ],
"numoutlets" : 1,
"fontsize" : 10.0,
"outlettype" : [ "" ],
"id" : "obj-62",
"fontname" : "Verdana",
"numinlets" : 3,
"patcher" : {
"fileversion" : 1,
"rect" : [ 54.0, 94.0, 640.0, 480.0 ],
"bglocked" : 0,
"defrect" : [ 54.0, 94.0, 640.0, 480.0 ],
"openrect" : [ 0.0, 0.0, 0.0, 0.0 ],
"openinpresentation" : 0,
"default_fontsize" : 10.0,
"default_fontface" : 0,
"default_fontname" : "Verdana",
"gridonopen" : 0,
"gridsize" : [ 25.0, 25.0 ],
"gridsnaponopen" : 0,
"toolbarvisible" : 1,
"boxanimatetime" : 200,
"imprint" : 0,
"boxes" : [ {
"box" : {
"maxclass" : "message",
"text" : "frgb 255 255 255",
"patching_rect" : [ 375.0, 150.0, 98.0, 18.0 ],
"numoutlets" : 1,
"fontsize" : 11.595187,
"outlettype" : [ "" ],
"id" : "obj-47",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "frgb 0 0 0",
"patching_rect" : [ 275.0, 125.0, 59.0, 18.0 ],
"numoutlets" : 1,
"fontsize" : 11.595187,
"outlettype" : [ "" ],
"id" : "obj-46",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "sel 255 0",
"patching_rect" : [ 300.0, 100.0, 66.0, 21.0 ],
"numoutlets" : 3,
"fontsize" : 12.0,
"outlettype" : [ "bang", "bang", "" ],
"id" : "obj-45",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "pack 0 0 0 0",
"patching_rect" : [ 50.0, 125.0, 180.0, 21.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "" ],
"id" : "obj-43",
"fontname" : "Verdana",
"numinlets" : 4
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "+ 10",
"patching_rect" : [ 200.0, 100.0, 40.0, 21.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "int" ],
"id" : "obj-42",
"fontname" : "Verdana",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "+ 10",
"patching_rect" : [ 75.0, 100.0, 40.0, 21.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "int" ],
"id" : "obj-41",
"fontname" : "Verdana",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "clear, paintoval $1 $2 $3 $4",
"patching_rect" : [ 50.0, 150.0, 152.0, 18.0 ],
"numoutlets" : 1,
"fontsize" : 11.595187,
"outlettype" : [ "" ],
"id" : "obj-40",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "inlet",
"patching_rect" : [ 57.5, 40.0, 25.0, 25.0 ],
"numoutlets" : 1,
"outlettype" : [ "int" ],
"id" : "obj-58",
"numinlets" : 0,
"comment" : ""
}
}
, {
"box" : {
"maxclass" : "inlet",
"patching_rect" : [ 120.0, 40.0, 25.0, 25.0 ],
"numoutlets" : 1,
"outlettype" : [ "int" ],
"id" : "obj-59",
"numinlets" : 0,
"comment" : ""
}
}
, {
"box" : {
"maxclass" : "inlet",
"patching_rect" : [ 300.0, 40.0, 25.0, 25.0 ],
"numoutlets" : 1,
"outlettype" : [ "int" ],
"id" : "obj-60",
"numinlets" : 0,
"comment" : ""
}
}
, {
"box" : {
"maxclass" : "outlet",
"patching_rect" : [ 228.333344, 228.0, 25.0, 25.0 ],
"numoutlets" : 0,
"id" : "obj-61",
"numinlets" : 1,
"comment" : ""
}
}
],
"lines" : [ {
"patchline" : {
"source" : [ "obj-47", 0 ],
"destination" : [ "obj-61", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-46", 0 ],
"destination" : [ "obj-61", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-40", 0 ],
"destination" : [ "obj-61", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-60", 0 ],
"destination" : [ "obj-45", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-59", 0 ],
"destination" : [ "obj-42", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-59", 0 ],
"destination" : [ "obj-43", 1 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-58", 0 ],
"destination" : [ "obj-41", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-58", 0 ],
"destination" : [ "obj-43", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-42", 0 ],
"destination" : [ "obj-43", 3 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-41", 0 ],
"destination" : [ "obj-43", 2 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-45", 1 ],
"destination" : [ "obj-47", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-45", 0 ],
"destination" : [ "obj-46", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-43", 0 ],
"destination" : [ "obj-40", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
]
}
,
"saved_object_attributes" : {
"fontface" : 0,
"fontsize" : 10.0,
"default_fontface" : 0,
"default_fontname" : "Verdana",
"default_fontsize" : 10.0,
"fontname" : "Verdana",
"globalpatchername" : ""
}
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "0",
"patching_rect" : [ 310.0, 378.0, 32.5, 20.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "int" ],
"id" : "obj-57",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "!- 1",
"patching_rect" : [ 385.0, 436.0, 32.5, 20.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "int" ],
"id" : "obj-55",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "gate 1 1",
"patching_rect" : [ 385.0, 355.0, 54.0, 20.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "" ],
"id" : "obj-54",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "toggle",
"patching_rect" : [ 385.0, 405.0, 20.0, 20.0 ],
"numoutlets" : 1,
"outlettype" : [ "int" ],
"id" : "obj-53",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "gate 1 0",
"patching_rect" : [ 194.0, 455.0, 54.0, 20.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "" ],
"id" : "obj-50",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "sel 65",
"patching_rect" : [ 385.0, 380.0, 43.0, 20.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "bang", "" ],
"id" : "obj-48",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "lcd",
"patching_rect" : [ 217.0, 695.0, 256.0, 256.0 ],
"numoutlets" : 4,
"outlettype" : [ "list", "list", "int", "" ],
"id" : "obj-39",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "t 65 l",
"patching_rect" : [ 194.0, 504.0, 42.0, 21.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "int", "" ],
"id" : "obj-35",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "val3",
"patching_rect" : [ 535.0, 604.0, 37.0, 21.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-1",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "number",
"patching_rect" : [ 467.0, 604.0, 56.0, 21.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "int", "bang" ],
"id" : "obj-3",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "val2",
"patching_rect" : [ 410.0, 605.0, 37.0, 21.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-18",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "val1",
"patching_rect" : [ 282.0, 605.0, 37.0, 21.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-20",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "number",
"patching_rect" : [ 342.0, 605.0, 56.0, 21.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "int", "bang" ],
"id" : "obj-22",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "number",
"patching_rect" : [ 217.0, 605.0, 55.0, 21.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "int", "bang" ],
"id" : "obj-23",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "unpack 0 0 0",
"patching_rect" : [ 217.0, 570.0, 269.0, 21.0 ],
"numoutlets" : 3,
"fontsize" : 12.0,
"outlettype" : [ "int", "int", "int" ],
"id" : "obj-29",
"fontname" : "Verdana",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "zl group 3",
"patching_rect" : [ 194.0, 480.0, 71.0, 21.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "", "" ],
"id" : "obj-31",
"fontname" : "Verdana",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "select 0 1",
"patching_rect" : [ 312.0, 200.0, 62.0, 20.0 ],
"numoutlets" : 3,
"fontsize" : 12.0,
"outlettype" : [ "bang", "bang", "" ],
"id" : "obj-30",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "click here to close the serial port",
"patching_rect" : [ 360.0, 291.0, 206.0, 20.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-26",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "click here to open the serial port",
"patching_rect" : [ 385.0, 265.0, 206.0, 20.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-27",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "close",
"patching_rect" : [ 312.0, 291.0, 39.0, 18.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "" ],
"id" : "obj-21",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "port a",
"patching_rect" : [ 334.0, 265.0, 41.0, 18.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "" ],
"id" : "obj-19",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "Click here to get a list of serial ports",
"patching_rect" : [ 405.0, 239.0, 207.0, 20.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-2",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "toggle",
"patching_rect" : [ 229.0, 155.0, 22.0, 22.0 ],
"numoutlets" : 1,
"outlettype" : [ "int" ],
"id" : "obj-11",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "qmetro 10",
"patching_rect" : [ 229.0, 200.0, 65.0, 20.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "bang" ],
"id" : "obj-12",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "print",
"patching_rect" : [ 354.0, 239.0, 36.0, 18.0 ],
"numoutlets" : 1,
"fontsize" : 12.0,
"outlettype" : [ "" ],
"id" : "obj-13",
"fontname" : "Arial",
"numinlets" : 2
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "serial a 9600",
"patching_rect" : [ 229.0, 315.0, 84.0, 20.0 ],
"numoutlets" : 2,
"fontsize" : 12.0,
"outlettype" : [ "int", "" ],
"id" : "obj-14",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "Read serial input buffer every 10 milliseconds",
"linecount" : 2,
"patching_rect" : [ 13.0, 192.0, 210.0, 34.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-15",
"fontname" : "Arial",
"numinlets" : 1
}
}
, {
"box" : {
"maxclass" : "comment",
"text" : "Click to start",
"patching_rect" : [ 256.0, 163.0, 117.0, 20.0 ],
"numoutlets" : 0,
"fontsize" : 12.0,
"id" : "obj-17",
"fontname" : "Arial",
"numinlets" : 1
}
}
],
"lines" : [ {
"patchline" : {
"source" : [ "obj-12", 0 ],
"destination" : [ "obj-14", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-11", 0 ],
"destination" : [ "obj-12", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-13", 0 ],
"destination" : [ "obj-14", 0 ],
"hidden" : 0,
"midpoints" : [ 363.5, 260.5, 238.5, 260.5 ]
}
}
, {
"patchline" : {
"source" : [ "obj-19", 0 ],
"destination" : [ "obj-14", 0 ],
"hidden" : 0,
"midpoints" : [ 343.5, 288.5, 238.5, 288.5 ]
}
}
, {
"patchline" : {
"source" : [ "obj-21", 0 ],
"destination" : [ "obj-14", 0 ],
"hidden" : 0,
"midpoints" : [ 321.5, 311.5, 238.5, 311.5 ]
}
}
, {
"patchline" : {
"source" : [ "obj-30", 0 ],
"destination" : [ "obj-21", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-30", 1 ],
"destination" : [ "obj-19", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-11", 0 ],
"destination" : [ "obj-30", 0 ],
"hidden" : 0,
"midpoints" : [ 238.5, 191.0, 321.5, 191.0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-29", 2 ],
"destination" : [ "obj-3", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-29", 0 ],
"destination" : [ "obj-23", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-29", 1 ],
"destination" : [ "obj-22", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-14", 0 ],
"destination" : [ "obj-50", 1 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-50", 0 ],
"destination" : [ "obj-31", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-48", 0 ],
"destination" : [ "obj-53", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-53", 0 ],
"destination" : [ "obj-50", 0 ],
"hidden" : 0,
"midpoints" : [ 394.5, 426.0, 203.5, 426.0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-14", 0 ],
"destination" : [ "obj-54", 1 ],
"hidden" : 0,
"midpoints" : [ 238.5, 342.0, 429.5, 342.0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-54", 0 ],
"destination" : [ "obj-48", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-62", 0 ],
"destination" : [ "obj-39", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-3", 0 ],
"destination" : [ "obj-62", 2 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-22", 0 ],
"destination" : [ "obj-62", 1 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-23", 0 ],
"destination" : [ "obj-62", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-53", 0 ],
"destination" : [ "obj-55", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-55", 0 ],
"destination" : [ "obj-54", 0 ],
"hidden" : 0,
"midpoints" : [ 394.5, 459.0, 453.0, 459.0, 453.0, 351.0, 394.5, 351.0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-30", 0 ],
"destination" : [ "obj-57", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-57", 0 ],
"destination" : [ "obj-53", 0 ],
"hidden" : 0,
"midpoints" : [ 319.5, 401.0, 394.5, 401.0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-35", 0 ],
"destination" : [ "obj-14", 0 ],
"hidden" : 0,
"midpoints" : [ 203.5, 542.0, 167.0, 542.0, 167.0, 300.0, 238.5, 300.0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-35", 1 ],
"destination" : [ "obj-29", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-31", 0 ],
"destination" : [ "obj-35", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-6", 0 ],
"destination" : [ "obj-9", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
, {
"patchline" : {
"source" : [ "obj-53", 0 ],
"destination" : [ "obj-6", 0 ],
"hidden" : 0,
"midpoints" : [ 394.5, 431.5, 348.5, 431.5 ]
}
}
, {
"patchline" : {
"source" : [ "obj-9", 0 ],
"destination" : [ "obj-14", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}
}
]
}
*/

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 board = uno
target = arduino target = arduino
programmer = arduino:avrispmkii
upload.using = bootloader upload.using = bootloader
serial.port=COM1 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 # GUI - STATUS
status.notice.fgcolor = #002325 status.notice.fgcolor = #000000
status.notice.bgcolor = #17A1A5 status.notice.bgcolor = #54919e
status.error.fgcolor = #FFFFFF status.error.fgcolor = #ffffff
status.error.bgcolor = #E34C00 status.error.bgcolor = #662000
status.edit.fgcolor = #000000 status.edit.fgcolor = #000000
status.edit.bgcolor = #F1B500 status.edit.bgcolor = #cc9900
status.font = SansSerif,plain,12 status.font = SansSerif,plain,12
# GUI - TABS # GUI - TABS
# settings for the tabs at the top # settings for the tabs at the top
# (tab images are stored in the lib/theme folder) # (tab images are stored in the lib/theme folder)
header.bgcolor = #17A1A5 header.bgcolor = #216886
header.text.selected.color = #005B5B header.text.selected.color = #1a1a00
header.text.unselected.color = #007e82 header.text.unselected.color = #ffffff
header.text.font = SansSerif,plain,12 header.text.font = SansSerif,plain,12
# GUI - CONSOLE # GUI - CONSOLE
console.font = Monospaced,plain,11 console.font = Monospaced,plain,11
console.font.macosx = Monaco,plain,10 console.font.macosx = Monaco,plain,10
console.color = #000000 console.color = #000000
console.output.color = #eeeeee console.output.color = #cccccc
console.error.color = #E34C00 console.error.color = #ff3000
# GUI - BUTTONS # GUI - BUTTONS
buttons.bgcolor = #006468 buttons.bgcolor = #044f6f
buttons.status.font = SansSerif,plain,12 buttons.status.font = SansSerif,plain,12
buttons.status.color = #ffffff buttons.status.color = #ffffff
# GUI - LINESTATUS # GUI - LINESTATUS
linestatus.color = #ffffff linestatus.color = #ffffff
linestatus.bgcolor = #006468 linestatus.bgcolor = #044f6f
# EDITOR - DETAILS # EDITOR - DETAILS
@ -83,9 +83,6 @@ editor.literal1.style = #006699,plain
# p5 built in variables: e.g. mouseX, width, pixels # p5 built in variables: e.g. mouseX, width, pixels
editor.literal2.style = #006699,plain editor.literal2.style = #006699,plain
# http://arduino.cc/
editor.url.style = #0000ff,underlined
# e.g. + - = / # e.g. + - = /
editor.operator.style = #000000,plain 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.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F uno.bootloader.lock_bits=0x2F
uno.build.mcu=atmega328p uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L uno.build.f_cpu=16000000L
uno.build.core=arduino uno.build.core=arduino

View File

@ -95,7 +95,8 @@ LICENSE:
#include "command.h" #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 #define ENABLE_MONITOR
static void RunMonitor(void); static void RunMonitor(void);
#endif #endif

View File

@ -1,513 +1,141 @@
:020000023000CC :020000023000CC
:10E000000D94F6F20D941FF30D941FF30D941FF36E :10E000000D9472F00D9493F00D9493F00D9493F0A1
:10E010000D941FF30D941FF30D941FF30D941FF334 :10E010000D9493F00D9493F00D9493F00D9493F070
:10E020000D941FF30D941FF30D941FF30D941FF324 :10E020000D9493F00D9493F00D9493F00D9493F060
:10E030000D941FF30D941FF30D941FF30D941FF314 :10E030000D9493F00D9493F00D9493F00D9493F050
:10E040000D941FF30D941FF30D941FF30D941FF304 :10E040000D9493F00D9493F00D9493F00D9493F040
:10E050000D941FF30D941FF30D941FF30D941FF3F4 :10E050000D9493F00D9493F00D9493F00D9493F030
:10E060000D941FF30D941FF30D941FF30D941FF3E4 :10E060000D9493F00D9493F00D9493F00D9493F020
:10E070000D941FF30D941FF30D941FF30D941FF3D4 :10E070000D9493F00D9493F00D9493F00D9493F010
:10E080000D941FF30D941FF30D941FF30D941FF3C4 :10E080000D9493F00D9493F00D9493F00D9493F000
:10E090000D941FF30D941FF30D941FF30D941FF3B4 :10E090000D9493F00D9493F00D9493F00D9493F0F0
:10E0A0000D941FF30D941FF30D941FF30D941FF3A4 :10E0A0000D9493F00D9493F00D9493F00D9493F0E0
:10E0B0000D941FF30D941FF30D941FF30D941FF394 :10E0B0000D9493F00D9493F00D9493F00D9493F0D0
:10E0C0000D941FF30D941FF30D941FF30D941FF384 :10E0C0000D9493F00D9493F00D9493F00D9493F0C0
:10E0D0000D941FF30D941FF30D941FF30D941FF374 :10E0D0000D9493F00D9493F00D9493F00D9493F0B0
:10E0E0000D941FF341546D65676132353630004140 :10E0E0000D9493F011241FBECFEFD1E2DEBFCDBF60
:10E0F000726475696E6F206578706C6F72657220DE :10E0F00001E00CBF12E0A0E0B2E0E0EAF8EE03E0DD
:10E1000073746B3530305632206279204D4C530099 :10E100000BBF02C007900D92A030B107D9F70F9452
:10E11000426F6F746C6F616465723E004875683F52 :10E11000A3F00D944EF401E20EBF0FEF0DBF1124DA
:10E1200000436F6D70696C6564206F6E20203D2028 :10E120001FBE0D94A3F00D9400F020E030E040ED10
:10E1300000435055205479706520202020203D2038 :10E1300057E005C0FA013197F1F72F5F3F4F2817DD
:10E14000005F5F4156525F415243485F5F203D2070 :10E140003907C0F308952F923F924F925F926F92DA
:10E1500000415652204C69624320566572203D2092 :10E150007F928F929F92AF92BF92CF92DF92EF9277
:10E16000004743432056657273696F6E20203D203F :10E16000FF920F931F93DF93CF93CDB7DEB7C852C3
:10E1700000435055207369676E61747572653D2068 :10E17000D1400FB6F894DEBF0FBECDBF279A2F9ABD
:10E18000004C6F77206675736520202020203D208D :10E180008091C00082608093C00080E18093C400D1
:10E1900000486967682066757365202020203D204F :10E1900088E18093C1000000EE24FF248701E4E0C1
:10E1A00000457874206675736520202020203D206E :10E1A000AE2EB12CCC24DD2424C0C5010197F1F79B
:10E1B000004C6F636B2066757365202020203D2026 :10E1B0000894E11CF11C011D111D21E2E2162EE460
:10E1C00000536570202039203230313000312E3636 :10E1C000F20620E0020720E0120718F071E0C72EE7
:10E1D0002E3700342E332E33005623202020414486 :10E1D000D12CC801B70128E53BE140E050E00F94A5
:10E1E00044522020206F7020636F6465202020201F :10E1E0002CF4611571058105910519F485B18058EC
:10E1F00020696E737472756374696F6E20616464F4 :10E1F00085B98091C00087FD03C0C114D104A9F284
:10E2000072202020496E74657272757074006E6F92 :10E20000A6014F5F5F4FC25EDE4F59834883CE51F8
:10E2100020766563746F7200726A6D702020006AE8 :10E21000D140C25EDE4F68817981CE51D1406130FC
:10E220006D7020005768617420706F72743A0050EE :10E22000710509F0FCC222243324A0E0C05EDE4F59
:10E230006F7274206E6F7420737570706F72746576 :10E230001882C052D1408824992454014424552482
:10E2400064004D7573742062652061206C65747480 :10E240003201ABBEF40187919691C95DDE4F99838F
:10E2500065720020005772697474696E67204545C5 :10E250008883C752D140DFC2C25EDE4FE881F981B8
:10E260000052656164696E6720454500656570729E :10E26000CE51D140319709F53091C600C25EDE4FE4
:10E270006F6D206572726F7220636F756E743D00F2 :10E2700019821882CE51D14022C04F5F5F4F6F4F3D
:10E28000504F525400303D5A65726F206164647281 :10E280007F4F4130F2E15F07FAE76F07F0E07F0769
:10E290006573732063747273003F3D435055207360 :10E2900080F0C95DDE4F28813981C752D1402F5FA0
:10E2A0007461747300403D454550524F4D20746574 :10E2A0003F4F19F0EE27FF27099440E050E060E06F
:10E2B000737400423D426C696E6B204C45440045CE :10E2B00070E08091C00087FFE0CF3091C6009330BE
:10E2C0003D44756D7020454550524F4D00463D44CC :10E2C00061F1943028F4913089F0923008F508C05B
:10E2D000756D7020464C41534800483D48656C7050 :10E2D000953091F1953040F1963009F043C03EC041
:10E2E000004C3D4C69737420492F4F20506F72745D :10E2E0003B3109F0B9CF91E0ABE1B6CF313041F02D
:10E2F0007300513D517569742026206A756D702038 :10E2F000C05EDE4F5881C052D140351709F0AAC226
:10E30000746F20757365722070676D00523D44759F :10E30000A327C05EDE4F3883C052D14092E0A4CF35
:10E310006D702052414D00563D73686F7720696ED5 :10E31000132F00E0A32793E09FCF832F90E0082BDB
:10E320007465727275707420566563746F727300D1 :10E32000192BA32794E098CF3E3009F093C2A3277E
:10E33000593D506F727420626C696E6B002A0052F6 :10E3300095E02224332490CFE1E0F0E0EC0FFD1FC4
:10E340004553455400494E543000494E543100491C :10E34000E20DF31D30830894211C311CA3272016F5
:10E350004E543200494E543300494E543400494E15 :10E35000310609F081CF810196E07ECF3A1709F0AE
:10E36000543500494E543600494E54370050434905 :10E3600079C203C0973009F077CF8981833109F4EE
:10E370004E5430005043494E5431005043494E549E :10E37000F4C08431C0F4863009F4C2C0873048F458
:10E3800032005744540054494D45523020434F4DBC :10E38000823069F1833009F45BC0813009F0C4C187
:10E3900050410054494D45523020434F4D504200AA :10E3900041C0813109F465C0823108F0ACC08031E0
:10E3A00054494D455230204F56460054494D455230 :10E3A00009F0BAC11CC0883109F474C0893150F435
:10E3B0003120434150540054494D45523120434F80 :10E3B000853109F4D2C0853108F443C1863109F0B2
:10E3C0004D50410054494D45523120434F4D50422C :10E3C000ABC13FC18A3109F45CC08A3108F482C014
:10E3D0000054494D45523120434F4D50430054495C :10E3D0008B3109F44BC08D3109F09EC102C090E031
:10E3E0004D455231204F56460054494D455232203A :10E3E00041C08D81803311F090E00AC08F81882375
:10E3F000434F4D50410054494D45523220434F4DFB :10E3F00011F49EE105C0813011F091E001C098E96F
:10E4000050420054494D455232204F56460054491F :10E400001A821B828D818C831D829E831F8247E02E
:10E410004D45523320434150540054494D455233E9 :10E4100050E086C11A8288E08B8381E48C8386E594
:10E4200020434F4D50410054494D45523320434FF6 :10E420008D8382E58E8389E48F8383E5888780E509
:10E430004D50420054494D45523320434F4D5043B7 :10E4300089878FE58A8782E38B874BE050E070C144
:10E440000054494D455233204F56460054494D45DE :10E440008A81813941F0823941F0803911F48FE0BD
:10E45000523420434150540054494D4552342043D6 :10E4500005C080E003C082E001C08AE01A828B839D
:10E460004F4D50410054494D45523420434F4D507B :10E4600047C091E01A8242E050E05BC18D81882371
:10E47000420054494D45523420434F4D50430054BF :10E4700011F48EE129C0813011F081E025C088E9D6
:10E48000494D455234204F56460054494D4552356A :10E4800023C01A82E1E0F0E069E060935700E49174
:10E4900020434150540054494D45523520434F4D7F :10E49000EB831CC08B81803589F48C81883039F402
:10E4A00050410054494D45523520434F4D50420094 :10E4A00029E0E2E0F0E02093570084910DC029E0DC
:10E4B00054494D45523520434F4D50430054494D2A :10E4B000E0E0F0E020935700849106C0E3E0F0E054
:10E4C000455235204F564600555341525430205244 :10E4C00039E03093570084911A828B831C8244E098
:10E4D000580055534152543020554452450055532D :10E4D00050E026C18D81836C49E0E1E0F0E0082E38
:10E4E0004152543020545800555341525431205217 :10E4E00040935700E89507B600FCFDCF1A821B82C7
:10E4F000580055534152543120554452450055530C :10E4F00043E050E015C11A824424552432010EC174
:10E5000041525431205458005553415254322052F4 :10E500008A8190E0A0E0B0E0B82EAA249924882463
:10E5100058005553415254322055445245005553EA :10E510008B8190E0A0E0B0E0DC0199278827882A71
:10E5200041525432205458005553415254332052D2 :10E52000992AAA2ABB2A8D8190E0A0E0B0E0882A2F
:10E5300058005553415254332055445245005553C9 :10E53000992AAA2ABB2A8C8190E0A0E0B0E0BA2FE9
:10E5400041525433205458005350492053544300EF :10E54000A92F982F8827882A992AAA2ABB2A880CBB
:10E5500041444300414E414C4F4720434F4D5000F2 :10E55000991CAA1CBB1C1A82E1C09A813B818331A1
:10E560004545205245414459005457490053504DA8 :10E5600019F0B501A40169C050E0451650EC5506FC
:10E57000205245414459002A003FE345E34AE34F16 :10E5700053E0650650E0750690F463E0F2016092A6
:10E58000E354E359E35EE363E368E36DE374E37B41 :10E580005B0060935700E89507B600FCFDCF40E0C4
:10E59000E382E3E9E3F6E303E4ABE3B7E3C4E3D107 :10E5900051E060E070E0440E551E661E771ECE5DB1
:10E5A000E3DEE386E393E3A0E348E5C8E4D2E4DEF8 :10E5A000DE4F9883C252D140CF5DDE4F1882C152F8
:10E5B000E454E550E560E50EE41AE427E434E44170 :10E5B000D140032F10E0CF5DDE4F68817981C152D9
:10E5C000E4E8E4F2E4FEE469E56DE54CE458E46572 :10E5C000D140062B172BB501A401DE011B968C91BF
:10E5D000E472E47FE48AE496E4A3E4B0E4BDE408F2 :10E5D00011962C9111971296CC5DDE4F2883C45270
:10E5E000E512E51EE528E532E53EE50011241FBEF3 :10E5E000D140CD5DDE4F1882C352D14090E0CD5D69
:10E5F000CFEFD1E2DEBFCDBF01E00CBF12E0A0E063 :10E5F000DE4FE881F981C352D1408E2B9F2B21E061
:10E60000B2E0EAEDFFEF03E00BBF02C007900D920E :10E600000C01FA0160935B0020935700E8951124F8
:10E61000A030B107D9F712E0A0E0B2E001C01D922E :10E610004E5F5F4F6F4F7F4F02501040C1F635E0A5
:10E62000AC30B107E1F70F94FBF40D94EBFF01E27E :10E62000F401A0925B0030935700E89507B600FC18
:10E630000EBF0FEF0DBF11241FBE0D94FBF40D9400 :10E63000FDCF81E180935700E8951A824A015B0182
:10E6400000F020E030E040ED57E005C0FA013197DE :10E640006DC09A81CA5DDE4F9883C652D140CB5DC2
:10E65000F1F72F5F3F4F28173907C0F308959C014A :10E65000DE4F1882C552D1408B81C82EDD24CB5DA0
:10E66000442737FD4095542FDA01C901860F911DCB :10E66000DE4FA881B981C552D140CA2ADB2A1A825D
:10E67000A11DB11DABBFFC018791882369F0809378 :10E6700089818431E9F4A60123E0E22EF12CEC0E2D
:10E68000C6008091C00086FFFCCF8091C0008064EE :10E68000FD1EABBEF40187919691F70180839183C3
:10E690008093C0006F5FE8CF08958DE08093C6003F :10E6900022E030E0E20EF31E62E070E080E090E005
:10E6A0008091C00086FFFCCF8091C0008064809381 :10E6A000860E971EA81EB91E4250504051F72EC02C
:10E6B000C0008AE08093C6008091C00086FFFCCF36 :10E6B000B501A40193E0E92EF12CEC0EFD1E0894A7
:10E6C0008091C00080648093C00008950F942FF360 :10E6C000C108D108860120E030E00894C11CD11CAB
:10E6D0000F944DF30895FC019081992359F0909384 :10E6D0000F5F1F4F2F4F3F4F080D191D2A1D3B1D68
:10E6E000C6008091C00086FFFCCF8091C00080648E :10E6E00041BDBB27A72F962F852F82BD4F5F5F4F60
:10E6F0008093C0003196992379F70895282F982F99 :10E6F0006F4F7F4FF89A80B5D7018D937D014017FA
:10E7000092959F70892F805D8A3308F0895F80938E :10E7000051076207730761F74A015B01A6014D5F7C
:10E71000C6008091C00086FFFCCF8091C00080645D :10E710005F4FF701108204C0F0ECFA8342E050E052
:10E720008093C000822F8F70982F905D9A3308F0ED :10E7200090E02BE12093C6008091C00086FFFCCFD3
:10E73000995F9093C6008091C00086FFFCCF8091C6 :10E730008091C00080648093C000C05EDE4F38814D
:10E74000C00080648093C00008959C01FB01853661 :10E74000C052D1403093C6008091C00086FFFCCFFC
:10E7500091051CF46330710594F0C90164E670E022 :10E750008091C00080648093C000652F5093C600F4
:10E760000F948CFF605D7F4F6093C6008091C00066 :10E760008091C00086FFFCCF8091C00080648093C0
:10E7700086FFFCCF8091C00080648093C0002B3066 :10E77000C000342F4093C6008091C00086FFFCCFBC
:10E78000310514F43297B4F0C90164E670E00F94D7 :10E780008091C00080648093C0008EE08093C600BA
:10E790008CFF6AE070E00F948CFF605D7F4F6093A8 :10E790008091C00086FFFCCF8091C0008064809390
:10E7A000C6008091C00086FFFCCF8091C0008064CD :10E7A000C000A5E1C05EDE4F7881C052D140A727EE
:10E7B0008093C000C9016AE070E00F948CFFC0969E :10E7B000A327A627FE01319610C030813093C600F2
:10E7C0008093C6008091C00086FFFCCF8091C0007E :10E7C0008091C00086FFFCCF31968091C0008064AC
:10E7D00080648093C0000895282F277020642093C0 :10E7D0008093C000A327415050404115510569F76F
:10E7E0007C0020917B0086958695869590E08170CF :10E7E000A093C6008091C00086FFFCCF8091C0003E
:10E7F000907033E0880F991F3A95E1F7277F282B17 :10E7F00080648093C00085B1805885B9992379F4ED
:10E8000020937B0080917A00806480937A008091CD :10E80000C05EDE4F8881C052D1408F5FC05EDE4F58
:10E810007A0086FDFCCF2091780040917900942FFA :10E810008883C052D14090E000E010E01DCD2798E1
:10E8200080E030E0282B392BC90108951F93182F61 :10E820002F9880E090E020ED37E0F9013197F1F783
:10E8300080E892EE60E00F942FF31093C600809171 :10E83000019684369105C9F700008091C0008D7F54
:10E84000C00086FFFCCF8091C00080648093C00030 :10E840008093C00081E180935700E895EE27FF2771
:10E850000F944DF31F9108952F923F924F925F9224 :10E850000994FFCF90E000CDA1E21A2EAA1BBB1BAA
:10E860006F927F928F929F92AF92BF92CF92DF92E0 :10E86000FD010DC0AA1FBB1FEE1FFF1FA217B3079C
:10E87000EF92FF920F931F93DF93CF93CDB7DEB745 :10E87000E407F50720F0A21BB30BE40BF50B661FB2
:10E8800062970FB6F894DEBF0FBECDBF382E622E52 :10E88000771F881F991F1A9469F760957095809576
:10E89000CA01DB015C016D01772460E2262E2E01A6 :10E8900090959B01AC01BD01CF010895F894FFCF85
: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
:040000033000E000E9 :040000033000E000E9
:00000001FF :00000001FF

View File

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

View File

@ -23,213 +23,173 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include "Arduino.h" #include "wiring.h"
#include "Print.h" #include "Print.h"
// Public Methods ////////////////////////////////////////////////////////////// // Public Methods //////////////////////////////////////////////////////////////
/* default implementation: may be overridden */ /* 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 (*str)
while (size--) { write(*str++);
n += write(*buffer++); }
/* 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; write(str);
size_t n = 0;
while (1) {
unsigned char c = pgm_read_byte(p++);
if (c == 0) break;
n += write(c);
}
return n;
} }
size_t Print::print(const String &s) void Print::print(char c, int base)
{ {
size_t n = 0; print((long) c, base);
for (uint16_t i = 0; i < s.length(); i++) {
n += write(s[i]);
}
return n;
} }
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) void Print::print(long 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)
{ {
if (base == 0) { if (base == 0) {
return write(n); write(n);
} else if (base == 10) { } else if (base == 10) {
if (n < 0) { if (n < 0) {
int t = print('-'); print('-');
n = -n; n = -n;
return printNumber(n, 10) + t;
} }
return printNumber(n, 10); printNumber(n, 10);
} else { } 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); if (base == 0) write(n);
else return printNumber(n, base); 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); print('\r');
n += println(); print('\n');
return 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'); print(c);
n += print('\n'); println();
return n;
} }
size_t Print::println(const String &s) void Print::println(char c, int base)
{ {
size_t n = print(s); print(c, base);
n += println(); println();
return n;
} }
size_t Print::println(const char c[]) void Print::println(unsigned char b, int base)
{ {
size_t n = print(c); print(b, base);
n += println(); println();
return n;
} }
size_t Print::println(char c) void Print::println(int n, int base)
{ {
size_t n = print(c); print(n, base);
n += println(); println();
return n;
} }
size_t Print::println(unsigned char b, int base) void Print::println(unsigned int n, int base)
{ {
size_t n = print(b, base); print(n, base);
n += println(); println();
return n;
} }
size_t Print::println(int num, int base) void Print::println(long n, int base)
{ {
size_t n = print(num, base); print(n, base);
n += println(); println();
return n;
} }
size_t Print::println(unsigned int num, int base) void Print::println(unsigned long n, int base)
{ {
size_t n = print(num, base); print(n, base);
n += println(); println();
return n;
} }
size_t Print::println(long num, int base) void Print::println(double n, int digits)
{ {
size_t n = print(num, base); print(n, digits);
n += println(); 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;
} }
// Private Methods ///////////////////////////////////////////////////////////// // Private Methods /////////////////////////////////////////////////////////////
size_t Print::printNumber(unsigned long n, uint8_t base) { void 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]; 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 while (n > 0) {
if (base < 2) base = 10; buf[i++] = n % base;
do {
unsigned long m = n;
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 // Handle negative numbers
if (number < 0.0) if (number < 0.0)
{ {
n += print('-'); print('-');
number = -number; 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 // Extract the integer part of the number and print it
unsigned long int_part = (unsigned long)number; unsigned long int_part = (unsigned long)number;
double remainder = number - (double)int_part; double remainder = number - (double)int_part;
n += print(int_part); print(int_part);
// Print the decimal point, but only if there are digits beyond // Print the decimal point, but only if there are digits beyond
if (digits > 0) { if (digits > 0)
n += print("."); print(".");
}
// Extract digits from the remainder one at a time // Extract digits from the remainder one at a time
while (digits-- > 0) while (digits-- > 0)
{ {
remainder *= 10.0; remainder *= 10.0;
int toPrint = int(remainder); int toPrint = int(remainder);
n += print(toPrint); print(toPrint);
remainder -= toPrint; remainder -= toPrint;
} }
return n;
} }

View File

@ -1,8 +1,6 @@
/* /*
WString.h - String library for Wiring & Arduino WString.h - String library for Wiring & Arduino
...mostly rewritten by Paul Stoffregen...
Copyright (c) 2009-10 Hernando Barragan. All right reserved. 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 This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -19,136 +17,48 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef String_class_h #ifndef String_h
#define String_class_h #define String_h
#ifdef __cplusplus
//#include "WProgram.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <ctype.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 class String
{ {
// use a function pointer to allow for "if (s)" without the public:
// 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 // constructors
// creates a copy of the initial value. String( const char *value = "" );
// if the initial value is null or invalid, or if memory allocation String( const String &value );
// fails, the string will be marked as invalid (i.e. "if (s)" will String( const char );
// be false). String( const unsigned char );
String(const char *cstr = ""); String( const int, const int base=10);
String(const String &str); String( const unsigned int, const int base=10 );
#ifdef __GXX_EXPERIMENTAL_CXX0X__ String( const long, const int base=10 );
String(String &&rval); String( const unsigned long, const int base=10 );
String(StringSumHelper &&rval); ~String() { free(_buffer); _length = _capacity = 0;} //added _length = _capacity = 0;
#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);
// memory management // operators
// return true on success, false on failure (in which case, the string const String & operator = ( const String &rhs );
// is left unchanged). reserve(0), if successful, will validate an const String & operator +=( const String &rhs );
// invalid string (i.e., "if (s)" will be true afterwards) //const String & operator +=( const char );
unsigned char reserve(unsigned int size); int operator ==( const String &rhs ) const;
inline unsigned int length(void) const {return len;} 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; }
// creates a copy of the assigned value. if the value is null or // general methods
// invalid, or if the memory allocation fails, the string will be char charAt( unsigned int index ) const;
// marked as invalid ("if (s)" will be false). int compareTo( const String &anotherString ) const;
String & operator = (const String &rhs); unsigned char endsWith( const String &suffix ) const;
String & operator = (const char *cstr); unsigned char equals( const String &anObject ) const;
#ifdef __GXX_EXPERIMENTAL_CXX0X__ unsigned char equalsIgnoreCase( const String &anotherString ) const;
String & operator = (String &&rval);
String & operator = (StringSumHelper &&rval);
#endif
// 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);}
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 ) const;
int indexOf( char ch, unsigned int fromIndex ) const; int indexOf( char ch, unsigned int fromIndex ) const;
int indexOf( const String &str ) const; int indexOf( const String &str ) const;
@ -157,49 +67,46 @@ public:
int lastIndexOf( char ch, unsigned int fromIndex ) const; int lastIndexOf( char ch, unsigned int fromIndex ) const;
int lastIndexOf( const String &str ) const; int lastIndexOf( const String &str ) const;
int lastIndexOf( const String &str, unsigned int fromIndex ) 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 ) const;
String substring( unsigned int beginIndex, unsigned int endIndex ) 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 );
// modification protected:
void replace(char find, char replace); char *_buffer; // the actual char array
void replace(const String& find, const String& replace); unsigned int _capacity; // the array length minus one (for the '\0')
void toLowerCase(void); unsigned int _length; // the String length (not counting the '\0')
void toUpperCase(void);
void trim(void);
// parsing/conversion void getBuffer(unsigned int maxStrLen);
long toInt(void) const;
protected: private:
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: _capacity = maxStrLen;
StringSumHelper(const String &s) : String(s) {} _buffer = (char *) malloc(_capacity + 1);
StringSumHelper(const char *p) : String(p) {} if (_buffer == NULL) _length = _capacity = 0;
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) {}
};
#endif // __cplusplus inline String operator+( String lhs, const String &rhs )
#endif // String_class_h {
return lhs += rhs;
}
#endif

226
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 pins_arduino.c - pin definitions for the Arduino board
Part of Arduino - http://www.arduino.cc/ 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 This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -19,72 +19,66 @@
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA Boston, MA 02111-1307 USA
$Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ $Id$
*/ */
#ifndef Pins_Arduino_h #include <avr/io.h>
#define Pins_Arduino_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 // ATMEL ATMEGA8 & 168 / ARDUINO
#define NUM_ANALOG_INPUTS 16 //
#define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1) // +-\/-+
#define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46)) // 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; // ATMEL ATMEGA1280 / ARDUINO
const static uint8_t MOSI = 51; //
const static uint8_t MISO = 50; // 0-7 PE0-PE7 works
const static uint8_t SCK = 52; // 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; #define PA 1
const static uint8_t SCL = 21; #define PB 2
const static uint8_t LED = 13; #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[] = { const uint16_t PROGMEM port_to_mode_PGM[] = {
NOT_A_PORT, NOT_A_PORT,
(uint16_t) &DDRA, (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 6 ** 68 ** A14
NOT_ON_TIMER , // PK 7 ** 69 ** A15 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,
};
#endif 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> #include <Ethernet.h>
// assign a MAC address for the ethernet controller. // 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: // fill in your address here:
byte mac[] = { byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; 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: // initialize the library instance:
EthernetClient client; Client client(server, 80);
long lastConnectionTime = 0; // last time you connected to the server, in milliseconds 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 boolean lastConnected = false; // state of the connection last time through the main loop
const int postingInterval = 10000; //delay between updates to Pachube.com const int postingInterval = 10000; //delay between updates to Pachube.com
void setup() { void setup() {
// start serial port: // start the ethernet connection and serial port:
Ethernet.begin(mac, ip);
Serial.begin(9600); 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: // give the ethernet module time to boot up:
delay(1000); delay(1000);
} }
@ -82,7 +86,7 @@ void loop() {
// this method makes a HTTP connection to the server: // this method makes a HTTP connection to the server:
void sendData(int thisData) { void sendData(int thisData) {
// if there's a successful connection: // if there's a successful connection:
if (client.connect("www.pachube.com", 80)) { if (client.connect()) {
Serial.println("connecting..."); Serial.println("connecting...");
// send the HTTP PUT request. // send the HTTP PUT request.
// fill in your feed address here: // fill in your feed address here:

View File

@ -28,9 +28,20 @@
// fill in your address here: // fill in your address here:
byte mac[] = { byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; 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: // initialize the library instance:
EthernetClient client; Client client(server, 80);
long lastConnectionTime = 0; // last time you connected to the server, in milliseconds 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 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() { void setup() {
// start the ethernet connection and serial port: // start the ethernet connection and serial port:
Ethernet.begin(mac, ip);
Serial.begin(9600); 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: // give the ethernet module time to boot up:
delay(1000); delay(1000);
} }
@ -90,7 +96,7 @@ void loop() {
// this method makes a HTTP connection to the server: // this method makes a HTTP connection to the server:
void sendData(String thisData) { void sendData(String thisData) {
// if there's a successful connection: // if there's a successful connection:
if (client.connect("www.pachube.com", 80)) { if (client.connect()) {
Serial.println("connecting..."); Serial.println("connecting...");
// send the HTTP PUT request. // send the HTTP PUT request.
// fill in your feed address here: // 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 sketch accepts strings and raw sysex messages and echos them back.
* *
* This example code is in the public domain. * This example code is in the public domain.
@ -25,7 +14,12 @@ void stringCallback(char *myString)
void sysexCallback(byte command, byte argc, byte*argv) 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() 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> #include <SD.h>
/* for debugging file open/close leaks void File::write(uint8_t val) {
uint8_t nfilecount=0; SD.file.write(val);
*/
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);
*/
}
} }
File::File(void) { void File::write(const char *str) {
_file = 0; SD.file.write(str);
_name[0] = 0;
//Serial.print("Created empty file object");
} }
File::~File(void) { void File::write(const uint8_t *buf, size_t size) {
// Serial.print("Deleted file object"); SD.file.write(buf, size);
}
// 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;
} }
int File::peek() { int File::peek() {
if (! _file) int c = SD.file.read();
return 0; if (c != -1) SD.file.seekCur(-1);
int c = _file->read();
if (c != -1) _file->seekCur(-1);
return c; return c;
} }
int File::read() { int File::read() {
if (_file) return SD.file.read();
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;
} }
int File::available() { int File::available() {
if (! _file) return 0; return size() - position();
uint32_t n = size() - position();
return n > 0X7FFF ? 0X7FFF : n;
} }
void File::flush() { void File::flush() {
if (_file) SD.file.sync();
_file->sync();
} }
boolean File::seek(uint32_t pos) { boolean File::seek(uint32_t pos) {
if (! _file) return false; return SD.file.seekSet(pos);
return _file->seekSet(pos);
} }
uint32_t File::position() { uint32_t File::position() {
if (! _file) return -1; return SD.file.curPosition();
return _file->curPosition();
} }
uint32_t File::size() { uint32_t File::size() {
if (! _file) return 0; return SD.file.fileSize();
return _file->fileSize();
} }
void File::close() { void File::close() {
if (_file) { SD.file.close();
_file->close();
free(_file);
_file = 0;
/* for debugging file open/close leaks
nfilecount--;
Serial.print("Deleted ");
Serial.println(nfilecount, DEC);
*/
}
} }
File::operator bool() { File::operator bool() {
if (_file) return SD.file.isOpen();
return _file->isOpen();
return false;
} }

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) - SoftwareSerial.cpp - Software serial library
Multi-instance software serial library for Arduino/Wiring Copyright (c) 2006 David A. Mellis. All right reserved.
-- 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 This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. 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, This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details. Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 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 * Includes
// the bit times, so don't rely on it too much at high baud rates ******************************************************************************/
#define _DEBUG 0
#define _DEBUG_PIN1 11 #include "WConstants.h"
#define _DEBUG_PIN2 13
//
// Includes
//
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "Arduino.h"
#include "SoftwareSerial.h" #include "SoftwareSerial.h"
//
// Lookup table /******************************************************************************
// * Definitions
typedef struct _DELAY_TABLE ******************************************************************************/
/******************************************************************************
* Constructors
******************************************************************************/
SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin)
{ {
long baud; _receivePin = receivePin;
unsigned short rx_delay_centering; _transmitPin = transmitPin;
unsigned short rx_delay_intrabit; _baudRate = 0;
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 * User API
// ******************************************************************************/
/* 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) void SoftwareSerial::begin(long speed)
{ {
_rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; _baudRate = speed;
_bitPeriod = 1000000 / _baudRate;
for (unsigned i=0; i<sizeof(table)/sizeof(table[0]); ++i) digitalWrite(_transmitPin, HIGH);
{ delayMicroseconds( _bitPeriod); // if we were low this establishes the end
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() int SoftwareSerial::read()
{ {
if (!isListening()) 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; 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() void SoftwareSerial::print(uint8_t b)
{ {
if (!isListening()) if (_baudRate == 0)
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; return;
uint8_t oldSREG = SREG; int bitDelay = _bitPeriod - clockCyclesToMicroseconds(50); // a digitalWrite is about 50 cycles
cli(); byte mask;
_receive_buffer_head = _receive_buffer_tail = 0;
SREG = oldSREG; 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);
} }
int SoftwareSerial::peek() void SoftwareSerial::print(const char *s)
{ {
if (!isListening()) while (*s)
return -1; print(*s++);
}
// Empty buffer?
if (_receive_buffer_head == _receive_buffer_tail) void SoftwareSerial::print(char c)
return -1; {
print((uint8_t) c);
// Read from "head" }
return _receive_buffer[_receive_buffer_head];
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) - SoftwareSerial.h - Software serial library
Multi-instance software serial library for Arduino/Wiring Copyright (c) 2006 David A. Mellis. All right reserved.
-- 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 This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. 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, This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details. Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 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 #ifndef SoftwareSerial_h
#define SoftwareSerial_h #define SoftwareSerial_h
#include <inttypes.h> #include <inttypes.h>
#include <Stream.h>
/****************************************************************************** class SoftwareSerial
* 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: private:
// per object data
uint8_t _receivePin; uint8_t _receivePin;
uint8_t _receiveBitMask; uint8_t _transmitPin;
volatile uint8_t *_receivePortRegister; long _baudRate;
uint8_t _transmitBitMask; int _bitPeriod;
volatile uint8_t *_transmitPortRegister; void printNumber(unsigned long, uint8_t);
public:
uint16_t _rx_delay_centering; SoftwareSerial(uint8_t, uint8_t);
uint16_t _rx_delay_intrabit; void begin(long);
uint16_t _rx_delay_stopbit; int read();
uint16_t _tx_delay; void print(char);
void print(const char[]);
uint16_t _buffer_overflow:1; void print(uint8_t);
uint16_t _inverse_logic:1; void print(int);
void print(unsigned int);
// static data void print(long);
static char _receive_buffer[_SS_MAX_RX_BUFF]; void print(unsigned long);
static volatile uint8_t _receive_buffer_tail; void print(long, int);
static volatile uint8_t _receive_buffer_head; void println(void);
static SoftwareSerial *active_object; void println(char);
void println(const char[]);
// private methods void println(uint8_t);
void recv(); void println(int);
uint8_t rx_pin_read(); void println(long);
void tx_pin_write(uint8_t pin_state); void println(unsigned long);
void setTX(uint8_t transmitPin); void println(long, int);
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 #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) # Datatypes (KEYWORD1)
####################################### #######################################
NewSoftSerial KEYWORD1 SoftwareSerial KEYWORD1
####################################### #######################################
# Methods and Functions (KEYWORD2) # Methods and Functions (KEYWORD2)
####################################### #######################################
begin KEYWORD2
end KEYWORD2
read KEYWORD2
available KEYWORD2
isListening KEYWORD2
overflow KEYWORD2
flush KEYWORD2
listen KEYWORD2
####################################### #######################################
# Constants (LITERAL1) # Constants (LITERAL1)
####################################### #######################################