|
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 |
|
@@ -84,19 +87,23 @@ extern const uint32_t analogInputPin[];
|
84 | 87 |
|
85 | 88 | /* Convert a digital pin number Dxx to a PinName PX_n */
|
86 | 89 | /* Note: Analog pin is also a digital pin */
|
87 |
| -#define digitalPinToPinName(p) (((uint32_t)(p) < NUM_DIGITAL_PINS) ? digitalPin[p] : \ |
88 |
| - (((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \ |
89 |
| - digitalPin[analogInputPin[(p)&PANA_IDX]] : NC) |
| 90 | +#define digitalPinToPinName(p) ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \ |
| 91 | + (PinName)(digitalPin[(uint32_t)(p) & PNUM_MASK] | ((p) & ALTX)) : \ |
| 92 | + (((uint32_t)(p) & PANA) == PANA) && \ |
| 93 | + (((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \ |
| 94 | + (PinName)(digitalPin[analogInputPin[(p) & PANA_IDX]] | ((p) & ALTX)) : NC) |
90 | 95 | /* Convert a PinName PX_n to a digital pin number */
|
91 | 96 | uint32_t pinNametoDigitalPin(PinName p);
|
92 | 97 |
|
93 | 98 | /* Convert an analog pin number to a digital pin number */
|
94 | 99 | #if NUM_ANALOG_INPUTS > 0
|
95 | 100 | /* Used by analogRead api to have A0 == 0 */
|
96 | 101 | /* Non contiguous analog pins definition in digitalPin array */
|
97 |
| -#define analogInputToDigitalPin(p) (((uint32_t)(p) < NUM_ANALOG_INPUTS) ? analogInputPin[p] : \ |
98 |
| - (((uint32_t)(p) & PANA) == PANA) && ((uint32_t)(p) < NUM_ANALOG_INTERNAL_FIRST) ? \ |
99 |
| - analogInputPin[(p)&PANA_IDX] : (uint32_t)NC) |
| 102 | +#define analogInputToDigitalPin(p) ((((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INPUTS) ? \ |
| 103 | + analogInputPin[(uint32_t)(p) & PNUM_MASK] | ((uint32_t)(p) & ALTX) : \ |
| 104 | + (((uint32_t)(p) & PANA) == PANA) && \ |
| 105 | + (((uint32_t)(p) & PNUM_MASK) < NUM_ANALOG_INTERNAL_FIRST) ? \ |
| 106 | + analogInputPin[(p) & PANA_IDX] | ((uint32_t)(p) & ALTX) : (uint32_t)NC) |
100 | 107 | #else/* No analog pin defined */
|
101 | 108 | #define analogInputToDigitalPin(p) (NUM_DIGITAL_PINS)
|
102 | 109 | #endif // NUM_ANALOG_INPUTS > 0
|
@@ -155,10 +162,11 @@ PinName analogInputToPinName(uint32_t pin);
|
155 | 162 | #define digitalPinFirstOccurence(p) (pinNametoDigitalPin(digitalPinToPinName(p)))
|
156 | 163 |
|
157 | 164 | /* Specific for Firmata */
|
158 |
| -/* Some pins could be duplicated, ensure 'p' is not one of the serial pins */ |
159 | 165 | #if defined(PIN_SERIAL_RX) && defined(PIN_SERIAL_TX)
|
160 |
| -#define pinIsSerial(p) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\ |
161 |
| - (digitalPinFirstOccurence(p) == PIN_SERIAL_TX)) |
| 166 | +#define pinIsSerial(p) ((digitalPinToPinName(p) == \ |
| 167 | + digitalPinToPinName(PIN_SERIAL_RX & PNUM_MASK)) ||\ |
| 168 | + (digitalPinToPinName(p) == \ |
| 169 | + digitalPinToPinName(PIN_SERIAL_TX & PNUM_MASK))) |
162 | 170 | #endif
|
163 | 171 | /* Convenient macro to handle Analog for Firmata */
|
164 | 172 | #define pinIsAnalogInput digitalpinIsAnalogInput
|
|
0 commit comments