diff --git a/debian/changelog b/debian/changelog index a3b390acd..b329cf097 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +sdrangel (3.8.0-1) unstable; urgency=medium + + * Redesigned the device handling to accomodate multi channel devices like LimeSDR + * Refactoring: Separate DeviceAPI from the GUI + + -- Edouard Griffiths, F4EXB Thu, 02 Nov 2017 18:14:18 +0200 + sdrangel (3.7.8-1) unstable; urgency=medium * PlutoSDR: restored and fixed Tx support diff --git a/doc/img/MainWindow_SDControl.png b/doc/img/MainWindow_SDControl.png index b218c98f3..af3b8eef0 100644 Binary files a/doc/img/MainWindow_SDControl.png and b/doc/img/MainWindow_SDControl.png differ diff --git a/doc/img/MainWindow_SDDialog.png b/doc/img/MainWindow_SDDialog.png new file mode 100644 index 000000000..d155e7406 Binary files /dev/null and b/doc/img/MainWindow_SDDialog.png differ diff --git a/doc/img/MainWindow_general.png b/doc/img/MainWindow_general.png index 4cbeefa3c..0025aaa38 100644 Binary files a/doc/img/MainWindow_general.png and b/doc/img/MainWindow_general.png differ diff --git a/doc/img/MainWindow_tabs.png b/doc/img/MainWindow_tabs.png index aa479ca65..df0bcd7f8 100644 Binary files a/doc/img/MainWindow_tabs.png and b/doc/img/MainWindow_tabs.png differ diff --git a/fcdlib/fcdtraits.cpp b/fcdlib/fcdtraits.cpp index 99f97baed..ca2d0cd70 100644 --- a/fcdlib/fcdtraits.cpp +++ b/fcdlib/fcdtraits.cpp @@ -22,8 +22,8 @@ const char *fcd_traits::displayedName = "FunCube Dongle Pro+"; const char *fcd_traits::pluginDisplayedName = "FunCube Pro Input"; const char *fcd_traits::pluginDisplayedName = "FunCube Pro+ Input"; -const char *fcd_traits::pluginVersion = "3.7.4"; -const char *fcd_traits::pluginVersion = "3.7.4"; +const char *fcd_traits::pluginVersion = "3.8.0"; +const char *fcd_traits::pluginVersion = "3.8.0"; const int64_t fcd_traits::loLowLimitFreq = 64000000L; const int64_t fcd_traits::loLowLimitFreq = 150000L; diff --git a/plugins/channelrx/chanalyzer/chanalyzergui.cpp b/plugins/channelrx/chanalyzer/chanalyzergui.cpp index 35b299576..107f8e1ee 100644 --- a/plugins/channelrx/chanalyzer/chanalyzergui.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzergui.cpp @@ -1,497 +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 -#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, DeviceSourceAPI *deviceAPI) -{ - ChannelAnalyzerGUI* gui = new ChannelAnalyzerGUI(pluginAPI, deviceAPI); - 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, DeviceSourceAPI *deviceAPI, QWidget* parent) : - RollupWidget(parent), - ui(new Ui::ChannelAnalyzerGUI), - m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), - 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_deviceAPI); - 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_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->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_deviceAPI->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/chanalyzer/chanalyzergui.h b/plugins/channelrx/chanalyzer/chanalyzergui.h index c13238f40..a56f91a2d 100644 --- a/plugins/channelrx/chanalyzer/chanalyzergui.h +++ b/plugins/channelrx/chanalyzer/chanalyzergui.h @@ -24,7 +24,7 @@ #include "util/messagequeue.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class ThreadedBasebandSampleSink; class DownChannelizer; @@ -41,7 +41,7 @@ class ChannelAnalyzerGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static ChannelAnalyzerGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static ChannelAnalyzerGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUIset); virtual void destroy(); void setName(const QString& name); @@ -73,7 +73,8 @@ private slots: private: Ui::ChannelAnalyzerGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; +// DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; bool m_basicSettingsShown; bool m_doApplySettings; @@ -89,7 +90,7 @@ private: ScopeVis* m_scopeVis; MessageQueue m_inputMessageQueue; - explicit ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~ChannelAnalyzerGUI(); int getEffectiveLowCutoff(int lowCutoff); diff --git a/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp b/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp index 428ccd78c..d3d8fb772 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp @@ -7,7 +7,7 @@ const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = { QString("Channel Analyzer"), - QString("2.0.0"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -33,18 +33,18 @@ void ChannelAnalyzerPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(ChannelAnalyzerGUI::m_channelID, this); } -PluginInstanceGUI* ChannelAnalyzerPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* ChannelAnalyzerPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == ChannelAnalyzerGUI::m_channelID) { - ChannelAnalyzerGUI* gui = ChannelAnalyzerGUI::create(m_pluginAPI, deviceAPI); + ChannelAnalyzerGUI* gui = ChannelAnalyzerGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void ChannelAnalyzerPlugin::createInstanceChannelAnalyzer(DeviceSourceAPI *deviceAPI) +void ChannelAnalyzerPlugin::createInstanceChannelAnalyzer(DeviceUISet *deviceUISet) { - ChannelAnalyzerGUI::create(m_pluginAPI, deviceAPI); + ChannelAnalyzerGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/chanalyzer/chanalyzerplugin.h b/plugins/channelrx/chanalyzer/chanalyzerplugin.h index aa42c8edb..eaa7530f9 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerplugin.h +++ b/plugins/channelrx/chanalyzer/chanalyzerplugin.h @@ -4,7 +4,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class ChannelAnalyzerPlugin : public QObject, PluginInterface { Q_OBJECT @@ -17,7 +17,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -25,7 +25,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceChannelAnalyzer(DeviceSourceAPI *deviceAPI); + void createInstanceChannelAnalyzer(DeviceUISet *deviceUISet); }; #endif // INCLUDE_CHANALYZERPLUGIN_H diff --git a/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp b/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp index bd36d521f..255fec1d1 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp +++ b/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp @@ -1,582 +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 -#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, DeviceSourceAPI *deviceAPI) -{ - ChannelAnalyzerNGGUI* gui = new ChannelAnalyzerNGGUI(pluginAPI, deviceAPI); - 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, DeviceSourceAPI *deviceAPI, QWidget* parent) : - RollupWidget(parent), - ui(new Ui::ChannelAnalyzerNGGUI), - m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), - 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_deviceAPI); - 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_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->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_deviceAPI->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/chanalyzerng/chanalyzernggui.h b/plugins/channelrx/chanalyzerng/chanalyzernggui.h index 7ef686b66..1b71d1de1 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzernggui.h +++ b/plugins/channelrx/chanalyzerng/chanalyzernggui.h @@ -24,7 +24,7 @@ #include "util/messagequeue.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class ThreadedBasebandSampleSink; class DownChannelizer; @@ -41,7 +41,7 @@ class ChannelAnalyzerNGGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static ChannelAnalyzerNGGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static ChannelAnalyzerNGGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -75,7 +75,7 @@ private slots: private: Ui::ChannelAnalyzerNGGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; bool m_basicSettingsShown; bool m_doApplySettings; @@ -91,7 +91,7 @@ private: ScopeVisNG* m_scopeVis; MessageQueue m_inputMessageQueue; - explicit ChannelAnalyzerNGGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit ChannelAnalyzerNGGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~ChannelAnalyzerNGGUI(); int getRequestedChannelSampleRate(); diff --git a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp index 1ddff0440..0f7367cdc 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp +++ b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp @@ -22,7 +22,7 @@ const PluginDescriptor ChannelAnalyzerNGPlugin::m_pluginDescriptor = { QString("Channel Analyzer NG"), - QString("3.5.3"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -48,18 +48,18 @@ void ChannelAnalyzerNGPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(ChannelAnalyzerNGGUI::m_channelID, this); } -PluginInstanceGUI* ChannelAnalyzerNGPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* ChannelAnalyzerNGPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == ChannelAnalyzerNGGUI::m_channelID) { - ChannelAnalyzerNGGUI* gui = ChannelAnalyzerNGGUI::create(m_pluginAPI, deviceAPI); + ChannelAnalyzerNGGUI* gui = ChannelAnalyzerNGGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void ChannelAnalyzerNGPlugin::createInstanceChannelAnalyzer(DeviceSourceAPI *deviceAPI) +void ChannelAnalyzerNGPlugin::createInstanceChannelAnalyzer(DeviceUISet *deviceUISet) { - ChannelAnalyzerNGGUI::create(m_pluginAPI, deviceAPI); + ChannelAnalyzerNGGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h index 2f4597254..a673ce0db 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h +++ b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h @@ -21,7 +21,7 @@ #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class ChannelAnalyzerNGPlugin : public QObject, PluginInterface { Q_OBJECT @@ -34,7 +34,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -42,7 +42,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceChannelAnalyzer(DeviceSourceAPI *deviceAPI); + void createInstanceChannelAnalyzer(DeviceUISet *deviceUISet); }; #endif // INCLUDE_CHANALYZERNGPLUGIN_H diff --git a/plugins/channelrx/demodam/amdemodgui.cpp b/plugins/channelrx/demodam/amdemodgui.cpp index 94929d2d5..a4a836353 100644 --- a/plugins/channelrx/demodam/amdemodgui.cpp +++ b/plugins/channelrx/demodam/amdemodgui.cpp @@ -20,6 +20,7 @@ #include "amdemodgui.h" #include "device/devicesourceapi.h" +#include "device/deviceuiset.h" #include "dsp/downchannelizer.h" #include "dsp/threadedbasebandsamplesink.h" @@ -35,9 +36,9 @@ const QString AMDemodGUI::m_channelID = "de.maintech.sdrangelove.channel.am"; -AMDemodGUI* AMDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +AMDemodGUI* AMDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - AMDemodGUI* gui = new AMDemodGUI(pluginAPI, deviceAPI); + AMDemodGUI* gui = new AMDemodGUI(pluginAPI, deviceUISet); return gui; } @@ -169,11 +170,11 @@ void AMDemodGUI::onMenuDialogCalled(const QPoint &p) dialog.exec(); } -AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::AMDemodGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_doApplySettings(true), m_squelchOpen(false), @@ -184,7 +185,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); - m_amDemod = new AMDemod(m_deviceAPI); + m_amDemod = new AMDemod(m_deviceUISet->m_deviceSourceAPI); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms @@ -205,9 +206,9 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerRxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); displaySettings(); applySettings(true); @@ -215,7 +216,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget AMDemodGUI::~AMDemodGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_amDemod; delete ui; } diff --git a/plugins/channelrx/demodam/amdemodgui.h b/plugins/channelrx/demodam/amdemodgui.h index 0052c4839..32833328b 100644 --- a/plugins/channelrx/demodam/amdemodgui.h +++ b/plugins/channelrx/demodam/amdemodgui.h @@ -9,7 +9,7 @@ #include "amdemodsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class ThreadedBasebandSampleSink; class DownChannelizer; @@ -23,7 +23,7 @@ class AMDemodGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static AMDemodGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static AMDemodGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -55,7 +55,7 @@ private slots: private: Ui::AMDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; AMDemodSettings m_settings; bool m_doApplySettings; @@ -67,7 +67,7 @@ private: uint32_t m_tickCount; MessageQueue m_inputMessageQueue; - explicit AMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~AMDemodGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/demodam/amdemodplugin.cpp b/plugins/channelrx/demodam/amdemodplugin.cpp index bca6226f2..11a0166b4 100644 --- a/plugins/channelrx/demodam/amdemodplugin.cpp +++ b/plugins/channelrx/demodam/amdemodplugin.cpp @@ -7,7 +7,7 @@ const PluginDescriptor AMDemodPlugin::m_pluginDescriptor = { QString("AM Demodulator"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -33,18 +33,18 @@ void AMDemodPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(AMDemodGUI::m_channelID, this); } -PluginInstanceGUI* AMDemodPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* AMDemodPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == AMDemodGUI::m_channelID) { - AMDemodGUI* gui = AMDemodGUI::create(m_pluginAPI, deviceAPI); + AMDemodGUI* gui = AMDemodGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void AMDemodPlugin::createInstanceDemodAM(DeviceSourceAPI *deviceAPI) +void AMDemodPlugin::createInstanceDemodAM(DeviceUISet *deviceUISet) { - AMDemodGUI::create(m_pluginAPI, deviceAPI); + AMDemodGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demodam/amdemodplugin.h b/plugins/channelrx/demodam/amdemodplugin.h index 903c6d7c4..965bee725 100644 --- a/plugins/channelrx/demodam/amdemodplugin.h +++ b/plugins/channelrx/demodam/amdemodplugin.h @@ -20,7 +20,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class AMDemodPlugin : public QObject, PluginInterface { Q_OBJECT @@ -33,7 +33,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -41,7 +41,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceDemodAM(DeviceSourceAPI *deviceAPI); + void createInstanceDemodAM(DeviceUISet *deviceUISet); }; #endif // INCLUDE_AMPLUGIN_H diff --git a/plugins/channelrx/demodam/readme.md b/plugins/channelrx/demodam/readme.md index 310b437b4..7de066f4c 100644 --- a/plugins/channelrx/demodam/readme.md +++ b/plugins/channelrx/demodam/readme.md @@ -24,7 +24,7 @@ Use this button to toggle audio mute for this channel. The button will light up Copies audio output to UDP. Audio is set at fixed level and is muted by the mute button (13) and squelch (9) is also applied. Output is mono S16LE samples. -UDP address and send port are specified in the basic channel settings. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrbase/readme.md#6-channels) +UDP address and send port are specified in the basic channel settings. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrgui/readme.md#6-channels)

5: Level meter in dB

diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index 114cb6673..0b08215d4 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -21,6 +21,7 @@ #include "atvdemodgui.h" #include "device/devicesourceapi.h" +#include "device/deviceuiset.h" #include "dsp/downchannelizer.h" #include "dsp/threadedbasebandsamplesink.h" @@ -38,9 +39,9 @@ const QString ATVDemodGUI::m_strChannelID = "sdrangel.channel.demodatv"; ATVDemodGUI* ATVDemodGUI::create(PluginAPI* objPluginAPI, - DeviceSourceAPI *objDeviceAPI) + DeviceUISet *deviceUISet) { - ATVDemodGUI* gui = new ATVDemodGUI(objPluginAPI, objDeviceAPI); + ATVDemodGUI* gui = new ATVDemodGUI(objPluginAPI, deviceUISet); return gui; } @@ -266,12 +267,12 @@ void ATVDemodGUI::onMenuDoubleClicked() } } -ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, +ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, QWidget* objParent) : RollupWidget(objParent), ui(new Ui::ATVDemodGUI), m_pluginAPI(objPluginAPI), - m_deviceAPI(objDeviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_blnBasicSettingsShown(false), m_blnDoApplySettings(true), @@ -284,14 +285,14 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); m_scopeVis = new ScopeVisNG(ui->glScope); - m_atvDemod = new ATVDemod(m_deviceAPI); + m_atvDemod = new ATVDemod(m_deviceUISet->m_deviceSourceAPI); m_atvDemod->setScopeSink(m_scopeVis); m_atvDemod->setMessageQueueToGUI(getInputMessageQueue()); m_atvDemod->setATVScreen(ui->screenTV); m_channelizer = new DownChannelizer(m_atvDemod); m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this); - m_deviceAPI->addThreadedSink(m_threadedChannelizer); + m_deviceUISet->m_deviceSourceAPI->addThreadedSink(m_threadedChannelizer); ui->glScope->connectTimer(MainWindow::getInstance()->getMasterTimer()); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms @@ -312,9 +313,9 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged())); - m_deviceAPI->registerChannelInstance(m_strChannelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerRxChannelInstance(m_strChannelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); //ui->screenTV->connectTimer(m_objPluginAPI->getMainWindow()->getMasterTimer()); @@ -347,8 +348,8 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, ATVDemodGUI::~ATVDemodGUI() { - m_deviceAPI->removeChannelInstance(this); - m_deviceAPI->removeThreadedSink(m_threadedChannelizer); + m_deviceUISet->removeRxChannelInstance(this); + m_deviceUISet->m_deviceSourceAPI->removeThreadedSink(m_threadedChannelizer); delete m_threadedChannelizer; delete m_channelizer; delete m_atvDemod; diff --git a/plugins/channelrx/demodatv/atvdemodgui.h b/plugins/channelrx/demodatv/atvdemodgui.h index 917076294..c33d135c0 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.h +++ b/plugins/channelrx/demodatv/atvdemodgui.h @@ -25,7 +25,7 @@ #include "util/messagequeue.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class ThreadedBasebandSampleSink; class DownChannelizer; @@ -42,7 +42,7 @@ class ATVDemodGUI : public RollupWidget, public PluginInstanceGUI Q_OBJECT public: - static ATVDemodGUI* create(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI); + static ATVDemodGUI* create(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& strName); @@ -90,7 +90,7 @@ private slots: private: Ui::ATVDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; ThreadedBasebandSampleSink* m_threadedChannelizer; DownChannelizer* m_channelizer; @@ -109,7 +109,7 @@ private: int m_rfSliderDivisor; MessageQueue m_inputMessageQueue; - explicit ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI, QWidget* objParent = NULL); + explicit ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, QWidget* objParent = 0); virtual ~ATVDemodGUI(); void blockApplySettings(bool blnBlock); diff --git a/plugins/channelrx/demodatv/atvdemodplugin.cpp b/plugins/channelrx/demodatv/atvdemodplugin.cpp index 745f13921..a8d33335b 100644 --- a/plugins/channelrx/demodatv/atvdemodplugin.cpp +++ b/plugins/channelrx/demodatv/atvdemodplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor ATVDemodPlugin::m_ptrPluginDescriptor = { QString("ATV Demodulator"), - QString("3.7.3"), + QString("3.8.0"), QString("(c) F4HKW for F4EXB / SDRAngel"), QString("https://github.com/f4exb/sdrangel"), true, @@ -53,11 +53,11 @@ void ATVDemodPlugin::initPlugin(PluginAPI* ptrPluginAPI) m_ptrPluginAPI->registerRxChannel(ATVDemodGUI::m_strChannelID, this); } -PluginInstanceGUI* ATVDemodPlugin::createRxChannel(const QString& strChannelName, DeviceSourceAPI *ptrDeviceAPI) +PluginInstanceGUI* ATVDemodPlugin::createRxChannel(const QString& strChannelName, DeviceUISet *deviceUISet) { if(strChannelName == ATVDemodGUI::m_strChannelID) { - ATVDemodGUI* ptrGui = ATVDemodGUI::create(m_ptrPluginAPI, ptrDeviceAPI); + ATVDemodGUI* ptrGui = ATVDemodGUI::create(m_ptrPluginAPI, deviceUISet); return ptrGui; } else @@ -66,7 +66,7 @@ PluginInstanceGUI* ATVDemodPlugin::createRxChannel(const QString& strChannelName } } -void ATVDemodPlugin::createInstanceDemodATV(DeviceSourceAPI *ptrDeviceAPI) +void ATVDemodPlugin::createInstanceDemodATV(DeviceUISet *deviceUISet) { - ATVDemodGUI::create(m_ptrPluginAPI, ptrDeviceAPI); + ATVDemodGUI::create(m_ptrPluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demodatv/atvdemodplugin.h b/plugins/channelrx/demodatv/atvdemodplugin.h index 93f0e11d5..c6061eea0 100644 --- a/plugins/channelrx/demodatv/atvdemodplugin.h +++ b/plugins/channelrx/demodatv/atvdemodplugin.h @@ -21,7 +21,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class ATVDemodPlugin : public QObject, PluginInterface { @@ -35,7 +35,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* ptrPluginAPI); - PluginInstanceGUI* createRxChannel(const QString& strChannelName, DeviceSourceAPI *ptrDeviceAPI); + PluginInstanceGUI* createRxChannel(const QString& strChannelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_ptrPluginDescriptor; @@ -43,7 +43,7 @@ private: PluginAPI* m_ptrPluginAPI; private slots: - void createInstanceDemodATV(DeviceSourceAPI *ptrDeviceAPI); + void createInstanceDemodATV(DeviceUISet *deviceUISet); }; #endif // INCLUDE_ATVPLUGIN_H diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.cpp b/plugins/channelrx/demodbfm/bfmdemodgui.cpp index 36c5f6f55..0476f702f 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodgui.cpp @@ -18,6 +18,7 @@ #include "bfmdemodgui.h" #include +#include "device/deviceuiset.h" #include #include #include @@ -44,9 +45,9 @@ const QString BFMDemodGUI::m_channelID = "sdrangel.channel.bfm"; -BFMDemodGUI* BFMDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +BFMDemodGUI* BFMDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUIset) { - BFMDemodGUI* gui = new BFMDemodGUI(pluginAPI, deviceAPI); + BFMDemodGUI* gui = new BFMDemodGUI(pluginAPI, deviceUIset); return gui; } @@ -315,11 +316,11 @@ void BFMDemodGUI::onMenuDialogCalled(const QPoint &p) } } -BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::BFMDemodGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_rdsTimerCount(0), m_channelPowerDbAvg(20,0), @@ -337,7 +338,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_bfmDemod = new BFMDemod(m_deviceAPI); + m_bfmDemod = new BFMDemod(m_deviceUISet->m_deviceSourceAPI); m_bfmDemod->setMessageQueueToGUI(getInputMessageQueue()); m_bfmDemod->setSampleSink(m_spectrumVis); @@ -363,9 +364,9 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + 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); @@ -382,7 +383,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg BFMDemodGUI::~BFMDemodGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_bfmDemod; delete ui; } diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.h b/plugins/channelrx/demodbfm/bfmdemodgui.h index 5fa5584b2..5d83edd10 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.h +++ b/plugins/channelrx/demodbfm/bfmdemodgui.h @@ -26,7 +26,7 @@ #include "bfmdemodsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class RDSParser; class ThreadedBasebandSampleSink; @@ -42,7 +42,7 @@ class BFMDemodGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static BFMDemodGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static BFMDemodGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceAPI); virtual void destroy(); void setName(const QString& name); @@ -82,7 +82,7 @@ private slots: private: Ui::BFMDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; BFMDemodSettings m_settings; bool m_doApplySettings; @@ -96,7 +96,7 @@ private: std::vector m_g14ComboIndex; MessageQueue m_inputMessageQueue; - explicit BFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~BFMDemodGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/demodbfm/bfmplugin.cpp b/plugins/channelrx/demodbfm/bfmplugin.cpp index f9a26f61f..6b860a99f 100644 --- a/plugins/channelrx/demodbfm/bfmplugin.cpp +++ b/plugins/channelrx/demodbfm/bfmplugin.cpp @@ -24,7 +24,7 @@ const PluginDescriptor BFMPlugin::m_pluginDescriptor = { QString("Broadcast FM Demodulator"), - QString("3.7.5"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -50,18 +50,18 @@ void BFMPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(BFMDemodGUI::m_channelID, this); } -PluginInstanceGUI* BFMPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* BFMPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == BFMDemodGUI::m_channelID) { - BFMDemodGUI* gui = BFMDemodGUI::create(m_pluginAPI, deviceAPI); + BFMDemodGUI* gui = BFMDemodGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return 0; } } -void BFMPlugin::createInstanceBFM(DeviceSourceAPI *deviceAPI) +void BFMPlugin::createInstanceBFM(DeviceUISet *deviceUISet) { - BFMDemodGUI::create(m_pluginAPI, deviceAPI); + BFMDemodGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demodbfm/bfmplugin.h b/plugins/channelrx/demodbfm/bfmplugin.h index 6879eb197..1da550ee8 100644 --- a/plugins/channelrx/demodbfm/bfmplugin.h +++ b/plugins/channelrx/demodbfm/bfmplugin.h @@ -21,7 +21,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class BFMPlugin : public QObject, PluginInterface { Q_OBJECT @@ -34,7 +34,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -42,7 +42,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceBFM(DeviceSourceAPI *deviceAPI); + void createInstanceBFM(DeviceUISet *deviceUISet); }; #endif // INCLUDE_BFMPLUGIN_H diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index d8acd1828..16aa89359 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -18,6 +18,7 @@ #include "dsddemodgui.h" #include +#include "device/deviceuiset.h" #include #include #include @@ -39,9 +40,9 @@ const QString DSDDemodGUI::m_channelID = "sdrangel.channel.dsddemod"; -DSDDemodGUI* DSDDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +DSDDemodGUI* DSDDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - DSDDemodGUI* gui = new DSDDemodGUI(pluginAPI, deviceAPI); + DSDDemodGUI* gui = new DSDDemodGUI(pluginAPI, deviceUISet); return gui; } @@ -230,11 +231,11 @@ void DSDDemodGUI::onMenuDialogCalled(const QPoint &p) dialog.exec(); } -DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::DSDDemodGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_doApplySettings(true), m_signalFormat(signalFormatNone), @@ -253,7 +254,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); m_scopeVis = new ScopeVis(ui->glScope); - m_dsdDemod = new DSDDemod(m_deviceAPI); + m_dsdDemod = new DSDDemod(m_deviceUISet->m_deviceSourceAPI); m_dsdDemod->setScopeSink(m_scopeVis); m_dsdDemod->setMessageQueueToGUI(getInputMessageQueue()); @@ -280,9 +281,9 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerRxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope); @@ -297,7 +298,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg DSDDemodGUI::~DSDDemodGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_dsdDemod; delete ui; } diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index add6e5b83..46a9a7362 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -30,7 +30,7 @@ #include "dsddemodsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class ScopeVis; class DSDDemod; @@ -43,7 +43,7 @@ class DSDDemodGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static DSDDemodGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static DSDDemodGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -94,7 +94,7 @@ private: Ui::DSDDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; DSDDemodSettings m_settings; bool m_doApplySettings; @@ -118,7 +118,7 @@ private: MessageQueue m_inputMessageQueue; - explicit DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit DSDDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~DSDDemodGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/demoddsd/dsddemodplugin.cpp b/plugins/channelrx/demoddsd/dsddemodplugin.cpp index 2c1de0032..1f27653ae 100644 --- a/plugins/channelrx/demoddsd/dsddemodplugin.cpp +++ b/plugins/channelrx/demoddsd/dsddemodplugin.cpp @@ -15,16 +15,16 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include "../../channelrx/demoddsd/dsddemodplugin.h" +#include "dsddemodplugin.h" #include #include #include "plugin/pluginapi.h" -#include "../../channelrx/demoddsd/dsddemodgui.h" +#include "dsddemodgui.h" const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = { QString("DSD Demodulator"), - QString("3.7.3"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -50,18 +50,18 @@ void DSDDemodPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(DSDDemodGUI::m_channelID, this); } -PluginInstanceGUI* DSDDemodPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* DSDDemodPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == DSDDemodGUI::m_channelID) { - DSDDemodGUI* gui = DSDDemodGUI::create(m_pluginAPI, deviceAPI); + DSDDemodGUI* gui = DSDDemodGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void DSDDemodPlugin::createInstanceDSDDemod(DeviceSourceAPI *deviceAPI) +void DSDDemodPlugin::createInstanceDSDDemod(DeviceUISet *deviceUISet) { - DSDDemodGUI::create(m_pluginAPI, deviceAPI); + DSDDemodGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demoddsd/dsddemodplugin.h b/plugins/channelrx/demoddsd/dsddemodplugin.h index ee80b5033..fad614fe2 100644 --- a/plugins/channelrx/demoddsd/dsddemodplugin.h +++ b/plugins/channelrx/demoddsd/dsddemodplugin.h @@ -21,7 +21,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class DSDDemodPlugin : public QObject, PluginInterface { Q_OBJECT @@ -34,7 +34,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -42,7 +42,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceDSDDemod(DeviceSourceAPI *deviceAPI); + void createInstanceDSDDemod(DeviceUISet *deviceUISet); }; #endif // INCLUDE_DSDDEMODLUGIN_H diff --git a/plugins/channelrx/demoddsd/readme.md b/plugins/channelrx/demoddsd/readme.md index 6298f5a4f..20c16e781 100644 --- a/plugins/channelrx/demoddsd/readme.md +++ b/plugins/channelrx/demoddsd/readme.md @@ -189,7 +189,7 @@ Copies audio output to UDP. Output is stereo S16LE samples. Depending on which s It cannot mix both channels when slot1+2 are active. -UDP address and send port are specified in the basic channel settings. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrbase/readme.md#6-channels) +UDP address and send port are specified in the basic channel settings. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrgui/readme.md#6-channels)

20: Format specific status display

diff --git a/plugins/channelrx/demodlora/lorademodgui.cpp b/plugins/channelrx/demodlora/lorademodgui.cpp index 97c6c0d2d..9920453fd 100644 --- a/plugins/channelrx/demodlora/lorademodgui.cpp +++ b/plugins/channelrx/demodlora/lorademodgui.cpp @@ -1,5 +1,6 @@ #include +#include "device/deviceuiset.h" #include #include #include @@ -17,9 +18,9 @@ const QString LoRaDemodGUI::m_channelID = "de.maintech.sdrangelove.channel.lora"; -LoRaDemodGUI* LoRaDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +LoRaDemodGUI* LoRaDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - LoRaDemodGUI* gui = new LoRaDemodGUI(pluginAPI, deviceAPI); + LoRaDemodGUI* gui = new LoRaDemodGUI(pluginAPI, deviceUISet); return gui; } @@ -120,11 +121,11 @@ void LoRaDemodGUI::onMenuDoubleClicked() } } -LoRaDemodGUI::LoRaDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +LoRaDemodGUI::LoRaDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::LoRaDemodGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true) @@ -135,7 +136,7 @@ LoRaDemodGUI::LoRaDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWi connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_LoRaDemod = new LoRaDemod(m_deviceAPI); + m_LoRaDemod = new LoRaDemod(m_deviceUISet->m_deviceSourceAPI); m_LoRaDemod->setSpectrumSink(m_spectrumVis); ui->glSpectrum->setCenterFrequency(16000); @@ -152,9 +153,9 @@ LoRaDemodGUI::LoRaDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWi connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + 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); @@ -167,7 +168,7 @@ LoRaDemodGUI::LoRaDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWi LoRaDemodGUI::~LoRaDemodGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_LoRaDemod; delete m_spectrumVis; delete ui; diff --git a/plugins/channelrx/demodlora/lorademodgui.h b/plugins/channelrx/demodlora/lorademodgui.h index 812aedc86..343bbcd02 100644 --- a/plugins/channelrx/demodlora/lorademodgui.h +++ b/plugins/channelrx/demodlora/lorademodgui.h @@ -9,7 +9,7 @@ #include "lorademodsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class LoRaDemod; class SpectrumVis; @@ -21,7 +21,7 @@ class LoRaDemodGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static LoRaDemodGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static LoRaDemodGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceAPI); virtual void destroy(); void setName(const QString& name); @@ -47,7 +47,7 @@ private slots: private: Ui::LoRaDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; LoRaDemodSettings m_settings; bool m_basicSettingsShown; @@ -57,7 +57,7 @@ private: SpectrumVis* m_spectrumVis; MessageQueue m_inputMessageQueue; - explicit LoRaDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit LoRaDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = NULL); virtual ~LoRaDemodGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/demodlora/loraplugin.cpp b/plugins/channelrx/demodlora/loraplugin.cpp index 05760a0c8..67327edd3 100644 --- a/plugins/channelrx/demodlora/loraplugin.cpp +++ b/plugins/channelrx/demodlora/loraplugin.cpp @@ -6,7 +6,7 @@ const PluginDescriptor LoRaPlugin::m_pluginDescriptor = { QString("LoRa Demodulator"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) 2015 John Greb"), QString("http://www.maintech.de"), true, @@ -32,18 +32,18 @@ void LoRaPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(LoRaDemodGUI::m_channelID, this); } -PluginInstanceGUI* LoRaPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* LoRaPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == LoRaDemodGUI::m_channelID) { - LoRaDemodGUI* gui = LoRaDemodGUI::create(m_pluginAPI, deviceAPI); + LoRaDemodGUI* gui = LoRaDemodGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void LoRaPlugin::createInstanceLoRa(DeviceSourceAPI *deviceAPI) +void LoRaPlugin::createInstanceLoRa(DeviceUISet *deviceUISet) { - LoRaDemodGUI::create(m_pluginAPI, deviceAPI); + LoRaDemodGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demodlora/loraplugin.h b/plugins/channelrx/demodlora/loraplugin.h index 412419c10..f1c3bae91 100644 --- a/plugins/channelrx/demodlora/loraplugin.h +++ b/plugins/channelrx/demodlora/loraplugin.h @@ -4,7 +4,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class LoRaPlugin : public QObject, PluginInterface { Q_OBJECT @@ -17,7 +17,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -25,7 +25,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceLoRa(DeviceSourceAPI *deviceAPI); + void createInstanceLoRa(DeviceUISet *deviceUISet); }; #endif // INCLUDE_LoRaPLUGIN_H diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.cpp b/plugins/channelrx/demodnfm/nfmdemodgui.cpp index e07fb0ea1..e21a71430 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodgui.cpp @@ -1,6 +1,7 @@ #include "nfmdemodgui.h" #include +#include "device/deviceuiset.h" #include #include #include @@ -17,9 +18,9 @@ const QString NFMDemodGUI::m_channelID = "de.maintech.sdrangelove.channel.nfm"; -NFMDemodGUI* NFMDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +NFMDemodGUI* NFMDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - NFMDemodGUI* gui = new NFMDemodGUI(pluginAPI, deviceAPI); + NFMDemodGUI* gui = new NFMDemodGUI(pluginAPI, deviceUISet); return gui; } @@ -221,11 +222,11 @@ void NFMDemodGUI::onMenuDialogCalled(const QPoint &p) dialog.exec(); } -NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::NFMDemodGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), @@ -238,7 +239,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); - m_nfmDemod = new NFMDemod(m_deviceAPI); + m_nfmDemod = new NFMDemod(m_deviceUISet->m_deviceSourceAPI); m_nfmDemod->setMessageQueueToGUI(getInputMessageQueue()); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); @@ -283,9 +284,9 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerRxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); QChar delta = QChar(0x94, 0x03); ui->deltaSquelch->setText(delta); @@ -298,7 +299,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg NFMDemodGUI::~NFMDemodGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_nfmDemod; //delete m_channelMarker; delete ui; diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.h b/plugins/channelrx/demodnfm/nfmdemodgui.h index efa6e9c38..317ce2f4f 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.h +++ b/plugins/channelrx/demodnfm/nfmdemodgui.h @@ -11,7 +11,7 @@ #include "nfmdemodsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class NFMDemod; @@ -23,7 +23,7 @@ class NFMDemodGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static NFMDemodGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static NFMDemodGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -61,7 +61,7 @@ private slots: private: Ui::NFMDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; NFMDemodSettings m_settings; bool m_basicSettingsShown; @@ -72,7 +72,7 @@ private: uint32_t m_tickCount; MessageQueue m_inputMessageQueue; - explicit NFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit NFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~NFMDemodGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/demodnfm/nfmplugin.cpp b/plugins/channelrx/demodnfm/nfmplugin.cpp index 9dd6bb954..4b2369ec6 100644 --- a/plugins/channelrx/demodnfm/nfmplugin.cpp +++ b/plugins/channelrx/demodnfm/nfmplugin.cpp @@ -6,7 +6,7 @@ const PluginDescriptor NFMPlugin::m_pluginDescriptor = { QString("NFM Demodulator"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -32,17 +32,17 @@ void NFMPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(NFMDemodGUI::m_channelID, this); } -PluginInstanceGUI* NFMPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* NFMPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == NFMDemodGUI::m_channelID) { - NFMDemodGUI* gui = NFMDemodGUI::create(m_pluginAPI, deviceAPI); + NFMDemodGUI* gui = NFMDemodGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void NFMPlugin::createInstanceNFM(DeviceSourceAPI *deviceAPI) +void NFMPlugin::createInstanceNFM(DeviceUISet *deviceUISet) { - NFMDemodGUI::create(m_pluginAPI, deviceAPI); + NFMDemodGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demodnfm/nfmplugin.h b/plugins/channelrx/demodnfm/nfmplugin.h index 10eb6b131..47fce8787 100644 --- a/plugins/channelrx/demodnfm/nfmplugin.h +++ b/plugins/channelrx/demodnfm/nfmplugin.h @@ -4,7 +4,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class NFMPlugin : public QObject, PluginInterface { Q_OBJECT @@ -17,7 +17,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -25,7 +25,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceNFM(DeviceSourceAPI *deviceAPI); + void createInstanceNFM(DeviceUISet *deviceUISet); }; #endif // INCLUDE_NFMPLUGIN_H diff --git a/plugins/channelrx/demodnfm/readme.md b/plugins/channelrx/demodnfm/readme.md index a00d3f3f9..f160f5800 100644 --- a/plugins/channelrx/demodnfm/readme.md +++ b/plugins/channelrx/demodnfm/readme.md @@ -66,4 +66,4 @@ Use this button to toggle audio mute for this channel. The button will light up Copies audio output to UDP. Audio is set at fixed level and is muted by the mute button (13) and squelch is also applied. Output is mono S16LE samples. Note that fixed volume apart this is the exact same audio that is sent to the audio device in particular it is highpass filtered at 300 Hz and thus is not suitable for digital communications. For this purpose you have to use the UDP source plugin instead. -UDP address and send port are specified in the basic channel settings. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrbase/readme.md#6-channels) \ No newline at end of file +UDP address and send port are specified in the basic channel settings. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrgui/readme.md#6-channels) \ No newline at end of file diff --git a/plugins/channelrx/demodssb/ssbdemodgui.cpp b/plugins/channelrx/demodssb/ssbdemodgui.cpp index b053591a6..1dbaf83ff 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.cpp +++ b/plugins/channelrx/demodssb/ssbdemodgui.cpp @@ -2,6 +2,7 @@ #include "ssbdemodgui.h" #include +#include "device/deviceuiset.h" #include #include @@ -18,9 +19,9 @@ const QString SSBDemodGUI::m_channelID = "de.maintech.sdrangelove.channel.ssb"; -SSBDemodGUI* SSBDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +SSBDemodGUI* SSBDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - SSBDemodGUI* gui = new SSBDemodGUI(pluginAPI, deviceAPI); + SSBDemodGUI* gui = new SSBDemodGUI(pluginAPI, deviceUISet); return gui; } @@ -286,11 +287,11 @@ void SSBDemodGUI::onMenuDoubleClicked() } } -SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::SSBDemodGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), @@ -308,7 +309,7 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_ssbDemod = new SSBDemod(m_deviceAPI); + m_ssbDemod = new SSBDemod(m_deviceUISet->m_deviceSourceAPI); m_ssbDemod->setMessageQueueToGUI(getInputMessageQueue()); m_ssbDemod->setSampleSink(m_spectrumVis); @@ -330,9 +331,9 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + 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); @@ -343,7 +344,7 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg SSBDemodGUI::~SSBDemodGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_ssbDemod; delete m_spectrumVis; delete ui; diff --git a/plugins/channelrx/demodssb/ssbdemodgui.h b/plugins/channelrx/demodssb/ssbdemodgui.h index d81238663..d3c42aa47 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.h +++ b/plugins/channelrx/demodssb/ssbdemodgui.h @@ -9,7 +9,7 @@ #include "ssbdemodsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class AudioFifo; class SSBDemod; @@ -23,7 +23,7 @@ class SSBDemodGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static SSBDemodGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static SSBDemodGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -62,7 +62,7 @@ private slots: private: Ui::SSBDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; SSBDemodSettings m_settings; bool m_basicSettingsShown; @@ -80,7 +80,7 @@ private: SpectrumVis* m_spectrumVis; MessageQueue m_inputMessageQueue; - explicit SSBDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI* deviceAPI, QWidget* parent = NULL); + explicit SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet* deviceUISet, QWidget* parent = 0); virtual ~SSBDemodGUI(); int getEffectiveLowCutoff(int lowCutoff); diff --git a/plugins/channelrx/demodssb/ssbplugin.cpp b/plugins/channelrx/demodssb/ssbplugin.cpp index 3373cdc03..a5f668015 100644 --- a/plugins/channelrx/demodssb/ssbplugin.cpp +++ b/plugins/channelrx/demodssb/ssbplugin.cpp @@ -1,13 +1,13 @@ -#include "../../channelrx/demodssb/ssbplugin.h" +#include "ssbplugin.h" #include #include #include "plugin/pluginapi.h" -#include "../../channelrx/demodssb/ssbdemodgui.h" +#include "ssbdemodgui.h" const PluginDescriptor SSBPlugin::m_pluginDescriptor = { QString("SSB Demodulator"), - QString("3.7.3"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -33,18 +33,18 @@ void SSBPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(SSBDemodGUI::m_channelID, this); } -PluginInstanceGUI* SSBPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* SSBPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == SSBDemodGUI::m_channelID) { - SSBDemodGUI* gui = SSBDemodGUI::create(m_pluginAPI, deviceAPI); + SSBDemodGUI* gui = SSBDemodGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void SSBPlugin::createInstanceSSB(DeviceSourceAPI *deviceAPI) +void SSBPlugin::createInstanceSSB(DeviceUISet *deviceUISet) { - SSBDemodGUI::create(m_pluginAPI, deviceAPI); + SSBDemodGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demodssb/ssbplugin.h b/plugins/channelrx/demodssb/ssbplugin.h index e87d6c03e..809ae630d 100644 --- a/plugins/channelrx/demodssb/ssbplugin.h +++ b/plugins/channelrx/demodssb/ssbplugin.h @@ -4,7 +4,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class SSBPlugin : public QObject, PluginInterface { Q_OBJECT @@ -17,7 +17,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -25,7 +25,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceSSB(DeviceSourceAPI *deviceAPI); + void createInstanceSSB(DeviceUISet *deviceUISet); }; #endif // INCLUDE_SSBPLUGIN_H diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.cpp b/plugins/channelrx/demodwfm/wfmdemodgui.cpp index e6a8e8865..144e2c5b2 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodgui.cpp @@ -1,6 +1,7 @@ #include "wfmdemodgui.h" #include +#include "device/deviceuiset.h" #include #include #include @@ -19,9 +20,9 @@ const QString WFMDemodGUI::m_channelID = "de.maintech.sdrangelove.channel.wfm"; -WFMDemodGUI* WFMDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +WFMDemodGUI* WFMDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - WFMDemodGUI* gui = new WFMDemodGUI(pluginAPI, deviceAPI); + WFMDemodGUI* gui = new WFMDemodGUI(pluginAPI, deviceUISet); return gui; } @@ -143,11 +144,11 @@ void WFMDemodGUI::onMenuDialogCalled(const QPoint &p) dialog.exec(); } -WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::WFMDemodGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_channelPowerDbAvg(20,0) @@ -171,7 +172,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); - m_wfmDemod = new WFMDemod(m_deviceAPI); + m_wfmDemod = new WFMDemod(m_deviceUISet->m_deviceSourceAPI); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); @@ -184,9 +185,9 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerRxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); m_settings.setChannelMarker(&m_channelMarker); @@ -196,7 +197,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg WFMDemodGUI::~WFMDemodGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_wfmDemod; //delete m_channelMarker; delete ui; diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.h b/plugins/channelrx/demodwfm/wfmdemodgui.h index 45fd53e23..ac6379066 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.h +++ b/plugins/channelrx/demodwfm/wfmdemodgui.h @@ -10,7 +10,7 @@ #include "wfmdemodsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class WFMDemod; @@ -22,7 +22,7 @@ class WFMDemodGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static WFMDemodGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static WFMDemodGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -53,7 +53,7 @@ private slots: private: Ui::WFMDemodGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; WFMDemodSettings m_settings; bool m_basicSettingsShown; @@ -65,7 +65,7 @@ private: MovingAverage m_channelPowerDbAvg; MessageQueue m_inputMessageQueue; - explicit WFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~WFMDemodGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/demodwfm/wfmplugin.cpp b/plugins/channelrx/demodwfm/wfmplugin.cpp index cb647dade..0381cf013 100644 --- a/plugins/channelrx/demodwfm/wfmplugin.cpp +++ b/plugins/channelrx/demodwfm/wfmplugin.cpp @@ -7,7 +7,7 @@ const PluginDescriptor WFMPlugin::m_pluginDescriptor = { QString("WFM Demodulator"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -33,18 +33,18 @@ void WFMPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(WFMDemodGUI::m_channelID, this); } -PluginInstanceGUI* WFMPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* WFMPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == WFMDemodGUI::m_channelID) { - WFMDemodGUI* gui = WFMDemodGUI::create(m_pluginAPI, deviceAPI); + WFMDemodGUI* gui = WFMDemodGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return NULL; } } -void WFMPlugin::createInstanceWFM(DeviceSourceAPI *deviceAPI) +void WFMPlugin::createInstanceWFM(DeviceUISet *deviceUISet) { - WFMDemodGUI::create(m_pluginAPI, deviceAPI); + WFMDemodGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channelrx/demodwfm/wfmplugin.h b/plugins/channelrx/demodwfm/wfmplugin.h index 51cfc52ef..a93b36473 100644 --- a/plugins/channelrx/demodwfm/wfmplugin.h +++ b/plugins/channelrx/demodwfm/wfmplugin.h @@ -4,7 +4,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class WFMPlugin : public QObject, PluginInterface { Q_OBJECT @@ -17,7 +17,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -25,7 +25,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceWFM(DeviceSourceAPI *deviceAPI); + void createInstanceWFM(DeviceUISet *deviceUISet); }; #endif // INCLUDE_WFMPLUGIN_H diff --git a/plugins/channelrx/tcpsrc/tcpsrcgui.cpp b/plugins/channelrx/tcpsrc/tcpsrcgui.cpp index 8d721bf5a..8965e911f 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcgui.cpp +++ b/plugins/channelrx/tcpsrc/tcpsrcgui.cpp @@ -1,6 +1,7 @@ #include "tcpsrcgui.h" #include +#include "device/deviceuiset.h" #include "plugin/pluginapi.h" #include "dsp/spectrumvis.h" #include "dsp/dspengine.h" @@ -13,9 +14,9 @@ const QString TCPSrcGUI::m_channelID = "sdrangel.channel.tcpsrc"; -TCPSrcGUI* TCPSrcGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +TCPSrcGUI* TCPSrcGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - TCPSrcGUI* gui = new TCPSrcGUI(pluginAPI, deviceAPI); + TCPSrcGUI* gui = new TCPSrcGUI(pluginAPI, deviceUISet); return gui; } @@ -121,11 +122,11 @@ void TCPSrcGUI::tick() ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1)); } -TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::TCPSrcGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_tcpSrc(0), m_channelMarker(this), m_channelPowerDbAvg(40,0), @@ -140,7 +141,7 @@ TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* setAttribute(Qt::WA_DeleteOnClose, true); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_tcpSrc = new TCPSrc(m_deviceAPI); + m_tcpSrc = new TCPSrc(m_deviceUISet->m_deviceSourceAPI); m_tcpSrc->setSpectrum(m_spectrumVis); ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03))); @@ -164,9 +165,9 @@ TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + 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); @@ -178,7 +179,7 @@ TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* TCPSrcGUI::~TCPSrcGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_tcpSrc; delete m_spectrumVis; delete ui; diff --git a/plugins/channelrx/tcpsrc/tcpsrcgui.h b/plugins/channelrx/tcpsrc/tcpsrcgui.h index b75e608a2..a4697732d 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcgui.h +++ b/plugins/channelrx/tcpsrc/tcpsrcgui.h @@ -13,7 +13,7 @@ #include "tcpsrcsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class TCPSrc; class SpectrumVis; @@ -25,7 +25,7 @@ class TCPSrcGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static TCPSrcGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static TCPSrcGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -57,7 +57,7 @@ private slots: private: Ui::TCPSrcGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; TCPSrc* m_tcpSrc; ChannelMarker m_channelMarker; MovingAverage m_channelPowerDbAvg; @@ -77,7 +77,7 @@ private: SpectrumVis* m_spectrumVis; MessageQueue m_inputMessageQueue; - explicit TCPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = 0); + explicit TCPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~TCPSrcGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp b/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp index 69cb001e8..8e0ba9f34 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp +++ b/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp @@ -1,13 +1,13 @@ -#include "../../channelrx/tcpsrc/tcpsrcplugin.h" +#include "tcpsrcplugin.h" #include #include "plugin/pluginapi.h" -#include "../../channelrx/tcpsrc/tcpsrcgui.h" +#include "tcpsrcgui.h" const PluginDescriptor TCPSrcPlugin::m_pluginDescriptor = { QString("TCP Channel Source"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -33,11 +33,11 @@ void TCPSrcPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(TCPSrcGUI::m_channelID, this); } -PluginInstanceGUI* TCPSrcPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* TCPSrcPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == TCPSrcGUI::m_channelID) { - TCPSrcGUI* gui = TCPSrcGUI::create(m_pluginAPI, deviceAPI); + TCPSrcGUI* gui = TCPSrcGUI::create(m_pluginAPI, deviceUISet); // deviceAPI->registerChannelInstance("sdrangel.channel.tcpsrc", gui); // m_pluginAPI->addChannelRollup(gui); return gui; @@ -46,9 +46,9 @@ PluginInstanceGUI* TCPSrcPlugin::createRxChannel(const QString& channelName, Dev } } -void TCPSrcPlugin::createInstanceTCPSrc(DeviceSourceAPI *deviceAPI) +void TCPSrcPlugin::createInstanceTCPSrc(DeviceUISet *deviceUISet) { - TCPSrcGUI::create(m_pluginAPI, deviceAPI); + TCPSrcGUI::create(m_pluginAPI, deviceUISet); // deviceAPI->registerChannelInstance("sdrangel.channel.tcpsrc", gui); // m_pluginAPI->addChannelRollup(gui); } diff --git a/plugins/channelrx/tcpsrc/tcpsrcplugin.h b/plugins/channelrx/tcpsrc/tcpsrcplugin.h index a48356ba4..5650f7051 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcplugin.h +++ b/plugins/channelrx/tcpsrc/tcpsrcplugin.h @@ -4,7 +4,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class TCPSrcPlugin : public QObject, PluginInterface { Q_OBJECT @@ -17,7 +17,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -25,7 +25,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceTCPSrc(DeviceSourceAPI *deviceAPI); + void createInstanceTCPSrc(DeviceUISet *deviceUISet); }; #endif // INCLUDE_TCPSRCPLUGIN_H diff --git a/plugins/channelrx/udpsrc/readme.md b/plugins/channelrx/udpsrc/readme.md index 1776c31f2..3515b5352 100644 --- a/plugins/channelrx/udpsrc/readme.md +++ b/plugins/channelrx/udpsrc/readme.md @@ -28,7 +28,7 @@ Total power in dB relative to a +/- 1.0 amplitude signal sent over UDP.

4: UDP address and ports

-These parameters are set with the basic channel settings dialog. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrbase/readme.md#6-channels) +These parameters are set with the basic channel settings dialog. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrgui/readme.md#6-channels) The display is in the format `address:audio port/data port` diff --git a/plugins/channelrx/udpsrc/udpsrcgui.cpp b/plugins/channelrx/udpsrc/udpsrcgui.cpp index 9c1e391fe..9141cdd82 100644 --- a/plugins/channelrx/udpsrc/udpsrcgui.cpp +++ b/plugins/channelrx/udpsrc/udpsrcgui.cpp @@ -18,6 +18,7 @@ #include "udpsrcgui.h" #include "device/devicesourceapi.h" +#include "device/deviceuiset.h" #include "plugin/pluginapi.h" #include "dsp/spectrumvis.h" #include "dsp/dspengine.h" @@ -31,9 +32,9 @@ const QString UDPSrcGUI::m_channelID = "sdrangel.channel.udpsrc"; -UDPSrcGUI* UDPSrcGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) +UDPSrcGUI* UDPSrcGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - UDPSrcGUI* gui = new UDPSrcGUI(pluginAPI, deviceAPI); + UDPSrcGUI* gui = new UDPSrcGUI(pluginAPI, deviceUISet); return gui; } @@ -131,11 +132,11 @@ void UDPSrcGUI::tick() m_tickCount++; } -UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent) : +UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::UDPSrcGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_udpSrc(0), m_channelMarker(this), m_channelPowerAvg(4, 1e-10), @@ -150,7 +151,7 @@ UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* setAttribute(Qt::WA_DeleteOnClose, true); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_udpSrc = new UDPSrc(m_deviceAPI); + m_udpSrc = new UDPSrc(m_deviceUISet->m_deviceSourceAPI); m_udpSrc->setSpectrum(m_spectrumVis); ui->fmDeviation->setEnabled(false); @@ -184,9 +185,9 @@ UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + 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); @@ -197,7 +198,7 @@ UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* UDPSrcGUI::~UDPSrcGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_udpSrc; delete m_spectrumVis; delete ui; diff --git a/plugins/channelrx/udpsrc/udpsrcgui.h b/plugins/channelrx/udpsrc/udpsrcgui.h index f32637592..63ad4e994 100644 --- a/plugins/channelrx/udpsrc/udpsrcgui.h +++ b/plugins/channelrx/udpsrc/udpsrcgui.h @@ -29,7 +29,7 @@ #include "udpsrcsettings.h" class PluginAPI; -class DeviceSourceAPI; +class DeviceUISet; class UDPSrc; class SpectrumVis; @@ -41,7 +41,7 @@ class UDPSrcGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static UDPSrcGUI* create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI); + static UDPSrcGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -79,7 +79,7 @@ private slots: private: Ui::UDPSrcGUI* ui; PluginAPI* m_pluginAPI; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; UDPSrc* m_udpSrc; UDPSrcSettings m_settings; ChannelMarker m_channelMarker; @@ -95,7 +95,7 @@ private: // RF path SpectrumVis* m_spectrumVis; - explicit UDPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget* parent = 0); + explicit UDPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~UDPSrcGUI(); void blockApplySettings(bool block); diff --git a/plugins/channelrx/udpsrc/udpsrcplugin.cpp b/plugins/channelrx/udpsrc/udpsrcplugin.cpp index 4afcf94e4..4dd5818d7 100644 --- a/plugins/channelrx/udpsrc/udpsrcplugin.cpp +++ b/plugins/channelrx/udpsrc/udpsrcplugin.cpp @@ -24,7 +24,7 @@ const PluginDescriptor UDPSrcPlugin::m_pluginDescriptor = { QString("UDP Channel Source"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -50,11 +50,11 @@ void UDPSrcPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerRxChannel(UDPSrcGUI::m_channelID, this); } -PluginInstanceGUI* UDPSrcPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* UDPSrcPlugin::createRxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == UDPSrcGUI::m_channelID) { - UDPSrcGUI* gui = UDPSrcGUI::create(m_pluginAPI, deviceAPI); + UDPSrcGUI* gui = UDPSrcGUI::create(m_pluginAPI, deviceUISet); // deviceAPI->registerChannelInstance("sdrangel.channel.udpsrc", gui); // m_pluginAPI->addChannelRollup(gui); return gui; @@ -63,9 +63,9 @@ PluginInstanceGUI* UDPSrcPlugin::createRxChannel(const QString& channelName, Dev } } -void UDPSrcPlugin::createInstanceUDPSrc(DeviceSourceAPI *deviceAPI) +void UDPSrcPlugin::createInstanceUDPSrc(DeviceUISet *deviceUISet) { - UDPSrcGUI::create(m_pluginAPI, deviceAPI); + UDPSrcGUI::create(m_pluginAPI, deviceUISet); // deviceAPI->registerChannelInstance("sdrangel.channel.udpsrc", gui); // m_pluginAPI->addChannelRollup(gui); } diff --git a/plugins/channelrx/udpsrc/udpsrcplugin.h b/plugins/channelrx/udpsrc/udpsrcplugin.h index 798ecbd9c..2460854e9 100644 --- a/plugins/channelrx/udpsrc/udpsrcplugin.h +++ b/plugins/channelrx/udpsrc/udpsrcplugin.h @@ -21,7 +21,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSourceAPI; +class DeviceUISet; class UDPSrcPlugin : public QObject, PluginInterface { Q_OBJECT @@ -34,7 +34,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + PluginInstanceGUI* createRxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -42,7 +42,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceUDPSrc(DeviceSourceAPI *deviceAPI); + void createInstanceUDPSrc(DeviceUISet *deviceUISet); }; #endif // INCLUDE_UDPSRCPLUGIN_H diff --git a/plugins/channeltx/modam/ammodgui.cpp b/plugins/channeltx/modam/ammodgui.cpp index 2eab227a0..576ca5123 100644 --- a/plugins/channeltx/modam/ammodgui.cpp +++ b/plugins/channeltx/modam/ammodgui.cpp @@ -23,6 +23,7 @@ #include "ammodgui.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "dsp/upchannelizer.h" #include "ui_ammodgui.h" @@ -35,9 +36,9 @@ const QString AMModGUI::m_channelID = "sdrangel.channeltx.modam"; -AMModGUI* AMModGUI::create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI) +AMModGUI* AMModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - AMModGUI* gui = new AMModGUI(pluginAPI, deviceAPI); + AMModGUI* gui = new AMModGUI(pluginAPI, deviceUISet); return gui; } @@ -267,11 +268,11 @@ void AMModGUI::onMenuDoubleClicked() } } -AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent) : +AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::AMModGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), @@ -288,7 +289,7 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pare connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); - m_amMod = new AMMod(m_deviceAPI); + m_amMod = new AMMod(m_deviceUISet->m_deviceSinkAPI); m_amMod->setMessageQueueToGUI(getInputMessageQueue()); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); @@ -305,9 +306,9 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pare connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerTxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); ui->play->setEnabled(false); ui->play->setChecked(false); @@ -326,7 +327,7 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pare AMModGUI::~AMModGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeTxChannelInstance(this); delete m_amMod; delete ui; } diff --git a/plugins/channeltx/modam/ammodgui.h b/plugins/channeltx/modam/ammodgui.h index 73f79da94..4d148ee6e 100644 --- a/plugins/channeltx/modam/ammodgui.h +++ b/plugins/channeltx/modam/ammodgui.h @@ -27,7 +27,7 @@ #include "ammodsettings.h" class PluginAPI; -class DeviceSinkAPI; +class DeviceUISet; class AMMod; @@ -39,7 +39,7 @@ class AMModGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static AMModGUI* create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI); + static AMModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -83,7 +83,7 @@ private slots: private: Ui::AMModGUI* ui; PluginAPI* m_pluginAPI; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; AMModSettings m_settings; bool m_basicSettingsShown; @@ -101,7 +101,7 @@ private: AMMod::AMModInputAF m_modAFInput; MessageQueue m_inputMessageQueue; - explicit AMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~AMModGUI(); void blockApplySettings(bool block); diff --git a/plugins/channeltx/modam/ammodplugin.cpp b/plugins/channeltx/modam/ammodplugin.cpp index 2846d34c6..616ecf826 100644 --- a/plugins/channeltx/modam/ammodplugin.cpp +++ b/plugins/channeltx/modam/ammodplugin.cpp @@ -23,7 +23,7 @@ const PluginDescriptor AMModPlugin::m_pluginDescriptor = { QString("AM Modulator"), - QString("3.5.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -49,18 +49,18 @@ void AMModPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerTxChannel(AMModGUI::m_channelID, this); } -PluginInstanceGUI* AMModPlugin::createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* AMModPlugin::createTxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == AMModGUI::m_channelID) { - AMModGUI* gui = AMModGUI::create(m_pluginAPI, deviceAPI); + AMModGUI* gui = AMModGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return 0; } } -void AMModPlugin::createInstanceModAM(DeviceSinkAPI *deviceAPI) +void AMModPlugin::createInstanceModAM(DeviceUISet *deviceUISet) { - AMModGUI::create(m_pluginAPI, deviceAPI); + AMModGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channeltx/modam/ammodplugin.h b/plugins/channeltx/modam/ammodplugin.h index ce74622b7..5a795abc8 100644 --- a/plugins/channeltx/modam/ammodplugin.h +++ b/plugins/channeltx/modam/ammodplugin.h @@ -20,7 +20,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSinkAPI; +class DeviceUISet; class AMModPlugin : public QObject, PluginInterface { Q_OBJECT @@ -28,12 +28,12 @@ class AMModPlugin : public QObject, PluginInterface { Q_PLUGIN_METADATA(IID "sdrangel.channeltx.ammod") public: - explicit AMModPlugin(QObject* parent = NULL); + explicit AMModPlugin(QObject* parent = 0); const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -41,7 +41,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceModAM(DeviceSinkAPI *deviceAPI); + void createInstanceModAM(DeviceUISet *deviceUISet); }; #endif // INCLUDE_AMMODPLUGIN_H diff --git a/plugins/channeltx/modatv/atvmodgui.cpp b/plugins/channeltx/modatv/atvmodgui.cpp index 33cf98319..3e15e11a9 100644 --- a/plugins/channeltx/modatv/atvmodgui.cpp +++ b/plugins/channeltx/modatv/atvmodgui.cpp @@ -24,6 +24,7 @@ #include #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "plugin/pluginapi.h" #include "util/simpleserializer.h" #include "gui/basicchannelsettingswidget.h" @@ -36,9 +37,9 @@ const QString ATVModGUI::m_channelID = "sdrangel.channeltx.modatv"; -ATVModGUI* ATVModGUI::create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI) +ATVModGUI* ATVModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - ATVModGUI* gui = new ATVModGUI(pluginAPI, deviceAPI); + ATVModGUI* gui = new ATVModGUI(pluginAPI, deviceUISet); return gui; } @@ -586,11 +587,11 @@ void ATVModGUI::onMenuDoubleClicked() } } -ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent) : +ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::ATVModGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), @@ -608,7 +609,7 @@ ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); - m_atvMod = new ATVMod(m_deviceAPI); + m_atvMod = new ATVMod(m_deviceUISet->m_deviceSinkAPI); m_atvMod->setMessageQueueToGUI(getInputMessageQueue()); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); @@ -624,9 +625,9 @@ ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerTxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); resetToDefaults(); @@ -649,7 +650,7 @@ ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa ATVModGUI::~ATVModGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeTxChannelInstance(this); delete m_atvMod; delete ui; } diff --git a/plugins/channeltx/modatv/atvmodgui.h b/plugins/channeltx/modatv/atvmodgui.h index 1158278ab..75b969181 100644 --- a/plugins/channeltx/modatv/atvmodgui.h +++ b/plugins/channeltx/modatv/atvmodgui.h @@ -27,7 +27,7 @@ #include "atvmodsettings.h" class PluginAPI; -class DeviceSinkAPI; +class DeviceUISet; class ATVMod; class QMessageBox; @@ -40,7 +40,7 @@ class ATVModGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static ATVModGUI* create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI); + static ATVModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -99,7 +99,7 @@ private slots: private: Ui::ATVModGUI* ui; PluginAPI* m_pluginAPI; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; ATVModSettings m_settings; bool m_basicSettingsShown; @@ -119,7 +119,7 @@ private: int m_rfSliderDivisor; MessageQueue m_inputMessageQueue; - explicit ATVModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit ATVModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~ATVModGUI(); void blockApplySettings(bool block); diff --git a/plugins/channeltx/modatv/atvmodplugin.cpp b/plugins/channeltx/modatv/atvmodplugin.cpp index b007e961c..107948411 100644 --- a/plugins/channeltx/modatv/atvmodplugin.cpp +++ b/plugins/channeltx/modatv/atvmodplugin.cpp @@ -23,7 +23,7 @@ const PluginDescriptor ATVModPlugin::m_pluginDescriptor = { QString("ATV Modulator"), - QString("3.7.5"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -49,20 +49,20 @@ void ATVModPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerTxChannel(ATVModGUI::m_channelID, this); } -PluginInstanceGUI* ATVModPlugin::createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* ATVModPlugin::createTxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == ATVModGUI::m_channelID) { - ATVModGUI* gui = ATVModGUI::create(m_pluginAPI, deviceAPI); + ATVModGUI* gui = ATVModGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return 0; } } -void ATVModPlugin::createInstanceModATV(DeviceSinkAPI *deviceAPI) +void ATVModPlugin::createInstanceModATV(DeviceUISet *deviceUISet) { - ATVModGUI::create(m_pluginAPI, deviceAPI); + ATVModGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channeltx/modatv/atvmodplugin.h b/plugins/channeltx/modatv/atvmodplugin.h index 6061dbd26..76b561699 100644 --- a/plugins/channeltx/modatv/atvmodplugin.h +++ b/plugins/channeltx/modatv/atvmodplugin.h @@ -28,12 +28,12 @@ class ATVModPlugin : public QObject, PluginInterface { Q_PLUGIN_METADATA(IID "sdrangel.channeltx.atvmod") public: - explicit ATVModPlugin(QObject* parent = NULL); + explicit ATVModPlugin(QObject* parent = 0); const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -41,7 +41,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceModATV(DeviceSinkAPI *deviceAPI); + void createInstanceModATV(DeviceUISet *deviceUISet); }; #endif /* PLUGINS_CHANNELTX_MODATV_ATVMODPLUGIN_H_ */ diff --git a/plugins/channeltx/modnfm/nfmmodgui.cpp b/plugins/channeltx/modnfm/nfmmodgui.cpp index a6ec2a9f7..720ac8c44 100644 --- a/plugins/channeltx/modnfm/nfmmodgui.cpp +++ b/plugins/channeltx/modnfm/nfmmodgui.cpp @@ -21,6 +21,7 @@ #include #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "plugin/pluginapi.h" #include "util/simpleserializer.h" #include "util/db.h" @@ -34,9 +35,9 @@ const QString NFMModGUI::m_channelID = "sdrangel.channeltx.modnfm"; -NFMModGUI* NFMModGUI::create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI) +NFMModGUI* NFMModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - NFMModGUI* gui = new NFMModGUI(pluginAPI, deviceAPI); + NFMModGUI* gui = new NFMModGUI(pluginAPI, deviceUISet); return gui; } @@ -284,11 +285,11 @@ void NFMModGUI::onMenuDoubleClicked() } } -NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent) : +NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::NFMModGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), @@ -316,7 +317,7 @@ NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); - m_nfmMod = new NFMMod(m_deviceAPI); + m_nfmMod = new NFMMod(m_deviceUISet->m_deviceSinkAPI); m_nfmMod->setMessageQueueToGUI(getInputMessageQueue()); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); @@ -330,9 +331,9 @@ NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerTxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); ui->play->setEnabled(false); ui->play->setChecked(false); @@ -358,7 +359,7 @@ NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa NFMModGUI::~NFMModGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeTxChannelInstance(this); delete m_nfmMod; delete ui; } diff --git a/plugins/channeltx/modnfm/nfmmodgui.h b/plugins/channeltx/modnfm/nfmmodgui.h index e0fb2829d..c58fb84ea 100644 --- a/plugins/channeltx/modnfm/nfmmodgui.h +++ b/plugins/channeltx/modnfm/nfmmodgui.h @@ -27,7 +27,7 @@ #include "nfmmodsettings.h" class PluginAPI; -class DeviceSinkAPI; +class DeviceUISet; class NFMMod; namespace Ui { @@ -38,7 +38,7 @@ class NFMModGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static NFMModGUI* create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI); + static NFMModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -86,7 +86,7 @@ private slots: private: Ui::NFMModGUI* ui; PluginAPI* m_pluginAPI; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; NFMModSettings m_settings; bool m_basicSettingsShown; @@ -104,7 +104,7 @@ private: NFMMod::NFMModInputAF m_modAFInput; MessageQueue m_inputMessageQueue; - explicit NFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit NFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~NFMModGUI(); void blockApplySettings(bool block); diff --git a/plugins/channeltx/modnfm/nfmmodplugin.cpp b/plugins/channeltx/modnfm/nfmmodplugin.cpp index 4d9aa9cc2..4fe27d9af 100644 --- a/plugins/channeltx/modnfm/nfmmodplugin.cpp +++ b/plugins/channeltx/modnfm/nfmmodplugin.cpp @@ -23,7 +23,7 @@ const PluginDescriptor NFMModPlugin::m_pluginDescriptor = { QString("NFM Modulator"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -49,18 +49,18 @@ void NFMModPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerTxChannel(NFMModGUI::m_channelID, this); } -PluginInstanceGUI* NFMModPlugin::createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* NFMModPlugin::createTxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == NFMModGUI::m_channelID) { - NFMModGUI* gui = NFMModGUI::create(m_pluginAPI, deviceAPI); + NFMModGUI* gui = NFMModGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return 0; } } -void NFMModPlugin::createInstanceModNFM(DeviceSinkAPI *deviceAPI) +void NFMModPlugin::createInstanceModNFM(DeviceUISet *deviceUISet) { - NFMModGUI::create(m_pluginAPI, deviceAPI); + NFMModGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channeltx/modnfm/nfmmodplugin.h b/plugins/channeltx/modnfm/nfmmodplugin.h index 8c35aba10..5b544e60f 100644 --- a/plugins/channeltx/modnfm/nfmmodplugin.h +++ b/plugins/channeltx/modnfm/nfmmodplugin.h @@ -20,7 +20,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSinkAPI; +class DeviceUISet; class NFMModPlugin : public QObject, PluginInterface { Q_OBJECT @@ -28,12 +28,12 @@ class NFMModPlugin : public QObject, PluginInterface { Q_PLUGIN_METADATA(IID "sdrangel.channeltx.nfmmod") public: - explicit NFMModPlugin(QObject* parent = NULL); + explicit NFMModPlugin(QObject* parent = 0); const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -41,7 +41,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceModNFM(DeviceSinkAPI *deviceAPI); + void createInstanceModNFM(DeviceUISet *deviceUISet); }; #endif // INCLUDE_NFMMODPLUGIN_H diff --git a/plugins/channeltx/modssb/ssbmodgui.cpp b/plugins/channeltx/modssb/ssbmodgui.cpp index aeba20489..1df535507 100644 --- a/plugins/channeltx/modssb/ssbmodgui.cpp +++ b/plugins/channeltx/modssb/ssbmodgui.cpp @@ -23,6 +23,7 @@ #include "ssbmodgui.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "dsp/spectrumvis.h" #include "ui_ssbmodgui.h" #include "plugin/pluginapi.h" @@ -34,9 +35,9 @@ const QString SSBModGUI::m_channelID = "sdrangel.channeltx.modssb"; -SSBModGUI* SSBModGUI::create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI) +SSBModGUI* SSBModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - SSBModGUI* gui = new SSBModGUI(pluginAPI, deviceAPI); + SSBModGUI* gui = new SSBModGUI(pluginAPI, deviceUISet); return gui; } @@ -439,11 +440,11 @@ void SSBModGUI::onMenuDoubleClicked() } } -SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent) : +SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::SSBModGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), @@ -462,7 +463,7 @@ SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_ssbMod = new SSBMod(m_deviceAPI, m_spectrumVis); + m_ssbMod = new SSBMod(m_deviceUISet->m_deviceSinkAPI, m_spectrumVis); m_ssbMod->setMessageQueueToGUI(getInputMessageQueue()); resetToDefaults(); @@ -488,9 +489,9 @@ SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerRxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); ui->cwKeyerGUI->setBuddies(m_ssbMod->getInputMessageQueue(), m_ssbMod->getCWKeyer()); ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum); @@ -509,7 +510,7 @@ SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa SSBModGUI::~SSBModGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeRxChannelInstance(this); delete m_ssbMod; delete m_spectrumVis; delete ui; diff --git a/plugins/channeltx/modssb/ssbmodgui.h b/plugins/channeltx/modssb/ssbmodgui.h index 8e8e3b4b4..171129bcf 100644 --- a/plugins/channeltx/modssb/ssbmodgui.h +++ b/plugins/channeltx/modssb/ssbmodgui.h @@ -27,7 +27,7 @@ #include "ssbmodsettings.h" class PluginAPI; -class DeviceSinkAPI; +class DeviceUISet; class SSBMod; class SpectrumVis; @@ -40,7 +40,7 @@ class SSBModGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static SSBModGUI* create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI); + static SSBModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -93,7 +93,7 @@ private slots: private: Ui::SSBModGUI* ui; PluginAPI* m_pluginAPI; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; SSBModSettings m_settings; bool m_basicSettingsShown; @@ -113,7 +113,7 @@ private: SSBMod::SSBModInputAF m_modAFInput; MessageQueue m_inputMessageQueue; - explicit SSBModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit SSBModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~SSBModGUI(); int getEffectiveLowCutoff(int lowCutoff); diff --git a/plugins/channeltx/modssb/ssbmodplugin.cpp b/plugins/channeltx/modssb/ssbmodplugin.cpp index 42c2b7764..b0328b32c 100644 --- a/plugins/channeltx/modssb/ssbmodplugin.cpp +++ b/plugins/channeltx/modssb/ssbmodplugin.cpp @@ -23,7 +23,7 @@ const PluginDescriptor SSBModPlugin::m_pluginDescriptor = { QString("SSB Modulator"), - QString("3.7.5"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -49,18 +49,18 @@ void SSBModPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerTxChannel(SSBModGUI::m_channelID, this); } -PluginInstanceGUI* SSBModPlugin::createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* SSBModPlugin::createTxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == SSBModGUI::m_channelID) { - SSBModGUI* gui = SSBModGUI::create(m_pluginAPI, deviceAPI); + SSBModGUI* gui = SSBModGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return 0; } } -void SSBModPlugin::createInstanceModSSB(DeviceSinkAPI *deviceAPI) +void SSBModPlugin::createInstanceModSSB(DeviceUISet *deviceUISet) { - SSBModGUI::create(m_pluginAPI, deviceAPI); + SSBModGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channeltx/modssb/ssbmodplugin.h b/plugins/channeltx/modssb/ssbmodplugin.h index 3c8ef8c98..51e3b273a 100644 --- a/plugins/channeltx/modssb/ssbmodplugin.h +++ b/plugins/channeltx/modssb/ssbmodplugin.h @@ -20,7 +20,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSinkAPI; +class DeviceUISet; class SSBModPlugin : public QObject, PluginInterface { Q_OBJECT @@ -28,12 +28,12 @@ class SSBModPlugin : public QObject, PluginInterface { Q_PLUGIN_METADATA(IID "sdrangel.channeltx.ssbmod") public: - explicit SSBModPlugin(QObject* parent = NULL); + explicit SSBModPlugin(QObject* parent = 0); const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -41,7 +41,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceModSSB(DeviceSinkAPI *deviceAPI); + void createInstanceModSSB(DeviceUISet *deviceUISet); }; #endif // INCLUDE_SSBMODPLUGIN_H diff --git a/plugins/channeltx/modwfm/wfmmodgui.cpp b/plugins/channeltx/modwfm/wfmmodgui.cpp index 8f95b5694..e6192edd4 100644 --- a/plugins/channeltx/modwfm/wfmmodgui.cpp +++ b/plugins/channeltx/modwfm/wfmmodgui.cpp @@ -21,6 +21,7 @@ #include #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "dsp/upchannelizer.h" #include "dsp/threadedbasebandsamplesource.h" #include "plugin/pluginapi.h" @@ -35,9 +36,9 @@ const QString WFMModGUI::m_channelID = "sdrangel.channeltx.modwfm"; -WFMModGUI* WFMModGUI::create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI) +WFMModGUI* WFMModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - WFMModGUI* gui = new WFMModGUI(pluginAPI, deviceAPI); + WFMModGUI* gui = new WFMModGUI(pluginAPI, deviceUISet); return gui; } @@ -273,11 +274,11 @@ void WFMModGUI::onMenuDoubleClicked() } } -WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent) : +WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::WFMModGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), @@ -305,7 +306,7 @@ WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); - m_wfmMod = new WFMMod(m_deviceAPI); + m_wfmMod = new WFMMod(m_deviceUISet->m_deviceSinkAPI); m_wfmMod->setMessageQueueToGUI(getInputMessageQueue()); connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); @@ -319,9 +320,9 @@ WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerTxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); ui->play->setEnabled(false); ui->play->setChecked(false); @@ -342,7 +343,7 @@ WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa WFMModGUI::~WFMModGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeTxChannelInstance(this); delete m_wfmMod; delete ui; } diff --git a/plugins/channeltx/modwfm/wfmmodgui.h b/plugins/channeltx/modwfm/wfmmodgui.h index 5a56efabb..65b8abe09 100644 --- a/plugins/channeltx/modwfm/wfmmodgui.h +++ b/plugins/channeltx/modwfm/wfmmodgui.h @@ -27,7 +27,7 @@ #include "wfmmodsettings.h" class PluginAPI; -class DeviceSinkAPI; +class DeviceUISet; class ThreadedBasebandSampleSource; class UpChannelizer; @@ -41,7 +41,7 @@ class WFMModGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static WFMModGUI* create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI); + static WFMModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -86,7 +86,7 @@ private slots: private: Ui::WFMModGUI* ui; PluginAPI* m_pluginAPI; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; ChannelMarker m_channelMarker; WFMModSettings m_settings; bool m_basicSettingsShown; @@ -106,7 +106,7 @@ private: WFMMod::WFMModInputAF m_modAFInput; MessageQueue m_inputMessageQueue; - explicit WFMModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit WFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~WFMModGUI(); void blockApplySettings(bool block); diff --git a/plugins/channeltx/modwfm/wfmmodplugin.cpp b/plugins/channeltx/modwfm/wfmmodplugin.cpp index 6788a774f..32f01351a 100644 --- a/plugins/channeltx/modwfm/wfmmodplugin.cpp +++ b/plugins/channeltx/modwfm/wfmmodplugin.cpp @@ -23,7 +23,7 @@ const PluginDescriptor WFMModPlugin::m_pluginDescriptor = { QString("WFM Modulator"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -49,18 +49,18 @@ void WFMModPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerTxChannel(WFMModGUI::m_channelID, this); } -PluginInstanceGUI* WFMModPlugin::createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* WFMModPlugin::createTxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == WFMModGUI::m_channelID) { - WFMModGUI* gui = WFMModGUI::create(m_pluginAPI, deviceAPI); + WFMModGUI* gui = WFMModGUI::create(m_pluginAPI, deviceUISet); return gui; } else { return 0; } } -void WFMModPlugin::createInstanceModWFM(DeviceSinkAPI *deviceAPI) +void WFMModPlugin::createInstanceModWFM(DeviceUISet *deviceUISet) { - WFMModGUI::create(m_pluginAPI, deviceAPI); + WFMModGUI::create(m_pluginAPI, deviceUISet); } diff --git a/plugins/channeltx/modwfm/wfmmodplugin.h b/plugins/channeltx/modwfm/wfmmodplugin.h index e4b67ba1c..36c7e6db6 100644 --- a/plugins/channeltx/modwfm/wfmmodplugin.h +++ b/plugins/channeltx/modwfm/wfmmodplugin.h @@ -33,7 +33,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -41,7 +41,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceModWFM(DeviceSinkAPI *deviceAPI); + void createInstanceModWFM(DeviceUISet *deviceUISet); }; #endif // INCLUDE_NFMMODPLUGIN_H diff --git a/plugins/channeltx/udpsink/readme.md b/plugins/channeltx/udpsink/readme.md index c269447af..8c81da302 100644 --- a/plugins/channeltx/udpsink/readme.md +++ b/plugins/channeltx/udpsink/readme.md @@ -30,7 +30,7 @@ Use this button to switch off the RF on the channel. The background of the butto

5: UDP address and port

-These parameters are set with the basic channel settings dialog. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrbase/readme.md#6-channels) +These parameters are set with the basic channel settings dialog. See: [here](https://github.com/f4exb/sdrangel/blob/master/sdrgui/readme.md#6-channels) The display is in the format `address:data port` diff --git a/plugins/channeltx/udpsink/udpsinkgui.cpp b/plugins/channeltx/udpsink/udpsinkgui.cpp index 36d86750a..d42d0cd9c 100644 --- a/plugins/channeltx/udpsink/udpsinkgui.cpp +++ b/plugins/channeltx/udpsink/udpsinkgui.cpp @@ -15,6 +15,7 @@ /////////////////////////////////////////////////////////////////////////////////// #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "dsp/spectrumvis.h" #include "dsp/dspengine.h" #include "util/simpleserializer.h" @@ -28,9 +29,9 @@ const QString UDPSinkGUI::m_channelID = "sdrangel.channeltx.udpsink"; -UDPSinkGUI* UDPSinkGUI::create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI) +UDPSinkGUI* UDPSinkGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet) { - UDPSinkGUI* gui = new UDPSinkGUI(pluginAPI, deviceAPI); + UDPSinkGUI* gui = new UDPSinkGUI(pluginAPI, deviceUISet); return gui; } @@ -102,11 +103,11 @@ void UDPSinkGUI::handleSourceMessages() } } -UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent) : +UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent) : RollupWidget(parent), ui(new Ui::UDPSinkGUI), m_pluginAPI(pluginAPI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_channelPowerAvg(4, 1e-10), m_inPowerAvg(4, 1e-10), m_tickCount(0), @@ -120,7 +121,7 @@ UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* setAttribute(Qt::WA_DeleteOnClose, true); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_udpSink = new UDPSink(m_deviceAPI, m_spectrumVis); + m_udpSink = new UDPSink(m_deviceUISet->m_deviceSinkAPI, m_spectrumVis); m_udpSink->setMessageQueueToGUI(getInputMessageQueue()); ui->fmDeviation->setEnabled(false); @@ -146,9 +147,9 @@ UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged())); - m_deviceAPI->registerChannelInstance(m_channelID, this); - m_deviceAPI->addChannelMarker(&m_channelMarker); - m_deviceAPI->addRollupWidget(this); + m_deviceUISet->registerTxChannelInstance(m_channelID, this); + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum); @@ -161,7 +162,7 @@ UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* UDPSinkGUI::~UDPSinkGUI() { - m_deviceAPI->removeChannelInstance(this); + m_deviceUISet->removeTxChannelInstance(this); delete m_udpSink; delete m_spectrumVis; delete ui; diff --git a/plugins/channeltx/udpsink/udpsinkgui.h b/plugins/channeltx/udpsink/udpsinkgui.h index 86006a75d..d19c16d9d 100644 --- a/plugins/channeltx/udpsink/udpsinkgui.h +++ b/plugins/channeltx/udpsink/udpsinkgui.h @@ -28,7 +28,7 @@ #include "udpsinksettings.h" class PluginAPI; -class DeviceSinkAPI; +class DeviceUISet; class UDPSink; class SpectrumVis; @@ -40,7 +40,7 @@ class UDPSinkGUI : public RollupWidget, public PluginInstanceGUI { Q_OBJECT public: - static UDPSinkGUI* create(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI); + static UDPSinkGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet); virtual void destroy(); void setName(const QString& name); @@ -80,7 +80,7 @@ private slots: private: Ui::UDPSinkGUI* ui; PluginAPI* m_pluginAPI; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; SpectrumVis* m_spectrumVis; UDPSink* m_udpSink; MovingAverage m_channelPowerAvg; @@ -94,7 +94,7 @@ private: bool m_doApplySettings; MessageQueue m_inputMessageQueue; - explicit UDPSinkGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit UDPSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, QWidget* parent = NULL); virtual ~UDPSinkGUI(); void blockApplySettings(bool block); diff --git a/plugins/channeltx/udpsink/udpsinkplugin.cpp b/plugins/channeltx/udpsink/udpsinkplugin.cpp index a40c7f2e6..818ea1bdf 100644 --- a/plugins/channeltx/udpsink/udpsinkplugin.cpp +++ b/plugins/channeltx/udpsink/udpsinkplugin.cpp @@ -24,7 +24,7 @@ const PluginDescriptor UDPSinkPlugin::m_pluginDescriptor = { QString("UDP Channel Sink"), - QString("3.7.5"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -50,11 +50,11 @@ void UDPSinkPlugin::initPlugin(PluginAPI* pluginAPI) m_pluginAPI->registerTxChannel(UDPSinkGUI::m_channelID, this); } -PluginInstanceGUI* UDPSinkPlugin::createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* UDPSinkPlugin::createTxChannel(const QString& channelName, DeviceUISet *deviceUISet) { if(channelName == UDPSinkGUI::m_channelID) { - UDPSinkGUI* gui = UDPSinkGUI::create(m_pluginAPI, deviceAPI); + UDPSinkGUI* gui = UDPSinkGUI::create(m_pluginAPI, deviceUISet); // deviceAPI->registerChannelInstance("sdrangel.channel.udpsrc", gui); // m_pluginAPI->addChannelRollup(gui); return gui; @@ -63,9 +63,9 @@ PluginInstanceGUI* UDPSinkPlugin::createTxChannel(const QString& channelName, De } } -void UDPSinkPlugin::createInstanceUDPSink(DeviceSinkAPI *deviceAPI) +void UDPSinkPlugin::createInstanceUDPSink(DeviceUISet *deviceUISet) { - UDPSinkGUI::create(m_pluginAPI, deviceAPI); + UDPSinkGUI::create(m_pluginAPI, deviceUISet); // deviceAPI->registerChannelInstance("sdrangel.channel.udpsrc", gui); // m_pluginAPI->addChannelRollup(gui); } diff --git a/plugins/channeltx/udpsink/udpsinkplugin.h b/plugins/channeltx/udpsink/udpsinkplugin.h index 7574f2951..d68499ccc 100644 --- a/plugins/channeltx/udpsink/udpsinkplugin.h +++ b/plugins/channeltx/udpsink/udpsinkplugin.h @@ -21,7 +21,7 @@ #include #include "plugin/plugininterface.h" -class DeviceSinkAPI; +class DeviceUISet; class UDPSinkPlugin : public QObject, PluginInterface { Q_OBJECT @@ -34,7 +34,7 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + PluginInstanceGUI* createTxChannel(const QString& channelName, DeviceUISet *deviceUISet); private: static const PluginDescriptor m_pluginDescriptor; @@ -42,7 +42,7 @@ private: PluginAPI* m_pluginAPI; private slots: - void createInstanceUDPSink(DeviceSinkAPI *deviceAPI); + void createInstanceUDPSink(DeviceUISet *deviceUISet); }; #endif // INCLUDE_UDPSINKPLUGIN_H diff --git a/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp b/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp index 052996218..bfb0a3cf9 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp +++ b/plugins/samplesink/bladerfoutput/bladerfoutputgui.cpp @@ -25,20 +25,21 @@ #include "dsp/dspengine.h" #include "dsp/dspcommands.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "bladerfoutputgui.h" #include "bladerf/devicebladerfvalues.h" -BladerfOutputGui::BladerfOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : +BladerfOutputGui::BladerfOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::BladerfOutputGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_deviceSampleSink(NULL), m_sampleRate(0), m_lastEngineState((DSPDeviceSinkEngine::State)-1) { - m_deviceSampleSink = (BladerfOutput*) m_deviceAPI->getSampleSink(); + m_deviceSampleSink = (BladerfOutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -61,7 +62,7 @@ BladerfOutputGui::BladerfOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : displaySettings(); char recFileNameCStr[30]; - sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceAPI->getDeviceUID()); + sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceUISet->m_deviceSinkAPI->getDeviceUID()); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -166,8 +167,8 @@ void BladerfOutputGui::handleInputMessages() void BladerfOutputGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateLabel->setText(QString("%1k").arg(QString::number(m_sampleRate/1000.0, 'g', 5))); } @@ -307,15 +308,15 @@ void BladerfOutputGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initGeneration()) + if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) { - m_deviceAPI->startGeneration(); + m_deviceUISet->m_deviceSinkAPI->startGeneration(); DSPEngine::instance()->startAudioInput(); } } else { - m_deviceAPI->stopGeneration(); + m_deviceUISet->m_deviceSinkAPI->stopGeneration(); DSPEngine::instance()->stopAudioInput(); } } @@ -331,7 +332,7 @@ void BladerfOutputGui::updateHardware() void BladerfOutputGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSinkAPI->state(); if(m_lastEngineState != state) { @@ -348,7 +349,7 @@ void BladerfOutputGui::updateStatus() break; case DSPDeviceSinkEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSinkAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesink/bladerfoutput/bladerfoutputgui.h b/plugins/samplesink/bladerfoutput/bladerfoutputgui.h index b31157802..e70aaa517 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutputgui.h +++ b/plugins/samplesink/bladerfoutput/bladerfoutputgui.h @@ -25,8 +25,8 @@ #include "bladerfoutput.h" -class DeviceSinkAPI; class DeviceSampleSink; +class DeviceUISet; namespace Ui { class BladerfOutputGui; @@ -36,7 +36,7 @@ class BladerfOutputGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit BladerfOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit BladerfOutputGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~BladerfOutputGui(); virtual void destroy(); @@ -54,7 +54,7 @@ public: private: Ui::BladerfOutputGui* ui; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; BladeRFOutputSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp b/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp index 5b870d6c6..e37dc1108 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp +++ b/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor BladerfOutputPlugin::m_pluginDescriptor = { QString("BladerRF Output"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -66,7 +66,10 @@ PluginInterface::SamplingDevices BladerfOutputPlugin::enumSampleSinks() m_hardwareID, m_deviceTypeID, QString(devinfo[i].serial), - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + false, + 0)); } if (devinfo) @@ -77,11 +80,14 @@ PluginInterface::SamplingDevices BladerfOutputPlugin::enumSampleSinks() return result; } -PluginInstanceGUI* BladerfOutputPlugin::createSampleSinkPluginInstanceGUI(const QString& sinkId,QWidget **widget, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* BladerfOutputPlugin::createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sinkId == m_deviceTypeID) { - BladerfOutputGui* gui = new BladerfOutputGui(deviceAPI); + BladerfOutputGui* gui = new BladerfOutputGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesink/bladerfoutput/bladerfoutputplugin.h b/plugins/samplesink/bladerfoutput/bladerfoutputplugin.h index 62fd5755d..a2e057995 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutputplugin.h +++ b/plugins/samplesink/bladerfoutput/bladerfoutputplugin.h @@ -36,7 +36,12 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSinks(); - virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI); + + virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet); + virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId, DeviceSinkAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesink/filesink/filesinkgui.cpp b/plugins/samplesink/filesink/filesinkgui.cpp index 69abb54ab..8bcd9c22b 100644 --- a/plugins/samplesink/filesink/filesinkgui.cpp +++ b/plugins/samplesink/filesink/filesinkgui.cpp @@ -32,12 +32,13 @@ #include "mainwindow.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "filesinkgui.h" -FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : +FileSinkGui::FileSinkGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::FileSinkGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_fileName("./test.sdriq"), @@ -59,14 +60,14 @@ FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : ui->fileNameText->setText(m_fileName); - connect(&(m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); + connect(&(m_deviceUISet->m_deviceSinkAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); displaySettings(); - m_deviceSampleSink = (FileSinkOutput*) m_deviceAPI->getSampleSink(); + m_deviceSampleSink = (FileSinkOutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -177,8 +178,8 @@ void FileSinkGui::handleInputMessages() void FileSinkGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)(m_sampleRate*(1<state(); + int state = m_deviceUISet->m_deviceSinkAPI->state(); if(m_lastEngineState != state) { @@ -223,7 +224,7 @@ void FileSinkGui::updateStatus() break; case DSPDeviceSinkEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSinkAPI->errorMessage()); break; default: break; @@ -260,9 +261,9 @@ void FileSinkGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initGeneration()) + if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) { - if (!m_deviceAPI->startGeneration()) + if (!m_deviceUISet->m_deviceSinkAPI->startGeneration()) { qDebug("FileSinkGui::on_startStop_toggled: device start failed"); } @@ -272,7 +273,7 @@ void FileSinkGui::on_startStop_toggled(bool checked) } else { - m_deviceAPI->stopGeneration(); + m_deviceUISet->m_deviceSinkAPI->stopGeneration(); DSPEngine::instance()->stopAudioInput(); } } diff --git a/plugins/samplesink/filesink/filesinkgui.h b/plugins/samplesink/filesink/filesinkgui.h index 3df84e2e6..999394b78 100644 --- a/plugins/samplesink/filesink/filesinkgui.h +++ b/plugins/samplesink/filesink/filesinkgui.h @@ -27,8 +27,8 @@ #include "filesinksettings.h" -class DeviceSinkAPI; class DeviceSampleSink; +class DeviceUISet; namespace Ui { class FileSinkGui; @@ -38,7 +38,7 @@ class FileSinkGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit FileSinkGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~FileSinkGui(); virtual void destroy(); @@ -56,7 +56,7 @@ public: private: Ui::FileSinkGui* ui; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; FileSinkSettings m_settings; QString m_fileName; diff --git a/plugins/samplesink/filesink/filesinkplugin.cpp b/plugins/samplesink/filesink/filesinkplugin.cpp index cf0f76a0c..ba328713b 100644 --- a/plugins/samplesink/filesink/filesinkplugin.cpp +++ b/plugins/samplesink/filesink/filesinkplugin.cpp @@ -25,7 +25,7 @@ const PluginDescriptor FileSinkPlugin::m_pluginDescriptor = { QString("File sink output"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -53,27 +53,28 @@ void FileSinkPlugin::initPlugin(PluginAPI* pluginAPI) PluginInterface::SamplingDevices FileSinkPlugin::enumSampleSinks() { SamplingDevices result; - int count = 1; - for(int i = 0; i < count; i++) - { - QString displayedName(QString("FileSink[%1]").arg(i)); - - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString::null, - i)); - } + result.append(SamplingDevice( + "FileSink", + m_hardwareID, + m_deviceTypeID, + QString::null, + 0, + PluginInterface::SamplingDevice::BuiltInDevice, + false, + 0)); return result; } -PluginInstanceGUI* FileSinkPlugin::createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* FileSinkPlugin::createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sinkId == m_deviceTypeID) { - FileSinkGui* gui = new FileSinkGui(deviceAPI); + FileSinkGui* gui = new FileSinkGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesink/filesink/filesinkplugin.h b/plugins/samplesink/filesink/filesinkplugin.h index fcc706167..e973f2e5e 100644 --- a/plugins/samplesink/filesink/filesinkplugin.h +++ b/plugins/samplesink/filesink/filesinkplugin.h @@ -37,7 +37,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSinks(); - virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId, DeviceSinkAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp index d2dd767a0..4675f8d4f 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp @@ -27,22 +27,23 @@ #include "dsp/dspcommands.h" #include "device/devicesinkapi.h" #include "device/devicesourceapi.h" +#include "device/deviceuiset.h" #include "hackrf/devicehackrfvalues.h" #include "hackrf/devicehackrfshared.h" #include "ui_hackrfoutputgui.h" -HackRFOutputGui::HackRFOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : +HackRFOutputGui::HackRFOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::HackRFOutputGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_deviceSampleSink(0), m_lastEngineState((DSPDeviceSinkEngine::State)-1), m_doApplySettings(true) { - m_deviceSampleSink = (HackRFOutput*) m_deviceAPI->getSampleSink(); + m_deviceSampleSink = (HackRFOutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -180,8 +181,8 @@ void HackRFOutputGui::handleInputMessages() void HackRFOutputGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(QString("%1k").arg(QString::number(m_sampleRate/1000.0, 'g', 5))); } @@ -300,21 +301,21 @@ void HackRFOutputGui::on_startStop_toggled(bool checked) if (checked) { // forcibly stop the Rx if present before starting - if (m_deviceAPI->getSourceBuddies().size() > 0) + if (m_deviceUISet->m_deviceSinkAPI->getSourceBuddies().size() > 0) { - DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[0]; + DeviceSourceAPI *buddy = m_deviceUISet->m_deviceSinkAPI->getSourceBuddies()[0]; buddy->stopAcquisition(); } - if (m_deviceAPI->initGeneration()) + if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) { - m_deviceAPI->startGeneration(); + m_deviceUISet->m_deviceSinkAPI->startGeneration(); DSPEngine::instance()->startAudioInput(); } } else { - m_deviceAPI->stopGeneration(); + m_deviceUISet->m_deviceSinkAPI->stopGeneration(); DSPEngine::instance()->startAudioInput(); } } @@ -333,7 +334,7 @@ void HackRFOutputGui::updateHardware() void HackRFOutputGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSinkAPI->state(); if(m_lastEngineState != state) { @@ -351,7 +352,7 @@ void HackRFOutputGui::updateStatus() break; case DSPDeviceSinkEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSinkAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputgui.h b/plugins/samplesink/hackrfoutput/hackrfoutputgui.h index 0db322c29..fdcba768e 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputgui.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutputgui.h @@ -27,8 +27,8 @@ #define HACKRF_MAX_DEVICE (32) -class DeviceSinkAPI; class DeviceSampleSink; +class DeviceUISet; namespace Ui { class HackRFOutputGui; @@ -46,7 +46,7 @@ public: HACKRF_IMGREJ_NB } HackRFImgRejValue; - explicit HackRFOutputGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit HackRFOutputGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~HackRFOutputGui(); virtual void destroy(); @@ -64,7 +64,7 @@ public: private: Ui::HackRFOutputGui* ui; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; HackRFOutputSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp index a6cd9f63d..98a9e4481 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp @@ -29,7 +29,7 @@ const PluginDescriptor HackRFOutputPlugin::m_pluginDescriptor = { QString("HackRF Output"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -97,7 +97,10 @@ PluginInterface::SamplingDevices HackRFOutputPlugin::enumSampleSinks() m_hardwareID, m_deviceTypeID, serial_str, - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + false, + 0)); qDebug("HackRFOutputPlugin::enumSampleSinks: enumerated HackRF device #%d", i); @@ -116,11 +119,14 @@ PluginInterface::SamplingDevices HackRFOutputPlugin::enumSampleSinks() return result; } -PluginInstanceGUI* HackRFOutputPlugin::createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* HackRFOutputPlugin::createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sinkId == m_deviceTypeID) { - HackRFOutputGui* gui = new HackRFOutputGui(deviceAPI); + HackRFOutputGui* gui = new HackRFOutputGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h index 6ba7809b2..33af573f8 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSinks(); - virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId, DeviceSinkAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesink/limesdroutput/limesdroutput.cpp b/plugins/samplesink/limesdroutput/limesdroutput.cpp index 89573f94c..6b110e6aa 100644 --- a/plugins/samplesink/limesdroutput/limesdroutput.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutput.cpp @@ -68,6 +68,8 @@ void LimeSDROutput::destroy() bool LimeSDROutput::openDevice() { + int requestedChannel = m_deviceAPI->getItemIndex(); + // look for Tx buddies and get reference to common parameters // if there is a channel left take the first available if (m_deviceAPI->getSinkBuddies().size() > 0) // look sink sibling first @@ -98,7 +100,8 @@ bool LimeSDROutput::openDevice() qDebug("LimeSDROutput::openDevice: at least one more Tx channel is available in device"); } - // look for unused channel number + // check if the requested channel is busy and abort if so (should not happen if device management is working correctly) + char *busyChannels = new char[deviceParams->m_nbTxChannels]; memset(busyChannels, 0, deviceParams->m_nbTxChannels); @@ -107,21 +110,14 @@ bool LimeSDROutput::openDevice() DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[i]; DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr(); - if (buddyShared->m_channel >= 0) { - busyChannels[buddyShared->m_channel] = 1; + if (buddyShared->m_channel == requestedChannel) + { + qCritical("LimeSDROutput::openDevice: cannot open busy channel %u", requestedChannel); + return false; } } - std::size_t ch = 0; - - for (;ch < deviceParams->m_nbTxChannels; ch++) - { - if (busyChannels[ch] == 0) { - break; // first available is the good one - } - } - - m_deviceShared.m_channel = ch; + m_deviceShared.m_channel = requestedChannel; // acknowledge the requested channel delete[] busyChannels; } // look for Rx buddies and get reference to common parameters @@ -143,7 +139,7 @@ bool LimeSDROutput::openDevice() qDebug("LimeSDROutput::openDevice: getting device parameters from Rx buddy"); } - m_deviceShared.m_channel = 0; // take first channel + m_deviceShared.m_channel = requestedChannel; // acknowledge the requested channel } // There are no buddies then create the first LimeSDR common parameters // open the device this will also populate common fields @@ -156,7 +152,7 @@ bool LimeSDROutput::openDevice() char serial[256]; strcpy(serial, qPrintable(m_deviceAPI->getSampleSinkSerial())); m_deviceShared.m_deviceParams->open(serial); - m_deviceShared.m_channel = 0; // take first channel + m_deviceShared.m_channel = requestedChannel; // acknowledge the requested channel } m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp index e61ba2838..ca7d7558a 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp @@ -23,12 +23,13 @@ #include "dsp/dspengine.h" #include "dsp/dspcommands.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "limesdroutputgui.h" -LimeSDROutputGUI::LimeSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) : +LimeSDROutputGUI::LimeSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::LimeSDROutputGUI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_settings(), m_sampleRate(0), m_lastEngineState((DSPDeviceSinkEngine::State)-1), @@ -37,7 +38,7 @@ LimeSDROutputGUI::LimeSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { - m_limeSDROutput = (LimeSDROutput*) m_deviceAPI->getSampleSink(); + m_limeSDROutput = (LimeSDROutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); ui->setupUi(this); @@ -72,7 +73,7 @@ LimeSDROutputGUI::LimeSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) : displaySettings(); char recFileNameCStr[30]; - sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceAPI->getDeviceUID()); + sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceUISet->m_deviceSinkAPI->getDeviceUID()); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); @@ -238,8 +239,8 @@ void LimeSDROutputGUI::handleInputMessages() void LimeSDROutputGUI::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateLabel->setText(tr("%1k").arg(QString::number(m_sampleRate / 1000.0f, 'g', 5))); } @@ -309,7 +310,7 @@ void LimeSDROutputGUI::updateHardware() void LimeSDROutputGUI::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSinkAPI->state(); if(m_lastEngineState != state) { @@ -326,7 +327,7 @@ void LimeSDROutputGUI::updateStatus() break; case DSPDeviceSinkEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSinkAPI->errorMessage()); break; default: break; @@ -352,7 +353,7 @@ void LimeSDROutputGUI::updateStatus() } else { - if (m_deviceAPI->isBuddyLeader()) + if (m_deviceUISet->m_deviceSinkAPI->isBuddyLeader()) { LimeSDROutput::MsgGetDeviceInfo* message = LimeSDROutput::MsgGetDeviceInfo::create(); m_limeSDROutput->getInputMessageQueue()->push(message); @@ -371,15 +372,15 @@ void LimeSDROutputGUI::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initGeneration()) + if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) { - m_deviceAPI->startGeneration(); + m_deviceUISet->m_deviceSinkAPI->startGeneration(); DSPEngine::instance()->startAudioInput(); } } else { - m_deviceAPI->stopGeneration(); + m_deviceUISet->m_deviceSinkAPI->stopGeneration(); DSPEngine::instance()->stopAudioInput(); } } diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.h b/plugins/samplesink/limesdroutput/limesdroutputgui.h index 2e34a76de..bbe3e6533 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.h +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.h @@ -25,8 +25,8 @@ #include "limesdroutput.h" -class DeviceSinkAPI; class DeviceSampleSink; +class DeviceUISet; namespace Ui { class LimeSDROutputGUI; @@ -36,7 +36,7 @@ class LimeSDROutputGUI : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit LimeSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent = 0); + explicit LimeSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~LimeSDROutputGUI(); virtual void destroy(); @@ -54,7 +54,7 @@ public: private: Ui::LimeSDROutputGUI* ui; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; LimeSDROutput* m_limeSDROutput; //!< Same object as above but gives easy access to LimeSDROutput methods and attributes that are used intensively LimeSDROutputSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp b/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp index 86583a99e..766463a73 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp @@ -24,13 +24,14 @@ #include "plugin/pluginapi.h" #include "util/simpleserializer.h" #include "device/devicesinkapi.h" +#include "limesdr/devicelimesdrparam.h" #include "limesdroutputgui.h" #include "limesdroutputplugin.h" const PluginDescriptor LimeSDROutputPlugin::m_pluginDescriptor = { QString("LimeSDR Output"), - QString("3.7.8"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -82,13 +83,23 @@ PluginInterface::SamplingDevices LimeSDROutputPlugin::enumSampleSinks() std::string serial("N/D"); findSerial((const char *) deviceList[i], serial); - qDebug("LimeSDROutputPlugin::enumSampleSources: device #%d: %s", i, (char *) deviceList[i]); - QString displayedName(QString("LimeSDR[%1] %2").arg(i).arg(serial.c_str())); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(deviceList[i]), - i)); + DeviceLimeSDRParams limeSDRParams; + limeSDRParams.open(deviceList[i]); + limeSDRParams.close(); + + for (unsigned int j = 0; j < limeSDRParams.m_nbTxChannels; j++) + { + qDebug("LimeSDROutputPlugin::enumSampleSources: device #%d channel %u: %s", i, j, (char *) deviceList[i]); + QString displayedName(QString("LimeSDR[%1:%2] %3").arg(i).arg(j).arg(serial.c_str())); + result.append(SamplingDevice(displayedName, + m_hardwareID, + m_deviceTypeID, + QString(deviceList[i]), + i, + PluginInterface::SamplingDevice::PhysicalDevice, + false, + j)); + } } } @@ -96,11 +107,14 @@ PluginInterface::SamplingDevices LimeSDROutputPlugin::enumSampleSinks() return result; } -PluginInstanceGUI* LimeSDROutputPlugin::createSampleSinkPluginInstanceGUI(const QString& sinkId,QWidget **widget, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* LimeSDROutputPlugin::createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sinkId == m_deviceTypeID) { - LimeSDROutputGUI* gui = new LimeSDROutputGUI(deviceAPI); + LimeSDROutputGUI* gui = new LimeSDROutputGUI(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesink/limesdroutput/limesdroutputplugin.h b/plugins/samplesink/limesdroutput/limesdroutputplugin.h index bf012aa38..bdad3109b 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputplugin.h +++ b/plugins/samplesink/limesdroutput/limesdroutputplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSinks(); - virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId, DeviceSinkAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesink/limesdroutput/limesdroutputthread.cpp b/plugins/samplesink/limesdroutput/limesdroutputthread.cpp index 985c9ecfb..e6da26cc8 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputthread.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputthread.cpp @@ -41,6 +41,7 @@ void LimeSDROutputThread::startWork() if (LMS_StartStream(m_stream) < 0) { qCritical("LimeSDROutputThread::startWork: could not start stream"); } else { + usleep(1000); qDebug("LimeSDROutputThread::startWork: stream started"); } @@ -61,6 +62,7 @@ void LimeSDROutputThread::stopWork() if (LMS_StopStream(m_stream) < 0) { qCritical("LimeSDROutputThread::stopWork: could not stop stream"); } else { + usleep(1000); qDebug("LimeSDROutputThread::stopWork: stream stopped"); } } diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp index 893c2055e..e6cc6be5c 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp @@ -22,15 +22,16 @@ #include "dsp/dspcommands.h" #include "gui/glspectrum.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "plutosdr/deviceplutosdr.h" #include "plutosdroutput.h" #include "plutosdroutputgui.h" #include "ui_plutosdroutputgui.h" -PlutoSDROutputGUI::PlutoSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) : +PlutoSDROutputGUI::PlutoSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::PlutoSDROutputGUI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_settings(), m_forceSettings(true), m_sampleSink(0), @@ -40,7 +41,7 @@ PlutoSDROutputGUI::PlutoSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent) m_doApplySettings(true), m_statusCounter(0) { - m_sampleSink = (PlutoSDROutput*) m_deviceAPI->getSampleSink(); + m_sampleSink = (PlutoSDROutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -154,15 +155,15 @@ void PlutoSDROutputGUI::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initGeneration()) + if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) { - m_deviceAPI->startGeneration(); + m_deviceUISet->m_deviceSinkAPI->startGeneration(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopGeneration(); + m_deviceUISet->m_deviceSinkAPI->stopGeneration(); DSPEngine::instance()->stopAudioOutput(); } } @@ -304,7 +305,7 @@ void PlutoSDROutputGUI::blockApplySettings(bool block) void PlutoSDROutputGUI::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSinkAPI->state(); if(m_lastEngineState != state) { @@ -321,7 +322,7 @@ void PlutoSDROutputGUI::updateStatus() break; case DSPDeviceSinkEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSinkAPI->errorMessage()); break; default: break; @@ -350,7 +351,7 @@ void PlutoSDROutputGUI::updateStatus() if (m_statusCounter % 10 == 0) // 5s { - if (m_deviceAPI->isBuddyLeader()) { + if (m_deviceUISet->m_deviceSinkAPI->isBuddyLeader()) { ((PlutoSDROutput *) m_sampleSink)->fetchTemperature(); } @@ -421,7 +422,7 @@ void PlutoSDROutputGUI::handleInputMessages() void PlutoSDROutputGUI::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateLabel->setText(tr("%1k").arg(QString::number(m_sampleRate / 1000.0f, 'g', 5))); } diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.h b/plugins/samplesink/plutosdroutput/plutosdroutputgui.h index ece73df40..f9a010f4c 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.h @@ -26,8 +26,8 @@ #include "plutosdroutputsettings.h" -class DeviceSinkAPI; class DeviceSampleSink; +class DeviceUISet; namespace Ui { class PlutoSDROutputGUI; @@ -37,7 +37,7 @@ class PlutoSDROutputGUI : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit PlutoSDROutputGUI(DeviceSinkAPI *deviceAPI, QWidget* parent = 0); + explicit PlutoSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~PlutoSDROutputGUI(); virtual void destroy(); @@ -53,7 +53,7 @@ public: private: Ui::PlutoSDROutputGUI* ui; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; PlutoSDROutputSettings m_settings; bool m_forceSettings; QTimer m_updateTimer; diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp index 12b5831a6..776472ca0 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp @@ -28,7 +28,7 @@ class DeviceSourceAPI; const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = { QString("PlutoSDR Output"), - QString("3.7.8"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -73,7 +73,10 @@ PluginInterface::SamplingDevices PlutoSDROutputPlugin::enumSampleSinks() m_hardwareID, m_deviceTypeID, serial_str, - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + false, + 0)); qDebug("PlutoSDROutputPlugin::enumSampleSources: enumerated PlutoSDR device #%d", i); } @@ -81,11 +84,14 @@ PluginInterface::SamplingDevices PlutoSDROutputPlugin::enumSampleSinks() return result; } -PluginInstanceGUI* PlutoSDROutputPlugin::createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* PlutoSDROutputPlugin::createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sinkId == m_deviceTypeID) { - PlutoSDROutputGUI* gui = new PlutoSDROutputGUI(deviceAPI); + PlutoSDROutputGUI* gui = new PlutoSDROutputGUI(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h index 730a28473..400add752 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSinks(); - virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId, DeviceSinkAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp index f3afc08ac..e08580194 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp @@ -38,12 +38,13 @@ #include "mainwindow.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "sdrdaemonsinkgui.h" -SDRdaemonSinkGui::SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : +SDRdaemonSinkGui::SDRdaemonSinkGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::SDRdaemonSinkGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_settings(), m_deviceSampleSink(0), m_sampleRate(0), @@ -78,12 +79,12 @@ SDRdaemonSinkGui::SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow)); ui->sampleRate->setValueRange(7, 32000U, 9000000U); - connect(&(m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); + connect(&(m_deviceUISet->m_deviceSinkAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - m_deviceSampleSink = (SDRdaemonSinkOutput*) m_deviceAPI->getSampleSink(); + m_deviceSampleSink = (SDRdaemonSinkOutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); @@ -211,8 +212,8 @@ void SDRdaemonSinkGui::handleInputMessages() void SDRdaemonSinkGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)(m_sampleRate*(1<state(); + int state = m_deviceUISet->m_deviceSinkAPI->state(); if(m_lastEngineState != state) { @@ -367,7 +368,7 @@ void SDRdaemonSinkGui::updateStatus() break; case DSPDeviceSinkEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSinkAPI->errorMessage()); break; default: break; @@ -500,9 +501,9 @@ void SDRdaemonSinkGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initGeneration()) + if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) { - if (!m_deviceAPI->startGeneration()) + if (!m_deviceUISet->m_deviceSinkAPI->startGeneration()) { qDebug("SDRdaemonSinkGui::on_startStop_toggled: device start failed"); } @@ -512,7 +513,7 @@ void SDRdaemonSinkGui::on_startStop_toggled(bool checked) } else { - m_deviceAPI->stopGeneration(); + m_deviceUISet->m_deviceSinkAPI->stopGeneration(); DSPEngine::instance()->stopAudioInput(); } } diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h index 91f51ca7d..e562d3675 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h @@ -28,8 +28,8 @@ #include "sdrdaemonsinkoutput.h" -class DeviceSinkAPI; class DeviceSampleSink; +class DeviceUISet; namespace Ui { class SDRdaemonSinkGui; @@ -39,7 +39,7 @@ class SDRdaemonSinkGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); + explicit SDRdaemonSinkGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~SDRdaemonSinkGui(); virtual void destroy(); @@ -57,7 +57,7 @@ public: private: Ui::SDRdaemonSinkGui* ui; - DeviceSinkAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; SDRdaemonSinkSettings m_settings; //!< current settings SDRdaemonSinkSettings m_controlSettings; //!< settings last sent to device via control port QTimer m_updateTimer; diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.cpp index 53f56c003..99491d3e8 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor SDRdaemonSinkPlugin::m_pluginDescriptor = { QString("SDRdaemon sink output"), - QString("3.5.0"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -54,27 +54,28 @@ void SDRdaemonSinkPlugin::initPlugin(PluginAPI* pluginAPI) PluginInterface::SamplingDevices SDRdaemonSinkPlugin::enumSampleSinks() { SamplingDevices result; - int count = 1; - for(int i = 0; i < count; i++) - { - QString displayedName(QString("SDRdaemonSink[%1]").arg(i)); - - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString::null, - i)); - } + result.append(SamplingDevice( + "SDRdaemonSink", + m_hardwareID, + m_deviceTypeID, + QString::null, + 0, + PluginInterface::SamplingDevice::BuiltInDevice, + false, + 0)); return result; } -PluginInstanceGUI* SDRdaemonSinkPlugin::createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI) +PluginInstanceGUI* SDRdaemonSinkPlugin::createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sinkId == m_deviceTypeID) { - SDRdaemonSinkGui* gui = new SDRdaemonSinkGui(deviceAPI); + SDRdaemonSinkGui* gui = new SDRdaemonSinkGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.h b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.h index 2980b19e9..674b95c3e 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.h +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkplugin.h @@ -37,7 +37,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSinks(); - virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI(const QString& sinkId, QWidget **widget, DeviceSinkAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( + const QString& sinkId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId, DeviceSinkAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/airspy/airspygui.cpp b/plugins/samplesource/airspy/airspygui.cpp index 6e4229e9b..736fe10b9 100644 --- a/plugins/samplesource/airspy/airspygui.cpp +++ b/plugins/samplesource/airspy/airspygui.cpp @@ -22,6 +22,7 @@ #include "airspygui.h" #include +#include "device/deviceuiset.h" #include #include "ui_airspygui.h" @@ -30,16 +31,16 @@ #include "dsp/dspengine.h" #include "dsp/dspcommands.h" -AirspyGui::AirspyGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +AirspyGui::AirspyGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::AirspyGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_sampleSource(0), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { - m_sampleSource = (AirspyInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (AirspyInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -150,8 +151,8 @@ void AirspyGui::handleInputMessages() void AirspyGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)m_sampleRate / 1000)); } @@ -341,15 +342,15 @@ void AirspyGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } @@ -387,7 +388,7 @@ void AirspyGui::updateHardware() void AirspyGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -404,7 +405,7 @@ void AirspyGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesource/airspy/airspygui.h b/plugins/samplesource/airspy/airspygui.h index e2551f21a..563bf720b 100644 --- a/plugins/samplesource/airspy/airspygui.h +++ b/plugins/samplesource/airspy/airspygui.h @@ -26,7 +26,7 @@ #define AIRSPY_MAX_DEVICE (32) -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class AirspyGui; @@ -37,7 +37,7 @@ class AirspyGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit AirspyGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit AirspyGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~AirspyGui(); virtual void destroy(); @@ -57,7 +57,7 @@ public: private: Ui::AirspyGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; AirspySettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesource/airspy/airspyplugin.cpp b/plugins/samplesource/airspy/airspyplugin.cpp index 959c99e89..eccc2de54 100644 --- a/plugins/samplesource/airspy/airspyplugin.cpp +++ b/plugins/samplesource/airspy/airspyplugin.cpp @@ -27,7 +27,7 @@ const PluginDescriptor AirspyPlugin::m_pluginDescriptor = { QString("Airspy Input"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -99,7 +99,10 @@ PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources() m_hardwareID, m_deviceTypeID, serial_str, - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); qDebug("AirspyPlugin::enumSampleSources: enumerated Airspy device #%d", i); } @@ -119,11 +122,14 @@ PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources() return result; } -PluginInstanceGUI* AirspyPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* AirspyPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if (sourceId == m_deviceTypeID) { - AirspyGui* gui = new AirspyGui(deviceAPI); + AirspyGui* gui = new AirspyGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/airspy/airspyplugin.h b/plugins/samplesource/airspy/airspyplugin.h index 0406ffd68..62953fa9a 100644 --- a/plugins/samplesource/airspy/airspyplugin.h +++ b/plugins/samplesource/airspy/airspyplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/bladerfinput/bladerfinputgui.cpp b/plugins/samplesource/bladerfinput/bladerfinputgui.cpp index 5812e3504..ef205e89f 100644 --- a/plugins/samplesource/bladerfinput/bladerfinputgui.cpp +++ b/plugins/samplesource/bladerfinput/bladerfinputgui.cpp @@ -27,18 +27,19 @@ #include "dsp/dspengine.h" #include "dsp/dspcommands.h" #include +#include "device/deviceuiset.h" -BladerfInputGui::BladerfInputGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +BladerfInputGui::BladerfInputGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::BladerfInputGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_sampleSource(NULL), m_sampleRate(0), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { - m_sampleSource = (BladerfInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (BladerfInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -148,8 +149,8 @@ void BladerfInputGui::handleInputMessages() void BladerfInputGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateLabel->setText(tr("%1k").arg(QString::number(m_sampleRate / 1000.0f, 'g', 5))); } @@ -333,15 +334,15 @@ void BladerfInputGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } @@ -369,7 +370,7 @@ void BladerfInputGui::updateHardware() void BladerfInputGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -386,7 +387,7 @@ void BladerfInputGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesource/bladerfinput/bladerfinputgui.h b/plugins/samplesource/bladerfinput/bladerfinputgui.h index ca2cd4db1..094cda356 100644 --- a/plugins/samplesource/bladerfinput/bladerfinputgui.h +++ b/plugins/samplesource/bladerfinput/bladerfinputgui.h @@ -25,7 +25,7 @@ #include "bladerfinput.h" -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class BladerfInputGui; @@ -35,7 +35,7 @@ class BladerfInputGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit BladerfInputGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit BladerfInputGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~BladerfInputGui(); virtual void destroy(); @@ -53,7 +53,7 @@ public: private: Ui::BladerfInputGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; BladeRFInputSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesource/bladerfinput/bladerfinputplugin.cpp b/plugins/samplesource/bladerfinput/bladerfinputplugin.cpp index ae7ba37fc..0a5420174 100644 --- a/plugins/samplesource/bladerfinput/bladerfinputplugin.cpp +++ b/plugins/samplesource/bladerfinput/bladerfinputplugin.cpp @@ -27,7 +27,7 @@ const PluginDescriptor BlderfInputPlugin::m_pluginDescriptor = { QString("BladerRF Input"), - QString("3.5.0"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -67,7 +67,10 @@ PluginInterface::SamplingDevices BlderfInputPlugin::enumSampleSources() m_hardwareID, m_deviceTypeID, QString(devinfo[i].serial), - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); } if (devinfo) @@ -78,11 +81,14 @@ PluginInterface::SamplingDevices BlderfInputPlugin::enumSampleSources() return result; } -PluginInstanceGUI* BlderfInputPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId,QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* BlderfInputPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - BladerfInputGui* gui = new BladerfInputGui(deviceAPI); + BladerfInputGui* gui = new BladerfInputGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/bladerfinput/bladerfinputplugin.h b/plugins/samplesource/bladerfinput/bladerfinputplugin.h index e21998654..d9fcb6599 100644 --- a/plugins/samplesource/bladerfinput/bladerfinputplugin.h +++ b/plugins/samplesource/bladerfinput/bladerfinputplugin.h @@ -22,6 +22,7 @@ class PluginAPI; class DeviceSourceAPI; +class DeviceUISet; #define BLADERF_DEVICE_TYPE_ID "sdrangel.samplesource.bladerf" @@ -37,7 +38,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/fcdpro/fcdprogui.cpp b/plugins/samplesource/fcdpro/fcdprogui.cpp index 6a65feb94..a905dd679 100644 --- a/plugins/samplesource/fcdpro/fcdprogui.cpp +++ b/plugins/samplesource/fcdpro/fcdprogui.cpp @@ -24,19 +24,20 @@ #include "fcdprogui.h" #include +#include "device/deviceuiset.h" #include "fcdproconst.h" #include "fcdtraits.h" -FCDProGui::FCDProGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +FCDProGui::FCDProGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::FCDProGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_sampleSource(NULL), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { - m_sampleSource = (FCDProInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (FCDProInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -235,8 +236,8 @@ void FCDProGui::handleInputMessages() void FCDProGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)m_sampleRate / 1000)); } @@ -436,15 +437,15 @@ void FCDProGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } @@ -473,7 +474,7 @@ void FCDProGui::on_transverter_clicked() void FCDProGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -490,7 +491,7 @@ void FCDProGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesource/fcdpro/fcdprogui.h b/plugins/samplesource/fcdpro/fcdprogui.h index 792f7c827..771c20b9e 100644 --- a/plugins/samplesource/fcdpro/fcdprogui.h +++ b/plugins/samplesource/fcdpro/fcdprogui.h @@ -25,8 +25,8 @@ #include "fcdproinput.h" -class DeviceSourceAPI; class QWidget; +class DeviceUISet; namespace Ui { class FCDProGui; @@ -36,7 +36,7 @@ class FCDProGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit FCDProGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit FCDProGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~FCDProGui(); virtual void destroy(); @@ -54,7 +54,7 @@ public: private: Ui::FCDProGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; FCDProSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesource/fcdpro/fcdproplugin.cpp b/plugins/samplesource/fcdpro/fcdproplugin.cpp index f6d0bfdee..a813bdcb7 100644 --- a/plugins/samplesource/fcdpro/fcdproplugin.cpp +++ b/plugins/samplesource/fcdpro/fcdproplugin.cpp @@ -65,7 +65,10 @@ PluginInterface::SamplingDevices FCDProPlugin::enumSampleSources() fcd_traits::hardwareID, fcd_traits::interfaceIID, serialNumber, - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); device_info = device_info->next; i++; @@ -74,11 +77,14 @@ PluginInterface::SamplingDevices FCDProPlugin::enumSampleSources() return result; } -PluginInstanceGUI* FCDProPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* FCDProPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == fcd_traits::interfaceIID) { - FCDProGui* gui = new FCDProGui(deviceAPI); + FCDProGui* gui = new FCDProGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/fcdpro/fcdproplugin.h b/plugins/samplesource/fcdpro/fcdproplugin.h index 4005bc47e..a6769bda7 100644 --- a/plugins/samplesource/fcdpro/fcdproplugin.h +++ b/plugins/samplesource/fcdpro/fcdproplugin.h @@ -20,7 +20,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); private: diff --git a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp index eb50a6281..76dd6458f 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp @@ -25,19 +25,20 @@ #include "fcdproplusgui.h" #include +#include "device/deviceuiset.h" #include "fcdproplusconst.h" #include "fcdtraits.h" -FCDProPlusGui::FCDProPlusGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +FCDProPlusGui::FCDProPlusGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::FCDProPlusGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_sampleSource(NULL), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { - m_sampleSource = (FCDProPlusInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (FCDProPlusInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); @@ -153,8 +154,8 @@ void FCDProPlusGui::handleInputMessages() void FCDProPlusGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)m_sampleRate / 1000)); } @@ -226,7 +227,7 @@ void FCDProPlusGui::updateHardware() void FCDProPlusGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -243,7 +244,7 @@ void FCDProPlusGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; @@ -301,15 +302,15 @@ void FCDProPlusGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } diff --git a/plugins/samplesource/fcdproplus/fcdproplusgui.h b/plugins/samplesource/fcdproplus/fcdproplusgui.h index f82f1b2fa..70c566310 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusgui.h +++ b/plugins/samplesource/fcdproplus/fcdproplusgui.h @@ -25,7 +25,7 @@ #include "fcdproplusinput.h" -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class FCDProPlusGui; @@ -35,7 +35,7 @@ class FCDProPlusGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit FCDProPlusGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit FCDProPlusGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~FCDProPlusGui(); virtual void destroy(); @@ -53,7 +53,7 @@ public: private: Ui::FCDProPlusGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; FCDProPlusSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp b/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp index 14159c0b7..4a5c58d29 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp @@ -67,7 +67,10 @@ PluginInterface::SamplingDevices FCDProPlusPlugin::enumSampleSources() fcd_traits::hardwareID, fcd_traits::interfaceIID, serialNumber, - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); device_info = device_info->next; i++; @@ -76,11 +79,14 @@ PluginInterface::SamplingDevices FCDProPlusPlugin::enumSampleSources() return result; } -PluginInstanceGUI* FCDProPlusPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* FCDProPlusPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == fcd_traits::interfaceIID) { - FCDProPlusGui* gui = new FCDProPlusGui(deviceAPI); + FCDProPlusGui* gui = new FCDProPlusGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/fcdproplus/fcdproplusplugin.h b/plugins/samplesource/fcdproplus/fcdproplusplugin.h index c122e8b9b..c82921e13 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusplugin.h +++ b/plugins/samplesource/fcdproplus/fcdproplusplugin.h @@ -20,7 +20,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_deviceTypeID; diff --git a/plugins/samplesource/filesource/filesourcegui.cpp b/plugins/samplesource/filesource/filesourcegui.cpp index b46a4c028..8f157db36 100644 --- a/plugins/samplesource/filesource/filesourcegui.cpp +++ b/plugins/samplesource/filesource/filesourcegui.cpp @@ -33,11 +33,12 @@ #include "filesourcegui.h" #include +#include "device/deviceuiset.h" -FileSourceGui::FileSourceGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +FileSourceGui::FileSourceGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::FileSourceGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_settings(), m_sampleSource(NULL), m_acquisition(false), @@ -56,7 +57,7 @@ FileSourceGui::FileSourceGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : ui->centerFrequency->setValueRange(7, 0, pow(10,7)); ui->fileNameText->setText(m_fileName); - connect(&(m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); + connect(&(m_deviceUISet->m_deviceSourceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); @@ -66,7 +67,7 @@ FileSourceGui::FileSourceGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : ui->playLoop->setChecked(true); // FIXME: always play in a loop ui->playLoop->setEnabled(false); - m_sampleSource = m_deviceAPI->getSampleSource(); + m_sampleSource = m_deviceUISet->m_deviceSourceAPI->getSampleSource(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -186,8 +187,8 @@ bool FileSourceGui::handleMessage(const Message& message) void FileSourceGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_deviceSampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_deviceSampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)m_deviceSampleRate / 1000)); } @@ -208,22 +209,22 @@ void FileSourceGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } void FileSourceGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -240,7 +241,7 @@ void FileSourceGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesource/filesource/filesourcegui.h b/plugins/samplesource/filesource/filesourcegui.h index bef589100..c6a891fb1 100644 --- a/plugins/samplesource/filesource/filesourcegui.h +++ b/plugins/samplesource/filesource/filesourcegui.h @@ -25,7 +25,7 @@ #include "filesourceinput.h" -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class FileSourceGui; @@ -35,7 +35,7 @@ class FileSourceGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit FileSourceGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit FileSourceGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~FileSourceGui(); virtual void destroy(); @@ -53,7 +53,7 @@ public: private: Ui::FileSourceGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; FileSourceInput::Settings m_settings; QTimer m_statusTimer; std::vector m_gains; diff --git a/plugins/samplesource/filesource/filesourceplugin.cpp b/plugins/samplesource/filesource/filesourceplugin.cpp index 04ed32ba6..a749a2ae6 100644 --- a/plugins/samplesource/filesource/filesourceplugin.cpp +++ b/plugins/samplesource/filesource/filesourceplugin.cpp @@ -25,7 +25,7 @@ const PluginDescriptor FileSourcePlugin::m_pluginDescriptor = { QString("File source input"), - QString("3.5.0"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -53,27 +53,28 @@ void FileSourcePlugin::initPlugin(PluginAPI* pluginAPI) PluginInterface::SamplingDevices FileSourcePlugin::enumSampleSources() { SamplingDevices result; - int count = 1; - for(int i = 0; i < count; i++) - { - QString displayedName(QString("FileSource[%1]").arg(i)); - - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString::null, - i)); - } + result.append(SamplingDevice( + "FileSource", + m_hardwareID, + m_deviceTypeID, + QString::null, + 0, + PluginInterface::SamplingDevice::BuiltInDevice, + true, + 0)); return result; } -PluginInstanceGUI* FileSourcePlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* FileSourcePlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - FileSourceGui* gui = new FileSourceGui(deviceAPI); + FileSourceGui* gui = new FileSourceGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/filesource/filesourceplugin.h b/plugins/samplesource/filesource/filesourceplugin.h index 04fb820ad..2f077ce1c 100644 --- a/plugins/samplesource/filesource/filesourceplugin.h +++ b/plugins/samplesource/filesource/filesourceplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp index bc4cbec42..d790eb4bd 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp @@ -27,20 +27,21 @@ #include "dsp/dspcommands.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" +#include "device/deviceuiset.h" #include "hackrf/devicehackrfvalues.h" #include "ui_hackrfinputgui.h" -HackRFInputGui::HackRFInputGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +HackRFInputGui::HackRFInputGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::HackRFInputGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_settings(), m_forceSettings(true), m_sampleSource(NULL), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { - m_sampleSource = (HackRFInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (HackRFInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -164,8 +165,8 @@ void HackRFInputGui::handleInputMessages() void HackRFInputGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(QString("%1k").arg(QString::number(m_sampleRate/1000.0, 'g', 5))); } @@ -330,21 +331,21 @@ void HackRFInputGui::on_startStop_toggled(bool checked) if (checked) { // forcibly stop the Tx if present before starting - if (m_deviceAPI->getSinkBuddies().size() > 0) + if (m_deviceUISet->m_deviceSourceAPI->getSinkBuddies().size() > 0) { - DeviceSinkAPI *buddy = m_deviceAPI->getSinkBuddies()[0]; + DeviceSinkAPI *buddy = m_deviceUISet->m_deviceSourceAPI->getSinkBuddies()[0]; buddy->stopGeneration(); } - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } @@ -372,7 +373,7 @@ void HackRFInputGui::updateHardware() void HackRFInputGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -390,7 +391,7 @@ void HackRFInputGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.h b/plugins/samplesource/hackrfinput/hackrfinputgui.h index 5f78a2f34..5a47a2fa0 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.h +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.h @@ -27,7 +27,7 @@ #define HACKRF_MAX_DEVICE (32) -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class HackRFInputGui; @@ -45,7 +45,7 @@ public: HACKRF_IMGREJ_NB } HackRFImgRejValue; - explicit HackRFInputGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit HackRFInputGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~HackRFInputGui(); virtual void destroy(); @@ -63,7 +63,7 @@ public: private: Ui::HackRFInputGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; HackRFInputSettings m_settings; bool m_forceSettings; QTimer m_updateTimer; diff --git a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp index 833722be8..26a08c707 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp @@ -29,7 +29,7 @@ const PluginDescriptor HackRFInputPlugin::m_pluginDescriptor = { QString("HackRF Input"), - QString("3.5.2"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -98,7 +98,10 @@ PluginInterface::SamplingDevices HackRFInputPlugin::enumSampleSources() m_hardwareID, m_deviceTypeID, serial_str, - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); qDebug("HackRFPlugin::enumSampleSources: enumerated HackRF device #%d", i); @@ -117,11 +120,14 @@ PluginInterface::SamplingDevices HackRFInputPlugin::enumSampleSources() return result; } -PluginInstanceGUI* HackRFInputPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* HackRFInputPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - HackRFInputGui* gui = new HackRFInputGui(deviceAPI); + HackRFInputGui* gui = new HackRFInputGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/hackrfinput/hackrfinputplugin.h b/plugins/samplesource/hackrfinput/hackrfinputplugin.h index c779cb880..1a90c44e4 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputplugin.h +++ b/plugins/samplesource/hackrfinput/hackrfinputplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index c2b2488c7..8652a25b3 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -86,6 +86,8 @@ bool LimeSDRInput::openDevice() qDebug("LimeSDRInput::openDevice: allocated SampleFifo"); } + int requestedChannel = m_deviceAPI->getItemIndex(); + // look for Rx buddies and get reference to common parameters // if there is a channel left take the first available if (m_deviceAPI->getSourceBuddies().size() > 0) // look source sibling first @@ -116,7 +118,8 @@ bool LimeSDRInput::openDevice() qDebug("LimeSDRInput::openDevice: at least one more Rx channel is available in device"); } - // look for unused channel number + // check if the requested channel is busy and abort if so (should not happen if device management is working correctly) + char *busyChannels = new char[deviceParams->m_nbRxChannels]; memset(busyChannels, 0, deviceParams->m_nbRxChannels); @@ -125,21 +128,14 @@ bool LimeSDRInput::openDevice() DeviceSourceAPI *buddy = m_deviceAPI->getSourceBuddies()[i]; DeviceLimeSDRShared *buddyShared = (DeviceLimeSDRShared *) buddy->getBuddySharedPtr(); - if (buddyShared->m_channel >= 0) { - busyChannels[buddyShared->m_channel] = 1; + if (buddyShared->m_channel == requestedChannel) + { + qCritical("LimeSDRInput::openDevice: cannot open busy channel %u", requestedChannel); + return false; } } - std::size_t ch = 0; - - for (;ch < deviceParams->m_nbRxChannels; ch++) - { - if (busyChannels[ch] == 0) { - break; // first available is the good one - } - } - - m_deviceShared.m_channel = ch; + m_deviceShared.m_channel = requestedChannel; // acknowledge the requested channel delete[] busyChannels; } // look for Tx buddies and get reference to common parameters @@ -161,7 +157,7 @@ bool LimeSDRInput::openDevice() qDebug("LimeSDRInput::openDevice: getting device parameters from Tx buddy"); } - m_deviceShared.m_channel = 0; // take first channel + m_deviceShared.m_channel = requestedChannel; // acknowledge the requested channel } // There are no buddies then create the first LimeSDR common parameters // open the device this will also populate common fields @@ -174,7 +170,7 @@ bool LimeSDRInput::openDevice() char serial[256]; strcpy(serial, qPrintable(m_deviceAPI->getSampleSourceSerial())); m_deviceShared.m_deviceParams->open(serial); - m_deviceShared.m_channel = 0; // take first channel + m_deviceShared.m_channel = requestedChannel; // acknowledge the requested channel } m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API @@ -357,6 +353,8 @@ void LimeSDRInput::releaseChannel() resumeTxBuddies(); resumeRxBuddies(); + // The channel will be effectively released to be reused in another device set only at close time + m_channelAcquired = false; } @@ -939,9 +937,10 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc settings.m_antennaPath)) { doCalibration = true; - setAntennaAuto = (settings.m_antennaPath == 0); - qDebug("LimeSDRInput::applySettings: set antenna path to %d", - (int) settings.m_antennaPath); + //setAntennaAuto = (settings.m_antennaPath == 0); + qDebug("LimeSDRInput::applySettings: set antenna path to %d on channel %d", + (int) settings.m_antennaPath, + m_deviceShared.m_channel); } else { diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp index 9a491c74d..c5ee62509 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp @@ -27,11 +27,12 @@ #include "dsp/dspengine.h" #include "dsp/dspcommands.h" #include "device/devicesourceapi.h" +#include "device/deviceuiset.h" -LimeSDRInputGUI::LimeSDRInputGUI(DeviceSourceAPI *deviceAPI, QWidget* parent) : +LimeSDRInputGUI::LimeSDRInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::LimeSDRInputGUI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_settings(), m_sampleRate(0), m_lastEngineState((DSPDeviceSourceEngine::State)-1), @@ -40,7 +41,7 @@ LimeSDRInputGUI::LimeSDRInputGUI(DeviceSourceAPI *deviceAPI, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { - m_limeSDRInput = (LimeSDRInput*) m_deviceAPI->getSampleSource(); + m_limeSDRInput = (LimeSDRInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); @@ -246,8 +247,8 @@ void LimeSDRInputGUI::updateADCRate() void LimeSDRInputGUI::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateLabel->setText(tr("%1k").arg(QString::number(m_sampleRate / 1000.0f, 'g', 5))); } @@ -329,7 +330,7 @@ void LimeSDRInputGUI::updateHardware() void LimeSDRInputGUI::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -346,7 +347,7 @@ void LimeSDRInputGUI::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; @@ -372,7 +373,7 @@ void LimeSDRInputGUI::updateStatus() } else { - if (m_deviceAPI->isBuddyLeader()) + if (m_deviceUISet->m_deviceSourceAPI->isBuddyLeader()) { LimeSDRInput::MsgGetDeviceInfo* message = LimeSDRInput::MsgGetDeviceInfo::create(); m_limeSDRInput->getInputMessageQueue()->push(message); @@ -391,15 +392,15 @@ void LimeSDRInputGUI::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.h b/plugins/samplesource/limesdrinput/limesdrinputgui.h index c0b87ba1a..ed73d3994 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.h +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.h @@ -25,7 +25,7 @@ #include "limesdrinput.h" -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class LimeSDRInputGUI; @@ -35,7 +35,7 @@ class LimeSDRInputGUI : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit LimeSDRInputGUI(DeviceSourceAPI *deviceAPI, QWidget* parent = 0); + explicit LimeSDRInputGUI(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~LimeSDRInputGUI(); virtual void destroy(); @@ -53,7 +53,7 @@ public: private: Ui::LimeSDRInputGUI* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; LimeSDRInput* m_limeSDRInput; //!< Same object as above but gives easy access to LimeSDRInput methods and attributes that are used intensively LimeSDRInputSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp b/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp index 7b9ce3789..f3f623376 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor LimeSDRInputPlugin::m_pluginDescriptor = { QString("LimeSDR Input"), - QString("3.7.8"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -83,13 +83,23 @@ PluginInterface::SamplingDevices LimeSDRInputPlugin::enumSampleSources() std::string serial("N/D"); findSerial((const char *) deviceList[i], serial); - qDebug("LimeSDRInputPlugin::enumSampleSources: device #%d: %s", i, (char *) deviceList[i]); - QString displayedName(QString("LimeSDR[%1] %2").arg(i).arg(serial.c_str())); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(deviceList[i]), - i)); + DeviceLimeSDRParams limeSDRParams; + limeSDRParams.open(deviceList[i]); + limeSDRParams.close(); + + for (unsigned int j = 0; j < limeSDRParams.m_nbRxChannels; j++) + { + qDebug("LimeSDRInputPlugin::enumSampleSources: device #%d channel %u: %s", i, j, (char *) deviceList[i]); + QString displayedName(QString("LimeSDR[%1:%2] %3").arg(i).arg(j).arg(serial.c_str())); + result.append(SamplingDevice(displayedName, + m_hardwareID, + m_deviceTypeID, + QString(deviceList[i]), + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + j)); + } } } @@ -97,11 +107,14 @@ PluginInterface::SamplingDevices LimeSDRInputPlugin::enumSampleSources() return result; } -PluginInstanceGUI* LimeSDRInputPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId,QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* LimeSDRInputPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - LimeSDRInputGUI* gui = new LimeSDRInputGUI(deviceAPI); + LimeSDRInputGUI* gui = new LimeSDRInputGUI(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/limesdrinput/limesdrinputplugin.h b/plugins/samplesource/limesdrinput/limesdrinputplugin.h index ee1dc218f..bbd975698 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputplugin.h +++ b/plugins/samplesource/limesdrinput/limesdrinputplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/limesdrinput/limesdrinputthread.cpp b/plugins/samplesource/limesdrinput/limesdrinputthread.cpp index 27e4375f3..7c99d004b 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputthread.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputthread.cpp @@ -42,6 +42,7 @@ void LimeSDRInputThread::startWork() if (LMS_StartStream(m_stream) < 0) { qCritical("LimeSDRInputThread::startWork: could not start stream"); } else { + usleep(1000); qDebug("LimeSDRInputThread::startWork: stream started"); } @@ -62,6 +63,7 @@ void LimeSDRInputThread::stopWork() if (LMS_StopStream(m_stream) < 0) { qCritical("LimeSDRInputThread::stopWork: could not stop stream"); } else { + usleep(1000); qDebug("LimeSDRInputThread::stopWork: stream stopped"); } } diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp index 402df2112..bc404d9a0 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp @@ -22,15 +22,16 @@ #include "dsp/dspcommands.h" #include "gui/glspectrum.h" #include "device/devicesourceapi.h" +#include "device/deviceuiset.h" #include "plutosdr/deviceplutosdr.h" #include "plutosdrinput.h" #include "ui_plutosdrinputgui.h" #include "plutosdrinputgui.h" -PlutoSDRInputGui::PlutoSDRInputGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +PlutoSDRInputGui::PlutoSDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::PlutoSDRInputGUI), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_settings(), m_forceSettings(true), m_sampleSource(NULL), @@ -40,7 +41,7 @@ PlutoSDRInputGui::PlutoSDRInputGui(DeviceSourceAPI *deviceAPI, QWidget* parent) m_doApplySettings(true), m_statusCounter(0) { - m_sampleSource = (PlutoSDRInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (PlutoSDRInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -154,15 +155,15 @@ void PlutoSDRInputGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } @@ -344,7 +345,7 @@ void PlutoSDRInputGui::blockApplySettings(bool block) void PlutoSDRInputGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -361,7 +362,7 @@ void PlutoSDRInputGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; @@ -393,7 +394,7 @@ void PlutoSDRInputGui::updateStatus() if (m_statusCounter % 10 == 0) // 5s { - if (m_deviceAPI->isBuddyLeader()) { + if (m_deviceUISet->m_deviceSourceAPI->isBuddyLeader()) { ((PlutoSDRInput *) m_sampleSource)->fetchTemperature(); } @@ -464,7 +465,7 @@ void PlutoSDRInputGui::handleInputMessages() void PlutoSDRInputGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateLabel->setText(tr("%1k").arg(QString::number(m_sampleRate / 1000.0f, 'g', 5))); } diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputgui.h b/plugins/samplesource/plutosdrinput/plutosdrinputgui.h index e8b22eab5..3e2c622db 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputgui.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputgui.h @@ -26,8 +26,8 @@ #include "plutosdrinputsettings.h" -class DeviceSourceAPI; class DeviceSampleSource; +class DeviceUISet; namespace Ui { class PlutoSDRInputGUI; @@ -37,7 +37,7 @@ class PlutoSDRInputGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit PlutoSDRInputGui(DeviceSourceAPI *deviceAPI, QWidget* parent = 0); + explicit PlutoSDRInputGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~PlutoSDRInputGui(); virtual void destroy(); @@ -53,7 +53,7 @@ public: private: Ui::PlutoSDRInputGUI* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; PlutoSDRInputSettings m_settings; bool m_forceSettings; QTimer m_updateTimer; diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp index 937f13612..10711d61c 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp @@ -28,7 +28,7 @@ class DeviceSourceAPI; const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = { QString("PlutoSDR Input"), - QString("3.7.8"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -73,7 +73,10 @@ PluginInterface::SamplingDevices PlutoSDRInputPlugin::enumSampleSources() m_hardwareID, m_deviceTypeID, serial_str, - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); qDebug("PlutoSDRInputPlugin::enumSampleSources: enumerated PlutoSDR device #%d", i); } @@ -81,11 +84,14 @@ PluginInterface::SamplingDevices PlutoSDRInputPlugin::enumSampleSources() return result; } -PluginInstanceGUI* PlutoSDRInputPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* PlutoSDRInputPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - PlutoSDRInputGui* gui = new PlutoSDRInputGui(deviceAPI); + PlutoSDRInputGui* gui = new PlutoSDRInputGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h index a4feaf21f..0587c3c90 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp index 2f0e6b7cb..24789ff21 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp @@ -20,6 +20,7 @@ #include "rtlsdrgui.h" #include +#include "device/deviceuiset.h" #include #include "ui_rtlsdrgui.h" @@ -29,16 +30,16 @@ #include "dsp/dspcommands.h" -RTLSDRGui::RTLSDRGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +RTLSDRGui::RTLSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::RTLSDRGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true), m_settings(), m_sampleSource(0), m_lastEngineState((DSPDeviceSourceEngine::State)-1) { - m_sampleSource = (RTLSDRInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (RTLSDRInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -173,8 +174,8 @@ void RTLSDRGui::handleInputMessages() void RTLSDRGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg(QString::number(m_sampleRate / 1000.0f, 'g', 5))); } @@ -310,15 +311,15 @@ void RTLSDRGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } @@ -355,7 +356,7 @@ void RTLSDRGui::updateHardware() void RTLSDRGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -372,7 +373,7 @@ void RTLSDRGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.h b/plugins/samplesource/rtlsdr/rtlsdrgui.h index fd36e7e3d..05ae61759 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.h +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.h @@ -25,7 +25,7 @@ #include "rtlsdrinput.h" -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class RTLSDRGui; @@ -36,7 +36,7 @@ class RTLSDRGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit RTLSDRGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit RTLSDRGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~RTLSDRGui(); virtual void destroy(); @@ -54,7 +54,7 @@ public: private: Ui::RTLSDRGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; RTLSDRSettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp b/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp index a6c44ae48..8cc93407a 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp @@ -11,7 +11,7 @@ const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = { QString("RTL-SDR Input"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -57,15 +57,21 @@ PluginInterface::SamplingDevices RTLSDRPlugin::enumSampleSources() m_hardwareID, m_deviceTypeID, QString(serial), - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); } return result; } -PluginInstanceGUI* RTLSDRPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* RTLSDRPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - RTLSDRGui* gui = new RTLSDRGui(deviceAPI); + RTLSDRGui* gui = new RTLSDRGui(deviceUISet); *widget = gui; return gui; } else { diff --git a/plugins/samplesource/rtlsdr/rtlsdrplugin.h b/plugins/samplesource/rtlsdr/rtlsdrplugin.h index 72cee65ec..3337bd1d6 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrplugin.h +++ b/plugins/samplesource/rtlsdr/rtlsdrplugin.h @@ -20,7 +20,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.cpp b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.cpp index 7135bd3f3..fc5ed4014 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.cpp +++ b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.cpp @@ -43,12 +43,13 @@ #include "util/simpleserializer.h" #include +#include "device/deviceuiset.h" #include "sdrdaemonsourcegui.h" -SDRdaemonSourceGui::SDRdaemonSourceGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +SDRdaemonSourceGui::SDRdaemonSourceGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::SDRdaemonSourceGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_sampleSource(NULL), m_acquisition(false), m_lastEngineState((DSPDeviceSourceEngine::State)-1), @@ -99,10 +100,10 @@ SDRdaemonSourceGui::SDRdaemonSourceGui(DeviceSourceAPI *deviceAPI, QWidget* pare connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); - connect(&(deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); + connect(&(m_deviceUISet->m_deviceSourceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); - m_sampleSource = (SDRdaemonSourceInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (SDRdaemonSourceInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); displaySettings(); @@ -284,8 +285,8 @@ void SDRdaemonSourceGui::handleInputMessages() void SDRdaemonSourceGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_deviceSampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_deviceSampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)m_deviceSampleRate / 1000)); } @@ -592,15 +593,15 @@ void SDRdaemonSourceGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } @@ -731,7 +732,7 @@ void SDRdaemonSourceGui::updateHardware() void SDRdaemonSourceGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -748,7 +749,7 @@ void SDRdaemonSourceGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.h b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.h index dbc71a083..b66b536b7 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.h +++ b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.h @@ -26,7 +26,7 @@ #include "sdrdaemonsourceinput.h" -class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class SDRdaemonSourceGui; @@ -36,7 +36,7 @@ class SDRdaemonSourceGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit SDRdaemonSourceGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit SDRdaemonSourceGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~SDRdaemonSourceGui(); virtual void destroy(); @@ -54,7 +54,7 @@ public: private: Ui::SDRdaemonSourceGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; SDRdaemonSourceSettings m_settings; //!< current settings SDRdaemonSourceSettings m_controlSettings; //!< settings last sent to device via control port QTimer m_updateTimer; diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.cpp b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.cpp index 0f4417cef..9b4c7e989 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.cpp +++ b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor SDRdaemonSourcePlugin::m_pluginDescriptor = { QString("SDRdaemon source input"), - QString("3.5.0"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -54,27 +54,28 @@ void SDRdaemonSourcePlugin::initPlugin(PluginAPI* pluginAPI) PluginInterface::SamplingDevices SDRdaemonSourcePlugin::enumSampleSources() { SamplingDevices result; - int count = 1; - for(int i = 0; i < count; i++) - { - QString displayedName(QString("SDRdaemonSource[%1]").arg(i)); - - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString::null, - i)); - } + result.append(SamplingDevice( + "SDRdaemonSource", + m_hardwareID, + m_deviceTypeID, + QString::null, + 0, + PluginInterface::SamplingDevice::BuiltInDevice, + true, + 0)); return result; } -PluginInstanceGUI* SDRdaemonSourcePlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* SDRdaemonSourcePlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - SDRdaemonSourceGui* gui = new SDRdaemonSourceGui(deviceAPI); + SDRdaemonSourceGui* gui = new SDRdaemonSourceGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.h b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.h index 1c154d112..1381ea617 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.h +++ b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/plugins/samplesource/sdrplay/readme.md b/plugins/samplesource/sdrplay/readme.md index 16e446991..eacd052a8 100644 --- a/plugins/samplesource/sdrplay/readme.md +++ b/plugins/samplesource/sdrplay/readme.md @@ -18,7 +18,7 @@ As mentioned already the plugin depends on libmirisdr-4. You will have to compil

1. Common controls

-Controls common to all source plugins. See [main interface description](../../../sdrbase/readme.md). +Controls common to all source plugins. See [main interface description](../../../sdrgui/readme.md).

2. Local oscillator frequency correction

diff --git a/plugins/samplesource/sdrplay/sdrplaygui.cpp b/plugins/samplesource/sdrplay/sdrplaygui.cpp index 96e4e8276..790f9a75d 100644 --- a/plugins/samplesource/sdrplay/sdrplaygui.cpp +++ b/plugins/samplesource/sdrplay/sdrplaygui.cpp @@ -20,6 +20,7 @@ #include "sdrplaygui.h" #include +#include "device/deviceuiset.h" #include "ui_sdrplaygui.h" #include "gui/colormapper.h" @@ -28,13 +29,13 @@ #include "dsp/dspcommands.h" -SDRPlayGui::SDRPlayGui(DeviceSourceAPI *deviceAPI, QWidget* parent) : +SDRPlayGui::SDRPlayGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), ui(new Ui::SDRPlayGui), - m_deviceAPI(deviceAPI), + m_deviceUISet(deviceUISet), m_forceSettings(true) { - m_sampleSource = (SDRPlayInput*) m_deviceAPI->getSampleSource(); + m_sampleSource = (SDRPlayInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -198,8 +199,8 @@ void SDRPlayGui::handleInputMessages() void SDRPlayGui::updateSampleRateAndFrequency() { - m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); - m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); + m_deviceUISet->getSpectrum()->setSampleRate(m_sampleRate); + m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); ui->deviceRateText->setText(tr("%1k").arg((float)m_sampleRate / 1000)); } @@ -275,7 +276,7 @@ void SDRPlayGui::updateHardware() void SDRPlayGui::updateStatus() { - int state = m_deviceAPI->state(); + int state = m_deviceUISet->m_deviceSourceAPI->state(); if(m_lastEngineState != state) { @@ -292,7 +293,7 @@ void SDRPlayGui::updateStatus() break; case DSPDeviceSourceEngine::StError: ui->startStop->setStyleSheet("QToolButton { background-color : red; }"); - QMessageBox::information(this, tr("Message"), m_deviceAPI->errorMessage()); + QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceSourceAPI->errorMessage()); break; default: break; @@ -434,15 +435,15 @@ void SDRPlayGui::on_startStop_toggled(bool checked) { if (checked) { - if (m_deviceAPI->initAcquisition()) + if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) { - m_deviceAPI->startAcquisition(); + m_deviceUISet->m_deviceSourceAPI->startAcquisition(); DSPEngine::instance()->startAudioOutput(); } } else { - m_deviceAPI->stopAcquisition(); + m_deviceUISet->m_deviceSourceAPI->stopAcquisition(); DSPEngine::instance()->stopAudioOutput(); } } diff --git a/plugins/samplesource/sdrplay/sdrplaygui.h b/plugins/samplesource/sdrplay/sdrplaygui.h index ac1fefc25..ea0f08b70 100644 --- a/plugins/samplesource/sdrplay/sdrplaygui.h +++ b/plugins/samplesource/sdrplay/sdrplaygui.h @@ -27,8 +27,8 @@ #include "sdrplayinput.h" #include "sdrplaysettings.h" -class DeviceSampleSource; class DeviceSourceAPI; +class DeviceUISet; namespace Ui { class SDRPlayGui; @@ -38,7 +38,7 @@ class SDRPlayGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit SDRPlayGui(DeviceSourceAPI *deviceAPI, QWidget* parent = NULL); + explicit SDRPlayGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~SDRPlayGui(); virtual void destroy(); @@ -56,7 +56,7 @@ public: private: Ui::SDRPlayGui* ui; - DeviceSourceAPI* m_deviceAPI; + DeviceUISet* m_deviceUISet; bool m_forceSettings; SDRPlaySettings m_settings; QTimer m_updateTimer; diff --git a/plugins/samplesource/sdrplay/sdrplayplugin.cpp b/plugins/samplesource/sdrplay/sdrplayplugin.cpp index 74a10d17c..f2030a4e3 100644 --- a/plugins/samplesource/sdrplay/sdrplayplugin.cpp +++ b/plugins/samplesource/sdrplay/sdrplayplugin.cpp @@ -25,7 +25,7 @@ const PluginDescriptor SDRPlayPlugin::m_pluginDescriptor = { QString("SDRPlay RSP1 Input"), - QString("3.7.4"), + QString("3.8.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -77,17 +77,23 @@ PluginInterface::SamplingDevices SDRPlayPlugin::enumSampleSources() m_hardwareID, m_deviceTypeID, QString(serial), - i)); + i, + PluginInterface::SamplingDevice::PhysicalDevice, + true, + 0)); } return result; } -PluginInstanceGUI* SDRPlayPlugin::createSampleSourcePluginInstanceGUI(const QString& sourceId,QWidget **widget, DeviceSourceAPI *deviceAPI) +PluginInstanceGUI* SDRPlayPlugin::createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - SDRPlayGui* gui = new SDRPlayGui(deviceAPI); + SDRPlayGui* gui = new SDRPlayGui(deviceUISet); *widget = gui; return gui; } diff --git a/plugins/samplesource/sdrplay/sdrplayplugin.h b/plugins/samplesource/sdrplay/sdrplayplugin.h index 12417334d..7f0505548 100644 --- a/plugins/samplesource/sdrplay/sdrplayplugin.h +++ b/plugins/samplesource/sdrplay/sdrplayplugin.h @@ -36,7 +36,10 @@ public: void initPlugin(PluginAPI* pluginAPI); virtual SamplingDevices enumSampleSources(); - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId, QWidget **widget, DeviceSourceAPI *deviceAPI); + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId, + QWidget **widget, + DeviceUISet *deviceUISet); virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI); static const QString m_hardwareID; diff --git a/sdrangel.windows.pro b/sdrangel.windows.pro index efbf7d159..cdd3d9c49 100644 --- a/sdrangel.windows.pro +++ b/sdrangel.windows.pro @@ -1,61 +1,61 @@ -#-------------------------------------------------------- -# -# Pro file for Android and Windows builds with Qt Creator -# -#-------------------------------------------------------- - -TEMPLATE = subdirs - -SUBDIRS = serialdv -SUBDIRS += sdrbase -SUBDIRS += sdrgui -CONFIG(MINGW64)SUBDIRS += nanomsg -SUBDIRS += fcdhid -SUBDIRS += fcdlib -SUBDIRS += librtlsdr -SUBDIRS += libhackrf -SUBDIRS += libairspy -SUBDIRS += libbladerf -SUBDIRS += libsqlite3 -SUBDIRS += liblimesuite -SUBDIRS += libiio -SUBDIRS += devices -SUBDIRS += mbelib -SUBDIRS += dsdcc -SUBDIRS += httpserver -CONFIG(MINGW64)SUBDIRS += cm256cc -SUBDIRS += plugins/samplesource/filesource -CONFIG(MINGW64)SUBDIRS += plugins/samplesource/sdrdaemonsource -SUBDIRS += plugins/samplesource/rtlsdr -SUBDIRS += plugins/samplesource/hackrfinput -SUBDIRS += plugins/samplesource/airspy -SUBDIRS += plugins/samplesource/bladerfinput -SUBDIRS += plugins/samplesource/limesdrinput -SUBDIRS += plugins/samplesource/plutosdrinput -SUBDIRS += plugins/samplesink/filesink -SUBDIRS += plugins/samplesink/bladerfoutput -SUBDIRS += plugins/samplesink/hackrfoutput -SUBDIRS += plugins/samplesink/limesdroutput -#SUBDIRS += plugins/samplesink/plutosdroutput -SUBDIRS += plugins/channelrx/chanalyzer -SUBDIRS += plugins/channelrx/chanalyzerng -SUBDIRS += plugins/channelrx/demodam -SUBDIRS += plugins/channelrx/demodatv -SUBDIRS += plugins/channelrx/demodbfm -SUBDIRS += plugins/channelrx/demoddsd -SUBDIRS += plugins/channelrx/demodlora -SUBDIRS += plugins/channelrx/demodnfm -SUBDIRS += plugins/channelrx/demodssb -SUBDIRS += plugins/channelrx/demodwfm -SUBDIRS += plugins/channelrx/tcpsrc -SUBDIRS += plugins/channelrx/udpsrc -SUBDIRS += plugins/channeltx/modam -CONFIG(macx)SUBDIRS += plugins/channeltx/modatv -SUBDIRS += plugins/channeltx/modnfm -SUBDIRS += plugins/channeltx/modssb -SUBDIRS += plugins/channeltx/modwfm -SUBDIRS += plugins/channeltx/udpsink - -# Main app must be last -CONFIG += ordered -SUBDIRS += app +#-------------------------------------------------------- +# +# Pro file for Android and Windows builds with Qt Creator +# +#-------------------------------------------------------- + +TEMPLATE = subdirs + +SUBDIRS = serialdv +SUBDIRS += sdrbase +SUBDIRS += sdrgui +CONFIG(MINGW64)SUBDIRS += nanomsg +SUBDIRS += fcdhid +SUBDIRS += fcdlib +SUBDIRS += librtlsdr +SUBDIRS += libhackrf +SUBDIRS += libairspy +SUBDIRS += libbladerf +SUBDIRS += libsqlite3 +SUBDIRS += liblimesuite +SUBDIRS += libiio +SUBDIRS += devices +SUBDIRS += mbelib +SUBDIRS += dsdcc +SUBDIRS += httpserver +CONFIG(MINGW64)SUBDIRS += cm256cc +SUBDIRS += plugins/samplesource/filesource +CONFIG(MINGW64)SUBDIRS += plugins/samplesource/sdrdaemonsource +SUBDIRS += plugins/samplesource/rtlsdr +SUBDIRS += plugins/samplesource/hackrfinput +SUBDIRS += plugins/samplesource/airspy +SUBDIRS += plugins/samplesource/bladerfinput +SUBDIRS += plugins/samplesource/limesdrinput +SUBDIRS += plugins/samplesource/plutosdrinput +SUBDIRS += plugins/samplesink/filesink +SUBDIRS += plugins/samplesink/bladerfoutput +SUBDIRS += plugins/samplesink/hackrfoutput +SUBDIRS += plugins/samplesink/limesdroutput +SUBDIRS += plugins/samplesink/plutosdroutput +SUBDIRS += plugins/channelrx/chanalyzer +SUBDIRS += plugins/channelrx/chanalyzerng +SUBDIRS += plugins/channelrx/demodam +SUBDIRS += plugins/channelrx/demodatv +SUBDIRS += plugins/channelrx/demodbfm +SUBDIRS += plugins/channelrx/demoddsd +SUBDIRS += plugins/channelrx/demodlora +SUBDIRS += plugins/channelrx/demodnfm +SUBDIRS += plugins/channelrx/demodssb +SUBDIRS += plugins/channelrx/demodwfm +SUBDIRS += plugins/channelrx/tcpsrc +SUBDIRS += plugins/channelrx/udpsrc +SUBDIRS += plugins/channeltx/modam +CONFIG(macx)SUBDIRS += plugins/channeltx/modatv +SUBDIRS += plugins/channeltx/modnfm +SUBDIRS += plugins/channeltx/modssb +SUBDIRS += plugins/channeltx/modwfm +SUBDIRS += plugins/channeltx/udpsink + +# Main app must be last +CONFIG += ordered +SUBDIRS += app diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt index 49d3480d9..38a5e8e2e 100644 --- a/sdrbase/CMakeLists.txt +++ b/sdrbase/CMakeLists.txt @@ -40,10 +40,13 @@ set(sdrbase_SOURCES dsp/threadedbasebandsamplesink.cpp dsp/threadedbasebandsamplesource.cpp dsp/wfir.cpp - dsp/devicesamplesource.cpp dsp/devicesamplesink.cpp + device/devicesourceapi.cpp + device/devicesinkapi.cpp + device/deviceenumerator.cpp + settings/preferences.cpp settings/preset.cpp settings/mainsettings.cpp @@ -57,6 +60,10 @@ set(sdrbase_SOURCES util/samplesourceserializer.cpp util/simpleserializer.cpp #util/spinlock.cpp + + plugin/plugininterface.cpp + plugin/pluginapi.cpp + plugin/pluginmanager.cpp ) set(sdrbase_HEADERS @@ -115,11 +122,17 @@ set(sdrbase_HEADERS dsp/threadedbasebandsamplesink.h dsp/threadedbasebandsamplesource.h dsp/wfir.h - dsp/devicesamplesource.h dsp/devicesamplesink.h + device/devicesourceapi.h + device/devicesinkapi.h + device/deviceenumerator.h + plugin/plugininstancegui.h + plugin/plugininterface.h + plugin/pluginapi.h + plugin/pluginmanager.h settings/preferences.h settings/preset.h diff --git a/sdrbase/device/deviceenumerator.cpp b/sdrbase/device/deviceenumerator.cpp new file mode 100644 index 000000000..7bb3078e0 --- /dev/null +++ b/sdrbase/device/deviceenumerator.cpp @@ -0,0 +1,199 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 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 + +#include "plugin/pluginmanager.h" +#include "deviceenumerator.h" + +Q_GLOBAL_STATIC(DeviceEnumerator, deviceEnumerator) +DeviceEnumerator *DeviceEnumerator::instance() +{ + return deviceEnumerator; +} + +DeviceEnumerator::DeviceEnumerator() +{} + +DeviceEnumerator::~DeviceEnumerator() +{} + +void DeviceEnumerator::enumerateRxDevices(PluginManager *pluginManager) +{ + m_rxEnumeration.clear(); + PluginAPI::SamplingDeviceRegistrations& rxDeviceRegistrations = pluginManager->getSourceDeviceRegistrations(); + int index = 0; + + for (int i = 0; i < rxDeviceRegistrations.count(); i++) + { + PluginInterface::SamplingDevices samplingDevices = rxDeviceRegistrations[i].m_plugin->enumSampleSources(); + + for (int j = 0; j < samplingDevices.count(); j++) + { + m_rxEnumeration.push_back( + DeviceEnumeration( + samplingDevices[j], + rxDeviceRegistrations[i].m_plugin, + index + ) + ); + index++; + } + } +} + +void DeviceEnumerator::enumerateTxDevices(PluginManager *pluginManager) +{ + m_txEnumeration.clear(); + PluginAPI::SamplingDeviceRegistrations& txDeviceRegistrations = pluginManager->getSinkDeviceRegistrations(); + int index = 0; + + for (int i = 0; i < txDeviceRegistrations.count(); i++) + { + PluginInterface::SamplingDevices samplingDevices = txDeviceRegistrations[i].m_plugin->enumSampleSources(); + + for (int j = 0; j < samplingDevices.count(); j++) + { + m_rxEnumeration.push_back( + DeviceEnumeration( + samplingDevices[j], + txDeviceRegistrations[i].m_plugin, + index + ) + ); + index++; + } + } +} + +void DeviceEnumerator::listRxDeviceNames(QList& list, std::vector& indexes) const +{ + for (DevicesEnumeration::const_iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it) + { + if ((it->m_samplingDevice.claimed < 0) || (it->m_samplingDevice.type == PluginInterface::SamplingDevice::BuiltInDevice)) + { + list.append(it->m_samplingDevice.displayedName); + indexes.push_back(it->m_index); + } + } +} + +void DeviceEnumerator::listTxDeviceNames(QList& list, std::vector& indexes) const +{ + for (DevicesEnumeration::const_iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it) + { + if ((it->m_samplingDevice.claimed < 0) || (it->m_samplingDevice.type == PluginInterface::SamplingDevice::BuiltInDevice)) + { + list.append(it->m_samplingDevice.displayedName); + indexes.push_back(it->m_index); + } + } +} + +void DeviceEnumerator::changeRxSelection(int tabIndex, int deviceIndex) +{ + for (DevicesEnumeration::iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it) + { + if (it->m_samplingDevice.claimed == tabIndex) { + it->m_samplingDevice.claimed = -1; + } + if (it->m_index == deviceIndex) { + it->m_samplingDevice.claimed = tabIndex; + } + } +} + +void DeviceEnumerator::changeTxSelection(int tabIndex, int deviceIndex) +{ + for (DevicesEnumeration::iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it) + { + if (it->m_samplingDevice.claimed == tabIndex) { + it->m_samplingDevice.claimed = -1; + } + if (it->m_index == deviceIndex) { + it->m_samplingDevice.claimed = tabIndex; + } + } +} + +void DeviceEnumerator::removeRxSelection(int tabIndex) +{ + for (DevicesEnumeration::iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it) + { + if (it->m_samplingDevice.claimed == tabIndex) { + it->m_samplingDevice.claimed = -1; + } + } +} + +void DeviceEnumerator::removeTxSelection(int tabIndex) +{ + for (DevicesEnumeration::iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it) + { + if (it->m_samplingDevice.claimed == tabIndex) { + it->m_samplingDevice.claimed = -1; + } + } +} + +int DeviceEnumerator::getFileSourceDeviceIndex() const +{ + for (DevicesEnumeration::const_iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it) + { + if (it->m_samplingDevice.id == PluginManager::getFileSourceDeviceId()) { + return it->m_index; + } + } + + return -1; +} + +int DeviceEnumerator::getFileSinkDeviceIndex() const +{ + for (DevicesEnumeration::const_iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it) + { + if (it->m_samplingDevice.id == PluginManager::getFileSinkDeviceId()) { + return it->m_index; + } + } + + return -1; +} + +int DeviceEnumerator::getRxSamplingDeviceIndex(const QString& deviceId, int sequence) +{ + for (DevicesEnumeration::iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it) + { + if ((it->m_samplingDevice.id == deviceId) && (it->m_samplingDevice.sequence == sequence)) { + return it->m_index; + } + } + + return -1; +} + +int DeviceEnumerator::getTxSamplingDeviceIndex(const QString& deviceId, int sequence) +{ + for (DevicesEnumeration::iterator it = m_txEnumeration.begin(); it != m_txEnumeration.end(); ++it) + { + if ((it->m_samplingDevice.id == deviceId) && (it->m_samplingDevice.sequence == sequence)) { + return it->m_index; + } + } + + return -1; +} + diff --git a/sdrbase/device/deviceenumerator.h b/sdrbase/device/deviceenumerator.h new file mode 100644 index 000000000..92e370f63 --- /dev/null +++ b/sdrbase/device/deviceenumerator.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 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 . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef SDRBASE_DEVICE_DEVICEENUMERATOR_H_ +#define SDRBASE_DEVICE_DEVICEENUMERATOR_H_ + +#include + +#include "plugin/plugininterface.h" + +class PluginManager; + +class DeviceEnumerator +{ +public: + DeviceEnumerator(); + ~DeviceEnumerator(); + + static DeviceEnumerator *instance(); + + void enumerateRxDevices(PluginManager *pluginManager); + void enumerateTxDevices(PluginManager *pluginManager); + void listRxDeviceNames(QList& list, std::vector& indexes) const; + void listTxDeviceNames(QList& list, std::vector& indexes) const; + void changeRxSelection(int tabIndex, int deviceIndex); + void changeTxSelection(int tabIndex, int deviceIndex); + void removeRxSelection(int tabIndex); + void removeTxSelection(int tabIndex); + PluginInterface::SamplingDevice getRxSamplingDevice(int deviceIndex) const { return m_rxEnumeration[deviceIndex].m_samplingDevice; } + PluginInterface::SamplingDevice getTxSamplingDevice(int deviceIndex) const { return m_txEnumeration[deviceIndex].m_samplingDevice; } + PluginInterface *getRxPluginInterface(int deviceIndex) { return m_rxEnumeration[deviceIndex].m_pluginInterface; } + PluginInterface *getTxPluginInterface(int deviceIndex) { return m_txEnumeration[deviceIndex].m_pluginInterface; } + int getFileSourceDeviceIndex() const; + int getFileSinkDeviceIndex() const; + int getRxSamplingDeviceIndex(const QString& deviceId, int sequence); + int getTxSamplingDeviceIndex(const QString& deviceId, int sequence); + +private: + struct DeviceEnumeration + { + PluginInterface::SamplingDevice m_samplingDevice; + PluginInterface *m_pluginInterface; + int m_index; + + DeviceEnumeration(const PluginInterface::SamplingDevice& samplingDevice, PluginInterface *pluginInterface, int index) : + m_samplingDevice(samplingDevice), + m_pluginInterface(pluginInterface), + m_index(index) + {} + }; + + typedef std::vector DevicesEnumeration; + + DevicesEnumeration m_rxEnumeration; + DevicesEnumeration m_txEnumeration; +}; + +#endif /* SDRBASE_DEVICE_DEVICEENUMERATOR_H_ */ diff --git a/sdrgui/device/devicesinkapi.cpp b/sdrbase/device/devicesinkapi.cpp similarity index 61% rename from sdrgui/device/devicesinkapi.cpp rename to sdrbase/device/devicesinkapi.cpp index 6b47ed3fe..6707723e6 100644 --- a/sdrgui/device/devicesinkapi.cpp +++ b/sdrbase/device/devicesinkapi.cpp @@ -18,23 +18,16 @@ #include "device/devicesinkapi.h" #include "device/devicesourceapi.h" #include "dsp/devicesamplesink.h" -#include "plugin/pluginapi.h" #include "plugin/plugininterface.h" -#include "gui/glspectrum.h" -#include "gui/channelwindow.h" #include "settings/preset.h" #include "dsp/dspengine.h" -// TODO: extract GUI dependencies in a separate object DeviceSinkAPI::DeviceSinkAPI(int deviceTabIndex, - DSPDeviceSinkEngine *deviceSinkEngine, - GLSpectrum *glSpectrum, - ChannelWindow *channelWindow) : + DSPDeviceSinkEngine *deviceSinkEngine) : m_deviceTabIndex(deviceTabIndex), m_deviceSinkEngine(deviceSinkEngine), - m_spectrum(glSpectrum), - m_channelWindow(channelWindow), m_sampleSinkSequence(0), + m_itemIndex(0), m_pluginInterface(0), m_sampleSinkPluginInstanceUI(0), m_buddySharedPtr(0), @@ -136,21 +129,6 @@ MessageQueue *DeviceSinkAPI::getSampleSinkGUIMessageQueue() return getSampleSink()->getMessageQueueToGUI(); } -GLSpectrum *DeviceSinkAPI::getSpectrum() -{ - return m_spectrum; -} - -void DeviceSinkAPI::addChannelMarker(ChannelMarker* channelMarker) -{ - m_spectrum->addChannelMarker(channelMarker); -} - -void DeviceSinkAPI::addRollupWidget(QWidget *widget) -{ - m_channelWindow->addRollupWidget(widget); -} - void DeviceSinkAPI::setHardwareId(const QString& id) { m_hardwareId = id; @@ -182,6 +160,11 @@ void DeviceSinkAPI::setSampleSinkSequence(int sequence) m_deviceSinkEngine->setSinkSequence(sequence); } +void DeviceSinkAPI::setItemIndex(uint32_t index) +{ + m_itemIndex = index; +} + void DeviceSinkAPI::setSampleSinkPluginInterface(PluginInterface *iface) { m_pluginInterface = iface; @@ -192,43 +175,6 @@ void DeviceSinkAPI::setSampleSinkPluginInstanceUI(PluginInstanceGUI *gui) m_sampleSinkPluginInstanceUI = gui; } -void DeviceSinkAPI::registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI) -{ - m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI)); - renameChannelInstances(); -} - -void DeviceSinkAPI::removeChannelInstance(PluginInstanceGUI* pluginGUI) -{ - for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) - { - if(it->m_gui == pluginGUI) - { - m_channelInstanceRegistrations.erase(it); - break; - } - } - - renameChannelInstances(); -} - -void DeviceSinkAPI::renameChannelInstances() -{ - for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) - { - m_channelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i].m_channelName).arg(i)); - } -} - -void DeviceSinkAPI::freeChannels() -{ - for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) - { - qDebug("DeviceSinkAPI::freeAll: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); - m_channelInstanceRegistrations[i].m_gui->destroy(); - } -} - void DeviceSinkAPI::loadSinkSettings(const Preset* preset) { if (preset->isSourcePreset()) @@ -276,116 +222,6 @@ void DeviceSinkAPI::saveSinkSettings(Preset* preset) } } -void DeviceSinkAPI::loadChannelSettings(const Preset *preset, PluginAPI *pluginAPI) -{ - if (preset->isSourcePreset()) - { - qDebug("DeviceSinkAPI::loadChannelSettings: Loading preset [%s | %s] not a sink preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); - } - else - { - qDebug("DeviceSinkAPI::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_channelInstanceRegistrations; - m_channelInstanceRegistrations.clear(); - - qDebug("DeviceSinkAPI::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("DeviceSinkAPI::loadChannelSettings: channels compare [%s] vs [%s]", qPrintable(openChannels[i].m_channelName), qPrintable(channelConfig.m_channel)); - - if(openChannels[i].m_channelName == channelConfig.m_channel) - { - qDebug("DeviceSinkAPI::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName)); - reg = openChannels.takeAt(i); - m_channelInstanceRegistrations.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("DeviceSinkAPI::loadChannelSettings: creating new channel [%s]", qPrintable(channelConfig.m_channel)); - reg = ChannelInstanceRegistration(channelConfig.m_channel, (*channelRegistrations)[i].m_plugin->createTxChannel(channelConfig.m_channel, this)); - break; - } - } - } - - if(reg.m_gui != 0) - { - qDebug("DeviceSinkAPI::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("DeviceSinkAPI::loadChannelSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName)); - openChannels[i].m_gui->destroy(); - } - - renameChannelInstances(); - } -} - -void DeviceSinkAPI::saveChannelSettings(Preset *preset) -{ - if (preset->isSourcePreset()) - { - qDebug("DeviceSinkAPI::saveChannelSettings: not a sink preset"); - } - else - { - qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type - - for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) - { - qDebug("DeviceSinkAPI::saveChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); - preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize()); - } - } -} - -// sort by increasing delta frequency and type (i.e. name) -bool DeviceSinkAPI::ChannelInstanceRegistration::operator<(const ChannelInstanceRegistration& other) const -{ - if (m_gui && other.m_gui) - { - if (m_gui->getCenterFrequency() == other.m_gui->getCenterFrequency()) - { - return m_gui->getName() < other.m_gui->getName(); - } - else - { - return m_gui->getCenterFrequency() < other.m_gui->getCenterFrequency(); - } - } - else - { - return false; - } -} - void DeviceSinkAPI::addSourceBuddy(DeviceSourceAPI* buddy) { m_sourceBuddies.push_back(buddy); diff --git a/sdrgui/device/devicesinkapi.h b/sdrbase/device/devicesinkapi.h similarity index 79% rename from sdrgui/device/devicesinkapi.h rename to sdrbase/device/devicesinkapi.h index f3e9878ac..aebd8c67e 100644 --- a/sdrgui/device/devicesinkapi.h +++ b/sdrbase/device/devicesinkapi.h @@ -23,16 +23,11 @@ #include "dsp/dspdevicesinkengine.h" #include "util/export.h" -class GLSpectrum; -class ChannelWindow; class BasebandSampleSource; class ThreadedBasebandSampleSource; class DeviceSampleSink; class MessageQueue; -class ChannelMarker; -class QWidget; class PluginInstanceGUI; -class PluginAPI; class PluginInterface; class Preset; class DeviceSourceAPI; @@ -42,9 +37,7 @@ class SDRANGEL_API DeviceSinkAPI : public QObject { public: DeviceSinkAPI(int deviceTabIndex, - DSPDeviceSinkEngine *deviceEngine, - GLSpectrum *glSpectrum, - ChannelWindow *channelWindow); + DSPDeviceSinkEngine *deviceEngine); ~DeviceSinkAPI(); // Device engine stuff @@ -66,10 +59,6 @@ public: MessageQueue *getDeviceEngineInputMessageQueue(); MessageQueue *getSampleSinkInputMessageQueue(); MessageQueue *getSampleSinkGUIMessageQueue(); - // device related stuff - GLSpectrum *getSpectrum(); //!< Direct spectrum getter - void addChannelMarker(ChannelMarker* channelMarker); //!< Add channel marker to spectrum - void addRollupWidget(QWidget *widget); //!< Add rollup widget to channel window void setHardwareId(const QString& id); void setSampleSinkId(const QString& id); @@ -77,6 +66,7 @@ public: void setSampleSinkSerial(const QString& serial); void setSampleSinkDisplayName(const QString& serial); void setSampleSinkSequence(int sequence); + void setItemIndex(uint32_t index); void setSampleSinkPluginInterface(PluginInterface *iface); void setSampleSinkPluginInstanceUI(PluginInstanceGUI *gui); @@ -84,19 +74,17 @@ public: const QString& getSampleSinkId() const { return m_sampleSinkId; } const QString& getSampleSinkSerial() const { return m_sampleSinkSerial; } const QString& getSampleSinkDisplayName() const { return m_sampleSinkDisplayName; } - PluginInterface *getPluginInterface() { return m_pluginInterface; } uint32_t getSampleSinkSequence() const { return m_sampleSinkSequence; } + uint32_t getItemIndex() const { return m_itemIndex; } + PluginInterface *getPluginInterface() { return m_pluginInterface; } PluginInstanceGUI *getSampleSinkPluginInstanceGUI() { return m_sampleSinkPluginInstanceUI; } 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; } @@ -112,51 +100,26 @@ public: bool isBuddyLeader() const { return m_isBuddyLeader; } void setBuddyLeader(bool isBuddyLeader) { m_isBuddyLeader = isBuddyLeader; } - const QTimer& getMasterTimer() const { return m_masterTimer; } + const QTimer& getMasterTimer() const { return m_masterTimer; } //!< This is the DSPEngine master timer protected: - struct ChannelInstanceRegistration - { - QString m_channelName; - PluginInstanceGUI* m_gui; - - ChannelInstanceRegistration() : - m_channelName(), - m_gui(0) - { } - - ChannelInstanceRegistration(const QString& channelName, PluginInstanceGUI* pluginGUI) : - m_channelName(channelName), - m_gui(pluginGUI) - { } - - bool operator<(const ChannelInstanceRegistration& other) const; - }; - - typedef QList ChannelInstanceRegistrations; - - void renameChannelInstances(); - int m_deviceTabIndex; DSPDeviceSinkEngine *m_deviceSinkEngine; - GLSpectrum *m_spectrum; - ChannelWindow *m_channelWindow; - QString m_hardwareId; - QString m_sampleSinkId; - QString m_sampleSinkSerial; - QString m_sampleSinkDisplayName; - uint32_t m_sampleSinkSequence; + QString m_hardwareId; //!< The internal id that identifies the type of hardware (i.e. HackRF, BladeRF, ...) + QString m_sampleSinkId; //!< The internal plugin ID corresponding to the device (i.e. for HackRF input, for HackRF output ...) + QString m_sampleSinkSerial; //!< The device serial number defined by the vendor + QString m_sampleSinkDisplayName; //!< The human readable name identifying this instance + uint32_t m_sampleSinkSequence; //!< The device sequence. >0 when more than one device of the same type is connected + uint32_t m_itemIndex; //!< The Rx stream index. Can be >0 for NxM devices (i.e. 0 or 1 for LimeSDR) PluginInterface* m_pluginInterface; PluginInstanceGUI* m_sampleSinkPluginInstanceUI; - ChannelInstanceRegistrations m_channelInstanceRegistrations; - std::vector m_sourceBuddies; //!< Device source APIs referencing the same physical device std::vector m_sinkBuddies; //!< Device sink APIs referencing the same physical device void *m_buddySharedPtr; bool m_isBuddyLeader; - const QTimer& m_masterTimer; + const QTimer& m_masterTimer; //!< This is the DSPEngine master timer friend class DeviceSourceAPI; }; diff --git a/sdrgui/device/devicesourceapi.cpp b/sdrbase/device/devicesourceapi.cpp similarity index 61% rename from sdrgui/device/devicesourceapi.cpp rename to sdrbase/device/devicesourceapi.cpp index 138937ab4..4522412fa 100644 --- a/sdrgui/device/devicesourceapi.cpp +++ b/sdrbase/device/devicesourceapi.cpp @@ -18,23 +18,16 @@ #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" #include "dsp/devicesamplesource.h" -#include "plugin/pluginapi.h" #include "plugin/plugininterface.h" -#include "gui/glspectrum.h" -#include "gui/channelwindow.h" #include "settings/preset.h" #include "dsp/dspengine.h" -// TODO: extract GUI dependencies in a separate object DeviceSourceAPI::DeviceSourceAPI(int deviceTabIndex, - DSPDeviceSourceEngine *deviceSourceEngine, - GLSpectrum *glSpectrum, - ChannelWindow *channelWindow) : + DSPDeviceSourceEngine *deviceSourceEngine) : m_deviceTabIndex(deviceTabIndex), m_deviceSourceEngine(deviceSourceEngine), - m_spectrum(glSpectrum), - m_channelWindow(channelWindow), m_sampleSourceSequence(0), + m_itemIndex(0), m_pluginInterface(0), m_sampleSourcePluginInstanceUI(0), m_buddySharedPtr(0), @@ -128,21 +121,6 @@ void DeviceSourceAPI::configureCorrections(bool dcOffsetCorrection, bool iqImbal m_deviceSourceEngine->configureCorrections(dcOffsetCorrection, iqImbalanceCorrection); } -GLSpectrum *DeviceSourceAPI::getSpectrum() -{ - return m_spectrum; -} - -void DeviceSourceAPI::addChannelMarker(ChannelMarker* channelMarker) -{ - m_spectrum->addChannelMarker(channelMarker); -} - -void DeviceSourceAPI::addRollupWidget(QWidget *widget) -{ - m_channelWindow->addRollupWidget(widget); -} - void DeviceSourceAPI::setHardwareId(const QString& id) { m_hardwareId = id; @@ -174,6 +152,11 @@ void DeviceSourceAPI::setSampleSourceSequence(int sequence) m_deviceSourceEngine->setSourceSequence(sequence); } +void DeviceSourceAPI::setItemIndex(uint32_t index) +{ + m_itemIndex = index; +} + void DeviceSourceAPI::setSampleSourcePluginInterface(PluginInterface *iface) { m_pluginInterface = iface; @@ -184,49 +167,6 @@ void DeviceSourceAPI::setSampleSourcePluginInstanceGUI(PluginInstanceGUI *gui) m_sampleSourcePluginInstanceUI = gui; } -void DeviceSourceAPI::registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI) -{ - m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI)); - renameChannelInstances(); -} - -void DeviceSourceAPI::removeChannelInstance(PluginInstanceGUI* pluginGUI) -{ - for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) - { - if(it->m_gui == pluginGUI) - { - m_channelInstanceRegistrations.erase(it); - break; - } - } - - renameChannelInstances(); -} - -void DeviceSourceAPI::renameChannelInstances() -{ - for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) - { - m_channelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i].m_channelName).arg(i)); - } -} - -void DeviceSourceAPI::freeChannels() -{ -// while(!m_channelInstanceRegistrations.isEmpty()) -// { -// ChannelInstanceRegistration reg(m_channelInstanceRegistrations.takeLast()); -// reg.m_gui->destroy(); -// } - - for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) - { - qDebug("DeviceSourceAPI::freeAll: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); - m_channelInstanceRegistrations[i].m_gui->destroy(); - } -} - void DeviceSourceAPI::loadSourceSettings(const Preset* preset) { if (preset->isSourcePreset()) @@ -279,116 +219,6 @@ void DeviceSourceAPI::saveSourceSettings(Preset* preset) } } -void DeviceSourceAPI::loadChannelSettings(const Preset *preset, PluginAPI *pluginAPI) -{ - if (preset->isSourcePreset()) - { - qDebug("DeviceSourceAPI::loadChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); - - // Available channel plugins - PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getRxChannelRegistrations(); - - // copy currently open channels and clear list - ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; - m_channelInstanceRegistrations.clear(); - - qDebug("DeviceSourceAPI::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("DeviceSourceAPI::loadChannelSettings: channels compare [%s] vs [%s]", qPrintable(openChannels[i].m_channelName), qPrintable(channelConfig.m_channel)); - - if(openChannels[i].m_channelName == channelConfig.m_channel) - { - qDebug("DeviceSourceAPI::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName)); - reg = openChannels.takeAt(i); - m_channelInstanceRegistrations.append(reg); - break; - } - } - - // if we haven't one already, create one - - if(reg.m_gui == NULL) - { - for(int i = 0; i < channelRegistrations->count(); i++) - { - if((*channelRegistrations)[i].m_channelName == channelConfig.m_channel) - { - qDebug("DeviceSourceAPI::loadChannelSettings: creating new channel [%s]", qPrintable(channelConfig.m_channel)); - reg = ChannelInstanceRegistration(channelConfig.m_channel, (*channelRegistrations)[i].m_plugin->createRxChannel(channelConfig.m_channel, this)); - break; - } - } - } - - if(reg.m_gui != NULL) - { - qDebug("DeviceSourceAPI::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("DeviceSourceAPI::loadChannelSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName)); - openChannels[i].m_gui->destroy(); - } - - renameChannelInstances(); - } - else - { - qDebug("DeviceSourceAPI::loadChannelSettings: Loading preset [%s | %s] not a source preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); - } -} - -void DeviceSourceAPI::saveChannelSettings(Preset *preset) -{ - if (preset->isSourcePreset()) - { - qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type - - for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) - { - qDebug("DeviceSourceAPI::saveChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); - preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize()); - } - } - else - { - qDebug("DeviceSourceAPI::saveChannelSettings: not a source preset"); - } -} - -// sort by increasing delta frequency and type (i.e. name) -bool DeviceSourceAPI::ChannelInstanceRegistration::operator<(const ChannelInstanceRegistration& other) const -{ - if (m_gui && other.m_gui) - { - if (m_gui->getCenterFrequency() == other.m_gui->getCenterFrequency()) - { - return m_gui->getName() < other.m_gui->getName(); - } - else - { - return m_gui->getCenterFrequency() < other.m_gui->getCenterFrequency(); - } - } - else - { - return false; - } -} - void DeviceSourceAPI::addSourceBuddy(DeviceSourceAPI* buddy) { m_sourceBuddies.push_back(buddy); diff --git a/sdrgui/device/devicesourceapi.h b/sdrbase/device/devicesourceapi.h similarity index 76% rename from sdrgui/device/devicesourceapi.h rename to sdrbase/device/devicesourceapi.h index e6ead1370..516b0c61e 100644 --- a/sdrgui/device/devicesourceapi.h +++ b/sdrbase/device/devicesourceapi.h @@ -25,16 +25,11 @@ #include "util/export.h" -class GLSpectrum; -class ChannelWindow; class BasebandSampleSink; class ThreadedBasebandSampleSink; class DeviceSampleSource; class MessageQueue; -class ChannelMarker; -class QWidget; class PluginInstanceGUI; -class PluginAPI; class PluginInterface; class Preset; class DeviceSinkAPI; @@ -44,9 +39,7 @@ class SDRANGEL_API DeviceSourceAPI : public QObject { public: DeviceSourceAPI(int deviceTabIndex, - DSPDeviceSourceEngine *deviceSourceEngine, - GLSpectrum *glSpectrum, - ChannelWindow *channelWindow); + DSPDeviceSourceEngine *deviceSourceEngine); ~DeviceSourceAPI(); // Device engine stuff @@ -67,17 +60,13 @@ public: MessageQueue *getSampleSourceGUIMessageQueue(); void configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection); //!< Configure current device engine DSP corrections - // device related stuff - GLSpectrum *getSpectrum(); //!< Direct spectrum getter - void addChannelMarker(ChannelMarker* channelMarker); //!< Add channel marker to spectrum - void addRollupWidget(QWidget *widget); //!< Add rollup widget to channel window - void setHardwareId(const QString& id); void setSampleSourceId(const QString& id); void resetSampleSourceId(); void setSampleSourceSerial(const QString& serial); void setSampleSourceDisplayName(const QString& serial); void setSampleSourceSequence(int sequence); + void setItemIndex(uint32_t index); void setSampleSourcePluginInterface(PluginInterface *iface); void setSampleSourcePluginInstanceGUI(PluginInstanceGUI *gui); @@ -85,19 +74,13 @@ public: const QString& getSampleSourceId() const { return m_sampleSourceId; } const QString& getSampleSourceSerial() const { return m_sampleSourceSerial; } const QString& getSampleSourceDisplayName() const { return m_sampleSourceDisplayName; } - PluginInterface *getPluginInterface() { return m_pluginInterface; } uint32_t getSampleSourceSequence() const { return m_sampleSourceSequence; } + uint32_t getItemIndex() const { return m_itemIndex; } + PluginInterface *getPluginInterface() { return m_pluginInterface; } PluginInstanceGUI *getSampleSourcePluginInstanceGUI() { return m_sampleSourcePluginInstanceUI; } - void registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI); - void removeChannelInstance(PluginInstanceGUI* pluginGUI); - - void freeChannels(); - void loadSourceSettings(const Preset* preset); void saveSourceSettings(Preset* preset); - void loadChannelSettings(const Preset* preset, PluginAPI *pluginAPI); - void saveChannelSettings(Preset* preset); DSPDeviceSourceEngine *getDeviceSourceEngine() { return m_deviceSourceEngine; } @@ -113,52 +96,26 @@ public: bool isBuddyLeader() const { return m_isBuddyLeader; } void setBuddyLeader(bool isBuddyLeader) { m_isBuddyLeader = isBuddyLeader; } - const QTimer& getMasterTimer() const { return m_masterTimer; } + const QTimer& getMasterTimer() const { return m_masterTimer; } //!< This is the DSPEngine master timer protected: - struct ChannelInstanceRegistration - { - QString m_channelName; - PluginInstanceGUI* m_gui; - - ChannelInstanceRegistration() : - m_channelName(), - m_gui(NULL) - { } - - ChannelInstanceRegistration(const QString& channelName, PluginInstanceGUI* pluginGUI) : - m_channelName(channelName), - m_gui(pluginGUI) - { } - - bool operator<(const ChannelInstanceRegistration& other) const; - }; - - typedef QList ChannelInstanceRegistrations; - - - void renameChannelInstances(); - int m_deviceTabIndex; DSPDeviceSourceEngine *m_deviceSourceEngine; - GLSpectrum *m_spectrum; - ChannelWindow *m_channelWindow; - QString m_hardwareId; - QString m_sampleSourceId; - QString m_sampleSourceSerial; - QString m_sampleSourceDisplayName; - uint32_t m_sampleSourceSequence; + QString m_hardwareId; //!< The internal id that identifies the type of hardware (i.e. HackRF, BladeRF, ...) + QString m_sampleSourceId; //!< The internal plugin ID corresponding to the device (i.e. for HackRF input, for HackRF output ...) + QString m_sampleSourceSerial; //!< The device serial number defined by the vendor or a fake one (SDRplay) + QString m_sampleSourceDisplayName; //!< The human readable name identifying this instance + uint32_t m_sampleSourceSequence; //!< The device sequence. >0 when more than one device of the same type is connected + uint32_t m_itemIndex; //!< The Rx stream index. Can be >0 for NxM devices (i.e. 0 or 1 for LimeSDR) PluginInterface* m_pluginInterface; PluginInstanceGUI* m_sampleSourcePluginInstanceUI; - ChannelInstanceRegistrations m_channelInstanceRegistrations; - std::vector m_sourceBuddies; //!< Device source APIs referencing the same physical device std::vector m_sinkBuddies; //!< Device sink APIs referencing the same physical device void *m_buddySharedPtr; bool m_isBuddyLeader; - const QTimer& m_masterTimer; + const QTimer& m_masterTimer; //!< This is the DSPEngine master timer friend class DeviceSinkAPI; }; diff --git a/sdrgui/plugin/pluginapi.cpp b/sdrbase/plugin/pluginapi.cpp similarity index 97% rename from sdrgui/plugin/pluginapi.cpp rename to sdrbase/plugin/pluginapi.cpp index 1e2f55039..7a3e63e15 100644 --- a/sdrgui/plugin/pluginapi.cpp +++ b/sdrbase/plugin/pluginapi.cpp @@ -1,4 +1,3 @@ -#include #include "plugin/pluginapi.h" #include "plugin/pluginmanager.h" @@ -32,7 +31,6 @@ PluginAPI::ChannelRegistrations *PluginAPI::getTxChannelRegistrations() return m_pluginManager->getTxChannelRegistrations(); } - PluginAPI::PluginAPI(PluginManager* pluginManager) : m_pluginManager(pluginManager) { diff --git a/sdrgui/plugin/pluginapi.h b/sdrbase/plugin/pluginapi.h similarity index 64% rename from sdrgui/plugin/pluginapi.h rename to sdrbase/plugin/pluginapi.h index 76af7e80f..0cc629fa9 100644 --- a/sdrgui/plugin/pluginapi.h +++ b/sdrbase/plugin/pluginapi.h @@ -5,11 +5,11 @@ #include #include "util/export.h" +#include "plugin/plugininterface.h" class QString; class PluginManager; -class PluginInterface; class MessageQueue; class PluginInstanceGUI; @@ -17,12 +17,24 @@ class SDRANGEL_API PluginAPI : public QObject { Q_OBJECT public: + struct SamplingDeviceRegistration //!< This is the device registration + { + QString m_deviceId; + PluginInterface* m_plugin; + SamplingDeviceRegistration(const QString& deviceId, PluginInterface* plugin) : + m_deviceId(deviceId), + m_plugin(plugin) + { } + }; + + typedef QList SamplingDeviceRegistrations; + struct ChannelRegistration { - QString m_channelName; + QString m_channelId; //!< Channel or device type ID PluginInterface* m_plugin; - ChannelRegistration(const QString& channelName, PluginInterface* plugin) : - m_channelName(channelName), + ChannelRegistration(const QString& channelId, PluginInterface* plugin) : + m_channelId(channelId), m_plugin(plugin) { } }; diff --git a/sdrgui/plugin/plugininterface.cpp b/sdrbase/plugin/plugininterface.cpp similarity index 78% rename from sdrgui/plugin/plugininterface.cpp rename to sdrbase/plugin/plugininterface.cpp index 7db1c63ed..458379fd6 100644 --- a/sdrgui/plugin/plugininterface.cpp +++ b/sdrbase/plugin/plugininterface.cpp @@ -6,20 +6,20 @@ void PluginInterface::deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui) { - ui->destroy(); + if (ui) { ui->destroy(); } } void PluginInterface::deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source) { - source->destroy(); + if (source) { source->destroy(); } } void PluginInterface::deleteSampleSinkPluginInstanceGUI(PluginInstanceGUI *ui) { - ui->destroy(); + if (ui) { ui->destroy(); } } void PluginInterface::deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink) { - sink->destroy(); + if (sink) { sink->destroy(); } } diff --git a/sdrbase/plugin/plugininterface.h b/sdrbase/plugin/plugininterface.h new file mode 100644 index 000000000..b840e1895 --- /dev/null +++ b/sdrbase/plugin/plugininterface.h @@ -0,0 +1,117 @@ +#ifndef INCLUDE_PLUGININTERFACE_H +#define INCLUDE_PLUGININTERFACE_H + +#include +#include + +struct PluginDescriptor { + // general plugin description + const QString displayedName; + const QString version; + const QString copyright; + const QString website; + bool licenseIsGPL; + const QString sourceCodeURL; +}; + +class PluginAPI; +class DeviceSourceAPI; +class DeviceUISet; +class DeviceSinkAPI; +class PluginInstanceGUI; +class QWidget; +class DeviceSampleSource; +class DeviceSampleSink; + +class PluginInterface { +public: + struct SamplingDevice + { + enum SamplingDeviceType + { + PhysicalDevice, + BuiltInDevice + }; + + QString displayedName; //!< The human readable name + QString hardwareId; //!< The internal id that identifies the type of hardware (i.e. HackRF, BladeRF, ...) + QString id; //!< The internal plugin ID corresponding to the device (i.e. for HackRF input, for HackRF output ...) + QString serial; //!< The device serial number defined by the vendor or a fake one (SDRplay) + int sequence; //!< The device sequence. >0 when more than one device of the same type is connected + SamplingDeviceType type; //!< The sampling device type for behavior information + bool rxElseTx; //!< This is the Rx part else the Tx part of the device + int deviceItemIndex; //!< For composite devices this is the Rx or Tx stream index. -1 if not initialized + int claimed; //!< This is the device set index if claimed else -1 + + SamplingDevice(const QString& _displayedName, + const QString& _hardwareId, + const QString& _id, + const QString& _serial, + int _sequence, + SamplingDeviceType _type, + bool _rxElseTx, + int _deviceItemIndex) : + displayedName(_displayedName), + hardwareId(_hardwareId), + id(_id), + serial(_serial), + sequence(_sequence), + type(_type), + rxElseTx(_rxElseTx), + deviceItemIndex(_deviceItemIndex), + claimed(-1) + { } + }; + typedef QList SamplingDevices; + + virtual ~PluginInterface() { }; + + virtual const PluginDescriptor& getPluginDescriptor() const = 0; + virtual void initPlugin(PluginAPI* pluginAPI) = 0; + + // channel Rx plugins + + virtual PluginInstanceGUI* createRxChannel( + const QString& channelName __attribute__((unused)), + DeviceUISet *deviceUISet __attribute__((unused)) ) + { return 0; } + + // channel Tx plugins + + virtual PluginInstanceGUI* createTxChannel( + const QString& channelName __attribute__((unused)), + DeviceUISet *deviceUISet __attribute__((unused)) ) + { return 0; } + + // device source plugins only + + virtual SamplingDevices enumSampleSources() { return SamplingDevices(); } + + virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( + const QString& sourceId __attribute__((unused)), + QWidget **widget __attribute__((unused)), + DeviceUISet *deviceUISet __attribute__((unused))) + { return 0; } + + virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId __attribute__((unused)), DeviceSourceAPI *deviceAPI __attribute__((unused))) { return 0; } // creates the input "core" + virtual void deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui); + virtual void deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source); + + // device sink plugins only + + virtual SamplingDevices enumSampleSinks() { return SamplingDevices(); } + + virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( + const QString& sinkId __attribute__((unused)), + QWidget **widget __attribute__((unused)), + DeviceUISet *deviceUISet __attribute__((unused))) + { return 0; } + + virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId __attribute__((unused)), DeviceSinkAPI *deviceAPI __attribute__((unused))) { return 0; } // creates the output "core" + virtual void deleteSampleSinkPluginInstanceGUI(PluginInstanceGUI *ui); + virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink); +}; + +Q_DECLARE_INTERFACE(PluginInterface, "SDRangel.PluginInterface/0.1"); + +#endif // INCLUDE_PLUGININTERFACE_H diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp new file mode 100644 index 000000000..559cb47b6 --- /dev/null +++ b/sdrbase/plugin/pluginmanager.cpp @@ -0,0 +1,196 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 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 +#include +//#include +#include + +#include + +#include +#include "device/devicesourceapi.h" +#include "device/devicesinkapi.h" +#include "device/deviceenumerator.h" +#include "settings/preset.h" +#include "util/message.h" +#include "dsp/dspdevicesourceengine.h" +#include "dsp/dspdevicesinkengine.h" + +#include "plugin/pluginmanager.h" + +const QString PluginManager::m_sdrDaemonSourceHardwareID = "SDRdaemonSource"; +const QString PluginManager::m_sdrDaemonSourceDeviceTypeID = "sdrangel.samplesource.sdrdaemonsource"; +const QString PluginManager::m_fileSourceHardwareID = "FileSource"; +const QString PluginManager::m_fileSourceDeviceTypeID = "sdrangel.samplesource.filesource"; + +const QString PluginManager::m_sdrDaemonSinkHardwareID = "SDRdaemonSink"; +const QString PluginManager::m_sdrDaemonSinkDeviceTypeID = "sdrangel.samplesink.sdrdaemonsink"; +const QString PluginManager::m_fileSinkHardwareID = "FileSink"; +const QString PluginManager::m_fileSinkDeviceTypeID = "sdrangel.samplesink.filesink"; + +PluginManager::PluginManager(QObject* parent) : + QObject(parent), + m_pluginAPI(this) +{ +} + +PluginManager::~PluginManager() +{ +// freeAll(); +} + +void PluginManager::loadPlugins() +{ + QString applicationDirPath = QCoreApplication::instance()->applicationDirPath(); + QString applicationLibPath = applicationDirPath + "/../lib"; + qDebug() << "PluginManager::loadPlugins: " << qPrintable(applicationDirPath) << ", " << qPrintable(applicationLibPath); + + QDir pluginsBinDir = QDir(applicationDirPath); + QDir pluginsLibDir = QDir(applicationLibPath); + + loadPlugins(pluginsBinDir); + loadPlugins(pluginsLibDir); + + qSort(m_plugins); + + for (Plugins::const_iterator it = m_plugins.begin(); it != m_plugins.end(); ++it) + { + it->pluginInterface->initPlugin(&m_pluginAPI); + } + + DeviceEnumerator::instance()->enumerateRxDevices(this); + DeviceEnumerator::instance()->enumerateTxDevices(this); +} + +void PluginManager::registerRxChannel(const QString& channelName, PluginInterface* plugin) +{ + qDebug() << "PluginManager::registerRxChannel " + << plugin->getPluginDescriptor().displayedName.toStdString().c_str() + << " with channel name " << channelName; + + m_rxChannelRegistrations.append(PluginAPI::ChannelRegistration(channelName, plugin)); +} + +void PluginManager::registerTxChannel(const QString& channelName, PluginInterface* plugin) +{ + qDebug() << "PluginManager::registerTxChannel " + << plugin->getPluginDescriptor().displayedName.toStdString().c_str() + << " with channel name " << channelName; + + m_txChannelRegistrations.append(PluginAPI::ChannelRegistration(channelName, plugin)); +} + +void PluginManager::registerSampleSource(const QString& sourceName, PluginInterface* plugin) +{ + qDebug() << "PluginManager::registerSampleSource " + << plugin->getPluginDescriptor().displayedName.toStdString().c_str() + << " with source name " << sourceName.toStdString().c_str(); + + m_sampleSourceRegistrations.append(PluginAPI::SamplingDeviceRegistration(sourceName, plugin)); +} + +void PluginManager::registerSampleSink(const QString& sinkName, PluginInterface* plugin) +{ + qDebug() << "PluginManager::registerSampleSink " + << plugin->getPluginDescriptor().displayedName.toStdString().c_str() + << " with sink name " << sinkName.toStdString().c_str(); + + m_sampleSinkRegistrations.append(PluginAPI::SamplingDeviceRegistration(sinkName, plugin)); +} + +void PluginManager::loadPlugins(const QDir& dir) +{ + QDir pluginsDir(dir); + + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + { + if (fileName.endsWith(".so") || fileName.endsWith(".dll") || fileName.endsWith(".dylib")) + { + qDebug() << "PluginManager::loadPlugins: fileName: " << qPrintable(fileName); + + QPluginLoader* loader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName)); + PluginInterface* plugin = qobject_cast(loader->instance()); + + if (loader->isLoaded()) + { + qWarning("PluginManager::loadPlugins: loaded plugin %s", qPrintable(fileName)); + } + else + { + qWarning() << "PluginManager::loadPlugins: " << qPrintable(loader->errorString()); + } + + if (plugin != 0) + { + m_plugins.append(Plugin(fileName, loader, plugin)); + } + else + { + loader->unload(); + } + + delete loader; // Valgrind memcheck + } + } + + // recursive calls on subdirectories + + foreach (QString dirName, pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) + { + loadPlugins(pluginsDir.absoluteFilePath(dirName)); + } +} + +void PluginManager::listTxChannels(QList& list) +{ + list.clear(); + + for(PluginAPI::ChannelRegistrations::iterator it = m_txChannelRegistrations.begin(); it != m_txChannelRegistrations.end(); ++it) + { + const PluginDescriptor& pluginDescipror = it->m_plugin->getPluginDescriptor(); + list.append(pluginDescipror.displayedName); + } +} + +void PluginManager::listRxChannels(QList& list) +{ + list.clear(); + + for(PluginAPI::ChannelRegistrations::iterator it = m_rxChannelRegistrations.begin(); it != m_rxChannelRegistrations.end(); ++it) + { + const PluginDescriptor& pluginDescipror = it->m_plugin->getPluginDescriptor(); + list.append(pluginDescipror.displayedName); + } +} + +void PluginManager::createRxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet) +{ + if (channelPluginIndex < m_rxChannelRegistrations.size()) + { + PluginInterface *pluginInterface = m_rxChannelRegistrations[channelPluginIndex].m_plugin; + pluginInterface->createRxChannel(m_rxChannelRegistrations[channelPluginIndex].m_channelId, deviceUISet); + } +} + +void PluginManager::createTxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet) +{ + if (channelPluginIndex < m_txChannelRegistrations.size()) + { + PluginInterface *pluginInterface = m_txChannelRegistrations[channelPluginIndex].m_plugin; + pluginInterface->createTxChannel(m_txChannelRegistrations[channelPluginIndex].m_channelId, deviceUISet); + } +} diff --git a/sdrbase/plugin/pluginmanager.h b/sdrbase/plugin/pluginmanager.h new file mode 100644 index 000000000..a49c634b9 --- /dev/null +++ b/sdrbase/plugin/pluginmanager.h @@ -0,0 +1,123 @@ +#ifndef INCLUDE_PLUGINMANAGER_H +#define INCLUDE_PLUGINMANAGER_H + +#include +#include +#include +#include +#include + +#include "plugin/plugininterface.h" +#include "plugin/pluginapi.h" +#include "util/export.h" + +class QComboBox; +class QPluginLoader; +class Preset; +class Message; +class MessageQueue; +class DeviceSourceAPI; +class DeviceSinkAPI; + +class SDRANGEL_API PluginManager : public QObject { + Q_OBJECT + +public: + struct Plugin + { + QString filename; + QPluginLoader* loader; + PluginInterface* pluginInterface; + + Plugin(const QString& _filename, QPluginLoader* pluginLoader, PluginInterface* _plugin) : + filename(_filename), + loader(pluginLoader), + pluginInterface(_plugin) + { } + }; + + typedef QList Plugins; + + explicit PluginManager(QObject* parent = 0); + ~PluginManager(); + + PluginAPI *getPluginAPI() { return &m_pluginAPI; } + void loadPlugins(); + const Plugins& getPlugins() const { return m_plugins; } + + // Callbacks from the plugins + void registerRxChannel(const QString& channelName, PluginInterface* plugin); + void registerSampleSource(const QString& sourceName, PluginInterface* plugin); + void registerTxChannel(const QString& channelName, PluginInterface* plugin); + void registerSampleSink(const QString& sourceName, PluginInterface* plugin); + + PluginAPI::SamplingDeviceRegistrations& getSourceDeviceRegistrations() { return m_sampleSourceRegistrations; } + PluginAPI::SamplingDeviceRegistrations& getSinkDeviceRegistrations() { return m_sampleSinkRegistrations; } + PluginAPI::ChannelRegistrations *getRxChannelRegistrations() { return &m_rxChannelRegistrations; } + PluginAPI::ChannelRegistrations *getTxChannelRegistrations() { return &m_txChannelRegistrations; } + + void createRxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet); + void listRxChannels(QList& list); + + void createTxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet); + void listTxChannels(QList& list); + + static const QString& getFileSourceDeviceId() { return m_fileSourceDeviceTypeID; } + static const QString& getFileSinkDeviceId() { return m_fileSinkDeviceTypeID; } + +private: + struct SamplingDevice { //!< This is the device registration + PluginInterface* m_plugin; + QString m_displayName; + QString m_hadrwareId; + QString m_deviceId; + QString m_deviceSerial; + uint32_t m_deviceSequence; + + SamplingDevice(PluginInterface* plugin, + const QString& displayName, + const QString& hadrwareId, + const QString& deviceId, + const QString& deviceSerial, + int deviceSequence) : + m_plugin(plugin), + m_displayName(displayName), + m_hadrwareId(hadrwareId), + m_deviceId(deviceId), + m_deviceSerial(deviceSerial), + m_deviceSequence(deviceSequence) + { } + }; + + typedef QList SamplingDevices; + + PluginAPI m_pluginAPI; + Plugins m_plugins; + + PluginAPI::ChannelRegistrations m_rxChannelRegistrations; //!< Channel plugins register here + PluginAPI::SamplingDeviceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here + + PluginAPI::ChannelRegistrations m_txChannelRegistrations; //!< Channel plugins register here + PluginAPI::SamplingDeviceRegistrations m_sampleSinkRegistrations; //!< Output sink plugins (one per device kind) register here + + // "Local" sample source device IDs + static const QString m_sdrDaemonSourceHardwareID; //!< SDRdaemon source hardware ID + static const QString m_sdrDaemonSourceDeviceTypeID; //!< SDRdaemon source plugin ID + static const QString m_fileSourceHardwareID; //!< FileSource source hardware ID + static const QString m_fileSourceDeviceTypeID; //!< FileSource source plugin ID + + // "Local" sample sink device IDs + static const QString m_sdrDaemonSinkHardwareID; //!< SDRdaemon source hardware ID + static const QString m_sdrDaemonSinkDeviceTypeID; //!< SDRdaemon source plugin ID + static const QString m_fileSinkHardwareID; //!< FileSource source hardware ID + static const QString m_fileSinkDeviceTypeID; //!< FileSink sink plugin ID + + void loadPlugins(const QDir& dir); +}; + +static inline bool operator<(const PluginManager::Plugin& a, const PluginManager::Plugin& b) +{ + return a.pluginInterface->getPluginDescriptor().displayedName < b.pluginInterface->getPluginDescriptor().displayedName; +} + +#endif // INCLUDE_PLUGINMANAGER_H diff --git a/sdrbase/sdrbase.pro b/sdrbase/sdrbase.pro index 6bb6b4435..fc725d506 100644 --- a/sdrbase/sdrbase.pro +++ b/sdrbase/sdrbase.pro @@ -49,6 +49,9 @@ SOURCES += audio/audiodeviceinfo.cpp\ audio/audiofifo.cpp\ audio/audiooutput.cpp\ audio/audioinput.cpp\ + device/devicesourceapi.cpp\ + device/devicesinkapi.cpp\ + device/deviceenumerator.cpp\ dsp/afsquelch.cpp\ dsp/agc.cpp\ dsp/downchannelizer.cpp\ @@ -96,7 +99,10 @@ SOURCES += audio/audiodeviceinfo.cpp\ util/prettyprint.cpp\ util/syncmessenger.cpp\ util/samplesourceserializer.cpp\ - util/simpleserializer.cpp + util/simpleserializer.cpp\ + plugin/plugininterface.cpp\ + plugin/pluginapi.cpp\ + plugin/pluginmanager.cpp HEADERS += audio/audiodeviceinfo.h\ audio/audiofifo.h\ @@ -104,6 +110,7 @@ HEADERS += audio/audiodeviceinfo.h\ audio/audioinput.h\ device/devicesourceapi.h\ device/devicesinkapi.h\ + device/deviceenumerator.h\ dsp/afsquelch.h\ dsp/downchannelizer.h\ dsp/upchannelizer.h\ @@ -157,6 +164,9 @@ HEADERS += audio/audiodeviceinfo.h\ dsp/devicesamplesource.h\ dsp/devicesamplesink.h\ plugin/plugininstancegui.h\ + plugin/plugininterface.h\ + plugin/pluginapi.h\ + plugin/pluginmanager.h\ settings/preferences.h\ settings/preset.h\ settings/mainsettings.h\ diff --git a/sdrbase/settings/mainsettings.h b/sdrbase/settings/mainsettings.h index d5659745b..ea261ca06 100644 --- a/sdrbase/settings/mainsettings.h +++ b/sdrbase/settings/mainsettings.h @@ -25,6 +25,8 @@ public: Preset* getWorkingPreset() { return &m_workingPreset; } int getSourceIndex() const { return m_preferences.getSourceIndex(); } void setSourceIndex(int value) { m_preferences.setSourceIndex(value); } + const QString& getSourceDeviceId() const { return m_preferences.getSourceDevice(); } + void setSourceDeviceId(const QString& deviceId) { m_preferences.setSourceDevice(deviceId); } void setLatitude(float latitude) { m_preferences.setLatitude(latitude); } void setLongitude(float longitude) { m_preferences.setLongitude(longitude); } diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt index 08c63e855..efb8149df 100644 --- a/sdrgui/CMakeLists.txt +++ b/sdrgui/CMakeLists.txt @@ -29,6 +29,7 @@ set(sdrgui_SOURCES gui/presetitem.cpp gui/rollupwidget.cpp gui/samplingdevicecontrol.cpp + gui/samplingdevicedialog.cpp gui/scale.cpp gui/scaleengine.cpp gui/transverterbutton.cpp @@ -43,13 +44,7 @@ set(sdrgui_SOURCES dsp/spectrumscopecombovis.cpp dsp/spectrumscopengcombovis.cpp - device/devicesourceapi.cpp - device/devicesinkapi.cpp device/deviceuiset.cpp - - plugin/pluginapi.cpp - plugin/pluginmanager.cpp - plugin/plugininterface.cpp ) set(sdrgui_HEADERS @@ -81,6 +76,7 @@ set(sdrgui_HEADERS gui/presetitem.h gui/rollupwidget.h gui/samplingdevicecontrol.h + gui/samplingdevicedialog.h gui/scale.h gui/scaleengine.h gui/transverterbutton.h @@ -95,13 +91,7 @@ set(sdrgui_HEADERS dsp/spectrumscopecombovis.h dsp/spectrumscopengcombovis.h - device/devicesourceapi.h - device/devicesinkapi.h device/deviceuiset.h - - plugin/pluginapi.h - plugin/pluginmanager.h - plugin/plugininterface.h ) set(sdrgui_SOURCES @@ -123,6 +113,7 @@ set(sdrgui_FORMS gui/pluginsdialog.ui gui/audiodialog.ui gui/samplingdevicecontrol.ui + gui/samplingdevicedialog.ui gui/myposdialog.ui gui/transverterdialog.ui ) diff --git a/sdrgui/device/deviceuiset.cpp b/sdrgui/device/deviceuiset.cpp index 4590027b3..175e14994 100644 --- a/sdrgui/device/deviceuiset.cpp +++ b/sdrgui/device/deviceuiset.cpp @@ -25,10 +25,14 @@ #include "dsp/dspdevicesinkengine.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" +#include "plugin/plugininstancegui.h" +#include "plugin/pluginapi.h" +#include "plugin/plugininterface.h" +#include "settings/preset.h" #include "deviceuiset.h" -DeviceUISet::DeviceUISet(QTimer& timer) +DeviceUISet::DeviceUISet(int tabIndex, bool rxElseTx, QTimer& timer) { m_spectrum = new GLSpectrum; m_spectrumVis = new SpectrumVis(m_spectrum); @@ -36,11 +40,12 @@ DeviceUISet::DeviceUISet(QTimer& timer) m_spectrumGUI = new GLSpectrumGUI; m_spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, m_spectrum); m_channelWindow = new ChannelWindow; - m_samplingDeviceControl = new SamplingDeviceControl; + m_samplingDeviceControl = new SamplingDeviceControl(tabIndex, rxElseTx); m_deviceSourceEngine = 0; m_deviceSourceAPI = 0; m_deviceSinkEngine = 0; m_deviceSinkAPI = 0; + m_deviceTabIndex = tabIndex; // m_spectrum needs to have its font to be set since it cannot be inherited from the main window QFont font; @@ -59,6 +64,292 @@ DeviceUISet::~DeviceUISet() delete m_spectrum; } - +void DeviceUISet::addChannelMarker(ChannelMarker* channelMarker) +{ + m_spectrum->addChannelMarker(channelMarker); +} + +void DeviceUISet::addRollupWidget(QWidget *widget) +{ + m_channelWindow->addRollupWidget(widget); +} + +void DeviceUISet::registerRxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI) +{ + m_rxChannelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI)); + renameRxChannelInstances(); +} + +void DeviceUISet::registerTxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI) +{ + 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_rxChannelInstanceRegistrations.erase(it); + break; + } + } + + renameRxChannelInstances(); +} + +void DeviceUISet::removeTxChannelInstance(PluginInstanceGUI* pluginGUI) +{ + for(ChannelInstanceRegistrations::iterator it = m_txChannelInstanceRegistrations.begin(); it != m_txChannelInstanceRegistrations.end(); ++it) + { + 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::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()) + { + qDebug("DeviceUISet::loadChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); + + // Available channel plugins + PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getRxChannelRegistrations(); + + // copy currently open channels and clear list + ChannelInstanceRegistrations openChannels = m_rxChannelInstanceRegistrations; + m_rxChannelInstanceRegistrations.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("DeviceSourceAPI::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName)); + reg = openChannels.takeAt(i); + m_rxChannelInstanceRegistrations.append(reg); + break; + } + } + + // if we haven't one already, create one + + if(reg.m_gui == NULL) + { + for(int i = 0; i < channelRegistrations->count(); i++) + { + if((*channelRegistrations)[i].m_channelId == channelConfig.m_channel) + { + qDebug("DeviceUISet::loadChannelSettings: creating new channel [%s]", qPrintable(channelConfig.m_channel)); + reg = ChannelInstanceRegistration( + channelConfig.m_channel, + (*channelRegistrations)[i]. + m_plugin->createRxChannel(channelConfig.m_channel, this) + ); + break; + } + } + } + + if(reg.m_gui != NULL) + { + 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(); + } + + renameRxChannelInstances(); + } + else + { + qDebug("DeviceUISet::loadChannelSettings: Loading preset [%s | %s] not a source preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); + } +} + +void DeviceUISet::saveRxChannelSettings(Preset *preset) +{ + if (preset->isSourcePreset()) + { + qSort(m_rxChannelInstanceRegistrations.begin(), m_rxChannelInstanceRegistrations.end()); // sort by increasing delta frequency and type + + for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++) + { + 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 + { + qDebug("DeviceSourceAPI::saveChannelSettings: not a source preset"); + } +} + +void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI) +{ + if (preset->isSourcePreset()) + { + 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_channelId == channelConfig.m_channel) + { + qDebug("DeviceUISet::loadChannelSettings: creating new channel [%s]", qPrintable(channelConfig.m_channel)); + reg = ChannelInstanceRegistration(channelConfig.m_channel, (*channelRegistrations)[i].m_plugin->createTxChannel(channelConfig.m_channel, this)); + 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)); + } +} + +// sort by increasing delta frequency and type (i.e. name) +bool DeviceUISet::ChannelInstanceRegistration::operator<(const ChannelInstanceRegistration& other) const +{ + if (m_gui && other.m_gui) + { + if (m_gui->getCenterFrequency() == other.m_gui->getCenterFrequency()) + { + return m_gui->getName() < other.m_gui->getName(); + } + else + { + return m_gui->getCenterFrequency() < other.m_gui->getCenterFrequency(); + } + } + else + { + return false; + } +} diff --git a/sdrgui/device/deviceuiset.h b/sdrgui/device/deviceuiset.h index 844a3bdcd..74e2cd13d 100644 --- a/sdrgui/device/deviceuiset.h +++ b/sdrgui/device/deviceuiset.h @@ -29,6 +29,8 @@ class DSPDeviceSourceEngine; class DeviceSourceAPI; class DSPDeviceSinkEngine; class DeviceSinkAPI; +class ChannelMarker; +class PluginAPI; struct DeviceUISet { @@ -43,8 +45,51 @@ struct DeviceUISet DeviceSinkAPI *m_deviceSinkAPI; QByteArray m_mainWindowState; - DeviceUISet(QTimer& timer); + DeviceUISet(int tabIndex, bool rxElseTx, QTimer& timer); ~DeviceUISet(); + + GLSpectrum *getSpectrum() { return m_spectrum; } //!< Direct spectrum getter + void addChannelMarker(ChannelMarker* channelMarker); //!< Add channel marker to spectrum + void addRollupWidget(QWidget *widget); //!< Add rollup widget to channel window + + 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 + { + QString m_channelName; + PluginInstanceGUI* m_gui; + + ChannelInstanceRegistration() : + m_channelName(), + m_gui(NULL) + { } + + ChannelInstanceRegistration(const QString& channelName, PluginInstanceGUI* pluginGUI) : + m_channelName(channelName), + m_gui(pluginGUI) + { } + + bool operator<(const ChannelInstanceRegistration& other) const; + }; + + typedef QList ChannelInstanceRegistrations; + + ChannelInstanceRegistrations m_rxChannelInstanceRegistrations; + ChannelInstanceRegistrations m_txChannelInstanceRegistrations; + int m_deviceTabIndex; + + void renameRxChannelInstances(); + void renameTxChannelInstances(); }; diff --git a/sdrgui/gui/aboutdialog.ui b/sdrgui/gui/aboutdialog.ui index 285ed4dca..8a0775dd3 100644 --- a/sdrgui/gui/aboutdialog.ui +++ b/sdrgui/gui/aboutdialog.ui @@ -84,7 +84,7 @@ - <html><head/><body><p>Version 3.7.8 - Copyright (C) 2015-2017 Edouard Griffiths, F4EXB. </p><p>Code at <a href="https://github.com/f4exb/sdrangel"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/f4exb/sdrangel</span></a></p><p>Many thanks to the original developers:</p><p>The osmocom developer team - especially horizon, Hoernchen &amp; tnt.</p><p>Christian Daniel from maintech GmbH.</p><p>John Greb (hexameron) for the contributions in <a href="https://github.com/hexameron/rtl-sdrangelove"><span style=" text-decoration: underline; color:#0000ff;">RTL-SDRangelove</span></a></p><p>The following rules apply to the SDRangel main application and libsdrbase:<br/>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; either version 2 of the License, or (at your option) any later version. 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. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/</span></a>.</p><p>For the license of installed plugins, look into the plugin list.</p></body></html> + <html><head/><body><p>Version 3.8.0 - Copyright (C) 2015-2017 Edouard Griffiths, F4EXB. </p><p>Code at <a href="https://github.com/f4exb/sdrangel"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/f4exb/sdrangel</span></a></p><p>Many thanks to the original developers:</p><p>The osmocom developer team - especially horizon, Hoernchen &amp; tnt.</p><p>Christian Daniel from maintech GmbH.</p><p>John Greb (hexameron) for the contributions in <a href="https://github.com/hexameron/rtl-sdrangelove"><span style=" text-decoration: underline; color:#0000ff;">RTL-SDRangelove</span></a></p><p>The following rules apply to the SDRangel main application and libsdrbase:<br/>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; either version 2 of the License, or (at your option) any later version. 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. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/</span></a>.</p><p>For the license of installed plugins, look into the plugin list.</p></body></html> true diff --git a/sdrgui/gui/samplingdevicecontrol.cpp b/sdrgui/gui/samplingdevicecontrol.cpp index 8fd29a3b8..8ab8d0997 100644 --- a/sdrgui/gui/samplingdevicecontrol.cpp +++ b/sdrgui/gui/samplingdevicecontrol.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2015 Edouard Griffiths, F4EXB // +// Copyright (C) 2015-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 // @@ -14,20 +14,23 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include "gui/samplingdevicecontrol.h" -#include "gui/pluginsdialog.h" +#include "samplingdevicecontrol.h" +#include "samplingdevicedialog.h" #include "plugin/pluginmanager.h" +#include "device/deviceenumerator.h" #include "ui_samplingdevicecontrol.h" -SamplingDeviceControl::SamplingDeviceControl(QWidget* parent) : +SamplingDeviceControl::SamplingDeviceControl(int tabIndex, bool rxElseTx, QWidget* parent) : QWidget(parent), ui(new Ui::SamplingDeviceControl), m_pluginManager(0), - m_deviceSourceAPI(0), - m_deviceSinkAPI(0) + m_deviceTabIndex(tabIndex), + m_rxElseTx(rxElseTx), + m_selectedDeviceIndex(-1) { ui->setupUi(this); + ui->deviceSelectedText->setText("None"); } SamplingDeviceControl::~SamplingDeviceControl() @@ -35,14 +38,58 @@ SamplingDeviceControl::~SamplingDeviceControl() delete ui; } -QComboBox *SamplingDeviceControl::getDeviceSelector() +void SamplingDeviceControl::on_deviceChange_clicked() { - return ui->deviceSelect; + SamplingDeviceDialog dialog(m_rxElseTx, m_deviceTabIndex, this); + dialog.exec(); + + if (dialog.getSelectedDeviceIndex() >= 0) + { + m_selectedDeviceIndex = dialog.getSelectedDeviceIndex(); + setSelectedDeviceIndex(m_selectedDeviceIndex); + emit changed(); + } } -QPushButton *SamplingDeviceControl::getDeviceSelectionConfirm() +void SamplingDeviceControl::on_deviceReload_clicked() { - return ui->deviceConfirm; + if (m_selectedDeviceIndex >= 0) { + emit changed(); + } +} + +void SamplingDeviceControl::setSelectedDeviceIndex(int index) +{ + if (m_rxElseTx) + { + PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(index); + DeviceEnumerator::instance()->changeRxSelection(m_deviceTabIndex, index); + ui->deviceSelectedText->setText(samplingDevice.displayedName); + } + else + { + PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(index); + DeviceEnumerator::instance()->changeTxSelection(m_deviceTabIndex, index); + ui->deviceSelectedText->setText(samplingDevice.displayedName); + } + + m_selectedDeviceIndex = index; +} + +void SamplingDeviceControl::removeSelectedDeviceIndex() +{ + if (m_rxElseTx) + { + DeviceEnumerator::instance()->removeRxSelection(m_deviceTabIndex); + ui->deviceSelectedText->setText("None"); + } + else + { + DeviceEnumerator::instance()->removeTxSelection(m_deviceTabIndex); + ui->deviceSelectedText->setText("None"); + } + + m_selectedDeviceIndex = -1; } QComboBox *SamplingDeviceControl::getChannelSelector() diff --git a/sdrgui/gui/samplingdevicecontrol.h b/sdrgui/gui/samplingdevicecontrol.h index dd5b6b4f9..462a84a68 100644 --- a/sdrgui/gui/samplingdevicecontrol.h +++ b/sdrgui/gui/samplingdevicecontrol.h @@ -37,22 +37,30 @@ class SDRANGEL_API SamplingDeviceControl : public QWidget { Q_OBJECT public: - explicit SamplingDeviceControl(QWidget* parent = NULL); + explicit SamplingDeviceControl(int tabIndex, bool rxElseTx, QWidget* parent = 0); ~SamplingDeviceControl(); + int getSelectedDeviceIndex() const { return m_selectedDeviceIndex; } + void setSelectedDeviceIndex(int index); + void removeSelectedDeviceIndex(); + void setPluginManager(PluginManager *pluginManager) { m_pluginManager = pluginManager; } - void setDeviceAPI(DeviceSourceAPI *deviceAPI) { m_deviceSourceAPI = deviceAPI; } - void setDeviceAPI(DeviceSinkAPI *deviceAPI) { m_deviceSinkAPI = deviceAPI; } - QComboBox *getDeviceSelector(); - QPushButton *getDeviceSelectionConfirm(); QComboBox *getChannelSelector(); QPushButton *getAddChannelButton(); +private slots: + void on_deviceChange_clicked(); + void on_deviceReload_clicked(); + private: Ui::SamplingDeviceControl* ui; PluginManager *m_pluginManager; - DeviceSourceAPI *m_deviceSourceAPI; - DeviceSinkAPI *m_deviceSinkAPI; + int m_deviceTabIndex; + bool m_rxElseTx; + int m_selectedDeviceIndex; + +signals: + void changed(); }; diff --git a/sdrgui/gui/samplingdevicecontrol.ui b/sdrgui/gui/samplingdevicecontrol.ui index 6afb39add..3866aa90e 100644 --- a/sdrgui/gui/samplingdevicecontrol.ui +++ b/sdrgui/gui/samplingdevicecontrol.ui @@ -35,20 +35,29 @@ 3 - + + 2 + + + 2 + + + 2 + + 2 - - - Select sampling device + + + Device - + 24 @@ -62,14 +71,34 @@ - Confirm and change sampling device + Change sampling device - :/checkmark.png:/checkmark.png + :/choose.png:/choose.png + + + + + + + + 24 + 16777215 + + + + Reload sampling device + + + + + + + :/recycle.png:/recycle.png diff --git a/sdrgui/gui/samplingdevicedialog.cpp b/sdrgui/gui/samplingdevicedialog.cpp new file mode 100644 index 000000000..752fba4fe --- /dev/null +++ b/sdrgui/gui/samplingdevicedialog.cpp @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2017 F4EXB // +// written by Edouard Griffiths // +// // +// OpenGL interface modernization. // +// See: http://doc.qt.io/qt-5/qopenglshaderprogram.html // +// // +// 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 "samplingdevicedialog.h" +#include "ui_samplingdevicedialog.h" +#include "device/deviceenumerator.h" + + +SamplingDeviceDialog::SamplingDeviceDialog(bool rxElseTx, int deviceTabIndex, QWidget* parent) : + QDialog(parent), + ui(new Ui::SamplingDeviceDialog), + m_rxElseTx(rxElseTx), + m_deviceTabIndex(deviceTabIndex), + m_selectedDeviceIndex(-1) +{ + ui->setupUi(this); + + QList deviceDisplayNames; + + if (m_rxElseTx) { + DeviceEnumerator::instance()->listRxDeviceNames(deviceDisplayNames, m_deviceIndexes); + } else { + DeviceEnumerator::instance()->listTxDeviceNames(deviceDisplayNames, m_deviceIndexes); + } + + QStringList devicesNamesList(deviceDisplayNames); + ui->deviceSelect->addItems(devicesNamesList); +} + +SamplingDeviceDialog::~SamplingDeviceDialog() +{ + delete ui; +} + +void SamplingDeviceDialog::accept() +{ + m_selectedDeviceIndex = m_deviceIndexes[ui->deviceSelect->currentIndex()]; + + if (m_rxElseTx) { + DeviceEnumerator::instance()->changeRxSelection(m_deviceTabIndex, m_selectedDeviceIndex); + } else { + DeviceEnumerator::instance()->changeTxSelection(m_deviceTabIndex, m_selectedDeviceIndex); + } + + QDialog::accept(); +} diff --git a/sdrgui/gui/samplingdevicedialog.h b/sdrgui/gui/samplingdevicedialog.h new file mode 100644 index 000000000..6e771fa33 --- /dev/null +++ b/sdrgui/gui/samplingdevicedialog.h @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2017 F4EXB // +// written by Edouard Griffiths // +// // +// OpenGL interface modernization. // +// See: http://doc.qt.io/qt-5/qopenglshaderprogram.html // +// // +// 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 . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef SDRGUI_GUI_SAMPLINGDEVICEDIALOG_H_ +#define SDRGUI_GUI_SAMPLINGDEVICEDIALOG_H_ + +#include +#include + +namespace Ui { + class SamplingDeviceDialog; +} + +class SamplingDeviceDialog : public QDialog { + Q_OBJECT + +public: + explicit SamplingDeviceDialog(bool rxElseTx, int deviceTabIndex, QWidget* parent = 0); + ~SamplingDeviceDialog(); + int getSelectedDeviceIndex() const { return m_selectedDeviceIndex; } + +private: + Ui::SamplingDeviceDialog* ui; + bool m_rxElseTx; + int m_deviceTabIndex; + int m_selectedDeviceIndex; + std::vector m_deviceIndexes; + +private slots: + void accept(); +}; + +#endif /* SDRGUI_GUI_SAMPLINGDEVICEDIALOG_H_ */ diff --git a/sdrgui/gui/samplingdevicedialog.ui b/sdrgui/gui/samplingdevicedialog.ui new file mode 100644 index 000000000..7555e1677 --- /dev/null +++ b/sdrgui/gui/samplingdevicedialog.ui @@ -0,0 +1,91 @@ + + + SamplingDeviceDialog + + + + 0 + 0 + 324 + 139 + + + + + Sans Serif + 9 + + + + Select sampling device + + + + + + + 16777215 + 70 + + + + Select from list + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + buttonBox + + + + + buttonBox + accepted() + SamplingDeviceDialog + accept() + + + 257 + 194 + + + 157 + 203 + + + + + buttonBox + rejected() + SamplingDeviceDialog + reject() + + + 314 + 194 + + + 286 + 203 + + + + + diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index 02cc19c60..de18323de 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -30,6 +30,7 @@ #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" #include "device/deviceuiset.h" +#include "device/deviceenumerator.h" #include "audio/audiodeviceinfo.h" #include "gui/indicator.h" #include "gui/presetitem.h" @@ -138,31 +139,44 @@ MainWindow::MainWindow(QWidget* parent) : qDebug() << "MainWindow::MainWindow: select SampleSource from settings..."; - int sampleSourceIndex = m_settings.getSourceIndex(); - sampleSourceIndex = m_pluginManager->selectSampleSourceByIndex(sampleSourceIndex, m_deviceUIs.back()->m_deviceSourceAPI); + int deviceIndex = DeviceEnumerator::instance()->getRxSamplingDeviceIndex(m_settings.getSourceDeviceId(), m_settings.getSourceIndex()); - if (sampleSourceIndex < 0) + if (deviceIndex >= 0) { - qCritical("MainWindow::MainWindow: no sample source. Exit"); - exit(0); + // delete previous plugin GUI + m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( + m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI()); + m_deviceUIs.back()->m_deviceSourceAPI->resetSampleSourceId(); + m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput( + m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()); + m_deviceUIs.back()->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists + + m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(deviceIndex); + + PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(deviceIndex); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSequence(samplingDevice.sequence); + m_deviceUIs.back()->m_deviceSourceAPI->setItemIndex(samplingDevice.deviceItemIndex); + m_deviceUIs.back()->m_deviceSourceAPI->setHardwareId(samplingDevice.hardwareId); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceId(samplingDevice.id); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSerial(samplingDevice.serial); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceDisplayName(samplingDevice.displayedName); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(deviceIndex)); + + DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput( + m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source); + QWidget *gui; + PluginInstanceGUI *pluginGUI = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( + m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), + &gui, + m_deviceUIs.back()); + m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI); + setDeviceGUI(0, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName()); } - DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI); - m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source); - QWidget *gui; - PluginInstanceGUI *pluginGUI = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), &gui, m_deviceUIs.back()->m_deviceSourceAPI); - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI); - setDeviceGUI(0, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName()); - m_deviceUIs.back()->m_deviceSourceAPI->setBuddyLeader(true); // the first device is always the leader - bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true); - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->setCurrentIndex(sampleSourceIndex); - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked); - qDebug() << "MainWindow::MainWindow: load current preset settings..."; loadPresetSettings(m_settings.getWorkingPreset(), 0); @@ -198,19 +212,21 @@ void MainWindow::addSourceDevice() char uidCStr[16]; sprintf(uidCStr, "UID:%d", dspDeviceSourceEngineUID); - m_deviceUIs.push_back(new DeviceUISet(m_masterTimer)); + int deviceTabIndex = m_deviceUIs.size(); + m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, true, m_masterTimer)); m_deviceUIs.back()->m_deviceSourceEngine = dspDeviceSourceEngine; - int deviceTabIndex = m_deviceUIs.size()-1; char tabNameCStr[16]; sprintf(tabNameCStr, "R%d", deviceTabIndex); - DeviceSourceAPI *deviceSourceAPI = new DeviceSourceAPI(deviceTabIndex, dspDeviceSourceEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow); + DeviceSourceAPI *deviceSourceAPI = new DeviceSourceAPI(deviceTabIndex, dspDeviceSourceEngine); m_deviceUIs.back()->m_deviceSourceAPI = deviceSourceAPI; - m_deviceUIs.back()->m_samplingDeviceControl->setDeviceAPI(deviceSourceAPI); m_deviceUIs.back()->m_samplingDeviceControl->setPluginManager(m_pluginManager); - m_pluginManager->populateRxChannelComboBox(m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()); + QList channelNames; + m_pluginManager->listRxChannels(channelNames); + QStringList channelNamesList(channelNames); + m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()->addItems(channelNamesList); connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool))); @@ -219,28 +235,40 @@ void MainWindow::addSourceDevice() ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr); ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr); - bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true); - m_pluginManager->duplicateLocalSampleSourceDevices(dspDeviceSourceEngineUID); - m_pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), dspDeviceSourceEngineUID); + connect(m_deviceUIs.back()->m_samplingDeviceControl, SIGNAL(changed()), this, SLOT(on_sampleSource_changed())); - connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelectionConfirm(), SIGNAL(clicked(bool)), this, SLOT(on_sampleSource_confirmClicked(bool))); - - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked); ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr); ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr)); // Create a file source instance by default - m_pluginManager->selectSampleSourceBySerialOrSequence("sdrangel.samplesource.filesource", "0", 0, m_deviceUIs.back()->m_deviceSourceAPI); + int fileSourceDeviceIndex = DeviceEnumerator::instance()->getFileSourceDeviceIndex(); + PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(fileSourceDeviceIndex); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSequence(samplingDevice.sequence); + m_deviceUIs.back()->m_deviceSourceAPI->setItemIndex(samplingDevice.deviceItemIndex); + m_deviceUIs.back()->m_deviceSourceAPI->setHardwareId(samplingDevice.hardwareId); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceId(samplingDevice.id); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceSerial(samplingDevice.serial); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourceDisplayName(samplingDevice.displayedName); + m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(fileSourceDeviceIndex)); + + m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(fileSourceDeviceIndex); + + // delete previous plugin GUI + m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( + m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI()); + + DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput( m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI); m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source); QWidget *gui; PluginInstanceGUI *pluginGUI = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), &gui, m_deviceUIs.back()->m_deviceSourceAPI); + m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), + &gui, + m_deviceUIs.back()); m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI); setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName()); - } void MainWindow::addSinkDevice() @@ -252,21 +280,23 @@ void MainWindow::addSinkDevice() char uidCStr[16]; sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID); - m_deviceUIs.push_back(new DeviceUISet(m_masterTimer)); + int deviceTabIndex = m_deviceUIs.size(); + m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, false, m_masterTimer)); m_deviceUIs.back()->m_deviceSourceEngine = 0; m_deviceUIs.back()->m_deviceSinkEngine = dspDeviceSinkEngine; - int deviceTabIndex = m_deviceUIs.size()-1; char tabNameCStr[16]; sprintf(tabNameCStr, "T%d", deviceTabIndex); - DeviceSinkAPI *deviceSinkAPI = new DeviceSinkAPI(deviceTabIndex, dspDeviceSinkEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow); + DeviceSinkAPI *deviceSinkAPI = new DeviceSinkAPI(deviceTabIndex, dspDeviceSinkEngine); m_deviceUIs.back()->m_deviceSourceAPI = 0; m_deviceUIs.back()->m_deviceSinkAPI = deviceSinkAPI; - m_deviceUIs.back()->m_samplingDeviceControl->setDeviceAPI(deviceSinkAPI); m_deviceUIs.back()->m_samplingDeviceControl->setPluginManager(m_pluginManager); - m_pluginManager->populateTxChannelComboBox(m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()); + QList channelNames; + m_pluginManager->listTxChannels(channelNames); + QStringList channelNamesList(channelNames); + m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()->addItems(channelNamesList); connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool))); @@ -275,24 +305,36 @@ void MainWindow::addSinkDevice() ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr); ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr); - bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true); - m_pluginManager->duplicateLocalSampleSinkDevices(dspDeviceSinkEngineUID); - m_pluginManager->fillSampleSinkSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), dspDeviceSinkEngineUID); + connect(m_deviceUIs.back()->m_samplingDeviceControl, SIGNAL(changed()), this, SLOT(on_sampleSink_changed())); - connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelectionConfirm(), SIGNAL(clicked(bool)), this, SLOT(on_sampleSink_confirmClicked(bool))); - - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked); ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr); ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr)); // create a file sink by default - m_pluginManager->selectSampleSinkBySerialOrSequence("sdrangel.samplesink.filesink", "0", 0, m_deviceUIs.back()->m_deviceSinkAPI); + int fileSinkDeviceIndex = DeviceEnumerator::instance()->getFileSinkDeviceIndex(); + PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(fileSinkDeviceIndex); + m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkSequence(samplingDevice.sequence); + m_deviceUIs.back()->m_deviceSinkAPI->setItemIndex(samplingDevice.deviceItemIndex); + m_deviceUIs.back()->m_deviceSinkAPI->setHardwareId(samplingDevice.hardwareId); + m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkId(samplingDevice.id); + m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkSerial(samplingDevice.serial); + m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkDisplayName(samplingDevice.displayedName); + m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkPluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(fileSinkDeviceIndex)); + + m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(fileSinkDeviceIndex); + + // delete previous plugin GUI if it exists + m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( + m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkPluginInstanceGUI()); + DeviceSampleSink *sink = m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceOutput( m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkId(), m_deviceUIs.back()->m_deviceSinkAPI); m_deviceUIs.back()->m_deviceSinkAPI->setSampleSink(sink); QWidget *gui; PluginInstanceGUI *pluginUI = m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( - m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkId(), &gui, m_deviceUIs.back()->m_deviceSinkAPI); + m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkId(), + &gui, + m_deviceUIs.back()); m_deviceUIs.back()->m_deviceSinkAPI->getSampleSink()->setMessageQueueToGUI(pluginUI->getInputMessageQueue()); m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(pluginUI); setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkDisplayName(), false); @@ -310,7 +352,7 @@ void MainWindow::removeLastDevice() ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); // deletes old UI and input object - m_deviceUIs.back()->m_deviceSourceAPI->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()); @@ -318,6 +360,7 @@ void MainWindow::removeLastDevice() m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput( m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()); m_deviceUIs.back()->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists + m_deviceUIs.back()->m_samplingDeviceControl->removeSelectedDeviceIndex(); // This releases the device in the device list ui->tabChannels->removeTab(ui->tabChannels->count() - 1); @@ -348,7 +391,7 @@ void MainWindow::removeLastDevice() ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); // deletes old UI and output object - m_deviceUIs.back()->m_deviceSinkAPI->freeChannels(); + m_deviceUIs.back()->freeTxChannels(); m_deviceUIs.back()->m_deviceSinkAPI->getSampleSink()->setMessageQueueToGUI(0); // have sink stop sending messages to the GUI m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkPluginInstanceGUI()); @@ -356,6 +399,7 @@ void MainWindow::removeLastDevice() m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput( m_deviceUIs.back()->m_deviceSinkAPI->getSampleSink()); m_deviceUIs.back()->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists + m_deviceUIs.back()->m_samplingDeviceControl->removeSelectedDeviceIndex(); // This releases the device in the device list ui->tabChannels->removeTab(ui->tabChannels->count() - 1); @@ -459,13 +503,13 @@ void MainWindow::loadPresetSettings(const Preset* preset, int tabIndex) { deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig()); deviceUI->m_deviceSourceAPI->loadSourceSettings(preset); - deviceUI->m_deviceSourceAPI->loadChannelSettings(preset, m_pluginManager->getPluginAPI()); + deviceUI->loadRxChannelSettings(preset, m_pluginManager->getPluginAPI()); } else if (deviceUI->m_deviceSinkEngine) // sink device { deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig()); deviceUI->m_deviceSinkAPI->loadSinkSettings(preset); - deviceUI->m_deviceSinkAPI->loadChannelSettings(preset, m_pluginManager->getPluginAPI()); + deviceUI->loadTxChannelSettings(preset, m_pluginManager->getPluginAPI()); } } @@ -487,7 +531,7 @@ void MainWindow::savePresetSettings(Preset* preset, int tabIndex) { preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize()); preset->clearChannels(); - deviceUI->m_deviceSourceAPI->saveChannelSettings(preset); + deviceUI->saveRxChannelSettings(preset); deviceUI->m_deviceSourceAPI->saveSourceSettings(preset); } else if (deviceUI->m_deviceSinkEngine) // sink device @@ -495,7 +539,7 @@ void MainWindow::savePresetSettings(Preset* preset, int tabIndex) preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize()); preset->clearChannels(); preset->setSourcePreset(false); - deviceUI->m_deviceSinkAPI->saveChannelSettings(preset); + deviceUI->saveTxChannelSettings(preset); deviceUI->m_deviceSinkAPI->saveSinkSettings(preset); } @@ -506,9 +550,9 @@ void MainWindow::createStatusBar() { QString qtVersionStr = QString("Qt %1 ").arg(QT_VERSION_STR); #if QT_VERSION >= 0x050400 - m_showSystemWidget = new QLabel("SDRangel v3.7.8 " + qtVersionStr + QSysInfo::prettyProductName(), this); + m_showSystemWidget = new QLabel("SDRangel v3.8.0 " + qtVersionStr + QSysInfo::prettyProductName(), this); #else - m_showSystemWidget = new QLabel("SDRangel v3.7.8 " + qtVersionStr, this); + m_showSystemWidget = new QLabel("SDRangel v3.8.0 " + qtVersionStr, this); #endif statusBar()->addPermanentWidget(m_showSystemWidget); @@ -836,7 +880,7 @@ void MainWindow::on_action_DV_Serial_triggered(bool checked) } } -void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unused))) +void MainWindow::on_sampleSource_changed() { // Do it in the currently selected source tab int currentSourceTabIndex = ui->tabInputsSelect->currentIndex(); @@ -846,8 +890,6 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus qDebug("MainWindow::on_sampleSource_confirmClicked: tab at %d", currentSourceTabIndex); DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; deviceUI->m_deviceSourceAPI->saveSourceSettings(m_settings.getWorkingPreset()); // save old API settings - int selectedComboIndex = deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(); - void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value(); deviceUI->m_deviceSourceAPI->stopAcquisition(); // deletes old UI and input object @@ -859,7 +901,14 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus deviceUI->m_deviceSourceAPI->getSampleSource()); deviceUI->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists - m_pluginManager->selectSampleSourceByDevice(devicePtr, deviceUI->m_deviceSourceAPI); // sets the new API + PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex()); + deviceUI->m_deviceSourceAPI->setSampleSourceSequence(samplingDevice.sequence); + deviceUI->m_deviceSourceAPI->setItemIndex(samplingDevice.deviceItemIndex); + deviceUI->m_deviceSourceAPI->setHardwareId(samplingDevice.hardwareId); + deviceUI->m_deviceSourceAPI->setSampleSourceId(samplingDevice.id); + deviceUI->m_deviceSourceAPI->setSampleSourceSerial(samplingDevice.serial); + deviceUI->m_deviceSourceAPI->setSampleSourceDisplayName(samplingDevice.displayedName); + deviceUI->m_deviceSourceAPI->setSampleSourcePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex())); // add to buddies list std::vector::iterator it = m_deviceUIs.begin(); @@ -901,21 +950,24 @@ void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unus deviceUI->m_deviceSourceAPI->setSampleSource(source); QWidget *gui; PluginInstanceGUI *pluginUI = deviceUI->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( - deviceUI->m_deviceSourceAPI->getSampleSourceId(), &gui, deviceUI->m_deviceSourceAPI); + deviceUI->m_deviceSourceAPI->getSampleSourceId(), + &gui, + deviceUI); deviceUI->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginUI->getInputMessageQueue()); deviceUI->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginUI); setDeviceGUI(currentSourceTabIndex, gui, deviceUI->m_deviceSourceAPI->getSampleSourceDisplayName()); deviceUI->m_deviceSourceAPI->loadSourceSettings(m_settings.getWorkingPreset()); // load new API settings - if (currentSourceTabIndex == 0) + if (currentSourceTabIndex == 0) // save as default starting device { - m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex()); + m_settings.setSourceIndex(samplingDevice.sequence); + m_settings.setSourceDeviceId(samplingDevice.id); } } } -void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused))) +void MainWindow::on_sampleSink_changed() { // Do it in the currently selected source tab int currentSinkTabIndex = ui->tabInputsSelect->currentIndex(); @@ -925,8 +977,6 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused qDebug("MainWindow::on_sampleSink_confirmClicked: tab at %d", currentSinkTabIndex); DeviceUISet *deviceUI = m_deviceUIs[currentSinkTabIndex]; deviceUI->m_deviceSinkAPI->saveSinkSettings(m_settings.getWorkingPreset()); // save old API settings - int selectedComboIndex = deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(); - void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value(); deviceUI->m_deviceSinkAPI->stopGeneration(); // deletes old UI and output object @@ -938,7 +988,14 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused deviceUI->m_deviceSinkAPI->getSampleSink()); deviceUI->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists - m_pluginManager->selectSampleSinkByDevice(devicePtr, deviceUI->m_deviceSinkAPI); // sets the new API + PluginInterface::SamplingDevice samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex()); + deviceUI->m_deviceSinkAPI->setSampleSinkSequence(samplingDevice.sequence); + deviceUI->m_deviceSinkAPI->setItemIndex(samplingDevice.deviceItemIndex); + deviceUI->m_deviceSinkAPI->setHardwareId(samplingDevice.hardwareId); + deviceUI->m_deviceSinkAPI->setSampleSinkId(samplingDevice.id); + deviceUI->m_deviceSinkAPI->setSampleSinkSerial(samplingDevice.serial); + deviceUI->m_deviceSinkAPI->setSampleSinkDisplayName(samplingDevice.displayedName); + deviceUI->m_deviceSinkAPI->setSampleSinkPluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(deviceUI->m_samplingDeviceControl->getSelectedDeviceIndex())); // add to buddies list std::vector::iterator it = m_deviceUIs.begin(); @@ -980,7 +1037,9 @@ void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused deviceUI->m_deviceSinkAPI->setSampleSink(sink); QWidget *gui; PluginInstanceGUI *pluginUI = deviceUI->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( - deviceUI->m_deviceSinkAPI->getSampleSinkId(), &gui, deviceUI->m_deviceSinkAPI); + deviceUI->m_deviceSinkAPI->getSampleSinkId(), + &gui, + deviceUI); deviceUI->m_deviceSinkAPI->getSampleSink()->setMessageQueueToGUI(pluginUI->getInputMessageQueue()); deviceUI->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(pluginUI); setDeviceGUI(currentSinkTabIndex, gui, deviceUI->m_deviceSinkAPI->getSampleSinkDisplayName(), false); @@ -1000,7 +1059,7 @@ void MainWindow::on_channel_addClicked(bool checked __attribute__((unused))) if (deviceUI->m_deviceSourceEngine) // source device => Rx channels { - m_pluginManager->createRxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI->m_deviceSourceAPI); + m_pluginManager->createRxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI); } else if (deviceUI->m_deviceSinkEngine) // sink device => Tx channels { @@ -1010,10 +1069,9 @@ void MainWindow::on_channel_addClicked(bool checked __attribute__((unused))) QMessageBox::information(this, tr("Message"), tr("%1 channel(s) already in use. Multiple transmission channels is experimental. You may experience performance problems").arg(nbSources)); } - m_pluginManager->createTxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI->m_deviceSinkAPI); + m_pluginManager->createTxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI); } } - } void MainWindow::on_action_About_triggered() @@ -1042,61 +1100,8 @@ void MainWindow::on_action_removeLastDevice_triggered() void MainWindow::on_action_reloadDevices_triggered() { - // all devices must be stopped - std::vector::iterator it = m_deviceUIs.begin(); - for (; it != m_deviceUIs.end(); ++it) - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - if ((*it)->m_deviceSourceEngine->state() == DSPDeviceSourceEngine::StRunning) - { - QMessageBox::information(this, tr("Message"), tr("Stop all devices for reload to take effect")); - return; - } - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - if ((*it)->m_deviceSinkEngine->state() == DSPDeviceSinkEngine::StRunning) - { - QMessageBox::information(this, tr("Message"), tr("Stop all devices for reload to take effect")); - return; - } - } - } - - // re-scan devices - m_pluginManager->updateSampleSourceDevices(); - m_pluginManager->updateSampleSinkDevices(); - - // re-populate device selectors keeping the same selection - it = m_deviceUIs.begin(); - for (; it != m_deviceUIs.end(); ++it) - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - QComboBox *deviceSelectorComboBox = (*it)->m_samplingDeviceControl->getDeviceSelector(); - bool sampleSourceSignalsBlocked = deviceSelectorComboBox->blockSignals(true); - uint dspDeviceSourceEngineUID = (*it)->m_deviceSourceEngine->getUID(); - m_pluginManager->duplicateLocalSampleSourceDevices(dspDeviceSourceEngineUID); - m_pluginManager->fillSampleSourceSelector(deviceSelectorComboBox, dspDeviceSourceEngineUID); - int newIndex = m_pluginManager->getSampleSourceSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSourceAPI); - deviceSelectorComboBox->setCurrentIndex(newIndex); - deviceSelectorComboBox->blockSignals(sampleSourceSignalsBlocked); - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - QComboBox *deviceSelectorComboBox = (*it)->m_samplingDeviceControl->getDeviceSelector(); - bool sampleSinkSignalsBlocked = deviceSelectorComboBox->blockSignals(true); - uint dspDeviceSinkEngineUID = (*it)->m_deviceSinkEngine->getUID(); - m_pluginManager->duplicateLocalSampleSinkDevices(dspDeviceSinkEngineUID); - m_pluginManager->fillSampleSinkSelector(deviceSelectorComboBox, dspDeviceSinkEngineUID); - int newIndex = m_pluginManager->getSampleSinkSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSinkAPI); - deviceSelectorComboBox->setCurrentIndex(newIndex); - deviceSelectorComboBox->blockSignals(sampleSinkSignalsBlocked); - } - } + QMessageBox::information(this, tr("Message"), tr("Not implemented")); + return; } void MainWindow::on_action_Exit_triggered() diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h index b626a6812..e5b37b832 100644 --- a/sdrgui/mainwindow.h +++ b/sdrgui/mainwindow.h @@ -140,8 +140,8 @@ private slots: void on_action_Audio_triggered(); void on_action_DV_Serial_triggered(bool checked); void on_action_My_Position_triggered(); - void on_sampleSource_confirmClicked(bool checked); - void on_sampleSink_confirmClicked(bool checked); + void on_sampleSource_changed(); + void on_sampleSink_changed(); void on_channel_addClicked(bool checked); void on_action_Loaded_Plugins_triggered(); void on_action_About_triggered(); diff --git a/sdrgui/mainwindow.ui b/sdrgui/mainwindow.ui index 316f1a48b..ffcaf9775 100644 --- a/sdrgui/mainwindow.ui +++ b/sdrgui/mainwindow.ui @@ -20,7 +20,7 @@ SDRangel - + :/sdrangel_icon.png:/sdrangel_icon.png @@ -103,7 +103,6 @@ - @@ -327,7 +326,7 @@ ... - + :/preset-save.png:/preset-save.png @@ -347,7 +346,7 @@ ... - + :/preset-load.png:/preset-load.png @@ -380,7 +379,7 @@ ... - + :/preset-delete.png:/preset-delete.png @@ -434,7 +433,7 @@ ... - + :/preset-update.png:/preset-update.png @@ -467,7 +466,7 @@ ... - + :/preset-last.png:/preset-last.png @@ -487,7 +486,7 @@ - + :/export.png:/export.png @@ -514,7 +513,7 @@ - + :/import.png:/import.png @@ -680,11 +679,6 @@ Add sink device - - - Reload devices - - presetDock channelDock @@ -696,7 +690,7 @@ presetLoad - + diff --git a/sdrgui/plugin/plugininterface.h b/sdrgui/plugin/plugininterface.h deleted file mode 100644 index 612cbb05e..000000000 --- a/sdrgui/plugin/plugininterface.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef INCLUDE_PLUGININTERFACE_H -#define INCLUDE_PLUGININTERFACE_H - -#include -#include - -struct PluginDescriptor { - // general plugin description - const QString displayedName; - const QString version; - const QString copyright; - const QString website; - bool licenseIsGPL; - const QString sourceCodeURL; -}; - -class PluginAPI; -class DeviceSourceAPI; -class DeviceSinkAPI; -class PluginInstanceGUI; -class QWidget; -class DeviceSampleSource; -class DeviceSampleSink; - -class PluginInterface { -public: - struct SamplingDevice - { - QString displayedName; - QString hardwareId; - QString id; - QString serial; - int sequence; - - SamplingDevice(const QString& _displayedName, - const QString& _hardwareId, - const QString& _id, - const QString& _serial, - int _sequence) : - displayedName(_displayedName), - hardwareId(_hardwareId), - id(_id), - serial(_serial), - sequence(_sequence) - { } - }; - typedef QList SamplingDevices; - - virtual ~PluginInterface() { }; - - virtual const PluginDescriptor& getPluginDescriptor() const = 0; - virtual void initPlugin(PluginAPI* pluginAPI) = 0; - - // channel Rx plugins - virtual PluginInstanceGUI* createRxChannel(const QString& channelName __attribute__((unused)), DeviceSourceAPI *deviceAPI __attribute__((unused)) ) { return 0; } - - // channel Tx plugins - virtual PluginInstanceGUI* createTxChannel(const QString& channelName __attribute__((unused)), DeviceSinkAPI *deviceAPI __attribute__((unused)) ) { return 0; } - - // device source plugins only - virtual SamplingDevices enumSampleSources() { return SamplingDevices(); } - virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI(const QString& sourceId __attribute__((unused)), QWidget **widget __attribute__((unused)), DeviceSourceAPI *deviceAPI __attribute__((unused))) { return 0; } - virtual DeviceSampleSource* createSampleSourcePluginInstanceInput(const QString& sourceId __attribute__((unused)), DeviceSourceAPI *deviceAPI __attribute__((unused))) { return 0; } // creates the input "core" - virtual void deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui); - virtual void deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source); - - // device sink plugins only - virtual SamplingDevices enumSampleSinks() { return SamplingDevices(); } - virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI(const QString& sinkId __attribute__((unused)), QWidget **widget __attribute__((unused)), DeviceSinkAPI *deviceAPI __attribute__((unused))) { return 0; } - virtual DeviceSampleSink* createSampleSinkPluginInstanceOutput(const QString& sinkId __attribute__((unused)), DeviceSinkAPI *deviceAPI __attribute__((unused))) { return 0; } // creates the output "core" - virtual void deleteSampleSinkPluginInstanceGUI(PluginInstanceGUI *ui); - virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink); -}; - -Q_DECLARE_INTERFACE(PluginInterface, "SDRangel.PluginInterface/0.1"); - -#endif // INCLUDE_PLUGININTERFACE_H diff --git a/sdrgui/plugin/pluginmanager.cpp b/sdrgui/plugin/pluginmanager.cpp deleted file mode 100644 index 4efe26d58..000000000 --- a/sdrgui/plugin/pluginmanager.cpp +++ /dev/null @@ -1,640 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2016 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 -#include -#include -#include - -#include - -#include -#include "device/devicesourceapi.h" -#include "device/devicesinkapi.h" -#include "settings/preset.h" -#include "util/message.h" -#include "dsp/dspdevicesourceengine.h" -#include "dsp/dspdevicesinkengine.h" - -#include "plugin/pluginmanager.h" - -const QString PluginManager::m_sdrDaemonHardwareID = "SDRdaemonSource"; -const QString PluginManager::m_sdrDaemonDeviceTypeID = "sdrangel.samplesource.sdrdaemonsource"; -const QString PluginManager::m_fileSourceHardwareID = "FileSource"; -const QString PluginManager::m_fileSourceDeviceTypeID = "sdrangel.samplesource.filesource"; -const QString PluginManager::m_fileSinkDeviceTypeID = "sdrangel.samplesink.filesink"; - -PluginManager::PluginManager(QObject* parent) : - QObject(parent), - m_pluginAPI(this) -{ -} - -PluginManager::~PluginManager() -{ -// freeAll(); -} - -void PluginManager::loadPlugins() -{ - QString applicationDirPath = QApplication::instance()->applicationDirPath(); - QString applicationLibPath = applicationDirPath + "/../lib"; - qDebug() << "PluginManager::loadPlugins: " << qPrintable(applicationDirPath) << ", " << qPrintable(applicationLibPath); - - QDir pluginsBinDir = QDir(applicationDirPath); - QDir pluginsLibDir = QDir(applicationLibPath); - - loadPlugins(pluginsBinDir); - loadPlugins(pluginsLibDir); - - qSort(m_plugins); - - for (Plugins::const_iterator it = m_plugins.begin(); it != m_plugins.end(); ++it) - { - it->pluginInterface->initPlugin(&m_pluginAPI); - } - - updateSampleSourceDevices(); - updateSampleSinkDevices(); -} - -void PluginManager::registerRxChannel(const QString& channelName, PluginInterface* plugin) -{ - qDebug() << "PluginManager::registerRxChannel " - << plugin->getPluginDescriptor().displayedName.toStdString().c_str() - << " with channel name " << channelName; - - m_rxChannelRegistrations.append(PluginAPI::ChannelRegistration(channelName, plugin)); -} - -void PluginManager::registerTxChannel(const QString& channelName, PluginInterface* plugin) -{ - qDebug() << "PluginManager::registerTxChannel " - << plugin->getPluginDescriptor().displayedName.toStdString().c_str() - << " with channel name " << channelName; - - m_txChannelRegistrations.append(PluginAPI::ChannelRegistration(channelName, plugin)); -} - -void PluginManager::registerSampleSource(const QString& sourceName, PluginInterface* plugin) -{ - qDebug() << "PluginManager::registerSampleSource " - << plugin->getPluginDescriptor().displayedName.toStdString().c_str() - << " with source name " << sourceName.toStdString().c_str(); - - m_sampleSourceRegistrations.append(SamplingDeviceRegistration(sourceName, plugin)); -} - -void PluginManager::registerSampleSink(const QString& sinkName, PluginInterface* plugin) -{ - qDebug() << "PluginManager::registerSampleSink " - << plugin->getPluginDescriptor().displayedName.toStdString().c_str() - << " with sink name " << sinkName.toStdString().c_str(); - - m_sampleSinkRegistrations.append(SamplingDeviceRegistration(sinkName, plugin)); -} - -void PluginManager::updateSampleSourceDevices() -{ - m_sampleSourceDevices.clear(); - - for(int i = 0; i < m_sampleSourceRegistrations.count(); ++i) - { - PluginInterface::SamplingDevices ssd = m_sampleSourceRegistrations[i].m_plugin->enumSampleSources(); - - for(int j = 0; j < ssd.count(); ++j) - { - m_sampleSourceDevices.append(SamplingDevice(m_sampleSourceRegistrations[i].m_plugin, - ssd[j].displayedName, - ssd[j].hardwareId, - ssd[j].id, - ssd[j].serial, - ssd[j].sequence)); - qDebug("PluginManager::updateSampleSourceDevices: %s %s %s %s %d", - qPrintable(ssd[j].displayedName), - qPrintable(ssd[j].hardwareId), - qPrintable(ssd[j].id), - qPrintable(ssd[j].serial), - ssd[j].sequence); - } - } -} - -void PluginManager::updateSampleSinkDevices() -{ - m_sampleSinkDevices.clear(); - - for(int i = 0; i < m_sampleSinkRegistrations.count(); ++i) - { - PluginInterface::SamplingDevices ssd = m_sampleSinkRegistrations[i].m_plugin->enumSampleSinks(); - - for(int j = 0; j < ssd.count(); ++j) - { - m_sampleSinkDevices.append(SamplingDevice(m_sampleSinkRegistrations[i].m_plugin, - ssd[j].displayedName, - ssd[j].hardwareId, - ssd[j].id, - ssd[j].serial, - ssd[j].sequence)); - qDebug("PluginManager::updateSampleSinkDevices: %s %s %s %s %d", - qPrintable(ssd[j].displayedName), - qPrintable(ssd[j].hardwareId), - qPrintable(ssd[j].id), - qPrintable(ssd[j].serial), - ssd[j].sequence); - } - } -} - -void PluginManager::duplicateLocalSampleSourceDevices(uint deviceUID) -{ - if (deviceUID == 0) { - return; - } - - SamplingDevice *sdrDaemonSSD0 = 0; - SamplingDevice *fileSourceSSD0 = 0; - bool duplicateSDRDaemon = true; - bool duplicateFileSource = true; - - for(int i = 0; i < m_sampleSourceDevices.count(); ++i) - { - if (m_sampleSourceDevices[i].m_deviceId == m_sdrDaemonDeviceTypeID) // SDRdaemon - { - if (m_sampleSourceDevices[i].m_deviceSequence == 0) { // reference to device 0 - sdrDaemonSSD0 = &m_sampleSourceDevices[i]; - } - else if (m_sampleSourceDevices[i].m_deviceSequence == deviceUID) { // already there - duplicateSDRDaemon = false; - } - } - else if (m_sampleSourceDevices[i].m_deviceId == m_fileSourceDeviceTypeID) // File Source - { - if (m_sampleSourceDevices[i].m_deviceSequence == 0) { // reference to device 0 - fileSourceSSD0 = &m_sampleSourceDevices[i]; - } - else if (m_sampleSourceDevices[i].m_deviceSequence == deviceUID) { // already there - duplicateFileSource = false; - } - } - } - - if (sdrDaemonSSD0 && duplicateSDRDaemon) // append item for a new instance - { - m_sampleSourceDevices.append( - SamplingDevice( - sdrDaemonSSD0->m_plugin, - QString("SDRdaemonSource[%1]").arg(deviceUID), - sdrDaemonSSD0->m_hadrwareId, - sdrDaemonSSD0->m_deviceId, - sdrDaemonSSD0->m_deviceSerial, - deviceUID - ) - ); - } - - if (fileSourceSSD0 && duplicateFileSource) // append item for a new instance - { - m_sampleSourceDevices.append( - SamplingDevice( - fileSourceSSD0->m_plugin, - QString("FileSource[%1]").arg(deviceUID), - fileSourceSSD0->m_hadrwareId, - fileSourceSSD0->m_deviceId, - fileSourceSSD0->m_deviceSerial, - deviceUID - ) - ); - } -} - -void PluginManager::duplicateLocalSampleSinkDevices(uint deviceUID) -{ - if (deviceUID == 0) { - return; - } - - SamplingDevice *fileSinkSSD0 = 0; - bool duplicateFileSink = true; - - for(int i = 0; i < m_sampleSinkDevices.count(); ++i) - { - if (m_sampleSinkDevices[i].m_deviceId == m_fileSinkDeviceTypeID) // File Sink - { - if (m_sampleSinkDevices[i].m_deviceSequence == 0) { // reference to device 0 - fileSinkSSD0 = &m_sampleSinkDevices[i]; - } - else if (m_sampleSinkDevices[i].m_deviceSequence == deviceUID) { // already there - duplicateFileSink = false; - } - } - } - - if (fileSinkSSD0 && duplicateFileSink) // append item for a new instance - { - m_sampleSinkDevices.append( - SamplingDevice( - fileSinkSSD0->m_plugin, - QString("FileSink[%1]").arg(deviceUID), - fileSinkSSD0->m_hadrwareId, - fileSinkSSD0->m_deviceId, - fileSinkSSD0->m_deviceSerial, - deviceUID - ) - ); - } -} - -void PluginManager::fillSampleSourceSelector(QComboBox* comboBox, uint deviceUID) -{ - comboBox->clear(); - - for(int i = 0; i < m_sampleSourceDevices.count(); i++) - { - // For "local" devices show only ones that concern this device set - if ((m_sampleSourceDevices[i].m_deviceId == m_sdrDaemonDeviceTypeID) - || (m_sampleSourceDevices[i].m_deviceId == m_fileSourceDeviceTypeID)) - { - if (deviceUID != m_sampleSourceDevices[i].m_deviceSequence) { - continue; - } - } - - comboBox->addItem(m_sampleSourceDevices[i].m_displayName, qVariantFromValue((void *) &m_sampleSourceDevices[i])); - } -} - -int PluginManager::getSampleSourceSelectorIndex(QComboBox* comboBox, DeviceSourceAPI *deviceSourceAPI) -{ - for (int i = 0; i < comboBox->count(); i++) - { - SamplingDevice *samplingDevice = (SamplingDevice*) (comboBox->itemData(i)).value(); - - if ((samplingDevice->m_deviceId == deviceSourceAPI->getSampleSourceId()) && - (samplingDevice->m_deviceSerial == deviceSourceAPI->getSampleSourceSerial()) && - (samplingDevice->m_deviceSequence == deviceSourceAPI->getSampleSourceSequence())) - { - return i; - } - } - - return 0; // default to first item -} - -void PluginManager::fillSampleSinkSelector(QComboBox* comboBox, uint deviceUID) -{ - comboBox->clear(); - - for(int i = 0; i < m_sampleSinkDevices.count(); i++) - { - // For "local" devices show only ones that concern this device set - if (m_sampleSinkDevices[i].m_deviceId == m_fileSinkDeviceTypeID) - { - if (deviceUID != m_sampleSinkDevices[i].m_deviceSequence) { - continue; - } - } - - comboBox->addItem(m_sampleSinkDevices[i].m_displayName, qVariantFromValue((void *) &m_sampleSinkDevices[i])); - } -} - -int PluginManager::getSampleSinkSelectorIndex(QComboBox* comboBox, DeviceSinkAPI *deviceSinkAPI) -{ - for (int i = 0; i < comboBox->count(); i++) - { - SamplingDevice *samplingDevice = (SamplingDevice*) (comboBox->itemData(i)).value(); - - if ((samplingDevice->m_deviceId == deviceSinkAPI->getSampleSinkId()) && - (samplingDevice->m_deviceSerial == deviceSinkAPI->getSampleSinkSerial()) && - (samplingDevice->m_deviceSequence == deviceSinkAPI->getSampleSinkSequence())) - { - return i; - } - } - - return 0; // default to first item -} - -int PluginManager::selectSampleSourceByIndex(int index, DeviceSourceAPI *deviceAPI) -{ - qDebug("PluginManager::selectSampleSourceByIndex: index: %d", index); - - if (m_sampleSourceDevices.count() == 0) - { - return -1; - } - - if (index < 0) - { - return -1; - } - - if (index >= m_sampleSourceDevices.count()) - { - index = 0; - } - - qDebug() << "PluginManager::selectSampleSourceByIndex: m_sampleSource at index " << index - << " hid: " << m_sampleSourceDevices[index].m_hadrwareId.toStdString().c_str() - << " id: " << m_sampleSourceDevices[index].m_deviceId.toStdString().c_str() - << " ser: " << m_sampleSourceDevices[index].m_deviceSerial.toStdString().c_str() - << " seq: " << m_sampleSourceDevices[index].m_deviceSequence; - - deviceAPI->stopAcquisition(); - deviceAPI->setSampleSourcePluginInstanceGUI(0); // this effectively destroys the previous GUI if it exists - - deviceAPI->setSampleSourceSequence(m_sampleSourceDevices[index].m_deviceSequence); - deviceAPI->setHardwareId(m_sampleSourceDevices[index].m_hadrwareId); - deviceAPI->setSampleSourceId(m_sampleSourceDevices[index].m_deviceId); - deviceAPI->setSampleSourceSerial(m_sampleSourceDevices[index].m_deviceSerial); - deviceAPI->setSampleSourceDisplayName(m_sampleSourceDevices[index].m_displayName); - deviceAPI->setSampleSourcePluginInterface(m_sampleSourceDevices[index].m_plugin); - - return index; -} - -int PluginManager::selectSampleSourceBySerialOrSequence(const QString& sourceId, const QString& sourceSerial, uint32_t sourceSequence, DeviceSourceAPI *deviceAPI) -{ - qDebug("PluginManager::selectSampleSourceBySequence by sequence: id: %s ser: %s seq: %d", qPrintable(sourceId), qPrintable(sourceSerial), sourceSequence); - - int index = -1; - int index_matchingSequence = -1; - int index_firstOfKind = -1; - - for (int i = 0; i < m_sampleSourceDevices.count(); i++) - { - if (m_sampleSourceDevices[i].m_deviceId == sourceId) - { - index_firstOfKind = i; - - if (m_sampleSourceDevices[i].m_deviceSerial == sourceSerial) - { - index = i; // exact match - break; - } - - if (m_sampleSourceDevices[i].m_deviceSequence == sourceSequence) - { - index_matchingSequence = i; - } - } - } - - if(index == -1) // no exact match - { - if (index_matchingSequence == -1) // no matching sequence - { - if (index_firstOfKind == -1) // no matching device type - { - if(m_sampleSourceDevices.count() > 0) // take first if any - { - index = 0; - } - else - { - return -1; // return if no device attached - } - } - else - { - index = index_firstOfKind; // take first that matches device type - } - } - else - { - index = index_matchingSequence; // take the one that matches the sequence in the device type - } - } - - qDebug() << "PluginManager::selectSampleSourceBySequence: m_sampleSource at index " << index - << " hid: " << m_sampleSourceDevices[index].m_hadrwareId.toStdString().c_str() - << " id: " << m_sampleSourceDevices[index].m_deviceId.toStdString().c_str() - << " ser: " << m_sampleSourceDevices[index].m_deviceSerial.toStdString().c_str() - << " seq: " << m_sampleSourceDevices[index].m_deviceSequence; - - deviceAPI->stopAcquisition(); - deviceAPI->setSampleSourcePluginInstanceGUI(0); // this effectively destroys the previous GUI if it exists - - // m_sampleSourcePluginGUI = pluginGUI; - deviceAPI->setSampleSourceSequence(m_sampleSourceDevices[index].m_deviceSequence); - deviceAPI->setHardwareId(m_sampleSourceDevices[index].m_hadrwareId); - deviceAPI->setSampleSourceId(m_sampleSourceDevices[index].m_deviceId); - deviceAPI->setSampleSourceSerial(m_sampleSourceDevices[index].m_deviceSerial); - deviceAPI->setSampleSourceDisplayName(m_sampleSourceDevices[index].m_displayName); - deviceAPI->setSampleSourcePluginInterface(m_sampleSourceDevices[index].m_plugin); - - return index; -} - -int PluginManager::selectSampleSinkBySerialOrSequence(const QString& sinkId, const QString& sinkSerial, uint32_t sinkSequence, DeviceSinkAPI *deviceAPI) -{ - qDebug("PluginManager::selectSampleSinkBySerialOrSequence by sequence: id: %s ser: %s seq: %d", qPrintable(sinkId), qPrintable(sinkSerial), sinkSequence); - - int index = -1; - int index_matchingSequence = -1; - int index_firstOfKind = -1; - - for (int i = 0; i < m_sampleSinkDevices.count(); i++) - { - if (m_sampleSinkDevices[i].m_deviceId == sinkId) - { - index_firstOfKind = i; - - if (m_sampleSinkDevices[i].m_deviceSerial == sinkSerial) - { - index = i; // exact match - break; - } - - if (m_sampleSinkDevices[i].m_deviceSequence == sinkSequence) - { - index_matchingSequence = i; - } - } - } - - if(index == -1) // no exact match - { - if (index_matchingSequence == -1) // no matching sequence - { - if (index_firstOfKind == -1) // no matching device type - { - if(m_sampleSinkDevices.count() > 0) // take first if any - { - index = 0; - } - else - { - return -1; // return if no device attached - } - } - else - { - index = index_firstOfKind; // take first that matches device type - } - } - else - { - index = index_matchingSequence; // take the one that matches the sequence in the device type - } - } - - qDebug() << "PluginManager::selectSampleSinkBySerialOrSequence: m_sampleSink at index " << index - << " hid: " << m_sampleSinkDevices[index].m_hadrwareId.toStdString().c_str() - << " id: " << m_sampleSinkDevices[index].m_deviceId.toStdString().c_str() - << " ser: " << m_sampleSinkDevices[index].m_deviceSerial.toStdString().c_str() - << " seq: " << m_sampleSinkDevices[index].m_deviceSequence; - - deviceAPI->stopGeneration(); - deviceAPI->setSampleSinkPluginInstanceUI(0); // this effectively destroys the previous GUI if it exists - - // m_sampleSourcePluginGUI = pluginGUI; - deviceAPI->setSampleSinkSequence(m_sampleSinkDevices[index].m_deviceSequence); - deviceAPI->setHardwareId(m_sampleSinkDevices[index].m_hadrwareId); - deviceAPI->setSampleSinkId(m_sampleSinkDevices[index].m_deviceId); - deviceAPI->setSampleSinkSerial(m_sampleSinkDevices[index].m_deviceSerial); - deviceAPI->setSampleSinkDisplayName(m_sampleSinkDevices[index].m_displayName); - deviceAPI->setSampleSinkPluginInterface(m_sampleSinkDevices[index].m_plugin); - - return index; -} - -void PluginManager::selectSampleSourceByDevice(void *devicePtr, DeviceSourceAPI *deviceAPI) -{ - SamplingDevice *sampleSourceDevice = (SamplingDevice *) devicePtr; - - qDebug() << "PluginManager::selectSampleSourceByDevice: " - << " hid: " << sampleSourceDevice->m_hadrwareId.toStdString().c_str() - << " id: " << sampleSourceDevice->m_deviceId.toStdString().c_str() - << " ser: " << sampleSourceDevice->m_deviceSerial.toStdString().c_str() - << " seq: " << sampleSourceDevice->m_deviceSequence; - - // m_sampleSourcePluginGUI = pluginGUI; - deviceAPI->setSampleSourceSequence(sampleSourceDevice->m_deviceSequence); - deviceAPI->setHardwareId(sampleSourceDevice->m_hadrwareId); - deviceAPI->setSampleSourceId(sampleSourceDevice->m_deviceId); - deviceAPI->setSampleSourceSerial(sampleSourceDevice->m_deviceSerial); - deviceAPI->setSampleSourceDisplayName(sampleSourceDevice->m_displayName); - deviceAPI->setSampleSourcePluginInterface(sampleSourceDevice->m_plugin); -} - -void PluginManager::selectSampleSinkByDevice(void *devicePtr, DeviceSinkAPI *deviceAPI) -{ - SamplingDevice *sampleSinkDevice = (SamplingDevice *) devicePtr; - - qDebug() << "PluginManager::selectSampleSinkByDevice: " - << " hid: " << sampleSinkDevice->m_hadrwareId.toStdString().c_str() - << " id: " << sampleSinkDevice->m_deviceId.toStdString().c_str() - << " ser: " << sampleSinkDevice->m_deviceSerial.toStdString().c_str() - << " seq: " << sampleSinkDevice->m_deviceSequence; - - // m_sampleSourcePluginGUI = pluginGUI; - deviceAPI->setSampleSinkSequence(sampleSinkDevice->m_deviceSequence); - deviceAPI->setHardwareId(sampleSinkDevice->m_hadrwareId); - deviceAPI->setSampleSinkId(sampleSinkDevice->m_deviceId); - deviceAPI->setSampleSinkSerial(sampleSinkDevice->m_deviceSerial); - deviceAPI->setSampleSinkDisplayName(sampleSinkDevice->m_displayName); - deviceAPI->setSampleSinkPluginInterface(sampleSinkDevice->m_plugin); -} - -void PluginManager::loadPlugins(const QDir& dir) -{ - QDir pluginsDir(dir); - - foreach (QString fileName, pluginsDir.entryList(QDir::Files)) - { - if (fileName.endsWith(".so") || fileName.endsWith(".dll") || fileName.endsWith(".dylib")) - { - qDebug() << "PluginManager::loadPlugins: fileName: " << qPrintable(fileName); - - QPluginLoader* loader = new QPluginLoader(pluginsDir.absoluteFilePath(fileName)); - PluginInterface* plugin = qobject_cast(loader->instance()); - - if (loader->isLoaded()) - { - qWarning("PluginManager::loadPlugins: loaded plugin %s", qPrintable(fileName)); - } - else - { - qWarning() << "PluginManager::loadPlugins: " << qPrintable(loader->errorString()); - } - - if (plugin != 0) - { - m_plugins.append(Plugin(fileName, loader, plugin)); - } - else - { - loader->unload(); - } - - delete loader; // Valgrind memcheck - } - } - - // recursive calls on subdirectories - - foreach (QString dirName, pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) - { - loadPlugins(pluginsDir.absoluteFilePath(dirName)); - } -} - -PluginInterface* PluginManager::getPluginInterfaceAt(int index) -{ - if (index < m_sampleSourceDevices.size()) { - return m_sampleSourceDevices[index].m_plugin; - } else { - return 0; - } -} - -void PluginManager::populateRxChannelComboBox(QComboBox *channels) -{ - for(PluginAPI::ChannelRegistrations::iterator it = m_rxChannelRegistrations.begin(); it != m_rxChannelRegistrations.end(); ++it) - { - const PluginDescriptor& pluginDescipror = it->m_plugin->getPluginDescriptor(); - channels->addItem(pluginDescipror.displayedName); - } -} - -void PluginManager::populateTxChannelComboBox(QComboBox *channels) -{ - for(PluginAPI::ChannelRegistrations::iterator it = m_txChannelRegistrations.begin(); it != m_txChannelRegistrations.end(); ++it) - { - const PluginDescriptor& pluginDescipror = it->m_plugin->getPluginDescriptor(); - channels->addItem(pluginDescipror.displayedName); - } -} - -void PluginManager::createRxChannelInstance(int channelPluginIndex, DeviceSourceAPI *deviceAPI) -{ - if (channelPluginIndex < m_rxChannelRegistrations.size()) - { - PluginInterface *pluginInterface = m_rxChannelRegistrations[channelPluginIndex].m_plugin; - pluginInterface->createRxChannel(m_rxChannelRegistrations[channelPluginIndex].m_channelName, deviceAPI); - } -} - -void PluginManager::createTxChannelInstance(int channelPluginIndex, DeviceSinkAPI *deviceAPI) -{ - if (channelPluginIndex < m_txChannelRegistrations.size()) - { - PluginInterface *pluginInterface = m_txChannelRegistrations[channelPluginIndex].m_plugin; - pluginInterface->createTxChannel(m_txChannelRegistrations[channelPluginIndex].m_channelName, deviceAPI); - } -} diff --git a/sdrgui/plugin/pluginmanager.h b/sdrgui/plugin/pluginmanager.h deleted file mode 100644 index 801468cc8..000000000 --- a/sdrgui/plugin/pluginmanager.h +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef INCLUDE_PLUGINMANAGER_H -#define INCLUDE_PLUGINMANAGER_H - -#include -#include -#include -#include "plugin/plugininterface.h" -#include "plugin/pluginapi.h" -#include "util/export.h" - -class QComboBox; -class QPluginLoader; -class Preset; -class Message; -class MessageQueue; -class DeviceSourceAPI; -class DeviceSinkAPI; - -class SDRANGEL_API PluginManager : public QObject { - Q_OBJECT - -public: - struct Plugin - { - QString filename; - QPluginLoader* loader; - PluginInterface* pluginInterface; - - Plugin(const QString& _filename, QPluginLoader* pluginLoader, PluginInterface* _plugin) : - filename(_filename), - loader(pluginLoader), - pluginInterface(_plugin) - { } - }; - - typedef QList Plugins; - - explicit PluginManager(QObject* parent = 0); - ~PluginManager(); - - PluginAPI *getPluginAPI() { return &m_pluginAPI; } - void loadPlugins(); - const Plugins& getPlugins() const { return m_plugins; } - - // Callbacks from the plugins - void registerRxChannel(const QString& channelName, PluginInterface* plugin); - void registerSampleSource(const QString& sourceName, PluginInterface* plugin); - void registerTxChannel(const QString& channelName, PluginInterface* plugin); - void registerSampleSink(const QString& sourceName, PluginInterface* plugin); - - PluginAPI::ChannelRegistrations *getRxChannelRegistrations() { return &m_rxChannelRegistrations; } - PluginAPI::ChannelRegistrations *getTxChannelRegistrations() { return &m_txChannelRegistrations; } - - void updateSampleSourceDevices(); - void duplicateLocalSampleSourceDevices(uint deviceUID); - void fillSampleSourceSelector(QComboBox* comboBox, uint deviceUID); - int getSampleSourceSelectorIndex(QComboBox* comboBox, DeviceSourceAPI *deviceSourceAPI); - - void updateSampleSinkDevices(); - void duplicateLocalSampleSinkDevices(uint deviceUID); - void fillSampleSinkSelector(QComboBox* comboBox, uint deviceUID); - int getSampleSinkSelectorIndex(QComboBox* comboBox, DeviceSinkAPI *deviceSinkAPI); - - int selectSampleSourceByIndex(int index, DeviceSourceAPI *deviceAPI); - int selectSampleSourceBySerialOrSequence(const QString& sourceId, const QString& sourceSerial, uint32_t sourceSequence, DeviceSourceAPI *deviceAPI); - void selectSampleSourceByDevice(void *devicePtr, DeviceSourceAPI *deviceAPI); - - int selectSampleSinkBySerialOrSequence(const QString& sinkId, const QString& sinkSerial, uint32_t sinkSequence, DeviceSinkAPI *deviceAPI); - void selectSampleSinkByDevice(void *devicePtr, DeviceSinkAPI *deviceAPI); - - PluginInterface* getPluginInterfaceAt(int index); - - void populateRxChannelComboBox(QComboBox *channels); - void createRxChannelInstance(int channelPluginIndex, DeviceSourceAPI *deviceAPI); - - void populateTxChannelComboBox(QComboBox *channels); - void createTxChannelInstance(int channelPluginIndex, DeviceSinkAPI *deviceAPI); - -private: - struct SamplingDeviceRegistration { - QString m_deviceId; - PluginInterface* m_plugin; - SamplingDeviceRegistration(const QString& deviceId, PluginInterface* plugin) : - m_deviceId(deviceId), - m_plugin(plugin) - { } - }; - - typedef QList SamplingDeviceRegistrations; - - struct SamplingDevice { - PluginInterface* m_plugin; - QString m_displayName; - QString m_hadrwareId; - QString m_deviceId; - QString m_deviceSerial; - uint32_t m_deviceSequence; - - SamplingDevice(PluginInterface* plugin, - const QString& displayName, - const QString& hadrwareId, - const QString& deviceId, - const QString& deviceSerial, - int deviceSequence) : - m_plugin(plugin), - m_displayName(displayName), - m_hadrwareId(hadrwareId), - m_deviceId(deviceId), - m_deviceSerial(deviceSerial), - m_deviceSequence(deviceSequence) - { } - }; - - typedef QList SamplingDevices; - - PluginAPI m_pluginAPI; - Plugins m_plugins; - - PluginAPI::ChannelRegistrations m_rxChannelRegistrations; //!< Channel plugins register here - SamplingDeviceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here - SamplingDevices m_sampleSourceDevices; //!< Instances of input sources present in the system - - PluginAPI::ChannelRegistrations m_txChannelRegistrations; //!< Channel plugins register here - SamplingDeviceRegistrations m_sampleSinkRegistrations; //!< Output sink plugins (one per device kind) register here - SamplingDevices m_sampleSinkDevices; //!< Instances of output sinks present in the system - - // "Local" sample source device IDs - static const QString m_sdrDaemonHardwareID; //!< SDRdaemon hardware ID - static const QString m_sdrDaemonDeviceTypeID; //!< SDRdaemon source plugin ID - static const QString m_fileSourceHardwareID; //!< FileSource source hardware ID - static const QString m_fileSourceDeviceTypeID; //!< FileSource source plugin ID - - // "Local" sample sink device IDs - static const QString m_fileSinkDeviceTypeID; //!< FileSink sink plugin ID - - void loadPlugins(const QDir& dir); -}; - -static inline bool operator<(const PluginManager::Plugin& a, const PluginManager::Plugin& b) -{ - return a.pluginInterface->getPluginDescriptor().displayedName < b.pluginInterface->getPluginDescriptor().displayedName; -} - -#endif // INCLUDE_PLUGINMANAGER_H diff --git a/sdrbase/readme.md b/sdrgui/readme.md similarity index 91% rename from sdrbase/readme.md rename to sdrgui/readme.md index 90bb1047a..d25613627 100644 --- a/sdrbase/readme.md +++ b/sdrgui/readme.md @@ -35,8 +35,7 @@ The following items are presented hierarchically from left to right: - Devices: - _Add source device_: adds a new source (receiver) device slot to the device stack (last position) - _Add sink device_: adds a new sink (transmitter) device slot to the device stack (last position) - - _Remove device_: removes the last device slot from thte device stack - - _Reload devices_: re-scan the system for devices. Devices selectors are updated with new devices and missing devices are removed. All devices must be stopped for this to take effect. + - _Remove last device_: removes the last device slot from thte device stack - Window: presents the list of dockable windows. Check to make it visible. Uncheck to hide. These windows are: - _Sampling devices control_: control of which sampling devices is used and add channels - _Sampling devices_: the sampling devices UIs @@ -146,19 +145,37 @@ This is where the sampling device for one device set is selected and the channel ![Sampling Devices control](../doc/img/MainWindow_SDControl.png) -

3.1. Sampling device selector

+

3.1. Currently sampling device name

-Use this combo box to select one sampling device +This label shows the human readable sampling device name -

3.2. Sampling device selection confirmation

+

3.2. Open sampling device change dialog

-Use this push button to confirm the selection and change the sampling device +Use this push button to open the device selection dialog to change the sampling device. This dialog will open: -

3.3. Channel selector

+![Main Window sampling devices dialog](../doc/img/MainWindow_SDDialog.png) + +
3.2.1. Device selection combo
+ +Use this combo box to select the device. Only available devices will appear in the list. For devices having more than one channel (ex: LimeSDR) the channel number will appear next to the device sequence number inside the brackets. Ex: `LimeSDR[0:1] 0009060B00473419` designates the second Rx (Rx #1) of the first encountered LimeSDR which serial number is 0009060B00473419. + +
3.2.2. Device selection confirmation
+ +Use the `OK` button to confirm your choice and exit the dialog + +
3.2.3. Device selection cancellation
+ +Use the `Cancel` button to exit the dialog without any change + +

3.3. Reload currently selected device

+ +This button activates a close/open sequence to recycle the device. It may be useful when the device is not streaming anymore or in an attempt to clear possible errors. Make sure the streaming is stopeed first. + +

3.4. Channel selector

Use this combo box to select a channel plugin to create a new channel -

3.4. Add a new channel

+

3.5. Add a new channel

Use this push button to add a new channel with the selected plugin diff --git a/sdrgui/resources/choose.png b/sdrgui/resources/choose.png new file mode 100644 index 000000000..25193d6e7 Binary files /dev/null and b/sdrgui/resources/choose.png differ diff --git a/sdrgui/resources/res.qrc b/sdrgui/resources/res.qrc index 816192ae1..ce9b3853b 100644 --- a/sdrgui/resources/res.qrc +++ b/sdrgui/resources/res.qrc @@ -79,5 +79,6 @@ stream.png antenna.png link.png + choose.png diff --git a/sdrgui/sdrgui.pro b/sdrgui/sdrgui.pro index 481b6f980..8a060c1e0 100644 --- a/sdrgui/sdrgui.pro +++ b/sdrgui/sdrgui.pro @@ -34,8 +34,6 @@ CONFIG(MINGW64):INCLUDEPATH += "D:\boost_1_58_0" CONFIG(macx):INCLUDEPATH += "../../../boost_1_64_0" SOURCES += mainwindow.cpp\ - device/devicesourceapi.cpp\ - device/devicesinkapi.cpp\ device/deviceuiset.cpp\ dsp/spectrumscopecombovis.cpp\ dsp/spectrumscopengcombovis.cpp\ @@ -66,16 +64,14 @@ SOURCES += mainwindow.cpp\ gui/presetitem.cpp\ gui/rollupwidget.cpp\ gui/samplingdevicecontrol.cpp\ + gui/samplingdevicedialog.cpp\ gui/mypositiondialog.cpp\ gui/scale.cpp\ gui/scaleengine.cpp\ gui/transverterbutton.cpp\ gui/transverterdialog.cpp\ gui/valuedial.cpp\ - gui/valuedialz.cpp\ - plugin/pluginapi.cpp\ - plugin/pluginmanager.cpp\ - plugin/plugininterface.cpp + gui/valuedialz.cpp HEADERS += mainwindow.h\ device/devicesourceapi.h\ @@ -111,16 +107,14 @@ HEADERS += mainwindow.h\ gui/presetitem.h\ gui/rollupwidget.h\ gui/samplingdevicecontrol.h\ + gui/samplingdevicedialog.h\ gui/mypositiondialog.h\ gui/scale.h\ gui/scaleengine.h\ gui/transverterbutton.h\ gui/transverterdialog.h\ gui/valuedial.h\ - gui/valuedialz.h\ - plugin/pluginapi.h\ - plugin/pluginmanager.h\ - plugin/plugininterface.h + gui/valuedialz.h FORMS += mainwindow.ui\ gui/scopewindow.ui\ @@ -134,6 +128,7 @@ FORMS += mainwindow.ui\ gui/aboutdialog.ui\ gui/pluginsdialog.ui\ gui/samplingdevicecontrol.ui\ + gui/samplingdevicedialog.ui\ gui/myposdialog.ui\ gui/glspectrumgui.ui\ gui/transverterdialog.ui\