3
3
#include < atomic>
4
4
#include < optional>
5
5
#include < unordered_map>
6
+ #include < vector>
6
7
7
8
#include " esp_adc/adc_cali.h"
8
9
#include " esp_adc/adc_cali_scheme.h"
@@ -48,17 +49,15 @@ class ContinuousAdc {
48
49
* @brief Initialize and start the continuous adc reader.
49
50
* @param config Config used to initialize the reader.
50
51
*/
51
- ContinuousAdc (const Config &config)
52
+ explicit ContinuousAdc (const Config &config)
52
53
: sample_rate_hz_(config.sample_rate_hz), window_size_bytes_(config.window_size_bytes),
53
54
num_channels_(config.channels.size()), conv_mode_(config.convert_mode),
55
+ result_data_(window_size_bytes_, 0xcc ),
54
56
logger_({.tag = " Continuous Adc" ,
55
57
.rate_limit = std::chrono::milliseconds (100 ),
56
58
.level = config.log_level }) {
57
59
// initialize the adc continuous subsystem
58
60
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_);
62
61
// and start the task
63
62
using namespace std ::placeholders;
64
63
task_ =
@@ -78,12 +77,11 @@ class ContinuousAdc {
78
77
vTaskNotifyGiveFromISR (task_handle_, &mustYield);
79
78
// then stop the task
80
79
task_->stop ();
81
- delete[] result_data_;
82
80
stop ();
83
81
ESP_ERROR_CHECK (adc_continuous_deinit (handle_));
84
82
// 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);
87
85
#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
88
86
ESP_ERROR_CHECK (adc_cali_delete_scheme_curve_fitting (cali_handles_[id]));
89
87
#elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
@@ -173,14 +171,14 @@ class ContinuousAdc {
173
171
// wait until conversion is ready (will be notified by the registered
174
172
ulTaskNotifyTake (pdTRUE, portMAX_DELAY);
175
173
auto current_timestamp = std::chrono::high_resolution_clock::now ();
176
- for (auto &config : configs_) {
174
+ for (const auto &config : configs_) {
177
175
auto id = get_id (config);
178
176
sums_[id] = 0 ;
179
177
num_samples_[id] = 0 ;
180
178
}
181
179
esp_err_t ret;
182
180
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 );
184
182
if (ret == ESP_ERR_TIMEOUT) {
185
183
// this is ok, we read faster than the hardware could give us data
186
184
return false ;
@@ -341,21 +339,20 @@ class ContinuousAdc {
341
339
bool calibrated = false ;
342
340
343
341
#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 ;
355
351
}
356
352
#endif
357
353
358
354
#if ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
355
+ // cppcheck-suppress knownConditionTrueFalse
359
356
if (!calibrated) {
360
357
logger_.info (" calibration scheme version is {}" , " Line Fitting" );
361
358
adc_cali_line_fitting_config_t cali_config = {
@@ -373,6 +370,7 @@ class ContinuousAdc {
373
370
*out_handle = handle;
374
371
if (ret == ESP_OK) {
375
372
logger_.info (" Calibration Success" );
373
+ // cppcheck-suppress knownConditionTrueFalse
376
374
} else if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) {
377
375
logger_.warn (" eFuse not burnt, skip software calibration" );
378
376
} else {
@@ -399,11 +397,11 @@ class ContinuousAdc {
399
397
adc_continuous_handle_t handle_;
400
398
adc_digi_convert_mode_t conv_mode_;
401
399
adc_digi_output_format_t output_format_;
400
+ std::vector<uint8_t > result_data_;
402
401
Logger logger_;
403
402
std::unique_ptr<Task> task_;
404
403
TaskHandle_t task_handle_{NULL };
405
404
std::mutex data_mutex_;
406
- uint8_t *result_data_;
407
405
408
406
std::atomic<bool > running_{false };
409
407
0 commit comments