diff options
Diffstat (limited to 'source/adc.cpp')
-rw-r--r-- | source/adc.cpp | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/source/adc.cpp b/source/adc.cpp index 609ffce..f2903c3 100644 --- a/source/adc.cpp +++ b/source/adc.cpp @@ -45,12 +45,9 @@ constexpr static const GPTConfig gpt_config = { }; static bool adc_is_read_finished = false; - -void adc_read_callback([[maybe_unused]] ADCDriver *driver) -{ - gptStopTimer(gptd); - adc_is_read_finished = true; -} +static adcsample_t *adc_current_buffer = nullptr; +static size_t adc_current_buffer_size = 0; +static adc::operation_t adc_operation_func = nullptr; namespace adc { @@ -66,11 +63,31 @@ namespace adc adcsample_t *read(adcsample_t *buffer, size_t count) { adc_is_read_finished = false; + adc_group_config.circular = false; adcStartConversion(adcd, &adc_group_config, buffer, count); gptStartContinuous(gptd, 100); // 10kHz while (!adc_is_read_finished); return buffer; } + + void read_start(operation_t operation_func, adcsample_t *buffer, size_t count) + { + adc_current_buffer = buffer; + adc_current_buffer_size = count; + adc_operation_func = operation_func; + adc_group_config.circular = true; + adcStartConversion(adcd, &adc_group_config, buffer, count); + gptStartContinuous(gptd, 100); // 10kHz + } + + void read_stop() + { + gptStopTimer(gptd); + adc_group_config.circular = false; + adc_current_buffer = nullptr; + adc_current_buffer_size = 0; + adc_operation_func = nullptr; + } void set_rate(rate r) { @@ -107,3 +124,20 @@ namespace adc } } +void adc_read_callback(ADCDriver *driver) +{ + if (!adc_group_config.circular) { + gptStopTimer(gptd); + adc_is_read_finished = true; + } else if (adc_operation_func != nullptr) { + auto half_size = adc_current_buffer_size / 2; + if (driver->state == ADC_ACTIVE) { + // Half full + adc_operation_func(adc_current_buffer, half_size); + } else if (driver->state == ADC_COMPLETE) { + // Second half full + adc_operation_func(adc_current_buffer + half_size, half_size); + } + } +} + |