]> code.bitgloo.com Git - clyne/stmdsp.git/commitdiff
added adc stream framework
authorClyne Sullivan <clyne@bitgloo.com>
Thu, 20 Aug 2020 21:00:55 +0000 (17:00 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Thu, 20 Aug 2020 21:00:55 +0000 (17:00 -0400)
source/adc.cpp
source/adc.hpp
source/main.cpp

index 851b46139a38c687791a45159b2544801da7499e..e754e0e3c083e6590b87434aabde737f081f2515 100644 (file)
@@ -45,6 +45,10 @@ constexpr static const GPTConfig gpt_config = {
 };
 
 static bool adc_is_read_finished = false;
+static bool adc_is_read_continuous = false;
+static adcsample_t *adc_current_buffer = nullptr;
+static size_t adc_current_buffer_size = 0;
+static adc_operation_t adc_operation_func = nullptr;
 
 void adc_init()
 {
@@ -58,16 +62,46 @@ void adc_init()
 adcsample_t *adc_read(adcsample_t *buffer, size_t count)
 {
     adc_is_read_finished = false;
+    adc_is_read_continuous = 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 adc_read_callback([[maybe_unused]] ADCDriver *driver)
+void adc_read_start(adc_operation_t operation_func, adcsample_t *buffer, size_t count)
 {
+    adc_is_read_continuous = true;
+    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 adc_read_stop()
+{
+    adc_is_read_continuous = false;
     gptStopTimer(gptd);
-    adc_is_read_finished = true;
+}
+
+void adc_read_callback(ADCDriver *driver)
+{
+    if (!adc_is_read_continuous) {
+        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);
+        }
+    }
 }
 
 void adc_set_rate(ADCRate rate)
index 4c3836ebeee60b330ff40761190d48e1088cba26..15e343a859950741a6b0fb4cc7ebead9318644d3 100644 (file)
@@ -25,8 +25,12 @@ enum class ADCRate {
     R640P5
 };
 
+using adc_operation_t = void (*)(adcsample_t *buffer, size_t count);
+
 void adc_init();
 adcsample_t *adc_read(adcsample_t *buffer, size_t count);
+void adc_read_start(adc_operation_t operation_func, adcsample_t *buffer, size_t count);
+void adc_read_stop();
 void adc_set_rate(ADCRate rate);
 
 #endif // STMDSP_ADC_HPP_
index cfd20a91aec311c7b42a3f6da5452e3067deb045..07c73ba35712791e7fcc7804b166b3a6f54152d8 100644 (file)
@@ -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)
+{
+
+}
+