Skip to content

Commit 108df37

Browse files
committed
Updating Firmata to r71.
Note that I also changed the extensions of the examples (firmwares) from .pde to .ino and removed the Makefiles (since they assume the pde extension). http://code.google.com/p/arduino/issues/detail?id=447
1 parent be786b7 commit 108df37

File tree

15 files changed

+113
-2110
lines changed

15 files changed

+113
-2110
lines changed

libraries/Firmata/Boards.h

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33
#ifndef Firmata_Boards_h
44
#define Firmata_Boards_h
55

6-
#include <Arduino.h> // for digitalRead, digitalWrite, etc
6+
#include <inttypes.h>
7+
8+
#if defined(ARDUINO) && ARDUINO >= 100
9+
#include "Arduino.h" // for digitalRead, digitalWrite, etc
10+
#else
11+
#include "WProgram.h"
12+
#endif
713

814
// Normally Servo.h must be included before Firmata.h (which then includes
915
// this file). If Servo.h wasn't included, this allows the code to still
@@ -120,62 +126,73 @@ writePort(port, value, bitmask): Write an 8 bit port.
120126

121127
// Arduino Duemilanove, Diecimila, and NG
122128
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
129+
#if defined(NUM_ANALOG_INPUTS) && NUM_ANALOG_INPUTS == 6
130+
#define TOTAL_ANALOG_PINS 6
131+
#define TOTAL_PINS 20 // 14 digital + 6 analog
132+
#else
123133
#define TOTAL_ANALOG_PINS 8
124-
#define TOTAL_PINS 24 // 14 digital + 2 unused + 8 analog
134+
#define TOTAL_PINS 22 // 14 digital + 8 analog
135+
#endif
125136
#define VERSION_BLINK_PIN 13
126-
#define IS_PIN_DIGITAL(p) (((p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21))
127-
#define IS_PIN_ANALOG(p) ((p) >= 16 && (p) <= 23)
137+
#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 19)
138+
#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) < 14 + TOTAL_ANALOG_PINS)
128139
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
129-
#define IS_PIN_SERVO(p) ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS)
130-
#define IS_PIN_I2C(p) (0)
131-
#define PIN_TO_DIGITAL(p) (((p) < 16) ? (p) : (p) - 2)
132-
#define PIN_TO_ANALOG(p) ((p) - 16)
140+
#define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS)
141+
#define IS_PIN_I2C(p) ((p) == 18 || (p) == 19)
142+
#define PIN_TO_DIGITAL(p) (p)
143+
#define PIN_TO_ANALOG(p) ((p) - 14)
133144
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
134145
#define PIN_TO_SERVO(p) ((p) - 2)
135146
#define ARDUINO_PINOUT_OPTIMIZE 1
136147

137148

149+
// Wiring (and board)
150+
#elif defined(WIRING)
151+
#define VERSION_BLINK_PIN WLED
152+
#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
153+
#define IS_PIN_ANALOG(p) ((p) >= FIRST_ANALOG_PIN && (p) < (FIRST_ANALOG_PIN+TOTAL_ANALOG_PINS))
154+
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
155+
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
156+
#define IS_PIN_I2C(p) ((p) == SDA || (p) == SCL)
157+
#define PIN_TO_DIGITAL(p) (p)
158+
#define PIN_TO_ANALOG(p) ((p) - FIRST_ANALOG_PIN)
159+
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
160+
#define PIN_TO_SERVO(p) (p)
161+
162+
138163
// old Arduinos
139164
#elif defined(__AVR_ATmega8__)
140165
#define TOTAL_ANALOG_PINS 6
141-
#define TOTAL_PINS 22 // 14 digital + 2 unused + 6 analog
166+
#define TOTAL_PINS 20 // 14 digital + 6 analog
142167
#define VERSION_BLINK_PIN 13
143-
#define IS_PIN_DIGITAL(p) (((p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21))
144-
#define IS_PIN_ANALOG(p) ((p) >= 16 && (p) <= 21)
168+
#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 19)
169+
#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 19)
145170
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
146-
#define IS_PIN_SERVO(p) ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS)
147-
#define IS_PIN_I2C(p) (0)
148-
#define PIN_TO_DIGITAL(p) (((p) < 16) ? (p) : (p) - 2)
149-
#define PIN_TO_ANALOG(p) ((p) - 16)
171+
#define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS)
172+
#define IS_PIN_I2C(p) ((p) == 18 || (p) == 19)
173+
#define PIN_TO_DIGITAL(p) (p)
174+
#define PIN_TO_ANALOG(p) ((p) - 14)
150175
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
151176
#define PIN_TO_SERVO(p) ((p) - 2)
152177
#define ARDUINO_PINOUT_OPTIMIZE 1
153178

154179

155180
// Arduino Mega
156-
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
181+
#elif defined(__AVR_ATmega1280__)
157182
#define TOTAL_ANALOG_PINS 16
158183
#define TOTAL_PINS 70 // 54 digital + 16 analog
159184
#define VERSION_BLINK_PIN 13
160185
#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS)
161186
#define IS_PIN_ANALOG(p) ((p) >= 54 && (p) < TOTAL_PINS)
162187
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
163188
#define IS_PIN_SERVO(p) ((p) >= 2 && (p) - 2 < MAX_SERVOS)
164-
#define IS_PIN_I2C(p) (0)
189+
#define IS_PIN_I2C(p) ((p) == 20 || (p) == 21)
165190
#define PIN_TO_DIGITAL(p) (p)
166191
#define PIN_TO_ANALOG(p) ((p) - 54)
167192
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
168193
#define PIN_TO_SERVO(p) ((p) - 2)
169194

170195

171-
// Wiring
172-
#elif defined(__AVR_ATmega128__)
173-
#define TOTAL_ANALOG_PINS 8
174-
#define TOTAL_PINS 51
175-
#define VERSION_BLINK_PIN 48
176-
// TODO: hardware abstraction for wiring board
177-
178-
179196
// Teensy 1.0
180197
#elif defined(__AVR_AT90USB162__)
181198
#define TOTAL_ANALOG_PINS 0
@@ -201,7 +218,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
201218
#define IS_PIN_ANALOG(p) ((p) >= 11 && (p) <= 22)
202219
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
203220
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
204-
#define IS_PIN_I2C(p) (0)
221+
#define IS_PIN_I2C(p) ((p) == 5 || (p) == 6)
205222
#define PIN_TO_DIGITAL(p) (p)
206223
#define PIN_TO_ANALOG(p) (((p)<22)?21-(p):11)
207224
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -217,7 +234,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
217234
#define IS_PIN_ANALOG(p) ((p) >= 38 && (p) < TOTAL_PINS)
218235
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
219236
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
220-
#define IS_PIN_I2C(p) (0)
237+
#define IS_PIN_I2C(p) ((p) == 0 || (p) == 1)
221238
#define PIN_TO_DIGITAL(p) (p)
222239
#define PIN_TO_ANALOG(p) ((p) - 38)
223240
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -233,7 +250,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
233250
#define IS_PIN_ANALOG(p) ((p) >= 24 && (p) < TOTAL_PINS)
234251
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
235252
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
236-
#define IS_PIN_I2C(p) (0)
253+
#define IS_PIN_I2C(p) ((p) == 16 || (p) == 17)
237254
#define PIN_TO_DIGITAL(p) (p)
238255
#define PIN_TO_ANALOG(p) ((p) - 24)
239256
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -249,7 +266,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
249266
#define IS_PIN_ANALOG(p) ((p) >= 36 && (p) < TOTAL_PINS)
250267
#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p)
251268
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
252-
#define IS_PIN_I2C(p) (0)
269+
#define IS_PIN_I2C(p) ((p) == 4 || (p) == 5)
253270
#define PIN_TO_DIGITAL(p) (p)
254271
#define PIN_TO_ANALOG(p) ((p) - 36)
255272
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -270,9 +287,9 @@ static inline unsigned char readPort(byte, byte) __attribute__((always_inline, u
270287
static inline unsigned char readPort(byte port, byte bitmask)
271288
{
272289
#if defined(ARDUINO_PINOUT_OPTIMIZE)
273-
if (port == 0) return PIND & B11111100 & bitmask; // ignore Rx/Tx 0/1
274-
if (port == 1) return PINB & B00111111 & bitmask; // pins 8-13 (14,15 are disabled for the crystal)
275-
if (port == 2) return PINC & bitmask;
290+
if (port == 0) return (PIND & 0xFC) & bitmask; // ignore Rx/Tx 0/1
291+
if (port == 1) return ((PINB & 0x3F) | ((PINC & 0x03) << 6)) & bitmask;
292+
if (port == 2) return ((PINC & 0x3C) >> 2) & bitmask;
276293
return 0;
277294
#else
278295
unsigned char out=0, pin=port*8;
@@ -297,17 +314,27 @@ static inline unsigned char writePort(byte port, byte value, byte bitmask)
297314
{
298315
#if defined(ARDUINO_PINOUT_OPTIMIZE)
299316
if (port == 0) {
300-
bitmask = bitmask & 0xFC; // Tx & Rx pins
317+
bitmask = bitmask & 0xFC; // do not touch Tx & Rx pins
318+
byte valD = value & bitmask;
319+
byte maskD = ~bitmask;
301320
cli();
302-
PORTD = (PORTD & ~bitmask) | (bitmask & value);
321+
PORTD = (PORTD & maskD) | valD;
303322
sei();
304323
} else if (port == 1) {
324+
byte valB = (value & bitmask) & 0x3F;
325+
byte valC = (value & bitmask) >> 6;
326+
byte maskB = ~(bitmask & 0x3F);
327+
byte maskC = ~((bitmask & 0xC0) >> 6);
305328
cli();
306-
PORTB = (PORTB & ~bitmask) | (bitmask & value);
329+
PORTB = (PORTB & maskB) | valB;
330+
PORTC = (PORTC & maskC) | valC;
307331
sei();
308332
} else if (port == 2) {
333+
bitmask = bitmask & 0x0F;
334+
byte valC = (value & bitmask) << 2;
335+
byte maskC = ~(bitmask << 2);
309336
cli();
310-
PORTC = (PORTC & ~bitmask) | (bitmask & value);
337+
PORTC = (PORTC & maskC) | valC;
311338
sei();
312339
}
313340
#else

libraries/Firmata/Firmata.cpp

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
//* Includes
1515
//******************************************************************************
1616

17-
#include "Arduino.h"
18-
#include "HardwareSerial.h"
1917
#include "Firmata.h"
18+
#include "HardwareSerial.h"
2019

2120
extern "C" {
2221
#include <string.h>
@@ -27,27 +26,27 @@ extern "C" {
2726
//* Support Functions
2827
//******************************************************************************
2928

30-
void sendValueAsTwo7bitBytes(int value)
29+
void FirmataClass::sendValueAsTwo7bitBytes(int value)
3130
{
32-
Serial.print(value & B01111111, BYTE); // LSB
33-
Serial.print(value >> 7 & B01111111, BYTE); // MSB
31+
FirmataSerial.write(value & B01111111); // LSB
32+
FirmataSerial.write(value >> 7 & B01111111); // MSB
3433
}
3534

36-
void startSysex(void)
35+
void FirmataClass::startSysex(void)
3736
{
38-
Serial.print(START_SYSEX, BYTE);
37+
FirmataSerial.write(START_SYSEX);
3938
}
4039

41-
void endSysex(void)
40+
void FirmataClass::endSysex(void)
4241
{
43-
Serial.print(END_SYSEX, BYTE);
42+
FirmataSerial.write(END_SYSEX);
4443
}
4544

4645
//******************************************************************************
4746
//* Constructors
4847
//******************************************************************************
4948

50-
FirmataClass::FirmataClass(void)
49+
FirmataClass::FirmataClass(Stream &s) : FirmataSerial(s)
5150
{
5251
firmwareVersionCount = 0;
5352
systemReset();
@@ -66,22 +65,27 @@ void FirmataClass::begin(void)
6665
/* begin method for overriding default serial bitrate */
6766
void FirmataClass::begin(long speed)
6867
{
69-
#if defined(__AVR_ATmega128__) // Wiring
70-
Serial.begin((uint32_t)speed);
71-
#else
7268
Serial.begin(speed);
73-
#endif
69+
FirmataSerial = Serial;
7470
blinkVersion();
7571
delay(300);
7672
printVersion();
7773
printFirmwareVersion();
7874
}
7975

76+
void FirmataClass::begin(Stream &s)
77+
{
78+
FirmataSerial = s;
79+
systemReset();
80+
printVersion();
81+
printFirmwareVersion();
82+
}
83+
8084
// output the protocol version message to the serial port
8185
void FirmataClass::printVersion(void) {
82-
Serial.print(REPORT_VERSION, BYTE);
83-
Serial.print(FIRMATA_MAJOR_VERSION, BYTE);
84-
Serial.print(FIRMATA_MINOR_VERSION, BYTE);
86+
FirmataSerial.write(REPORT_VERSION);
87+
FirmataSerial.write(FIRMATA_MAJOR_VERSION);
88+
FirmataSerial.write(FIRMATA_MINOR_VERSION);
8589
}
8690

8791
void FirmataClass::blinkVersion(void)
@@ -101,9 +105,9 @@ void FirmataClass::printFirmwareVersion(void)
101105

102106
if(firmwareVersionCount) { // make sure that the name has been set before reporting
103107
startSysex();
104-
Serial.print(REPORT_FIRMWARE, BYTE);
105-
Serial.print(firmwareVersionVector[0]); // major version number
106-
Serial.print(firmwareVersionVector[1]); // minor version number
108+
FirmataSerial.write(REPORT_FIRMWARE);
109+
FirmataSerial.write(firmwareVersionVector[0]); // major version number
110+
FirmataSerial.write(firmwareVersionVector[1]); // minor version number
107111
for(i=2; i<firmwareVersionCount; ++i) {
108112
sendValueAsTwo7bitBytes(firmwareVersionVector[i]);
109113
}
@@ -141,7 +145,7 @@ void FirmataClass::setFirmwareNameAndVersion(const char *name, byte major, byte
141145

142146
int FirmataClass::available(void)
143147
{
144-
return Serial.available();
148+
return FirmataSerial.available();
145149
}
146150

147151

@@ -175,7 +179,7 @@ void FirmataClass::processSysexMessage(void)
175179

176180
void FirmataClass::processInput(void)
177181
{
178-
int inputData = Serial.read(); // this is 'int' to handle -1 when no data
182+
int inputData = FirmataSerial.read(); // this is 'int' to handle -1 when no data
179183
int command;
180184

181185
// TODO make sure it handles -1 properly
@@ -267,7 +271,7 @@ void FirmataClass::processInput(void)
267271
void FirmataClass::sendAnalog(byte pin, int value)
268272
{
269273
// pin can only be 0-15, so chop higher bits
270-
Serial.print(ANALOG_MESSAGE | (pin & 0xF), BYTE);
274+
FirmataSerial.write(ANALOG_MESSAGE | (pin & 0xF));
271275
sendValueAsTwo7bitBytes(value);
272276
}
273277

@@ -298,17 +302,17 @@ void FirmataClass::sendDigital(byte pin, int value)
298302
// send an 8-bit port in a single digital message (protocol v2)
299303
void FirmataClass::sendDigitalPort(byte portNumber, int portData)
300304
{
301-
Serial.print(DIGITAL_MESSAGE | (portNumber & 0xF),BYTE);
302-
Serial.print((byte)portData % 128, BYTE); // Tx bits 0-6
303-
Serial.print(portData >> 7, BYTE); // Tx bits 7-13
305+
FirmataSerial.write(DIGITAL_MESSAGE | (portNumber & 0xF));
306+
FirmataSerial.write((byte)portData % 128); // Tx bits 0-6
307+
FirmataSerial.write(portData >> 7); // Tx bits 7-13
304308
}
305309

306310

307311
void FirmataClass::sendSysex(byte command, byte bytec, byte* bytev)
308312
{
309313
byte i;
310314
startSysex();
311-
Serial.print(command, BYTE);
315+
FirmataSerial.write(command);
312316
for(i=0; i<bytec; i++) {
313317
sendValueAsTwo7bitBytes(bytev[i]);
314318
}
@@ -437,6 +441,6 @@ void FirmataClass::pin13strobe(int count, int onInterval, int offInterval)
437441

438442

439443
// make one instance for the user to use
440-
FirmataClass Firmata;
444+
FirmataClass Firmata(Serial);
441445

442446

0 commit comments

Comments
 (0)