From 73ab85b6950372cc84cbf0bec7fb5cb1f4e5dbba Mon Sep 17 00:00:00 2001 From: CyberCastle Date: Tue, 3 Jun 2025 23:14:53 -0400 Subject: [PATCH 1/4] Support PureAnalogPin pins in AdvancedADC --- src/AdvancedADC.h | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/AdvancedADC.h b/src/AdvancedADC.h index a290d4d..492c731 100644 --- a/src/AdvancedADC.h +++ b/src/AdvancedADC.h @@ -21,6 +21,9 @@ #define __ADVANCED_ADC_H__ #include "AdvancedAnalog.h" +#if __has_include("pure_analog_pins.h") +#include "pure_analog_pins.h" +#endif struct adc_descr_t; @@ -41,14 +44,25 @@ class AdvancedADC { adc_descr_t *descr; PinName adc_pins[AN_MAX_ADC_CHANNELS]; + template + static inline PinName _toPinName(P p) { + return analogPinToPinName(p); + } +#if __has_include("pure_analog_pins.h") + static inline PinName _toPinName(PureAnalogPin p) { + extern AnalogPinDescription g_pureAAnalogPinDescription[]; + return g_pureAAnalogPinDescription[p.get()].name; + } +#endif + public: - template - AdvancedADC(pin_size_t p0, T ... args): n_channels(0), descr(nullptr) { - static_assert(sizeof ...(args) < AN_MAX_ADC_CHANNELS, + template + AdvancedADC(P0 p0, P ... pins): n_channels(0), descr(nullptr) { + static_assert(sizeof ...(pins) < AN_MAX_ADC_CHANNELS, "A maximum of 16 channels can be sampled successively."); - for (auto p : {p0, args...}) { - adc_pins[n_channels++] = analogPinToPinName(p); + for (PinName pin : { _toPinName(p0), _toPinName(pins)... }) { + adc_pins[n_channels++] = pin; } } AdvancedADC(): n_channels(0), descr(nullptr) { @@ -72,6 +86,21 @@ class AdvancedADC { n_channels = n_pins; return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); } +#if __has_include("pure_analog_pins.h") + int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, + size_t n_buffers, size_t n_pins, PureAnalogPin *pins, bool start=true, + adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5) { + if (n_pins > AN_MAX_ADC_CHANNELS) { + n_pins = AN_MAX_ADC_CHANNELS; + } + for (size_t i = 0; i < n_pins; ++i) { + adc_pins[i] = _toPinName(pins[i]); + } + + n_channels = n_pins; + return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); + } +#endif int start(uint32_t sample_rate); int stop(); void clear(); From 5c7cd359e81bba542bce0009479b59103580b6b6 Mon Sep 17 00:00:00 2001 From: CyberCastle Date: Wed, 4 Jun 2025 00:27:15 -0400 Subject: [PATCH 2/4] fix: handle pure analog pins --- src/AdvancedADC.cpp | 28 ++++++++++++++++++++++++++++ src/AdvancedADC.h | 26 +++++++++++++++++++++----- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/AdvancedADC.cpp b/src/AdvancedADC.cpp index 7c5b26e..3d2ae0c 100644 --- a/src/AdvancedADC.cpp +++ b/src/AdvancedADC.cpp @@ -20,6 +20,17 @@ #include "Arduino.h" #include "HALConfig.h" #include "AdvancedADC.h" +#if __has_include("pure_analog_pins.h") +#include "pure_analog_pins.h" +#endif + +#if __has_include("pure_analog_pins.h") +template <> +PinName AdvancedADC::_toPinName(PureAnalogPin p) { + extern AnalogPinDescription g_pureAAnalogPinDescription[]; + return g_pureAAnalogPinDescription[p.get()].name; +} +#endif #define ADC_NP ((ADCName) NC) #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 return 1; } +#if __has_include("pure_analog_pins.h") +int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, + size_t n_buffers, size_t n_pins, PureAnalogPin *pins, + bool start, adc_sample_time_t sample_time) { + if (n_pins > AN_MAX_ADC_CHANNELS) { + n_pins = AN_MAX_ADC_CHANNELS; + } + + for (size_t i = 0; i < n_pins; ++i) { + adc_pins[i] = _toPinName(pins[i]); + } + + n_channels = n_pins; + return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); +} +#endif + int AdvancedADC::start(uint32_t sample_rate){ // Initialize and configure the ADC timer. hal_tim_config(&descr->tim, sample_rate); diff --git a/src/AdvancedADC.h b/src/AdvancedADC.h index a290d4d..6bcb9c2 100644 --- a/src/AdvancedADC.h +++ b/src/AdvancedADC.h @@ -21,6 +21,9 @@ #define __ADVANCED_ADC_H__ #include "AdvancedAnalog.h" +#if __has_include("pure_analog_pins.h") +#include "pure_analog_pins.h" +#endif struct adc_descr_t; @@ -41,14 +44,22 @@ class AdvancedADC { adc_descr_t *descr; PinName adc_pins[AN_MAX_ADC_CHANNELS]; + template + static inline PinName _toPinName(P p) { + return analogPinToPinName(p); + } +#if __has_include("pure_analog_pins.h") + static PinName _toPinName(PureAnalogPin p); +#endif + public: - template - AdvancedADC(pin_size_t p0, T ... args): n_channels(0), descr(nullptr) { - static_assert(sizeof ...(args) < AN_MAX_ADC_CHANNELS, + template + AdvancedADC(P0 p0, P ... pins): n_channels(0), descr(nullptr) { + static_assert(sizeof ...(pins) < AN_MAX_ADC_CHANNELS, "A maximum of 16 channels can be sampled successively."); - for (auto p : {p0, args...}) { - adc_pins[n_channels++] = analogPinToPinName(p); + for (PinName pin : { _toPinName(p0), _toPinName(pins)... }) { + adc_pins[n_channels++] = pin; } } AdvancedADC(): n_channels(0), descr(nullptr) { @@ -72,6 +83,11 @@ class AdvancedADC { n_channels = n_pins; return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); } +#if __has_include("pure_analog_pins.h") + int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, + size_t n_buffers, size_t n_pins, PureAnalogPin *pins, bool start=true, + adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5); +#endif int start(uint32_t sample_rate); int stop(); void clear(); From 3749c5dfc4eeb463d8e1ce7fe3da39d93e6c6299 Mon Sep 17 00:00:00 2001 From: CyberCastle Date: Wed, 4 Jun 2025 01:25:50 -0400 Subject: [PATCH 3/4] Revert "Add PureAnalogPin support in AdvancedADC" --- src/AdvancedADC.cpp | 28 ---------------------------- src/AdvancedADC.h | 17 +++++++++++++++-- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/src/AdvancedADC.cpp b/src/AdvancedADC.cpp index 3d2ae0c..7c5b26e 100644 --- a/src/AdvancedADC.cpp +++ b/src/AdvancedADC.cpp @@ -20,17 +20,6 @@ #include "Arduino.h" #include "HALConfig.h" #include "AdvancedADC.h" -#if __has_include("pure_analog_pins.h") -#include "pure_analog_pins.h" -#endif - -#if __has_include("pure_analog_pins.h") -template <> -PinName AdvancedADC::_toPinName(PureAnalogPin p) { - extern AnalogPinDescription g_pureAAnalogPinDescription[]; - return g_pureAAnalogPinDescription[p.get()].name; -} -#endif #define ADC_NP ((ADCName) NC) #define ADC_PIN_ALT_MASK (uint32_t) (ALT0 | ALT1 ) @@ -248,23 +237,6 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl return 1; } -#if __has_include("pure_analog_pins.h") -int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, - size_t n_buffers, size_t n_pins, PureAnalogPin *pins, - bool start, adc_sample_time_t sample_time) { - if (n_pins > AN_MAX_ADC_CHANNELS) { - n_pins = AN_MAX_ADC_CHANNELS; - } - - for (size_t i = 0; i < n_pins; ++i) { - adc_pins[i] = _toPinName(pins[i]); - } - - n_channels = n_pins; - return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); -} -#endif - int AdvancedADC::start(uint32_t sample_rate){ // Initialize and configure the ADC timer. hal_tim_config(&descr->tim, sample_rate); diff --git a/src/AdvancedADC.h b/src/AdvancedADC.h index 6bcb9c2..492c731 100644 --- a/src/AdvancedADC.h +++ b/src/AdvancedADC.h @@ -49,7 +49,10 @@ class AdvancedADC { return analogPinToPinName(p); } #if __has_include("pure_analog_pins.h") - static PinName _toPinName(PureAnalogPin p); + static inline PinName _toPinName(PureAnalogPin p) { + extern AnalogPinDescription g_pureAAnalogPinDescription[]; + return g_pureAAnalogPinDescription[p.get()].name; + } #endif public: @@ -86,7 +89,17 @@ class AdvancedADC { #if __has_include("pure_analog_pins.h") int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers, size_t n_pins, PureAnalogPin *pins, bool start=true, - adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5); + adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5) { + if (n_pins > AN_MAX_ADC_CHANNELS) { + n_pins = AN_MAX_ADC_CHANNELS; + } + for (size_t i = 0; i < n_pins; ++i) { + adc_pins[i] = _toPinName(pins[i]); + } + + n_channels = n_pins; + return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); + } #endif int start(uint32_t sample_rate); int stop(); From 542e558eadb44257e6fa9e55d289dd8dfb6aff08 Mon Sep 17 00:00:00 2001 From: CyberCastle Date: Wed, 4 Jun 2025 01:26:22 -0400 Subject: [PATCH 4/4] Revert "Add PureAnalogPin support in AdvancedADC" --- src/AdvancedADC.h | 39 +++++---------------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/src/AdvancedADC.h b/src/AdvancedADC.h index 492c731..a290d4d 100644 --- a/src/AdvancedADC.h +++ b/src/AdvancedADC.h @@ -21,9 +21,6 @@ #define __ADVANCED_ADC_H__ #include "AdvancedAnalog.h" -#if __has_include("pure_analog_pins.h") -#include "pure_analog_pins.h" -#endif struct adc_descr_t; @@ -44,25 +41,14 @@ class AdvancedADC { adc_descr_t *descr; PinName adc_pins[AN_MAX_ADC_CHANNELS]; - template - static inline PinName _toPinName(P p) { - return analogPinToPinName(p); - } -#if __has_include("pure_analog_pins.h") - static inline PinName _toPinName(PureAnalogPin p) { - extern AnalogPinDescription g_pureAAnalogPinDescription[]; - return g_pureAAnalogPinDescription[p.get()].name; - } -#endif - public: - template - AdvancedADC(P0 p0, P ... pins): n_channels(0), descr(nullptr) { - static_assert(sizeof ...(pins) < AN_MAX_ADC_CHANNELS, + template + AdvancedADC(pin_size_t p0, T ... args): n_channels(0), descr(nullptr) { + static_assert(sizeof ...(args) < AN_MAX_ADC_CHANNELS, "A maximum of 16 channels can be sampled successively."); - for (PinName pin : { _toPinName(p0), _toPinName(pins)... }) { - adc_pins[n_channels++] = pin; + for (auto p : {p0, args...}) { + adc_pins[n_channels++] = analogPinToPinName(p); } } AdvancedADC(): n_channels(0), descr(nullptr) { @@ -86,21 +72,6 @@ class AdvancedADC { n_channels = n_pins; return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); } -#if __has_include("pure_analog_pins.h") - int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, - size_t n_buffers, size_t n_pins, PureAnalogPin *pins, bool start=true, - adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5) { - if (n_pins > AN_MAX_ADC_CHANNELS) { - n_pins = AN_MAX_ADC_CHANNELS; - } - for (size_t i = 0; i < n_pins; ++i) { - adc_pins[i] = _toPinName(pins[i]); - } - - n_channels = n_pins; - return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time); - } -#endif int start(uint32_t sample_rate); int stop(); void clear();