22
22
23
23
See file LICENSE.txt for further informations on licensing terms.
24
24
25
- Last updated August 17th, 2017
25
+ Last updated December 17th, 2023
26
26
*/
27
27
28
28
/*
74
74
- Arduino Mega: (D5, D7, D10, D50, D52, D53)
75
75
*/
76
76
77
- #include < Servo.h>
77
+ #ifndef ARDUINO_ARCH_ESP32
78
+ // NOTE: ESP32 SKD does not provide an implementation for class Servo
79
+ // -> requires a skeleton implementation for Servo in Boards.h to be able to compile
80
+ #include < Servo.h>
81
+ #endif
78
82
#include < Wire.h>
79
83
#include < Firmata.h>
80
84
@@ -235,8 +239,10 @@ void detachServo(byte pin)
235
239
} else if (servoCount > 0 ) {
236
240
// keep track of detached servos because we want to reuse their indexes
237
241
// before incrementing the count of attached servos
238
- detachedServoCount++;
239
- detachedServos[detachedServoCount - 1 ] = servoPinMap[pin];
242
+ if (detachedServoCount < MAX_SERVOS) {
243
+ detachedServos[detachedServoCount] = servoPinMap[pin];
244
+ detachedServoCount++;
245
+ }
240
246
}
241
247
242
248
servoPinMap[pin] = 255 ;
@@ -370,7 +376,7 @@ void setPinModeCallback(byte pin, int mode)
370
376
reportAnalogCallback (PIN_TO_ANALOG (pin), mode == PIN_MODE_ANALOG ? 1 : 0 ); // turn on/off reporting
371
377
}
372
378
if (IS_PIN_DIGITAL (pin)) {
373
- if (mode == INPUT || mode == PIN_MODE_PULLUP) {
379
+ if (mode == PIN_MODE_INPUT || mode == PIN_MODE_PULLUP) {
374
380
portConfigInputs[pin / 8 ] |= (1 << (pin & 7 ));
375
381
} else {
376
382
portConfigInputs[pin / 8 ] &= ~(1 << (pin & 7 ));
@@ -390,14 +396,14 @@ void setPinModeCallback(byte pin, int mode)
390
396
Firmata.setPinMode (pin, PIN_MODE_ANALOG);
391
397
}
392
398
break ;
393
- case INPUT :
399
+ case PIN_MODE_INPUT :
394
400
if (IS_PIN_DIGITAL (pin)) {
395
401
pinMode (PIN_TO_DIGITAL (pin), INPUT); // disable output driver
396
402
#if ARDUINO <= 100
397
403
// deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6
398
404
digitalWrite (PIN_TO_DIGITAL (pin), LOW); // disable internal pull-ups
399
405
#endif
400
- Firmata.setPinMode (pin, INPUT );
406
+ Firmata.setPinMode (pin, PIN_MODE_INPUT );
401
407
}
402
408
break ;
403
409
case PIN_MODE_PULLUP:
@@ -407,14 +413,14 @@ void setPinModeCallback(byte pin, int mode)
407
413
Firmata.setPinState (pin, 1 );
408
414
}
409
415
break ;
410
- case OUTPUT :
416
+ case PIN_MODE_OUTPUT :
411
417
if (IS_PIN_DIGITAL (pin)) {
412
418
if (Firmata.getPinMode (pin) == PIN_MODE_PWM) {
413
419
// Disable PWM if pin mode was previously set to PWM.
414
420
digitalWrite (PIN_TO_DIGITAL (pin), LOW);
415
421
}
416
422
pinMode (PIN_TO_DIGITAL (pin), OUTPUT);
417
- Firmata.setPinMode (pin, OUTPUT );
423
+ Firmata.setPinMode (pin, PIN_MODE_OUTPUT );
418
424
}
419
425
break ;
420
426
case PIN_MODE_PWM:
@@ -461,7 +467,7 @@ void setPinModeCallback(byte pin, int mode)
461
467
void setPinValueCallback (byte pin, int value)
462
468
{
463
469
if (pin < TOTAL_PINS && IS_PIN_DIGITAL (pin)) {
464
- if (Firmata.getPinMode (pin) == OUTPUT ) {
470
+ if (Firmata.getPinMode (pin) == PIN_MODE_OUTPUT ) {
465
471
Firmata.setPinState (pin, value);
466
472
digitalWrite (PIN_TO_DIGITAL (pin), value);
467
473
}
@@ -498,11 +504,11 @@ void digitalWriteCallback(byte port, int value)
498
504
// do not disturb non-digital pins (eg, Rx & Tx)
499
505
if (IS_PIN_DIGITAL (pin)) {
500
506
// do not touch pins in PWM, ANALOG, SERVO or other modes
501
- if (Firmata.getPinMode (pin) == OUTPUT || Firmata.getPinMode (pin) == INPUT ) {
507
+ if (Firmata.getPinMode (pin) == PIN_MODE_OUTPUT || Firmata.getPinMode (pin) == PIN_MODE_INPUT ) {
502
508
pinValue = ((byte)value & mask) ? 1 : 0 ;
503
- if (Firmata.getPinMode (pin) == OUTPUT ) {
509
+ if (Firmata.getPinMode (pin) == PIN_MODE_OUTPUT ) {
504
510
pinWriteMask |= mask;
505
- } else if (Firmata.getPinMode (pin) == INPUT && pinValue == 1 && Firmata.getPinState (pin) != 1 ) {
511
+ } else if (Firmata.getPinMode (pin) == PIN_MODE_INPUT && pinValue == 1 && Firmata.getPinState (pin) != 1 ) {
506
512
// only handle INPUT here for backwards compatibility
507
513
#if ARDUINO > 100
508
514
pinMode (pin, INPUT_PULLUP);
@@ -725,22 +731,26 @@ void sysexCallback(byte command, byte argc, byte *argv)
725
731
Firmata.write (CAPABILITY_RESPONSE);
726
732
for (byte pin = 0 ; pin < TOTAL_PINS; pin++) {
727
733
if (IS_PIN_DIGITAL (pin)) {
728
- Firmata.write ((byte)INPUT );
734
+ Firmata.write ((byte)PIN_MODE_INPUT );
729
735
Firmata.write (1 );
730
736
Firmata.write ((byte)PIN_MODE_PULLUP);
731
737
Firmata.write (1 );
732
- Firmata.write ((byte)OUTPUT );
738
+ Firmata.write ((byte)PIN_MODE_OUTPUT );
733
739
Firmata.write (1 );
734
740
}
735
741
if (IS_PIN_ANALOG (pin)) {
736
742
Firmata.write (PIN_MODE_ANALOG);
743
+ #ifdef DEFAULT_ANALOG_RESOLUTION
744
+ Firmata.write (DEFAULT_ANALOG_RESOLUTION);
745
+ #else
737
746
Firmata.write (10 ); // 10 = 10-bit resolution
747
+ #endif
738
748
}
739
749
if (IS_PIN_PWM (pin)) {
740
750
Firmata.write (PIN_MODE_PWM);
741
751
Firmata.write (DEFAULT_PWM_RESOLUTION);
742
752
}
743
- if (IS_PIN_DIGITAL (pin)) {
753
+ if (IS_PIN_SERVO (pin)) {
744
754
Firmata.write (PIN_MODE_SERVO);
745
755
Firmata.write (14 );
746
756
}
@@ -820,7 +830,7 @@ void systemResetCallback()
820
830
setPinModeCallback (i, PIN_MODE_ANALOG);
821
831
} else if (IS_PIN_DIGITAL (i)) {
822
832
// sets the output to 0, configures portConfigInputs
823
- setPinModeCallback (i, OUTPUT );
833
+ setPinModeCallback (i, PIN_MODE_OUTPUT );
824
834
}
825
835
826
836
servoPinMap[i] = 255 ;
@@ -871,6 +881,7 @@ void printWifiStatus() {
871
881
DEBUG_PRINT ( " WiFi connection failed. Status value: " );
872
882
DEBUG_PRINTLN ( WiFi.status () );
873
883
}
884
+ #ifdef SERIAL_DEBUG
874
885
else
875
886
{
876
887
// print the SSID of the network you're attached to:
@@ -888,6 +899,7 @@ void printWifiStatus() {
888
899
DEBUG_PRINT ( rssi );
889
900
DEBUG_PRINTLN ( " dBm" );
890
901
}
902
+ #endif
891
903
}
892
904
893
905
/*
0 commit comments