]> code.bitgloo.com Git - clyne/stmdsp.git/commitdiff
working: continuous signal passthrough
authorClyne Sullivan <clyne@bitgloo.com>
Sat, 22 Aug 2020 14:31:45 +0000 (10:31 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Sat, 22 Aug 2020 14:31:45 +0000 (10:31 -0400)
gui/stmdsp.cpp
gui/stmdsp.hpp
gui/wxmain.hpp
source/adc.cpp
source/main.cpp

index 837d09c96ac22c84e6624a6983d5246c5c2bc94e..ed152f7bdc4fabbb01f19b5004ed9400e1f9235a 100644 (file)
@@ -16,7 +16,14 @@ namespace stmdsp
     }
 
     device::device(const std::string& file) :
-        m_serial(file, 230400, serial::Timeout::simpleTimeout(50)) {}
+        m_serial(file, 230400, serial::Timeout::simpleTimeout(50))
+    {
+        if (m_serial.isOpen()) {
+           m_serial.write("i");
+           if (m_serial.read(6) != "stmdsp")
+               m_serial.close();
+        }
+    }
 
     std::vector<adcsample_t> device::sample(unsigned long int count) {
         if (connected()) {
@@ -27,11 +34,29 @@ namespace stmdsp
             };
             m_serial.write(request, 3);
             std::vector<adcsample_t> data (count);
-            m_serial.read(reinterpret_cast<uint8_t *>(data.data()),
-                          data.size() * sizeof(adcsample_t));
+            m_serial.read(reinterpret_cast<uint8_t *>(data.data()), data.size() * sizeof(adcsample_t));
             return data;
         } else {
             return {};
         }
     }
+
+    void device::continuous_start() {
+        if (connected())
+            m_serial.write("R");
+    }
+
+    std::vector<adcsample_t> device::continuous_read() {
+        if (connected()) {
+            m_serial.write("s");
+            std::vector<adcsample_t> data (2048);
+            m_serial.read(reinterpret_cast<uint8_t *>(data.data()), 2048 * sizeof(adcsample_t));
+            return data;
+        }
+    }
+
+    void device::continuous_stop() {
+        if (connected())
+            m_serial.write("S");
+    }
 }
index 2148fa12188d587d5f71af18bbf3d4616864cfd0..c1799553b3bd0428609fa58a6d1cc23f3afa74bf 100644 (file)
@@ -35,11 +35,15 @@ namespace stmdsp
         }
 
         bool connected() {
-            return m_serial.isOpen() && (m_serial.write("i"), m_serial.read(6) == "stmdsp");
+            return m_serial.isOpen();
         }
 
         std::vector<adcsample_t> sample(unsigned long int count = 1);
 
+        void continuous_start();
+        std::vector<adcsample_t> continuous_read();
+        void continuous_stop();
+
     private:
         serial::Serial m_serial;
     };
index 97baae3d496986115253f6f7b42c68495eff8a1a..1fc74bd879e97cc28fa9b15b389286be65cdc1e2 100644 (file)
@@ -78,7 +78,7 @@ public:
 
     void doSingle() {
         m_device_samples_future = std::async(std::launch::async,
-                                             [this]() { return m_device->sample(250); });
+                                             [this]() { return m_device->continuous_read(); });
     }
 
     void onSinglePressed(wxCommandEvent& ce) {
@@ -87,8 +87,10 @@ public:
         if (!m_render_timer->IsRunning()) {
             m_device = new stmdsp::device(m_device_combo->GetStringSelection().ToStdString());
             if (m_device->connected()) {
-                doSingle();
-                m_render_timer->Start(100);
+                m_device->continuous_start();
+                m_device_samples_future = std::async(std::launch::async,
+                                                     []() { return decltype(m_device_samples)(); });
+                m_render_timer->Start(1000);
                 button->SetLabel("Stop");
             } else {
                 delete m_device;
@@ -96,6 +98,7 @@ public:
             }
         } else {
             m_render_timer->Stop();
+            m_device->continuous_stop();
             button->SetLabel("Single");
 
             delete m_device;
index f2903c39fbd21f16c643917dadbe88c4e04cfd18..9e0491e829e16576aa6065c7932e6879abe4cfa3 100644 (file)
@@ -77,7 +77,7 @@ namespace adc
         adc_operation_func = operation_func;
         adc_group_config.circular = true;
         adcStartConversion(adcd, &adc_group_config, buffer, count);
-        gptStartContinuous(gptd, 100); // 10kHz
+        gptStartContinuous(gptd, 1000); // 10kHz
     }
     
     void read_stop()
@@ -131,13 +131,10 @@ void adc_read_callback(ADCDriver *driver)
         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
+        if (adcIsBufferComplete(driver))
             adc_operation_func(adc_current_buffer + half_size, half_size);
-        }
+        else
+            adc_operation_func(adc_current_buffer, half_size);
     }
 }
 
index f1170a6bf54939cd9f8b058a1aa60b82211ff5d0..162771ad3f7bf3cdc50901a991ad350d5244329a 100644 (file)
 #include <array>
 
 static_assert(sizeof(adcsample_t) == sizeof(uint16_t));
+static_assert(sizeof(dacsample_t) == sizeof(uint16_t));
 
 #if CACHE_LINE_SIZE > 0
 CC_ALIGN(CACHE_LINE_SIZE)
 #endif
 static std::array<adcsample_t, CACHE_SIZE_ALIGN(adcsample_t, 2048)> adc_samples;
+#if CACHE_LINE_SIZE > 0
+CC_ALIGN(CACHE_LINE_SIZE)
+#endif
 static std::array<dacsample_t, CACHE_SIZE_ALIGN(dacsample_t, 2048)> dac_samples;
 
+static volatile bool signal_operate_done = false;
+
 static void signal_operate(adcsample_t *buffer, size_t count);
 
 int main()
@@ -54,10 +60,20 @@ int main()
                     }
                     break;
                 case 'R':
-                    adc::read_start(signal_operate, &adc_samples[0], adc_samples.size() * sizeof(adcsample_t));
+                    dac_samples.fill(0);
+                    adc::read_start(signal_operate, &adc_samples[0], adc_samples.size());
+                    dac::write_start(&dac_samples[0], dac_samples.size());
+                    break;
+                case 's':
+                    while (!signal_operate_done);
+                    usbserial::write(dac_samples.data(), dac_samples.size() * sizeof(adcsample_t));
                     break;
                 case 'S':
+                    dac::write_stop();
                     adc::read_stop();
+                    break;
+                case 'e':
+                    
                     break;
                 case 'W':
                     if (usbserial::read(&cmd[1], 2) < 2)
@@ -85,8 +101,10 @@ int main()
        }
 }
 
-void signal_operate([[maybe_unused]] adcsample_t *buffer, [[maybe_unused]] size_t count)
+void signal_operate(adcsample_t *buffer, size_t count)
 {
-
+    auto dac_buffer = &dac_samples[buffer == &adc_samples[0] ? 0 : 1024];
+    std::copy(buffer, buffer + count, dac_buffer);
+    signal_operate_done = buffer == &adc_samples[1024];
 }