From ec604c21c9e2f7fd5bec382481bd65f04b88423a Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 10 Feb 2017 04:35:08 +0100 Subject: [PATCH] New scope: fixed trigger UI add, remove and change current --- sdrbase/dsp/scopevisng.cpp | 7 +++ sdrbase/dsp/scopevisng.h | 27 ++++++++++- sdrbase/gui/buttonswitch.cpp | 5 ++ sdrbase/gui/buttonswitch.h | 1 + sdrbase/gui/glscopenggui.cpp | 94 +++++++++++++++++++++++++++++++++--- sdrbase/gui/glscopenggui.h | 1 + 6 files changed, 125 insertions(+), 10 deletions(-) diff --git a/sdrbase/dsp/scopevisng.cpp b/sdrbase/dsp/scopevisng.cpp index b853e8681..d8c38bf15 100644 --- a/sdrbase/dsp/scopevisng.cpp +++ b/sdrbase/dsp/scopevisng.cpp @@ -101,6 +101,13 @@ void ScopeVisNG::addTrigger(const TriggerData& triggerData) void ScopeVisNG::changeTrigger(const TriggerData& triggerData, uint32_t triggerIndex) { + qDebug() << "ScopeVisNG::changeTrigger:" + << " trigger: " << triggerIndex + << " m_projectionType: " << triggerData.m_projectionType + << " m_triggerRepeat: " << triggerData.m_triggerRepeat + << " m_triggerPositiveEdge: " << triggerData.m_triggerPositiveEdge + << " m_triggerBothEdges: " << triggerData.m_triggerBothEdges; +; Message* cmd = MsgScopeVisNGChangeTrigger::create(triggerData, triggerIndex); getInputMessageQueue()->push(cmd); } diff --git a/sdrbase/dsp/scopevisng.h b/sdrbase/dsp/scopevisng.h index 86bef4a32..21a422097 100644 --- a/sdrbase/dsp/scopevisng.h +++ b/sdrbase/dsp/scopevisng.h @@ -18,6 +18,8 @@ #ifndef SDRBASE_DSP_SCOPEVISNG_H_ #define SDRBASE_DSP_SCOPEVISNG_H_ +#include + #include #include #include @@ -64,18 +66,28 @@ public: ProjectionType m_projectionType; //!< Complex to real projection type uint32_t m_inputIndex; //!< Input or feed index this trigger is associated with Real m_triggerLevel; //!< Level in real units + int m_triggerLevelCoarse; + int m_triggerLevelFine; bool m_triggerPositiveEdge; //!< Trigger on the positive edge (else negative) bool m_triggerBothEdges; //!< Trigger on both edges (else only one) - uint32_t m_triggerDelay; //!< Delay before the trigger is kicked off in number of samples + uint32_t m_triggerDelay; //!< Delay before the trigger is kicked off in number of samples (trigger delay) + double m_triggerDelayMult; //!< Trigger delay as a multiplier of trace length + int m_triggerDelayCoarse; + int m_triggerDelayFine; uint32_t m_triggerRepeat; //!< Number of trigger conditions before the final decisive trigger TriggerData() : m_projectionType(ProjectionReal), m_inputIndex(0), m_triggerLevel(0.0f), + m_triggerLevelCoarse(0), + m_triggerLevelFine(0), m_triggerPositiveEdge(true), m_triggerBothEdges(false), m_triggerDelay(0), + m_triggerDelayMult(0.0), + m_triggerDelayCoarse(0), + m_triggerDelayFine(0), m_triggerRepeat(0) {} }; @@ -92,9 +104,20 @@ public: void changeTrace(const TraceData& traceData, uint32_t traceIndex); void removeTrace(uint32_t traceIndex); void addTrigger(const TriggerData& triggerData); - void changeTrigger(const TriggerData& triggerData, uint32_t traceIndex); + void changeTrigger(const TriggerData& triggerData, uint32_t triggerIndex); void removeTrigger(uint32_t triggerIndex); + void getTriggerData(TriggerData& triggerData, uint32_t triggerIndex) + { + if (triggerIndex < m_triggerConditions.size()) + { + qDebug() << "copeVisNG::getTriggerData:" + << " index: " << triggerIndex + << " projection: " << (int) m_triggerConditions[triggerIndex].m_triggerData.m_projectionType; + triggerData = m_triggerConditions[triggerIndex].m_triggerData; + } + } + virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly); virtual void start(); virtual void stop(); diff --git a/sdrbase/gui/buttonswitch.cpp b/sdrbase/gui/buttonswitch.cpp index 88d0bd5d4..ac7cc2bf8 100644 --- a/sdrbase/gui/buttonswitch.cpp +++ b/sdrbase/gui/buttonswitch.cpp @@ -19,3 +19,8 @@ void ButtonSwitch::onToggled(bool checked) setPalette(m_originalPalette); } } + +void ButtonSwitch::doToggle(bool checked) +{ + onToggled(checked); +} diff --git a/sdrbase/gui/buttonswitch.h b/sdrbase/gui/buttonswitch.h index 672a5afea..d5c5d7398 100644 --- a/sdrbase/gui/buttonswitch.h +++ b/sdrbase/gui/buttonswitch.h @@ -8,6 +8,7 @@ class ButtonSwitch : public QToolButton { public: ButtonSwitch(QWidget* parent = NULL); + void doToggle(bool checked); private slots: void onToggled(bool checked); diff --git a/sdrbase/gui/glscopenggui.cpp b/sdrbase/gui/glscopenggui.cpp index c63957eab..efe8fa452 100644 --- a/sdrbase/gui/glscopenggui.cpp +++ b/sdrbase/gui/glscopenggui.cpp @@ -260,6 +260,18 @@ void GLScopeNGGUI::on_traceLen_valueChanged(int value) void GLScopeNGGUI::on_trig_valueChanged(int value) { ui->trigText->setText(tr("%1").arg(value)); + + ScopeVisNG::TriggerData triggerData; + m_scopeVis->getTriggerData(triggerData, value); + + qDebug() << "GLScopeNGGUI::on_trig_valueChanged:" + << " m_projectionType: " << (int) triggerData.m_projectionType + << " m_triggerRepeat" << triggerData.m_triggerRepeat + << " m_triggerPositiveEdge" << triggerData.m_triggerPositiveEdge + << " m_triggerBothEdges" << triggerData.m_triggerBothEdges + << " m_triggerLevel" << triggerData.m_triggerLevel; + + setTriggerUI(triggerData); } void GLScopeNGGUI::on_trigAdd_clicked(bool checked) @@ -275,7 +287,7 @@ void GLScopeNGGUI::on_trigAdd_clicked(bool checked) void GLScopeNGGUI::on_trigDel_clicked(bool checked) { - if (ui->trig->maximum() > 0) + if (ui->trig->value() > 0) { m_scopeVis->removeTrigger(ui->trig->value()); ui->trig->setMaximum(ui->trig->maximum() - 1); @@ -320,10 +332,8 @@ void GLScopeNGGUI::on_trigMode_currentIndexChanged(int index) void GLScopeNGGUI::on_trigCount_valueChanged(int value) { - QString text; - text.sprintf("%02d", value); - ui->trigCountText->setText(text); - changeCurrentTrigger(); + setTrigCountDisplay(); + changeCurrentTrigger(); } void GLScopeNGGUI::on_trigPos_toggled(bool checked) @@ -420,6 +430,13 @@ void GLScopeNGGUI::setTraceIndexDisplay() ui->traceText->setText(tr("%1").arg(ui->trace->value())); } +void GLScopeNGGUI::setTrigCountDisplay() +{ + QString text; + text.sprintf("%02d", ui->trigCount->value()); + ui->trigCountText->setText(text); +} + void GLScopeNGGUI::setTimeScaleDisplay() { m_sampleRate = m_glScope->getSampleRate(); @@ -671,19 +688,80 @@ void GLScopeNGGUI::fillTraceData(ScopeVisNG::TraceData& traceData) void GLScopeNGGUI::fillTriggerData(ScopeVisNG::TriggerData& triggerData) { - triggerData.m_projectionType = (ScopeVisNG::ProjectionType) ui->traceMode->currentIndex(); + triggerData.m_projectionType = (ScopeVisNG::ProjectionType) ui->trigMode->currentIndex(); triggerData.m_inputIndex = 0; triggerData.m_triggerLevel = (ui->trigLevelCoarse->value() / 100.0) + (ui->trigLevelFine->value() / 20000.0); + triggerData.m_triggerLevelCoarse = ui->trigLevelCoarse->value(); + triggerData.m_triggerLevelFine = ui->trigLevelFine->value(); triggerData.m_triggerPositiveEdge = ui->trigPos->isChecked(); triggerData.m_triggerBothEdges = ui->trigBoth->isChecked(); triggerData.m_triggerRepeat = ui->trigCount->value(); - double delayMult = ui->trigDelayCoarse->value() + ui->trigDelayFine->value() / 100.0; - triggerData.m_triggerDelay = (int) (m_traceLenMult * ScopeVisNG::m_traceChunkSize * delayMult); + triggerData.m_triggerDelayMult = ui->trigDelayCoarse->value() + ui->trigDelayFine->value() / 100.0; + triggerData.m_triggerDelay = (int) (m_traceLenMult * ScopeVisNG::m_traceChunkSize * triggerData.m_triggerDelayMult); + triggerData.m_triggerDelayCoarse = ui->trigDelayCoarse->value(); + triggerData.m_triggerDelayFine = ui->trigDelayFine->value(); } void GLScopeNGGUI::setTriggerUI(ScopeVisNG::TriggerData& triggerData) { + bool oldStateTrigMode = ui->trigMode->blockSignals(true); + bool oldStateTrigCount = ui->trigCount->blockSignals(true); + bool oldStateTrigPos = ui->trigPos->blockSignals(true); + bool oldStateTrigNeg = ui->trigNeg->blockSignals(true); + bool oldStateTrigBoth = ui->trigBoth->blockSignals(true); + bool oldStateTrigLevelCoarse = ui->trigLevelCoarse->blockSignals(true); + bool oldStateTrigLevelFine = ui->trigLevelFine->blockSignals(true); + bool oldStateTrigDelayCoarse = ui->trigDelayCoarse->blockSignals(true); + bool oldStateTrigDelayFine = ui->trigDelayFine->blockSignals(true); + ui->trigMode->setCurrentIndex((int) triggerData.m_projectionType); + ui->trigCount->setValue(triggerData.m_triggerRepeat); + setTrigCountDisplay(); + + ui->trigPos->setChecked(false); + ui->trigNeg->setChecked(false); + ui->trigPos->doToggle(false); + ui->trigNeg->doToggle(false); + + if (triggerData.m_triggerBothEdges) + { + ui->trigBoth->setChecked(true); + ui->trigBoth->doToggle(true); + } + else + { + ui->trigBoth->setChecked(false); + ui->trigBoth->doToggle(false); + + if (triggerData.m_triggerPositiveEdge) + { + ui->trigPos->setChecked(true); + ui->trigPos->doToggle(true); + } + else + { + ui->trigNeg->setChecked(true); + ui->trigNeg->doToggle(true); + } + } + + ui->trigLevelCoarse->setValue(triggerData.m_triggerLevelCoarse); + ui->trigLevelFine->setValue(triggerData.m_triggerLevelFine); + setTrigLevelDisplay(); + + ui->trigDelayCoarse->setValue(triggerData.m_triggerDelayCoarse); + ui->trigDelayFine->setValue(triggerData.m_triggerDelayFine); + setTrigDelayDisplay(); + + ui->trigMode->blockSignals(oldStateTrigMode); + ui->trigCount->blockSignals(oldStateTrigCount); + ui->trigPos->blockSignals(oldStateTrigPos); + ui->trigNeg->blockSignals(oldStateTrigNeg); + ui->trigBoth->blockSignals(oldStateTrigBoth); + ui->trigLevelCoarse->blockSignals(oldStateTrigLevelCoarse); + ui->trigLevelFine->blockSignals(oldStateTrigLevelFine); + ui->trigDelayCoarse->blockSignals(oldStateTrigDelayCoarse); + ui->trigDelayFine->blockSignals(oldStateTrigDelayFine); } void GLScopeNGGUI::applySettings() diff --git a/sdrbase/gui/glscopenggui.h b/sdrbase/gui/glscopenggui.h index 57269c613..1a027fd26 100644 --- a/sdrbase/gui/glscopenggui.h +++ b/sdrbase/gui/glscopenggui.h @@ -74,6 +74,7 @@ private: void setAmpOfsDisplay(); // Third row void setTrigIndexDisplay(); + void setTrigCountDisplay(); void setTrigLevelDisplay(); void setTrigDelayDisplay(); void setTrigPreDisplay();