From e0860a0d4091a2f32a4c3b26cc12d173b01c4c4e Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 21 Jul 2015 01:33:58 +0200 Subject: [PATCH] Implemented scope trigger delay --- Readme.md | 2 +- include-gpl/gui/glscopegui.h | 3 ++ sdrbase/gui/glscopegui.cpp | 33 ++++++++++++++++++++- sdrbase/gui/glscopegui.ui | 57 ++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index e4a6d124e..7aa98d5b4 100644 --- a/Readme.md +++ b/Readme.md @@ -115,12 +115,12 @@ Done since the fork - Enhanced spectrum display: Histogram: define NO_AVX, wider decay range, make stroke and late holdoff adjustable. Added option to show live spectrum (had only max hold before). - Enhanced channel analyzer: enhanced scope and spectrum displays as mentioned above, make the spectrum display synchronous to scope (hence triggerable a la E4406A). - Sort channel plugins by delta frequency and type before saving to preset + - Implemented scope trigger delay ===== To Do ===== - - Implement trigger delay on scope - Variable scope memory depth - Enhance presets management (Edit, Move, Import/Export from/to human readable format like JSON) - Level calibration diff --git a/include-gpl/gui/glscopegui.h b/include-gpl/gui/glscopegui.h index d9f25fc16..f99d0d484 100644 --- a/include-gpl/gui/glscopegui.h +++ b/include-gpl/gui/glscopegui.h @@ -51,6 +51,7 @@ private: qint32 m_triggerChannel; qint32 m_triggerLevel; // percent bool m_triggerPositiveEdge; + qint32 m_triggerDelay; static const qreal amps[11]; @@ -61,6 +62,7 @@ private: void setAmpScaleDisplay(); void setAmpOfsDisplay(); void setTrigLevelDisplay(); + void setTrigDelayDisplay(); private slots: void on_amp_valueChanged(int value); @@ -72,6 +74,7 @@ private slots: void on_dataMode_currentIndexChanged(int index); void on_gridIntensity_valueChanged(int index); void on_traceIntensity_valueChanged(int index); + void on_trigDelay_valueChanged(int value); void on_horizView_clicked(); void on_vertView_clicked(); diff --git a/sdrbase/gui/glscopegui.cpp b/sdrbase/gui/glscopegui.cpp index bc3b57ac7..21d681046 100644 --- a/sdrbase/gui/glscopegui.cpp +++ b/sdrbase/gui/glscopegui.cpp @@ -81,6 +81,7 @@ QByteArray GLScopeGUI::serialize() const s.writeS32(10, m_triggerLevel); s.writeBool(11, m_triggerPositiveEdge); s.writeS32(12, m_displayTraceIntensity); + s.writeS32(13, m_triggerDelay); return s.final(); } @@ -114,6 +115,9 @@ bool GLScopeGUI::deserialize(const QByteArray& data) ui->slopePos->setChecked(m_triggerPositiveEdge); ui->slopeNeg->setChecked(!m_triggerPositiveEdge); d.readS32(12, &m_displayTraceIntensity, 50); + d.readS32(13, &m_triggerDelay, 0); + ui->trigDelay->setValue(m_triggerDelay); + setTrigDelayDisplay(); applySettings(); applyTriggerSettings(); return true; @@ -169,6 +173,7 @@ void GLScopeGUI::applySettings() void GLScopeGUI::applyTriggerSettings() { Real triggerLevel; + quint32 trigDelaySamples = (m_glScope->getTraceSize() * m_triggerDelay) / 100; if (m_triggerChannel == ScopeVis::TriggerMagDb) { triggerLevel = m_triggerLevel - 100.0; @@ -180,7 +185,7 @@ void GLScopeGUI::applyTriggerSettings() m_glScope->setTriggerChannel((ScopeVis::TriggerChannel) m_triggerChannel); m_glScope->setTriggerLevel(m_triggerLevel / 100.0); - m_scopeVis->configure(m_messageQueue, (ScopeVis::TriggerChannel) m_triggerChannel, triggerLevel, m_triggerPositiveEdge, 0); // TODO: pass trigger delay as the last parameter + m_scopeVis->configure(m_messageQueue, (ScopeVis::TriggerChannel) m_triggerChannel, triggerLevel, m_triggerPositiveEdge, trigDelaySamples); // TODO: pass trigger delay as the last parameter } void GLScopeGUI::setTrigLevelDisplay() @@ -275,6 +280,19 @@ void GLScopeGUI::setTimeOfsDisplay() //ui->timeOfsText->setText(tr("%1").arg(value/100.0, 0, 'f', 2)); } +void GLScopeGUI::setTrigDelayDisplay() +{ + qreal dt = m_glScope->getTraceSize() * (m_triggerDelay/100.0) / m_sampleRate; + + if(dt < 0.000001) + ui->trigDelayText->setText(tr("%1\nns").arg(dt * 1000000000.0)); + else if(dt < 0.001) + ui->trigDelayText->setText(tr("%1\nµs").arg(dt * 1000000.0)); + else if(dt < 1.0) + ui->trigDelayText->setText(tr("%1\nms").arg(dt * 1000.0)); + else ui->trigDelayText->setText(tr("%1\ns").arg(dt * 1.0)); +} + void GLScopeGUI::on_time_valueChanged(int value) { m_timeBase = value; @@ -284,11 +302,24 @@ void GLScopeGUI::on_time_valueChanged(int value) void GLScopeGUI::on_timeOfs_valueChanged(int value) { + if ((value < 0) || (value > 100)) { + return; + } m_timeOffset = value; setTimeOfsDisplay(); m_glScope->setTimeOfsProMill(value*10); } +void GLScopeGUI::on_trigDelay_valueChanged(int value) +{ + if ((value < 0) || (value > 100)) { + return; + } + m_triggerDelay = value; + setTrigDelayDisplay(); + applyTriggerSettings(); +} + void GLScopeGUI::on_dataMode_currentIndexChanged(int index) { m_displayData = index; diff --git a/sdrbase/gui/glscopegui.ui b/sdrbase/gui/glscopegui.ui index 4156a633a..871ee5a8d 100644 --- a/sdrbase/gui/glscopegui.ui +++ b/sdrbase/gui/glscopegui.ui @@ -245,6 +245,11 @@ 0 + + + 8 + + Time range @@ -659,6 +664,18 @@ + + + + + 8 + + + + Lvl + + + @@ -695,6 +712,46 @@ + + + + + 8 + + + + Dly + + + + + + + Trigger delay + + + 100 + + + 1 + + + Qt::Horizontal + + + + + + + + 8 + + + + 0 + + +