mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-17 23:28:50 -05:00
Multi device support: basic multi device creation and deletion
This commit is contained in:
parent
df661cc366
commit
dec0addc25
@ -99,7 +99,6 @@ void DSPDeviceEngine::stopAcquistion()
|
||||
m_syncMessenger.storeMessage(cmd);
|
||||
handleSynchronousMessages();
|
||||
|
||||
|
||||
if(m_dcOffsetCorrection)
|
||||
{
|
||||
qDebug("DC offset:%f,%f", m_iOffset, m_qOffset);
|
||||
|
@ -59,6 +59,7 @@ void DSPEngine::removeLastDeviceEngine()
|
||||
DSPDeviceEngine *lastDeviceEngine = m_deviceEngines.back();
|
||||
delete lastDeviceEngine;
|
||||
m_deviceEngines.pop_back();
|
||||
m_deviceEnginesUIDSequence--;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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<DeviceUISet*> 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
|
||||
|
@ -91,8 +91,8 @@
|
||||
<property name="title">
|
||||
<string>&Acquisition</string>
|
||||
</property>
|
||||
<addaction name="action_Start_Recording"/>
|
||||
<addaction name="action_Stop_Recording"/>
|
||||
<addaction name="action_addDevice"/>
|
||||
<addaction name="action_removeDevice"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_View">
|
||||
<property name="font">
|
||||
@ -545,27 +545,21 @@
|
||||
<font/>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Start_Recording">
|
||||
<action name="action_addDevice">
|
||||
<property name="text">
|
||||
<string>Start Recording</string>
|
||||
<string>Add device</string>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font/>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>F7</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Stop_Recording">
|
||||
<action name="action_removeDevice">
|
||||
<property name="text">
|
||||
<string>Stop Recording</string>
|
||||
<string>Remove device</string>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font/>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>F8</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Audio">
|
||||
<property name="text">
|
||||
|
@ -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()
|
||||
{
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user