From f2fe5753b1a599f82af137b1e26dd4253849c6f3 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 6 Nov 2017 23:57:59 +0100 Subject: [PATCH] ATV demod: GUI and demod separation (2) --- plugins/channelrx/demodatv/atvdemod.cpp | 56 ++++++++++++++++++---- plugins/channelrx/demodatv/atvdemod.h | 27 +++++++++++ plugins/channelrx/demodatv/atvdemodgui.cpp | 41 +++++++--------- plugins/channelrx/demodatv/atvdemodgui.h | 5 -- 4 files changed, 91 insertions(+), 38 deletions(-) diff --git a/plugins/channelrx/demodatv/atvdemod.cpp b/plugins/channelrx/demodatv/atvdemod.cpp index 9625a9dbf..ff84988a9 100644 --- a/plugins/channelrx/demodatv/atvdemod.cpp +++ b/plugins/channelrx/demodatv/atvdemod.cpp @@ -15,26 +15,31 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include "atvdemod.h" - #include #include #include #include + #include "audio/audiooutput.h" #include "dsp/dspengine.h" #include "dsp/pidcontroller.h" +#include "dsp/downchannelizer.h" +#include "dsp/threadedbasebandsamplesink.h" +#include "device/devicesourceapi.h" + +#include "atvdemod.h" MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureATVDemod, Message) MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureRFATVDemod, Message) MESSAGE_CLASS_DEFINITION(ATVDemod::MsgReportEffectiveSampleRate, Message) +MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureChannelizer, Message) MESSAGE_CLASS_DEFINITION(ATVDemod::MsgReportChannelSampleRateChanged, Message) const int ATVDemod::m_ssbFftLen = 1024; ATVDemod::ATVDemod(DeviceSourceAPI *deviceAPI) : m_deviceAPI(deviceAPI), - m_registeredATVScreen(NULL), + m_registeredATVScreen(0), m_intNumberSamplePerTop(0), m_intImageIndex(0), m_intSynchroPoints(0), @@ -80,11 +85,20 @@ ATVDemod::ATVDemod(DeviceSourceAPI *deviceAPI) : m_objPhaseDiscri.setFMScaling(1.0f); + m_channelizer = new DownChannelizer(this); + m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this); + m_deviceAPI->addThreadedSink(m_threadedChannelizer); + + connect(m_channelizer, SIGNAL(inputSampleRateChanged()), this, SLOT(channelSampleRateChanged())); + applyStandard(); } ATVDemod::~ATVDemod() { + m_deviceAPI->removeThreadedSink(m_threadedChannelizer); + delete m_threadedChannelizer; + delete m_channelizer; } void ATVDemod::setATVScreen(ATVScreen *objScreen) @@ -450,6 +464,19 @@ bool ATVDemod::handleMessage(const Message& cmd) return true; } + else if (MsgConfigureChannelizer::match(cmd)) + { + MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + + m_channelizer->configure(m_channelizer->getInputMessageQueue(), + m_channelizer->getInputSampleRate(), + cfg.getCenterFrequency()); + + qDebug() << "ATVDemod::handleMessage: MsgConfigureChannelizer: sampleRate: " << m_channelizer->getInputSampleRate() + << " centerFrequency: " << cfg.getCenterFrequency(); + + return true; + } else if (MsgConfigureATVDemod::match(cmd)) { MsgConfigureATVDemod& objCfg = (MsgConfigureATVDemod&) cmd; @@ -575,10 +602,13 @@ void ATVDemod::applySettings() m_configPrivate.m_intNumberSamplePerLine = (int) (m_config.m_fltLineDuration * m_config.m_intSampleRate); m_intNumberSamplePerTop = (int) (m_config.m_fltTopDuration * m_config.m_intSampleRate); - m_registeredATVScreen->setRenderImmediate(!(m_config.m_fltFramePerS > 25.0f)); - m_registeredATVScreen->resizeATVScreen( - m_configPrivate.m_intNumberSamplePerLine - m_intNumberSamplePerLineSignals, - m_intNumberOfLines - m_intNumberOfBlackLines); + if (m_registeredATVScreen) + { + m_registeredATVScreen->setRenderImmediate(!(m_config.m_fltFramePerS > 25.0f)); + m_registeredATVScreen->resizeATVScreen( + m_configPrivate.m_intNumberSamplePerLine - m_intNumberSamplePerLineSignals, + m_intNumberOfLines - m_intNumberOfBlackLines); + } qDebug() << "ATVDemod::applySettings:" << " m_fltLineDuration: " << m_config.m_fltLineDuration @@ -632,7 +662,7 @@ void ATVDemod::applySettings() m_rfRunning = m_rfConfig; m_runningPrivate = m_configPrivate; - if (forwardSampleRateChange) + if (forwardSampleRateChange && getMessageQueueToGUI()) { int sampleRate = m_rfRunning.m_blndecimatorEnable ? m_runningPrivate.m_intTVSampleRate : m_running.m_intSampleRate; MsgReportEffectiveSampleRate *report; @@ -732,3 +762,13 @@ float ATVDemod::getRFBandwidthDivisor(ATVModulation modulation) } } +void ATVDemod::channelSampleRateChanged() +{ + qDebug("ATVDemod::channelSampleRateChanged"); + if (getMessageQueueToGUI()) + { + MsgReportChannelSampleRateChanged *msg = MsgReportChannelSampleRateChanged::create(m_channelizer->getInputSampleRate()); + getMessageQueueToGUI()->push(msg); + } +} + diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h index 3c5f87d4b..c2e1d286a 100644 --- a/plugins/channelrx/demodatv/atvdemod.h +++ b/plugins/channelrx/demodatv/atvdemod.h @@ -39,6 +39,8 @@ #include "atvscreen.h" class DeviceSourceAPI; +class ThreadedBasebandSampleSink; +class DownChannelizer; class ATVDemod : public BasebandSampleSink { @@ -123,6 +125,26 @@ public: } }; + class MsgConfigureChannelizer : public Message { + MESSAGE_CLASS_DECLARATION + + public: + int getCenterFrequency() const { return m_centerFrequency; } + + static MsgConfigureChannelizer* create(int centerFrequency) + { + return new MsgConfigureChannelizer(centerFrequency); + } + + private: + int m_centerFrequency; + + MsgConfigureChannelizer(int centerFrequency) : + Message(), + m_centerFrequency(centerFrequency) + { } + }; + class MsgReportEffectiveSampleRate : public Message { MESSAGE_CLASS_DECLARATION @@ -205,6 +227,9 @@ public: double getMagSq() const { return m_objMagSqAverage.average(); } //!< Beware this is scaled to 2^30 bool getBFOLocked(); +private slots: + void channelSampleRateChanged(); + private: struct ATVConfigPrivate { @@ -362,6 +387,8 @@ private: }; DeviceSourceAPI* m_deviceAPI; + ThreadedBasebandSampleSink* m_threadedChannelizer; + DownChannelizer* m_channelizer; //*************** SCOPE *************** diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index 6e5fb15e1..83cc9b83c 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -219,6 +219,18 @@ bool ATVDemodGUI::handleMessage(const Message& objMessage) return true; } + else if (ATVDemod::MsgReportChannelSampleRateChanged::match(objMessage)) + { + ATVDemod::MsgReportChannelSampleRateChanged report = (ATVDemod::MsgReportChannelSampleRateChanged&) objMessage; + m_inputSampleRate = report.getSampleRate(); + + qDebug("ATVDemodGUI::handleMessage: MsgReportChannelSampleRateChanged: %d", m_inputSampleRate); + + applySettings(); + applyRFSettings(); + + return true; + } else { return false; @@ -232,14 +244,6 @@ void ATVDemodGUI::viewChanged() applyRFSettings(); } -void ATVDemodGUI::channelSampleRateChanged() -{ - qDebug("ATVDemodGUI::channelSampleRateChanged"); - m_inputSampleRate = m_channelizer->getInputSampleRate(); - applySettings(); - applyRFSettings(); -} - void ATVDemodGUI::handleSourceMessages() { Message* message; @@ -288,14 +292,10 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, m_scopeVis = new ScopeVisNG(ui->glScope); m_atvDemod = new ATVDemod(m_deviceUISet->m_deviceSourceAPI); - m_atvDemod->setScopeSink(m_scopeVis); m_atvDemod->setMessageQueueToGUI(getInputMessageQueue()); + m_atvDemod->setScopeSink(m_scopeVis); m_atvDemod->setATVScreen(ui->screenTV); - m_channelizer = new DownChannelizer(m_atvDemod); - m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this); - m_deviceUISet->m_deviceSourceAPI->addThreadedSink(m_threadedChannelizer); - ui->glScope->connectTimer(MainWindow::getInstance()->getMasterTimer()); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms @@ -303,9 +303,6 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); - connect(m_channelizer, SIGNAL(inputSampleRateChanged()), this, SLOT(channelSampleRateChanged())); - - //m_objPluginAPI->addThreadedSink(m_objThreadedChannelizer); m_channelMarker.setColor(Qt::white); m_channelMarker.setMovable(false); m_channelMarker.setBandwidth(6000000); @@ -319,8 +316,6 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, m_deviceUISet->addChannelMarker(&m_channelMarker); m_deviceUISet->addRollupWidget(this); - //ui->screenTV->connectTimer(m_objPluginAPI->getMainWindow()->getMasterTimer()); - m_objMagSqAverage.resize(4, 1.0); ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope); @@ -351,9 +346,6 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, ATVDemodGUI::~ATVDemodGUI() { m_deviceUISet->removeRxChannelInstance(this); - m_deviceUISet->m_deviceSourceAPI->removeThreadedSink(m_threadedChannelizer); - delete m_threadedChannelizer; - delete m_channelizer; delete m_atvDemod; delete m_scopeVis; delete ui; @@ -370,9 +362,9 @@ void ATVDemodGUI::applySettings() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); - m_channelizer->configure(m_channelizer->getInputMessageQueue(), - m_channelizer->getInputSampleRate(), // always use maximum available bandwidth + ATVDemod::MsgConfigureChannelizer *msgChan = ATVDemod::MsgConfigureChannelizer::create( m_channelMarker.getCenterFrequency()); + m_atvDemod->getInputMessageQueue()->push(msgChan); m_atvDemod->configure(m_atvDemod->getInputMessageQueue(), getNominalLineTime(ui->nbLines->currentIndex(), ui->fps->currentIndex()) + ui->lineTime->value() * m_fltLineTimeMultiplier, @@ -389,7 +381,7 @@ void ATVDemodGUI::applySettings() ui->screenTabWidget->currentIndex()); qDebug() << "ATVDemodGUI::applySettings:" - << " m_objChannelizer.inputSampleRate: " << m_channelizer->getInputSampleRate() + << " m_objChannelizer.inputSampleRate: " << m_inputSampleRate << " m_objATVDemod.sampleRate: " << m_atvDemod->getSampleRate(); } } @@ -431,7 +423,6 @@ void ATVDemodGUI::setChannelMarkerBandwidth() if (ui->decimatorEnable->isChecked()) { m_channelMarker.setBandwidth(ui->rfBW->value()*m_rfSliderDivisor); } else { -// m_channelMarker.setBandwidth(m_channelizer->getInputSampleRate()); m_channelMarker.setBandwidth(m_inputSampleRate); } diff --git a/plugins/channelrx/demodatv/atvdemodgui.h b/plugins/channelrx/demodatv/atvdemodgui.h index 5ac322d9f..0fdbdeb7a 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.h +++ b/plugins/channelrx/demodatv/atvdemodgui.h @@ -27,8 +27,6 @@ class PluginAPI; class DeviceUISet; -class ThreadedBasebandSampleSink; -class DownChannelizer; class ATVDemod; class ScopeVisNG; @@ -60,7 +58,6 @@ public: private slots: void viewChanged(); - void channelSampleRateChanged(); void handleSourceMessages(); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDoubleClicked(); @@ -92,8 +89,6 @@ private: PluginAPI* m_pluginAPI; DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; - ThreadedBasebandSampleSink* m_threadedChannelizer; - DownChannelizer* m_channelizer; ATVDemod* m_atvDemod; bool m_blnBasicSettingsShown;