Skip to content

Commit 5c7cd35

Browse files
committed
fix: handle pure analog pins
1 parent 38836d5 commit 5c7cd35

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

src/AdvancedADC.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@
2020
#include "Arduino.h"
2121
#include "HALConfig.h"
2222
#include "AdvancedADC.h"
23+
#if __has_include("pure_analog_pins.h")
24+
#include "pure_analog_pins.h"
25+
#endif
26+
27+
#if __has_include("pure_analog_pins.h")
28+
template <>
29+
PinName AdvancedADC::_toPinName(PureAnalogPin p) {
30+
extern AnalogPinDescription g_pureAAnalogPinDescription[];
31+
return g_pureAAnalogPinDescription[p.get()].name;
32+
}
33+
#endif
2334

2435
#define ADC_NP ((ADCName) NC)
2536
#define ADC_PIN_ALT_MASK (uint32_t) (ALT0 | ALT1 )
@@ -237,6 +248,23 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
237248
return 1;
238249
}
239250

251+
#if __has_include("pure_analog_pins.h")
252+
int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples,
253+
size_t n_buffers, size_t n_pins, PureAnalogPin *pins,
254+
bool start, adc_sample_time_t sample_time) {
255+
if (n_pins > AN_MAX_ADC_CHANNELS) {
256+
n_pins = AN_MAX_ADC_CHANNELS;
257+
}
258+
259+
for (size_t i = 0; i < n_pins; ++i) {
260+
adc_pins[i] = _toPinName(pins[i]);
261+
}
262+
263+
n_channels = n_pins;
264+
return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time);
265+
}
266+
#endif
267+
240268
int AdvancedADC::start(uint32_t sample_rate){
241269
// Initialize and configure the ADC timer.
242270
hal_tim_config(&descr->tim, sample_rate);

src/AdvancedADC.h

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
#define __ADVANCED_ADC_H__
2222

2323
#include "AdvancedAnalog.h"
24+
#if __has_include("pure_analog_pins.h")
25+
#include "pure_analog_pins.h"
26+
#endif
2427

2528
struct adc_descr_t;
2629

@@ -41,14 +44,22 @@ class AdvancedADC {
4144
adc_descr_t *descr;
4245
PinName adc_pins[AN_MAX_ADC_CHANNELS];
4346

47+
template <typename P>
48+
static inline PinName _toPinName(P p) {
49+
return analogPinToPinName(p);
50+
}
51+
#if __has_include("pure_analog_pins.h")
52+
static PinName _toPinName(PureAnalogPin p);
53+
#endif
54+
4455
public:
45-
template <typename ... T>
46-
AdvancedADC(pin_size_t p0, T ... args): n_channels(0), descr(nullptr) {
47-
static_assert(sizeof ...(args) < AN_MAX_ADC_CHANNELS,
56+
template <typename P0, typename ... P>
57+
AdvancedADC(P0 p0, P ... pins): n_channels(0), descr(nullptr) {
58+
static_assert(sizeof ...(pins) < AN_MAX_ADC_CHANNELS,
4859
"A maximum of 16 channels can be sampled successively.");
4960

50-
for (auto p : {p0, args...}) {
51-
adc_pins[n_channels++] = analogPinToPinName(p);
61+
for (PinName pin : { _toPinName(p0), _toPinName(pins)... }) {
62+
adc_pins[n_channels++] = pin;
5263
}
5364
}
5465
AdvancedADC(): n_channels(0), descr(nullptr) {
@@ -72,6 +83,11 @@ class AdvancedADC {
7283
n_channels = n_pins;
7384
return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time);
7485
}
86+
#if __has_include("pure_analog_pins.h")
87+
int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples,
88+
size_t n_buffers, size_t n_pins, PureAnalogPin *pins, bool start=true,
89+
adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5);
90+
#endif
7591
int start(uint32_t sample_rate);
7692
int stop();
7793
void clear();

0 commit comments

Comments
 (0)