diff --git a/src/AdvancedADC.cpp b/src/AdvancedADC.cpp index 49f7e23..f79147c 100644 --- a/src/AdvancedADC.cpp +++ b/src/AdvancedADC.cpp @@ -115,19 +115,17 @@ DMABuffer &AdvancedADC::read() { return NULLBUF; } -int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers) { +int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers, bool start_sampling) { ADCName instance = ADC_NP; - // Sanity checks. if (resolution >= AN_ARRAY_SIZE(ADC_RES_LUT) || (descr && descr->pool)) { return 0; } - // Clear ALTx pin. for (size_t i=0; ipool == nullptr) { return 0; } + descr->dmabuf[0] = descr->pool->allocate(); descr->dmabuf[1] = descr->pool->allocate(); + // Init and config DMA. if (hal_dma_config(&descr->dma, descr->dma_irqn, DMA_PERIPH_TO_MEMORY) < 0) { return 0; @@ -201,6 +201,16 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl return 0; } + sampling_rate = sample_rate; + // Start sampling immediately unless start_sampling==false. + if (start_sampling) { + return start(); + } + + return 1; +} + +int AdvancedADC::start() { // Link DMA handle to ADC handle, and start the ADC. __HAL_LINKDMA(&descr->adc, DMA_Handle, descr->dma); if (HAL_ADC_Start_DMA(&descr->adc, (uint32_t *) descr->dmabuf[0]->data(), descr->dmabuf[0]->size()) != HAL_OK) { @@ -217,7 +227,7 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl if (HAL_TIM_Base_Start(&descr->tim) != HAL_OK) { return 0; } - + return 1; } @@ -227,6 +237,12 @@ int AdvancedADC::stop() return 1; } +void AdvancedADC::clear() { + if (descr && descr->pool) { + descr->pool->flush(); + } +} + AdvancedADC::~AdvancedADC() { dac_descr_deinit(descr, true); diff --git a/src/AdvancedADC.h b/src/AdvancedADC.h index 844985b..359c8f5 100644 --- a/src/AdvancedADC.h +++ b/src/AdvancedADC.h @@ -46,15 +46,17 @@ class AdvancedADC { ~AdvancedADC(); bool available(); SampleBuffer read(); - int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers); - int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers, size_t n_pins, pin_size_t *pins) { + int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers, bool start_sampling = true); + int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers, size_t n_pins, pin_size_t *pins, bool start_sampling = true) { 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] = analogPinToPinName(pins[i]); } n_channels = n_pins; - return begin(resolution, sample_rate, n_samples, n_buffers); + return begin(resolution, sample_rate, n_samples, n_buffers, start_sampling); } + void clear(); + int start(); int stop(); };