Skip to content

Commit 7451cb8

Browse files
committed
Add macro helper to support Firmata
Signed-off-by: Frederic Pillon <[email protected]>
1 parent ebdaf0c commit 7451cb8

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

cores/arduino/pins_arduino.c

+36
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,42 @@ PinName analogInputToPinName(uint32_t pin)
6767
return pn;
6868
}
6969

70+
bool pinIsAnalogInput(uint32_t pin)
71+
{
72+
bool ret = false;
73+
#if NUM_ANALOG_INPUTS > 0
74+
#ifndef NUM_ANALOG_LAST
75+
ret = (pin >= A0) && (pin < (A0 + NUM_ANALOG_INPUTS));
76+
#else
77+
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
78+
if (analogInPin[i] == pin) {
79+
ret = true;
80+
break;
81+
}
82+
}
83+
#endif /* NUM_ANALOG_LAST */
84+
#endif /* NUM_ANALOG_INPUTS > 0 */
85+
return ret;
86+
}
87+
88+
uint32_t digitalPinToAnalogInput(uint32_t pin)
89+
{
90+
uint32_t ret = NUM_ANALOG_INPUTS;
91+
#if NUM_ANALOG_INPUTS > 0
92+
#ifndef NUM_ANALOG_LAST
93+
ret = pin - A0;
94+
#else
95+
for (uint32_t i = 0; i < NUM_ANALOG_INPUTS; i++) {
96+
if (analogInPin[i] == pin) {
97+
ret = i;
98+
break;
99+
}
100+
}
101+
#endif /* NUM_ANALOG_LAST */
102+
#endif /* NUM_ANALOG_INPUTS > 0 */
103+
return ret;
104+
}
105+
70106
#ifdef __cplusplus
71107
}
72108
#endif

cores/arduino/pins_arduino.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
#ifndef _PINS_ARDUINO_H_
1919
#define _PINS_ARDUINO_H_
20+
#include <stdbool.h>
2021
#include <stdlib.h> /* Required for static_assert */
2122
// Include board variant
2223
#include "variant.h"
@@ -323,12 +324,15 @@ PinName analogInputToPinName(uint32_t pin);
323324
// return first occurence of linked PinName (PYx)
324325
#define digitalPinFirstOccurence(p) (pinNametoDigitalPin(digitalPinToPinName(p)))
325326

326-
// Specific for Firmata. As some pins could be duplicated,
327-
// ensure 'p' is not one of the serial pins
327+
// Specific for Firmata.
328+
// Some pins could be duplicated, ensure 'p' is not one of the serial pins
328329
#if defined(PIN_SERIAL_RX) && defined(PIN_SERIAL_TX)
329330
#define pinIsSerial(p) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\
330331
(digitalPinFirstOccurence(p) == PIN_SERIAL_TX))
331332
#endif
333+
// Convenient macro to handle Analog
334+
bool pinIsAnalogInput(uint32_t pin);
335+
uint32_t digitalPinToAnalogInput(uint32_t pin);
332336

333337
#ifdef __cplusplus
334338
}

0 commit comments

Comments
 (0)