fixed bug continuous mode

This commit is contained in:
Kizarm 2024-10-22 20:05:15 +02:00
parent 776ffd5bd2
commit b2c0bc43fe
3 changed files with 16 additions and 9 deletions

View file

@ -77,13 +77,20 @@ void SampleRing::CommandPass(const unsigned int cmd) {
void SampleRing::write(DATA_BLOCK const * data) { void SampleRing::write(DATA_BLOCK const * data) {
if (m_finished) return; 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 * 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 * 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. * meodešlou do ring_buffer všechna.
* Kde zde vzít informaci, že se m_mode nějak změnilo a nějak použít
* zatím nevím, nejjednodušší je nechat to být a přenést do software.
* */ * */
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_head = m_head; // dočasné proměnné kvůli zrychlení
unsigned t_lenght = m_lenght; // následujícího cyklu unsigned t_lenght = m_lenght; // následujícího cyklu
if (m_mode == TIME_BASE_TRIGERED) { if (m_mode == TIME_BASE_TRIGERED) {

View file

@ -25,7 +25,7 @@ class SampleRing : public BaseLayer {
bool m_old_triger; bool m_old_triger;
bool m_trigered; bool m_trigered;
volatile bool m_finished; 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]; [[gnu::aligned(4)]]char rcvd_buffer [RCVD_BUFLEN];
unsigned rcvd_counter; unsigned rcvd_counter;
@ -33,7 +33,7 @@ class SampleRing : public BaseLayer {
public: public:
explicit SampleRing () noexcept : BaseLayer(), m_settings(), m_head(0), m_tail(0), m_lenght(0), 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_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) {}; rcvd_counter(0u), rcvd_status (RCVD_IDLE) {};
uint32_t Up (const char * data, const uint32_t len) override; uint32_t Up (const char * data, const uint32_t len) override;
void write (DATA_BLOCK const * data); void write (DATA_BLOCK const * data);

View file

@ -79,10 +79,10 @@ void MainWindow::TriggerValues (int n) {
void MainWindow::SendTrigerMode (int n) { void MainWindow::SendTrigerMode (int n) {
if (n == TRIGER_MODE_SINGLE) ui->buttonStart->setEnabled(true); if (n == TRIGER_MODE_SINGLE) ui->buttonStart->setEnabled(true);
else ui->buttonStart->setEnabled(false); 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ě 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); firmware.SendTrigerMode(n);
} }
void MainWindow::SendTrigerEdge (int n) { void MainWindow::SendTrigerEdge (int n) {