From 27116d5b3f9a35929592197abc2196050763a1f9 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 6 Feb 2017 18:40:15 +0100 Subject: [PATCH] New Scope: trigger implementation interim state (1) --- sdrbase/dsp/scopevisng.cpp | 4 +- sdrbase/gui/glscopenggui.cpp | 209 ++++++++++++++++++++++++++++++++++- sdrbase/gui/glscopenggui.h | 21 ++++ windows.install.bat | 1 + windows64.install.bat | 1 + 5 files changed, 234 insertions(+), 2 deletions(-) diff --git a/sdrbase/dsp/scopevisng.cpp b/sdrbase/dsp/scopevisng.cpp index e20bc59ce..fa8d5df63 100644 --- a/sdrbase/dsp/scopevisng.cpp +++ b/sdrbase/dsp/scopevisng.cpp @@ -182,9 +182,11 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe if (triggerCondition.m_triggerData.m_triggerBothEdges) { trigger = triggerCondition.m_prevCondition ^ condition; } else { - trigger = condition ^ !triggerCondition.m_triggerData.m_triggerPositiveEdge; + trigger = (triggerCondition.m_prevCondition ^ condition) && (condition ^ !triggerCondition.m_triggerData.m_triggerPositiveEdge); } + triggerCondition.m_prevCondition = condition; + if (trigger) // trigger condition { if (triggerCondition.m_triggerData.m_triggerDelay > 0) // there is a delay => initialize the delay diff --git a/sdrbase/gui/glscopenggui.cpp b/sdrbase/gui/glscopenggui.cpp index d7d07e16e..a26aa1301 100644 --- a/sdrbase/gui/glscopenggui.cpp +++ b/sdrbase/gui/glscopenggui.cpp @@ -63,6 +63,8 @@ void GLScopeNGGUI::setBuddies(MessageQueue* messageQueue, ScopeVisNG* scopeVis, ui->trigPos->setChecked(true); ui->trigNeg->setChecked(false); ui->trigBoth->setChecked(false); + ui->trigOneShot->setChecked(false); + ui->trigOneShot->setEnabled(false); ui->freerun->setChecked(true); // Add a trace @@ -253,9 +255,109 @@ void GLScopeNGGUI::on_amp_valueChanged(int value) changeCurrentTrace(); } +void GLScopeNGGUI::on_ofsCoarse_valueChanged(int value) +{ + setAmpOfsDisplay(); + changeCurrentTrace(); +} + +void GLScopeNGGUI::on_ofsFine_valueChanged(int value) +{ + setAmpOfsDisplay(); + changeCurrentTrace(); +} + +void GLScopeNGGUI::on_traceDelay_valueChanged(int value) +{ + // TODO +} + +void GLScopeNGGUI::on_trigMode_currentIndexChanged(int index) +{ + setTrigLevelDisplay(); + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigCount_valueChanged(int value) +{ + QString text; + text.sprintf("%02d", value); + ui->trigCountText->setText(text); + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigPos_toggled(bool checked) +{ + if (checked) + { + ui->trigNeg->setChecked(false); + ui->trigBoth->setChecked(false); + } + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigNeg_toggled(bool checked) +{ + if (checked) + { + ui->trigPos->setChecked(false); + ui->trigBoth->setChecked(false); + } + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigBoth_toggled(bool checked) +{ + if (checked) + { + ui->trigNeg->setChecked(false); + ui->trigPos->setChecked(false); + } + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigLevelCoarse_valueChanged(int value) +{ + setTrigLevelDisplay(); + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigLevelFine_valueChanged(int value) +{ + setTrigLevelDisplay(); + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigDelay_valueChanged(int value) +{ + setTrigDelayDisplay(); + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigPre_valueChanged(int value) +{ + setTrigPreDisplay(); + changeCurrentTrigger(); +} + +void GLScopeNGGUI::on_trigOneShot_toggled(bool checked) +{ + m_scopeVis->configure(m_traceLenMult*ScopeVisNG::m_traceChunkSize, m_timeOffset*10, ui->freerun->isChecked()); // TODO: implement one shot feature +} + void GLScopeNGGUI::on_freerun_toggled(bool checked) { - m_scopeVis->configure(m_traceLenMult*ScopeVisNG::m_traceChunkSize, m_timeOffset*10, ui->freerun->isChecked()); + if (checked) + { + ui->trigOneShot->setChecked(false); + ui->trigOneShot->setEnabled(false); + } + else + { + ui->trigOneShot->setEnabled(true); + } + + m_scopeVis->configure(m_traceLenMult*ScopeVisNG::m_traceChunkSize, m_timeOffset*10, ui->freerun->isChecked()); // TODO: implement one shot feature } void GLScopeNGGUI::setTimeScaleDisplay() @@ -355,6 +457,103 @@ void GLScopeNGGUI::setAmpScaleDisplay() } } +void GLScopeNGGUI::setAmpOfsDisplay() +{ + ScopeVisNG::ProjectionType projectionType = (ScopeVisNG::ProjectionType) ui->traceMode->currentIndex(); + float o = (ui->ofsCoarse->value() * 10.0f) + (ui->ofsFine->value() / 20.0f); + + if (projectionType == ScopeVisNG::ProjectionMagDB) + { + ui->ofsText->setText(tr("%1").arg(o/1000.0, 0, 'f', 4)); + } + else + { + float a = o/1000.0f; + + if(fabs(a) < 0.000001) + ui->ofsText->setText(tr("%1\nn").arg(a * 1000000000.0)); + else if(fabs(a) < 0.001) + ui->ofsText->setText(tr("%1\nµ").arg(a * 1000000.0)); + else if(fabs(a) < 1.0) + ui->ofsText->setText(tr("%1\nm").arg(a * 1000.0)); + else + ui->ofsText->setText(tr("%1").arg(a * 1.0)); + } +} + +void GLScopeNGGUI::setTrigLevelDisplay() +{ + float t = (ui->trigLevelCoarse->value() / 100.0f) + (ui->trigLevelFine->value() / 20000.0f); + ScopeVisNG::ProjectionType projectionType = (ScopeVisNG::ProjectionType) ui->trigMode->currentIndex(); + + ui->trigLevelCoarse->setToolTip(QString("Trigger level coarse: %1 %").arg(ui->trigLevelCoarse->value() / 100.0f)); + ui->trigLevelFine->setToolTip(QString("Trigger level fine: %1 ppm").arg(ui->trigLevelFine->value() * 50)); + + if (projectionType == ScopeVisNG::ProjectionMagDB) { + ui->trigLevelText->setText(tr("%1\ndB").arg(100.0 * (t - 1.0), 0, 'f', 1)); + } + else + { + float a; + + if (projectionType == ScopeVisNG::ProjectionMagLin) { + a = 1.0 + t; + } else { + a = t; + } + + if(fabs(a) < 0.000001) + ui->trigLevelText->setText(tr("%1\nn").arg(a * 1000000000.0f)); + else if(fabs(a) < 0.001) + ui->trigLevelText->setText(tr("%1\nµ").arg(a * 1000000.0f)); + else if(fabs(a) < 1.0) + ui->trigLevelText->setText(tr("%1\nm").arg(a * 1000.0f)); + else + ui->trigLevelText->setText(tr("%1").arg(a * 1.0f)); + } +} + +void GLScopeNGGUI::setTrigDelayDisplay() +{ + unsigned int n_samples_delay = m_traceLenMult * ScopeVisNG::m_traceChunkSize * ui->trigDelay->value(); + + if (n_samples_delay < 1000) { + ui->trigDelayText->setToolTip(tr("%1S").arg(n_samples_delay)); + } else if (n_samples_delay < 1000000) { + ui->trigDelayText->setToolTip(tr("%1kS").arg(n_samples_delay/1000.0)); + } else if (n_samples_delay < 1000000000) { + ui->trigDelayText->setToolTip(tr("%1MS").arg(n_samples_delay/1000000.0)); + } else { + ui->trigDelayText->setToolTip(tr("%1GS").arg(n_samples_delay/1000000000.0)); + } + + m_sampleRate = m_glScope->getSampleRate(); + float t = (n_samples_delay * 1.0f / m_sampleRate); + + if(t < 0.000001) + ui->trigDelayText->setText(tr("%1\nns").arg(t * 1000000000.0)); + else if(t < 0.001) + ui->trigDelayText->setText(tr("%1\nµs").arg(t * 1000000.0)); + else if(t < 1.0) + ui->trigDelayText->setText(tr("%1\nms").arg(t * 1000.0)); + else + ui->trigDelayText->setText(tr("%1\ns").arg(t * 1.0)); +} + +void GLScopeNGGUI::setTrigPreDisplay() +{ + float dt = m_glScope->getTraceSize() * (ui->trigPre->value()/100.0f) / m_sampleRate; + + if(dt < 0.000001) + ui->trigPreText->setText(tr("%1\nns").arg(dt * 1000000000.0f)); + else if(dt < 0.001) + ui->trigPreText->setText(tr("%1\nµs").arg(dt * 1000000.0f)); + else if(dt < 1.0) + ui->trigPreText->setText(tr("%1\nms").arg(dt * 1000.0f)); + else + ui->trigPreText->setText(tr("%1\ns").arg(dt * 1.0f)); +} + void GLScopeNGGUI::changeCurrentTrace() { ScopeVisNG::TraceData traceData; @@ -363,6 +562,14 @@ void GLScopeNGGUI::changeCurrentTrace() m_scopeVis->changeTrace(traceData, currentTraceIndex); } +void GLScopeNGGUI::changeCurrentTrigger() +{ + ScopeVisNG::TriggerData triggerData; + fillTriggerData(triggerData); + uint32_t currentTriggerIndex = ui->trig->value(); + m_scopeVis->changeTrigger(triggerData, currentTriggerIndex); +} + void GLScopeNGGUI::fillProjectionCombo(QComboBox* comboBox) { comboBox->addItem("Real", ScopeVisNG::ProjectionReal); diff --git a/sdrbase/gui/glscopenggui.h b/sdrbase/gui/glscopenggui.h index 164d30f3f..367496c80 100644 --- a/sdrbase/gui/glscopenggui.h +++ b/sdrbase/gui/glscopenggui.h @@ -64,12 +64,20 @@ private: static const double amps[11]; void applySettings(); + // First row void setTimeScaleDisplay(); void setTraceLenDisplay(); void setTimeOfsDisplay(); + // Second row void setAmpScaleDisplay(); + void setAmpOfsDisplay(); + // Third row + void setTrigLevelDisplay(); + void setTrigDelayDisplay(); + void setTrigPreDisplay(); void changeCurrentTrace(); + void changeCurrentTrigger(); void fillTraceData(ScopeVisNG::TraceData& traceData); void fillTriggerData(ScopeVisNG::TriggerData& triggerData); @@ -92,7 +100,20 @@ private slots: // Second row void on_traceMode_currentIndexChanged(int index); void on_amp_valueChanged(int value); + void on_ofsCoarse_valueChanged(int value); + void on_ofsFine_valueChanged(int value); + void on_traceDelay_valueChanged(int value); // Third row + void on_trigMode_currentIndexChanged(int index); + void on_trigCount_valueChanged(int value); + void on_trigPos_toggled(bool checked); + void on_trigNeg_toggled(bool checked); + void on_trigBoth_toggled(bool checked); + void on_trigLevelCoarse_valueChanged(int value); + void on_trigLevelFine_valueChanged(int value); + void on_trigDelay_valueChanged(int value); + void on_trigPre_valueChanged(int value); + void on_trigOneShot_toggled(bool checked); void on_freerun_toggled(bool checked); }; diff --git a/windows.install.bat b/windows.install.bat index 599b3dcdf..ce517cc3a 100644 --- a/windows.install.bat +++ b/windows.install.bat @@ -18,6 +18,7 @@ mkdir %2\plugins\channeltx mkdir %2\plugins\samplesource mkdir %2\plugins\samplesink copy plugins\channelrx\chanalyzer\%1\chanalyzer.dll %2\plugins\channelrx +copy plugins\channelrx\chanalyzerng\%1\chanalyzerng.dll %2\plugins\channelrx copy plugins\channelrx\demodam\%1\demodam.dll %2\plugins\channelrx copy plugins\channelrx\demodbfm\%1\demodbfm.dll %2\plugins\channelrx copy plugins\channelrx\demoddsd\%1\demoddsd.dll %2\plugins\channelrx diff --git a/windows64.install.bat b/windows64.install.bat index 3bcbb9c52..3bd04a132 100644 --- a/windows64.install.bat +++ b/windows64.install.bat @@ -31,6 +31,7 @@ mkdir %2\plugins\channeltx mkdir %2\plugins\samplesource mkdir %2\plugins\samplesink copy plugins\channelrx\chanalyzer\%1\chanalyzer.dll %2\plugins\channelrx +copy plugins\channelrx\chanalyzerng\%1\chanalyzerng.dll %2\plugins\channelrx copy plugins\channelrx\demodam\%1\demodam.dll %2\plugins\channelrx copy plugins\channelrx\demodbfm\%1\demodbfm.dll %2\plugins\channelrx copy plugins\channelrx\demoddsd\%1\demoddsd.dll %2\plugins\channelrx