66#include <inttypes.h>
77
88#if defined(ARDUINO ) && ARDUINO >= 100
9- #include "Arduino.h" // for digitalRead, digitalWrite, etc
9+ #include "Arduino.h" // for digitalRead, digitalWrite, etc
1010#else
1111#include "WProgram.h"
1212#endif
2323 Firmata Hardware Abstraction Layer
2424
2525Firmata is built on top of the hardware abstraction functions of Arduino,
26- specifically digitalWrite, digitalRead, analogWrite, analogRead, and
26+ specifically digitalWrite, digitalRead, analogWrite, analogRead, and
2727pinMode. While these functions offer simple integer pin numbers, Firmata
2828needs more information than is provided by Arduino. This file provides
2929all other hardware specific details. To make Firmata support a new board,
@@ -165,7 +165,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
165165#define PIN_TO_DIGITAL (p ) (p)
166166#define PIN_TO_ANALOG (p ) ((p) - FIRST_ANALOG_PIN)
167167#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
168- #define PIN_TO_SERVO (p ) (p)
168+ #define PIN_TO_SERVO (p ) (p)
169169
170170
171171// old Arduinos
@@ -214,7 +214,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
214214#define IS_PIN_PWM (p ) digitalPinHasPWM(p)
215215#define IS_PIN_SERVO (p ) ((p) >= 2 && (p) - 2 < MAX_SERVOS)
216216#define IS_PIN_I2C (p ) ((p) == 20 || (p) == 21) // 70 71
217- #define IS_PIN_INTERRUPT (p ) IS_PIN_DIGITAL(p)
217+ #define IS_PIN_INTERRUPT (p ) IS_PIN_DIGITAL(p)
218218#define PIN_TO_DIGITAL (p ) (p)
219219#define PIN_TO_ANALOG (p ) ((p) - 54)
220220#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
@@ -271,7 +271,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
271271#define PIN_TO_DIGITAL (p ) (p)
272272#define PIN_TO_ANALOG (p ) (((p)<=23)?(p)-14:(p)-24)
273273#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
274- #define PIN_TO_SERVO (p ) (p)
274+ #define PIN_TO_SERVO (p ) (p)
275275
276276
277277// Teensy++ 1.0 and 2.0
@@ -307,7 +307,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
307307#define PIN_TO_DIGITAL (p ) (p)
308308#define PIN_TO_ANALOG (p ) (p) - 18
309309#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
310- #define PIN_TO_SERVO (p ) (p)
310+ #define PIN_TO_SERVO (p ) (p)
311311
312312
313313// Intel Galileo Board
@@ -320,7 +320,7 @@ writePort(port, value, bitmask): Write an 8 bit port.
320320#define IS_PIN_PWM (p ) digitalPinHasPWM(p)
321321#define IS_PIN_SERVO (p ) (IS_PIN_DIGITAL(p) && (p) - 2 < MAX_SERVOS)
322322#define IS_PIN_I2C (p ) ((p) == SDA || (p) == SCL)
323- #define IS_PIN_SPI (p ) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
323+ #define IS_PIN_SPI (p ) ((p) == SS || (p) == MOSI || (p) == MISO || (p) == SCK)
324324#define PIN_TO_DIGITAL (p ) (p)
325325#define PIN_TO_ANALOG (p ) ((p) - 14)
326326#define PIN_TO_PWM (p ) PIN_TO_DIGITAL(p)
@@ -379,21 +379,21 @@ static inline unsigned char readPort(byte, byte) __attribute__((always_inline, u
379379static inline unsigned char readPort (byte port , byte bitmask )
380380{
381381#if defined(ARDUINO_PINOUT_OPTIMIZE )
382- if (port == 0 ) return (PIND & 0xFC ) & bitmask ; // ignore Rx/Tx 0/1
383- if (port == 1 ) return ((PINB & 0x3F ) | ((PINC & 0x03 ) << 6 )) & bitmask ;
384- if (port == 2 ) return ((PINC & 0x3C ) >> 2 ) & bitmask ;
385- return 0 ;
382+ if (port == 0 ) return (PIND & 0xFC ) & bitmask ; // ignore Rx/Tx 0/1
383+ if (port == 1 ) return ((PINB & 0x3F ) | ((PINC & 0x03 ) << 6 )) & bitmask ;
384+ if (port == 2 ) return ((PINC & 0x3C ) >> 2 ) & bitmask ;
385+ return 0 ;
386386#else
387- unsigned char out = 0 , pin = port * 8 ;
388- if (IS_PIN_DIGITAL (pin + 0 ) && (bitmask & 0x01 ) && digitalRead (PIN_TO_DIGITAL (pin + 0 ))) out |= 0x01 ;
389- if (IS_PIN_DIGITAL (pin + 1 ) && (bitmask & 0x02 ) && digitalRead (PIN_TO_DIGITAL (pin + 1 ))) out |= 0x02 ;
390- if (IS_PIN_DIGITAL (pin + 2 ) && (bitmask & 0x04 ) && digitalRead (PIN_TO_DIGITAL (pin + 2 ))) out |= 0x04 ;
391- if (IS_PIN_DIGITAL (pin + 3 ) && (bitmask & 0x08 ) && digitalRead (PIN_TO_DIGITAL (pin + 3 ))) out |= 0x08 ;
392- if (IS_PIN_DIGITAL (pin + 4 ) && (bitmask & 0x10 ) && digitalRead (PIN_TO_DIGITAL (pin + 4 ))) out |= 0x10 ;
393- if (IS_PIN_DIGITAL (pin + 5 ) && (bitmask & 0x20 ) && digitalRead (PIN_TO_DIGITAL (pin + 5 ))) out |= 0x20 ;
394- if (IS_PIN_DIGITAL (pin + 6 ) && (bitmask & 0x40 ) && digitalRead (PIN_TO_DIGITAL (pin + 6 ))) out |= 0x40 ;
395- if (IS_PIN_DIGITAL (pin + 7 ) && (bitmask & 0x80 ) && digitalRead (PIN_TO_DIGITAL (pin + 7 ))) out |= 0x80 ;
396- return out ;
387+ unsigned char out = 0 , pin = port * 8 ;
388+ if (IS_PIN_DIGITAL (pin + 0 ) && (bitmask & 0x01 ) && digitalRead (PIN_TO_DIGITAL (pin + 0 ))) out |= 0x01 ;
389+ if (IS_PIN_DIGITAL (pin + 1 ) && (bitmask & 0x02 ) && digitalRead (PIN_TO_DIGITAL (pin + 1 ))) out |= 0x02 ;
390+ if (IS_PIN_DIGITAL (pin + 2 ) && (bitmask & 0x04 ) && digitalRead (PIN_TO_DIGITAL (pin + 2 ))) out |= 0x04 ;
391+ if (IS_PIN_DIGITAL (pin + 3 ) && (bitmask & 0x08 ) && digitalRead (PIN_TO_DIGITAL (pin + 3 ))) out |= 0x08 ;
392+ if (IS_PIN_DIGITAL (pin + 4 ) && (bitmask & 0x10 ) && digitalRead (PIN_TO_DIGITAL (pin + 4 ))) out |= 0x10 ;
393+ if (IS_PIN_DIGITAL (pin + 5 ) && (bitmask & 0x20 ) && digitalRead (PIN_TO_DIGITAL (pin + 5 ))) out |= 0x20 ;
394+ if (IS_PIN_DIGITAL (pin + 6 ) && (bitmask & 0x40 ) && digitalRead (PIN_TO_DIGITAL (pin + 6 ))) out |= 0x40 ;
395+ if (IS_PIN_DIGITAL (pin + 7 ) && (bitmask & 0x80 ) && digitalRead (PIN_TO_DIGITAL (pin + 7 ))) out |= 0x80 ;
396+ return out ;
397397#endif
398398}
399399
@@ -405,42 +405,47 @@ static inline unsigned char writePort(byte, byte, byte) __attribute__((always_in
405405static inline unsigned char writePort (byte port , byte value , byte bitmask )
406406{
407407#if defined(ARDUINO_PINOUT_OPTIMIZE )
408- if (port == 0 ) {
409- bitmask = bitmask & 0xFC ; // do not touch Tx & Rx pins
410- byte valD = value & bitmask ;
411- byte maskD = ~bitmask ;
412- cli ();
413- PORTD = (PORTD & maskD ) | valD ;
414- sei ();
415- } else if (port == 1 ) {
416- byte valB = (value & bitmask ) & 0x3F ;
417- byte valC = (value & bitmask ) >> 6 ;
418- byte maskB = ~(bitmask & 0x3F );
419- byte maskC = ~((bitmask & 0xC0 ) >> 6 );
420- cli ();
421- PORTB = (PORTB & maskB ) | valB ;
422- PORTC = (PORTC & maskC ) | valC ;
423- sei ();
424- } else if (port == 2 ) {
425- bitmask = bitmask & 0x0F ;
426- byte valC = (value & bitmask ) << 2 ;
427- byte maskC = ~(bitmask << 2 );
428- cli ();
429- PORTC = (PORTC & maskC ) | valC ;
430- sei ();
431- }
432- return 1 ;
408+ if (port == 0 )
409+ {
410+ bitmask = bitmask & 0xFC ; // do not touch Tx & Rx pins
411+ byte valD = value & bitmask ;
412+ byte maskD = ~bitmask ;
413+ cli ();
414+ PORTD = (PORTD & maskD ) | valD ;
415+ sei ();
416+ }
417+ else if (port == 1 )
418+ {
419+ byte valB = (value & bitmask ) & 0x3F ;
420+ byte valC = (value & bitmask ) >> 6 ;
421+ byte maskB = ~(bitmask & 0x3F );
422+ byte maskC = ~((bitmask & 0xC0 ) >> 6 );
423+ cli ();
424+ PORTB = (PORTB & maskB ) | valB ;
425+ PORTC = (PORTC & maskC ) | valC ;
426+ sei ();
427+ }
428+ else if (port == 2 )
429+ {
430+ bitmask = bitmask & 0x0F ;
431+ byte valC = (value & bitmask ) << 2 ;
432+ byte maskC = ~(bitmask << 2 );
433+ cli ();
434+ PORTC = (PORTC & maskC ) | valC ;
435+ sei ();
436+ }
437+ return 1 ;
433438#else
434- byte pin = port * 8 ;
435- if ((bitmask & 0x01 )) digitalWrite (PIN_TO_DIGITAL (pin + 0 ), (value & 0x01 ));
436- if ((bitmask & 0x02 )) digitalWrite (PIN_TO_DIGITAL (pin + 1 ), (value & 0x02 ));
437- if ((bitmask & 0x04 )) digitalWrite (PIN_TO_DIGITAL (pin + 2 ), (value & 0x04 ));
438- if ((bitmask & 0x08 )) digitalWrite (PIN_TO_DIGITAL (pin + 3 ), (value & 0x08 ));
439- if ((bitmask & 0x10 )) digitalWrite (PIN_TO_DIGITAL (pin + 4 ), (value & 0x10 ));
440- if ((bitmask & 0x20 )) digitalWrite (PIN_TO_DIGITAL (pin + 5 ), (value & 0x20 ));
441- if ((bitmask & 0x40 )) digitalWrite (PIN_TO_DIGITAL (pin + 6 ), (value & 0x40 ));
442- if ((bitmask & 0x80 )) digitalWrite (PIN_TO_DIGITAL (pin + 7 ), (value & 0x80 ));
443- return 1 ;
439+ byte pin = port * 8 ;
440+ if ((bitmask & 0x01 )) digitalWrite (PIN_TO_DIGITAL (pin + 0 ), (value & 0x01 ));
441+ if ((bitmask & 0x02 )) digitalWrite (PIN_TO_DIGITAL (pin + 1 ), (value & 0x02 ));
442+ if ((bitmask & 0x04 )) digitalWrite (PIN_TO_DIGITAL (pin + 2 ), (value & 0x04 ));
443+ if ((bitmask & 0x08 )) digitalWrite (PIN_TO_DIGITAL (pin + 3 ), (value & 0x08 ));
444+ if ((bitmask & 0x10 )) digitalWrite (PIN_TO_DIGITAL (pin + 4 ), (value & 0x10 ));
445+ if ((bitmask & 0x20 )) digitalWrite (PIN_TO_DIGITAL (pin + 5 ), (value & 0x20 ));
446+ if ((bitmask & 0x40 )) digitalWrite (PIN_TO_DIGITAL (pin + 6 ), (value & 0x40 ));
447+ if ((bitmask & 0x80 )) digitalWrite (PIN_TO_DIGITAL (pin + 7 ), (value & 0x80 ));
448+ return 1 ;
444449#endif
445450}
446451
0 commit comments