2525#include "pins_arduino_analog.h"
2626#include "pins_arduino_digital.h"
2727
28+ /* Pin number */
29+ #define PNUM_MASK 0xFF
30+
2831/* Avoid PortName issue */
2932_Static_assert (LastPort <= 0x0F , "PortName must be less than 16" );
3033
@@ -85,11 +88,14 @@ extern const uint32_t analogInputPin[];
8588/* Convert a digital pin number Dxx to a PinName PX_n */
8689#if NUM_ANALOG_INPUTS > 0
8790/* Note: Analog pin is also a digital pin */
88- #define digitalPinToPinName (p ) (((uint32_t)(p) < NUM_DIGITAL_PINS) ? digitalPin[p] : \
89- (((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \
90- digitalPin[analogInputPin[(p)&PANA_IDX]] : NC)
91+ #define digitalPinToPinName (p ) ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
92+ (PinName)(digitalPin[(uint32_t)(p) & PNUM_MASK] | ((p) & ALTX)) : \
93+ (((uint32_t)(p) & PANA) == PANA) && \
94+ (((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \
95+ (PinName)(digitalPin[analogInputPin[(p) & PANA_IDX]] | ((p) & ALTX)) : NC)
9196#else
92- #define digitalPinToPinName (p ) (((uint32_t)(p) < NUM_DIGITAL_PINS) ? digitalPin[p] : NC)
97+ #define digitalPinToPinName (p ) ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
98+ (PinName)(digitalPin[(uint32_t)(p) & PNUM_MASK] | ((p) & ALTX)) : NC)
9399#endif /* NUM_ANALOG_INPUTS > 0 */
94100/* Convert a PinName PX_n to a digital pin number */
95101uint32_t pinNametoDigitalPin (PinName p );
@@ -98,9 +104,11 @@ uint32_t pinNametoDigitalPin(PinName p);
98104#if NUM_ANALOG_INPUTS > 0
99105/* Used by analogRead api to have A0 == 0 */
100106/* Non contiguous analog pins definition in digitalPin array */
101- #define analogInputToDigitalPin (p ) (((uint32_t)(p) < NUM_ANALOG_INPUTS) ? analogInputPin[p] : \
102- (((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \
103- analogInputPin[(p)&PANA_IDX] : (uint32_t)NC)
107+ #define analogInputToDigitalPin (p ) ((((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INPUTS) ? \
108+ analogInputPin[(uint32_t)(p) & PNUM_MASK] | ((uint32_t)(p) & ALTX) : \
109+ (((uint32_t)(p) & PANA) == PANA) && \
110+ (((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \
111+ analogInputPin[(p) & PANA_IDX] | ((uint32_t)(p) & ALTX) : (uint32_t)NC)
104112#else /* No analog pin defined */
105113#define analogInputToDigitalPin (p ) (NUM_DIGITAL_PINS)
106114#endif /* NUM_ANALOG_INPUTS > 0 */
@@ -159,10 +167,11 @@ PinName analogInputToPinName(uint32_t pin);
159167#define digitalPinFirstOccurence (p ) (pinNametoDigitalPin(digitalPinToPinName(p)))
160168
161169/* Specific for Firmata */
162- /* Some pins could be duplicated, ensure 'p' is not one of the serial pins */
163170#if defined(PIN_SERIAL_RX ) && defined(PIN_SERIAL_TX )
164- #define pinIsSerial (p ) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\
165- (digitalPinFirstOccurence(p) == PIN_SERIAL_TX))
171+ #define pinIsSerial (p ) ((digitalPinToPinName(p) == \
172+ digitalPinToPinName(PIN_SERIAL_RX & PNUM_MASK)) ||\
173+ (digitalPinToPinName(p) == \
174+ digitalPinToPinName(PIN_SERIAL_TX & PNUM_MASK)))
166175#endif
167176/* Convenient macro to handle Analog for Firmata */
168177#define pinIsAnalogInput digitalpinIsAnalogInput
0 commit comments