diff options
Diffstat (limited to 'libraries/Firmata')
19 files changed, 486 insertions, 2155 deletions
diff --git a/libraries/Firmata/Boards.h b/libraries/Firmata/Boards.h index f716320..06f69c6 100644 --- a/libraries/Firmata/Boards.h +++ b/libraries/Firmata/Boards.h @@ -3,7 +3,13 @@  #ifndef Firmata_Boards_h  #define Firmata_Boards_h -#include <Arduino.h>	// for digitalRead, digitalWrite, etc +#include <inttypes.h> + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h"	// for digitalRead, digitalWrite, etc +#else +#include "WProgram.h" +#endif  // Normally Servo.h must be included before Firmata.h (which then includes  // this file).  If Servo.h wasn't included, this allows the code to still @@ -118,35 +124,58 @@ writePort(port, value, bitmask):  Write an 8 bit port.   * Board Specific Configuration   *============================================================================*/ +#ifndef digitalPinHasPWM +#define digitalPinHasPWM(p)     IS_PIN_DIGITAL(p) +#endif +  // Arduino Duemilanove, Diecimila, and NG  #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#if defined(NUM_ANALOG_INPUTS) && NUM_ANALOG_INPUTS == 6 +#define TOTAL_ANALOG_PINS       6 +#define TOTAL_PINS              20 // 14 digital + 6 analog +#else  #define TOTAL_ANALOG_PINS       8 -#define TOTAL_PINS              24 // 14 digital + 2 unused + 8 analog +#define TOTAL_PINS              22 // 14 digital + 8 analog +#endif  #define VERSION_BLINK_PIN       13 -#define IS_PIN_DIGITAL(p)       (((p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21)) -#define IS_PIN_ANALOG(p)        ((p) >= 16 && (p) <= 23) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) -#define IS_PIN_SERVO(p)         ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS) -#define IS_PIN_I2C(p)           (0) -#define PIN_TO_DIGITAL(p)       (((p) < 16) ? (p) : (p) - 2) -#define PIN_TO_ANALOG(p)        ((p) - 16) +#define IS_PIN_DIGITAL(p)       ((p) >= 2 && (p) <= 19) +#define IS_PIN_ANALOG(p)        ((p) >= 14 && (p) < 14 + TOTAL_ANALOG_PINS) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p) +#define IS_PIN_SERVO(p)         (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS) +#define IS_PIN_I2C(p)           ((p) == 18 || (p) == 19) +#define PIN_TO_DIGITAL(p)       (p) +#define PIN_TO_ANALOG(p)        ((p) - 14)  #define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p)  #define PIN_TO_SERVO(p)         ((p) - 2)  #define ARDUINO_PINOUT_OPTIMIZE 1 +// Wiring (and board) +#elif defined(WIRING) +#define VERSION_BLINK_PIN       WLED +#define IS_PIN_DIGITAL(p)       ((p) >= 0 && (p) < TOTAL_PINS) +#define IS_PIN_ANALOG(p)        ((p) >= FIRST_ANALOG_PIN && (p) < (FIRST_ANALOG_PIN+TOTAL_ANALOG_PINS)) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p) +#define IS_PIN_SERVO(p)         ((p) >= 0 && (p) < MAX_SERVOS) +#define IS_PIN_I2C(p)           ((p) == SDA || (p) == SCL) +#define PIN_TO_DIGITAL(p)       (p) +#define PIN_TO_ANALOG(p)        ((p) - FIRST_ANALOG_PIN) +#define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p)         (p)  + +  // old Arduinos  #elif defined(__AVR_ATmega8__)  #define TOTAL_ANALOG_PINS       6 -#define TOTAL_PINS              22 // 14 digital + 2 unused + 6 analog +#define TOTAL_PINS              20 // 14 digital + 6 analog  #define VERSION_BLINK_PIN       13 -#define IS_PIN_DIGITAL(p)       (((p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21)) -#define IS_PIN_ANALOG(p)        ((p) >= 16 && (p) <= 21) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) -#define IS_PIN_SERVO(p)         ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS) -#define IS_PIN_I2C(p)           (0) -#define PIN_TO_DIGITAL(p)       (((p) < 16) ? (p) : (p) - 2) -#define PIN_TO_ANALOG(p)        ((p) - 16) +#define IS_PIN_DIGITAL(p)       ((p) >= 2 && (p) <= 19) +#define IS_PIN_ANALOG(p)        ((p) >= 14 && (p) <= 19) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p) +#define IS_PIN_SERVO(p)         (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS) +#define IS_PIN_I2C(p)           ((p) == 18 || (p) == 19) +#define PIN_TO_DIGITAL(p)       (p) +#define PIN_TO_ANALOG(p)        ((p) - 14)  #define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p)  #define PIN_TO_SERVO(p)         ((p) - 2)  #define ARDUINO_PINOUT_OPTIMIZE 1 @@ -159,23 +188,15 @@ writePort(port, value, bitmask):  Write an 8 bit port.  #define VERSION_BLINK_PIN       13  #define IS_PIN_DIGITAL(p)       ((p) >= 2 && (p) < TOTAL_PINS)  #define IS_PIN_ANALOG(p)        ((p) >= 54 && (p) < TOTAL_PINS) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p)  #define IS_PIN_SERVO(p)         ((p) >= 2 && (p) - 2 < MAX_SERVOS) -#define IS_PIN_I2C(p)           (0) +#define IS_PIN_I2C(p)           ((p) == 20 || (p) == 21)  #define PIN_TO_DIGITAL(p)       (p)  #define PIN_TO_ANALOG(p)        ((p) - 54)  #define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p)  #define PIN_TO_SERVO(p)         ((p) - 2) -// Wiring -#elif defined(__AVR_ATmega128__) -#define TOTAL_ANALOG_PINS       8 -#define TOTAL_PINS              51 -#define VERSION_BLINK_PIN       48 -// TODO: hardware abstraction for wiring board - -  // Teensy 1.0  #elif defined(__AVR_AT90USB162__)  #define TOTAL_ANALOG_PINS       0 @@ -183,7 +204,7 @@ writePort(port, value, bitmask):  Write an 8 bit port.  #define VERSION_BLINK_PIN       6  #define IS_PIN_DIGITAL(p)       ((p) >= 0 && (p) < TOTAL_PINS)  #define IS_PIN_ANALOG(p)        (0) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p)  #define IS_PIN_SERVO(p)         ((p) >= 0 && (p) < MAX_SERVOS)  #define IS_PIN_I2C(p)           (0)  #define PIN_TO_DIGITAL(p)       (p) @@ -199,9 +220,9 @@ writePort(port, value, bitmask):  Write an 8 bit port.  #define VERSION_BLINK_PIN       11  #define IS_PIN_DIGITAL(p)       ((p) >= 0 && (p) < TOTAL_PINS)  #define IS_PIN_ANALOG(p)        ((p) >= 11 && (p) <= 22) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p)  #define IS_PIN_SERVO(p)         ((p) >= 0 && (p) < MAX_SERVOS) -#define IS_PIN_I2C(p)           (0) +#define IS_PIN_I2C(p)           ((p) == 5 || (p) == 6)  #define PIN_TO_DIGITAL(p)       (p)  #define PIN_TO_ANALOG(p)        (((p)<22)?21-(p):11)  #define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p) @@ -215,9 +236,9 @@ writePort(port, value, bitmask):  Write an 8 bit port.  #define VERSION_BLINK_PIN       6  #define IS_PIN_DIGITAL(p)       ((p) >= 0 && (p) < TOTAL_PINS)  #define IS_PIN_ANALOG(p)        ((p) >= 38 && (p) < TOTAL_PINS) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p)  #define IS_PIN_SERVO(p)         ((p) >= 0 && (p) < MAX_SERVOS) -#define IS_PIN_I2C(p)           (0) +#define IS_PIN_I2C(p)           ((p) == 0 || (p) == 1)  #define PIN_TO_DIGITAL(p)       (p)  #define PIN_TO_ANALOG(p)        ((p) - 38)  #define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p) @@ -231,9 +252,9 @@ writePort(port, value, bitmask):  Write an 8 bit port.  #define VERSION_BLINK_PIN       0  #define IS_PIN_DIGITAL(p)       ((p) >= 2 && (p) < TOTAL_PINS)  #define IS_PIN_ANALOG(p)        ((p) >= 24 && (p) < TOTAL_PINS) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p)  #define IS_PIN_SERVO(p)         ((p) >= 0 && (p) < MAX_SERVOS) -#define IS_PIN_I2C(p)           (0) +#define IS_PIN_I2C(p)           ((p) == 16 || (p) == 17)  #define PIN_TO_DIGITAL(p)       (p)  #define PIN_TO_ANALOG(p)        ((p) - 24)  #define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p) @@ -247,9 +268,9 @@ writePort(port, value, bitmask):  Write an 8 bit port.  #define VERSION_BLINK_PIN       13  #define IS_PIN_DIGITAL(p)       ((p) >= 2 && (p) < TOTAL_PINS)  #define IS_PIN_ANALOG(p)        ((p) >= 36 && (p) < TOTAL_PINS) -#define IS_PIN_PWM(p)           IS_PIN_DIGITAL(p) +#define IS_PIN_PWM(p)           digitalPinHasPWM(p)  #define IS_PIN_SERVO(p)         ((p) >= 0 && (p) < MAX_SERVOS) -#define IS_PIN_I2C(p)           (0) +#define IS_PIN_I2C(p)           ((p) == 4 || (p) == 5)  #define PIN_TO_DIGITAL(p)       (p)  #define PIN_TO_ANALOG(p)        ((p) - 36)  #define PIN_TO_PWM(p)           PIN_TO_DIGITAL(p) @@ -270,9 +291,9 @@ static inline unsigned char readPort(byte, byte) __attribute__((always_inline, u  static inline unsigned char readPort(byte port, byte bitmask)  {  #if defined(ARDUINO_PINOUT_OPTIMIZE) -	if (port == 0) return PIND & B11111100 & bitmask; // ignore Rx/Tx 0/1 -	if (port == 1) return PINB & B00111111 & bitmask; // pins 8-13 (14,15 are disabled for the crystal) -	if (port == 2) return PINC & bitmask; +	if (port == 0) return (PIND & 0xFC) & bitmask; // ignore Rx/Tx 0/1 +	if (port == 1) return ((PINB & 0x3F) | ((PINC & 0x03) << 6)) & bitmask; +	if (port == 2) return ((PINC & 0x3C) >> 2) & bitmask;  	return 0;  #else  	unsigned char out=0, pin=port*8; @@ -297,17 +318,27 @@ static inline unsigned char writePort(byte port, byte value, byte bitmask)  {  #if defined(ARDUINO_PINOUT_OPTIMIZE)  	if (port == 0) { -		bitmask = bitmask & 0xFC;  // Tx & Rx pins +		bitmask = bitmask & 0xFC;  // do not touch Tx & Rx pins +		byte valD = value & bitmask; +		byte maskD = ~bitmask;  		cli(); -		PORTD = (PORTD & ~bitmask) | (bitmask & value); +		PORTD = (PORTD & maskD) | valD;  		sei();  	} else if (port == 1) { +		byte valB = (value & bitmask) & 0x3F; +		byte valC = (value & bitmask) >> 6; +		byte maskB = ~(bitmask & 0x3F); +		byte maskC = ~((bitmask & 0xC0) >> 6);  		cli(); -		PORTB = (PORTB & ~bitmask) | (bitmask & value); +		PORTB = (PORTB & maskB) | valB; +		PORTC = (PORTC & maskC) | valC;  		sei();  	} else if (port == 2) { +		bitmask = bitmask & 0x0F; +		byte valC = (value & bitmask) << 2; +		byte maskC = ~(bitmask << 2);  		cli(); -		PORTC = (PORTC & ~bitmask) | (bitmask & value); +		PORTC = (PORTC & maskC) | valC;  		sei();  	}  #else diff --git a/libraries/Firmata/Firmata.cpp b/libraries/Firmata/Firmata.cpp index e30deae..e81c10b 100644 --- a/libraries/Firmata/Firmata.cpp +++ b/libraries/Firmata/Firmata.cpp @@ -14,9 +14,8 @@  //* Includes  //****************************************************************************** -#include "Arduino.h" -#include "HardwareSerial.h"  #include "Firmata.h" +#include "HardwareSerial.h"  extern "C" {  #include <string.h> @@ -27,27 +26,27 @@ extern "C" {  //* Support Functions  //****************************************************************************** -void sendValueAsTwo7bitBytes(int value) +void FirmataClass::sendValueAsTwo7bitBytes(int value)  { -  Serial.print(value & B01111111, BYTE); // LSB -  Serial.print(value >> 7 & B01111111, BYTE); // MSB +  FirmataSerial.write(value & B01111111); // LSB +  FirmataSerial.write(value >> 7 & B01111111); // MSB  } -void startSysex(void) +void FirmataClass::startSysex(void)  { -  Serial.print(START_SYSEX, BYTE); +  FirmataSerial.write(START_SYSEX);  } -void endSysex(void) +void FirmataClass::endSysex(void)  { -  Serial.print(END_SYSEX, BYTE); +  FirmataSerial.write(END_SYSEX);  }  //******************************************************************************  //* Constructors  //****************************************************************************** -FirmataClass::FirmataClass(void) +FirmataClass::FirmataClass(Stream &s) : FirmataSerial(s)  {    firmwareVersionCount = 0;    systemReset(); @@ -66,33 +65,36 @@ void FirmataClass::begin(void)  /* begin method for overriding default serial bitrate */  void FirmataClass::begin(long speed)  { -#if defined(__AVR_ATmega128__)  // Wiring -  Serial.begin((uint32_t)speed); -#else    Serial.begin(speed); -#endif +  FirmataSerial = Serial;    blinkVersion(); -  delay(300); +  printVersion(); +  printFirmwareVersion(); +} + +void FirmataClass::begin(Stream &s) +{ +  FirmataSerial = s; +  systemReset();    printVersion();    printFirmwareVersion();  }  // output the protocol version message to the serial port  void FirmataClass::printVersion(void) { -  Serial.print(REPORT_VERSION, BYTE); -  Serial.print(FIRMATA_MAJOR_VERSION, BYTE); -  Serial.print(FIRMATA_MINOR_VERSION, BYTE); +  FirmataSerial.write(REPORT_VERSION); +  FirmataSerial.write(FIRMATA_MAJOR_VERSION); +  FirmataSerial.write(FIRMATA_MINOR_VERSION);  }  void FirmataClass::blinkVersion(void)  {    // flash the pin with the protocol version    pinMode(VERSION_BLINK_PIN,OUTPUT); -  pin13strobe(FIRMATA_MAJOR_VERSION, 200, 400); -  delay(300); -  pin13strobe(2,1,4); // separator, a quick burst -  delay(300); -  pin13strobe(FIRMATA_MINOR_VERSION, 200, 400); +  pin13strobe(FIRMATA_MAJOR_VERSION, 40, 210); +  delay(250); +  pin13strobe(FIRMATA_MINOR_VERSION, 40, 210); +  delay(125);  }  void FirmataClass::printFirmwareVersion(void) @@ -101,9 +103,9 @@ void FirmataClass::printFirmwareVersion(void)    if(firmwareVersionCount) { // make sure that the name has been set before reporting      startSysex(); -    Serial.print(REPORT_FIRMWARE, BYTE); -    Serial.print(firmwareVersionVector[0]); // major version number -    Serial.print(firmwareVersionVector[1]); // minor version number +    FirmataSerial.write(REPORT_FIRMWARE); +    FirmataSerial.write(firmwareVersionVector[0]); // major version number +    FirmataSerial.write(firmwareVersionVector[1]); // minor version number      for(i=2; i<firmwareVersionCount; ++i) {        sendValueAsTwo7bitBytes(firmwareVersionVector[i]);      } @@ -141,7 +143,7 @@ void FirmataClass::setFirmwareNameAndVersion(const char *name, byte major, byte  int FirmataClass::available(void)  { -  return Serial.available(); +  return FirmataSerial.available();  } @@ -175,7 +177,7 @@ void FirmataClass::processSysexMessage(void)  void FirmataClass::processInput(void)  { -  int inputData = Serial.read(); // this is 'int' to handle -1 when no data +  int inputData = FirmataSerial.read(); // this is 'int' to handle -1 when no data    int command;    // TODO make sure it handles -1 properly @@ -267,7 +269,7 @@ void FirmataClass::processInput(void)  void FirmataClass::sendAnalog(byte pin, int value)   {    // pin can only be 0-15, so chop higher bits -  Serial.print(ANALOG_MESSAGE | (pin & 0xF), BYTE); +  FirmataSerial.write(ANALOG_MESSAGE | (pin & 0xF));    sendValueAsTwo7bitBytes(value);  } @@ -298,9 +300,9 @@ void FirmataClass::sendDigital(byte pin, int value)  // send an 8-bit port in a single digital message (protocol v2)  void FirmataClass::sendDigitalPort(byte portNumber, int portData)  { -  Serial.print(DIGITAL_MESSAGE | (portNumber & 0xF),BYTE); -  Serial.print((byte)portData % 128, BYTE); // Tx bits 0-6 -  Serial.print(portData >> 7, BYTE);  // Tx bits 7-13 +  FirmataSerial.write(DIGITAL_MESSAGE | (portNumber & 0xF)); +  FirmataSerial.write((byte)portData % 128); // Tx bits 0-6 +  FirmataSerial.write(portData >> 7);  // Tx bits 7-13  } @@ -308,7 +310,7 @@ void FirmataClass::sendSysex(byte command, byte bytec, byte* bytev)  {    byte i;    startSysex(); -  Serial.print(command, BYTE); +  FirmataSerial.write(command);    for(i=0; i<bytec; i++) {      sendValueAsTwo7bitBytes(bytev[i]);            } @@ -437,6 +439,6 @@ void FirmataClass::pin13strobe(int count, int onInterval, int offInterval)  // make one instance for the user to use -FirmataClass Firmata; +FirmataClass Firmata(Serial); diff --git a/libraries/Firmata/Firmata.h b/libraries/Firmata/Firmata.h index 86535d9..74f1ccc 100644 --- a/libraries/Firmata/Firmata.h +++ b/libraries/Firmata/Firmata.h @@ -13,16 +13,15 @@  #ifndef Firmata_h  #define Firmata_h -#include <Arduino.h> -#include <inttypes.h> - +#include "Boards.h"  /* Hardware Abstraction Layer + Wiring/Arduino */  /* Version numbers for the protocol.  The protocol is still changing, so these   * version numbers are important.  This number can be queried so that host   * software can test whether it will be compatible with the currently   * installed firmware. */  #define FIRMATA_MAJOR_VERSION   2 // for non-compatible changes -#define FIRMATA_MINOR_VERSION   2 // for backwards compatible changes +#define FIRMATA_MINOR_VERSION   3 // for backwards compatible changes +#define FIRMATA_BUGFIX_VERSION  1 // for bugfix releases  #define MAX_DATA_BYTES 32 // max number of data bytes in non-Sysex messages @@ -66,8 +65,8 @@  #define SYSEX_SAMPLING_INTERVAL 0x7A // same as SAMPLING_INTERVAL  // pin modes -//#define INPUT                 0x00 // defined in Arduino.h -//#define OUTPUT                0x01 // defined in Arduino.h +//#define INPUT                 0x00 // defined in wiring.h +//#define OUTPUT                0x01 // defined in wiring.h  #define ANALOG                  0x02 // analog pin in analogInput mode  #define PWM                     0x03 // digital pin in PWM output mode  #define SERVO                   0x04 // digital pin in Servo output mode @@ -88,10 +87,11 @@ extern "C" {  class FirmataClass  {  public: -	FirmataClass(); +	FirmataClass(Stream &s);  /* Arduino constructors */      void begin();      void begin(long); +    void begin(Stream &s);  /* querying functions */  	void printVersion(void);      void blinkVersion(void); @@ -116,6 +116,7 @@ public:      void detach(byte command);  private: +    Stream &FirmataSerial;  /* firmware name and version */      byte firmwareVersionCount;      byte *firmwareVersionVector; @@ -141,6 +142,9 @@ private:      void processSysexMessage(void);  	void systemReset(void);      void pin13strobe(int count, int onInterval, int offInterval); +    void sendValueAsTwo7bitBytes(int value); +    void startSysex(void); +    void endSysex(void);  };  extern FirmataClass Firmata; @@ -155,8 +159,5 @@ extern FirmataClass Firmata;   */  #define setFirmwareVersion(x, y)   setFirmwareNameAndVersion(__FILE__, x, y) -/* Hardware Abstraction Layer */ -#include "Boards.h" -  #endif /* Firmata_h */ diff --git a/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde b/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.ino index 5bca72a..bff7366 100644 --- a/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde +++ b/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.ino @@ -1,3 +1,14 @@ +/* + * 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 firmware reads all inputs and sends them as fast as it can.  It was   * inspired by the ease-of-use of the Arduino2Max program. @@ -56,7 +67,7 @@ void loop()    byte i;    for (i=0; i<TOTAL_PORTS; i++) { -    sendPort(i, readPort(i)); +      sendPort(i, readPort(i, 0xff));    }    /* make sure that the FTDI buffer doesn't go over 60 bytes, otherwise you       get long, random delays.  So only read analogs every 20ms or so */ diff --git a/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde b/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.ino index df8b674..ff1d664 100644 --- a/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde +++ b/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.ino @@ -1,3 +1,14 @@ +/* + * 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 firmware supports as many analog ports as possible, all analog inputs,   * four PWM outputs, and two with servo support.   * diff --git a/libraries/Firmata/examples/AnalogFirmata/Makefile b/libraries/Firmata/examples/AnalogFirmata/Makefile deleted file mode 100644 index e968c0a..0000000 --- a/libraries/Firmata/examples/AnalogFirmata/Makefile +++ /dev/null @@ -1,263 +0,0 @@ -# Arduino makefile -# -# This makefile allows you to build sketches from the command line -# without the Arduino environment (or Java). -# -# The Arduino environment does preliminary processing on a sketch before -# compiling it.  If you're using this makefile instead, you'll need to do -# a few things differently: -# -#   - Give your program's file a .cpp extension (e.g. foo.cpp). -# -#   - Put this line at top of your code: #include <WProgram.h> -# -#   - Write prototypes for all your functions (or define them before you -#     call them).  A prototype declares the types of parameters a -#     function will take and what type of value it will return.  This -#     means that you can have a call to a function before the definition -#     of the function.  A function prototype looks like the first line of -#     the function, with a semi-colon at the end.  For example: -#     int digitalRead(int pin); -# -# Instructions for using the makefile: -# -#  1. Copy this file into the folder with your sketch. -# -#  2. Below, modify the line containing "TARGET" to refer to the name of -#     of your program's file without an extension (e.g. TARGET = foo). -# -#  3. Modify the line containg "ARDUINO" to point the directory that -#     contains the Arduino core (for normal Arduino installations, this -#     is the hardware/cores/arduino sub-directory). -# -#  4. Modify the line containing "PORT" to refer to the filename -#     representing the USB or serial connection to your Arduino board -#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file -#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*). -# -#  5. At the command line, change to the directory containing your -#     program's file and the makefile. -# -#  6. Type "make" and press enter to compile/verify your program. -# -#  7. Type "make upload", reset your Arduino board, and press enter  to -#     upload your program to the Arduino board. -# -# $Id: Makefile,v 1.7 2007/04/13 05:28:23 eighthave Exp $ - -PORT = /dev/tty.usbserial-* -TARGET := $(shell pwd | sed 's|.*/\(.*\)|\1|') -ARDUINO = /Applications/arduino -ARDUINO_SRC = $(ARDUINO)/hardware/cores/arduino -ARDUINO_LIB_SRC = $(ARDUINO)/hardware/libraries -INCLUDE = -I$(ARDUINO_SRC) -I$(ARDUINO)/hardware/tools/avr/avr/include \ -	-I$(ARDUINO_LIB_SRC)/EEPROM \ -	-I$(ARDUINO_LIB_SRC)/Firmata \ -	-I$(ARDUINO_LIB_SRC)/Servo \ -	-I$(ARDUINO_LIB_SRC) -SRC = $(wildcard $(ARDUINO_SRC)/*.c) -CXXSRC = applet/$(TARGET).cpp $(ARDUINO_SRC)/HardwareSerial.cpp \ -	$(ARDUINO_LIB_SRC)/EEPROM/EEPROM.cpp \ -	$(ARDUINO_LIB_SRC)/Firmata/Firmata.cpp \ -	$(ARDUINO_LIB_SRC)/Servo/Servo.cpp \ -	$(ARDUINO_SRC)/WMath.cpp -HEADERS = $(wildcard $(ARDUINO_SRC)/*.h) $(wildcard $(ARDUINO_LIB_SRC)/*/*.h) - -MCU = atmega168 -#MCU = atmega8 -F_CPU = 16000000 -FORMAT = ihex -UPLOAD_RATE = 19200 - -# Name of this Makefile (used for "make depend"). -MAKEFILE = Makefile - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs - -OPT = s - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) -CXXDEFS = -DF_CPU=$(F_CPU) - -# Compiler flag to set the C Standard level. -# c89   - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99   - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 -CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) - -CFLAGS = $(CDEBUG) $(CDEFS) $(INCLUDE) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) -CXXFLAGS = $(CDEFS) $(INCLUDE) -O$(OPT) -#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  -LDFLAGS =  - - -# Programming support using avrdude. Settings and variables. -AVRDUDE_PROGRAMMER = stk500 -AVRDUDE_PORT = $(PORT) -AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex -AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ -  -b $(UPLOAD_RATE) -q -V - -# Program settings -CC = avr-gcc -CXX = avr-g++ -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -MV = mv -f - -# Define all object files. -OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: build - -build: applet/$(TARGET).hex - -eep: applet/$(TARGET).eep -lss: applet/$(TARGET).lss  -sym: applet/$(TARGET).sym - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000  - - -coff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -extcoff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -.SUFFIXES: .elf .hex .eep .lss .sym .pde - -.elf.hex: -	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -.elf.eep: -	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -.elf.lss: -	$(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -.elf.sym: -	$(NM) -n $< > $@ - - -# Compile: create object files from C++ source files. -.cpp.o: $(HEADERS) -	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  - -# Compile: create object files from C source files. -.c.o: $(HEADERS) -	$(CC)  -c $(ALL_CFLAGS) $< -o $@  - - -# Compile: create assembler files from C source files. -.c.s: -	$(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -.S.o: -	$(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -applet/$(TARGET).cpp: $(TARGET).pde -	test -d applet || mkdir applet -	echo '#include "WProgram.h"' > applet/$(TARGET).cpp -	echo '#include "avr/interrupt.h"' >> applet/$(TARGET).cpp -	sed -n 's|^\(void .*)\).*|\1;|p' $(TARGET).pde | grep -v 'setup()' | \ -		grep -v 'loop()' >> applet/$(TARGET).cpp -	cat $(TARGET).pde >> applet/$(TARGET).cpp -	cat $(ARDUINO_SRC)/main.cxx >> applet/$(TARGET).cpp - -# Link: create ELF output file from object files. -applet/$(TARGET).elf: applet/$(TARGET).cpp $(OBJ) -	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) - -pd_close_serial: -	echo 'close;' | /Applications/Pd-extended.app/Contents/Resources/bin/pdsend 34567 || true - -# Program the device.   -upload: applet/$(TARGET).hex -	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - - -pd_test: build pd_close_serial upload - -# Target: clean project. -clean: -	$(REMOVE) -- applet/$(TARGET).hex applet/$(TARGET).eep \ -	applet/$(TARGET).cof applet/$(TARGET).elf $(TARGET).map \ -	applet/$(TARGET).sym applet/$(TARGET).lss applet/$(TARGET).cpp \ -	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) -	rmdir -- applet - -depend: -	if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ -	then \ -		sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ -			$(MAKEFILE).$$$$ && \ -		$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ -	fi -	echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ -		>> $(MAKEFILE); \ -	$(CC) -M -mmcu=$(MCU) $(CDEFS) $(INCLUDE) $(SRC) $(ASRC) >> $(MAKEFILE) - -.PHONY:	all build eep lss sym coff extcoff clean depend pd_close_serial pd_test - -# for emacs -etags: -	make etags_`uname -s` -	etags *.pde \ -		$(ARDUINO_SRC)/*.[ch] \ -		$(ARDUINO_SRC)/*.cpp \ -		$(ARDUINO_LIB_SRC)/*/*.[ch] \ -		$(ARDUINO_LIB_SRC)/*/*.cpp \ -		$(ARDUINO)/hardware/tools/avr/avr/include/avr/*.[ch] \ -		$(ARDUINO)/hardware/tools/avr/avr/include/*.[ch] - -etags_Darwin: -#	etags -a  - -etags_Linux: -#	etags -a /usr/include/*.h linux/input.h /usr/include/sys/*.h - -etags_MINGW: -#	etags -a /usr/include/*.h /usr/include/sys/*.h  - - - diff --git a/libraries/Firmata/examples/EchoString/EchoString.pde b/libraries/Firmata/examples/EchoString/EchoString.ino index e5c4e6f..5079697 100644 --- a/libraries/Firmata/examples/EchoString/EchoString.pde +++ b/libraries/Firmata/examples/EchoString/EchoString.ino @@ -1,3 +1,14 @@ +/* + * Firmata is a generic protocol for communicating with microcontrollers + * from software on a host computer. It is intended to work with + * any host computer software package. + * + * To download a host software package, please clink on the following link + * to open the download page in your default browser. + * + * http://firmata.org/wiki/Download + */ +  /* This sketch accepts strings and raw sysex messages and echos them back.   *   * This example code is in the public domain. @@ -14,12 +25,7 @@ void stringCallback(char *myString)  void sysexCallback(byte command, byte argc, byte*argv)  { -    Serial.write(START_SYSEX); -    Serial.write(command); -    for(byte i=0; i<argc; i++) { -        Serial.write(argv[i]); -    } -    Serial.write(END_SYSEX); +    Firmata.sendSysex(command, argc, argv);  }  void setup() diff --git a/libraries/Firmata/examples/EchoString/Makefile b/libraries/Firmata/examples/EchoString/Makefile deleted file mode 100644 index e968c0a..0000000 --- a/libraries/Firmata/examples/EchoString/Makefile +++ /dev/null @@ -1,263 +0,0 @@ -# Arduino makefile -# -# This makefile allows you to build sketches from the command line -# without the Arduino environment (or Java). -# -# The Arduino environment does preliminary processing on a sketch before -# compiling it.  If you're using this makefile instead, you'll need to do -# a few things differently: -# -#   - Give your program's file a .cpp extension (e.g. foo.cpp). -# -#   - Put this line at top of your code: #include <WProgram.h> -# -#   - Write prototypes for all your functions (or define them before you -#     call them).  A prototype declares the types of parameters a -#     function will take and what type of value it will return.  This -#     means that you can have a call to a function before the definition -#     of the function.  A function prototype looks like the first line of -#     the function, with a semi-colon at the end.  For example: -#     int digitalRead(int pin); -# -# Instructions for using the makefile: -# -#  1. Copy this file into the folder with your sketch. -# -#  2. Below, modify the line containing "TARGET" to refer to the name of -#     of your program's file without an extension (e.g. TARGET = foo). -# -#  3. Modify the line containg "ARDUINO" to point the directory that -#     contains the Arduino core (for normal Arduino installations, this -#     is the hardware/cores/arduino sub-directory). -# -#  4. Modify the line containing "PORT" to refer to the filename -#     representing the USB or serial connection to your Arduino board -#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file -#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*). -# -#  5. At the command line, change to the directory containing your -#     program's file and the makefile. -# -#  6. Type "make" and press enter to compile/verify your program. -# -#  7. Type "make upload", reset your Arduino board, and press enter  to -#     upload your program to the Arduino board. -# -# $Id: Makefile,v 1.7 2007/04/13 05:28:23 eighthave Exp $ - -PORT = /dev/tty.usbserial-* -TARGET := $(shell pwd | sed 's|.*/\(.*\)|\1|') -ARDUINO = /Applications/arduino -ARDUINO_SRC = $(ARDUINO)/hardware/cores/arduino -ARDUINO_LIB_SRC = $(ARDUINO)/hardware/libraries -INCLUDE = -I$(ARDUINO_SRC) -I$(ARDUINO)/hardware/tools/avr/avr/include \ -	-I$(ARDUINO_LIB_SRC)/EEPROM \ -	-I$(ARDUINO_LIB_SRC)/Firmata \ -	-I$(ARDUINO_LIB_SRC)/Servo \ -	-I$(ARDUINO_LIB_SRC) -SRC = $(wildcard $(ARDUINO_SRC)/*.c) -CXXSRC = applet/$(TARGET).cpp $(ARDUINO_SRC)/HardwareSerial.cpp \ -	$(ARDUINO_LIB_SRC)/EEPROM/EEPROM.cpp \ -	$(ARDUINO_LIB_SRC)/Firmata/Firmata.cpp \ -	$(ARDUINO_LIB_SRC)/Servo/Servo.cpp \ -	$(ARDUINO_SRC)/WMath.cpp -HEADERS = $(wildcard $(ARDUINO_SRC)/*.h) $(wildcard $(ARDUINO_LIB_SRC)/*/*.h) - -MCU = atmega168 -#MCU = atmega8 -F_CPU = 16000000 -FORMAT = ihex -UPLOAD_RATE = 19200 - -# Name of this Makefile (used for "make depend"). -MAKEFILE = Makefile - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs - -OPT = s - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) -CXXDEFS = -DF_CPU=$(F_CPU) - -# Compiler flag to set the C Standard level. -# c89   - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99   - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 -CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) - -CFLAGS = $(CDEBUG) $(CDEFS) $(INCLUDE) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) -CXXFLAGS = $(CDEFS) $(INCLUDE) -O$(OPT) -#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  -LDFLAGS =  - - -# Programming support using avrdude. Settings and variables. -AVRDUDE_PROGRAMMER = stk500 -AVRDUDE_PORT = $(PORT) -AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex -AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ -  -b $(UPLOAD_RATE) -q -V - -# Program settings -CC = avr-gcc -CXX = avr-g++ -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -MV = mv -f - -# Define all object files. -OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: build - -build: applet/$(TARGET).hex - -eep: applet/$(TARGET).eep -lss: applet/$(TARGET).lss  -sym: applet/$(TARGET).sym - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000  - - -coff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -extcoff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -.SUFFIXES: .elf .hex .eep .lss .sym .pde - -.elf.hex: -	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -.elf.eep: -	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -.elf.lss: -	$(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -.elf.sym: -	$(NM) -n $< > $@ - - -# Compile: create object files from C++ source files. -.cpp.o: $(HEADERS) -	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  - -# Compile: create object files from C source files. -.c.o: $(HEADERS) -	$(CC)  -c $(ALL_CFLAGS) $< -o $@  - - -# Compile: create assembler files from C source files. -.c.s: -	$(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -.S.o: -	$(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -applet/$(TARGET).cpp: $(TARGET).pde -	test -d applet || mkdir applet -	echo '#include "WProgram.h"' > applet/$(TARGET).cpp -	echo '#include "avr/interrupt.h"' >> applet/$(TARGET).cpp -	sed -n 's|^\(void .*)\).*|\1;|p' $(TARGET).pde | grep -v 'setup()' | \ -		grep -v 'loop()' >> applet/$(TARGET).cpp -	cat $(TARGET).pde >> applet/$(TARGET).cpp -	cat $(ARDUINO_SRC)/main.cxx >> applet/$(TARGET).cpp - -# Link: create ELF output file from object files. -applet/$(TARGET).elf: applet/$(TARGET).cpp $(OBJ) -	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) - -pd_close_serial: -	echo 'close;' | /Applications/Pd-extended.app/Contents/Resources/bin/pdsend 34567 || true - -# Program the device.   -upload: applet/$(TARGET).hex -	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - - -pd_test: build pd_close_serial upload - -# Target: clean project. -clean: -	$(REMOVE) -- applet/$(TARGET).hex applet/$(TARGET).eep \ -	applet/$(TARGET).cof applet/$(TARGET).elf $(TARGET).map \ -	applet/$(TARGET).sym applet/$(TARGET).lss applet/$(TARGET).cpp \ -	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) -	rmdir -- applet - -depend: -	if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ -	then \ -		sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ -			$(MAKEFILE).$$$$ && \ -		$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ -	fi -	echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ -		>> $(MAKEFILE); \ -	$(CC) -M -mmcu=$(MCU) $(CDEFS) $(INCLUDE) $(SRC) $(ASRC) >> $(MAKEFILE) - -.PHONY:	all build eep lss sym coff extcoff clean depend pd_close_serial pd_test - -# for emacs -etags: -	make etags_`uname -s` -	etags *.pde \ -		$(ARDUINO_SRC)/*.[ch] \ -		$(ARDUINO_SRC)/*.cpp \ -		$(ARDUINO_LIB_SRC)/*/*.[ch] \ -		$(ARDUINO_LIB_SRC)/*/*.cpp \ -		$(ARDUINO)/hardware/tools/avr/avr/include/avr/*.[ch] \ -		$(ARDUINO)/hardware/tools/avr/avr/include/*.[ch] - -etags_Darwin: -#	etags -a  - -etags_Linux: -#	etags -a /usr/include/*.h linux/input.h /usr/include/sys/*.h - -etags_MINGW: -#	etags -a /usr/include/*.h /usr/include/sys/*.h  - - - diff --git a/libraries/Firmata/examples/I2CFirmata/I2CFirmata.pde b/libraries/Firmata/examples/I2CFirmata/I2CFirmata.ino index 11202e9..1da8963 100644 --- a/libraries/Firmata/examples/I2CFirmata/I2CFirmata.pde +++ b/libraries/Firmata/examples/I2CFirmata/I2CFirmata.ino @@ -1,4 +1,15 @@  /* + * 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 + */ + +/*   Copyright (C) 2009 Jeff Hoefs.  All rights reserved.   Copyright (C) 2009 Shigeru Kobayashi.  All rights reserved. @@ -48,7 +59,7 @@ void readAndReportData(byte address, int theRegister, byte numBytes)  {    if (theRegister != REGISTER_NOT_SPECIFIED) {      Wire.beginTransmission(address); -    Wire.send((byte)theRegister); +    Wire.write((byte)theRegister);      Wire.endTransmission();      delayMicroseconds(i2cReadDelayTime);  // delay is necessary for some devices such as WiiNunchuck    }  @@ -63,7 +74,7 @@ void readAndReportData(byte address, int theRegister, byte numBytes)      i2cRxData[0] = address;      i2cRxData[1] = theRegister;      for (int i = 0; i < numBytes; i++) { -      i2cRxData[2 + i] = Wire.receive(); +      i2cRxData[2 + i] = Wire.read();      }      // send slave address, register and received bytes      Firmata.sendSysex(I2C_REPLY, numBytes + 2, i2cRxData); @@ -95,7 +106,7 @@ void sysexCallback(byte command, byte argc, byte *argv)        Wire.beginTransmission(slaveAddress);        for (byte i = 2; i < argc; i += 2) {          data = argv[i] + (argv[i + 1] << 7); -        Wire.send(data); +        Wire.write(data);        }        Wire.endTransmission();        delayMicroseconds(70); // TODO is this needed? diff --git a/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde b/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.ino index 56a47ac..d306c70 100644 --- a/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde +++ b/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.ino @@ -1,4 +1,15 @@  /* + * 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 + */ + +/*    Copyright (C) 2006-2008 Hans-Christoph Steiner.  All rights reserved.    This library is free software; you can redistribute it and/or diff --git a/libraries/Firmata/examples/ServoFirmata/Makefile b/libraries/Firmata/examples/ServoFirmata/Makefile deleted file mode 100644 index e968c0a..0000000 --- a/libraries/Firmata/examples/ServoFirmata/Makefile +++ /dev/null @@ -1,263 +0,0 @@ -# Arduino makefile -# -# This makefile allows you to build sketches from the command line -# without the Arduino environment (or Java). -# -# The Arduino environment does preliminary processing on a sketch before -# compiling it.  If you're using this makefile instead, you'll need to do -# a few things differently: -# -#   - Give your program's file a .cpp extension (e.g. foo.cpp). -# -#   - Put this line at top of your code: #include <WProgram.h> -# -#   - Write prototypes for all your functions (or define them before you -#     call them).  A prototype declares the types of parameters a -#     function will take and what type of value it will return.  This -#     means that you can have a call to a function before the definition -#     of the function.  A function prototype looks like the first line of -#     the function, with a semi-colon at the end.  For example: -#     int digitalRead(int pin); -# -# Instructions for using the makefile: -# -#  1. Copy this file into the folder with your sketch. -# -#  2. Below, modify the line containing "TARGET" to refer to the name of -#     of your program's file without an extension (e.g. TARGET = foo). -# -#  3. Modify the line containg "ARDUINO" to point the directory that -#     contains the Arduino core (for normal Arduino installations, this -#     is the hardware/cores/arduino sub-directory). -# -#  4. Modify the line containing "PORT" to refer to the filename -#     representing the USB or serial connection to your Arduino board -#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file -#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*). -# -#  5. At the command line, change to the directory containing your -#     program's file and the makefile. -# -#  6. Type "make" and press enter to compile/verify your program. -# -#  7. Type "make upload", reset your Arduino board, and press enter  to -#     upload your program to the Arduino board. -# -# $Id: Makefile,v 1.7 2007/04/13 05:28:23 eighthave Exp $ - -PORT = /dev/tty.usbserial-* -TARGET := $(shell pwd | sed 's|.*/\(.*\)|\1|') -ARDUINO = /Applications/arduino -ARDUINO_SRC = $(ARDUINO)/hardware/cores/arduino -ARDUINO_LIB_SRC = $(ARDUINO)/hardware/libraries -INCLUDE = -I$(ARDUINO_SRC) -I$(ARDUINO)/hardware/tools/avr/avr/include \ -	-I$(ARDUINO_LIB_SRC)/EEPROM \ -	-I$(ARDUINO_LIB_SRC)/Firmata \ -	-I$(ARDUINO_LIB_SRC)/Servo \ -	-I$(ARDUINO_LIB_SRC) -SRC = $(wildcard $(ARDUINO_SRC)/*.c) -CXXSRC = applet/$(TARGET).cpp $(ARDUINO_SRC)/HardwareSerial.cpp \ -	$(ARDUINO_LIB_SRC)/EEPROM/EEPROM.cpp \ -	$(ARDUINO_LIB_SRC)/Firmata/Firmata.cpp \ -	$(ARDUINO_LIB_SRC)/Servo/Servo.cpp \ -	$(ARDUINO_SRC)/WMath.cpp -HEADERS = $(wildcard $(ARDUINO_SRC)/*.h) $(wildcard $(ARDUINO_LIB_SRC)/*/*.h) - -MCU = atmega168 -#MCU = atmega8 -F_CPU = 16000000 -FORMAT = ihex -UPLOAD_RATE = 19200 - -# Name of this Makefile (used for "make depend"). -MAKEFILE = Makefile - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs - -OPT = s - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) -CXXDEFS = -DF_CPU=$(F_CPU) - -# Compiler flag to set the C Standard level. -# c89   - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99   - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 -CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) - -CFLAGS = $(CDEBUG) $(CDEFS) $(INCLUDE) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) -CXXFLAGS = $(CDEFS) $(INCLUDE) -O$(OPT) -#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  -LDFLAGS =  - - -# Programming support using avrdude. Settings and variables. -AVRDUDE_PROGRAMMER = stk500 -AVRDUDE_PORT = $(PORT) -AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex -AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ -  -b $(UPLOAD_RATE) -q -V - -# Program settings -CC = avr-gcc -CXX = avr-g++ -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -MV = mv -f - -# Define all object files. -OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: build - -build: applet/$(TARGET).hex - -eep: applet/$(TARGET).eep -lss: applet/$(TARGET).lss  -sym: applet/$(TARGET).sym - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000  - - -coff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -extcoff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -.SUFFIXES: .elf .hex .eep .lss .sym .pde - -.elf.hex: -	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -.elf.eep: -	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -.elf.lss: -	$(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -.elf.sym: -	$(NM) -n $< > $@ - - -# Compile: create object files from C++ source files. -.cpp.o: $(HEADERS) -	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  - -# Compile: create object files from C source files. -.c.o: $(HEADERS) -	$(CC)  -c $(ALL_CFLAGS) $< -o $@  - - -# Compile: create assembler files from C source files. -.c.s: -	$(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -.S.o: -	$(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -applet/$(TARGET).cpp: $(TARGET).pde -	test -d applet || mkdir applet -	echo '#include "WProgram.h"' > applet/$(TARGET).cpp -	echo '#include "avr/interrupt.h"' >> applet/$(TARGET).cpp -	sed -n 's|^\(void .*)\).*|\1;|p' $(TARGET).pde | grep -v 'setup()' | \ -		grep -v 'loop()' >> applet/$(TARGET).cpp -	cat $(TARGET).pde >> applet/$(TARGET).cpp -	cat $(ARDUINO_SRC)/main.cxx >> applet/$(TARGET).cpp - -# Link: create ELF output file from object files. -applet/$(TARGET).elf: applet/$(TARGET).cpp $(OBJ) -	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) - -pd_close_serial: -	echo 'close;' | /Applications/Pd-extended.app/Contents/Resources/bin/pdsend 34567 || true - -# Program the device.   -upload: applet/$(TARGET).hex -	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - - -pd_test: build pd_close_serial upload - -# Target: clean project. -clean: -	$(REMOVE) -- applet/$(TARGET).hex applet/$(TARGET).eep \ -	applet/$(TARGET).cof applet/$(TARGET).elf $(TARGET).map \ -	applet/$(TARGET).sym applet/$(TARGET).lss applet/$(TARGET).cpp \ -	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) -	rmdir -- applet - -depend: -	if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ -	then \ -		sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ -			$(MAKEFILE).$$$$ && \ -		$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ -	fi -	echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ -		>> $(MAKEFILE); \ -	$(CC) -M -mmcu=$(MCU) $(CDEFS) $(INCLUDE) $(SRC) $(ASRC) >> $(MAKEFILE) - -.PHONY:	all build eep lss sym coff extcoff clean depend pd_close_serial pd_test - -# for emacs -etags: -	make etags_`uname -s` -	etags *.pde \ -		$(ARDUINO_SRC)/*.[ch] \ -		$(ARDUINO_SRC)/*.cpp \ -		$(ARDUINO_LIB_SRC)/*/*.[ch] \ -		$(ARDUINO_LIB_SRC)/*/*.cpp \ -		$(ARDUINO)/hardware/tools/avr/avr/include/avr/*.[ch] \ -		$(ARDUINO)/hardware/tools/avr/avr/include/*.[ch] - -etags_Darwin: -#	etags -a  - -etags_Linux: -#	etags -a /usr/include/*.h linux/input.h /usr/include/sys/*.h - -etags_MINGW: -#	etags -a /usr/include/*.h /usr/include/sys/*.h  - - - diff --git a/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde b/libraries/Firmata/examples/ServoFirmata/ServoFirmata.ino index 6f78ccd..cdcfff0 100644 --- a/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde +++ b/libraries/Firmata/examples/ServoFirmata/ServoFirmata.ino @@ -1,3 +1,14 @@ +/* + * 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 firmware supports as many servos as possible using the Servo library    * included in Arduino 0017   * diff --git a/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile b/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile deleted file mode 100644 index e968c0a..0000000 --- a/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile +++ /dev/null @@ -1,263 +0,0 @@ -# Arduino makefile -# -# This makefile allows you to build sketches from the command line -# without the Arduino environment (or Java). -# -# The Arduino environment does preliminary processing on a sketch before -# compiling it.  If you're using this makefile instead, you'll need to do -# a few things differently: -# -#   - Give your program's file a .cpp extension (e.g. foo.cpp). -# -#   - Put this line at top of your code: #include <WProgram.h> -# -#   - Write prototypes for all your functions (or define them before you -#     call them).  A prototype declares the types of parameters a -#     function will take and what type of value it will return.  This -#     means that you can have a call to a function before the definition -#     of the function.  A function prototype looks like the first line of -#     the function, with a semi-colon at the end.  For example: -#     int digitalRead(int pin); -# -# Instructions for using the makefile: -# -#  1. Copy this file into the folder with your sketch. -# -#  2. Below, modify the line containing "TARGET" to refer to the name of -#     of your program's file without an extension (e.g. TARGET = foo). -# -#  3. Modify the line containg "ARDUINO" to point the directory that -#     contains the Arduino core (for normal Arduino installations, this -#     is the hardware/cores/arduino sub-directory). -# -#  4. Modify the line containing "PORT" to refer to the filename -#     representing the USB or serial connection to your Arduino board -#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file -#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*). -# -#  5. At the command line, change to the directory containing your -#     program's file and the makefile. -# -#  6. Type "make" and press enter to compile/verify your program. -# -#  7. Type "make upload", reset your Arduino board, and press enter  to -#     upload your program to the Arduino board. -# -# $Id: Makefile,v 1.7 2007/04/13 05:28:23 eighthave Exp $ - -PORT = /dev/tty.usbserial-* -TARGET := $(shell pwd | sed 's|.*/\(.*\)|\1|') -ARDUINO = /Applications/arduino -ARDUINO_SRC = $(ARDUINO)/hardware/cores/arduino -ARDUINO_LIB_SRC = $(ARDUINO)/hardware/libraries -INCLUDE = -I$(ARDUINO_SRC) -I$(ARDUINO)/hardware/tools/avr/avr/include \ -	-I$(ARDUINO_LIB_SRC)/EEPROM \ -	-I$(ARDUINO_LIB_SRC)/Firmata \ -	-I$(ARDUINO_LIB_SRC)/Servo \ -	-I$(ARDUINO_LIB_SRC) -SRC = $(wildcard $(ARDUINO_SRC)/*.c) -CXXSRC = applet/$(TARGET).cpp $(ARDUINO_SRC)/HardwareSerial.cpp \ -	$(ARDUINO_LIB_SRC)/EEPROM/EEPROM.cpp \ -	$(ARDUINO_LIB_SRC)/Firmata/Firmata.cpp \ -	$(ARDUINO_LIB_SRC)/Servo/Servo.cpp \ -	$(ARDUINO_SRC)/WMath.cpp -HEADERS = $(wildcard $(ARDUINO_SRC)/*.h) $(wildcard $(ARDUINO_LIB_SRC)/*/*.h) - -MCU = atmega168 -#MCU = atmega8 -F_CPU = 16000000 -FORMAT = ihex -UPLOAD_RATE = 19200 - -# Name of this Makefile (used for "make depend"). -MAKEFILE = Makefile - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs - -OPT = s - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) -CXXDEFS = -DF_CPU=$(F_CPU) - -# Compiler flag to set the C Standard level. -# c89   - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99   - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 -CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) - -CFLAGS = $(CDEBUG) $(CDEFS) $(INCLUDE) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) -CXXFLAGS = $(CDEFS) $(INCLUDE) -O$(OPT) -#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  -LDFLAGS =  - - -# Programming support using avrdude. Settings and variables. -AVRDUDE_PROGRAMMER = stk500 -AVRDUDE_PORT = $(PORT) -AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex -AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ -  -b $(UPLOAD_RATE) -q -V - -# Program settings -CC = avr-gcc -CXX = avr-g++ -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -MV = mv -f - -# Define all object files. -OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: build - -build: applet/$(TARGET).hex - -eep: applet/$(TARGET).eep -lss: applet/$(TARGET).lss  -sym: applet/$(TARGET).sym - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000  - - -coff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -extcoff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -.SUFFIXES: .elf .hex .eep .lss .sym .pde - -.elf.hex: -	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -.elf.eep: -	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -.elf.lss: -	$(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -.elf.sym: -	$(NM) -n $< > $@ - - -# Compile: create object files from C++ source files. -.cpp.o: $(HEADERS) -	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  - -# Compile: create object files from C source files. -.c.o: $(HEADERS) -	$(CC)  -c $(ALL_CFLAGS) $< -o $@  - - -# Compile: create assembler files from C source files. -.c.s: -	$(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -.S.o: -	$(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -applet/$(TARGET).cpp: $(TARGET).pde -	test -d applet || mkdir applet -	echo '#include "WProgram.h"' > applet/$(TARGET).cpp -	echo '#include "avr/interrupt.h"' >> applet/$(TARGET).cpp -	sed -n 's|^\(void .*)\).*|\1;|p' $(TARGET).pde | grep -v 'setup()' | \ -		grep -v 'loop()' >> applet/$(TARGET).cpp -	cat $(TARGET).pde >> applet/$(TARGET).cpp -	cat $(ARDUINO_SRC)/main.cxx >> applet/$(TARGET).cpp - -# Link: create ELF output file from object files. -applet/$(TARGET).elf: applet/$(TARGET).cpp $(OBJ) -	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) - -pd_close_serial: -	echo 'close;' | /Applications/Pd-extended.app/Contents/Resources/bin/pdsend 34567 || true - -# Program the device.   -upload: applet/$(TARGET).hex -	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - - -pd_test: build pd_close_serial upload - -# Target: clean project. -clean: -	$(REMOVE) -- applet/$(TARGET).hex applet/$(TARGET).eep \ -	applet/$(TARGET).cof applet/$(TARGET).elf $(TARGET).map \ -	applet/$(TARGET).sym applet/$(TARGET).lss applet/$(TARGET).cpp \ -	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) -	rmdir -- applet - -depend: -	if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ -	then \ -		sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ -			$(MAKEFILE).$$$$ && \ -		$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ -	fi -	echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ -		>> $(MAKEFILE); \ -	$(CC) -M -mmcu=$(MCU) $(CDEFS) $(INCLUDE) $(SRC) $(ASRC) >> $(MAKEFILE) - -.PHONY:	all build eep lss sym coff extcoff clean depend pd_close_serial pd_test - -# for emacs -etags: -	make etags_`uname -s` -	etags *.pde \ -		$(ARDUINO_SRC)/*.[ch] \ -		$(ARDUINO_SRC)/*.cpp \ -		$(ARDUINO_LIB_SRC)/*/*.[ch] \ -		$(ARDUINO_LIB_SRC)/*/*.cpp \ -		$(ARDUINO)/hardware/tools/avr/avr/include/avr/*.[ch] \ -		$(ARDUINO)/hardware/tools/avr/avr/include/*.[ch] - -etags_Darwin: -#	etags -a  - -etags_Linux: -#	etags -a /usr/include/*.h linux/input.h /usr/include/sys/*.h - -etags_MINGW: -#	etags -a /usr/include/*.h /usr/include/sys/*.h  - - - diff --git a/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde b/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.ino index b505b33..44ea91e 100644 --- a/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde +++ b/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.ino @@ -1,3 +1,14 @@ +/* + * 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 + */ +  /* Supports as many analog inputs and analog PWM outputs as possible.   *   * This example code is in the public domain. diff --git a/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile b/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile deleted file mode 100644 index e968c0a..0000000 --- a/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile +++ /dev/null @@ -1,263 +0,0 @@ -# Arduino makefile -# -# This makefile allows you to build sketches from the command line -# without the Arduino environment (or Java). -# -# The Arduino environment does preliminary processing on a sketch before -# compiling it.  If you're using this makefile instead, you'll need to do -# a few things differently: -# -#   - Give your program's file a .cpp extension (e.g. foo.cpp). -# -#   - Put this line at top of your code: #include <WProgram.h> -# -#   - Write prototypes for all your functions (or define them before you -#     call them).  A prototype declares the types of parameters a -#     function will take and what type of value it will return.  This -#     means that you can have a call to a function before the definition -#     of the function.  A function prototype looks like the first line of -#     the function, with a semi-colon at the end.  For example: -#     int digitalRead(int pin); -# -# Instructions for using the makefile: -# -#  1. Copy this file into the folder with your sketch. -# -#  2. Below, modify the line containing "TARGET" to refer to the name of -#     of your program's file without an extension (e.g. TARGET = foo). -# -#  3. Modify the line containg "ARDUINO" to point the directory that -#     contains the Arduino core (for normal Arduino installations, this -#     is the hardware/cores/arduino sub-directory). -# -#  4. Modify the line containing "PORT" to refer to the filename -#     representing the USB or serial connection to your Arduino board -#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file -#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*). -# -#  5. At the command line, change to the directory containing your -#     program's file and the makefile. -# -#  6. Type "make" and press enter to compile/verify your program. -# -#  7. Type "make upload", reset your Arduino board, and press enter  to -#     upload your program to the Arduino board. -# -# $Id: Makefile,v 1.7 2007/04/13 05:28:23 eighthave Exp $ - -PORT = /dev/tty.usbserial-* -TARGET := $(shell pwd | sed 's|.*/\(.*\)|\1|') -ARDUINO = /Applications/arduino -ARDUINO_SRC = $(ARDUINO)/hardware/cores/arduino -ARDUINO_LIB_SRC = $(ARDUINO)/hardware/libraries -INCLUDE = -I$(ARDUINO_SRC) -I$(ARDUINO)/hardware/tools/avr/avr/include \ -	-I$(ARDUINO_LIB_SRC)/EEPROM \ -	-I$(ARDUINO_LIB_SRC)/Firmata \ -	-I$(ARDUINO_LIB_SRC)/Servo \ -	-I$(ARDUINO_LIB_SRC) -SRC = $(wildcard $(ARDUINO_SRC)/*.c) -CXXSRC = applet/$(TARGET).cpp $(ARDUINO_SRC)/HardwareSerial.cpp \ -	$(ARDUINO_LIB_SRC)/EEPROM/EEPROM.cpp \ -	$(ARDUINO_LIB_SRC)/Firmata/Firmata.cpp \ -	$(ARDUINO_LIB_SRC)/Servo/Servo.cpp \ -	$(ARDUINO_SRC)/WMath.cpp -HEADERS = $(wildcard $(ARDUINO_SRC)/*.h) $(wildcard $(ARDUINO_LIB_SRC)/*/*.h) - -MCU = atmega168 -#MCU = atmega8 -F_CPU = 16000000 -FORMAT = ihex -UPLOAD_RATE = 19200 - -# Name of this Makefile (used for "make depend"). -MAKEFILE = Makefile - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs - -OPT = s - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) -CXXDEFS = -DF_CPU=$(F_CPU) - -# Compiler flag to set the C Standard level. -# c89   - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99   - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 -CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) - -CFLAGS = $(CDEBUG) $(CDEFS) $(INCLUDE) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) -CXXFLAGS = $(CDEFS) $(INCLUDE) -O$(OPT) -#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  -LDFLAGS =  - - -# Programming support using avrdude. Settings and variables. -AVRDUDE_PROGRAMMER = stk500 -AVRDUDE_PORT = $(PORT) -AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex -AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ -  -b $(UPLOAD_RATE) -q -V - -# Program settings -CC = avr-gcc -CXX = avr-g++ -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -MV = mv -f - -# Define all object files. -OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: build - -build: applet/$(TARGET).hex - -eep: applet/$(TARGET).eep -lss: applet/$(TARGET).lss  -sym: applet/$(TARGET).sym - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000  - - -coff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -extcoff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -.SUFFIXES: .elf .hex .eep .lss .sym .pde - -.elf.hex: -	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -.elf.eep: -	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -.elf.lss: -	$(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -.elf.sym: -	$(NM) -n $< > $@ - - -# Compile: create object files from C++ source files. -.cpp.o: $(HEADERS) -	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  - -# Compile: create object files from C source files. -.c.o: $(HEADERS) -	$(CC)  -c $(ALL_CFLAGS) $< -o $@  - - -# Compile: create assembler files from C source files. -.c.s: -	$(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -.S.o: -	$(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -applet/$(TARGET).cpp: $(TARGET).pde -	test -d applet || mkdir applet -	echo '#include "WProgram.h"' > applet/$(TARGET).cpp -	echo '#include "avr/interrupt.h"' >> applet/$(TARGET).cpp -	sed -n 's|^\(void .*)\).*|\1;|p' $(TARGET).pde | grep -v 'setup()' | \ -		grep -v 'loop()' >> applet/$(TARGET).cpp -	cat $(TARGET).pde >> applet/$(TARGET).cpp -	cat $(ARDUINO_SRC)/main.cxx >> applet/$(TARGET).cpp - -# Link: create ELF output file from object files. -applet/$(TARGET).elf: applet/$(TARGET).cpp $(OBJ) -	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) - -pd_close_serial: -	echo 'close;' | /Applications/Pd-extended.app/Contents/Resources/bin/pdsend 34567 || true - -# Program the device.   -upload: applet/$(TARGET).hex -	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - - -pd_test: build pd_close_serial upload - -# Target: clean project. -clean: -	$(REMOVE) -- applet/$(TARGET).hex applet/$(TARGET).eep \ -	applet/$(TARGET).cof applet/$(TARGET).elf $(TARGET).map \ -	applet/$(TARGET).sym applet/$(TARGET).lss applet/$(TARGET).cpp \ -	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) -	rmdir -- applet - -depend: -	if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ -	then \ -		sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ -			$(MAKEFILE).$$$$ && \ -		$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ -	fi -	echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ -		>> $(MAKEFILE); \ -	$(CC) -M -mmcu=$(MCU) $(CDEFS) $(INCLUDE) $(SRC) $(ASRC) >> $(MAKEFILE) - -.PHONY:	all build eep lss sym coff extcoff clean depend pd_close_serial pd_test - -# for emacs -etags: -	make etags_`uname -s` -	etags *.pde \ -		$(ARDUINO_SRC)/*.[ch] \ -		$(ARDUINO_SRC)/*.cpp \ -		$(ARDUINO_LIB_SRC)/*/*.[ch] \ -		$(ARDUINO_LIB_SRC)/*/*.cpp \ -		$(ARDUINO)/hardware/tools/avr/avr/include/avr/*.[ch] \ -		$(ARDUINO)/hardware/tools/avr/avr/include/*.[ch] - -etags_Darwin: -#	etags -a  - -etags_Linux: -#	etags -a /usr/include/*.h linux/input.h /usr/include/sys/*.h - -etags_MINGW: -#	etags -a /usr/include/*.h /usr/include/sys/*.h  - - - diff --git a/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde b/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.ino index 64b566e..a0d764f 100644 --- a/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde +++ b/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.ino @@ -1,3 +1,14 @@ +/* + * 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 + */ +  /* Supports as many digital inputs and outputs as possible.   *   * This example code is in the public domain. @@ -52,7 +63,7 @@ void loop()      byte i;      for (i=0; i<TOTAL_PORTS; i++) { -        outputPort(i, readPort(i)); +        outputPort(i, readPort(i, 0xff));      }      while(Firmata.available()) { diff --git a/libraries/Firmata/examples/StandardFirmata/Makefile b/libraries/Firmata/examples/StandardFirmata/Makefile deleted file mode 100644 index 835187a..0000000 --- a/libraries/Firmata/examples/StandardFirmata/Makefile +++ /dev/null @@ -1,273 +0,0 @@ -# Arduino makefile -# -# This makefile allows you to build sketches from the command line -# without the Arduino environment (or Java). -# -# The Arduino environment does preliminary processing on a sketch before -# compiling it.  If you're using this makefile instead, you'll need to do -# a few things differently: -# -#   - Give your program's file a .cpp extension (e.g. foo.cpp). -# -#   - Put this line at top of your code: #include <WProgram.h> -# -#   - Write prototypes for all your functions (or define them before you -#     call them).  A prototype declares the types of parameters a -#     function will take and what type of value it will return.  This -#     means that you can have a call to a function before the definition -#     of the function.  A function prototype looks like the first line of -#     the function, with a semi-colon at the end.  For example: -#     int digitalRead(int pin); -# -# Instructions for using the makefile: -# -#  1. Copy this file into the folder with your sketch. -# -#  2. Below, modify the line containing "TARGET" to refer to the name of -#     of your program's file without an extension (e.g. TARGET = foo). -# -#  3. Modify the line containg "ARDUINO" to point the directory that -#     contains the Arduino core (for normal Arduino installations, this -#     is the hardware/cores/arduino sub-directory). -# -#  4. Modify the line containing "PORT" to refer to the filename -#     representing the USB or serial connection to your Arduino board -#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file -#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*). -# -#  5. At the command line, change to the directory containing your -#     program's file and the makefile. -# -#  6. Type "make" and press enter to compile/verify your program. -# -#  7. Type "make upload", reset your Arduino board, and press enter  to -#     upload your program to the Arduino board. -# -# $Id: Makefile,v 1.7 2007/04/13 05:28:23 eighthave Exp $ - -PORT = /dev/tty.usbserial-* -TARGET := $(shell pwd | sed 's|.*/\(.*\)|\1|') -ARDUINO = /Applications/arduino -ARDUINO_SRC = $(ARDUINO)/hardware/cores/arduino -ARDUINO_LIB_SRC = $(ARDUINO)/hardware/libraries -ARDUINO_TOOLS = $(ARDUINO)/hardware/tools -INCLUDE = -I$(ARDUINO_SRC) -I$(ARDUINO)/hardware/tools/avr/avr/include \ -	-I$(ARDUINO_LIB_SRC)/EEPROM \ -	-I$(ARDUINO_LIB_SRC)/Firmata \ -	-I$(ARDUINO_LIB_SRC)/Matrix \ -	-I$(ARDUINO_LIB_SRC)/Servo \ -	-I$(ARDUINO_LIB_SRC)/Wire \ -	-I$(ARDUINO_LIB_SRC) -SRC = $(wildcard $(ARDUINO_SRC)/*.c) -CXXSRC = applet/$(TARGET).cpp $(ARDUINO_SRC)/HardwareSerial.cpp \ -	$(ARDUINO_LIB_SRC)/EEPROM/EEPROM.cpp \ -	$(ARDUINO_LIB_SRC)/Firmata/Firmata.cpp \ -	$(ARDUINO_LIB_SRC)/Servo/Servo.cpp \ -	$(ARDUINO_SRC)/Print.cpp \ -	$(ARDUINO_SRC)/WMath.cpp -HEADERS = $(wildcard $(ARDUINO_SRC)/*.h) $(wildcard $(ARDUINO_LIB_SRC)/*/*.h) - -MCU = atmega168 -#MCU = atmega8 -F_CPU = 16000000 -FORMAT = ihex -UPLOAD_RATE = 19200 - -# Name of this Makefile (used for "make depend"). -MAKEFILE = Makefile - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs - -OPT = s - -# Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU) -CXXDEFS = -DF_CPU=$(F_CPU) - -# Compiler flag to set the C Standard level. -# c89   - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99   - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 -CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) - -CFLAGS = $(CDEBUG) $(CDEFS) $(INCLUDE) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) -CXXFLAGS = $(CDEFS) $(INCLUDE) -O$(OPT) -#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  -LDFLAGS =  - - -# Programming support using avrdude. Settings and variables. -AVRDUDE_PROGRAMMER = stk500 -AVRDUDE_PORT = $(PORT) -AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex -AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ -  -b $(UPLOAD_RATE) -q -V - -# Program settings -ARDUINO_AVR_BIN = $(ARDUINO_TOOLS)/avr/bin -CC = $(ARDUINO_AVR_BIN)/avr-gcc  -CXX = $(ARDUINO_AVR_BIN)/avr-g++ -OBJCOPY = $(ARDUINO_AVR_BIN)/avr-objcopy -OBJDUMP = $(ARDUINO_AVR_BIN)/avr-objdump -SIZE = $(ARDUINO_AVR_BIN)/avr-size -NM = $(ARDUINO_AVR_BIN)/avr-nm -#AVRDUDE = $(ARDUINO_AVR_BIN)/avrdude -AVRDUDE = avrdude -REMOVE = rm -f -MV = mv -f - -# Define all object files. -OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst) - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) -ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: build - -build: applet/$(TARGET).hex - -eep: applet/$(TARGET).eep -lss: applet/$(TARGET).lss  -sym: applet/$(TARGET).sym - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000  - - -coff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -extcoff: applet/$(TARGET).elf -	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf applet/$(TARGET).cof - - -.SUFFIXES: .elf .hex .eep .lss .sym .pde - -.elf.hex: -	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -.elf.eep: -	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -.elf.lss: -	$(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -.elf.sym: -	$(NM) -n $< > $@ - - -# Compile: create object files from C++ source files. -.cpp.o: $(HEADERS) -	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  - -# Compile: create object files from C source files. -.c.o: $(HEADERS) -	$(CC)  -c $(ALL_CFLAGS) $< -o $@  - - -# Compile: create assembler files from C source files. -.c.s: -	$(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -.S.o: -	$(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -applet/$(TARGET).cpp: $(TARGET).pde -	test -d applet || mkdir applet -	echo '#include "WProgram.h"' > applet/$(TARGET).cpp -	echo '#include "avr/interrupt.h"' >> applet/$(TARGET).cpp -	sed -n 's|^\(void .*)\).*|\1;|p' $(TARGET).pde | grep -v 'setup()' | \ -		grep -v 'loop()' >> applet/$(TARGET).cpp -	cat $(TARGET).pde >> applet/$(TARGET).cpp -	cat $(ARDUINO_SRC)/main.cxx >> applet/$(TARGET).cpp - -# Link: create ELF output file from object files. -applet/$(TARGET).elf: applet/$(TARGET).cpp $(OBJ) -	$(CC) $(ALL_CFLAGS) $(OBJ) -lm --output $@ $(LDFLAGS) -#	$(CC) $(ALL_CFLAGS) $(OBJ) $(ARDUINO_TOOLS)/avr/avr/lib/avr5/crtm168.o --output $@ $(LDFLAGS) - -pd_close_serial: -	echo 'close;' | /Applications/Pd-extended.app/Contents/Resources/bin/pdsend 34567 || true - -# Program the device.   -upload: applet/$(TARGET).hex -	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - - -pd_test: build pd_close_serial upload - -# Target: clean project. -clean: -	$(REMOVE) -- applet/$(TARGET).hex applet/$(TARGET).eep \ -	applet/$(TARGET).cof applet/$(TARGET).elf $(TARGET).map \ -	applet/$(TARGET).sym applet/$(TARGET).lss applet/$(TARGET).cpp \ -	$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d) -	rmdir -- applet - -depend: -	if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \ -	then \ -		sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \ -			$(MAKEFILE).$$$$ && \ -		$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \ -	fi -	echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \ -		>> $(MAKEFILE); \ -	$(CC) -M -mmcu=$(MCU) $(CDEFS) $(INCLUDE) $(SRC) $(ASRC) >> $(MAKEFILE) - -.PHONY:	all build eep lss sym coff extcoff clean depend pd_close_serial pd_test - -# for emacs -etags: -	make etags_`uname -s` -	etags *.pde \ -		$(ARDUINO_SRC)/*.[ch] \ -		$(ARDUINO_SRC)/*.cpp \ -		$(ARDUINO_LIB_SRC)/*/*.[ch] \ -		$(ARDUINO_LIB_SRC)/*/*.cpp \ -		$(ARDUINO)/hardware/tools/avr/avr/include/avr/*.[ch] \ -		$(ARDUINO)/hardware/tools/avr/avr/include/*.[ch] - -etags_Darwin: -#	etags -a  - -etags_Linux: -#	etags -a /usr/include/*.h linux/input.h /usr/include/sys/*.h - -etags_MINGW: -#	etags -a /usr/include/*.h /usr/include/sys/*.h  - - -path: -	echo $(PATH) -	echo $$PATH - diff --git a/libraries/Firmata/examples/StandardFirmata/StandardFirmata.pde b/libraries/Firmata/examples/StandardFirmata/StandardFirmata.ino index cd43366..1a987ee 100644 --- a/libraries/Firmata/examples/StandardFirmata/StandardFirmata.pde +++ b/libraries/Firmata/examples/StandardFirmata/StandardFirmata.ino @@ -1,5 +1,19 @@  /* + * 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 + */ + +/*    Copyright (C) 2006-2008 Hans-Christoph Steiner.  All rights reserved. +  Copyright (C) 2010-2011 Paul Stoffregen.  All rights reserved. +  Copyright (C) 2009 Shigeru Kobayashi.  All rights reserved. +  Copyright (C) 2009-2011 Jeff Hoefs.  All rights reserved.    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public @@ -16,8 +30,22 @@   */  #include <Servo.h> +#include <Wire.h>  #include <Firmata.h> +// move the following defines to Firmata.h? +#define I2C_WRITE B00000000 +#define I2C_READ B00001000 +#define I2C_READ_CONTINUOUSLY B00010000 +#define I2C_STOP_READING B00011000 +#define I2C_READ_WRITE_MODE_MASK B00011000 +#define I2C_10BIT_ADDRESS_MODE_MASK B00100000 + +#define MAX_QUERIES 8 +#define MINIMUM_SAMPLING_INTERVAL 10 + +#define REGISTER_NOT_SPECIFIED -1 +  /*==============================================================================   * GLOBAL VARIABLES   *============================================================================*/ @@ -39,12 +67,69 @@ unsigned long currentMillis;        // store the current value from millis()  unsigned long previousMillis;       // for comparison with currentMillis  int samplingInterval = 19;          // how often to run the main loop (in ms) -Servo servos[MAX_SERVOS]; +/* i2c data */ +struct i2c_device_info { +  byte addr; +  byte reg; +  byte bytes; +}; + +/* for i2c read continuous more */ +i2c_device_info query[MAX_QUERIES]; + +byte i2cRxData[32]; +boolean isI2CEnabled = false; +signed char queryIndex = -1; +unsigned int i2cReadDelayTime = 0;  // default delay time between i2c read request and Wire.requestFrom() +Servo servos[MAX_SERVOS];  /*==============================================================================   * FUNCTIONS   *============================================================================*/ +void readAndReportData(byte address, int theRegister, byte numBytes) { +  // allow I2C requests that don't require a register read +  // for example, some devices using an interrupt pin to signify new data available +  // do not always require the register read so upon interrupt you call Wire.requestFrom()   +  if (theRegister != REGISTER_NOT_SPECIFIED) { +    Wire.beginTransmission(address); +    #if ARDUINO >= 100 +    Wire.write((byte)theRegister); +    #else +    Wire.send((byte)theRegister); +    #endif +    Wire.endTransmission(); +    delayMicroseconds(i2cReadDelayTime);  // delay is necessary for some devices such as WiiNunchuck +  } else { +    theRegister = 0;  // fill the register with a dummy value +  } + +  Wire.requestFrom(address, numBytes);  // all bytes are returned in requestFrom + +  // check to be sure correct number of bytes were returned by slave +  if(numBytes == Wire.available()) { +    i2cRxData[0] = address; +    i2cRxData[1] = theRegister; +    for (int i = 0; i < numBytes; i++) { +      #if ARDUINO >= 100 +      i2cRxData[2 + i] = Wire.read(); +      #else +      i2cRxData[2 + i] = Wire.receive(); +      #endif +    } +  } +  else { +    if(numBytes > Wire.available()) { +      Firmata.sendString("I2C Read Error: Too many bytes received"); +    } else { +      Firmata.sendString("I2C Read Error: Too few bytes received");  +    } +  } + +  // send slave address, register and received bytes +  Firmata.sendSysex(SYSEX_I2C_REPLY, numBytes + 2, i2cRxData); +} +  void outputPort(byte portNumber, byte portValue, byte forceSend)  {    // pins not configured as INPUT are cleared to zeros @@ -88,6 +173,11 @@ void checkDigitalInputs(void)   */  void setPinModeCallback(byte pin, int mode)  { +  if (pinConfig[pin] == I2C && isI2CEnabled && mode != I2C) { +    // disable i2c so pins can be used for other functions +    // the following if statements should reconfigure the pins properly +    disableI2CPins(); +  }    if (IS_PIN_SERVO(pin) && mode != SERVO && servos[PIN_TO_SERVO(pin)].attached()) {      servos[PIN_TO_SERVO(pin)].detach();    } @@ -138,14 +228,15 @@ void setPinModeCallback(byte pin, int mode)        pinConfig[pin] = SERVO;        if (!servos[PIN_TO_SERVO(pin)].attached()) {            servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin)); -      } else { -        Firmata.sendString("Servo only on pins from 2 to 13");        }      }      break;    case I2C: -    pinConfig[pin] = mode; -    Firmata.sendString("I2C mode not yet supported"); +    if (IS_PIN_I2C(pin)) { +      // mark the pin as i2c +      // the user must call I2C_CONFIG to enable I2C for a device +      pinConfig[pin] = I2C; +    }      break;    default:      Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM @@ -232,7 +323,104 @@ void reportDigitalCallback(byte port, int value)  void sysexCallback(byte command, byte argc, byte *argv)  { +  byte mode; +  byte slaveAddress; +  byte slaveRegister; +  byte data; +  unsigned int delayTime;  +      switch(command) { +  case I2C_REQUEST: +    mode = argv[1] & I2C_READ_WRITE_MODE_MASK; +    if (argv[1] & I2C_10BIT_ADDRESS_MODE_MASK) { +      Firmata.sendString("10-bit addressing mode is not yet supported"); +      return; +    } +    else { +      slaveAddress = argv[0]; +    } + +    switch(mode) { +    case I2C_WRITE: +      Wire.beginTransmission(slaveAddress); +      for (byte i = 2; i < argc; i += 2) { +        data = argv[i] + (argv[i + 1] << 7); +        #if ARDUINO >= 100 +        Wire.write(data); +        #else +        Wire.send(data); +        #endif +      } +      Wire.endTransmission(); +      delayMicroseconds(70); +      break; +    case I2C_READ: +      if (argc == 6) { +        // a slave register is specified +        slaveRegister = argv[2] + (argv[3] << 7); +        data = argv[4] + (argv[5] << 7);  // bytes to read +        readAndReportData(slaveAddress, (int)slaveRegister, data); +      } +      else { +        // a slave register is NOT specified +        data = argv[2] + (argv[3] << 7);  // bytes to read +        readAndReportData(slaveAddress, (int)REGISTER_NOT_SPECIFIED, data); +      } +      break; +    case I2C_READ_CONTINUOUSLY: +      if ((queryIndex + 1) >= MAX_QUERIES) { +        // too many queries, just ignore +        Firmata.sendString("too many queries"); +        break; +      } +      queryIndex++; +      query[queryIndex].addr = slaveAddress; +      query[queryIndex].reg = argv[2] + (argv[3] << 7); +      query[queryIndex].bytes = argv[4] + (argv[5] << 7); +      break; +    case I2C_STOP_READING: +	  byte queryIndexToSkip;       +      // if read continuous mode is enabled for only 1 i2c device, disable +      // read continuous reporting for that device +      if (queryIndex <= 0) { +        queryIndex = -1;         +      } else { +        // if read continuous mode is enabled for multiple devices, +        // determine which device to stop reading and remove it's data from +        // the array, shifiting other array data to fill the space +        for (byte i = 0; i < queryIndex + 1; i++) { +          if (query[i].addr = slaveAddress) { +            queryIndexToSkip = i; +            break; +          } +        } +         +        for (byte i = queryIndexToSkip; i<queryIndex + 1; i++) { +          if (i < MAX_QUERIES) { +            query[i].addr = query[i+1].addr; +            query[i].reg = query[i+1].addr; +            query[i].bytes = query[i+1].bytes;  +          } +        } +        queryIndex--; +      } +      break; +    default: +      break; +    } +    break; +  case I2C_CONFIG: +    delayTime = (argv[0] + (argv[1] << 7)); + +    if(delayTime > 0) { +      i2cReadDelayTime = delayTime; +    } + +    if (!isI2CEnabled) { +      enableI2CPins(); +    } +     +    break;    case SERVO_CONFIG:      if(argc > 4) {        // these vars are here for clarity, they'll optimized away by the compiler @@ -241,7 +429,6 @@ void sysexCallback(byte command, byte argc, byte *argv)        int maxPulse = argv[3] + (argv[4] << 7);        if (IS_PIN_SERVO(pin)) { -        // servos are pins from 2 to 13, so offset for array          if (servos[PIN_TO_SERVO(pin)].attached())            servos[PIN_TO_SERVO(pin)].detach();          servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse); @@ -250,10 +437,14 @@ void sysexCallback(byte command, byte argc, byte *argv)      }      break;    case SAMPLING_INTERVAL: -    if (argc > 1) +    if (argc > 1) {        samplingInterval = argv[0] + (argv[1] << 7); -    else -      Firmata.sendString("Not enough data"); +      if (samplingInterval < MINIMUM_SAMPLING_INTERVAL) { +        samplingInterval = MINIMUM_SAMPLING_INTERVAL; +      }       +    } else { +      //Firmata.sendString("Not enough data"); +    }      break;    case EXTENDED_ANALOG:      if (argc > 1) { @@ -285,6 +476,10 @@ void sysexCallback(byte command, byte argc, byte *argv)          Serial.write(SERVO);          Serial.write(14);        } +      if (IS_PIN_I2C(pin)) { +        Serial.write(I2C); +        Serial.write(1);  // to do: determine appropriate value  +      }        Serial.write(127);      }      Serial.write(END_SYSEX); @@ -315,33 +510,52 @@ void sysexCallback(byte command, byte argc, byte *argv)    }  } - -/*============================================================================== - * SETUP() - *============================================================================*/ -void setup()  +void enableI2CPins()  {    byte i; +  // is there a faster way to do this? would probaby require importing  +  // Arduino.h to get SCL and SDA pins +  for (i=0; i < TOTAL_PINS; i++) { +    if(IS_PIN_I2C(i)) { +      // mark pins as i2c so they are ignore in non i2c data requests +      setPinModeCallback(i, I2C); +    }  +  } +    +  isI2CEnabled = true;  +   +  // is there enough time before the first I2C request to call this here? +  Wire.begin(); +} -  Firmata.setFirmwareVersion(2, 2); - -  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); -  Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); -  Firmata.attach(REPORT_ANALOG, reportAnalogCallback); -  Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); -  Firmata.attach(SET_PIN_MODE, setPinModeCallback); -  Firmata.attach(START_SYSEX, sysexCallback); +/* disable the i2c pins so they can be used for other functions */ +void disableI2CPins() { +    isI2CEnabled = false; +    // disable read continuous mode for all devices +    queryIndex = -1; +    // uncomment the following if or when the end() method is added to Wire library +    // Wire.end(); +} -  // TODO: load state from EEPROM here +/*============================================================================== + * SETUP() + *============================================================================*/ -  /* these are initialized to zero by the compiler startup code -  for (i=0; i < TOTAL_PORTS; i++) { -    reportPINs[i] = false; -    portConfigInputs[i] = 0; +void systemResetCallback() +{ +  // initialize a defalt state +  // TODO: option to load config from EEPROM instead of default +  if (isI2CEnabled) { +  	disableI2CPins(); +  } +  for (byte i=0; i < TOTAL_PORTS; i++) { +    reportPINs[i] = false;      // by default, reporting off +    portConfigInputs[i] = 0;	// until activated      previousPINs[i] = 0;    } -  */ -  for (i=0; i < TOTAL_PINS; i++) { +  // pins with analog capability default to analog input +  // otherwise, pins default to digital output +  for (byte i=0; i < TOTAL_PINS; i++) {      if (IS_PIN_ANALOG(i)) {        // turns off pullup, configures everything        setPinModeCallback(i, ANALOG); @@ -350,16 +564,34 @@ void setup()        setPinModeCallback(i, OUTPUT);      }    } -  // by defult, do not report any analog inputs +  // by default, do not report any analog inputs    analogInputsToReport = 0; -  Firmata.begin(57600); -    /* send digital inputs to set the initial state on the host computer,     * since once in the loop(), this firmware will only send on change */ -  for (i=0; i < TOTAL_PORTS; i++) { +  /* +  TODO: this can never execute, since no pins default to digital input +        but it will be needed when/if we support EEPROM stored config +  for (byte i=0; i < TOTAL_PORTS; i++) {      outputPort(i, readPort(i, portConfigInputs[i]), true);    } +  */ +} + +void setup()  +{ +  Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION); + +  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); +  Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); +  Firmata.attach(REPORT_ANALOG, reportAnalogCallback); +  Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); +  Firmata.attach(SET_PIN_MODE, setPinModeCallback); +  Firmata.attach(START_SYSEX, sysexCallback); +  Firmata.attach(SYSTEM_RESET, systemResetCallback); + +  Firmata.begin(57600); +  systemResetCallback();  // reset to default config  }  /*============================================================================== @@ -394,5 +626,11 @@ void loop()          }        }      } +    // report i2c data for all device with read continuous mode enabled +    if (queryIndex > -1) { +      for (byte i = 0; i < queryIndex + 1; i++) { +        readAndReportData(query[i].addr, query[i].reg, query[i].bytes); +      } +    }    }  } diff --git a/libraries/Firmata/examples/StandardFirmata_2_2_forUNO_0_3/StandardFirmata_2_2_forUNO_0_3.pde b/libraries/Firmata/examples/StandardFirmata_2_2_forUNO_0_3/StandardFirmata_2_2_forUNO_0_3.pde deleted file mode 100644 index 4cfa658..0000000 --- a/libraries/Firmata/examples/StandardFirmata_2_2_forUNO_0_3/StandardFirmata_2_2_forUNO_0_3.pde +++ /dev/null @@ -1,436 +0,0 @@ -/* -  This introduces modifications on the normal Firmata made for Arduino so that the LED  -  blinks until receiving the first command over serial. - -  Copyright (C) 2010 David Cuartielles.  All rights reserved. -   -  based at 99.9% on Firmata by HC Steiner according to the following license terms: -   -  Copyright (C) 2006-2008 Hans-Christoph Steiner.  All rights reserved. -   -  This library is free software; you can redistribute it and/or -  modify it under the terms of the GNU Lesser General Public -  License as published by the Free Software Foundation; either -  version 2.1 of the License, or (at your option) any later version. -  -  See file LICENSE.txt for further informations on licensing terms. - -  formatted using the GNU C formatting and indenting -*/ - -/*  - * TODO: use Program Control to load stored profiles from EEPROM - */ - -#include <Servo.h> -#include <Firmata.h> - -/*============================================================================== - * GLOBAL VARIABLES - *============================================================================*/ - -/* has the command arrived? */ -boolean firstCommand = false; -int dataOnSerial = 0; -boolean statusLed = false; - -/* analog inputs */ -int analogInputsToReport = 0; // bitwise array to store pin reporting - -/* digital input ports */ -byte reportPINs[TOTAL_PORTS];       // 1 = report this port, 0 = silence -byte previousPINs[TOTAL_PORTS];     // previous 8 bits sent - -/* pins configuration */ -byte pinConfig[TOTAL_PINS];         // configuration of every pin -byte portConfigInputs[TOTAL_PORTS]; // each bit: 1 = pin in INPUT, 0 = anything else -int pinState[TOTAL_PINS];           // any value that has been written - -/* timer variables */ -unsigned long currentMillis;        // store the current value from millis() -unsigned long previousMillis;       // for comparison with currentMillis -int samplingInterval = 19;          // how often to run the main loop (in ms) -unsigned long toggleMillis; - -Servo servos[MAX_SERVOS]; - -/*============================================================================== - * FUNCTIONS - *============================================================================*/ - -void toggleLed()  -{ -  if (millis() - toggleMillis > 500) { -    statusLed = !statusLed; -    digitalWrite(13, statusLed); -    toggleMillis = millis(); -  } -} - -void outputPort(byte portNumber, byte portValue, byte forceSend) -{ -  // pins not configured as INPUT are cleared to zeros -  portValue = portValue & portConfigInputs[portNumber]; -  // only send if the value is different than previously sent -  if(forceSend || previousPINs[portNumber] != portValue) { -    Firmata.sendDigitalPort(portNumber, portValue); -    previousPINs[portNumber] = portValue; -  } -} - -/* ----------------------------------------------------------------------------- - * check all the active digital inputs for change of state, then add any events - * to the Serial output queue using Serial.print() */ -void checkDigitalInputs(void) -{ -  /* Using non-looping code allows constants to be given to readPort(). -   * The compiler will apply substantial optimizations if the inputs -   * to readPort() are compile-time constants. */ -  if (TOTAL_PORTS > 0 && reportPINs[0]) outputPort(0, readPort(0, portConfigInputs[0]), false); -  if (TOTAL_PORTS > 1 && reportPINs[1]) outputPort(1, readPort(1, portConfigInputs[1]), false); -  if (TOTAL_PORTS > 2 && reportPINs[2]) outputPort(2, readPort(2, portConfigInputs[2]), false); -  if (TOTAL_PORTS > 3 && reportPINs[3]) outputPort(3, readPort(3, portConfigInputs[3]), false); -  if (TOTAL_PORTS > 4 && reportPINs[4]) outputPort(4, readPort(4, portConfigInputs[4]), false); -  if (TOTAL_PORTS > 5 && reportPINs[5]) outputPort(5, readPort(5, portConfigInputs[5]), false); -  if (TOTAL_PORTS > 6 && reportPINs[6]) outputPort(6, readPort(6, portConfigInputs[6]), false); -  if (TOTAL_PORTS > 7 && reportPINs[7]) outputPort(7, readPort(7, portConfigInputs[7]), false); -  if (TOTAL_PORTS > 8 && reportPINs[8]) outputPort(8, readPort(8, portConfigInputs[8]), false); -  if (TOTAL_PORTS > 9 && reportPINs[9]) outputPort(9, readPort(9, portConfigInputs[9]), false); -  if (TOTAL_PORTS > 10 && reportPINs[10]) outputPort(10, readPort(10, portConfigInputs[10]), false); -  if (TOTAL_PORTS > 11 && reportPINs[11]) outputPort(11, readPort(11, portConfigInputs[11]), false); -  if (TOTAL_PORTS > 12 && reportPINs[12]) outputPort(12, readPort(12, portConfigInputs[12]), false); -  if (TOTAL_PORTS > 13 && reportPINs[13]) outputPort(13, readPort(13, portConfigInputs[13]), false); -  if (TOTAL_PORTS > 14 && reportPINs[14]) outputPort(14, readPort(14, portConfigInputs[14]), false); -  if (TOTAL_PORTS > 15 && reportPINs[15]) outputPort(15, readPort(15, portConfigInputs[15]), false); -} - -// ----------------------------------------------------------------------------- -/* sets the pin mode to the correct state and sets the relevant bits in the - * two bit-arrays that track Digital I/O and PWM status - */ -void setPinModeCallback(byte pin, int mode) -{ -  if (IS_PIN_SERVO(pin) && mode != SERVO && servos[PIN_TO_SERVO(pin)].attached()) { -    servos[PIN_TO_SERVO(pin)].detach(); -  } -  if (IS_PIN_ANALOG(pin)) { -    reportAnalogCallback(PIN_TO_ANALOG(pin), mode == ANALOG ? 1 : 0); // turn on/off reporting -  } -  if (IS_PIN_DIGITAL(pin)) { -    if (mode == INPUT) { -      portConfigInputs[pin/8] |= (1 << (pin & 7)); -    } else { -      portConfigInputs[pin/8] &= ~(1 << (pin & 7)); -    } -  } -  pinState[pin] = 0; -  switch(mode) { -  case ANALOG: -    if (IS_PIN_ANALOG(pin)) { -      if (IS_PIN_DIGITAL(pin)) { -        pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver -        digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups -      } -      pinConfig[pin] = ANALOG; -    } -    break; -  case INPUT: -    if (IS_PIN_DIGITAL(pin)) { -      pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver -      digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups -      pinConfig[pin] = INPUT; -    } -    break; -  case OUTPUT: -    if (IS_PIN_DIGITAL(pin)) { -      digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable PWM -      pinMode(PIN_TO_DIGITAL(pin), OUTPUT); -      pinConfig[pin] = OUTPUT; -    } -    break; -  case PWM: -    if (IS_PIN_PWM(pin)) { -      pinMode(PIN_TO_PWM(pin), OUTPUT); -      analogWrite(PIN_TO_PWM(pin), 0); -      pinConfig[pin] = PWM; -    } -    break; -  case SERVO: -    if (IS_PIN_SERVO(pin)) { -      pinConfig[pin] = SERVO; -      if (!servos[PIN_TO_SERVO(pin)].attached()) { -          servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin)); -      } else { -        Firmata.sendString("Servo only on pins from 2 to 13"); -      } -    } -    break; -  case I2C: -    pinConfig[pin] = mode; -    Firmata.sendString("I2C mode not yet supported"); -    break; -  default: -    Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM -  } -  // TODO: save status to EEPROM here, if changed -} - -void analogWriteCallback(byte pin, int value) -{ -  if (pin < TOTAL_PINS) { -    switch(pinConfig[pin]) { -    case SERVO: -      if (IS_PIN_SERVO(pin)) -        servos[PIN_TO_SERVO(pin)].write(value); -        pinState[pin] = value; -      break; -    case PWM: -      if (IS_PIN_PWM(pin)) -        analogWrite(PIN_TO_PWM(pin), value); -        pinState[pin] = value; -      break; -    } -  } -} - -void digitalWriteCallback(byte port, int value) -{ -  byte pin, lastPin, mask=1, pinWriteMask=0; - -  if (port < TOTAL_PORTS) { -    // create a mask of the pins on this port that are writable. -    lastPin = port*8+8; -    if (lastPin > TOTAL_PINS) lastPin = TOTAL_PINS; -    for (pin=port*8; pin < lastPin; pin++) { -      // do not disturb non-digital pins (eg, Rx & Tx) -      if (IS_PIN_DIGITAL(pin)) { -        // only write to OUTPUT and INPUT (enables pullup) -        // do not touch pins in PWM, ANALOG, SERVO or other modes -        if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) { -          pinWriteMask |= mask; -          pinState[pin] = ((byte)value & mask) ? 1 : 0; -        } -      } -      mask = mask << 1; -    } -    writePort(port, (byte)value, pinWriteMask); -  } -} - - -// ----------------------------------------------------------------------------- -/* sets bits in a bit array (int) to toggle the reporting of the analogIns - */ -//void FirmataClass::setAnalogPinReporting(byte pin, byte state) { -//} -void reportAnalogCallback(byte analogPin, int value) -{ -  if (analogPin < TOTAL_ANALOG_PINS) { -    if(value == 0) { -      analogInputsToReport = analogInputsToReport &~ (1 << analogPin); -    } else { -      analogInputsToReport = analogInputsToReport | (1 << analogPin); -    } -  } -  // TODO: save status to EEPROM here, if changed -} - -void reportDigitalCallback(byte port, int value) -{ -  if (port < TOTAL_PORTS) { -    reportPINs[port] = (byte)value; -  } -  // do not disable analog reporting on these 8 pins, to allow some -  // pins used for digital, others analog.  Instead, allow both types -  // of reporting to be enabled, but check if the pin is configured -  // as analog when sampling the analog inputs.  Likewise, while -  // scanning digital pins, portConfigInputs will mask off values from any -  // pins configured as analog -} - -/*============================================================================== - * SYSEX-BASED commands - *============================================================================*/ - -void sysexCallback(byte command, byte argc, byte *argv) -{ -  switch(command) { -  case SERVO_CONFIG: -    if(argc > 4) { -      // these vars are here for clarity, they'll optimized away by the compiler -      byte pin = argv[0]; -      int minPulse = argv[1] + (argv[2] << 7); -      int maxPulse = argv[3] + (argv[4] << 7); - -      if (IS_PIN_SERVO(pin)) { -        // servos are pins from 2 to 13, so offset for array -        if (servos[PIN_TO_SERVO(pin)].attached()) -          servos[PIN_TO_SERVO(pin)].detach(); -        servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse); -        setPinModeCallback(pin, SERVO); -      } -    } -    break; -  case SAMPLING_INTERVAL: -    if (argc > 1) -      samplingInterval = argv[0] + (argv[1] << 7); -    else -      Firmata.sendString("Not enough data"); -    break; -  case EXTENDED_ANALOG: -    if (argc > 1) { -      int val = argv[1]; -      if (argc > 2) val |= (argv[2] << 7); -      if (argc > 3) val |= (argv[3] << 14); -      analogWriteCallback(argv[0], val); -    } -    break; -  case CAPABILITY_QUERY: -    Serial.write(START_SYSEX); -    Serial.write(CAPABILITY_RESPONSE); -    for (byte pin=0; pin < TOTAL_PINS; pin++) { -      if (IS_PIN_DIGITAL(pin)) { -        Serial.write((byte)INPUT); -        Serial.write(1); -        Serial.write((byte)OUTPUT); -        Serial.write(1); -      } -      if (IS_PIN_ANALOG(pin)) { -        Serial.write(ANALOG); -        Serial.write(10); -      } -      if (IS_PIN_PWM(pin)) { -        Serial.write(PWM); -        Serial.write(8); -      } -      if (IS_PIN_SERVO(pin)) { -        Serial.write(SERVO); -        Serial.write(14); -      } -      Serial.write(127); -    } -    Serial.write(END_SYSEX); -    break; -  case PIN_STATE_QUERY: -    if (argc > 0) { -      byte pin=argv[0]; -      Serial.write(START_SYSEX); -      Serial.write(PIN_STATE_RESPONSE); -      Serial.write(pin); -      if (pin < TOTAL_PINS) { -        Serial.write((byte)pinConfig[pin]); -	Serial.write((byte)pinState[pin] & 0x7F); -	if (pinState[pin] & 0xFF80) Serial.write((byte)(pinState[pin] >> 7) & 0x7F); -	if (pinState[pin] & 0xC000) Serial.write((byte)(pinState[pin] >> 14) & 0x7F); -      } -      Serial.write(END_SYSEX); -    } -    break; -  case ANALOG_MAPPING_QUERY: -    Serial.write(START_SYSEX); -    Serial.write(ANALOG_MAPPING_RESPONSE); -    for (byte pin=0; pin < TOTAL_PINS; pin++) { -      Serial.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127); -    } -    Serial.write(END_SYSEX); -    break; -  } -} - -/*============================================================================== - * SETUP() - *============================================================================*/ -void setup()  -{ -  byte i; - -  Firmata.setFirmwareVersion(2, 2); - -  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); -  Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); -  Firmata.attach(REPORT_ANALOG, reportAnalogCallback); -  Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); -  Firmata.attach(SET_PIN_MODE, setPinModeCallback); -  Firmata.attach(START_SYSEX, sysexCallback); - -  // TODO: load state from EEPROM here - -  /* these are initialized to zero by the compiler startup code -  for (i=0; i < TOTAL_PORTS; i++) { -    reportPINs[i] = false; -    portConfigInputs[i] = 0; -    previousPINs[i] = 0; -  } -  */ -  for (i=0; i < TOTAL_PINS; i++) { -    if (IS_PIN_ANALOG(i)) { -      // turns off pullup, configures everything -      setPinModeCallback(i, ANALOG); -    } else { -      // sets the output to 0, configures portConfigInputs -      setPinModeCallback(i, OUTPUT); -    } -  } -  // by defult, do not report any analog inputs -  analogInputsToReport = 0; - -  Firmata.begin(57600); - -  /* send digital inputs to set the initial state on the host computer, -   * since once in the loop(), this firmware will only send on change */ -  for (i=0; i < TOTAL_PORTS; i++) { -    outputPort(i, readPort(i, portConfigInputs[i]), true); -  } -   -  /* init the toggleLed counter */ -  toggleMillis = millis(); -  pinMode(13, OUTPUT); -} - -/*============================================================================== - * LOOP() - *============================================================================*/ -void loop()  -{ -  byte pin, analogPin; - -  /* DIGITALREAD - as fast as possible, check for changes and output them to the -   * FTDI buffer using Serial.print()  */ -  checkDigitalInputs();   - -  //XXX: hack Firmata to blink until serial command arrives  -  dataOnSerial = Firmata.available(); -  if (dataOnSerial > 0 && !firstCommand) { -    firstCommand = true; -  } -  //XXX: do the blink if the first command hasn't arrived yet -  //     configures pin 13 as output and then back as input -  if (!firstCommand) { -    toggleLed(); -  } -   -  /* SERIALREAD - processing incoming messagse as soon as possible, while still -   * checking digital inputs.  */ -  while(dataOnSerial) { -    Firmata.processInput(); -    dataOnSerial = Firmata.available(); -  } -   -  /* SEND FTDI WRITE BUFFER - make sure that the FTDI buffer doesn't go over -   * 60 bytes. use a timer to sending an event character every 4 ms to -   * trigger the buffer to dump. */ - -  currentMillis = millis(); -  if (currentMillis - previousMillis > samplingInterval) { -    previousMillis += samplingInterval; -    /* ANALOGREAD - do all analogReads() at the configured sampling interval */ -    for(pin=0; pin<TOTAL_PINS; pin++) { -      if (IS_PIN_ANALOG(pin) && pinConfig[pin] == ANALOG) { -        analogPin = PIN_TO_ANALOG(pin); -        if (analogInputsToReport & (1 << analogPin)) { -          Firmata.sendAnalog(analogPin, analogRead(analogPin)); -        } -      } -    } -  } -}  | 
