25
25
#include "pins_arduino_analog.h"
26
26
#include "pins_arduino_digital.h"
27
27
28
+ /* Pin number */
29
+ #define PNUM_MASK 0xFF
30
+
28
31
/* Avoid PortName issue */
29
32
_Static_assert (LastPort <= 0x0F , "PortName must be less than 16" );
30
33
@@ -85,11 +88,14 @@ extern const uint32_t analogInputPin[];
85
88
/* Convert a digital pin number Dxx to a PinName PX_n */
86
89
#if NUM_ANALOG_INPUTS > 0
87
90
/* 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)
91
96
#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)
93
99
#endif /* NUM_ANALOG_INPUTS > 0 */
94
100
/* Convert a PinName PX_n to a digital pin number */
95
101
uint32_t pinNametoDigitalPin (PinName p );
@@ -98,9 +104,11 @@ uint32_t pinNametoDigitalPin(PinName p);
98
104
#if NUM_ANALOG_INPUTS > 0
99
105
/* Used by analogRead api to have A0 == 0 */
100
106
/* 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)
104
112
#else /* No analog pin defined */
105
113
#define analogInputToDigitalPin (p ) (NUM_DIGITAL_PINS)
106
114
#endif /* NUM_ANALOG_INPUTS > 0 */
@@ -159,10 +167,11 @@ PinName analogInputToPinName(uint32_t pin);
159
167
#define digitalPinFirstOccurence (p ) (pinNametoDigitalPin(digitalPinToPinName(p)))
160
168
161
169
/* Specific for Firmata */
162
- /* Some pins could be duplicated, ensure 'p' is not one of the serial pins */
163
170
#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)))
166
175
#endif
167
176
/* Convenient macro to handle Analog for Firmata */
168
177
#define pinIsAnalogInput digitalpinIsAnalogInput
0 commit comments