Skip to content

Commit 4803a08

Browse files
Merge pull request firmata#205 from firmata/serial
initial implementation of Serial protocol
2 parents b88bb99 + d78d505 commit 4803a08

File tree

13 files changed

+4178
-4
lines changed

13 files changed

+4178
-4
lines changed

Boards.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,19 @@ writePort(port, value, bitmask): Write an 8 bit port.
200200
#define TOTAL_ANALOG_PINS 16
201201
#define TOTAL_PINS 70 // 54 digital + 16 analog
202202
#define VERSION_BLINK_PIN 13
203+
#define PIN_SERIAL1_RX 19
204+
#define PIN_SERIAL1_TX 18
205+
#define PIN_SERIAL2_RX 17
206+
#define PIN_SERIAL2_TX 16
207+
#define PIN_SERIAL3_RX 15
208+
#define PIN_SERIAL3_TX 14
203209
#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS)
204210
#define IS_PIN_ANALOG(p) ((p) >= 54 && (p) < TOTAL_PINS)
205211
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
206212
#define IS_PIN_SERVO(p) ((p) >= 2 && (p) - 2 < MAX_SERVOS)
207213
#define IS_PIN_I2C(p) ((p) == 20 || (p) == 21)
208214
#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
215+
#define IS_PIN_SERIAL(p) ((p) > 13 && (p) < 20)
209216
#define PIN_TO_DIGITAL(p) (p)
210217
#define PIN_TO_ANALOG(p) ((p) - 54)
211218
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -217,11 +224,18 @@ writePort(port, value, bitmask): Write an 8 bit port.
217224
#define TOTAL_ANALOG_PINS 12
218225
#define TOTAL_PINS 66 // 54 digital + 12 analog
219226
#define VERSION_BLINK_PIN 13
227+
#define PIN_SERIAL1_RX 19
228+
#define PIN_SERIAL1_TX 18
229+
#define PIN_SERIAL2_RX 17
230+
#define PIN_SERIAL2_TX 16
231+
#define PIN_SERIAL3_RX 15
232+
#define PIN_SERIAL3_TX 14
220233
#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS)
221234
#define IS_PIN_ANALOG(p) ((p) >= 54 && (p) < TOTAL_PINS)
222235
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
223236
#define IS_PIN_SERVO(p) ((p) >= 2 && (p) - 2 < MAX_SERVOS)
224237
#define IS_PIN_I2C(p) ((p) == 20 || (p) == 21) // 70 71
238+
#define IS_PIN_SERIAL(p) ((p) > 13 && (p) < 20)
225239
#define PIN_TO_DIGITAL(p) (p)
226240
#define PIN_TO_ANALOG(p) ((p) - 54)
227241
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -233,12 +247,15 @@ writePort(port, value, bitmask): Write an 8 bit port.
233247
#define TOTAL_ANALOG_PINS 0
234248
#define TOTAL_PINS 21 // 21 digital + no analog
235249
#define VERSION_BLINK_PIN 6
250+
#define PIN_SERIAL1_RX 2
251+
#define PIN_SERIAL1_TX 3
236252
#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
237253
#define IS_PIN_ANALOG(p) (0)
238254
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
239255
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
240256
#define IS_PIN_I2C(p) (0)
241257
#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
258+
#define IS_PIN_SERIAL(p) ((p) == 2 || (p) == 3)
242259
#define PIN_TO_DIGITAL(p) (p)
243260
#define PIN_TO_ANALOG(p) (0)
244261
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -250,12 +267,15 @@ writePort(port, value, bitmask): Write an 8 bit port.
250267
#define TOTAL_ANALOG_PINS 12
251268
#define TOTAL_PINS 25 // 11 digital + 12 analog
252269
#define VERSION_BLINK_PIN 11
270+
#define PIN_SERIAL1_RX 7
271+
#define PIN_SERIAL1_TX 8
253272
#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
254273
#define IS_PIN_ANALOG(p) ((p) >= 11 && (p) <= 22)
255274
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
256275
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
257276
#define IS_PIN_I2C(p) ((p) == 5 || (p) == 6)
258277
#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
278+
#define IS_PIN_SERIAL(p) ((p) == 7 || (p) == 8)
259279
#define PIN_TO_DIGITAL(p) (p)
260280
#define PIN_TO_ANALOG(p) (((p)<22)?21-(p):11)
261281
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -267,11 +287,18 @@ writePort(port, value, bitmask): Write an 8 bit port.
267287
#define TOTAL_ANALOG_PINS 14
268288
#define TOTAL_PINS 38 // 24 digital + 10 analog-digital + 4 analog
269289
#define VERSION_BLINK_PIN 13
290+
#define PIN_SERIAL1_RX 0
291+
#define PIN_SERIAL1_TX 1
292+
#define PIN_SERIAL2_RX 9
293+
#define PIN_SERIAL2_TX 10
294+
#define PIN_SERIAL3_RX 7
295+
#define PIN_SERIAL3_TX 8
270296
#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) <= 34)
271297
#define IS_PIN_ANALOG(p) (((p) >= 14 && (p) <= 23) || ((p) >= 34 && (p) <= 38))
272298
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
273299
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
274300
#define IS_PIN_I2C(p) ((p) == 18 || (p) == 19)
301+
#define IS_PIN_SERIAL(p) (((p) > 6 && (p) < 11) || ((p) == 0 || (p) == 1))
275302
#define PIN_TO_DIGITAL(p) (p)
276303
#define PIN_TO_ANALOG(p) (((p)<=23)?(p)-14:(p)-24)
277304
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -283,12 +310,15 @@ writePort(port, value, bitmask): Write an 8 bit port.
283310
#define TOTAL_ANALOG_PINS 8
284311
#define TOTAL_PINS 46 // 38 digital + 8 analog
285312
#define VERSION_BLINK_PIN 6
313+
#define PIN_SERIAL1_RX 2
314+
#define PIN_SERIAL1_TX 3
286315
#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
287316
#define IS_PIN_ANALOG(p) ((p) >= 38 && (p) < TOTAL_PINS)
288317
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
289318
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
290319
#define IS_PIN_I2C(p) ((p) == 0 || (p) == 1)
291320
#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
321+
#define IS_PIN_SERIAL(p) ((p) == 2 || (p) == 3)
292322
#define PIN_TO_DIGITAL(p) (p)
293323
#define PIN_TO_ANALOG(p) ((p) - 38)
294324
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -300,28 +330,35 @@ writePort(port, value, bitmask): Write an 8 bit port.
300330
#define TOTAL_ANALOG_PINS 12
301331
#define TOTAL_PINS 30 // 14 digital + 12 analog + 4 SPI (D14-D17 on ISP header)
302332
#define VERSION_BLINK_PIN 13
333+
#define PIN_SERIAL1_RX 0
334+
#define PIN_SERIAL1_TX 1
303335
#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS)
304336
#define IS_PIN_ANALOG(p) ((p) >= 18 && (p) < TOTAL_PINS)
305337
#define IS_PIN_PWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11 || (p) == 13)
306338
#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS)
307339
#define IS_PIN_I2C(p) ((p) == 2 || (p) == 3)
308340
#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
341+
#define IS_PIN_SERIAL(p) ((p) == 0 || (p) == 1)
309342
#define PIN_TO_DIGITAL(p) (p)
310343
#define PIN_TO_ANALOG(p) (p) - 18
311344
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
312345
#define PIN_TO_SERVO(p) (p)
313346

347+
314348
// Intel Galileo Board
315349
#elif defined(ARDUINO_LINUX)
316350
#define TOTAL_ANALOG_PINS 6
317351
#define TOTAL_PINS 20 // 14 digital + 6 analog
318352
#define VERSION_BLINK_PIN 13
353+
#define PIN_SERIAL1_RX 0
354+
#define PIN_SERIAL1_TX 1
319355
#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) <= 19)
320356
#define IS_PIN_ANALOG(p) ((p) >= 14 && (p) <= 19)
321357
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
322358
#define IS_PIN_SERVO(p) (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS)
323359
#define IS_PIN_I2C(p) ((p) == SDA || (p) == SCL)
324360
#define IS_PIN_SPI(p) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
361+
#define IS_PIN_SERIAL(p) ((p) == 0 || (p) == 1)
325362
#define PIN_TO_DIGITAL(p) (p)
326363
#define PIN_TO_ANALOG(p) ((p) - 14)
327364
#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p)
@@ -490,7 +527,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
490527
// Pic32 chipKIT MAX32
491528
#elif defined(_BOARD_MEGA_) && defined(__PIC32) // NOTE: no _BOARD_MAX32_ to use
492529
#define TOTAL_ANALOG_PINS NUM_ANALOG_PINS // 16
493-
#define TOTAL_PINS NUM_DIGITAL_PINS // 87
530+
#define TOTAL_PINS NUM_DIGITAL_PINS // 87
494531
#define MAX_SERVOS NUM_DIGITAL_PINS
495532
#define VERSION_BLINK_PIN PIN_LED1
496533
#define IS_PIN_DIGITAL(p) ((p) >= 2)
@@ -534,6 +571,10 @@ writePort(port, value, bitmask): Write an 8 bit port.
534571
#define IS_PIN_SPI(p) 0
535572
#endif
536573

574+
#ifndef IS_PIN_SERIAL
575+
#define IS_PIN_SERIAL(p) 0
576+
#endif
577+
537578
/*==============================================================================
538579
* readPort() - Read an 8 bit port
539580
*============================================================================*/

Firmata.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
// extended command set using sysex (0-127/0x00-0x7F)
4343
/* 0x00-0x0F reserved for user-defined commands */
44+
#define SERIAL_MESSAGE 0x60 // communicate with serial devices, including other boards
4445
#define ENCODER_DATA 0x61 // reply with encoders current positions
4546
#define SERVO_CONFIG 0x70 // set max angle, minPulse, maxPulse, freq
4647
#define STRING_DATA 0x71 // a string message with 14-bits per char
@@ -79,8 +80,9 @@
7980
#define ONEWIRE 0x07 // pin configured for 1-wire
8081
#define STEPPER 0x08 // pin configured for stepper motor
8182
#define ENCODER 0x09 // pin configured for rotary encoders
83+
#define MODE_SERIAL 0x0A // pin configured for serial communication
8284
#define IGNORE 0x7F // pin configured to be ignored by digitalWrite and capabilityResponse
83-
#define TOTAL_PIN_MODES 11
85+
#define TOTAL_PIN_MODES 12
8486

8587
extern "C" {
8688
// callback function types

examples/StandardFirmata/LICENSE.txt

100644100755
File mode changed.

examples/StandardFirmata/StandardFirmata.ino

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#define I2C_REGISTER_NOT_SPECIFIED -1
3838

3939
// the minimum interval for sampling analog input
40-
#define MINIMUM_SAMPLING_INTERVAL 10
40+
#define MINIMUM_SAMPLING_INTERVAL 10
4141

4242

4343
/*==============================================================================

examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
#define I2C_REGISTER_NOT_SPECIFIED -1
3939

4040
// the minimum interval for sampling analog input
41-
#define MINIMUM_SAMPLING_INTERVAL 10
41+
#define MINIMUM_SAMPLING_INTERVAL 10
4242

4343

4444
/*==============================================================================

0 commit comments

Comments
 (0)