33#include < atomic>
44#include < optional>
55#include < unordered_map>
6+ #include < vector>
67
78#include " esp_adc/adc_cali.h"
89#include " esp_adc/adc_cali_scheme.h"
@@ -48,17 +49,15 @@ class ContinuousAdc {
4849 * @brief Initialize and start the continuous adc reader.
4950 * @param config Config used to initialize the reader.
5051 */
51- ContinuousAdc (const Config &config)
52+ explicit ContinuousAdc (const Config &config)
5253 : sample_rate_hz_(config.sample_rate_hz), window_size_bytes_(config.window_size_bytes),
5354 num_channels_(config.channels.size()), conv_mode_(config.convert_mode),
55+ result_data_(window_size_bytes_, 0xcc ),
5456 logger_({.tag = " Continuous Adc" ,
5557 .rate_limit = std::chrono::milliseconds (100 ),
5658 .level = config.log_level }) {
5759 // initialize the adc continuous subsystem
5860 init (config.channels );
59- // allocate memory for the task to store result data from DMA
60- result_data_ = new uint8_t [window_size_bytes_];
61- memset (result_data_, 0xcc , window_size_bytes_);
6261 // and start the task
6362 using namespace std ::placeholders;
6463 task_ =
@@ -78,12 +77,11 @@ class ContinuousAdc {
7877 vTaskNotifyGiveFromISR (task_handle_, &mustYield);
7978 // then stop the task
8079 task_->stop ();
81- delete[] result_data_;
8280 stop ();
8381 ESP_ERROR_CHECK (adc_continuous_deinit (handle_));
8482 // clean up the calibration data
85- for (auto &config : configs_) {
86- auto id = get_id (config);
83+ for (const auto &config : configs_) {
84+ [[maybe_unused]] auto id = get_id (config);
8785#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
8886 ESP_ERROR_CHECK (adc_cali_delete_scheme_curve_fitting (cali_handles_[id]));
8987#elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
@@ -173,14 +171,14 @@ class ContinuousAdc {
173171 // wait until conversion is ready (will be notified by the registered
174172 ulTaskNotifyTake (pdTRUE, portMAX_DELAY);
175173 auto current_timestamp = std::chrono::high_resolution_clock::now ();
176- for (auto &config : configs_) {
174+ for (const auto &config : configs_) {
177175 auto id = get_id (config);
178176 sums_[id] = 0 ;
179177 num_samples_[id] = 0 ;
180178 }
181179 esp_err_t ret;
182180 uint32_t ret_num = 0 ;
183- ret = adc_continuous_read (handle_, result_data_, window_size_bytes_, &ret_num, 0 );
181+ ret = adc_continuous_read (handle_, result_data_. data () , window_size_bytes_, &ret_num, 0 );
184182 if (ret == ESP_ERR_TIMEOUT) {
185183 // this is ok, we read faster than the hardware could give us data
186184 return false ;
@@ -341,21 +339,20 @@ class ContinuousAdc {
341339 bool calibrated = false ;
342340
343341#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
344- if (!calibrated) {
345- logger_.info (" calibration scheme version is {}" , " Curve Fitting" );
346- adc_cali_curve_fitting_config_t cali_config = {
347- .unit_id = unit,
348- .atten = atten,
349- .bitwidth = bitwidth,
350- };
351- ret = adc_cali_create_scheme_curve_fitting (&cali_config, &handle);
352- if (ret == ESP_OK) {
353- calibrated = true ;
354- }
342+ logger_.info (" calibration scheme version is {}" , " Curve Fitting" );
343+ adc_cali_curve_fitting_config_t cali_config = {
344+ .unit_id = unit,
345+ .atten = atten,
346+ .bitwidth = bitwidth,
347+ };
348+ ret = adc_cali_create_scheme_curve_fitting (&cali_config, &handle);
349+ if (ret == ESP_OK) {
350+ calibrated = true ;
355351 }
356352#endif
357353
358354#if ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
355+ // cppcheck-suppress knownConditionTrueFalse
359356 if (!calibrated) {
360357 logger_.info (" calibration scheme version is {}" , " Line Fitting" );
361358 adc_cali_line_fitting_config_t cali_config = {
@@ -373,6 +370,7 @@ class ContinuousAdc {
373370 *out_handle = handle;
374371 if (ret == ESP_OK) {
375372 logger_.info (" Calibration Success" );
373+ // cppcheck-suppress knownConditionTrueFalse
376374 } else if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) {
377375 logger_.warn (" eFuse not burnt, skip software calibration" );
378376 } else {
@@ -399,11 +397,11 @@ class ContinuousAdc {
399397 adc_continuous_handle_t handle_;
400398 adc_digi_convert_mode_t conv_mode_;
401399 adc_digi_output_format_t output_format_;
400+ std::vector<uint8_t > result_data_;
402401 Logger logger_;
403402 std::unique_ptr<Task> task_;
404403 TaskHandle_t task_handle_{NULL };
405404 std::mutex data_mutex_;
406- uint8_t *result_data_;
407405
408406 std::atomic<bool > running_{false };
409407
0 commit comments