From b2c0bc43feab4b816c06512d319065cd79fb571d Mon Sep 17 00:00:00 2001 From: Kizarm Date: Tue, 22 Oct 2024 20:05:15 +0200 Subject: [PATCH] fixed bug continuous mode --- V203/usb/scope/firmware/samplering.cpp | 15 +++++++++++---- V203/usb/scope/firmware/samplering.h | 4 ++-- V203/usb/scope/software/mainwindow.cpp | 6 +++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/V203/usb/scope/firmware/samplering.cpp b/V203/usb/scope/firmware/samplering.cpp index 0c291db..4c03808 100644 --- a/V203/usb/scope/firmware/samplering.cpp +++ b/V203/usb/scope/firmware/samplering.cpp @@ -77,13 +77,20 @@ void SampleRing::CommandPass(const unsigned int cmd) { void SampleRing::write(DATA_BLOCK const * data) { if (m_finished) return; - /** BUG : Tady je problém - tato funkce běží pod přerušením s vyšší prioritou, + /** Tady je problém - tato funkce běží pod přerušením s vyšší prioritou, * takže m_mode se během tt. funkce změnit nemůže. Z toho vyplývá, že se * odeslání dat musí vykonat a nelze tedy změnit m_mode dokud se data - * meodešlou do ring_buffer všechna. Tedy to funguje, pokud je TRIGER_MODE_AUTO. - * Kde zde vzít informaci, že se m_mode nějak změnilo a nějak jí použít - * zatím nevím, nejjednodušší je nechat to být a přenést do software. + * meodešlou do ring_buffer všechna. * */ + if (m_mode != o_mode) { // bug fix + if (m_mode == TIME_BASE_CONTINUOUS) { // Při změně na kontinuální provoz + m_lenght = RING_LEN; // odešli celý ring_buffer. + m_tail = m_head; // Není to ideální, ale funguje to. + m_finished = true; // Příkaz k odeslání to odstartuje. + } + o_mode = m_mode; + return; + } unsigned t_head = m_head; // dočasné proměnné kvůli zrychlení unsigned t_lenght = m_lenght; // následujícího cyklu if (m_mode == TIME_BASE_TRIGERED) { diff --git a/V203/usb/scope/firmware/samplering.h b/V203/usb/scope/firmware/samplering.h index 15a24bb..a78c2c5 100644 --- a/V203/usb/scope/firmware/samplering.h +++ b/V203/usb/scope/firmware/samplering.h @@ -25,7 +25,7 @@ class SampleRing : public BaseLayer { bool m_old_triger; bool m_trigered; volatile bool m_finished; - TIME_BASE_MODE m_mode; //, o_mode; + TIME_BASE_MODE m_mode, o_mode; [[gnu::aligned(4)]]char rcvd_buffer [RCVD_BUFLEN]; unsigned rcvd_counter; @@ -33,7 +33,7 @@ class SampleRing : public BaseLayer { public: explicit SampleRing () noexcept : BaseLayer(), m_settings(), m_head(0), m_tail(0), m_lenght(0), m_old_triger(false), m_trigered(false), m_finished(false), - m_mode (TIME_BASE_TRIGERED), // o_mode (TIME_BASE_TRIGERED), + m_mode (TIME_BASE_TRIGERED), o_mode (TIME_BASE_TRIGERED), rcvd_counter(0u), rcvd_status (RCVD_IDLE) {}; uint32_t Up (const char * data, const uint32_t len) override; void write (DATA_BLOCK const * data); diff --git a/V203/usb/scope/software/mainwindow.cpp b/V203/usb/scope/software/mainwindow.cpp index ff332b1..65fe66a 100644 --- a/V203/usb/scope/software/mainwindow.cpp +++ b/V203/usb/scope/software/mainwindow.cpp @@ -79,10 +79,10 @@ void MainWindow::TriggerValues (int n) { void MainWindow::SendTrigerMode (int n) { if (n == TRIGER_MODE_SINGLE) ui->buttonStart->setEnabled(true); else ui->buttonStart->setEnabled(false); - + /* if (n == TRIGER_MODE_AUTO) ui->comboTimeRange->setEnabled(true); // BUG - jinak dojde při přepínání k chybě - else ui->comboTimeRange->setEnabled(false); // TODO - + else ui->comboTimeRange->setEnabled(false); // fixed + */ firmware.SendTrigerMode(n); } void MainWindow::SendTrigerEdge (int n) {