diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/adc.cpp | 46 | ||||
-rw-r--r-- | source/adc.hpp | 4 | ||||
-rw-r--r-- | source/main.cpp | 13 |
3 files changed, 57 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); + } + } +} + diff --git a/source/adc.hpp b/source/adc.hpp index e026d0c..376b156 100644 --- a/source/adc.hpp +++ b/source/adc.hpp @@ -16,6 +16,8 @@ namespace adc { + using operation_t = void (*)(adcsample_t *buffer, size_t count); + enum class rate { R2P5, R6P5, @@ -29,6 +31,8 @@ namespace adc void init(); adcsample_t *read(adcsample_t *buffer, size_t count); + void read_start(operation_t operation_func, adcsample_t *buffer, size_t count); + void read_stop(); void set_rate(rate r); } diff --git a/source/main.cpp b/source/main.cpp index b5ebf86..f1170a6 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -26,6 +26,8 @@ CC_ALIGN(CACHE_LINE_SIZE) static std::array<adcsample_t, CACHE_SIZE_ALIGN(adcsample_t, 2048)> adc_samples; static std::array<dacsample_t, CACHE_SIZE_ALIGN(dacsample_t, 2048)> dac_samples; +static void signal_operate(adcsample_t *buffer, size_t count); + int main() { halInit(); @@ -51,6 +53,12 @@ int main() usbserial::write(adc_samples.data(), count * sizeof(adcsample_t)); } break; + case 'R': + adc::read_start(signal_operate, &adc_samples[0], adc_samples.size() * sizeof(adcsample_t)); + break; + case 'S': + adc::read_stop(); + break; case 'W': if (usbserial::read(&cmd[1], 2) < 2) break; @@ -77,3 +85,8 @@ int main() } } +void signal_operate([[maybe_unused]] adcsample_t *buffer, [[maybe_unused]] size_t count) +{ + +} + |