|
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