From dec0addc25903c253c2a19cb2c8f02594f4c9a94 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 13 May 2016 11:42:03 +0200 Subject: [PATCH] Multi device support: basic multi device creation and deletion --- sdrbase/dsp/dspdeviceengine.cpp | 1 - sdrbase/dsp/dspengine.cpp | 1 + sdrbase/mainwindow.cpp | 89 ++++++++++++++++++++++++++------- sdrbase/mainwindow.h | 5 +- sdrbase/mainwindow.ui | 18 +++---- sdrbase/plugin/pluginapi.cpp | 23 +++++---- sdrbase/plugin/pluginapi.h | 3 +- 7 files changed, 96 insertions(+), 44 deletions(-) diff --git a/sdrbase/dsp/dspdeviceengine.cpp b/sdrbase/dsp/dspdeviceengine.cpp index feb244141..257b77102 100644 --- a/sdrbase/dsp/dspdeviceengine.cpp +++ b/sdrbase/dsp/dspdeviceengine.cpp @@ -99,7 +99,6 @@ void DSPDeviceEngine::stopAcquistion() m_syncMessenger.storeMessage(cmd); handleSynchronousMessages(); - if(m_dcOffsetCorrection) { qDebug("DC offset:%f,%f", m_iOffset, m_qOffset); diff --git a/sdrbase/dsp/dspengine.cpp b/sdrbase/dsp/dspengine.cpp index 5b688a2e9..d89d3720c 100644 --- a/sdrbase/dsp/dspengine.cpp +++ b/sdrbase/dsp/dspengine.cpp @@ -59,6 +59,7 @@ void DSPEngine::removeLastDeviceEngine() DSPDeviceEngine *lastDeviceEngine = m_deviceEngines.back(); delete lastDeviceEngine; m_deviceEngines.pop_back(); + m_deviceEnginesUIDSequence--; } } diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp index b6aec1720..45c54fb0d 100644 --- a/sdrbase/mainwindow.cpp +++ b/sdrbase/mainwindow.cpp @@ -159,21 +159,24 @@ MainWindow::MainWindow(QWidget* parent) : MainWindow::~MainWindow() { - m_dspEngine->stopAllAcquisitions(); + saveSettings(); - saveSettings(); - - m_pluginManager->freeAll(); - - for (int i = 0; i < m_deviceUIs.size(); i++) - { - delete m_deviceUIs[i]; - } - - delete m_pluginManager; - - m_dspEngine->stopAllDeviceEngines(); + while (m_deviceUIs.size() > 0) + { + removeLastDevice(); + } +// m_dspEngine->stopAllAcquisitions(); // FIXME: also present in m_pluginManager->freeAll() +// //m_pluginManager->freeAll(); +// for (int i = 0; i < m_deviceUIs.size(); i++) +// { +// m_deviceUIs[i]->m_pluginManager->freeAll(); +// delete m_deviceUIs[i]; +// } +// +// m_dspEngine->stopAllDeviceEngines(); +// +// //delete m_pluginManager; delete m_dateTimeWidget; delete m_showSystemWidget; @@ -185,23 +188,57 @@ void MainWindow::addDevice() DSPDeviceEngine *dspDeviceEngine = m_dspEngine->addDeviceEngine(); dspDeviceEngine->start(); + uint dspDeviceEngineUID = dspDeviceEngine->getUID(); char tabNameCStr[16]; - sprintf(tabNameCStr, "R%d", dspDeviceEngine->getUID()); + sprintf(tabNameCStr, "R%d", dspDeviceEngineUID); m_deviceUIs.push_back(new DeviceUISet(m_masterTimer)); + m_deviceUIs.back()->m_deviceEngine = dspDeviceEngine; - m_pluginManager = new PluginManager(this, dspDeviceEngine, m_deviceUIs.back()->m_spectrum); - m_pluginManager->loadPlugins(); + PluginManager *pluginManager = new PluginManager(this, dspDeviceEngine, m_deviceUIs.back()->m_spectrum); + m_deviceUIs.back()->m_pluginManager = pluginManager; + pluginManager->loadPlugins(); + dspDeviceEngine->addSink(m_deviceUIs.back()->m_spectrumVis); ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr); ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr); - dspDeviceEngine->addSink(m_deviceUIs.back()->m_spectrumVis); ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr); + bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_sampleSource->blockSignals(true); - m_pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_sampleSource); + pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_sampleSource); connect(m_deviceUIs.back()->m_sampleSource, SIGNAL(currentIndexChanged(int)), this, SLOT(on_sampleSource_currentIndexChanged(int))); m_deviceUIs.back()->m_sampleSource->blockSignals(sampleSourceSignalsBlocked); ui->tabInputs->addTab(m_deviceUIs.back()->m_sampleSource, tabNameCStr); + + if (dspDeviceEngineUID == 0) + { + m_pluginManager = pluginManager; + } +} + +void MainWindow::removeLastDevice() +{ + DSPDeviceEngine *lastDeviceEngine = m_deviceUIs.back()->m_deviceEngine; + lastDeviceEngine->stopAcquistion(); + lastDeviceEngine->removeSink(m_deviceUIs.back()->m_spectrumVis); + + ui->tabChannels->removeTab(ui->tabChannels->count() - 1); + ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1); + ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); + + // PluginManager destructor does freeAll() which does stopAcquistion() but stopAcquistion() + // can be done several times only the first is active so it is fine to do it here + // On the other hand freeAll() must be executed only once + delete m_deviceUIs.back()->m_pluginManager; + //m_deviceUIs.back()->m_pluginManager->freeAll(); + + lastDeviceEngine->stop(); + m_dspEngine->removeLastDeviceEngine(); + + ui->tabInputs->removeTab(ui->tabInputs->count() - 1); + + delete m_deviceUIs.back(); + m_deviceUIs.pop_back(); } void MainWindow::addChannelCreateAction(QAction* action) @@ -622,9 +659,22 @@ void MainWindow::on_action_About_triggered() dlg.exec(); } +void MainWindow::on_action_addDevice_triggered() +{ + addDevice(); +} + +void MainWindow::on_action_removeDevice_triggered() +{ + if (m_deviceUIs.size() > 1) + { + removeLastDevice(); + } +} + void MainWindow::updateStatus() { - m_dateTimeWidget->setText(QDateTime::currentDateTime().toString("yyyy-MM-ddThh:mm:ss t")); + m_dateTimeWidget->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss t")); } MainWindow::DeviceUISet::DeviceUISet(QTimer& timer) @@ -637,6 +687,7 @@ MainWindow::DeviceUISet::DeviceUISet(QTimer& timer) m_channelWindow = new ChannelWindow; m_sampleSource = new QComboBox; m_deviceEngine = 0; + m_pluginManager = 0; // m_spectrum needs to have its font to be set since it cannot be inherited from the main window QFont font; diff --git a/sdrbase/mainwindow.h b/sdrbase/mainwindow.h index d124ed812..47fe7a17c 100644 --- a/sdrbase/mainwindow.h +++ b/sdrbase/mainwindow.h @@ -60,6 +60,7 @@ public: ChannelWindow *m_channelWindow; QComboBox *m_sampleSource; DSPDeviceEngine *m_deviceEngine; + PluginManager *m_pluginManager; DeviceUISet(QTimer& timer); ~DeviceUISet(); @@ -94,8 +95,6 @@ private: MainSettings m_settings; - SpectrumVis* m_rxSpectrumVis; - std::vector m_deviceUIs; DSPEngine* m_dspEngine; @@ -147,6 +146,8 @@ private slots: void on_action_DV_Serial_triggered(bool checked); void on_sampleSource_currentIndexChanged(int index); void on_action_About_triggered(); + void on_action_addDevice_triggered(); + void on_action_removeDevice_triggered(); }; #endif // INCLUDE_MAINWINDOW_H diff --git a/sdrbase/mainwindow.ui b/sdrbase/mainwindow.ui index 785c3e793..9caeb7c7e 100644 --- a/sdrbase/mainwindow.ui +++ b/sdrbase/mainwindow.ui @@ -91,8 +91,8 @@ &Acquisition - - + + @@ -545,27 +545,21 @@ - + - Start Recording + Add device - - F7 - - + - Stop Recording + Remove device - - F8 - diff --git a/sdrbase/plugin/pluginapi.cpp b/sdrbase/plugin/pluginapi.cpp index b100b6462..abd4ac6de 100644 --- a/sdrbase/plugin/pluginapi.cpp +++ b/sdrbase/plugin/pluginapi.cpp @@ -3,15 +3,16 @@ #include "plugin/pluginmanager.h" #include "mainwindow.h" -QDockWidget* PluginAPI::createMainWindowDock(Qt::DockWidgetArea dockWidgetArea, const QString& title) -{ - QDockWidget* dock = new QDockWidget(title, m_mainWindow); - dock->setAllowedAreas(Qt::AllDockWidgetAreas); - dock->setAttribute(Qt::WA_DeleteOnClose); - m_mainWindow->addDockWidget(dockWidgetArea, dock); - m_mainWindow->addViewAction(dock->toggleViewAction()); - return dock; -} +// This was used in Tetra demod plugin which is not part of the build anymore +//QDockWidget* PluginAPI::createMainWindowDock(Qt::DockWidgetArea dockWidgetArea, const QString& title) +//{ +// QDockWidget* dock = new QDockWidget(title, m_mainWindow); +// dock->setAllowedAreas(Qt::AllDockWidgetAreas); +// dock->setAttribute(Qt::WA_DeleteOnClose); +// m_mainWindow->addDockWidget(dockWidgetArea, dock); +// m_mainWindow->addViewAction(dock->toggleViewAction()); +// return dock; +//} MessageQueue* PluginAPI::getMainWindowMessageQueue() { @@ -139,3 +140,7 @@ PluginAPI::PluginAPI(PluginManager* pluginManager, MainWindow* mainWindow) : m_mainWindow(mainWindow) { } + +PluginAPI::~PluginAPI() +{ +} diff --git a/sdrbase/plugin/pluginapi.h b/sdrbase/plugin/pluginapi.h index d47043532..2c9c7a466 100644 --- a/sdrbase/plugin/pluginapi.h +++ b/sdrbase/plugin/pluginapi.h @@ -26,7 +26,7 @@ class SDRANGEL_API PluginAPI : public QObject { public: // MainWindow access - QDockWidget* createMainWindowDock(Qt::DockWidgetArea dockWidgetArea, const QString& title); + //QDockWidget* createMainWindowDock(Qt::DockWidgetArea dockWidgetArea, const QString& title); MessageQueue* getMainWindowMessageQueue(); void setInputGUI(QWidget* inputGUI); @@ -68,6 +68,7 @@ protected: MainWindow* m_mainWindow; PluginAPI(PluginManager* pluginManager, MainWindow* mainWindow); + ~PluginAPI(); friend class PluginManager; };