aboutsummaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/adc.cpp46
-rw-r--r--source/adc.hpp4
-rw-r--r--source/main.cpp13
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)
+{
+
+}
+