diff --git a/plugins/channelrx/chanalyzer/chanalyzergui.cpp b/plugins/channelrx/chanalyzer/chanalyzergui.cpp
index 424295cf8..107f8e1ee 100644
--- a/plugins/channelrx/chanalyzer/chanalyzergui.cpp
+++ b/plugins/channelrx/chanalyzer/chanalyzergui.cpp
@@ -1,499 +1,499 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2015 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include "chanalyzergui.h"
-
-#include
-#include "device/deviceuiset.h"
-#include
-#include
-#include
-
-#include "dsp/threadedbasebandsamplesink.h"
-#include "ui_chanalyzergui.h"
-#include "dsp/spectrumscopecombovis.h"
-#include "dsp/spectrumvis.h"
-#include "dsp/scopevis.h"
-#include "gui/glspectrum.h"
-#include "gui/glscope.h"
-#include "plugin/pluginapi.h"
-#include "util/simpleserializer.h"
-#include "util/db.h"
-#include "gui/basicchannelsettingswidget.h"
-#include "dsp/dspengine.h"
-#include "mainwindow.h"
-
-#include "chanalyzer.h"
-
-const QString ChannelAnalyzerGUI::m_channelID = "org.f4exb.sdrangelove.channel.chanalyzer";
-
-ChannelAnalyzerGUI* ChannelAnalyzerGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet)
-{
- ChannelAnalyzerGUI* gui = new ChannelAnalyzerGUI(pluginAPI, deviceUISet);
- return gui;
-}
-
-void ChannelAnalyzerGUI::destroy()
-{
- delete this;
-}
-
-void ChannelAnalyzerGUI::setName(const QString& name)
-{
- setObjectName(name);
-}
-
-QString ChannelAnalyzerGUI::getName() const
-{
- return objectName();
-}
-
-qint64 ChannelAnalyzerGUI::getCenterFrequency() const
-{
- return m_channelMarker.getCenterFrequency();
-}
-
-void ChannelAnalyzerGUI::setCenterFrequency(qint64 centerFrequency)
-{
- m_channelMarker.setCenterFrequency(centerFrequency);
- applySettings();
-}
-
-void ChannelAnalyzerGUI::resetToDefaults()
-{
- blockApplySettings(true);
-
- ui->BW->setValue(30);
- ui->deltaFrequency->setValue(0);
- ui->spanLog2->setValue(3);
-
- blockApplySettings(false);
- applySettings();
-}
-
-QByteArray ChannelAnalyzerGUI::serialize() const
-{
- SimpleSerializer s(1);
- s.writeS32(1, m_channelMarker.getCenterFrequency());
- s.writeS32(2, ui->BW->value());
- s.writeBlob(3, ui->spectrumGUI->serialize());
- s.writeU32(4, m_channelMarker.getColor().rgb());
- s.writeS32(5, ui->lowCut->value());
- s.writeS32(6, ui->spanLog2->value());
- s.writeBool(7, ui->ssb->isChecked());
- s.writeBlob(8, ui->scopeGUI->serialize());
- return s.final();
-}
-
-bool ChannelAnalyzerGUI::deserialize(const QByteArray& data)
-{
- SimpleDeserializer d(data);
-
- if(!d.isValid())
- {
- resetToDefaults();
- return false;
- }
-
- if(d.getVersion() == 1)
- {
- QByteArray bytetmp;
- quint32 u32tmp;
- qint32 tmp, bw, lowCut;
- bool tmpBool;
-
- blockApplySettings(true);
- m_channelMarker.blockSignals(true);
-
- d.readS32(1, &tmp, 0);
- m_channelMarker.setCenterFrequency(tmp);
- d.readS32(2, &bw, 30);
- ui->BW->setValue(bw);
- d.readBlob(3, &bytetmp);
- ui->spectrumGUI->deserialize(bytetmp);
-
- if(d.readU32(4, &u32tmp))
- {
- m_channelMarker.setColor(u32tmp);
- }
-
- d.readS32(5, &lowCut, 3);
- ui->lowCut->setValue(lowCut);
- d.readS32(6, &tmp, 20);
- ui->spanLog2->setValue(tmp);
- setNewRate(tmp);
- d.readBool(7, &tmpBool, false);
- ui->ssb->setChecked(tmpBool);
- d.readBlob(8, &bytetmp);
- ui->scopeGUI->deserialize(bytetmp);
-
- blockApplySettings(false);
- m_channelMarker.blockSignals(false);
-
- ui->BW->setValue(bw);
- ui->lowCut->setValue(lowCut); // does applySettings();
-
- return true;
- }
- else
- {
- resetToDefaults();
- return false;
- }
-}
-
-bool ChannelAnalyzerGUI::handleMessage(const Message& message)
-{
- if (ChannelAnalyzer::MsgReportChannelSampleRateChanged::match(message))
- {
- setNewRate(m_spanLog2);
- return true;
- }
-
- return false;
-}
-
-void ChannelAnalyzerGUI::handleInputMessages()
-{
- Message* message;
-
- while ((message = getInputMessageQueue()->pop()) != 0)
- {
- qDebug("ChannelAnalyzerGUI::handleInputMessages: message: %s", message->getIdentifier());
-
- if (handleMessage(*message))
- {
- delete message;
- }
- }
-}
-
-void ChannelAnalyzerGUI::viewChanged()
-{
- applySettings();
-}
-
-void ChannelAnalyzerGUI::tick()
-{
- Real powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
- m_channelPowerDbAvg.feed(powDb);
- ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1));
-}
-
-void ChannelAnalyzerGUI::on_deltaMinus_toggled(bool minus)
-{
- int deltaFrequency = m_channelMarker.getCenterFrequency();
- bool minusDelta = (deltaFrequency < 0);
-
- if (minus ^ minusDelta) // sign change
- {
- m_channelMarker.setCenterFrequency(-deltaFrequency);
- }
-}
-
-void ChannelAnalyzerGUI::on_deltaFrequency_changed(quint64 value)
-{
- if (ui->deltaMinus->isChecked()) {
- m_channelMarker.setCenterFrequency(-value);
- } else {
- m_channelMarker.setCenterFrequency(value);
- }
-}
-
-void ChannelAnalyzerGUI::on_BW_valueChanged(int value)
-{
- QString s = QString::number(value/10.0, 'f', 1);
- ui->BWText->setText(tr("%1k").arg(s));
- m_channelMarker.setBandwidth(value * 100 * 2);
-
- if (ui->ssb->isChecked())
- {
- if (value < 0) {
- m_channelMarker.setSidebands(ChannelMarker::lsb);
- } else {
- m_channelMarker.setSidebands(ChannelMarker::usb);
- }
- }
- else
- {
- m_channelMarker.setSidebands(ChannelMarker::dsb);
- }
-
- on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
-}
-
-int ChannelAnalyzerGUI::getEffectiveLowCutoff(int lowCutoff)
-{
- int ssbBW = m_channelMarker.getBandwidth() / 2;
- int effectiveLowCutoff = lowCutoff;
- const int guard = 100;
-
- if (ssbBW < 0) {
- if (effectiveLowCutoff < ssbBW + guard) {
- effectiveLowCutoff = ssbBW + guard;
- }
- if (effectiveLowCutoff > 0) {
- effectiveLowCutoff = 0;
- }
- } else {
- if (effectiveLowCutoff > ssbBW - guard) {
- effectiveLowCutoff = ssbBW - guard;
- }
- if (effectiveLowCutoff < 0) {
- effectiveLowCutoff = 0;
- }
- }
-
- return effectiveLowCutoff;
-}
-
-void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value)
-{
- int lowCutoff = getEffectiveLowCutoff(value * 100);
- m_channelMarker.setLowCutoff(lowCutoff);
- QString s = QString::number(lowCutoff/1000.0, 'f', 1);
- ui->lowCutText->setText(tr("%1k").arg(s));
- ui->lowCut->setValue(lowCutoff/100);
- applySettings();
-}
-
-void ChannelAnalyzerGUI::on_spanLog2_valueChanged(int value)
-{
- if (setNewRate(value)) {
- applySettings();
- }
-
-}
-
-void ChannelAnalyzerGUI::on_ssb_toggled(bool checked)
-{
- if (checked)
- {
- if (ui->BW->value() < 0) {
- m_channelMarker.setSidebands(ChannelMarker::lsb);
- } else {
- m_channelMarker.setSidebands(ChannelMarker::usb);
- }
-
- ui->glSpectrum->setCenterFrequency(m_rate/4);
- ui->glSpectrum->setSampleRate(m_rate/2);
- ui->glSpectrum->setSsbSpectrum(true);
-
- on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
- }
- else
- {
- m_channelMarker.setSidebands(ChannelMarker::dsb);
-
- ui->glSpectrum->setCenterFrequency(0);
- ui->glSpectrum->setSampleRate(m_rate);
- ui->glSpectrum->setSsbSpectrum(false);
-
- applySettings();
- }
-}
-
-void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget __attribute__((unused)), bool rollDown __attribute__((unused)))
-{
- /*
- if((widget == ui->spectrumContainer) && (m_ssbDemod != NULL))
- m_ssbDemod->setSpectrum(m_threadedSampleSink->getMessageQueue(), rollDown);
- */
-}
-
-void ChannelAnalyzerGUI::onMenuDoubleClicked()
-{
- if(!m_basicSettingsShown) {
- m_basicSettingsShown = true;
- BasicChannelSettingsWidget* bcsw = new BasicChannelSettingsWidget(&m_channelMarker, this);
- bcsw->show();
- }
-}
-
-ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) :
- RollupWidget(parent),
- ui(new Ui::ChannelAnalyzerGUI),
- m_pluginAPI(pluginAPI),
-// m_deviceAPI(deviceAPI),
- m_deviceUISet(deviceUISet),
- m_channelMarker(this),
- m_basicSettingsShown(false),
- m_doApplySettings(true),
- m_rate(6000),
- m_spanLog2(3),
- m_channelPowerDbAvg(40,0)
-{
- ui->setupUi(this);
- setAttribute(Qt::WA_DeleteOnClose, true);
- connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
- connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked()));
-
- m_spectrumVis = new SpectrumVis(ui->glSpectrum);
- m_scopeVis = new ScopeVis(ui->glScope);
- m_spectrumScopeComboVis = new SpectrumScopeComboVis(m_spectrumVis, m_scopeVis);
- m_channelAnalyzer = new ChannelAnalyzer(m_deviceUISet->m_deviceSourceAPI);
- m_channelAnalyzer->setSampleSink(m_spectrumScopeComboVis);
- m_channelAnalyzer->setMessageQueueToGUI(getInputMessageQueue());
-
- ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold));
- ui->deltaFrequency->setValueRange(7, 0U, 9999999U);
-
- ui->glSpectrum->setCenterFrequency(m_rate/2);
- ui->glSpectrum->setSampleRate(m_rate);
- ui->glSpectrum->setDisplayWaterfall(true);
- ui->glSpectrum->setDisplayMaxHold(true);
- ui->glSpectrum->setSsbSpectrum(true);
-
- ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
- ui->glScope->connectTimer(MainWindow::getInstance()->getMasterTimer());
- connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
-
- //m_channelMarker = new ChannelMarker(this);
- m_channelMarker.setColor(Qt::gray);
- m_channelMarker.setBandwidth(m_rate);
- m_channelMarker.setSidebands(ChannelMarker::usb);
- m_channelMarker.setCenterFrequency(0);
- m_channelMarker.setVisible(true);
-
- connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));
-
- m_deviceUISet->registerChannelInstance(m_channelID, this);
- m_deviceUISet->addChannelMarker(&m_channelMarker);
- m_deviceUISet->addRollupWidget(this);
-
- ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
- ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope);
-
- connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
-
- applySettings();
- setNewRate(m_spanLog2);
-}
-
-ChannelAnalyzerGUI::~ChannelAnalyzerGUI()
-{
- m_deviceUISet->removeChannelInstance(this);
- delete m_channelAnalyzer;
- delete m_spectrumVis;
- delete m_scopeVis;
- delete m_spectrumScopeComboVis;
- //delete m_channelMarker;
- delete ui;
-}
-
-bool ChannelAnalyzerGUI::setNewRate(int spanLog2)
-{
- qDebug("ChannelAnalyzerGUI::setNewRate");
-
- if ((spanLog2 < 0) || (spanLog2 > 6)) {
- return false;
- }
-
- m_spanLog2 = spanLog2;
- //m_rate = 48000 / (1<getSampleRate() / (1<BW->value() < -m_rate/200) {
- ui->BW->setValue(-m_rate/200);
- m_channelMarker.setBandwidth(-m_rate*2);
- } else if (ui->BW->value() > m_rate/200) {
- ui->BW->setValue(m_rate/200);
- m_channelMarker.setBandwidth(m_rate*2);
- }
-
- if (ui->lowCut->value() < -m_rate/200) {
- ui->lowCut->setValue(-m_rate/200);
- m_channelMarker.setLowCutoff(-m_rate);
- } else if (ui->lowCut->value() > m_rate/200) {
- ui->lowCut->setValue(m_rate/200);
- m_channelMarker.setLowCutoff(m_rate);
- }
-
- ui->BW->setMinimum(-m_rate/200);
- ui->lowCut->setMinimum(-m_rate/200);
- ui->BW->setMaximum(m_rate/200);
- ui->lowCut->setMaximum(m_rate/200);
-
- QString s = QString::number(m_rate/1000.0, 'f', 1);
- ui->spanText->setText(tr("%1k").arg(s));
-
- if (ui->ssb->isChecked())
- {
- if (ui->BW->value() < 0) {
- m_channelMarker.setSidebands(ChannelMarker::lsb);
- } else {
- m_channelMarker.setSidebands(ChannelMarker::usb);
- }
-
- ui->glSpectrum->setCenterFrequency(m_rate/4);
- ui->glSpectrum->setSampleRate(m_rate/2);
- ui->glSpectrum->setSsbSpectrum(true);
- }
- else
- {
- m_channelMarker.setSidebands(ChannelMarker::dsb);
-
- ui->glSpectrum->setCenterFrequency(0);
- ui->glSpectrum->setSampleRate(m_rate);
- ui->glSpectrum->setSsbSpectrum(false);
- }
-
- ui->glScope->setSampleRate(m_rate);
- m_scopeVis->setSampleRate(m_rate);
-
- return true;
-}
-
-void ChannelAnalyzerGUI::blockApplySettings(bool block)
-{
- ui->glScope->blockSignals(block);
- ui->glSpectrum->blockSignals(block);
- m_doApplySettings = !block;
-}
-
-void ChannelAnalyzerGUI::applySettings()
-{
- if (m_doApplySettings)
- {
- setTitleColor(m_channelMarker.getColor());
- ui->deltaFrequency->setValue(abs(m_channelMarker.getCenterFrequency()));
- ui->deltaMinus->setChecked(m_channelMarker.getCenterFrequency() < 0);
-
- ChannelAnalyzer::MsgConfigureChannelizer *msg = ChannelAnalyzer::MsgConfigureChannelizer::create(m_channelMarker.getCenterFrequency());
- m_channelAnalyzer->getInputMessageQueue()->push(msg);
-
- m_channelAnalyzer->configure(m_channelAnalyzer->getInputMessageQueue(),
- ui->BW->value() * 100.0,
- ui->lowCut->value() * 100.0,
- m_spanLog2,
- ui->ssb->isChecked());
- }
-}
-
-void ChannelAnalyzerGUI::leaveEvent(QEvent*)
-{
- blockApplySettings(true);
- m_channelMarker.setHighlighted(false);
- blockApplySettings(false);
-}
-
-void ChannelAnalyzerGUI::enterEvent(QEvent*)
-{
- blockApplySettings(true);
- m_channelMarker.setHighlighted(true);
- blockApplySettings(false);
-}
-
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2015 Edouard Griffiths, F4EXB //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#include "chanalyzergui.h"
+
+#include
+#include "device/deviceuiset.h"
+#include
+#include
+#include
+
+#include "dsp/threadedbasebandsamplesink.h"
+#include "ui_chanalyzergui.h"
+#include "dsp/spectrumscopecombovis.h"
+#include "dsp/spectrumvis.h"
+#include "dsp/scopevis.h"
+#include "gui/glspectrum.h"
+#include "gui/glscope.h"
+#include "plugin/pluginapi.h"
+#include "util/simpleserializer.h"
+#include "util/db.h"
+#include "gui/basicchannelsettingswidget.h"
+#include "dsp/dspengine.h"
+#include "mainwindow.h"
+
+#include "chanalyzer.h"
+
+const QString ChannelAnalyzerGUI::m_channelID = "org.f4exb.sdrangelove.channel.chanalyzer";
+
+ChannelAnalyzerGUI* ChannelAnalyzerGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet)
+{
+ ChannelAnalyzerGUI* gui = new ChannelAnalyzerGUI(pluginAPI, deviceUISet);
+ return gui;
+}
+
+void ChannelAnalyzerGUI::destroy()
+{
+ delete this;
+}
+
+void ChannelAnalyzerGUI::setName(const QString& name)
+{
+ setObjectName(name);
+}
+
+QString ChannelAnalyzerGUI::getName() const
+{
+ return objectName();
+}
+
+qint64 ChannelAnalyzerGUI::getCenterFrequency() const
+{
+ return m_channelMarker.getCenterFrequency();
+}
+
+void ChannelAnalyzerGUI::setCenterFrequency(qint64 centerFrequency)
+{
+ m_channelMarker.setCenterFrequency(centerFrequency);
+ applySettings();
+}
+
+void ChannelAnalyzerGUI::resetToDefaults()
+{
+ blockApplySettings(true);
+
+ ui->BW->setValue(30);
+ ui->deltaFrequency->setValue(0);
+ ui->spanLog2->setValue(3);
+
+ blockApplySettings(false);
+ applySettings();
+}
+
+QByteArray ChannelAnalyzerGUI::serialize() const
+{
+ SimpleSerializer s(1);
+ s.writeS32(1, m_channelMarker.getCenterFrequency());
+ s.writeS32(2, ui->BW->value());
+ s.writeBlob(3, ui->spectrumGUI->serialize());
+ s.writeU32(4, m_channelMarker.getColor().rgb());
+ s.writeS32(5, ui->lowCut->value());
+ s.writeS32(6, ui->spanLog2->value());
+ s.writeBool(7, ui->ssb->isChecked());
+ s.writeBlob(8, ui->scopeGUI->serialize());
+ return s.final();
+}
+
+bool ChannelAnalyzerGUI::deserialize(const QByteArray& data)
+{
+ SimpleDeserializer d(data);
+
+ if(!d.isValid())
+ {
+ resetToDefaults();
+ return false;
+ }
+
+ if(d.getVersion() == 1)
+ {
+ QByteArray bytetmp;
+ quint32 u32tmp;
+ qint32 tmp, bw, lowCut;
+ bool tmpBool;
+
+ blockApplySettings(true);
+ m_channelMarker.blockSignals(true);
+
+ d.readS32(1, &tmp, 0);
+ m_channelMarker.setCenterFrequency(tmp);
+ d.readS32(2, &bw, 30);
+ ui->BW->setValue(bw);
+ d.readBlob(3, &bytetmp);
+ ui->spectrumGUI->deserialize(bytetmp);
+
+ if(d.readU32(4, &u32tmp))
+ {
+ m_channelMarker.setColor(u32tmp);
+ }
+
+ d.readS32(5, &lowCut, 3);
+ ui->lowCut->setValue(lowCut);
+ d.readS32(6, &tmp, 20);
+ ui->spanLog2->setValue(tmp);
+ setNewRate(tmp);
+ d.readBool(7, &tmpBool, false);
+ ui->ssb->setChecked(tmpBool);
+ d.readBlob(8, &bytetmp);
+ ui->scopeGUI->deserialize(bytetmp);
+
+ blockApplySettings(false);
+ m_channelMarker.blockSignals(false);
+
+ ui->BW->setValue(bw);
+ ui->lowCut->setValue(lowCut); // does applySettings();
+
+ return true;
+ }
+ else
+ {
+ resetToDefaults();
+ return false;
+ }
+}
+
+bool ChannelAnalyzerGUI::handleMessage(const Message& message)
+{
+ if (ChannelAnalyzer::MsgReportChannelSampleRateChanged::match(message))
+ {
+ setNewRate(m_spanLog2);
+ return true;
+ }
+
+ return false;
+}
+
+void ChannelAnalyzerGUI::handleInputMessages()
+{
+ Message* message;
+
+ while ((message = getInputMessageQueue()->pop()) != 0)
+ {
+ qDebug("ChannelAnalyzerGUI::handleInputMessages: message: %s", message->getIdentifier());
+
+ if (handleMessage(*message))
+ {
+ delete message;
+ }
+ }
+}
+
+void ChannelAnalyzerGUI::viewChanged()
+{
+ applySettings();
+}
+
+void ChannelAnalyzerGUI::tick()
+{
+ Real powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
+ m_channelPowerDbAvg.feed(powDb);
+ ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1));
+}
+
+void ChannelAnalyzerGUI::on_deltaMinus_toggled(bool minus)
+{
+ int deltaFrequency = m_channelMarker.getCenterFrequency();
+ bool minusDelta = (deltaFrequency < 0);
+
+ if (minus ^ minusDelta) // sign change
+ {
+ m_channelMarker.setCenterFrequency(-deltaFrequency);
+ }
+}
+
+void ChannelAnalyzerGUI::on_deltaFrequency_changed(quint64 value)
+{
+ if (ui->deltaMinus->isChecked()) {
+ m_channelMarker.setCenterFrequency(-value);
+ } else {
+ m_channelMarker.setCenterFrequency(value);
+ }
+}
+
+void ChannelAnalyzerGUI::on_BW_valueChanged(int value)
+{
+ QString s = QString::number(value/10.0, 'f', 1);
+ ui->BWText->setText(tr("%1k").arg(s));
+ m_channelMarker.setBandwidth(value * 100 * 2);
+
+ if (ui->ssb->isChecked())
+ {
+ if (value < 0) {
+ m_channelMarker.setSidebands(ChannelMarker::lsb);
+ } else {
+ m_channelMarker.setSidebands(ChannelMarker::usb);
+ }
+ }
+ else
+ {
+ m_channelMarker.setSidebands(ChannelMarker::dsb);
+ }
+
+ on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
+}
+
+int ChannelAnalyzerGUI::getEffectiveLowCutoff(int lowCutoff)
+{
+ int ssbBW = m_channelMarker.getBandwidth() / 2;
+ int effectiveLowCutoff = lowCutoff;
+ const int guard = 100;
+
+ if (ssbBW < 0) {
+ if (effectiveLowCutoff < ssbBW + guard) {
+ effectiveLowCutoff = ssbBW + guard;
+ }
+ if (effectiveLowCutoff > 0) {
+ effectiveLowCutoff = 0;
+ }
+ } else {
+ if (effectiveLowCutoff > ssbBW - guard) {
+ effectiveLowCutoff = ssbBW - guard;
+ }
+ if (effectiveLowCutoff < 0) {
+ effectiveLowCutoff = 0;
+ }
+ }
+
+ return effectiveLowCutoff;
+}
+
+void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value)
+{
+ int lowCutoff = getEffectiveLowCutoff(value * 100);
+ m_channelMarker.setLowCutoff(lowCutoff);
+ QString s = QString::number(lowCutoff/1000.0, 'f', 1);
+ ui->lowCutText->setText(tr("%1k").arg(s));
+ ui->lowCut->setValue(lowCutoff/100);
+ applySettings();
+}
+
+void ChannelAnalyzerGUI::on_spanLog2_valueChanged(int value)
+{
+ if (setNewRate(value)) {
+ applySettings();
+ }
+
+}
+
+void ChannelAnalyzerGUI::on_ssb_toggled(bool checked)
+{
+ if (checked)
+ {
+ if (ui->BW->value() < 0) {
+ m_channelMarker.setSidebands(ChannelMarker::lsb);
+ } else {
+ m_channelMarker.setSidebands(ChannelMarker::usb);
+ }
+
+ ui->glSpectrum->setCenterFrequency(m_rate/4);
+ ui->glSpectrum->setSampleRate(m_rate/2);
+ ui->glSpectrum->setSsbSpectrum(true);
+
+ on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
+ }
+ else
+ {
+ m_channelMarker.setSidebands(ChannelMarker::dsb);
+
+ ui->glSpectrum->setCenterFrequency(0);
+ ui->glSpectrum->setSampleRate(m_rate);
+ ui->glSpectrum->setSsbSpectrum(false);
+
+ applySettings();
+ }
+}
+
+void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget __attribute__((unused)), bool rollDown __attribute__((unused)))
+{
+ /*
+ if((widget == ui->spectrumContainer) && (m_ssbDemod != NULL))
+ m_ssbDemod->setSpectrum(m_threadedSampleSink->getMessageQueue(), rollDown);
+ */
+}
+
+void ChannelAnalyzerGUI::onMenuDoubleClicked()
+{
+ if(!m_basicSettingsShown) {
+ m_basicSettingsShown = true;
+ BasicChannelSettingsWidget* bcsw = new BasicChannelSettingsWidget(&m_channelMarker, this);
+ bcsw->show();
+ }
+}
+
+ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) :
+ RollupWidget(parent),
+ ui(new Ui::ChannelAnalyzerGUI),
+ m_pluginAPI(pluginAPI),
+// m_deviceAPI(deviceAPI),
+ m_deviceUISet(deviceUISet),
+ m_channelMarker(this),
+ m_basicSettingsShown(false),
+ m_doApplySettings(true),
+ m_rate(6000),
+ m_spanLog2(3),
+ m_channelPowerDbAvg(40,0)
+{
+ ui->setupUi(this);
+ setAttribute(Qt::WA_DeleteOnClose, true);
+ connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
+ connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked()));
+
+ m_spectrumVis = new SpectrumVis(ui->glSpectrum);
+ m_scopeVis = new ScopeVis(ui->glScope);
+ m_spectrumScopeComboVis = new SpectrumScopeComboVis(m_spectrumVis, m_scopeVis);
+ m_channelAnalyzer = new ChannelAnalyzer(m_deviceUISet->m_deviceSourceAPI);
+ m_channelAnalyzer->setSampleSink(m_spectrumScopeComboVis);
+ m_channelAnalyzer->setMessageQueueToGUI(getInputMessageQueue());
+
+ ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold));
+ ui->deltaFrequency->setValueRange(7, 0U, 9999999U);
+
+ ui->glSpectrum->setCenterFrequency(m_rate/2);
+ ui->glSpectrum->setSampleRate(m_rate);
+ ui->glSpectrum->setDisplayWaterfall(true);
+ ui->glSpectrum->setDisplayMaxHold(true);
+ ui->glSpectrum->setSsbSpectrum(true);
+
+ ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
+ ui->glScope->connectTimer(MainWindow::getInstance()->getMasterTimer());
+ connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
+
+ //m_channelMarker = new ChannelMarker(this);
+ m_channelMarker.setColor(Qt::gray);
+ m_channelMarker.setBandwidth(m_rate);
+ m_channelMarker.setSidebands(ChannelMarker::usb);
+ m_channelMarker.setCenterFrequency(0);
+ m_channelMarker.setVisible(true);
+
+ connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));
+
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
+ m_deviceUISet->addChannelMarker(&m_channelMarker);
+ m_deviceUISet->addRollupWidget(this);
+
+ ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
+ ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope);
+
+ connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
+
+ applySettings();
+ setNewRate(m_spanLog2);
+}
+
+ChannelAnalyzerGUI::~ChannelAnalyzerGUI()
+{
+ m_deviceUISet->removeRxChannelInstance(this);
+ delete m_channelAnalyzer;
+ delete m_spectrumVis;
+ delete m_scopeVis;
+ delete m_spectrumScopeComboVis;
+ //delete m_channelMarker;
+ delete ui;
+}
+
+bool ChannelAnalyzerGUI::setNewRate(int spanLog2)
+{
+ qDebug("ChannelAnalyzerGUI::setNewRate");
+
+ if ((spanLog2 < 0) || (spanLog2 > 6)) {
+ return false;
+ }
+
+ m_spanLog2 = spanLog2;
+ //m_rate = 48000 / (1<getSampleRate() / (1<BW->value() < -m_rate/200) {
+ ui->BW->setValue(-m_rate/200);
+ m_channelMarker.setBandwidth(-m_rate*2);
+ } else if (ui->BW->value() > m_rate/200) {
+ ui->BW->setValue(m_rate/200);
+ m_channelMarker.setBandwidth(m_rate*2);
+ }
+
+ if (ui->lowCut->value() < -m_rate/200) {
+ ui->lowCut->setValue(-m_rate/200);
+ m_channelMarker.setLowCutoff(-m_rate);
+ } else if (ui->lowCut->value() > m_rate/200) {
+ ui->lowCut->setValue(m_rate/200);
+ m_channelMarker.setLowCutoff(m_rate);
+ }
+
+ ui->BW->setMinimum(-m_rate/200);
+ ui->lowCut->setMinimum(-m_rate/200);
+ ui->BW->setMaximum(m_rate/200);
+ ui->lowCut->setMaximum(m_rate/200);
+
+ QString s = QString::number(m_rate/1000.0, 'f', 1);
+ ui->spanText->setText(tr("%1k").arg(s));
+
+ if (ui->ssb->isChecked())
+ {
+ if (ui->BW->value() < 0) {
+ m_channelMarker.setSidebands(ChannelMarker::lsb);
+ } else {
+ m_channelMarker.setSidebands(ChannelMarker::usb);
+ }
+
+ ui->glSpectrum->setCenterFrequency(m_rate/4);
+ ui->glSpectrum->setSampleRate(m_rate/2);
+ ui->glSpectrum->setSsbSpectrum(true);
+ }
+ else
+ {
+ m_channelMarker.setSidebands(ChannelMarker::dsb);
+
+ ui->glSpectrum->setCenterFrequency(0);
+ ui->glSpectrum->setSampleRate(m_rate);
+ ui->glSpectrum->setSsbSpectrum(false);
+ }
+
+ ui->glScope->setSampleRate(m_rate);
+ m_scopeVis->setSampleRate(m_rate);
+
+ return true;
+}
+
+void ChannelAnalyzerGUI::blockApplySettings(bool block)
+{
+ ui->glScope->blockSignals(block);
+ ui->glSpectrum->blockSignals(block);
+ m_doApplySettings = !block;
+}
+
+void ChannelAnalyzerGUI::applySettings()
+{
+ if (m_doApplySettings)
+ {
+ setTitleColor(m_channelMarker.getColor());
+ ui->deltaFrequency->setValue(abs(m_channelMarker.getCenterFrequency()));
+ ui->deltaMinus->setChecked(m_channelMarker.getCenterFrequency() < 0);
+
+ ChannelAnalyzer::MsgConfigureChannelizer *msg = ChannelAnalyzer::MsgConfigureChannelizer::create(m_channelMarker.getCenterFrequency());
+ m_channelAnalyzer->getInputMessageQueue()->push(msg);
+
+ m_channelAnalyzer->configure(m_channelAnalyzer->getInputMessageQueue(),
+ ui->BW->value() * 100.0,
+ ui->lowCut->value() * 100.0,
+ m_spanLog2,
+ ui->ssb->isChecked());
+ }
+}
+
+void ChannelAnalyzerGUI::leaveEvent(QEvent*)
+{
+ blockApplySettings(true);
+ m_channelMarker.setHighlighted(false);
+ blockApplySettings(false);
+}
+
+void ChannelAnalyzerGUI::enterEvent(QEvent*)
+{
+ blockApplySettings(true);
+ m_channelMarker.setHighlighted(true);
+ blockApplySettings(false);
+}
+
diff --git a/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp b/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp
index 8640ca738..255fec1d1 100644
--- a/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp
+++ b/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp
@@ -1,583 +1,583 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2017 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include "chanalyzernggui.h"
-
-#include
-#include "device/deviceuiset.h"
-#include
-#include
-#include
-
-#include "dsp/threadedbasebandsamplesink.h"
-#include "ui_chanalyzernggui.h"
-#include "dsp/spectrumscopengcombovis.h"
-#include "dsp/spectrumvis.h"
-#include "dsp/scopevis.h"
-#include "gui/glspectrum.h"
-#include "gui/glscopeng.h"
-#include "plugin/pluginapi.h"
-#include "util/simpleserializer.h"
-#include "util/db.h"
-#include "gui/basicchannelsettingswidget.h"
-#include "dsp/dspengine.h"
-#include "mainwindow.h"
-
-#include "chanalyzerng.h"
-
-const QString ChannelAnalyzerNGGUI::m_channelID = "sdrangel.channel.chanalyzerng";
-
-ChannelAnalyzerNGGUI* ChannelAnalyzerNGGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet)
-{
- ChannelAnalyzerNGGUI* gui = new ChannelAnalyzerNGGUI(pluginAPI, deviceUISet);
- return gui;
-}
-
-void ChannelAnalyzerNGGUI::destroy()
-{
- delete this;
-}
-
-void ChannelAnalyzerNGGUI::setName(const QString& name)
-{
- setObjectName(name);
-}
-
-QString ChannelAnalyzerNGGUI::getName() const
-{
- return objectName();
-}
-
-qint64 ChannelAnalyzerNGGUI::getCenterFrequency() const
-{
- return m_channelMarker.getCenterFrequency();
-}
-
-void ChannelAnalyzerNGGUI::setCenterFrequency(qint64 centerFrequency)
-{
- m_channelMarker.setCenterFrequency(centerFrequency);
- applySettings();
-}
-
-void ChannelAnalyzerNGGUI::resetToDefaults()
-{
- blockApplySettings(true);
-
- ui->useRationalDownsampler->setChecked(false);
- ui->BW->setValue(30);
- ui->deltaFrequency->setValue(0);
- ui->spanLog2->setCurrentIndex(3);
-
- blockApplySettings(false);
- applySettings();
-}
-
-QByteArray ChannelAnalyzerNGGUI::serialize() const
-{
- SimpleSerializer s(1);
- s.writeS32(1, m_channelMarker.getCenterFrequency());
- s.writeS32(2, ui->BW->value());
- s.writeBlob(3, ui->spectrumGUI->serialize());
- s.writeU32(4, m_channelMarker.getColor().rgb());
- s.writeS32(5, ui->lowCut->value());
- s.writeS32(6, ui->spanLog2->currentIndex());
- s.writeBool(7, ui->ssb->isChecked());
- s.writeBlob(8, ui->scopeGUI->serialize());
- s.writeU64(9, ui->channelSampleRate->getValueNew());
- return s.final();
-}
-
-bool ChannelAnalyzerNGGUI::deserialize(const QByteArray& data)
-{
- SimpleDeserializer d(data);
-
- if(!d.isValid())
- {
- resetToDefaults();
- return false;
- }
-
- if(d.getVersion() == 1)
- {
- QByteArray bytetmp;
- quint32 u32tmp;
- quint64 u64tmp;
- qint32 tmp, spanLog2, bw, lowCut;
- bool tmpBool;
-
- blockApplySettings(true);
- m_channelMarker.blockSignals(true);
-
- d.readS32(1, &tmp, 0);
- m_channelMarker.setCenterFrequency(tmp);
- d.readS32(2, &bw, 30);
- d.readBlob(3, &bytetmp);
- ui->spectrumGUI->deserialize(bytetmp);
-
- if(d.readU32(4, &u32tmp))
- {
- m_channelMarker.setColor(u32tmp);
- }
-
- d.readS32(5, &lowCut, 3);
- d.readS32(6, &spanLog2, 3);
- d.readBool(7, &tmpBool, false);
- ui->ssb->setChecked(tmpBool);
- d.readBlob(8, &bytetmp);
- ui->scopeGUI->deserialize(bytetmp);
- d.readU64(9, &u64tmp, 2000U);
- ui->channelSampleRate->setValue(u64tmp);
-
- blockApplySettings(false);
- m_channelMarker.blockSignals(false);
-
- ui->spanLog2->setCurrentIndex(spanLog2);
- setNewFinalRate(spanLog2);
- ui->BW->setValue(bw);
- ui->lowCut->setValue(lowCut); // does applySettings();
-
- return true;
- }
- else
- {
- resetToDefaults();
- return false;
- }
-}
-
-bool ChannelAnalyzerNGGUI::handleMessage(const Message& message __attribute__((unused)))
-{
- if (ChannelAnalyzerNG::MsgReportChannelSampleRateChanged::match(message))
- {
- setNewFinalRate(m_spanLog2);
- applySettings();
- return true;
- }
-
- return false;
-}
-
-void ChannelAnalyzerNGGUI::handleInputMessages()
-{
- Message* message;
-
- while ((message = getInputMessageQueue()->pop()) != 0)
- {
- qDebug("ChannelAnalyzerGUI::handleInputMessages: message: %s", message->getIdentifier());
-
- if (handleMessage(*message))
- {
- delete message;
- }
- }
-}
-
-void ChannelAnalyzerNGGUI::viewChanged()
-{
- applySettings();
-}
-
-void ChannelAnalyzerNGGUI::tick()
-{
- double powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
- m_channelPowerDbAvg.feed(powDb);
- ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
-}
-
-//void ChannelAnalyzerNGGUI::channelizerInputSampleRateChanged()
-//{
-// //ui->channelSampleRate->setValueRange(7, 2000U, m_channelAnalyzer->getInputSampleRate());
-// setNewFinalRate(m_spanLog2);
-// applySettings();
-//}
-
-void ChannelAnalyzerNGGUI::on_channelSampleRate_changed(quint64 value)
-{
- ui->channelSampleRate->setValueRange(7, 2000U, m_channelAnalyzer->getInputSampleRate());
-
- if (ui->useRationalDownsampler->isChecked())
- {
- qDebug("ChannelAnalyzerNGGUI::on_channelSampleRate_changed: %llu", value);
- setNewFinalRate(m_spanLog2);
- applySettings();
- }
-}
-
-void ChannelAnalyzerNGGUI::on_useRationalDownsampler_toggled(bool checked __attribute__((unused)))
-{
- setNewFinalRate(m_spanLog2);
- applySettings();
-}
-
-int ChannelAnalyzerNGGUI::getRequestedChannelSampleRate()
-{
- if (ui->useRationalDownsampler->isChecked()) {
- return ui->channelSampleRate->getValueNew();
- } else {
- return m_channelAnalyzer->getChannelizer()->getInputSampleRate();
- }
-}
-
-void ChannelAnalyzerNGGUI::on_deltaFrequency_changed(qint64 value)
-{
- m_channelMarker.setCenterFrequency(value);
-}
-
-void ChannelAnalyzerNGGUI::on_BW_valueChanged(int value)
-{
- m_channelMarker.setBandwidth(value * 100 * 2);
-
- if (ui->ssb->isChecked())
- {
- QString s = QString::number(value/10.0, 'f', 1);
- ui->BWText->setText(tr("%1k").arg(s));
- }
- else
- {
- QString s = QString::number(value/5.0, 'f', 1); // BW = value * 2
- ui->BWText->setText(tr("%1k").arg(s));
- }
-
- displayBandwidth();
- on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
-}
-
-int ChannelAnalyzerNGGUI::getEffectiveLowCutoff(int lowCutoff)
-{
- int ssbBW = m_channelMarker.getBandwidth() / 2;
- int effectiveLowCutoff = lowCutoff;
- const int guard = 100;
-
- if (ssbBW < 0) {
- if (effectiveLowCutoff < ssbBW + guard) {
- effectiveLowCutoff = ssbBW + guard;
- }
- if (effectiveLowCutoff > 0) {
- effectiveLowCutoff = 0;
- }
- } else {
- if (effectiveLowCutoff > ssbBW - guard) {
- effectiveLowCutoff = ssbBW - guard;
- }
- if (effectiveLowCutoff < 0) {
- effectiveLowCutoff = 0;
- }
- }
-
- return effectiveLowCutoff;
-}
-
-void ChannelAnalyzerNGGUI::on_lowCut_valueChanged(int value)
-{
- int lowCutoff = getEffectiveLowCutoff(value * 100);
- m_channelMarker.setLowCutoff(lowCutoff);
- QString s = QString::number(lowCutoff/1000.0, 'f', 1);
- ui->lowCutText->setText(tr("%1k").arg(s));
- ui->lowCut->setValue(lowCutoff/100);
- applySettings();
-}
-
-void ChannelAnalyzerNGGUI::on_spanLog2_currentIndexChanged(int index)
-{
- if (setNewFinalRate(index)) {
- applySettings();
- }
-
-}
-
-void ChannelAnalyzerNGGUI::on_ssb_toggled(bool checked)
-{
- //int bw = m_channelMarker.getBandwidth();
-
- if (checked)
- {
- setFiltersUIBoundaries();
-
- ui->BWLabel->setText("LP");
- QString s = QString::number(ui->BW->value()/10.0, 'f', 1); // bw/2
- ui->BWText->setText(tr("%1k").arg(s));
-
- on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
- }
- else
- {
- if (ui->BW->value() < 0) {
- ui->BW->setValue(-ui->BW->value());
- }
-
- setFiltersUIBoundaries();
- //m_channelMarker.setBandwidth(ui->BW->value() * 200.0);
-
- ui->BWLabel->setText("BP");
- QString s = QString::number(ui->BW->value()/5.0, 'f', 1); // bw
- ui->BWText->setText(tr("%1k").arg(s));
-
- ui->lowCut->setEnabled(false);
- ui->lowCut->setValue(0);
- ui->lowCutText->setText("0.0k");
- }
-
- applySettings();
- displayBandwidth();
-}
-
-void ChannelAnalyzerNGGUI::onWidgetRolled(QWidget* widget __attribute__((unused)), bool rollDown __attribute__((unused)))
-{
- /*
- if((widget == ui->spectrumContainer) && (m_ssbDemod != NULL))
- m_ssbDemod->setSpectrum(m_threadedSampleSink->getMessageQueue(), rollDown);
- */
-}
-
-void ChannelAnalyzerNGGUI::onMenuDoubleClicked()
-{
- if(!m_basicSettingsShown) {
- m_basicSettingsShown = true;
- BasicChannelSettingsWidget* bcsw = new BasicChannelSettingsWidget(&m_channelMarker, this);
- bcsw->show();
- }
-}
-
-ChannelAnalyzerNGGUI::ChannelAnalyzerNGGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) :
- RollupWidget(parent),
- ui(new Ui::ChannelAnalyzerNGGUI),
- m_pluginAPI(pluginAPI),
- m_deviceUISet(deviceUISet),
- m_channelMarker(this),
- m_basicSettingsShown(false),
- m_doApplySettings(true),
- m_rate(6000),
- m_spanLog2(0),
- m_channelPowerDbAvg(40,0)
-{
- ui->setupUi(this);
- setAttribute(Qt::WA_DeleteOnClose, true);
- connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
- connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked()));
-
- m_spectrumVis = new SpectrumVis(ui->glSpectrum);
- m_scopeVis = new ScopeVisNG(ui->glScope);
- m_spectrumScopeComboVis = new SpectrumScopeNGComboVis(m_spectrumVis, m_scopeVis);
- m_channelAnalyzer = new ChannelAnalyzerNG(m_deviceUISet->m_deviceSourceAPI);
- m_channelAnalyzer->setSampleSink(m_spectrumScopeComboVis);
- m_channelAnalyzer->setMessageQueueToGUI(getInputMessageQueue());
-// m_channelizer = new DownChannelizer(m_channelAnalyzer);
-// m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
-// connect(m_channelizer, SIGNAL(inputSampleRateChanged()), this, SLOT(channelizerInputSampleRateChanged()));
-// m_deviceAPI->addThreadedSink(m_threadedChannelizer);
-
- ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
- ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
- ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
-
- ui->channelSampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow));
- ui->channelSampleRate->setValueRange(7, 2000U, 9999999U);
-
- ui->glSpectrum->setCenterFrequency(m_rate/2);
- ui->glSpectrum->setSampleRate(m_rate);
- ui->glSpectrum->setDisplayWaterfall(true);
- ui->glSpectrum->setDisplayMaxHold(true);
- ui->glSpectrum->setSsbSpectrum(false);
- ui->glSpectrum->setLsbDisplay(false);
- ui->BWLabel->setText("BP");
-
- ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
- ui->glScope->connectTimer(MainWindow::getInstance()->getMasterTimer());
- connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
-
- //m_channelMarker = new ChannelMarker(this);
- m_channelMarker.setColor(Qt::gray);
- m_channelMarker.setBandwidth(m_rate);
- m_channelMarker.setSidebands(ChannelMarker::usb);
- m_channelMarker.setCenterFrequency(0);
- m_channelMarker.setVisible(true);
-
- connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));
-
- m_deviceUISet->registerChannelInstance(m_channelID, this);
- m_deviceUISet->addChannelMarker(&m_channelMarker);
- m_deviceUISet->addRollupWidget(this);
-
- ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
- ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope);
-
- connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
-
- applySettings();
- setNewFinalRate(m_spanLog2);
-}
-
-ChannelAnalyzerNGGUI::~ChannelAnalyzerNGGUI()
-{
- m_deviceUISet->removeChannelInstance(this);
-// m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
-// delete m_threadedChannelizer;
-// delete m_channelizer;
- delete m_channelAnalyzer;
- delete m_spectrumVis;
- delete m_scopeVis;
- delete m_spectrumScopeComboVis;
- //delete m_channelMarker;
- delete ui;
-}
-
-bool ChannelAnalyzerNGGUI::setNewFinalRate(int spanLog2)
-{
- qDebug("ChannelAnalyzerNGGUI::setNewRate");
-
- if ((spanLog2 < 0) || (spanLog2 > 6)) {
- return false;
- }
-
- m_spanLog2 = spanLog2;
- //m_rate = 48000 / (1<getInputSampleRate() / (1<spanText->setText(tr("%1 kS/s").arg(s));
-
- displayBandwidth();
-
- ui->glScope->setSampleRate(m_rate);
- m_scopeVis->setSampleRate(m_rate);
-
- return true;
-}
-
-void ChannelAnalyzerNGGUI::displayBandwidth()
-{
- if (ui->ssb->isChecked())
- {
- if (ui->BW->value() < 0)
- {
- m_channelMarker.setSidebands(ChannelMarker::lsb);
- ui->glSpectrum->setLsbDisplay(true);
- }
- else
- {
- m_channelMarker.setSidebands(ChannelMarker::usb);
- ui->glSpectrum->setLsbDisplay(false);
- }
-
- ui->glSpectrum->setCenterFrequency(m_rate/4);
- ui->glSpectrum->setSampleRate(m_rate/2);
- ui->glSpectrum->setSsbSpectrum(true);
- }
- else
- {
- m_channelMarker.setSidebands(ChannelMarker::dsb);
-
- ui->glSpectrum->setCenterFrequency(0);
- ui->glSpectrum->setSampleRate(m_rate);
- ui->glSpectrum->setLsbDisplay(false);
- ui->glSpectrum->setSsbSpectrum(false);
- }
-
-
-}
-
-void ChannelAnalyzerNGGUI::setFiltersUIBoundaries()
-{
- if (ui->BW->value() < -m_rate/200) {
- ui->BW->setValue(-m_rate/200);
- m_channelMarker.setBandwidth(-m_rate*2);
- } else if (ui->BW->value() > m_rate/200) {
- ui->BW->setValue(m_rate/200);
- m_channelMarker.setBandwidth(m_rate*2);
- }
-
- if (ui->lowCut->value() < -m_rate/200) {
- ui->lowCut->setValue(-m_rate/200);
- m_channelMarker.setLowCutoff(-m_rate);
- } else if (ui->lowCut->value() > m_rate/200) {
- ui->lowCut->setValue(m_rate/200);
- m_channelMarker.setLowCutoff(m_rate);
- }
-
- if (ui->ssb->isChecked()) {
- ui->BW->setMinimum(-m_rate/200);
- ui->lowCut->setMinimum(-m_rate/200);
- } else {
- ui->BW->setMinimum(0);
- ui->lowCut->setMinimum(-m_rate/200);
- ui->lowCut->setValue(0);
- }
-
- ui->BW->setMaximum(m_rate/200);
- ui->lowCut->setMaximum(m_rate/200);
-}
-
-void ChannelAnalyzerNGGUI::blockApplySettings(bool block)
-{
- ui->glScope->blockSignals(block);
- ui->glSpectrum->blockSignals(block);
- m_doApplySettings = !block;
-}
-
-void ChannelAnalyzerNGGUI::applySettings()
-{
- if (m_doApplySettings)
- {
- setTitleColor(m_channelMarker.getColor());
- ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
-
- int sampleRate = getRequestedChannelSampleRate();
-
- ChannelAnalyzerNG::MsgConfigureChannelizer *msgChannelizer = ChannelAnalyzerNG::MsgConfigureChannelizer::create(sampleRate, m_channelMarker.getCenterFrequency());
- m_channelAnalyzer->getInputMessageQueue()->push(msgChannelizer);
-
- ChannelAnalyzerNG::MsgConfigureChannelizer *msg =
- ChannelAnalyzerNG::MsgConfigureChannelizer::create(
- sampleRate,
- m_channelMarker.getCenterFrequency());
- m_channelAnalyzer->getInputMessageQueue()->push(msg);
-
-// m_channelizer->configure(m_channelizer->getInputMessageQueue(),
-// //m_channelizer->getInputSampleRate(),
-// getRequestedChannelSampleRate(),
-// m_channelMarker.getCenterFrequency());
-
- m_channelAnalyzer->configure(m_channelAnalyzer->getInputMessageQueue(),
- //m_channelizer->getInputSampleRate(), // TODO: specify required channel sample rate
- sampleRate, // TODO: specify required channel sample rate
- ui->BW->value() * 100.0,
- ui->lowCut->value() * 100.0,
- m_spanLog2,
- ui->ssb->isChecked());
- }
-}
-
-void ChannelAnalyzerNGGUI::leaveEvent(QEvent*)
-{
- blockApplySettings(true);
- m_channelMarker.setHighlighted(false);
- blockApplySettings(false);
-}
-
-void ChannelAnalyzerNGGUI::enterEvent(QEvent*)
-{
- blockApplySettings(true);
- m_channelMarker.setHighlighted(true);
- blockApplySettings(false);
-}
-
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2017 Edouard Griffiths, F4EXB //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#include "chanalyzernggui.h"
+
+#include
+#include "device/deviceuiset.h"
+#include
+#include
+#include
+
+#include "dsp/threadedbasebandsamplesink.h"
+#include "ui_chanalyzernggui.h"
+#include "dsp/spectrumscopengcombovis.h"
+#include "dsp/spectrumvis.h"
+#include "dsp/scopevis.h"
+#include "gui/glspectrum.h"
+#include "gui/glscopeng.h"
+#include "plugin/pluginapi.h"
+#include "util/simpleserializer.h"
+#include "util/db.h"
+#include "gui/basicchannelsettingswidget.h"
+#include "dsp/dspengine.h"
+#include "mainwindow.h"
+
+#include "chanalyzerng.h"
+
+const QString ChannelAnalyzerNGGUI::m_channelID = "sdrangel.channel.chanalyzerng";
+
+ChannelAnalyzerNGGUI* ChannelAnalyzerNGGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet)
+{
+ ChannelAnalyzerNGGUI* gui = new ChannelAnalyzerNGGUI(pluginAPI, deviceUISet);
+ return gui;
+}
+
+void ChannelAnalyzerNGGUI::destroy()
+{
+ delete this;
+}
+
+void ChannelAnalyzerNGGUI::setName(const QString& name)
+{
+ setObjectName(name);
+}
+
+QString ChannelAnalyzerNGGUI::getName() const
+{
+ return objectName();
+}
+
+qint64 ChannelAnalyzerNGGUI::getCenterFrequency() const
+{
+ return m_channelMarker.getCenterFrequency();
+}
+
+void ChannelAnalyzerNGGUI::setCenterFrequency(qint64 centerFrequency)
+{
+ m_channelMarker.setCenterFrequency(centerFrequency);
+ applySettings();
+}
+
+void ChannelAnalyzerNGGUI::resetToDefaults()
+{
+ blockApplySettings(true);
+
+ ui->useRationalDownsampler->setChecked(false);
+ ui->BW->setValue(30);
+ ui->deltaFrequency->setValue(0);
+ ui->spanLog2->setCurrentIndex(3);
+
+ blockApplySettings(false);
+ applySettings();
+}
+
+QByteArray ChannelAnalyzerNGGUI::serialize() const
+{
+ SimpleSerializer s(1);
+ s.writeS32(1, m_channelMarker.getCenterFrequency());
+ s.writeS32(2, ui->BW->value());
+ s.writeBlob(3, ui->spectrumGUI->serialize());
+ s.writeU32(4, m_channelMarker.getColor().rgb());
+ s.writeS32(5, ui->lowCut->value());
+ s.writeS32(6, ui->spanLog2->currentIndex());
+ s.writeBool(7, ui->ssb->isChecked());
+ s.writeBlob(8, ui->scopeGUI->serialize());
+ s.writeU64(9, ui->channelSampleRate->getValueNew());
+ return s.final();
+}
+
+bool ChannelAnalyzerNGGUI::deserialize(const QByteArray& data)
+{
+ SimpleDeserializer d(data);
+
+ if(!d.isValid())
+ {
+ resetToDefaults();
+ return false;
+ }
+
+ if(d.getVersion() == 1)
+ {
+ QByteArray bytetmp;
+ quint32 u32tmp;
+ quint64 u64tmp;
+ qint32 tmp, spanLog2, bw, lowCut;
+ bool tmpBool;
+
+ blockApplySettings(true);
+ m_channelMarker.blockSignals(true);
+
+ d.readS32(1, &tmp, 0);
+ m_channelMarker.setCenterFrequency(tmp);
+ d.readS32(2, &bw, 30);
+ d.readBlob(3, &bytetmp);
+ ui->spectrumGUI->deserialize(bytetmp);
+
+ if(d.readU32(4, &u32tmp))
+ {
+ m_channelMarker.setColor(u32tmp);
+ }
+
+ d.readS32(5, &lowCut, 3);
+ d.readS32(6, &spanLog2, 3);
+ d.readBool(7, &tmpBool, false);
+ ui->ssb->setChecked(tmpBool);
+ d.readBlob(8, &bytetmp);
+ ui->scopeGUI->deserialize(bytetmp);
+ d.readU64(9, &u64tmp, 2000U);
+ ui->channelSampleRate->setValue(u64tmp);
+
+ blockApplySettings(false);
+ m_channelMarker.blockSignals(false);
+
+ ui->spanLog2->setCurrentIndex(spanLog2);
+ setNewFinalRate(spanLog2);
+ ui->BW->setValue(bw);
+ ui->lowCut->setValue(lowCut); // does applySettings();
+
+ return true;
+ }
+ else
+ {
+ resetToDefaults();
+ return false;
+ }
+}
+
+bool ChannelAnalyzerNGGUI::handleMessage(const Message& message __attribute__((unused)))
+{
+ if (ChannelAnalyzerNG::MsgReportChannelSampleRateChanged::match(message))
+ {
+ setNewFinalRate(m_spanLog2);
+ applySettings();
+ return true;
+ }
+
+ return false;
+}
+
+void ChannelAnalyzerNGGUI::handleInputMessages()
+{
+ Message* message;
+
+ while ((message = getInputMessageQueue()->pop()) != 0)
+ {
+ qDebug("ChannelAnalyzerGUI::handleInputMessages: message: %s", message->getIdentifier());
+
+ if (handleMessage(*message))
+ {
+ delete message;
+ }
+ }
+}
+
+void ChannelAnalyzerNGGUI::viewChanged()
+{
+ applySettings();
+}
+
+void ChannelAnalyzerNGGUI::tick()
+{
+ double powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
+ m_channelPowerDbAvg.feed(powDb);
+ ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
+}
+
+//void ChannelAnalyzerNGGUI::channelizerInputSampleRateChanged()
+//{
+// //ui->channelSampleRate->setValueRange(7, 2000U, m_channelAnalyzer->getInputSampleRate());
+// setNewFinalRate(m_spanLog2);
+// applySettings();
+//}
+
+void ChannelAnalyzerNGGUI::on_channelSampleRate_changed(quint64 value)
+{
+ ui->channelSampleRate->setValueRange(7, 2000U, m_channelAnalyzer->getInputSampleRate());
+
+ if (ui->useRationalDownsampler->isChecked())
+ {
+ qDebug("ChannelAnalyzerNGGUI::on_channelSampleRate_changed: %llu", value);
+ setNewFinalRate(m_spanLog2);
+ applySettings();
+ }
+}
+
+void ChannelAnalyzerNGGUI::on_useRationalDownsampler_toggled(bool checked __attribute__((unused)))
+{
+ setNewFinalRate(m_spanLog2);
+ applySettings();
+}
+
+int ChannelAnalyzerNGGUI::getRequestedChannelSampleRate()
+{
+ if (ui->useRationalDownsampler->isChecked()) {
+ return ui->channelSampleRate->getValueNew();
+ } else {
+ return m_channelAnalyzer->getChannelizer()->getInputSampleRate();
+ }
+}
+
+void ChannelAnalyzerNGGUI::on_deltaFrequency_changed(qint64 value)
+{
+ m_channelMarker.setCenterFrequency(value);
+}
+
+void ChannelAnalyzerNGGUI::on_BW_valueChanged(int value)
+{
+ m_channelMarker.setBandwidth(value * 100 * 2);
+
+ if (ui->ssb->isChecked())
+ {
+ QString s = QString::number(value/10.0, 'f', 1);
+ ui->BWText->setText(tr("%1k").arg(s));
+ }
+ else
+ {
+ QString s = QString::number(value/5.0, 'f', 1); // BW = value * 2
+ ui->BWText->setText(tr("%1k").arg(s));
+ }
+
+ displayBandwidth();
+ on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
+}
+
+int ChannelAnalyzerNGGUI::getEffectiveLowCutoff(int lowCutoff)
+{
+ int ssbBW = m_channelMarker.getBandwidth() / 2;
+ int effectiveLowCutoff = lowCutoff;
+ const int guard = 100;
+
+ if (ssbBW < 0) {
+ if (effectiveLowCutoff < ssbBW + guard) {
+ effectiveLowCutoff = ssbBW + guard;
+ }
+ if (effectiveLowCutoff > 0) {
+ effectiveLowCutoff = 0;
+ }
+ } else {
+ if (effectiveLowCutoff > ssbBW - guard) {
+ effectiveLowCutoff = ssbBW - guard;
+ }
+ if (effectiveLowCutoff < 0) {
+ effectiveLowCutoff = 0;
+ }
+ }
+
+ return effectiveLowCutoff;
+}
+
+void ChannelAnalyzerNGGUI::on_lowCut_valueChanged(int value)
+{
+ int lowCutoff = getEffectiveLowCutoff(value * 100);
+ m_channelMarker.setLowCutoff(lowCutoff);
+ QString s = QString::number(lowCutoff/1000.0, 'f', 1);
+ ui->lowCutText->setText(tr("%1k").arg(s));
+ ui->lowCut->setValue(lowCutoff/100);
+ applySettings();
+}
+
+void ChannelAnalyzerNGGUI::on_spanLog2_currentIndexChanged(int index)
+{
+ if (setNewFinalRate(index)) {
+ applySettings();
+ }
+
+}
+
+void ChannelAnalyzerNGGUI::on_ssb_toggled(bool checked)
+{
+ //int bw = m_channelMarker.getBandwidth();
+
+ if (checked)
+ {
+ setFiltersUIBoundaries();
+
+ ui->BWLabel->setText("LP");
+ QString s = QString::number(ui->BW->value()/10.0, 'f', 1); // bw/2
+ ui->BWText->setText(tr("%1k").arg(s));
+
+ on_lowCut_valueChanged(m_channelMarker.getLowCutoff()/100);
+ }
+ else
+ {
+ if (ui->BW->value() < 0) {
+ ui->BW->setValue(-ui->BW->value());
+ }
+
+ setFiltersUIBoundaries();
+ //m_channelMarker.setBandwidth(ui->BW->value() * 200.0);
+
+ ui->BWLabel->setText("BP");
+ QString s = QString::number(ui->BW->value()/5.0, 'f', 1); // bw
+ ui->BWText->setText(tr("%1k").arg(s));
+
+ ui->lowCut->setEnabled(false);
+ ui->lowCut->setValue(0);
+ ui->lowCutText->setText("0.0k");
+ }
+
+ applySettings();
+ displayBandwidth();
+}
+
+void ChannelAnalyzerNGGUI::onWidgetRolled(QWidget* widget __attribute__((unused)), bool rollDown __attribute__((unused)))
+{
+ /*
+ if((widget == ui->spectrumContainer) && (m_ssbDemod != NULL))
+ m_ssbDemod->setSpectrum(m_threadedSampleSink->getMessageQueue(), rollDown);
+ */
+}
+
+void ChannelAnalyzerNGGUI::onMenuDoubleClicked()
+{
+ if(!m_basicSettingsShown) {
+ m_basicSettingsShown = true;
+ BasicChannelSettingsWidget* bcsw = new BasicChannelSettingsWidget(&m_channelMarker, this);
+ bcsw->show();
+ }
+}
+
+ChannelAnalyzerNGGUI::ChannelAnalyzerNGGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) :
+ RollupWidget(parent),
+ ui(new Ui::ChannelAnalyzerNGGUI),
+ m_pluginAPI(pluginAPI),
+ m_deviceUISet(deviceUISet),
+ m_channelMarker(this),
+ m_basicSettingsShown(false),
+ m_doApplySettings(true),
+ m_rate(6000),
+ m_spanLog2(0),
+ m_channelPowerDbAvg(40,0)
+{
+ ui->setupUi(this);
+ setAttribute(Qt::WA_DeleteOnClose, true);
+ connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
+ connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked()));
+
+ m_spectrumVis = new SpectrumVis(ui->glSpectrum);
+ m_scopeVis = new ScopeVisNG(ui->glScope);
+ m_spectrumScopeComboVis = new SpectrumScopeNGComboVis(m_spectrumVis, m_scopeVis);
+ m_channelAnalyzer = new ChannelAnalyzerNG(m_deviceUISet->m_deviceSourceAPI);
+ m_channelAnalyzer->setSampleSink(m_spectrumScopeComboVis);
+ m_channelAnalyzer->setMessageQueueToGUI(getInputMessageQueue());
+// m_channelizer = new DownChannelizer(m_channelAnalyzer);
+// m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this);
+// connect(m_channelizer, SIGNAL(inputSampleRateChanged()), this, SLOT(channelizerInputSampleRateChanged()));
+// m_deviceAPI->addThreadedSink(m_threadedChannelizer);
+
+ ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
+ ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
+ ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
+
+ ui->channelSampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow));
+ ui->channelSampleRate->setValueRange(7, 2000U, 9999999U);
+
+ ui->glSpectrum->setCenterFrequency(m_rate/2);
+ ui->glSpectrum->setSampleRate(m_rate);
+ ui->glSpectrum->setDisplayWaterfall(true);
+ ui->glSpectrum->setDisplayMaxHold(true);
+ ui->glSpectrum->setSsbSpectrum(false);
+ ui->glSpectrum->setLsbDisplay(false);
+ ui->BWLabel->setText("BP");
+
+ ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
+ ui->glScope->connectTimer(MainWindow::getInstance()->getMasterTimer());
+ connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
+
+ //m_channelMarker = new ChannelMarker(this);
+ m_channelMarker.setColor(Qt::gray);
+ m_channelMarker.setBandwidth(m_rate);
+ m_channelMarker.setSidebands(ChannelMarker::usb);
+ m_channelMarker.setCenterFrequency(0);
+ m_channelMarker.setVisible(true);
+
+ connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));
+
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
+ m_deviceUISet->addChannelMarker(&m_channelMarker);
+ m_deviceUISet->addRollupWidget(this);
+
+ ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
+ ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope);
+
+ connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
+
+ applySettings();
+ setNewFinalRate(m_spanLog2);
+}
+
+ChannelAnalyzerNGGUI::~ChannelAnalyzerNGGUI()
+{
+ m_deviceUISet->removeRxChannelInstance(this);
+// m_deviceAPI->removeThreadedSink(m_threadedChannelizer);
+// delete m_threadedChannelizer;
+// delete m_channelizer;
+ delete m_channelAnalyzer;
+ delete m_spectrumVis;
+ delete m_scopeVis;
+ delete m_spectrumScopeComboVis;
+ //delete m_channelMarker;
+ delete ui;
+}
+
+bool ChannelAnalyzerNGGUI::setNewFinalRate(int spanLog2)
+{
+ qDebug("ChannelAnalyzerNGGUI::setNewRate");
+
+ if ((spanLog2 < 0) || (spanLog2 > 6)) {
+ return false;
+ }
+
+ m_spanLog2 = spanLog2;
+ //m_rate = 48000 / (1<getInputSampleRate() / (1<spanText->setText(tr("%1 kS/s").arg(s));
+
+ displayBandwidth();
+
+ ui->glScope->setSampleRate(m_rate);
+ m_scopeVis->setSampleRate(m_rate);
+
+ return true;
+}
+
+void ChannelAnalyzerNGGUI::displayBandwidth()
+{
+ if (ui->ssb->isChecked())
+ {
+ if (ui->BW->value() < 0)
+ {
+ m_channelMarker.setSidebands(ChannelMarker::lsb);
+ ui->glSpectrum->setLsbDisplay(true);
+ }
+ else
+ {
+ m_channelMarker.setSidebands(ChannelMarker::usb);
+ ui->glSpectrum->setLsbDisplay(false);
+ }
+
+ ui->glSpectrum->setCenterFrequency(m_rate/4);
+ ui->glSpectrum->setSampleRate(m_rate/2);
+ ui->glSpectrum->setSsbSpectrum(true);
+ }
+ else
+ {
+ m_channelMarker.setSidebands(ChannelMarker::dsb);
+
+ ui->glSpectrum->setCenterFrequency(0);
+ ui->glSpectrum->setSampleRate(m_rate);
+ ui->glSpectrum->setLsbDisplay(false);
+ ui->glSpectrum->setSsbSpectrum(false);
+ }
+
+
+}
+
+void ChannelAnalyzerNGGUI::setFiltersUIBoundaries()
+{
+ if (ui->BW->value() < -m_rate/200) {
+ ui->BW->setValue(-m_rate/200);
+ m_channelMarker.setBandwidth(-m_rate*2);
+ } else if (ui->BW->value() > m_rate/200) {
+ ui->BW->setValue(m_rate/200);
+ m_channelMarker.setBandwidth(m_rate*2);
+ }
+
+ if (ui->lowCut->value() < -m_rate/200) {
+ ui->lowCut->setValue(-m_rate/200);
+ m_channelMarker.setLowCutoff(-m_rate);
+ } else if (ui->lowCut->value() > m_rate/200) {
+ ui->lowCut->setValue(m_rate/200);
+ m_channelMarker.setLowCutoff(m_rate);
+ }
+
+ if (ui->ssb->isChecked()) {
+ ui->BW->setMinimum(-m_rate/200);
+ ui->lowCut->setMinimum(-m_rate/200);
+ } else {
+ ui->BW->setMinimum(0);
+ ui->lowCut->setMinimum(-m_rate/200);
+ ui->lowCut->setValue(0);
+ }
+
+ ui->BW->setMaximum(m_rate/200);
+ ui->lowCut->setMaximum(m_rate/200);
+}
+
+void ChannelAnalyzerNGGUI::blockApplySettings(bool block)
+{
+ ui->glScope->blockSignals(block);
+ ui->glSpectrum->blockSignals(block);
+ m_doApplySettings = !block;
+}
+
+void ChannelAnalyzerNGGUI::applySettings()
+{
+ if (m_doApplySettings)
+ {
+ setTitleColor(m_channelMarker.getColor());
+ ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
+
+ int sampleRate = getRequestedChannelSampleRate();
+
+ ChannelAnalyzerNG::MsgConfigureChannelizer *msgChannelizer = ChannelAnalyzerNG::MsgConfigureChannelizer::create(sampleRate, m_channelMarker.getCenterFrequency());
+ m_channelAnalyzer->getInputMessageQueue()->push(msgChannelizer);
+
+ ChannelAnalyzerNG::MsgConfigureChannelizer *msg =
+ ChannelAnalyzerNG::MsgConfigureChannelizer::create(
+ sampleRate,
+ m_channelMarker.getCenterFrequency());
+ m_channelAnalyzer->getInputMessageQueue()->push(msg);
+
+// m_channelizer->configure(m_channelizer->getInputMessageQueue(),
+// //m_channelizer->getInputSampleRate(),
+// getRequestedChannelSampleRate(),
+// m_channelMarker.getCenterFrequency());
+
+ m_channelAnalyzer->configure(m_channelAnalyzer->getInputMessageQueue(),
+ //m_channelizer->getInputSampleRate(), // TODO: specify required channel sample rate
+ sampleRate, // TODO: specify required channel sample rate
+ ui->BW->value() * 100.0,
+ ui->lowCut->value() * 100.0,
+ m_spanLog2,
+ ui->ssb->isChecked());
+ }
+}
+
+void ChannelAnalyzerNGGUI::leaveEvent(QEvent*)
+{
+ blockApplySettings(true);
+ m_channelMarker.setHighlighted(false);
+ blockApplySettings(false);
+}
+
+void ChannelAnalyzerNGGUI::enterEvent(QEvent*)
+{
+ blockApplySettings(true);
+ m_channelMarker.setHighlighted(true);
+ blockApplySettings(false);
+}
+
diff --git a/plugins/channelrx/demodam/amdemodgui.cpp b/plugins/channelrx/demodam/amdemodgui.cpp
index b69d8cddc..a4a836353 100644
--- a/plugins/channelrx/demodam/amdemodgui.cpp
+++ b/plugins/channelrx/demodam/amdemodgui.cpp
@@ -206,7 +206,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget*
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -216,7 +216,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget*
AMDemodGUI::~AMDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_amDemod;
delete ui;
}
diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp
index 278e6ade1..0b08215d4 100644
--- a/plugins/channelrx/demodatv/atvdemodgui.cpp
+++ b/plugins/channelrx/demodatv/atvdemodgui.cpp
@@ -313,7 +313,7 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet,
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));
- m_deviceUISet->registerChannelInstance(m_strChannelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_strChannelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -348,7 +348,7 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet,
ATVDemodGUI::~ATVDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
m_deviceUISet->m_deviceSourceAPI->removeThreadedSink(m_threadedChannelizer);
delete m_threadedChannelizer;
delete m_channelizer;
diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.cpp b/plugins/channelrx/demodbfm/bfmdemodgui.cpp
index ec8449bba..0476f702f 100644
--- a/plugins/channelrx/demodbfm/bfmdemodgui.cpp
+++ b/plugins/channelrx/demodbfm/bfmdemodgui.cpp
@@ -364,7 +364,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -383,7 +383,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
BFMDemodGUI::~BFMDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_bfmDemod;
delete ui;
}
diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp
index 931715192..16aa89359 100644
--- a/plugins/channelrx/demoddsd/dsddemodgui.cpp
+++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp
@@ -281,7 +281,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -298,7 +298,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
DSDDemodGUI::~DSDDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_dsdDemod;
delete ui;
}
diff --git a/plugins/channelrx/demodlora/lorademodgui.cpp b/plugins/channelrx/demodlora/lorademodgui.cpp
index 3c473c08c..9920453fd 100644
--- a/plugins/channelrx/demodlora/lorademodgui.cpp
+++ b/plugins/channelrx/demodlora/lorademodgui.cpp
@@ -153,7 +153,7 @@ LoRaDemodGUI::LoRaDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidg
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -168,7 +168,7 @@ LoRaDemodGUI::LoRaDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidg
LoRaDemodGUI::~LoRaDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_LoRaDemod;
delete m_spectrumVis;
delete ui;
diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.cpp b/plugins/channelrx/demodnfm/nfmdemodgui.cpp
index b39387f12..e21a71430 100644
--- a/plugins/channelrx/demodnfm/nfmdemodgui.cpp
+++ b/plugins/channelrx/demodnfm/nfmdemodgui.cpp
@@ -284,7 +284,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -299,7 +299,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
NFMDemodGUI::~NFMDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_nfmDemod;
//delete m_channelMarker;
delete ui;
diff --git a/plugins/channelrx/demodssb/ssbdemodgui.cpp b/plugins/channelrx/demodssb/ssbdemodgui.cpp
index d1ce494c1..1dbaf83ff 100644
--- a/plugins/channelrx/demodssb/ssbdemodgui.cpp
+++ b/plugins/channelrx/demodssb/ssbdemodgui.cpp
@@ -331,7 +331,7 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -344,7 +344,7 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
SSBDemodGUI::~SSBDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_ssbDemod;
delete m_spectrumVis;
delete ui;
diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.cpp b/plugins/channelrx/demodwfm/wfmdemodgui.cpp
index 0f91d1c5b..144e2c5b2 100644
--- a/plugins/channelrx/demodwfm/wfmdemodgui.cpp
+++ b/plugins/channelrx/demodwfm/wfmdemodgui.cpp
@@ -185,7 +185,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -197,7 +197,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget
WFMDemodGUI::~WFMDemodGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_wfmDemod;
//delete m_channelMarker;
delete ui;
diff --git a/plugins/channelrx/tcpsrc/tcpsrcgui.cpp b/plugins/channelrx/tcpsrc/tcpsrcgui.cpp
index 7090f535a..8965e911f 100644
--- a/plugins/channelrx/tcpsrc/tcpsrcgui.cpp
+++ b/plugins/channelrx/tcpsrc/tcpsrcgui.cpp
@@ -165,7 +165,7 @@ TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* pa
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -179,7 +179,7 @@ TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* pa
TCPSrcGUI::~TCPSrcGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_tcpSrc;
delete m_spectrumVis;
delete ui;
diff --git a/plugins/channelrx/udpsrc/udpsrcgui.cpp b/plugins/channelrx/udpsrc/udpsrcgui.cpp
index 2ba6253ff..9141cdd82 100644
--- a/plugins/channelrx/udpsrc/udpsrcgui.cpp
+++ b/plugins/channelrx/udpsrc/udpsrcgui.cpp
@@ -185,7 +185,7 @@ UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* pa
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
- m_deviceUISet->registerChannelInstance(m_channelID, this);
+ m_deviceUISet->registerRxChannelInstance(m_channelID, this);
m_deviceUISet->addChannelMarker(&m_channelMarker);
m_deviceUISet->addRollupWidget(this);
@@ -198,7 +198,7 @@ UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* pa
UDPSrcGUI::~UDPSrcGUI()
{
- m_deviceUISet->removeChannelInstance(this);
+ m_deviceUISet->removeRxChannelInstance(this);
delete m_udpSrc;
delete m_spectrumVis;
delete ui;
diff --git a/sdrgui/device/devicesinkapi.h b/sdrgui/device/devicesinkapi.h
index 100f25993..73f844dd4 100644
--- a/sdrgui/device/devicesinkapi.h
+++ b/sdrgui/device/devicesinkapi.h
@@ -67,9 +67,12 @@ public:
MessageQueue *getSampleSinkInputMessageQueue();
MessageQueue *getSampleSinkGUIMessageQueue();
- // device related stuff
+ // device GUI related stuff
void addChannelMarker(ChannelMarker* channelMarker); //!< Add channel marker to spectrum
void addRollupWidget(QWidget *widget); //!< Add rollup widget to channel window
+ void freeChannels();
+ void loadChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
+ void saveChannelSettings(Preset* preset);
void setHardwareId(const QString& id);
void setSampleSinkId(const QString& id);
@@ -91,12 +94,9 @@ public:
void registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI);
void removeChannelInstance(PluginInstanceGUI* pluginGUI);
- void freeChannels();
void loadSinkSettings(const Preset* preset);
void saveSinkSettings(Preset* preset);
- void loadChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
- void saveChannelSettings(Preset* preset);
DSPDeviceSinkEngine *getDeviceSinkEngine() { return m_deviceSinkEngine; }
diff --git a/sdrgui/device/deviceuiset.cpp b/sdrgui/device/deviceuiset.cpp
index 3a53f4909..2957e97b8 100644
--- a/sdrgui/device/deviceuiset.cpp
+++ b/sdrgui/device/deviceuiset.cpp
@@ -73,36 +73,65 @@ void DeviceUISet::addRollupWidget(QWidget *widget)
m_channelWindow->addRollupWidget(widget);
}
-void DeviceUISet::registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI)
+void DeviceUISet::registerRxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI)
{
- m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI));
- renameChannelInstances();
+ m_rxChannelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI));
+ renameRxChannelInstances();
}
-void DeviceUISet::removeChannelInstance(PluginInstanceGUI* pluginGUI)
+void DeviceUISet::registerTxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI)
{
- for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it)
+ m_txChannelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI));
+ renameRxChannelInstances();
+}
+
+void DeviceUISet::removeRxChannelInstance(PluginInstanceGUI* pluginGUI)
+{
+ for(ChannelInstanceRegistrations::iterator it = m_rxChannelInstanceRegistrations.begin(); it != m_rxChannelInstanceRegistrations.end(); ++it)
{
if(it->m_gui == pluginGUI)
{
- m_channelInstanceRegistrations.erase(it);
+ m_rxChannelInstanceRegistrations.erase(it);
break;
}
}
- renameChannelInstances();
+ renameRxChannelInstances();
}
-void DeviceUISet::freeChannels()
+void DeviceUISet::removeTxChannelInstance(PluginInstanceGUI* pluginGUI)
{
- for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
+ for(ChannelInstanceRegistrations::iterator it = m_txChannelInstanceRegistrations.begin(); it != m_txChannelInstanceRegistrations.end(); ++it)
{
- qDebug("DeviceUISet::freeAll: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
- m_channelInstanceRegistrations[i].m_gui->destroy();
+ if(it->m_gui == pluginGUI)
+ {
+ m_txChannelInstanceRegistrations.erase(it);
+ break;
+ }
+ }
+
+ renameRxChannelInstances();
+}
+
+void DeviceUISet::freeRxChannels()
+{
+ for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++)
+ {
+ qDebug("DeviceUISet::freeAll: destroying channel [%s]", qPrintable(m_rxChannelInstanceRegistrations[i].m_channelName));
+ m_rxChannelInstanceRegistrations[i].m_gui->destroy();
}
}
-void DeviceUISet::loadChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
+void DeviceUISet::freeTxChannels()
+{
+ for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++)
+ {
+ qDebug("DeviceUISet::freeAll: destroying channel [%s]", qPrintable(m_txChannelInstanceRegistrations[i].m_channelName));
+ m_txChannelInstanceRegistrations[i].m_gui->destroy();
+ }
+}
+
+void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
{
if (preset->isSourcePreset())
{
@@ -112,8 +141,8 @@ void DeviceUISet::loadChannelSettings(const Preset *preset, PluginAPI *pluginAPI
PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getRxChannelRegistrations();
// copy currently open channels and clear list
- ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations;
- m_channelInstanceRegistrations.clear();
+ ChannelInstanceRegistrations openChannels = m_rxChannelInstanceRegistrations;
+ m_rxChannelInstanceRegistrations.clear();
qDebug("DeviceUISet::loadChannelSettings: %d channel(s) in preset", preset->getChannelCount());
@@ -132,7 +161,7 @@ void DeviceUISet::loadChannelSettings(const Preset *preset, PluginAPI *pluginAPI
{
qDebug("DeviceSourceAPI::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName));
reg = openChannels.takeAt(i);
- m_channelInstanceRegistrations.append(reg);
+ m_rxChannelInstanceRegistrations.append(reg);
break;
}
}
@@ -170,7 +199,7 @@ void DeviceUISet::loadChannelSettings(const Preset *preset, PluginAPI *pluginAPI
openChannels[i].m_gui->destroy();
}
- renameChannelInstances();
+ renameRxChannelInstances();
}
else
{
@@ -178,16 +207,16 @@ void DeviceUISet::loadChannelSettings(const Preset *preset, PluginAPI *pluginAPI
}
}
-void DeviceUISet::saveChannelSettings(Preset *preset)
+void DeviceUISet::saveRxChannelSettings(Preset *preset)
{
if (preset->isSourcePreset())
{
- qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type
+ qSort(m_rxChannelInstanceRegistrations.begin(), m_rxChannelInstanceRegistrations.end()); // sort by increasing delta frequency and type
- for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
+ for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++)
{
- qDebug("DeviceUISet::saveChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
- preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize());
+ qDebug("DeviceUISet::saveChannelSettings: channel [%s] saved", qPrintable(m_rxChannelInstanceRegistrations[i].m_channelName));
+ preset->addChannel(m_rxChannelInstanceRegistrations[i].m_channelName, m_rxChannelInstanceRegistrations[i].m_gui->serialize());
}
}
else
@@ -196,11 +225,110 @@ void DeviceUISet::saveChannelSettings(Preset *preset)
}
}
-void DeviceUISet::renameChannelInstances()
+void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
{
- for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
+ if (preset->isSourcePreset())
{
- m_channelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i].m_channelName).arg(i));
+ qDebug("DeviceUISet::loadChannelSettings: Loading preset [%s | %s] not a sink preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
+ }
+ else
+ {
+ qDebug("DeviceUISet::loadChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
+
+ // Available channel plugins
+ PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getTxChannelRegistrations();
+
+ // copy currently open channels and clear list
+ ChannelInstanceRegistrations openChannels = m_txChannelInstanceRegistrations;
+ m_txChannelInstanceRegistrations.clear();
+
+ qDebug("DeviceUISet::loadChannelSettings: %d channel(s) in preset", preset->getChannelCount());
+
+ for(int i = 0; i < preset->getChannelCount(); i++)
+ {
+ const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i);
+ ChannelInstanceRegistration reg;
+
+ // if we have one instance available already, use it
+
+ for(int i = 0; i < openChannels.count(); i++)
+ {
+ qDebug("DeviceUISet::loadChannelSettings: channels compare [%s] vs [%s]", qPrintable(openChannels[i].m_channelName), qPrintable(channelConfig.m_channel));
+
+ if(openChannels[i].m_channelName == channelConfig.m_channel)
+ {
+ qDebug("DeviceUISet::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName));
+ reg = openChannels.takeAt(i);
+ m_txChannelInstanceRegistrations.append(reg);
+ break;
+ }
+ }
+
+ // if we haven't one already, create one
+
+ if(reg.m_gui == 0)
+ {
+ for(int i = 0; i < channelRegistrations->count(); i++)
+ {
+ if((*channelRegistrations)[i].m_channelName == channelConfig.m_channel)
+ {
+ qDebug("DeviceUISet::loadChannelSettings: creating new channel [%s]", qPrintable(channelConfig.m_channel));
+ // TODO: replace m_deviceSinkAPI by this
+ reg = ChannelInstanceRegistration(channelConfig.m_channel, (*channelRegistrations)[i].m_plugin->createTxChannel(channelConfig.m_channel, m_deviceSinkAPI));
+ break;
+ }
+ }
+ }
+
+ if(reg.m_gui != 0)
+ {
+ qDebug("DeviceUISet::loadChannelSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channel));
+ reg.m_gui->deserialize(channelConfig.m_config);
+ }
+ }
+
+ // everything, that is still "available" is not needed anymore
+ for(int i = 0; i < openChannels.count(); i++)
+ {
+ qDebug("DeviceUISet::loadChannelSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName));
+ openChannels[i].m_gui->destroy();
+ }
+
+ renameTxChannelInstances();
+ }
+}
+
+void DeviceUISet::saveTxChannelSettings(Preset *preset)
+{
+ if (preset->isSourcePreset())
+ {
+ qDebug("DeviceUISet::saveChannelSettings: not a sink preset");
+ }
+ else
+ {
+ qSort(m_txChannelInstanceRegistrations.begin(), m_txChannelInstanceRegistrations.end()); // sort by increasing delta frequency and type
+
+ for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++)
+ {
+ qDebug("DeviceUISet::saveChannelSettings: channel [%s] saved", qPrintable(m_txChannelInstanceRegistrations[i].m_channelName));
+ preset->addChannel(m_txChannelInstanceRegistrations[i].m_channelName, m_txChannelInstanceRegistrations[i].m_gui->serialize());
+ }
+ }
+}
+
+void DeviceUISet::renameRxChannelInstances()
+{
+ for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++)
+ {
+ m_rxChannelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_rxChannelInstanceRegistrations[i].m_channelName).arg(i));
+ }
+}
+
+void DeviceUISet::renameTxChannelInstances()
+{
+ for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++)
+ {
+ m_txChannelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_txChannelInstanceRegistrations[i].m_channelName).arg(i));
}
}
diff --git a/sdrgui/device/deviceuiset.h b/sdrgui/device/deviceuiset.h
index e0bd7de98..a0e7b946a 100644
--- a/sdrgui/device/deviceuiset.h
+++ b/sdrgui/device/deviceuiset.h
@@ -51,11 +51,16 @@ struct DeviceUISet
void addChannelMarker(ChannelMarker* channelMarker); //!< Add channel marker to spectrum
void addRollupWidget(QWidget *widget); //!< Add rollup widget to channel window
- void registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI);
- void removeChannelInstance(PluginInstanceGUI* pluginGUI);
- void freeChannels();
- void loadChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
- void saveChannelSettings(Preset* preset);
+ void registerRxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI);
+ void registerTxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI);
+ void removeRxChannelInstance(PluginInstanceGUI* pluginGUI);
+ void removeTxChannelInstance(PluginInstanceGUI* pluginGUI);
+ void freeRxChannels();
+ void freeTxChannels();
+ void loadRxChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
+ void saveRxChannelSettings(Preset* preset);
+ void loadTxChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
+ void saveTxChannelSettings(Preset* preset);
private:
struct ChannelInstanceRegistration
@@ -78,9 +83,11 @@ private:
typedef QList ChannelInstanceRegistrations;
- ChannelInstanceRegistrations m_channelInstanceRegistrations;
+ ChannelInstanceRegistrations m_rxChannelInstanceRegistrations;
+ ChannelInstanceRegistrations m_txChannelInstanceRegistrations;
- void renameChannelInstances();
+ void renameRxChannelInstances();
+ void renameTxChannelInstances();
};
diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp
index 83e3ea0e9..696927d25 100644
--- a/sdrgui/mainwindow.cpp
+++ b/sdrgui/mainwindow.cpp
@@ -330,7 +330,7 @@ void MainWindow::removeLastDevice()
ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1);
// deletes old UI and input object
- m_deviceUIs.back()->freeChannels(); // destroys the channel instances
+ m_deviceUIs.back()->freeRxChannels(); // destroys the channel instances
m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(0); // have source stop sending messages to the GUI
m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI());
@@ -479,7 +479,7 @@ void MainWindow::loadPresetSettings(const Preset* preset, int tabIndex)
{
deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig());
deviceUI->m_deviceSourceAPI->loadSourceSettings(preset);
- deviceUI->loadChannelSettings(preset, m_pluginManager->getPluginAPI());
+ deviceUI->loadRxChannelSettings(preset, m_pluginManager->getPluginAPI());
}
else if (deviceUI->m_deviceSinkEngine) // sink device
{
@@ -507,7 +507,7 @@ void MainWindow::savePresetSettings(Preset* preset, int tabIndex)
{
preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
preset->clearChannels();
- deviceUI->saveChannelSettings(preset);
+ deviceUI->saveRxChannelSettings(preset);
deviceUI->m_deviceSourceAPI->saveSourceSettings(preset);
}
else if (deviceUI->m_deviceSinkEngine) // sink device