11
11
Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved.
12
12
Copyright (C) 2010-2011 Paul Stoffregen. All rights reserved.
13
13
Copyright (C) 2009 Shigeru Kobayashi. All rights reserved.
14
- Copyright (C) 2009-2015 Jeff Hoefs. All rights reserved.
14
+ Copyright (C) 2009-2016 Jeff Hoefs. All rights reserved.
15
15
16
16
This library is free software; you can redistribute it and/or
17
17
modify it under the terms of the GNU Lesser General Public
20
20
21
21
See file LICENSE.txt for further informations on licensing terms.
22
22
23
- Last updated by Jeff Hoefs: December 26th, 2015
23
+ Last updated by Jeff Hoefs: January 10th, 2016
24
24
*/
25
25
26
26
#include < Servo.h>
47
47
* GLOBAL VARIABLES
48
48
*============================================================================*/
49
49
50
+ #ifdef FIRMATA_SERIAL_FEATURE
51
+ SerialFirmata serialFeature;
52
+ #endif
53
+
50
54
/* analog inputs */
51
55
int analogInputsToReport = 0 ; // bitwise array to store pin reporting
52
56
@@ -55,9 +59,7 @@ byte reportPINs[TOTAL_PORTS]; // 1 = report this port, 0 = silence
55
59
byte previousPINs[TOTAL_PORTS]; // previous 8 bits sent
56
60
57
61
/* pins configuration */
58
- byte pinConfig[TOTAL_PINS]; // configuration of every pin
59
62
byte portConfigInputs[TOTAL_PORTS]; // each bit: 1 = pin in INPUT, 0 = anything else
60
- int pinState[TOTAL_PINS]; // any value that has been written
61
63
62
64
/* timer variables */
63
65
unsigned long currentMillis; // store the current value from millis()
@@ -89,6 +91,7 @@ byte servoCount = 0;
89
91
90
92
boolean isResetting = false ;
91
93
94
+
92
95
/* utility functions */
93
96
void wireWrite (byte data)
94
97
{
@@ -230,10 +233,10 @@ void checkDigitalInputs(void)
230
233
*/
231
234
void setPinModeCallback (byte pin, int mode)
232
235
{
233
- if (pinConfig[ pin] == PIN_MODE_IGNORE)
236
+ if (Firmata. getPinMode ( pin) == PIN_MODE_IGNORE)
234
237
return ;
235
238
236
- if (pinConfig[ pin] == PIN_MODE_I2C && isI2CEnabled && mode != PIN_MODE_I2C) {
239
+ if (Firmata. getPinMode ( pin) == PIN_MODE_I2C && isI2CEnabled && mode != PIN_MODE_I2C) {
237
240
// disable i2c so pins can be used for other functions
238
241
// the following if statements should reconfigure the pins properly
239
242
disableI2CPins ();
@@ -253,7 +256,7 @@ void setPinModeCallback(byte pin, int mode)
253
256
portConfigInputs[pin / 8 ] &= ~(1 << (pin & 7 ));
254
257
}
255
258
}
256
- pinState[ pin] = 0 ;
259
+ Firmata. setPinState ( pin, 0 ) ;
257
260
switch (mode) {
258
261
case PIN_MODE_ANALOG:
259
262
if (IS_PIN_ANALOG (pin)) {
@@ -264,7 +267,7 @@ void setPinModeCallback(byte pin, int mode)
264
267
digitalWrite (PIN_TO_DIGITAL (pin), LOW); // disable internal pull-ups
265
268
#endif
266
269
}
267
- pinConfig[ pin] = PIN_MODE_ANALOG;
270
+ Firmata. setPinMode ( pin, PIN_MODE_ANALOG) ;
268
271
}
269
272
break ;
270
273
case INPUT:
@@ -274,33 +277,33 @@ void setPinModeCallback(byte pin, int mode)
274
277
// deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6
275
278
digitalWrite (PIN_TO_DIGITAL (pin), LOW); // disable internal pull-ups
276
279
#endif
277
- pinConfig[ pin] = INPUT;
280
+ Firmata. setPinMode ( pin, INPUT) ;
278
281
}
279
282
break ;
280
283
case PIN_MODE_PULLUP:
281
284
if (IS_PIN_DIGITAL (pin)) {
282
285
pinMode (PIN_TO_DIGITAL (pin), INPUT_PULLUP);
283
- pinConfig[ pin] = PIN_MODE_PULLUP;
284
- pinState[ pin] = 1 ;
286
+ Firmata. setPinMode ( pin, PIN_MODE_PULLUP) ;
287
+ Firmata. setPinState ( pin, 1 ) ;
285
288
}
286
289
break ;
287
290
case OUTPUT:
288
291
if (IS_PIN_DIGITAL (pin)) {
289
292
digitalWrite (PIN_TO_DIGITAL (pin), LOW); // disable PWM
290
293
pinMode (PIN_TO_DIGITAL (pin), OUTPUT);
291
- pinConfig[ pin] = OUTPUT;
294
+ Firmata. setPinMode ( pin, OUTPUT) ;
292
295
}
293
296
break ;
294
297
case PIN_MODE_PWM:
295
298
if (IS_PIN_PWM (pin)) {
296
299
pinMode (PIN_TO_PWM (pin), OUTPUT);
297
300
analogWrite (PIN_TO_PWM (pin), 0 );
298
- pinConfig[ pin] = PIN_MODE_PWM;
301
+ Firmata. setPinMode ( pin, PIN_MODE_PWM) ;
299
302
}
300
303
break ;
301
304
case PIN_MODE_SERVO:
302
305
if (IS_PIN_DIGITAL (pin)) {
303
- pinConfig[ pin] = PIN_MODE_SERVO;
306
+ Firmata. setPinMode ( pin, PIN_MODE_SERVO) ;
304
307
if (servoPinMap[pin] == 255 || !servos[servoPinMap[pin]].attached ()) {
305
308
// pass -1 for min and max pulse values to use default values set
306
309
// by Servo library
@@ -312,9 +315,14 @@ void setPinModeCallback(byte pin, int mode)
312
315
if (IS_PIN_I2C (pin)) {
313
316
// mark the pin as i2c
314
317
// the user must call I2C_CONFIG to enable I2C for a device
315
- pinConfig[ pin] = PIN_MODE_I2C;
318
+ Firmata. setPinMode ( pin, PIN_MODE_I2C) ;
316
319
}
317
320
break ;
321
+ case PIN_MODE_SERIAL:
322
+ #ifdef FIRMATA_SERIAL_FEATURE
323
+ serialFeature.handlePinMode (pin, PIN_MODE_SERIAL);
324
+ #endif
325
+ break ;
318
326
default :
319
327
Firmata.sendString (" Unknown pin mode" ); // TODO: put error msgs in EEPROM
320
328
}
@@ -330,8 +338,8 @@ void setPinModeCallback(byte pin, int mode)
330
338
void setPinValueCallback (byte pin, int value)
331
339
{
332
340
if (pin < TOTAL_PINS && IS_PIN_DIGITAL (pin)) {
333
- if (pinConfig[ pin] == OUTPUT) {
334
- pinState[ pin] = value;
341
+ if (Firmata. getPinMode ( pin) == OUTPUT) {
342
+ Firmata. setPinState ( pin, value) ;
335
343
digitalWrite (PIN_TO_DIGITAL (pin), value);
336
344
}
337
345
}
@@ -340,16 +348,16 @@ void setPinValueCallback(byte pin, int value)
340
348
void analogWriteCallback (byte pin, int value)
341
349
{
342
350
if (pin < TOTAL_PINS) {
343
- switch (pinConfig[ pin] ) {
351
+ switch (Firmata. getPinMode ( pin) ) {
344
352
case PIN_MODE_SERVO:
345
353
if (IS_PIN_DIGITAL (pin))
346
354
servos[servoPinMap[pin]].write (value);
347
- pinState[ pin] = value;
355
+ Firmata. setPinState ( pin, value) ;
348
356
break ;
349
357
case PIN_MODE_PWM:
350
358
if (IS_PIN_PWM (pin))
351
359
analogWrite (PIN_TO_PWM (pin), value);
352
- pinState[ pin] = value;
360
+ Firmata. setPinState ( pin, value) ;
353
361
break ;
354
362
}
355
363
}
@@ -367,11 +375,11 @@ void digitalWriteCallback(byte port, int value)
367
375
// do not disturb non-digital pins (eg, Rx & Tx)
368
376
if (IS_PIN_DIGITAL (pin)) {
369
377
// do not touch pins in PWM, ANALOG, SERVO or other modes
370
- if (pinConfig[ pin] == OUTPUT || pinConfig[ pin] == INPUT) {
378
+ if (Firmata. getPinMode ( pin) == OUTPUT || Firmata. getPinMode ( pin) == INPUT) {
371
379
pinValue = ((byte)value & mask) ? 1 : 0 ;
372
- if (pinConfig[ pin] == OUTPUT) {
380
+ if (Firmata. getPinMode ( pin) == OUTPUT) {
373
381
pinWriteMask |= mask;
374
- } else if (pinConfig[ pin] == INPUT && pinValue == 1 && pinState[ pin] != 1 ) {
382
+ } else if (Firmata. getPinMode ( pin) == INPUT && pinValue == 1 && Firmata. getPinState ( pin) != 1 ) {
375
383
// only handle INPUT here for backwards compatibility
376
384
#if ARDUINO > 100
377
385
pinMode (pin, INPUT_PULLUP);
@@ -380,7 +388,7 @@ void digitalWriteCallback(byte port, int value)
380
388
pinWriteMask |= mask;
381
389
#endif
382
390
}
383
- pinState[ pin] = pinValue;
391
+ Firmata. setPinState ( pin, pinValue) ;
384
392
}
385
393
}
386
394
mask = mask << 1 ;
@@ -617,6 +625,9 @@ void sysexCallback(byte command, byte argc, byte *argv)
617
625
Firmata.write (PIN_MODE_I2C);
618
626
Firmata.write (1 ); // TODO: could assign a number to map to SCL or SDA
619
627
}
628
+ #ifdef FIRMATA_SERIAL_FEATURE
629
+ serialFeature.handleCapability (pin);
630
+ #endif
620
631
Firmata.write (127 );
621
632
}
622
633
Firmata.write (END_SYSEX);
@@ -628,10 +639,10 @@ void sysexCallback(byte command, byte argc, byte *argv)
628
639
Firmata.write (PIN_STATE_RESPONSE);
629
640
Firmata.write (pin);
630
641
if (pin < TOTAL_PINS) {
631
- Firmata.write ((byte)pinConfig[ pin] );
632
- Firmata.write ((byte)pinState[ pin] & 0x7F );
633
- if (pinState[ pin] & 0xFF80 ) Firmata.write ((byte)(pinState[ pin] >> 7 ) & 0x7F );
634
- if (pinState[ pin] & 0xC000 ) Firmata.write ((byte)(pinState[ pin] >> 14 ) & 0x7F );
642
+ Firmata.write (Firmata. getPinMode ( pin) );
643
+ Firmata.write ((byte)Firmata. getPinState ( pin) & 0x7F );
644
+ if (Firmata. getPinState ( pin) & 0xFF80 ) Firmata.write ((byte)(Firmata. getPinState ( pin) >> 7 ) & 0x7F );
645
+ if (Firmata. getPinState ( pin) & 0xC000 ) Firmata.write ((byte)(Firmata. getPinState ( pin) >> 14 ) & 0x7F );
635
646
}
636
647
Firmata.write (END_SYSEX);
637
648
}
@@ -644,6 +655,12 @@ void sysexCallback(byte command, byte argc, byte *argv)
644
655
}
645
656
Firmata.write (END_SYSEX);
646
657
break ;
658
+
659
+ case SERIAL_MESSAGE:
660
+ #ifdef FIRMATA_SERIAL_FEATURE
661
+ serialFeature.handleSysex (command, argc, argv);
662
+ #endif
663
+ break ;
647
664
}
648
665
}
649
666
@@ -682,6 +699,10 @@ void systemResetCallback()
682
699
// initialize a defalt state
683
700
// TODO: option to load config from EEPROM instead of default
684
701
702
+ #ifdef FIRMATA_SERIAL_FEATURE
703
+ serialFeature.reset ();
704
+ #endif
705
+
685
706
if (isI2CEnabled) {
686
707
disableI2CPins ();
687
708
}
@@ -740,12 +761,13 @@ void setup()
740
761
// Call begin(baud) on the alternate serial port and pass it to Firmata to begin like this:
741
762
// Serial1.begin(57600);
742
763
// Firmata.begin(Serial1);
743
- // then comment out or remove lines 701 - 704 below
764
+ // However do not do this if you are using SERIAL_MESSAGE
744
765
745
766
Firmata.begin (57600 );
746
767
while (!Serial) {
747
768
; // wait for serial port to connect. Needed for ATmega32u4-based boards and Arduino 101
748
769
}
770
+
749
771
systemResetCallback (); // reset to default config
750
772
}
751
773
@@ -772,7 +794,7 @@ void loop()
772
794
previousMillis += samplingInterval;
773
795
/* ANALOGREAD - do all analogReads() at the configured sampling interval */
774
796
for (pin = 0 ; pin < TOTAL_PINS; pin++) {
775
- if (IS_PIN_ANALOG (pin) && pinConfig[ pin] == PIN_MODE_ANALOG) {
797
+ if (IS_PIN_ANALOG (pin) && Firmata. getPinMode ( pin) == PIN_MODE_ANALOG) {
776
798
analogPin = PIN_TO_ANALOG (pin);
777
799
if (analogInputsToReport & (1 << analogPin)) {
778
800
Firmata.sendAnalog (analogPin, analogRead (analogPin));
@@ -786,4 +808,8 @@ void loop()
786
808
}
787
809
}
788
810
}
811
+
812
+ #ifdef FIRMATA_SERIAL_FEATURE
813
+ serialFeature.update ();
814
+ #endif
789
815
}
0 commit comments