From 6473b57cefe4c13cb262ed78bf0e49fe18a20267 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 18 Jun 2020 19:35:11 -0400 Subject: using serial lib, can connect to device --- source/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source/main.cpp') diff --git a/source/main.cpp b/source/main.cpp index b8d2fa1..dc38ddd 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -18,6 +18,8 @@ #include +static_assert(sizeof(adcsample_t) == sizeof(uint16_t)); + #if CACHE_LINE_SIZE > 0 CC_ALIGN(CACHE_LINE_SIZE) #endif @@ -50,7 +52,7 @@ int main() if (char cmd; usbd.read(&cmd) > 0) { switch (cmd) { case 'r': // Read in analog signal - adc.getSamples(&adc_samples[0], adc_samples.size()); + adc.getSamples(&adc_samples[0], 100);//adc_samples.size()); usbd.write(adc_samples.data(), adc_samples.size()); break; case 'i': // Identify ourself as an stmdsp device -- cgit v1.2.3 From 875b6a062029f0738ac309ef4a915120aee24ef7 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Wed, 24 Jun 2020 19:57:29 -0400 Subject: GUI reads ADC channel --- .gitignore | 1 + gui/stmdsp.cpp | 20 +++++++++++++++++++ gui/stmdsp.hpp | 17 ++-------------- gui/wxmain.hpp | 60 +++++++++++++++++++++++++++++++++++++++++++++------------ source/main.cpp | 14 ++++++++------ 5 files changed, 79 insertions(+), 33 deletions(-) (limited to 'source/main.cpp') diff --git a/.gitignore b/.gitignore index 235fb51..a9adb0f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ ChibiOS_* **/.* gui/stmdspgui *.o +perf* diff --git a/gui/stmdsp.cpp b/gui/stmdsp.cpp index 4812884..837d09c 100644 --- a/gui/stmdsp.cpp +++ b/gui/stmdsp.cpp @@ -14,4 +14,24 @@ namespace stmdsp return m_available_devices; } + + device::device(const std::string& file) : + m_serial(file, 230400, serial::Timeout::simpleTimeout(50)) {} + + std::vector device::sample(unsigned long int count) { + if (connected()) { + uint8_t request[3] = { + 'r', + static_cast(count), + static_cast(count >> 8) + }; + m_serial.write(request, 3); + std::vector data (count); + m_serial.read(reinterpret_cast(data.data()), + data.size() * sizeof(adcsample_t)); + return data; + } else { + return {}; + } + } } diff --git a/gui/stmdsp.hpp b/gui/stmdsp.hpp index 030038d..2148fa1 100644 --- a/gui/stmdsp.hpp +++ b/gui/stmdsp.hpp @@ -28,8 +28,7 @@ namespace stmdsp class device { public: - device(const std::string& file) : - m_serial(file, 115200, serial::Timeout::simpleTimeout(1000)) {} + device(const std::string& file); ~device() { m_serial.close(); @@ -39,19 +38,7 @@ namespace stmdsp return m_serial.isOpen() && (m_serial.write("i"), m_serial.read(6) == "stmdsp"); } - std::vector sample(unsigned long int count = 1) { - if (connected()) { - m_serial.write(std::vector {'r', - static_cast(count), - static_cast(count >> 8)}); - std::vector data (count); - m_serial.read(reinterpret_cast(data.data()), - data.size() * sizeof(adcsample_t)); - return data; - } else { - return {}; - } - } + std::vector sample(unsigned long int count = 1); private: serial::Serial m_serial; diff --git a/gui/wxmain.hpp b/gui/wxmain.hpp index f23ae38..97baae3 100644 --- a/gui/wxmain.hpp +++ b/gui/wxmain.hpp @@ -3,6 +3,8 @@ #include "stmdsp.hpp" +#include +#include #include #include #include @@ -21,22 +23,26 @@ class MainFrame : public wxFrame bool m_is_rendering = false; wxTimer *m_render_timer = nullptr; - int m_radius = 10; + wxComboBox *m_device_combo = nullptr; const wxRect m_clipping_region = {20, 100, 600, 360}; + stmdsp::device *m_device = nullptr; + std::future> m_device_samples_future; + std::vector m_device_samples; + public: MainFrame() : wxFrame(nullptr, -1, "Hello world", wxPoint(50, 50), wxSize(640, 480)) { new wxStaticText(this, Id::Welcome, "Welcome to the GUI.", wxPoint(20, 20)); new wxButton(this, Id::Single, "Single", wxPoint(20, 60)); - auto combo = new wxComboBox(this, Id::SelectDevice, "", wxPoint(470, 20), wxSize(150, 30)); - combo->SetEditable(false); + m_device_combo = new wxComboBox(this, Id::SelectDevice, "", wxPoint(470, 20), wxSize(150, 30)); + m_device_combo->SetEditable(false); stmdsp::scanner scanner; for (auto& dev : scanner.scan()) - combo->Append(dev); - if (combo->GetCount() > 0) - combo->SetSelection(0); + m_device_combo->Append(dev); + if (m_device_combo->GetCount() > 0) + m_device_combo->SetSelection(0); m_render_timer = new wxTimer(this, Id::RenderTimer); @@ -53,19 +59,47 @@ public: dc->SetPen(*wxBLACK_PEN); dc->DrawRectangle(m_clipping_region); - dc->SetPen(*wxRED_PEN); - dc->DrawCircle(320, 240, m_radius); + if (m_device_samples.size() > 0) { + dc->SetPen(*wxRED_PEN); + auto points = new wxPoint[m_device_samples.size()]; + const float spacing = static_cast(m_clipping_region.GetWidth()) / m_device_samples.size(); + float x = 0; + for (auto ptr = points; auto sample : m_device_samples) { + *ptr++ = wxPoint { + static_cast(x), + m_clipping_region.GetHeight() - sample * m_clipping_region.GetHeight() / 4096 + }; + x += spacing; + } + dc->DrawLines(m_device_samples.size(), points, m_clipping_region.GetX(), m_clipping_region.GetY()); + delete[] points; + } + } + + void doSingle() { + m_device_samples_future = std::async(std::launch::async, + [this]() { return m_device->sample(250); }); } void onSinglePressed(wxCommandEvent& ce) { auto button = dynamic_cast(ce.GetEventObject()); if (!m_render_timer->IsRunning()) { - m_render_timer->Start(100); - button->SetLabel("Stop"); + m_device = new stmdsp::device(m_device_combo->GetStringSelection().ToStdString()); + if (m_device->connected()) { + doSingle(); + m_render_timer->Start(100); + button->SetLabel("Stop"); + } else { + delete m_device; + m_device = nullptr; + } } else { m_render_timer->Stop(); button->SetLabel("Single"); + + delete m_device; + m_device = nullptr; } } @@ -74,8 +108,10 @@ public: } void updateDrawing() { - m_radius++; - this->RefreshRect(m_clipping_region); + if (m_device_samples = m_device_samples_future.get(); m_device_samples.size() > 0) + this->RefreshRect(m_clipping_region); + + doSingle(); } }; diff --git a/source/main.cpp b/source/main.cpp index dc38ddd..b73776a 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -23,7 +23,7 @@ static_assert(sizeof(adcsample_t) == sizeof(uint16_t)); #if CACHE_LINE_SIZE > 0 CC_ALIGN(CACHE_LINE_SIZE) #endif -static std::array adc_samples; +static std::array adc_samples; int main() { @@ -49,11 +49,13 @@ int main() while (true) { if (usbd.active()) { // Expect to receive a byte command 'packet'. - if (char cmd; usbd.read(&cmd) > 0) { - switch (cmd) { + if (char cmd[3]; usbd.read(&cmd, 3) > 0) { + switch (cmd[0]) { case 'r': // Read in analog signal - adc.getSamples(&adc_samples[0], 100);//adc_samples.size()); - usbd.write(adc_samples.data(), adc_samples.size()); + if (auto count = std::min(static_cast(cmd[1] | (cmd[2] << 8)), adc_samples.size()); count > 0) { + adc.getSamples(&adc_samples[0], count); + usbd.write(adc_samples.data(), count * sizeof(adcsample_t)); + } break; case 'i': // Identify ourself as an stmdsp device usbd.write("stmdsp", 6); @@ -64,7 +66,7 @@ int main() } } - chThdSleepMilliseconds(250); + chThdSleepMilliseconds(1); } } -- cgit v1.2.3 From 546fb2d9dce879b79855af50379fb0cdbba46551 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 9 Jul 2020 11:00:08 -0400 Subject: fixed command receiving code --- source/main.cpp | 146 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 74 insertions(+), 72 deletions(-) (limited to 'source/main.cpp') diff --git a/source/main.cpp b/source/main.cpp index b73776a..95211b4 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,72 +1,74 @@ -/** - * @file main.cpp - * @brief Program entry point. - * - * Copyright (C) 2020 Clyne Sullivan - * - * Distributed under the GNU GPL v3 or later. You should have received a copy of - * the GNU General Public License along with this program. - * If not, see . - */ - -#include "ch.h" -#include "hal.h" - -#include "adc.hpp" -#include "dac.hpp" -#include "usbserial.hpp" - -#include - -static_assert(sizeof(adcsample_t) == sizeof(uint16_t)); - -#if CACHE_LINE_SIZE > 0 -CC_ALIGN(CACHE_LINE_SIZE) -#endif -static std::array adc_samples; - -int main() -{ - halInit(); - chSysInit(); - - palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL); // LED - - ADCd adc (ADCD1, GPTD4); - adc.start(); - - //DACd dac (DACD1, { - // .init = 0, - // .datamode = DAC_DHRM_12BIT_RIGHT, - // .cr = 0 - //}); - //dac.start(); - //dac.write(0, 1024); - - USBSeriald usbd (SDU1); - usbd.start(); - - while (true) { - if (usbd.active()) { - // Expect to receive a byte command 'packet'. - if (char cmd[3]; usbd.read(&cmd, 3) > 0) { - switch (cmd[0]) { - case 'r': // Read in analog signal - if (auto count = std::min(static_cast(cmd[1] | (cmd[2] << 8)), adc_samples.size()); count > 0) { - adc.getSamples(&adc_samples[0], count); - usbd.write(adc_samples.data(), count * sizeof(adcsample_t)); - } - break; - case 'i': // Identify ourself as an stmdsp device - usbd.write("stmdsp", 6); - break; - default: - break; - } - } - } - - chThdSleepMilliseconds(1); - } -} - +/** + * @file main.cpp + * @brief Program entry point. + * + * Copyright (C) 2020 Clyne Sullivan + * + * Distributed under the GNU GPL v3 or later. You should have received a copy of + * the GNU General Public License along with this program. + * If not, see . + */ + +#include "ch.h" +#include "hal.h" + +#include "adc.hpp" +#include "dac.hpp" +#include "usbserial.hpp" + +#include + +static_assert(sizeof(adcsample_t) == sizeof(uint16_t)); + +#if CACHE_LINE_SIZE > 0 +CC_ALIGN(CACHE_LINE_SIZE) +#endif +static std::array adc_samples; + +int main() +{ + halInit(); + chSysInit(); + + palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL); // LED + + ADCd adc (ADCD1, GPTD4); + adc.start(); + + //DACd dac (DACD1, { + // .init = 0, + // .datamode = DAC_DHRM_12BIT_RIGHT, + // .cr = 0 + //}); + //dac.start(); + //dac.write(0, 1024); + + USBSeriald usbd (SDU1); + usbd.start(); + + while (true) { + if (usbd.active()) { + // Expect to receive a byte command 'packet'. + if (char cmd[3]; usbd.read(&cmd, 1) > 0) { + switch (cmd[0]) { + case 'r': // Read in analog signal + if (usbd.read(&cmd[1], 2) < 2) + break; + if (auto count = std::min(static_cast(cmd[1] | (cmd[2] << 8)), adc_samples.size()); count > 0) { + adc.getSamples(&adc_samples[0], count); + usbd.write(adc_samples.data(), count * sizeof(adcsample_t)); + } + break; + case 'i': // Identify ourself as an stmdsp device + usbd.write("stmdsp", 6); + break; + default: + break; + } + } + } + + chThdSleepMilliseconds(1); + } +} + -- cgit v1.2.3