diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp
index e1d1b96d7..c68b55a47 100644
--- a/sdrbase/mainwindow.cpp
+++ b/sdrbase/mainwindow.cpp
@@ -1,1075 +1,1075 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany //
-// written by Christian Daniel //
-// //
-// 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
-#include
-#include
-
-#include "mainwindow.h"
-#include "ui_mainwindow.h"
-#include "device/devicesourceapi.h"
-#include "device/devicesinkapi.h"
-#include "audio/audiodeviceinfo.h"
-#include "gui/indicator.h"
-#include "gui/presetitem.h"
-#include "gui/addpresetdialog.h"
-#include "gui/pluginsdialog.h"
-#include "gui/aboutdialog.h"
-#include "gui/rollupwidget.h"
-#include "gui/channelwindow.h"
-#include "gui/audiodialog.h"
-#include "gui/samplingdevicecontrol.h"
-#include "gui/mypositiondialog.h"
-#include "dsp/dspengine.h"
-#include "dsp/spectrumvis.h"
-#include "dsp/dspcommands.h"
-#include "plugin/plugingui.h"
-#include "plugin/pluginapi.h"
-#include "plugin/plugingui.h"
-
-#include "gui/glspectrum.h"
-#include "gui/glspectrumgui.h"
-
-#include
-#include
-
-MainWindow::MainWindow(QWidget* parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow),
- m_masterTabIndex(0),
- m_settings(),
- m_dspEngine(DSPEngine::instance()),
- m_lastEngineState((DSPDeviceSourceEngine::State)-1),
- m_inputGUI(0),
- m_sampleRate(0),
- m_centerFrequency(0),
- m_sampleFileName(std::string("./test.sdriq"))
-{
- qDebug() << "MainWindow::MainWindow: start";
-
- m_settings.setAudioDeviceInfo(&m_audioDeviceInfo);
-
- ui->setupUi(this);
- createStatusBar();
-
- setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
- setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
- setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
- setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
-
- // work around broken Qt dock widget ordering
- removeDockWidget(ui->inputViewDock);
- removeDockWidget(ui->inputSelectDock);
- removeDockWidget(ui->spectraDisplayDock);
- removeDockWidget(ui->presetDock);
- removeDockWidget(ui->channelDock);
- addDockWidget(Qt::LeftDockWidgetArea, ui->inputSelectDock);
- addDockWidget(Qt::LeftDockWidgetArea, ui->inputViewDock);
- addDockWidget(Qt::LeftDockWidgetArea, ui->spectraDisplayDock);
- addDockWidget(Qt::LeftDockWidgetArea, ui->presetDock);
- addDockWidget(Qt::RightDockWidgetArea, ui->channelDock);
-
- ui->inputViewDock->show();
- ui->inputSelectDock->show();
- ui->spectraDisplayDock->show();
- ui->presetDock->show();
- ui->channelDock->show();
-
- ui->menu_Window->addAction(ui->inputViewDock->toggleViewAction());
- ui->menu_Window->addAction(ui->inputSelectDock->toggleViewAction());
- ui->menu_Window->addAction(ui->spectraDisplayDock->toggleViewAction());
- ui->menu_Window->addAction(ui->presetDock->toggleViewAction());
- ui->menu_Window->addAction(ui->channelDock->toggleViewAction());
-
- ui->tabInputsView->setStyleSheet("QWidget { background: rgb(50,50,50); } "
- "QToolButton::checked { background: rgb(128,70,0); } "
- "QComboBox::item:selected { color: rgb(255,140,0); } "
- "QTabWidget::pane { border: 1px solid #C06900; } "
- "QTabBar::tab:selected { background: rgb(128,70,0); }");
- ui->tabInputsSelect->setStyleSheet("QWidget { background: rgb(50,50,50); } "
- "QToolButton::checked { background: rgb(128,70,0); } "
- "QComboBox::item:selected { color: rgb(255,140,0); } "
- "QTabWidget::pane { border: 1px solid #808080; } "
- "QTabBar::tab:selected { background: rgb(100,100,100); }");
-
- m_pluginManager = new PluginManager(this);
- m_pluginManager->loadPlugins();
-
- connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);
-
- connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
- m_statusTimer.start(1000);
-
- m_masterTimer.start(50);
-
- qDebug() << "MainWindow::MainWindow: add the first device...";
-
- addSourceDevice(); // add the first device
-
- qDebug() << "MainWindow::MainWindow: load settings...";
-
- loadSettings();
-
- qDebug() << "MainWindow::MainWindow: select SampleSource from settings...";
-
- int sampleSourceIndex = m_settings.getSourceIndex();
- sampleSourceIndex = m_pluginManager->selectSampleSourceByIndex(sampleSourceIndex, m_deviceUIs.back()->m_deviceSourceAPI);
-
- if (sampleSourceIndex < 0)
- {
- qCritical("MainWindow::MainWindow: no sample source. Exit");
- exit(0);
- }
-
- 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);
-
- qDebug() << "MainWindow::MainWindow: apply settings...";
-
- applySettings();
-
- qDebug() << "MainWindow::MainWindow: update preset controls...";
-
- updatePresetControls();
-
- connect(ui->tabInputsView, SIGNAL(currentChanged(int)), this, SLOT(tabInputViewIndexChanged()));
-
- qDebug() << "MainWindow::MainWindow: end";
-}
-
-MainWindow::~MainWindow()
-{
- delete m_pluginManager;
- delete m_dateTimeWidget;
- delete m_showSystemWidget;
-
- delete ui;
-}
-
-void MainWindow::addSourceDevice()
-{
- DSPDeviceSourceEngine *dspDeviceSourceEngine = m_dspEngine->addDeviceSourceEngine();
- dspDeviceSourceEngine->start();
-
- uint dspDeviceSourceEngineUID = dspDeviceSourceEngine->getUID();
- char uidCStr[16];
- sprintf(uidCStr, "UID:%d", dspDeviceSourceEngineUID);
-
- m_deviceUIs.push_back(new DeviceUISet(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(this, deviceTabIndex, dspDeviceSourceEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow);
-
- 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());
-
- connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool)));
-
- dspDeviceSourceEngine->addSink(m_deviceUIs.back()->m_spectrumVis);
- ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr);
- 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->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));
-
- int sampleSourceIndex = m_pluginManager->selectSampleSourceBySerialOrSequence("sdrangel.samplesource.filesource", "0", 0, m_deviceUIs.back()->m_deviceSourceAPI);
-}
-
-void MainWindow::addSinkDevice()
-{
- DSPDeviceSinkEngine *dspDeviceSinkEngine = m_dspEngine->addDeviceSinkEngine();
- dspDeviceSinkEngine->start();
-
- uint dspDeviceSinkEngineUID = dspDeviceSinkEngine->getUID();
- char uidCStr[16];
- sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID);
-
- m_deviceUIs.push_back(new DeviceUISet(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(this, deviceTabIndex, dspDeviceSinkEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow);
-
- 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());
-
- connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool)));
-
- dspDeviceSinkEngine->addSpectrumSink(m_deviceUIs.back()->m_spectrumVis);
- ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr);
- 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->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));
-
- int sampleSinkIndex = m_pluginManager->selectSampleSinkBySerialOrSequence("sdrangel.samplesink.filesink", "0", 0, m_deviceUIs.back()->m_deviceSinkAPI);
-}
-
-void MainWindow::removeLastDevice()
-{
- if (m_deviceUIs.back()->m_deviceSourceEngine) // source tab
- {
- DSPDeviceSourceEngine *lastDeviceEngine = m_deviceUIs.back()->m_deviceSourceEngine;
- lastDeviceEngine->stopAcquistion();
- lastDeviceEngine->removeSink(m_deviceUIs.back()->m_spectrumVis);
-
- ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1);
- ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1);
-
- m_deviceUIs.back()->m_deviceSourceAPI->freeAll();
- m_deviceUIs.back()->m_deviceSourceAPI->clearBuddiesLists(); // remove old API from buddies lists
-
- ui->tabChannels->removeTab(ui->tabChannels->count() - 1);
-
- ui->tabInputsSelect->removeTab(ui->tabInputsSelect->count() - 1);
-
- m_deviceWidgetTabs.removeLast();m_pluginManager->loadPlugins();
- ui->tabInputsView->clear();
-
- for (int i = 0; i < m_deviceWidgetTabs.size(); i++)
- {
- qDebug("MainWindow::removeLastDevice: adding back tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str());
- ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName);
- ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName);
- }
-
- delete m_deviceUIs.back();
-
- lastDeviceEngine->stop();
- m_dspEngine->removeLastDeviceSourceEngine();
- }
- else if (m_deviceUIs.back()->m_deviceSinkEngine) // sink tab
- {
- DSPDeviceSinkEngine *lastDeviceEngine = m_deviceUIs.back()->m_deviceSinkEngine;
- lastDeviceEngine->stopGeneration();
- lastDeviceEngine->removeSpectrumSink(m_deviceUIs.back()->m_spectrumVis);
-
- ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1);
- ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1);
-
- m_deviceUIs.back()->m_deviceSinkAPI->freeAll();
- m_deviceUIs.back()->m_deviceSinkAPI->clearBuddiesLists(); // remove old API from buddies lists
-
- ui->tabChannels->removeTab(ui->tabChannels->count() - 1);
-
- ui->tabInputsSelect->removeTab(ui->tabInputsSelect->count() - 1);
-
- m_deviceWidgetTabs.removeLast();
- ui->tabInputsView->clear();
-
- for (int i = 0; i < m_deviceWidgetTabs.size(); i++)
- {
- qDebug("MainWindow::removeLastDevice: adding back tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str());
- ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName);
- ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName);
- }
-
- delete m_deviceUIs.back();
-
- lastDeviceEngine->stop();
- m_dspEngine->removeLastDeviceSinkEngine();
- }
-
- m_deviceUIs.pop_back();
-}
-
-void MainWindow::addChannelRollup(int deviceTabIndex, QWidget* widget)
-{
- if (deviceTabIndex < ui->tabInputsView->count())
- {
- DeviceUISet *deviceUI = m_deviceUIs[deviceTabIndex];
- deviceUI->m_channelWindow->addRollupWidget(widget);
- ui->channelDock->show();
- ui->channelDock->raise();
- }
-}
-
-void MainWindow::addViewAction(QAction* action)
-{
- ui->menu_Window->addAction(action);
-}
-
-void MainWindow::setDeviceGUI(int deviceTabIndex, QWidget* gui, const QString& deviceDisplayName, bool sourceDevice)
-{
- char tabNameCStr[16];
-
- if (sourceDevice)
- {
- sprintf(tabNameCStr, "R%d", deviceTabIndex);
- }
- else
- {
- sprintf(tabNameCStr, "T%d", deviceTabIndex);
- }
-
- qDebug("MainWindow::setDeviceGUI: insert %s tab at %d", sourceDevice ? "Rx" : "Tx", deviceTabIndex);
-
- if (deviceTabIndex < m_deviceWidgetTabs.size())
- {
- m_deviceWidgetTabs[deviceTabIndex] = {gui, deviceDisplayName, QString(tabNameCStr)};
- }
- else
- {
- m_deviceWidgetTabs.append({gui, deviceDisplayName, QString(tabNameCStr)});
- }
-
- ui->tabInputsView->clear();
-
- for (int i = 0; i < m_deviceWidgetTabs.size(); i++)
- {
- qDebug("MainWindow::setDeviceGUI: adding tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str());
- ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName);
- ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName);
- }
-
- ui->tabInputsView->setCurrentIndex(deviceTabIndex);
-}
-
-void MainWindow::loadSettings()
-{
- qDebug() << "MainWindow::loadSettings";
-
- m_settings.load();
- m_settings.sortPresets();
-
- for(int i = 0; i < m_settings.getPresetCount(); ++i)
- {
- addPresetToTree(m_settings.getPreset(i));
- }
-}
-
-void MainWindow::loadPresetSettings(const Preset* preset, int tabIndex)
-{
- qDebug("MainWindow::loadPresetSettings: preset [%s | %s]",
- qPrintable(preset->getGroup()),
- qPrintable(preset->getDescription()));
-
- if (tabIndex >= 0)
- {
- DeviceUISet *deviceUI = m_deviceUIs[tabIndex];
-
- if (deviceUI->m_deviceSourceEngine) // source device
- {
- deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig());
- deviceUI->m_deviceSourceAPI->loadSourceSettings(preset);
- deviceUI->m_deviceSourceAPI->loadChannelSettings(preset, &(m_pluginManager->m_pluginAPI));
- }
- 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->m_pluginAPI));
- }
- }
-
- // has to be last step
- restoreState(preset->getLayout());
-}
-
-void MainWindow::savePresetSettings(Preset* preset, int tabIndex)
-{
- qDebug("MainWindow::savePresetSettings: preset [%s | %s]",
- qPrintable(preset->getGroup()),
- qPrintable(preset->getDescription()));
-
- // Save from currently selected source tab
- //int currentSourceTabIndex = ui->tabInputsView->currentIndex();
- DeviceUISet *deviceUI = m_deviceUIs[tabIndex];
-
- if (deviceUI->m_deviceSourceEngine) // source device
- {
- preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
- preset->clearChannels();
- deviceUI->m_deviceSourceAPI->saveChannelSettings(preset);
- deviceUI->m_deviceSourceAPI->saveSourceSettings(preset);
- }
- else if (deviceUI->m_deviceSinkEngine) // sink device
- {
- preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
- preset->clearChannels();
- preset->setSourcePreset(false);
- deviceUI->m_deviceSinkAPI->saveChannelSettings(preset);
- deviceUI->m_deviceSinkAPI->saveSinkSettings(preset);
- }
-
- preset->setLayout(saveState());
-}
-
-void MainWindow::createStatusBar()
-{
- QString qtVersionStr = QString("Qt %1 ").arg(QT_VERSION_STR);
-#if QT_VERSION >= 0x050400
- m_showSystemWidget = new QLabel("SDRangel v3.4.1 " + qtVersionStr + QSysInfo::prettyProductName(), this);
-#else
- m_showSystemWidget = new QLabel("SDRangel v3.4.1 " + qtVersionStr, this);
-#endif
- statusBar()->addPermanentWidget(m_showSystemWidget);
-
- m_dateTimeWidget = new QLabel(tr("Date"), this);
- m_dateTimeWidget->setToolTip(tr("Current date/time"));
- statusBar()->addPermanentWidget(m_dateTimeWidget);
-}
-
-void MainWindow::closeEvent(QCloseEvent*)
-{
-}
-
-void MainWindow::updatePresetControls()
-{
- ui->presetTree->resizeColumnToContents(0);
-
- if(ui->presetTree->currentItem() != 0)
- {
- ui->presetDelete->setEnabled(true);
- ui->presetLoad->setEnabled(true);
- }
- else
- {
- ui->presetDelete->setEnabled(false);
- ui->presetLoad->setEnabled(false);
- }
-}
-
-QTreeWidgetItem* MainWindow::addPresetToTree(const Preset* preset)
-{
- QTreeWidgetItem* group = 0;
-
- for(int i = 0; i < ui->presetTree->topLevelItemCount(); i++)
- {
- if(ui->presetTree->topLevelItem(i)->text(0) == preset->getGroup())
- {
- group = ui->presetTree->topLevelItem(i);
- break;
- }
- }
-
- if(group == 0)
- {
- QStringList sl;
- sl.append(preset->getGroup());
- group = new QTreeWidgetItem(ui->presetTree, sl, PGroup);
- group->setFirstColumnSpanned(true);
- group->setExpanded(true);
- ui->presetTree->sortByColumn(0, Qt::AscendingOrder);
- }
-
- QStringList sl;
- sl.append(QString("%1").arg(preset->getCenterFrequency() / 1e6f, 0, 'f', 3)); // frequency column
- sl.append(QString("%1").arg(preset->isSourcePreset() ? 'R' : 'T')); // mode column
- sl.append(preset->getDescription()); // description column
- PresetItem* item = new PresetItem(group, sl, preset->getCenterFrequency(), PItem);
- item->setTextAlignment(0, Qt::AlignRight);
- item->setData(0, Qt::UserRole, qVariantFromValue(preset));
- ui->presetTree->resizeColumnToContents(0); // Resize frequency column to minimum
- ui->presetTree->resizeColumnToContents(1); // Resize mode column to minimum
-
- updatePresetControls();
- return item;
-}
-
-void MainWindow::applySettings()
-{
-}
-
-void MainWindow::handleMessages()
-{
- Message* message;
-
- while ((message = m_inputMessageQueue.pop()) != 0)
- {
- qDebug("MainWindow::handleMessages: message: %s", message->getIdentifier());
- delete message;
- }
-}
-
-void MainWindow::on_action_View_Fullscreen_toggled(bool checked)
-{
- if(checked)
- showFullScreen();
- else showNormal();
-}
-
-void MainWindow::on_presetSave_clicked()
-{
- QStringList groups;
- QString group;
- QString description = "";
- for(int i = 0; i < ui->presetTree->topLevelItemCount(); i++)
- groups.append(ui->presetTree->topLevelItem(i)->text(0));
-
- QTreeWidgetItem* item = ui->presetTree->currentItem();
- if(item != 0) {
- if(item->type() == PGroup)
- group = item->text(0);
- else if(item->type() == PItem) {
- group = item->parent()->text(0);
- description = item->text(0);
- }
- }
-
- AddPresetDialog dlg(groups, group, this);
-
- if (description.length() > 0) {
- dlg.setDescription(description);
- }
-
- if(dlg.exec() == QDialog::Accepted) {
- Preset* preset = m_settings.newPreset(dlg.group(), dlg.description());
- savePresetSettings(preset, ui->tabInputsView->currentIndex());
-
- ui->presetTree->setCurrentItem(addPresetToTree(preset));
- }
-}
-
-void MainWindow::on_presetUpdate_clicked()
-{
- QTreeWidgetItem* item = ui->presetTree->currentItem();
-
- if(item != 0) {
- if(item->type() == PItem) {
- const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
- if (preset != 0) {
- Preset* preset_mod = const_cast(preset);
- savePresetSettings(preset_mod, ui->tabInputsView->currentIndex());
- }
- }
- }
-}
-
-void MainWindow::on_presetExport_clicked()
-{
- QTreeWidgetItem* item = ui->presetTree->currentItem();
-
- if(item != 0) {
- if(item->type() == PItem)
- {
- const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
- QString base64Str = preset->serialize().toBase64();
- QString fileName = QFileDialog::getSaveFileName(this,
- tr("Open preset export file"), ".", tr("Preset export files (*.prex)"));
-
- if (fileName != "")
- {
- QFileInfo fileInfo(fileName);
-
- if (fileInfo.suffix() != "prex") {
- fileName += ".prex";
- }
-
- QFile exportFile(fileName);
-
- if (exportFile.open(QIODevice::WriteOnly | QIODevice::Text))
- {
- QTextStream outstream(&exportFile);
- outstream << base64Str;
- exportFile.close();
- }
- else
- {
- QMessageBox::information(this, tr("Message"), tr("Cannot open file for writing"));
- }
- }
- }
- }
-}
-
-void MainWindow::on_presetImport_clicked()
-{
- QTreeWidgetItem* item = ui->presetTree->currentItem();
-
- if(item != 0)
- {
- QString group;
-
- if (item->type() == PGroup) {
- group = item->text(0);
- } else if (item->type() == PItem) {
- group = item->parent()->text(0);
- } else {
- return;
- }
-
- QString fileName = QFileDialog::getOpenFileName(this,
- tr("Open preset export file"), ".", tr("Preset export files (*.prex)"));
-
- if (fileName != "")
- {
- QFile exportFile(fileName);
-
- if (exportFile.open(QIODevice::ReadOnly | QIODevice::Text))
- {
- QByteArray base64Str;
- QTextStream instream(&exportFile);
- instream >> base64Str;
- exportFile.close();
-
- Preset* preset = m_settings.newPreset("", "");
- preset->deserialize(QByteArray::fromBase64(base64Str));
- preset->setGroup(group); // override with current group
-
- ui->presetTree->setCurrentItem(addPresetToTree(preset));
- }
- else
- {
- QMessageBox::information(this, tr("Message"), tr("Cannot open file for reading"));
- }
- }
- }
-}
-
-void MainWindow::on_settingsSave_clicked()
-{
- savePresetSettings(m_settings.getWorkingPreset(), ui->tabInputsView->currentIndex());
- m_settings.save();
-}
-
-void MainWindow::on_presetLoad_clicked()
-{
- qDebug() << "MainWindow::on_presetLoad_clicked";
-
- QTreeWidgetItem* item = ui->presetTree->currentItem();
-
- if(item == 0)
- {
- qDebug("MainWindow::on_presetLoad_clicked: item null");
- updatePresetControls();
- return;
- }
-
- const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
-
- if(preset == 0)
- {
- qDebug("MainWindow::on_presetLoad_clicked: preset null");
- return;
- }
-
- loadPresetSettings(preset, ui->tabInputsView->currentIndex());
- applySettings();
-}
-
-void MainWindow::on_presetDelete_clicked()
-{
- QTreeWidgetItem* item = ui->presetTree->currentItem();
- if(item == 0) {
- updatePresetControls();
- return;
- }
- const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
- if(preset == 0)
- return;
-
- if(QMessageBox::question(this, tr("Delete Preset"), tr("Do you want to delete preset '%1'?").arg(preset->getDescription()), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
- delete item;
- m_settings.deletePreset(preset);
- }
-}
-
-void MainWindow::on_presetTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
-{
- updatePresetControls();
-}
-
-void MainWindow::on_presetTree_itemActivated(QTreeWidgetItem *item, int column)
-{
- on_presetLoad_clicked();
-}
-
-void MainWindow::on_action_Loaded_Plugins_triggered()
-{
- PluginsDialog pluginsDialog(m_pluginManager, this);
- pluginsDialog.exec();
-}
-
-void MainWindow::on_action_Audio_triggered()
-{
- AudioDialog audioDialog(&m_audioDeviceInfo, this);
- audioDialog.exec();
- m_dspEngine->setAudioInputVolume(m_audioDeviceInfo.getInputVolume());
- m_dspEngine->setAudioInputDeviceIndex(m_audioDeviceInfo.getInputDeviceIndex());
- m_dspEngine->setAudioOutputDeviceIndex(m_audioDeviceInfo.getOutputDeviceIndex());
-}
-
-void MainWindow::on_action_My_Position_triggered()
-{
- MyPositionDialog myPositionDialog(m_settings, this);
- myPositionDialog.exec();
-}
-
-void MainWindow::on_action_DV_Serial_triggered(bool checked)
-{
- m_dspEngine->setDVSerialSupport(checked);
-
- if (checked)
- {
- std::vector deviceNames;
- m_dspEngine->getDVSerialNames(deviceNames);
-
- if (deviceNames.size() == 0)
- {
- QMessageBox::information(this, tr("Message"), tr("No DV serial devices found"));
- }
- else
- {
- std::vector::iterator it = deviceNames.begin();
- std::string deviceNamesStr = "DV Serial devices found: ";
-
- while (it != deviceNames.end())
- {
- if (it != deviceNames.begin()) {
- deviceNamesStr += ",";
- }
-
- deviceNamesStr += *it;
- ++it;
- }
-
- QMessageBox::information(this, tr("Message"), tr(deviceNamesStr.c_str()));
- }
- }
-}
-
-void MainWindow::on_sampleSource_confirmClicked(bool checked)
-{
- // Do it in the currently selected source tab
- int currentSourceTabIndex = ui->tabInputsSelect->currentIndex();
-
- if (currentSourceTabIndex >= 0)
- {
- 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();
-
- deviceUI->m_deviceSourceAPI->setSampleSourcePluginGUI(0); // deletes old GUI and input object
- deviceUI->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists
-
- m_pluginManager->selectSampleSourceByDevice(devicePtr, deviceUI->m_deviceSourceAPI); // sets the new API
-
- // add to buddies list
- std::vector::iterator it = m_deviceUIs.begin();
- for (; it != m_deviceUIs.end(); ++it)
- {
- if (*it != deviceUI) // do not add to itself
- {
- if ((*it)->m_deviceSourceEngine) // it is a source device
- {
- if ((deviceUI->m_deviceSourceAPI->getHardwareId() == (*it)->m_deviceSourceAPI->getHardwareId()) &&
- (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial()))
- {
- (*it)->m_deviceSourceAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI);
- }
- }
-
- if ((*it)->m_deviceSinkEngine) // it is a sink device
- {
- if ((deviceUI->m_deviceSourceAPI->getHardwareId() == (*it)->m_deviceSinkAPI->getHardwareId()) &&
- (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial()))
- {
- (*it)->m_deviceSinkAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI);
- }
- }
- }
- }
-
- // constructs new GUI and input object
- QWidget *gui;
- PluginManager::SamplingDevice *sampleSourceDevice = (PluginManager::SamplingDevice *) devicePtr;
- PluginGUI *pluginGUI = sampleSourceDevice->m_plugin->createSampleSourcePluginGUI(sampleSourceDevice->m_deviceId, &gui, deviceUI->m_deviceSourceAPI);
-
- deviceUI->m_deviceSourceAPI->setSampleSourcePluginGUI(pluginGUI);
- deviceUI->m_deviceSourceAPI->setInputGUI(gui, sampleSourceDevice->m_displayName);
-
- deviceUI->m_deviceSourceAPI->loadSourceSettings(m_settings.getWorkingPreset()); // load new API settings
-
- if (currentSourceTabIndex == 0)
- {
- m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex());
- }
- }
-}
-
-void MainWindow::on_sampleSink_confirmClicked(bool checked)
-{
- // Do it in the currently selected source tab
- int currentSinkTabIndex = ui->tabInputsSelect->currentIndex();
-
- if (currentSinkTabIndex >= 0)
- {
- 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();
-
- deviceUI->m_deviceSinkAPI->setSampleSinkPluginGUI(0); // deletes old GUI and input object
- deviceUI->m_deviceSinkAPI->clearBuddiesLists(); // remove old API from buddies lists
-
- m_pluginManager->selectSampleSinkByDevice(devicePtr, deviceUI->m_deviceSinkAPI); // sets the new API
-
- // add to buddies list
- std::vector::iterator it = m_deviceUIs.begin();
- for (; it != m_deviceUIs.end(); ++it)
- {
- if (*it != deviceUI) // do not add to itself
- {
- if ((*it)->m_deviceSourceEngine) // it is a source device
- {
- if ((deviceUI->m_deviceSinkAPI->getHardwareId() == (*it)->m_deviceSourceAPI->getHardwareId()) &&
- (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial()))
- {
- (*it)->m_deviceSourceAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI);
- }
- }
-
- if ((*it)->m_deviceSinkEngine) // it is a sink device
- {
- if ((deviceUI->m_deviceSinkAPI->getHardwareId() == (*it)->m_deviceSinkAPI->getHardwareId()) &&
- (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial()))
- {
- (*it)->m_deviceSinkAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI);
- }
- }
- }
- }
-
- // constructs new GUI and output object
- QWidget *gui;
- PluginManager::SamplingDevice *sampleSinkDevice = (PluginManager::SamplingDevice *) devicePtr;
- PluginGUI *pluginGUI = sampleSinkDevice->m_plugin->createSampleSinkPluginGUI(sampleSinkDevice->m_deviceId, &gui, deviceUI->m_deviceSinkAPI);
-
- deviceUI->m_deviceSinkAPI->setSampleSinkPluginGUI(pluginGUI);
- deviceUI->m_deviceSinkAPI->setOutputGUI(gui, sampleSinkDevice->m_displayName);
-
- deviceUI->m_deviceSinkAPI->loadSinkSettings(m_settings.getWorkingPreset()); // load new API settings
- }
-}
-
-void MainWindow::on_channel_addClicked(bool checked)
-{
- // Do it in the currently selected source tab
- int currentSourceTabIndex = ui->tabInputsSelect->currentIndex();
-
- if (currentSourceTabIndex >= 0)
- {
- DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex];
-
- if (deviceUI->m_deviceSourceEngine) // source device => Rx channels
- {
- m_pluginManager->createRxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI->m_deviceSourceAPI);
- }
- else if (deviceUI->m_deviceSinkEngine) // sink device => Tx channels
- {
- uint32_t nbSources = deviceUI->m_deviceSinkAPI->getNumberOfSources();
-
- if (nbSources > 0) {
- 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);
- }
- }
-
-}
-
-void MainWindow::on_action_About_triggered()
-{
- AboutDialog dlg(this);
- dlg.exec();
-}
-
-void MainWindow::on_action_addSourceDevice_triggered()
-{
- addSourceDevice();
-}
-
-void MainWindow::on_action_addSinkDevice_triggered()
-{
- addSinkDevice();
-}
-
-void MainWindow::on_action_removeLastDevice_triggered()
-{
- if (m_deviceUIs.size() > 1)
- {
- removeLastDevice();
- }
-}
-
-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);
- m_pluginManager->fillSampleSourceSelector(deviceSelectorComboBox, (*it)->m_deviceSourceEngine->getUID());
- 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);
- m_pluginManager->fillSampleSinkSelector(deviceSelectorComboBox, (*it)->m_deviceSinkEngine->getUID());
- int newIndex = m_pluginManager->getSampleSinkSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSinkAPI);
- deviceSelectorComboBox->setCurrentIndex(newIndex);
- deviceSelectorComboBox->blockSignals(sampleSinkSignalsBlocked);
- }
- }
-}
-
-void MainWindow::on_action_Exit_triggered()
-{
- savePresetSettings(m_settings.getWorkingPreset(), 0);
- m_settings.save();
-
- while (m_deviceUIs.size() > 0)
- {
- removeLastDevice();
- }
-}
-
-void MainWindow::tabInputViewIndexChanged()
-{
- int inputViewIndex = ui->tabInputsView->currentIndex();
-
- if ((inputViewIndex >= 0) && (m_masterTabIndex >= 0) && (inputViewIndex != m_masterTabIndex))
- {
- DeviceUISet *deviceUI = m_deviceUIs[inputViewIndex];
- DeviceUISet *lastdeviceUI = m_deviceUIs[m_masterTabIndex];
- lastdeviceUI->m_mainWindowState = saveState();
- restoreState(deviceUI->m_mainWindowState);
- m_masterTabIndex = inputViewIndex;
- }
-
- ui->tabSpectra->setCurrentIndex(inputViewIndex);
- ui->tabChannels->setCurrentIndex(inputViewIndex);
- ui->tabInputsSelect->setCurrentIndex(inputViewIndex);
- ui->tabSpectraGUI->setCurrentIndex(inputViewIndex);
-}
-
-void MainWindow::updateStatus()
-{
- m_dateTimeWidget->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss t"));
-}
-
-MainWindow::DeviceUISet::DeviceUISet(QTimer& timer)
-{
- m_spectrum = new GLSpectrum;
- m_spectrumVis = new SpectrumVis(m_spectrum);
- m_spectrum->connectTimer(timer);
- m_spectrumGUI = new GLSpectrumGUI;
- m_spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, m_spectrum);
- m_channelWindow = new ChannelWindow;
- m_samplingDeviceControl = new SamplingDeviceControl;
- m_deviceSourceEngine = 0;
- m_deviceSourceAPI = 0;
- m_deviceSinkEngine = 0;
- m_deviceSinkAPI = 0;
-
- // m_spectrum needs to have its font to be set since it cannot be inherited from the main window
- QFont font;
- font.setFamily(QStringLiteral("Sans Serif"));
- font.setPointSize(9);
- m_spectrum->setFont(font);
-
-}
-
-MainWindow::DeviceUISet::~DeviceUISet()
-{
- delete m_samplingDeviceControl;
- delete m_channelWindow;
- delete m_spectrumGUI;
- delete m_spectrumVis;
- delete m_spectrum;
-}
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany //
+// written by Christian Daniel //
+// //
+// 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
+#include
+#include
+
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include "device/devicesourceapi.h"
+#include "device/devicesinkapi.h"
+#include "audio/audiodeviceinfo.h"
+#include "gui/indicator.h"
+#include "gui/presetitem.h"
+#include "gui/addpresetdialog.h"
+#include "gui/pluginsdialog.h"
+#include "gui/aboutdialog.h"
+#include "gui/rollupwidget.h"
+#include "gui/channelwindow.h"
+#include "gui/audiodialog.h"
+#include "gui/samplingdevicecontrol.h"
+#include "gui/mypositiondialog.h"
+#include "dsp/dspengine.h"
+#include "dsp/spectrumvis.h"
+#include "dsp/dspcommands.h"
+#include "plugin/plugingui.h"
+#include "plugin/pluginapi.h"
+#include "plugin/plugingui.h"
+
+#include "gui/glspectrum.h"
+#include "gui/glspectrumgui.h"
+
+#include
+#include
+
+MainWindow::MainWindow(QWidget* parent) :
+ QMainWindow(parent),
+ ui(new Ui::MainWindow),
+ m_masterTabIndex(0),
+ m_settings(),
+ m_dspEngine(DSPEngine::instance()),
+ m_lastEngineState((DSPDeviceSourceEngine::State)-1),
+ m_inputGUI(0),
+ m_sampleRate(0),
+ m_centerFrequency(0),
+ m_sampleFileName(std::string("./test.sdriq"))
+{
+ qDebug() << "MainWindow::MainWindow: start";
+
+ m_settings.setAudioDeviceInfo(&m_audioDeviceInfo);
+
+ ui->setupUi(this);
+ createStatusBar();
+
+ setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
+ setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
+ setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
+ setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
+
+ // work around broken Qt dock widget ordering
+ removeDockWidget(ui->inputViewDock);
+ removeDockWidget(ui->inputSelectDock);
+ removeDockWidget(ui->spectraDisplayDock);
+ removeDockWidget(ui->presetDock);
+ removeDockWidget(ui->channelDock);
+ addDockWidget(Qt::LeftDockWidgetArea, ui->inputSelectDock);
+ addDockWidget(Qt::LeftDockWidgetArea, ui->inputViewDock);
+ addDockWidget(Qt::LeftDockWidgetArea, ui->spectraDisplayDock);
+ addDockWidget(Qt::LeftDockWidgetArea, ui->presetDock);
+ addDockWidget(Qt::RightDockWidgetArea, ui->channelDock);
+
+ ui->inputViewDock->show();
+ ui->inputSelectDock->show();
+ ui->spectraDisplayDock->show();
+ ui->presetDock->show();
+ ui->channelDock->show();
+
+ ui->menu_Window->addAction(ui->inputViewDock->toggleViewAction());
+ ui->menu_Window->addAction(ui->inputSelectDock->toggleViewAction());
+ ui->menu_Window->addAction(ui->spectraDisplayDock->toggleViewAction());
+ ui->menu_Window->addAction(ui->presetDock->toggleViewAction());
+ ui->menu_Window->addAction(ui->channelDock->toggleViewAction());
+
+ ui->tabInputsView->setStyleSheet("QWidget { background: rgb(50,50,50); } "
+ "QToolButton::checked { background: rgb(128,70,0); } "
+ "QComboBox::item:selected { color: rgb(255,140,0); } "
+ "QTabWidget::pane { border: 1px solid #C06900; } "
+ "QTabBar::tab:selected { background: rgb(128,70,0); }");
+ ui->tabInputsSelect->setStyleSheet("QWidget { background: rgb(50,50,50); } "
+ "QToolButton::checked { background: rgb(128,70,0); } "
+ "QComboBox::item:selected { color: rgb(255,140,0); } "
+ "QTabWidget::pane { border: 1px solid #808080; } "
+ "QTabBar::tab:selected { background: rgb(100,100,100); }");
+
+ m_pluginManager = new PluginManager(this);
+ m_pluginManager->loadPlugins();
+
+ connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);
+
+ connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
+ m_statusTimer.start(1000);
+
+ m_masterTimer.start(50);
+
+ qDebug() << "MainWindow::MainWindow: add the first device...";
+
+ addSourceDevice(); // add the first device
+
+ qDebug() << "MainWindow::MainWindow: load settings...";
+
+ loadSettings();
+
+ qDebug() << "MainWindow::MainWindow: select SampleSource from settings...";
+
+ int sampleSourceIndex = m_settings.getSourceIndex();
+ sampleSourceIndex = m_pluginManager->selectSampleSourceByIndex(sampleSourceIndex, m_deviceUIs.back()->m_deviceSourceAPI);
+
+ if (sampleSourceIndex < 0)
+ {
+ qCritical("MainWindow::MainWindow: no sample source. Exit");
+ exit(0);
+ }
+
+ 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);
+
+ qDebug() << "MainWindow::MainWindow: apply settings...";
+
+ applySettings();
+
+ qDebug() << "MainWindow::MainWindow: update preset controls...";
+
+ updatePresetControls();
+
+ connect(ui->tabInputsView, SIGNAL(currentChanged(int)), this, SLOT(tabInputViewIndexChanged()));
+
+ qDebug() << "MainWindow::MainWindow: end";
+}
+
+MainWindow::~MainWindow()
+{
+ delete m_pluginManager;
+ delete m_dateTimeWidget;
+ delete m_showSystemWidget;
+
+ delete ui;
+}
+
+void MainWindow::addSourceDevice()
+{
+ DSPDeviceSourceEngine *dspDeviceSourceEngine = m_dspEngine->addDeviceSourceEngine();
+ dspDeviceSourceEngine->start();
+
+ uint dspDeviceSourceEngineUID = dspDeviceSourceEngine->getUID();
+ char uidCStr[16];
+ sprintf(uidCStr, "UID:%d", dspDeviceSourceEngineUID);
+
+ m_deviceUIs.push_back(new DeviceUISet(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(this, deviceTabIndex, dspDeviceSourceEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow);
+
+ 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());
+
+ connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool)));
+
+ dspDeviceSourceEngine->addSink(m_deviceUIs.back()->m_spectrumVis);
+ ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr);
+ 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->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));
+
+ int sampleSourceIndex = m_pluginManager->selectSampleSourceBySerialOrSequence("sdrangel.samplesource.filesource", "0", 0, m_deviceUIs.back()->m_deviceSourceAPI);
+}
+
+void MainWindow::addSinkDevice()
+{
+ DSPDeviceSinkEngine *dspDeviceSinkEngine = m_dspEngine->addDeviceSinkEngine();
+ dspDeviceSinkEngine->start();
+
+ uint dspDeviceSinkEngineUID = dspDeviceSinkEngine->getUID();
+ char uidCStr[16];
+ sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID);
+
+ m_deviceUIs.push_back(new DeviceUISet(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(this, deviceTabIndex, dspDeviceSinkEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow);
+
+ 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());
+
+ connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool)));
+
+ dspDeviceSinkEngine->addSpectrumSink(m_deviceUIs.back()->m_spectrumVis);
+ ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr);
+ 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->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));
+
+ int sampleSinkIndex = m_pluginManager->selectSampleSinkBySerialOrSequence("sdrangel.samplesink.filesink", "0", 0, m_deviceUIs.back()->m_deviceSinkAPI);
+}
+
+void MainWindow::removeLastDevice()
+{
+ if (m_deviceUIs.back()->m_deviceSourceEngine) // source tab
+ {
+ DSPDeviceSourceEngine *lastDeviceEngine = m_deviceUIs.back()->m_deviceSourceEngine;
+ lastDeviceEngine->stopAcquistion();
+ lastDeviceEngine->removeSink(m_deviceUIs.back()->m_spectrumVis);
+
+ ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1);
+ ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1);
+
+ m_deviceUIs.back()->m_deviceSourceAPI->freeAll();
+ m_deviceUIs.back()->m_deviceSourceAPI->clearBuddiesLists(); // remove old API from buddies lists
+
+ ui->tabChannels->removeTab(ui->tabChannels->count() - 1);
+
+ ui->tabInputsSelect->removeTab(ui->tabInputsSelect->count() - 1);
+
+ m_deviceWidgetTabs.removeLast();m_pluginManager->loadPlugins();
+ ui->tabInputsView->clear();
+
+ for (int i = 0; i < m_deviceWidgetTabs.size(); i++)
+ {
+ qDebug("MainWindow::removeLastDevice: adding back tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str());
+ ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName);
+ ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName);
+ }
+
+ delete m_deviceUIs.back();
+
+ lastDeviceEngine->stop();
+ m_dspEngine->removeLastDeviceSourceEngine();
+ }
+ else if (m_deviceUIs.back()->m_deviceSinkEngine) // sink tab
+ {
+ DSPDeviceSinkEngine *lastDeviceEngine = m_deviceUIs.back()->m_deviceSinkEngine;
+ lastDeviceEngine->stopGeneration();
+ lastDeviceEngine->removeSpectrumSink(m_deviceUIs.back()->m_spectrumVis);
+
+ ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1);
+ ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1);
+
+ m_deviceUIs.back()->m_deviceSinkAPI->freeAll();
+ m_deviceUIs.back()->m_deviceSinkAPI->clearBuddiesLists(); // remove old API from buddies lists
+
+ ui->tabChannels->removeTab(ui->tabChannels->count() - 1);
+
+ ui->tabInputsSelect->removeTab(ui->tabInputsSelect->count() - 1);
+
+ m_deviceWidgetTabs.removeLast();
+ ui->tabInputsView->clear();
+
+ for (int i = 0; i < m_deviceWidgetTabs.size(); i++)
+ {
+ qDebug("MainWindow::removeLastDevice: adding back tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str());
+ ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName);
+ ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName);
+ }
+
+ delete m_deviceUIs.back();
+
+ lastDeviceEngine->stop();
+ m_dspEngine->removeLastDeviceSinkEngine();
+ }
+
+ m_deviceUIs.pop_back();
+}
+
+void MainWindow::addChannelRollup(int deviceTabIndex, QWidget* widget)
+{
+ if (deviceTabIndex < ui->tabInputsView->count())
+ {
+ DeviceUISet *deviceUI = m_deviceUIs[deviceTabIndex];
+ deviceUI->m_channelWindow->addRollupWidget(widget);
+ ui->channelDock->show();
+ ui->channelDock->raise();
+ }
+}
+
+void MainWindow::addViewAction(QAction* action)
+{
+ ui->menu_Window->addAction(action);
+}
+
+void MainWindow::setDeviceGUI(int deviceTabIndex, QWidget* gui, const QString& deviceDisplayName, bool sourceDevice)
+{
+ char tabNameCStr[16];
+
+ if (sourceDevice)
+ {
+ sprintf(tabNameCStr, "R%d", deviceTabIndex);
+ }
+ else
+ {
+ sprintf(tabNameCStr, "T%d", deviceTabIndex);
+ }
+
+ qDebug("MainWindow::setDeviceGUI: insert %s tab at %d", sourceDevice ? "Rx" : "Tx", deviceTabIndex);
+
+ if (deviceTabIndex < m_deviceWidgetTabs.size())
+ {
+ m_deviceWidgetTabs[deviceTabIndex] = {gui, deviceDisplayName, QString(tabNameCStr)};
+ }
+ else
+ {
+ m_deviceWidgetTabs.append({gui, deviceDisplayName, QString(tabNameCStr)});
+ }
+
+ ui->tabInputsView->clear();
+
+ for (int i = 0; i < m_deviceWidgetTabs.size(); i++)
+ {
+ qDebug("MainWindow::setDeviceGUI: adding tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str());
+ ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName);
+ ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName);
+ }
+
+ ui->tabInputsView->setCurrentIndex(deviceTabIndex);
+}
+
+void MainWindow::loadSettings()
+{
+ qDebug() << "MainWindow::loadSettings";
+
+ m_settings.load();
+ m_settings.sortPresets();
+
+ for(int i = 0; i < m_settings.getPresetCount(); ++i)
+ {
+ addPresetToTree(m_settings.getPreset(i));
+ }
+}
+
+void MainWindow::loadPresetSettings(const Preset* preset, int tabIndex)
+{
+ qDebug("MainWindow::loadPresetSettings: preset [%s | %s]",
+ qPrintable(preset->getGroup()),
+ qPrintable(preset->getDescription()));
+
+ if (tabIndex >= 0)
+ {
+ DeviceUISet *deviceUI = m_deviceUIs[tabIndex];
+
+ if (deviceUI->m_deviceSourceEngine) // source device
+ {
+ deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig());
+ deviceUI->m_deviceSourceAPI->loadSourceSettings(preset);
+ deviceUI->m_deviceSourceAPI->loadChannelSettings(preset, &(m_pluginManager->m_pluginAPI));
+ }
+ 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->m_pluginAPI));
+ }
+ }
+
+ // has to be last step
+ restoreState(preset->getLayout());
+}
+
+void MainWindow::savePresetSettings(Preset* preset, int tabIndex)
+{
+ qDebug("MainWindow::savePresetSettings: preset [%s | %s]",
+ qPrintable(preset->getGroup()),
+ qPrintable(preset->getDescription()));
+
+ // Save from currently selected source tab
+ //int currentSourceTabIndex = ui->tabInputsView->currentIndex();
+ DeviceUISet *deviceUI = m_deviceUIs[tabIndex];
+
+ if (deviceUI->m_deviceSourceEngine) // source device
+ {
+ preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
+ preset->clearChannels();
+ deviceUI->m_deviceSourceAPI->saveChannelSettings(preset);
+ deviceUI->m_deviceSourceAPI->saveSourceSettings(preset);
+ }
+ else if (deviceUI->m_deviceSinkEngine) // sink device
+ {
+ preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
+ preset->clearChannels();
+ preset->setSourcePreset(false);
+ deviceUI->m_deviceSinkAPI->saveChannelSettings(preset);
+ deviceUI->m_deviceSinkAPI->saveSinkSettings(preset);
+ }
+
+ preset->setLayout(saveState());
+}
+
+void MainWindow::createStatusBar()
+{
+ QString qtVersionStr = QString("Qt %1 ").arg(QT_VERSION_STR);
+#if QT_VERSION >= 0x050400
+ m_showSystemWidget = new QLabel("SDRangel v3.4.1 " + qtVersionStr + QSysInfo::prettyProductName(), this);
+#else
+ m_showSystemWidget = new QLabel("SDRangel v3.4.1 " + qtVersionStr, this);
+#endif
+ statusBar()->addPermanentWidget(m_showSystemWidget);
+
+ m_dateTimeWidget = new QLabel(tr("Date"), this);
+ m_dateTimeWidget->setToolTip(tr("Current date/time"));
+ statusBar()->addPermanentWidget(m_dateTimeWidget);
+}
+
+void MainWindow::closeEvent(QCloseEvent*)
+{
+}
+
+void MainWindow::updatePresetControls()
+{
+ ui->presetTree->resizeColumnToContents(0);
+
+ if(ui->presetTree->currentItem() != 0)
+ {
+ ui->presetDelete->setEnabled(true);
+ ui->presetLoad->setEnabled(true);
+ }
+ else
+ {
+ ui->presetDelete->setEnabled(false);
+ ui->presetLoad->setEnabled(false);
+ }
+}
+
+QTreeWidgetItem* MainWindow::addPresetToTree(const Preset* preset)
+{
+ QTreeWidgetItem* group = 0;
+
+ for(int i = 0; i < ui->presetTree->topLevelItemCount(); i++)
+ {
+ if(ui->presetTree->topLevelItem(i)->text(0) == preset->getGroup())
+ {
+ group = ui->presetTree->topLevelItem(i);
+ break;
+ }
+ }
+
+ if(group == 0)
+ {
+ QStringList sl;
+ sl.append(preset->getGroup());
+ group = new QTreeWidgetItem(ui->presetTree, sl, PGroup);
+ group->setFirstColumnSpanned(true);
+ group->setExpanded(true);
+ ui->presetTree->sortByColumn(0, Qt::AscendingOrder);
+ }
+
+ QStringList sl;
+ sl.append(QString("%1").arg(preset->getCenterFrequency() / 1e6f, 0, 'f', 3)); // frequency column
+ sl.append(QString("%1").arg(preset->isSourcePreset() ? 'R' : 'T')); // mode column
+ sl.append(preset->getDescription()); // description column
+ PresetItem* item = new PresetItem(group, sl, preset->getCenterFrequency(), PItem);
+ item->setTextAlignment(0, Qt::AlignRight);
+ item->setData(0, Qt::UserRole, qVariantFromValue(preset));
+ ui->presetTree->resizeColumnToContents(0); // Resize frequency column to minimum
+ ui->presetTree->resizeColumnToContents(1); // Resize mode column to minimum
+
+ updatePresetControls();
+ return item;
+}
+
+void MainWindow::applySettings()
+{
+}
+
+void MainWindow::handleMessages()
+{
+ Message* message;
+
+ while ((message = m_inputMessageQueue.pop()) != 0)
+ {
+ qDebug("MainWindow::handleMessages: message: %s", message->getIdentifier());
+ delete message;
+ }
+}
+
+void MainWindow::on_action_View_Fullscreen_toggled(bool checked)
+{
+ if(checked)
+ showFullScreen();
+ else showNormal();
+}
+
+void MainWindow::on_presetSave_clicked()
+{
+ QStringList groups;
+ QString group;
+ QString description = "";
+ for(int i = 0; i < ui->presetTree->topLevelItemCount(); i++)
+ groups.append(ui->presetTree->topLevelItem(i)->text(0));
+
+ QTreeWidgetItem* item = ui->presetTree->currentItem();
+ if(item != 0) {
+ if(item->type() == PGroup)
+ group = item->text(0);
+ else if(item->type() == PItem) {
+ group = item->parent()->text(0);
+ description = item->text(0);
+ }
+ }
+
+ AddPresetDialog dlg(groups, group, this);
+
+ if (description.length() > 0) {
+ dlg.setDescription(description);
+ }
+
+ if(dlg.exec() == QDialog::Accepted) {
+ Preset* preset = m_settings.newPreset(dlg.group(), dlg.description());
+ savePresetSettings(preset, ui->tabInputsView->currentIndex());
+
+ ui->presetTree->setCurrentItem(addPresetToTree(preset));
+ }
+}
+
+void MainWindow::on_presetUpdate_clicked()
+{
+ QTreeWidgetItem* item = ui->presetTree->currentItem();
+
+ if(item != 0) {
+ if(item->type() == PItem) {
+ const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
+ if (preset != 0) {
+ Preset* preset_mod = const_cast(preset);
+ savePresetSettings(preset_mod, ui->tabInputsView->currentIndex());
+ }
+ }
+ }
+}
+
+void MainWindow::on_presetExport_clicked()
+{
+ QTreeWidgetItem* item = ui->presetTree->currentItem();
+
+ if(item != 0) {
+ if(item->type() == PItem)
+ {
+ const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
+ QString base64Str = preset->serialize().toBase64();
+ QString fileName = QFileDialog::getSaveFileName(this,
+ tr("Open preset export file"), ".", tr("Preset export files (*.prex)"));
+
+ if (fileName != "")
+ {
+ QFileInfo fileInfo(fileName);
+
+ if (fileInfo.suffix() != "prex") {
+ fileName += ".prex";
+ }
+
+ QFile exportFile(fileName);
+
+ if (exportFile.open(QIODevice::WriteOnly | QIODevice::Text))
+ {
+ QTextStream outstream(&exportFile);
+ outstream << base64Str;
+ exportFile.close();
+ }
+ else
+ {
+ QMessageBox::information(this, tr("Message"), tr("Cannot open file for writing"));
+ }
+ }
+ }
+ }
+}
+
+void MainWindow::on_presetImport_clicked()
+{
+ QTreeWidgetItem* item = ui->presetTree->currentItem();
+
+ if(item != 0)
+ {
+ QString group;
+
+ if (item->type() == PGroup) {
+ group = item->text(0);
+ } else if (item->type() == PItem) {
+ group = item->parent()->text(0);
+ } else {
+ return;
+ }
+
+ QString fileName = QFileDialog::getOpenFileName(this,
+ tr("Open preset export file"), ".", tr("Preset export files (*.prex)"));
+
+ if (fileName != "")
+ {
+ QFile exportFile(fileName);
+
+ if (exportFile.open(QIODevice::ReadOnly | QIODevice::Text))
+ {
+ QByteArray base64Str;
+ QTextStream instream(&exportFile);
+ instream >> base64Str;
+ exportFile.close();
+
+ Preset* preset = m_settings.newPreset("", "");
+ preset->deserialize(QByteArray::fromBase64(base64Str));
+ preset->setGroup(group); // override with current group
+
+ ui->presetTree->setCurrentItem(addPresetToTree(preset));
+ }
+ else
+ {
+ QMessageBox::information(this, tr("Message"), tr("Cannot open file for reading"));
+ }
+ }
+ }
+}
+
+void MainWindow::on_settingsSave_clicked()
+{
+ savePresetSettings(m_settings.getWorkingPreset(), ui->tabInputsView->currentIndex());
+ m_settings.save();
+}
+
+void MainWindow::on_presetLoad_clicked()
+{
+ qDebug() << "MainWindow::on_presetLoad_clicked";
+
+ QTreeWidgetItem* item = ui->presetTree->currentItem();
+
+ if(item == 0)
+ {
+ qDebug("MainWindow::on_presetLoad_clicked: item null");
+ updatePresetControls();
+ return;
+ }
+
+ const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
+
+ if(preset == 0)
+ {
+ qDebug("MainWindow::on_presetLoad_clicked: preset null");
+ return;
+ }
+
+ loadPresetSettings(preset, ui->tabInputsView->currentIndex());
+ applySettings();
+}
+
+void MainWindow::on_presetDelete_clicked()
+{
+ QTreeWidgetItem* item = ui->presetTree->currentItem();
+ if(item == 0) {
+ updatePresetControls();
+ return;
+ }
+ const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole));
+ if(preset == 0)
+ return;
+
+ if(QMessageBox::question(this, tr("Delete Preset"), tr("Do you want to delete preset '%1'?").arg(preset->getDescription()), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
+ delete item;
+ m_settings.deletePreset(preset);
+ }
+}
+
+void MainWindow::on_presetTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
+{
+ updatePresetControls();
+}
+
+void MainWindow::on_presetTree_itemActivated(QTreeWidgetItem *item, int column)
+{
+ on_presetLoad_clicked();
+}
+
+void MainWindow::on_action_Loaded_Plugins_triggered()
+{
+ PluginsDialog pluginsDialog(m_pluginManager, this);
+ pluginsDialog.exec();
+}
+
+void MainWindow::on_action_Audio_triggered()
+{
+ AudioDialog audioDialog(&m_audioDeviceInfo, this);
+ audioDialog.exec();
+ m_dspEngine->setAudioInputVolume(m_audioDeviceInfo.getInputVolume());
+ m_dspEngine->setAudioInputDeviceIndex(m_audioDeviceInfo.getInputDeviceIndex());
+ m_dspEngine->setAudioOutputDeviceIndex(m_audioDeviceInfo.getOutputDeviceIndex());
+}
+
+void MainWindow::on_action_My_Position_triggered()
+{
+ MyPositionDialog myPositionDialog(m_settings, this);
+ myPositionDialog.exec();
+}
+
+void MainWindow::on_action_DV_Serial_triggered(bool checked)
+{
+ m_dspEngine->setDVSerialSupport(checked);
+
+ if (checked)
+ {
+ std::vector deviceNames;
+ m_dspEngine->getDVSerialNames(deviceNames);
+
+ if (deviceNames.size() == 0)
+ {
+ QMessageBox::information(this, tr("Message"), tr("No DV serial devices found"));
+ }
+ else
+ {
+ std::vector::iterator it = deviceNames.begin();
+ std::string deviceNamesStr = "DV Serial devices found: ";
+
+ while (it != deviceNames.end())
+ {
+ if (it != deviceNames.begin()) {
+ deviceNamesStr += ",";
+ }
+
+ deviceNamesStr += *it;
+ ++it;
+ }
+
+ QMessageBox::information(this, tr("Message"), tr(deviceNamesStr.c_str()));
+ }
+ }
+}
+
+void MainWindow::on_sampleSource_confirmClicked(bool checked)
+{
+ // Do it in the currently selected source tab
+ int currentSourceTabIndex = ui->tabInputsSelect->currentIndex();
+
+ if (currentSourceTabIndex >= 0)
+ {
+ 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();
+
+ deviceUI->m_deviceSourceAPI->setSampleSourcePluginGUI(0); // deletes old GUI and input object
+ deviceUI->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists
+
+ m_pluginManager->selectSampleSourceByDevice(devicePtr, deviceUI->m_deviceSourceAPI); // sets the new API
+
+ // add to buddies list
+ std::vector::iterator it = m_deviceUIs.begin();
+ for (; it != m_deviceUIs.end(); ++it)
+ {
+ if (*it != deviceUI) // do not add to itself
+ {
+ if ((*it)->m_deviceSourceEngine) // it is a source device
+ {
+ if ((deviceUI->m_deviceSourceAPI->getHardwareId() == (*it)->m_deviceSourceAPI->getHardwareId()) &&
+ (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial()))
+ {
+ (*it)->m_deviceSourceAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI);
+ }
+ }
+
+ if ((*it)->m_deviceSinkEngine) // it is a sink device
+ {
+ if ((deviceUI->m_deviceSourceAPI->getHardwareId() == (*it)->m_deviceSinkAPI->getHardwareId()) &&
+ (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial()))
+ {
+ (*it)->m_deviceSinkAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI);
+ }
+ }
+ }
+ }
+
+ // constructs new GUI and input object
+ QWidget *gui;
+ PluginManager::SamplingDevice *sampleSourceDevice = (PluginManager::SamplingDevice *) devicePtr;
+ PluginGUI *pluginGUI = sampleSourceDevice->m_plugin->createSampleSourcePluginGUI(sampleSourceDevice->m_deviceId, &gui, deviceUI->m_deviceSourceAPI);
+
+ deviceUI->m_deviceSourceAPI->setSampleSourcePluginGUI(pluginGUI);
+ deviceUI->m_deviceSourceAPI->setInputGUI(gui, sampleSourceDevice->m_displayName);
+
+ deviceUI->m_deviceSourceAPI->loadSourceSettings(m_settings.getWorkingPreset()); // load new API settings
+
+ if (currentSourceTabIndex == 0)
+ {
+ m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex());
+ }
+ }
+}
+
+void MainWindow::on_sampleSink_confirmClicked(bool checked)
+{
+ // Do it in the currently selected source tab
+ int currentSinkTabIndex = ui->tabInputsSelect->currentIndex();
+
+ if (currentSinkTabIndex >= 0)
+ {
+ 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();
+
+ deviceUI->m_deviceSinkAPI->setSampleSinkPluginGUI(0); // deletes old GUI and input object
+ deviceUI->m_deviceSinkAPI->clearBuddiesLists(); // remove old API from buddies lists
+
+ m_pluginManager->selectSampleSinkByDevice(devicePtr, deviceUI->m_deviceSinkAPI); // sets the new API
+
+ // add to buddies list
+ std::vector::iterator it = m_deviceUIs.begin();
+ for (; it != m_deviceUIs.end(); ++it)
+ {
+ if (*it != deviceUI) // do not add to itself
+ {
+ if ((*it)->m_deviceSourceEngine) // it is a source device
+ {
+ if ((deviceUI->m_deviceSinkAPI->getHardwareId() == (*it)->m_deviceSourceAPI->getHardwareId()) &&
+ (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial()))
+ {
+ (*it)->m_deviceSourceAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI);
+ }
+ }
+
+ if ((*it)->m_deviceSinkEngine) // it is a sink device
+ {
+ if ((deviceUI->m_deviceSinkAPI->getHardwareId() == (*it)->m_deviceSinkAPI->getHardwareId()) &&
+ (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial()))
+ {
+ (*it)->m_deviceSinkAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI);
+ }
+ }
+ }
+ }
+
+ // constructs new GUI and output object
+ QWidget *gui;
+ PluginManager::SamplingDevice *sampleSinkDevice = (PluginManager::SamplingDevice *) devicePtr;
+ PluginGUI *pluginGUI = sampleSinkDevice->m_plugin->createSampleSinkPluginGUI(sampleSinkDevice->m_deviceId, &gui, deviceUI->m_deviceSinkAPI);
+
+ deviceUI->m_deviceSinkAPI->setSampleSinkPluginGUI(pluginGUI);
+ deviceUI->m_deviceSinkAPI->setOutputGUI(gui, sampleSinkDevice->m_displayName);
+
+ deviceUI->m_deviceSinkAPI->loadSinkSettings(m_settings.getWorkingPreset()); // load new API settings
+ }
+}
+
+void MainWindow::on_channel_addClicked(bool checked)
+{
+ // Do it in the currently selected source tab
+ int currentSourceTabIndex = ui->tabInputsSelect->currentIndex();
+
+ if (currentSourceTabIndex >= 0)
+ {
+ DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex];
+
+ if (deviceUI->m_deviceSourceEngine) // source device => Rx channels
+ {
+ m_pluginManager->createRxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI->m_deviceSourceAPI);
+ }
+ else if (deviceUI->m_deviceSinkEngine) // sink device => Tx channels
+ {
+ uint32_t nbSources = deviceUI->m_deviceSinkAPI->getNumberOfSources();
+
+ if (nbSources > 0) {
+ 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);
+ }
+ }
+
+}
+
+void MainWindow::on_action_About_triggered()
+{
+ AboutDialog dlg(this);
+ dlg.exec();
+}
+
+void MainWindow::on_action_addSourceDevice_triggered()
+{
+ addSourceDevice();
+}
+
+void MainWindow::on_action_addSinkDevice_triggered()
+{
+ addSinkDevice();
+}
+
+void MainWindow::on_action_removeLastDevice_triggered()
+{
+ if (m_deviceUIs.size() > 1)
+ {
+ removeLastDevice();
+ }
+}
+
+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);
+ m_pluginManager->fillSampleSourceSelector(deviceSelectorComboBox, (*it)->m_deviceSourceEngine->getUID());
+ 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);
+ m_pluginManager->fillSampleSinkSelector(deviceSelectorComboBox, (*it)->m_deviceSinkEngine->getUID());
+ int newIndex = m_pluginManager->getSampleSinkSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSinkAPI);
+ deviceSelectorComboBox->setCurrentIndex(newIndex);
+ deviceSelectorComboBox->blockSignals(sampleSinkSignalsBlocked);
+ }
+ }
+}
+
+void MainWindow::on_action_Exit_triggered()
+{
+ savePresetSettings(m_settings.getWorkingPreset(), 0);
+ m_settings.save();
+
+ while (m_deviceUIs.size() > 0)
+ {
+ removeLastDevice();
+ }
+}
+
+void MainWindow::tabInputViewIndexChanged()
+{
+ int inputViewIndex = ui->tabInputsView->currentIndex();
+
+ if ((inputViewIndex >= 0) && (m_masterTabIndex >= 0) && (inputViewIndex != m_masterTabIndex))
+ {
+ DeviceUISet *deviceUI = m_deviceUIs[inputViewIndex];
+ DeviceUISet *lastdeviceUI = m_deviceUIs[m_masterTabIndex];
+ lastdeviceUI->m_mainWindowState = saveState();
+ restoreState(deviceUI->m_mainWindowState);
+ m_masterTabIndex = inputViewIndex;
+ }
+
+ ui->tabSpectra->setCurrentIndex(inputViewIndex);
+ ui->tabChannels->setCurrentIndex(inputViewIndex);
+ ui->tabInputsSelect->setCurrentIndex(inputViewIndex);
+ ui->tabSpectraGUI->setCurrentIndex(inputViewIndex);
+}
+
+void MainWindow::updateStatus()
+{
+ m_dateTimeWidget->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss t"));
+}
+
+MainWindow::DeviceUISet::DeviceUISet(QTimer& timer)
+{
+ m_spectrum = new GLSpectrum;
+ m_spectrumVis = new SpectrumVis(m_spectrum);
+ m_spectrum->connectTimer(timer);
+ m_spectrumGUI = new GLSpectrumGUI;
+ m_spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, m_spectrum);
+ m_channelWindow = new ChannelWindow;
+ m_samplingDeviceControl = new SamplingDeviceControl;
+ m_deviceSourceEngine = 0;
+ m_deviceSourceAPI = 0;
+ m_deviceSinkEngine = 0;
+ m_deviceSinkAPI = 0;
+
+ // m_spectrum needs to have its font to be set since it cannot be inherited from the main window
+ QFont font;
+ font.setFamily(QStringLiteral("Sans Serif"));
+ font.setPointSize(9);
+ m_spectrum->setFont(font);
+
+}
+
+MainWindow::DeviceUISet::~DeviceUISet()
+{
+ delete m_samplingDeviceControl;
+ delete m_channelWindow;
+ delete m_spectrumGUI;
+ delete m_spectrumVis;
+ delete m_spectrum;
+}