2222
2323 See file LICENSE.txt for further informations on licensing terms.
2424
25- Last updated August 17th, 2017
25+ Last updated December 17th, 2023
2626*/
2727
2828/*
7474 - Arduino Mega: (D5, D7, D10, D50, D52, D53)
7575*/
7676
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
7882#include < Wire.h>
7983#include < Firmata.h>
8084
@@ -235,8 +239,10 @@ void detachServo(byte pin)
235239 } else if (servoCount > 0 ) {
236240 // keep track of detached servos because we want to reuse their indexes
237241 // 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+ }
240246 }
241247
242248 servoPinMap[pin] = 255 ;
@@ -370,7 +376,7 @@ void setPinModeCallback(byte pin, int mode)
370376 reportAnalogCallback (PIN_TO_ANALOG (pin), mode == PIN_MODE_ANALOG ? 1 : 0 ); // turn on/off reporting
371377 }
372378 if (IS_PIN_DIGITAL (pin)) {
373- if (mode == INPUT || mode == PIN_MODE_PULLUP) {
379+ if (mode == PIN_MODE_INPUT || mode == PIN_MODE_PULLUP) {
374380 portConfigInputs[pin / 8 ] |= (1 << (pin & 7 ));
375381 } else {
376382 portConfigInputs[pin / 8 ] &= ~(1 << (pin & 7 ));
@@ -390,14 +396,14 @@ void setPinModeCallback(byte pin, int mode)
390396 Firmata.setPinMode (pin, PIN_MODE_ANALOG);
391397 }
392398 break ;
393- case INPUT :
399+ case PIN_MODE_INPUT :
394400 if (IS_PIN_DIGITAL (pin)) {
395401 pinMode (PIN_TO_DIGITAL (pin), INPUT); // disable output driver
396402#if ARDUINO <= 100
397403 // deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6
398404 digitalWrite (PIN_TO_DIGITAL (pin), LOW); // disable internal pull-ups
399405#endif
400- Firmata.setPinMode (pin, INPUT );
406+ Firmata.setPinMode (pin, PIN_MODE_INPUT );
401407 }
402408 break ;
403409 case PIN_MODE_PULLUP:
@@ -407,14 +413,14 @@ void setPinModeCallback(byte pin, int mode)
407413 Firmata.setPinState (pin, 1 );
408414 }
409415 break ;
410- case OUTPUT :
416+ case PIN_MODE_OUTPUT :
411417 if (IS_PIN_DIGITAL (pin)) {
412418 if (Firmata.getPinMode (pin) == PIN_MODE_PWM) {
413419 // Disable PWM if pin mode was previously set to PWM.
414420 digitalWrite (PIN_TO_DIGITAL (pin), LOW);
415421 }
416422 pinMode (PIN_TO_DIGITAL (pin), OUTPUT);
417- Firmata.setPinMode (pin, OUTPUT );
423+ Firmata.setPinMode (pin, PIN_MODE_OUTPUT );
418424 }
419425 break ;
420426 case PIN_MODE_PWM:
@@ -461,7 +467,7 @@ void setPinModeCallback(byte pin, int mode)
461467void setPinValueCallback (byte pin, int value)
462468{
463469 if (pin < TOTAL_PINS && IS_PIN_DIGITAL (pin)) {
464- if (Firmata.getPinMode (pin) == OUTPUT ) {
470+ if (Firmata.getPinMode (pin) == PIN_MODE_OUTPUT ) {
465471 Firmata.setPinState (pin, value);
466472 digitalWrite (PIN_TO_DIGITAL (pin), value);
467473 }
@@ -498,11 +504,11 @@ void digitalWriteCallback(byte port, int value)
498504 // do not disturb non-digital pins (eg, Rx & Tx)
499505 if (IS_PIN_DIGITAL (pin)) {
500506 // 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 ) {
502508 pinValue = ((byte)value & mask) ? 1 : 0 ;
503- if (Firmata.getPinMode (pin) == OUTPUT ) {
509+ if (Firmata.getPinMode (pin) == PIN_MODE_OUTPUT ) {
504510 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 ) {
506512 // only handle INPUT here for backwards compatibility
507513#if ARDUINO > 100
508514 pinMode (pin, INPUT_PULLUP);
@@ -725,22 +731,26 @@ void sysexCallback(byte command, byte argc, byte *argv)
725731 Firmata.write (CAPABILITY_RESPONSE);
726732 for (byte pin = 0 ; pin < TOTAL_PINS; pin++) {
727733 if (IS_PIN_DIGITAL (pin)) {
728- Firmata.write ((byte)INPUT );
734+ Firmata.write ((byte)PIN_MODE_INPUT );
729735 Firmata.write (1 );
730736 Firmata.write ((byte)PIN_MODE_PULLUP);
731737 Firmata.write (1 );
732- Firmata.write ((byte)OUTPUT );
738+ Firmata.write ((byte)PIN_MODE_OUTPUT );
733739 Firmata.write (1 );
734740 }
735741 if (IS_PIN_ANALOG (pin)) {
736742 Firmata.write (PIN_MODE_ANALOG);
743+ #ifdef DEFAULT_ANALOG_RESOLUTION
744+ Firmata.write (DEFAULT_ANALOG_RESOLUTION);
745+ #else
737746 Firmata.write (10 ); // 10 = 10-bit resolution
747+ #endif
738748 }
739749 if (IS_PIN_PWM (pin)) {
740750 Firmata.write (PIN_MODE_PWM);
741751 Firmata.write (DEFAULT_PWM_RESOLUTION);
742752 }
743- if (IS_PIN_DIGITAL (pin)) {
753+ if (IS_PIN_SERVO (pin)) {
744754 Firmata.write (PIN_MODE_SERVO);
745755 Firmata.write (14 );
746756 }
@@ -820,7 +830,7 @@ void systemResetCallback()
820830 setPinModeCallback (i, PIN_MODE_ANALOG);
821831 } else if (IS_PIN_DIGITAL (i)) {
822832 // sets the output to 0, configures portConfigInputs
823- setPinModeCallback (i, OUTPUT );
833+ setPinModeCallback (i, PIN_MODE_OUTPUT );
824834 }
825835
826836 servoPinMap[i] = 255 ;
@@ -871,6 +881,7 @@ void printWifiStatus() {
871881 DEBUG_PRINT ( " WiFi connection failed. Status value: " );
872882 DEBUG_PRINTLN ( WiFi.status () );
873883 }
884+ #ifdef SERIAL_DEBUG
874885 else
875886 {
876887 // print the SSID of the network you're attached to:
@@ -888,6 +899,7 @@ void printWifiStatus() {
888899 DEBUG_PRINT ( rssi );
889900 DEBUG_PRINTLN ( " dBm" );
890901 }
902+ #endif
891903}
892904
893905/*
0 commit comments