20 #include <QInputDialog> 21 #include <QMessageBox> 25 #include <QFileDialog> 26 #include <QTextStream> 31 #include <QFontDatabase> 77 #include "ui_mainwindow.h" 81 #include <QSplashScreen> 101 m_lastEngineState(
DeviceAPI::StNotStarted),
104 m_centerFrequency(0),
105 m_sampleFileName(
std::string(
"./test.sdriq")),
108 qDebug() <<
"MainWindow::MainWindow: start";
112 QFontDatabase::addApplicationFont(
":/LiberationSans-Regular.ttf");
113 QFontDatabase::addApplicationFont(
":/LiberationMono-Regular.ttf");
115 QFont font(
"Liberation Sans");
116 font.setPointSize(9);
119 QPixmap logoPixmap(
":/sdrangel_logo.png");
131 setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
132 setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
133 setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
134 setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
137 removeDockWidget(
ui->inputViewDock);
138 removeDockWidget(
ui->inputSelectDock);
139 removeDockWidget(
ui->spectraDisplayDock);
140 removeDockWidget(
ui->presetDock);
141 removeDockWidget(
ui->commandsDock);
142 removeDockWidget(
ui->channelDock);
143 addDockWidget(Qt::LeftDockWidgetArea,
ui->inputViewDock);
144 addDockWidget(Qt::LeftDockWidgetArea,
ui->inputSelectDock);
145 addDockWidget(Qt::LeftDockWidgetArea,
ui->spectraDisplayDock);
146 addDockWidget(Qt::LeftDockWidgetArea,
ui->presetDock);
147 addDockWidget(Qt::LeftDockWidgetArea,
ui->commandsDock);
148 tabifyDockWidget(
ui->presetDock,
ui->commandsDock);
149 addDockWidget(Qt::RightDockWidgetArea,
ui->channelDock);
151 ui->inputViewDock->show();
152 ui->inputSelectDock->show();
153 ui->spectraDisplayDock->show();
154 ui->presetDock->show();
155 ui->commandsDock->show();
156 ui->channelDock->show();
158 ui->menu_Window->addAction(
ui->inputViewDock->toggleViewAction());
159 ui->menu_Window->addAction(
ui->inputSelectDock->toggleViewAction());
160 ui->menu_Window->addAction(
ui->spectraDisplayDock->toggleViewAction());
161 ui->menu_Window->addAction(
ui->presetDock->toggleViewAction());
162 ui->menu_Window->addAction(
ui->commandsDock->toggleViewAction());
163 ui->menu_Window->addAction(
ui->channelDock->toggleViewAction());
165 ui->tabInputsView->setStyleSheet(
"QWidget { background: rgb(50,50,50); } " 166 "QToolButton::checked { background: rgb(128,70,0); } " 167 "QComboBox::item:selected { color: rgb(255,140,0); } " 168 "QTabWidget::pane { border: 1px solid #C06900; } " 169 "QTabBar::tab:selected { background: rgb(128,70,0); }");
170 ui->tabInputsSelect->setStyleSheet(
"QWidget { background: rgb(50,50,50); } " 171 "QToolButton::checked { background: rgb(128,70,0); } " 172 "QComboBox::item:selected { color: rgb(255,140,0); } " 173 "QTabWidget::pane { border: 1px solid #808080; } " 174 "QTabBar::tab:selected { background: rgb(100,100,100); }");
185 qDebug() <<
"MainWindow::MainWindow: load settings...";
190 qDebug() <<
"MainWindow::MainWindow: load plugins...";
196 qDebug() <<
"MainWindow::MainWindow: select SampleSource from settings or default (file input)...";
200 m_deviceUIs.back()->m_deviceAPI->setBuddyLeader(
true);
203 qDebug() <<
"MainWindow::MainWindow: load current preset settings...";
208 qDebug() <<
"MainWindow::MainWindow: apply settings...";
213 qDebug() <<
"MainWindow::MainWindow: update preset controls...";
220 QString applicationDirPath = qApp->applicationDirPath();
223 if (QResource::registerResource(applicationDirPath +
"/sdrbase.rcc")) {
224 qDebug(
"MainWindow::MainWindow: registered resource file %s/%s", qPrintable(applicationDirPath),
"sdrbase.rcc");
226 qWarning(
"MainWindow::MainWindow: could not register resource file %s/%s", qPrintable(applicationDirPath),
"sdrbase.rcc");
246 qDebug() <<
"MainWindow::MainWindow: end";
262 qDebug() <<
"MainWindow::~MainWindow: end";
270 dspDeviceSourceEngine->
start();
272 uint dspDeviceSourceEngineUID = dspDeviceSourceEngine->
getUID();
274 sprintf(uidCStr,
"UID:%d", dspDeviceSourceEngineUID);
278 m_deviceUIs.back()->m_deviceSourceEngine = dspDeviceSourceEngine;
280 char tabNameCStr[16];
281 sprintf(tabNameCStr,
"R%d", deviceTabIndex);
287 QList<QString> channelNames;
289 QStringList channelNamesList(channelNames);
290 m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()->addItems(channelNamesList);
291 m_deviceUIs.back()->setNumberOfAvailableRxChannels(channelNamesList.size());
293 connect(
m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(
bool)),
this, SLOT(
channelAddClicked(
bool)));
296 ui->tabSpectra->addTab(
m_deviceUIs.back()->m_spectrum, tabNameCStr);
297 ui->tabSpectraGUI->addTab(
m_deviceUIs.back()->m_spectrumGUI, tabNameCStr);
298 ui->tabChannels->addTab(
m_deviceUIs.back()->m_channelWindow, tabNameCStr);
302 ui->tabInputsSelect->addTab(
m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr);
303 ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr));
306 if (deviceIndex < 0) {
315 m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceId(samplingDevice->
id);
316 m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->
serial);
322 if (userArgs.size() > 0) {
323 m_deviceUIs.back()->m_deviceAPI->setHardwareUserArguments(userArgs);
326 m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(deviceIndex);
329 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
330 m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
335 m_deviceUIs.back()->m_deviceAPI->setSampleSource(source);
338 m_deviceUIs.back()->m_deviceAPI->getSamplingDeviceId(),
342 m_deviceUIs.back()->m_deviceAPI->setSamplingDevicePluginInstanceGUI(pluginGUI);
343 m_deviceUIs.back()->m_deviceAPI->getSampleSource()->init();
350 dspDeviceSinkEngine->
start();
352 uint dspDeviceSinkEngineUID = dspDeviceSinkEngine->
getUID();
354 sprintf(uidCStr,
"UID:%d", dspDeviceSinkEngineUID);
359 m_deviceUIs.back()->m_deviceSinkEngine = dspDeviceSinkEngine;
361 char tabNameCStr[16];
362 sprintf(tabNameCStr,
"T%d", deviceTabIndex);
368 QList<QString> channelNames;
370 QStringList channelNamesList(channelNames);
371 m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()->addItems(channelNamesList);
372 m_deviceUIs.back()->setNumberOfAvailableTxChannels(channelNamesList.size());
374 connect(
m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(
bool)),
this, SLOT(
channelAddClicked(
bool)));
377 m_deviceUIs.back()->m_spectrum->setDisplayedStream(
false, 0);
378 ui->tabSpectra->addTab(
m_deviceUIs.back()->m_spectrum, tabNameCStr);
379 ui->tabSpectraGUI->addTab(
m_deviceUIs.back()->m_spectrumGUI, tabNameCStr);
380 ui->tabChannels->addTab(
m_deviceUIs.back()->m_channelWindow, tabNameCStr);
384 ui->tabInputsSelect->addTab(
m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr);
385 ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr));
394 m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceId(samplingDevice->
id);
395 m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->
serial);
401 if (userArgs.size() > 0) {
402 m_deviceUIs.back()->m_deviceAPI->setHardwareUserArguments(userArgs);
405 m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(fileSinkDeviceIndex);
408 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
409 m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
413 m_deviceUIs.back()->m_deviceAPI->setSampleSink(sink);
416 m_deviceUIs.back()->m_deviceAPI->getSamplingDeviceId(),
420 m_deviceUIs.back()->m_deviceAPI->setSamplingDevicePluginInstanceGUI(pluginUI);
421 m_deviceUIs.back()->m_deviceAPI->getSampleSink()->init();
428 dspDeviceMIMOEngine->
start();
430 uint dspDeviceMIMOEngineUID = dspDeviceMIMOEngine->
getUID();
432 sprintf(uidCStr,
"UID:%d", dspDeviceMIMOEngineUID);
436 m_deviceUIs.back()->m_deviceSourceEngine =
nullptr;
438 m_deviceUIs.back()->m_deviceMIMOEngine = dspDeviceMIMOEngine;
440 char tabNameCStr[16];
441 sprintf(tabNameCStr,
"M%d", deviceTabIndex);
447 QComboBox *channelSelector =
m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector();
449 QList<QString> rxChannelNames;
451 QStringList rxChannelNamesList(rxChannelNames);
452 channelSelector->addItems(rxChannelNamesList);
453 m_deviceUIs.back()->setNumberOfAvailableRxChannels(rxChannelNamesList.size());
455 QList<QString> txChannelNames;
457 QStringList txChannelNamesList(txChannelNames);
458 channelSelector->addItems(txChannelNamesList);
459 m_deviceUIs.back()->setNumberOfAvailableTxChannels(txChannelNamesList.size());
462 connect(
m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(
bool)),
this, SLOT(
channelAddClicked(
bool)));
465 ui->tabSpectra->addTab(
m_deviceUIs.back()->m_spectrum, tabNameCStr);
466 ui->tabSpectraGUI->addTab(
m_deviceUIs.back()->m_spectrumGUI, tabNameCStr);
467 ui->tabChannels->addTab(
m_deviceUIs.back()->m_channelWindow, tabNameCStr);
471 ui->tabInputsSelect->addTab(
m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr);
472 ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr));
481 m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceId(samplingDevice->
id);
482 m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->
serial);
488 if (userArgs.size() > 0) {
489 m_deviceUIs.back()->m_deviceAPI->setHardwareUserArguments(userArgs);
492 m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(testMIMODeviceIndex);
495 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
496 m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
500 m_deviceUIs.back()->m_deviceAPI->setSampleMIMO(mimo);
503 m_deviceUIs.back()->m_deviceAPI->getSamplingDeviceId(),
507 m_deviceUIs.back()->m_deviceAPI->setSamplingDevicePluginInstanceGUI(pluginUI);
508 m_deviceUIs.back()->m_deviceAPI->getSampleMIMO()->init();
520 ui->tabSpectraGUI->removeTab(
ui->tabSpectraGUI->count() - 1);
521 ui->tabSpectra->removeTab(
ui->tabSpectra->count() - 1);
525 m_deviceUIs.back()->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(0);
526 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
527 m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
528 m_deviceUIs.back()->m_deviceAPI->resetSamplingDeviceId();
529 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput(
530 m_deviceUIs.back()->m_deviceAPI->getSampleSource());
531 m_deviceUIs.back()->m_deviceAPI->clearBuddiesLists();
532 m_deviceUIs.back()->m_samplingDeviceControl->removeSelectedDeviceIndex();
534 ui->tabChannels->removeTab(
ui->tabChannels->count() - 1);
536 ui->tabInputsSelect->removeTab(
ui->tabInputsSelect->count() - 1);
539 ui->tabInputsView->clear();
543 qDebug(
"MainWindow::removeLastDevice: adding back tab for %s",
m_deviceWidgetTabs[
i].displayName.toStdString().c_str());
551 lastDeviceEngine->
stop();
562 ui->tabSpectraGUI->removeTab(
ui->tabSpectraGUI->count() - 1);
563 ui->tabSpectra->removeTab(
ui->tabSpectra->count() - 1);
567 m_deviceUIs.back()->m_deviceAPI->getSampleSink()->setMessageQueueToGUI(0);
568 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
569 m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
570 m_deviceUIs.back()->m_deviceAPI->resetSamplingDeviceId();
571 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput(
573 m_deviceUIs.back()->m_deviceAPI->clearBuddiesLists();
574 m_deviceUIs.back()->m_samplingDeviceControl->removeSelectedDeviceIndex();
576 ui->tabChannels->removeTab(
ui->tabChannels->count() - 1);
578 ui->tabInputsSelect->removeTab(
ui->tabInputsSelect->count() - 1);
581 ui->tabInputsView->clear();
585 qDebug(
"MainWindow::removeLastDevice: adding back tab for %s",
m_deviceWidgetTabs[
i].displayName.toStdString().c_str());
593 lastDeviceEngine->
stop();
604 ui->tabSpectraGUI->removeTab(
ui->tabSpectraGUI->count() - 1);
605 ui->tabSpectra->removeTab(
ui->tabSpectra->count() - 1);
610 m_deviceUIs.back()->m_deviceAPI->getSampleMIMO()->setMessageQueueToGUI(
nullptr);
611 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleMIMOPluginInstanceGUI(
612 m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
613 m_deviceUIs.back()->m_deviceAPI->resetSamplingDeviceId();
614 m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleMIMOPluginInstanceMIMO(
616 m_deviceUIs.back()->m_samplingDeviceControl->removeSelectedDeviceIndex();
618 ui->tabChannels->removeTab(
ui->tabChannels->count() - 1);
619 ui->tabInputsSelect->removeTab(
ui->tabInputsSelect->count() - 1);
622 ui->tabInputsView->clear();
626 qDebug(
"MainWindow::removeLastDevice: adding back tab for %s",
m_deviceWidgetTabs[
i].displayName.toStdString().c_str());
634 lastDeviceEngine->
stop();
645 if ((deviceSetIndex >= 0) && (deviceSetIndex < (
int)
m_deviceUIs.size()))
662 if (deviceTabIndex < ui->tabInputsView->count())
666 ui->channelDock->show();
667 ui->channelDock->raise();
673 ui->menu_Window->addAction(action);
678 char tabNameCStr[16];
680 if (deviceType == 0) {
681 sprintf(tabNameCStr,
"R%d", deviceTabIndex);
682 }
else if (deviceType == 1) {
683 sprintf(tabNameCStr,
"T%d", deviceTabIndex);
684 }
else if (deviceType == 2) {
685 sprintf(tabNameCStr,
"M%d", deviceTabIndex);
688 qDebug(
"MainWindow::setDeviceGUI: insert device type %d tab at %d", deviceType, deviceTabIndex);
696 ui->tabInputsView->clear();
700 qDebug(
"MainWindow::setDeviceGUI: adding tab for %s",
m_deviceWidgetTabs[
i].displayName.toStdString().c_str());
705 ui->tabInputsView->setCurrentIndex(deviceTabIndex);
710 qDebug() <<
"MainWindow::loadSettings";
715 QTreeWidgetItem *treeItem;
721 if (
i == middleIndex) {
722 ui->presetTree->setCurrentItem(treeItem);
738 qDebug(
"MainWindow::loadPresetSettings: preset [%s | %s]",
762 tabifyDockWidget(
ui->presetDock,
ui->commandsDock);
763 ui->presetDock->raise();
768 qDebug(
"MainWindow::savePresetSettings: preset [%s | %s]",
801 QString qtVersionStr = QString(
"Qt %1 ").arg(QT_VERSION_STR);
802 #if QT_VERSION >= 0x050400 803 m_showSystemWidget =
new QLabel(
"SDRangel " + qApp->applicationVersion() +
" " + qtVersionStr
804 + QSysInfo::currentCpuArchitecture() +
" " + QSysInfo::prettyProductName(),
this);
806 m_showSystemWidget =
new QLabel(
"SDRangel " + qApp->applicationVersion() +
" " + qtVersionStr,
this);
808 statusBar()->addPermanentWidget(m_showSystemWidget);
817 qDebug(
"MainWindow::closeEvent");
827 closeEvent->accept();
832 ui->presetTree->resizeColumnToContents(0);
834 if(
ui->presetTree->currentItem() != 0)
836 ui->presetDelete->setEnabled(
true);
837 ui->presetLoad->setEnabled(
true);
841 ui->presetDelete->setEnabled(
false);
842 ui->presetLoad->setEnabled(
false);
848 QTreeWidgetItem* group = 0;
850 for(
int i = 0;
i <
ui->presetTree->topLevelItemCount();
i++)
852 if(
ui->presetTree->topLevelItem(
i)->text(0) == preset->
getGroup())
854 group =
ui->presetTree->topLevelItem(
i);
863 group =
new QTreeWidgetItem(
ui->presetTree, sl,
PGroup);
864 group->setFirstColumnSpanned(
true);
865 group->setExpanded(
true);
866 ui->presetTree->sortByColumn(0, Qt::AscendingOrder);
874 item->setTextAlignment(0, Qt::AlignRight);
875 item->setData(0, Qt::UserRole, qVariantFromValue(preset));
876 ui->presetTree->resizeColumnToContents(0);
877 ui->presetTree->resizeColumnToContents(1);
885 QTreeWidgetItem* group = 0;
887 for(
int i = 0;
i <
ui->commandTree->topLevelItemCount();
i++)
889 if(
ui->commandTree->topLevelItem(
i)->text(0) == command->
getGroup())
891 group =
ui->commandTree->topLevelItem(
i);
900 group =
new QTreeWidgetItem(
ui->commandTree, sl,
PGroup);
901 group->setFirstColumnSpanned(
true);
902 group->setExpanded(
true);
903 ui->commandTree->sortByColumn(0, Qt::AscendingOrder);
911 item->setData(0, Qt::UserRole, qVariantFromValue(command));
912 item->setTextAlignment(0, Qt::AlignLeft);
913 ui->commandTree->resizeColumnToContents(0);
914 ui->commandTree->resizeColumnToContents(1);
915 ui->commandTree->resizeColumnToContents(2);
948 for (
int ig = 0; ig <
ui->presetTree->topLevelItemCount(); ig++)
950 QTreeWidgetItem *groupItem =
ui->presetTree->topLevelItem(ig);
951 if (groupItem->text(0) == presetToDelete->
getGroup())
953 for (
int ip = 0; ip < groupItem->childCount(); ip++)
955 QTreeWidgetItem *presetItem = groupItem->child(ip);
956 const Preset* preset = qvariant_cast<
const Preset*>(presetItem->data(0, Qt::UserRole));
963 groupItem->takeChild(ip);
978 if (direction == 1) {
980 }
else if (direction == 0) {
982 }
else if (direction == 2) {
1033 if ((index >= 0) && (index < (
int)
m_deviceUIs.size())) {
1034 ui->tabInputsView->setCurrentIndex(index);
1047 qDebug(
"MainWindow::handleMessages: message: %s", message->
getIdentifier());
1066 QString description =
"";
1068 for(
int i = 0;
i <
ui->commandTree->topLevelItemCount();
i++) {
1069 groups.append(
ui->commandTree->topLevelItem(
i)->text(0));
1072 QTreeWidgetItem* item =
ui->commandTree->currentItem();
1076 if(item->type() ==
PGroup) {
1077 group = item->text(0);
1078 }
else if(item->type() ==
PItem) {
1079 group = item->parent()->text(0);
1080 description = item->text(0);
1090 if (editCommandDialog.exec() == QDialog::Accepted)
1101 QTreeWidgetItem* item =
ui->commandTree->currentItem();
1102 const Command* command = qvariant_cast<
const Command*>(item->data(0, Qt::UserRole));
1111 QTreeWidgetItem* item =
ui->commandTree->currentItem();
1112 bool change =
false;
1113 const Command *changedCommand = 0;
1114 QString newGroupName;
1118 for(
int i = 0;
i <
ui->commandTree->topLevelItemCount();
i++) {
1119 groups.append(
ui->commandTree->topLevelItem(
i)->text(0));
1124 if (item->type() ==
PItem)
1126 const Command* command = qvariant_cast<
const Command*>(item->data(0, Qt::UserRole));
1133 if (editCommandDialog.exec() == QDialog::Accepted)
1136 editCommandDialog.toCommand(*command_mod);
1138 changedCommand = command;
1142 else if (item->type() ==
PGroup)
1146 dlg.setDialogTitle(
"Edit command group");
1147 dlg.setDescriptionBoxTitle(
"Command details");
1149 if (dlg.exec() == QDialog::Accepted)
1152 newGroupName = dlg.group();
1161 ui->commandTree->clear();
1166 const Command* command_x = qvariant_cast<
const Command*>(item_x->data(0, Qt::UserRole));
1167 if (changedCommand && (command_x == changedCommand)) {
1168 ui->commandTree->setCurrentItem(item_x);
1172 if (!changedCommand)
1174 for(
int i = 0;
i <
ui->commandTree->topLevelItemCount();
i++)
1176 QTreeWidgetItem* item =
ui->commandTree->topLevelItem(
i);
1178 if (item->text(0) == newGroupName) {
1179 ui->commandTree->setCurrentItem(item);
1188 QTreeWidgetItem* item =
ui->commandTree->currentItem();
1192 if (item->type() ==
PItem)
1194 const Command* command = qvariant_cast<
const Command*>(item->data(0, Qt::UserRole));
1198 if (QMessageBox::question(
this,
1199 tr(
"Delete command"),
1200 tr(
"Do you want to delete command '%1'?")
1201 .
arg(command->
getDescription()), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes)
1208 else if (item->type() ==
PGroup)
1210 if (QMessageBox::question(
this,
1211 tr(
"Delete command group"),
1212 tr(
"Do you want to delete command group '%1'?")
1213 .
arg(item->text(0)), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes)
1217 ui->commandTree->clear();
1229 QTreeWidgetItem* item =
ui->commandTree->currentItem();
1233 int currentDeviceSetIndex =
ui->tabInputsSelect->currentIndex();
1235 if (item->type() ==
PItem)
1237 const Command* command = qvariant_cast<
const Command*>(item->data(0, Qt::UserRole));
1241 else if (item->type() ==
PGroup)
1243 QString group = item->text(0);
1249 if (command_mod->
getGroup() == group) {
1259 QTreeWidgetItem* item =
ui->commandTree->currentItem();
1261 if ((item != 0) && (item->type() ==
PItem))
1263 const Command* command = qvariant_cast<
const Command*>(item->data(0, Qt::UserRole));
1266 commandOutputDialog.exec();
1291 qDebug(
"on_commandKeyboardConnect_toggled: %s", checked ?
"true" :
"false");
1307 QString description =
"";
1309 for(
int i = 0;
i <
ui->presetTree->topLevelItemCount();
i++) {
1310 groups.append(
ui->presetTree->topLevelItem(
i)->text(0));
1313 QTreeWidgetItem* item =
ui->presetTree->currentItem();
1317 if(item->type() ==
PGroup) {
1318 group = item->text(0);
1319 }
else if(item->type() ==
PItem) {
1320 group = item->parent()->text(0);
1321 description = item->text(0);
1327 if (description.length() > 0) {
1331 if(dlg.exec() == QDialog::Accepted) {
1343 QTreeWidgetItem* item =
ui->presetTree->currentItem();
1344 const Preset* changedPreset = 0;
1348 if(item->type() ==
PItem)
1350 const Preset* preset = qvariant_cast<
const Preset*>(item->data(0, Qt::UserRole));
1356 changedPreset = preset;
1362 ui->presetTree->clear();
1367 const Preset* preset_x = qvariant_cast<
const Preset*>(item_x->data(0, Qt::UserRole));
1368 if (changedPreset && (preset_x == changedPreset)) {
1369 ui->presetTree->setCurrentItem(item_x);
1376 QTreeWidgetItem* item =
ui->presetTree->currentItem();
1378 bool change =
false;
1379 const Preset *changedPreset = 0;
1380 QString newGroupName;
1382 for(
int i = 0;
i <
ui->presetTree->topLevelItemCount();
i++) {
1383 groups.append(
ui->presetTree->topLevelItem(
i)->text(0));
1388 if (item->type() ==
PItem)
1390 const Preset* preset = qvariant_cast<
const Preset*>(item->data(0, Qt::UserRole));
1394 if (dlg.exec() == QDialog::Accepted)
1400 changedPreset = preset;
1403 else if (item->type() ==
PGroup)
1407 dlg.setDialogTitle(
"Edit preset group");
1409 if (dlg.exec() == QDialog::Accepted)
1412 newGroupName = dlg.group();
1421 ui->presetTree->clear();
1426 const Preset* preset_x = qvariant_cast<
const Preset*>(item_x->data(0, Qt::UserRole));
1427 if (changedPreset && (preset_x == changedPreset)) {
1428 ui->presetTree->setCurrentItem(item_x);
1434 for(
int i = 0;
i <
ui->presetTree->topLevelItemCount();
i++)
1436 QTreeWidgetItem* item =
ui->presetTree->topLevelItem(
i);
1438 if (item->text(0) == newGroupName) {
1439 ui->presetTree->setCurrentItem(item);
1448 QTreeWidgetItem* item =
ui->presetTree->currentItem();
1451 if(item->type() ==
PItem)
1453 const Preset* preset = qvariant_cast<
const Preset*>(item->data(0, Qt::UserRole));
1454 QString base64Str = preset->
serialize().toBase64();
1455 QString fileName = QFileDialog::getSaveFileName(
this,
1456 tr(
"Open preset export file"),
".", tr(
"Preset export files (*.prex)"), 0, QFileDialog::DontUseNativeDialog);
1460 QFileInfo fileInfo(fileName);
1462 if (fileInfo.suffix() !=
"prex") {
1463 fileName +=
".prex";
1466 QFile exportFile(fileName);
1468 if (exportFile.open(QIODevice::WriteOnly | QIODevice::Text))
1470 QTextStream outstream(&exportFile);
1471 outstream << base64Str;
1476 QMessageBox::information(
this, tr(
"Message"), tr(
"Cannot open file for writing"));
1485 QTreeWidgetItem* item =
ui->presetTree->currentItem();
1491 if (item->type() ==
PGroup) {
1492 group = item->text(0);
1493 }
else if (item->type() ==
PItem) {
1494 group = item->parent()->text(0);
1499 QString fileName = QFileDialog::getOpenFileName(
this,
1500 tr(
"Open preset export file"),
".", tr(
"Preset export files (*.prex)"), 0, QFileDialog::DontUseNativeDialog);
1504 QFile exportFile(fileName);
1506 if (exportFile.open(QIODevice::ReadOnly | QIODevice::Text))
1508 QByteArray base64Str;
1509 QTextStream instream(&exportFile);
1510 instream >> base64Str;
1514 preset->
deserialize(QByteArray::fromBase64(base64Str));
1521 QMessageBox::information(
this, tr(
"Message"), tr(
"Cannot open file for reading"));
1535 qDebug() <<
"MainWindow::on_presetLoad_clicked";
1537 QTreeWidgetItem* item =
ui->presetTree->currentItem();
1541 qDebug(
"MainWindow::on_presetLoad_clicked: item null");
1546 const Preset* preset = qvariant_cast<
const Preset*>(item->data(0, Qt::UserRole));
1550 qDebug(
"MainWindow::on_presetLoad_clicked: preset null");
1560 QTreeWidgetItem* item =
ui->presetTree->currentItem();
1569 if (item->type() ==
PItem)
1571 const Preset* preset = qvariant_cast<
const Preset*>(item->data(0, Qt::UserRole));
1575 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) {
1581 else if (item->type() ==
PGroup)
1583 if (QMessageBox::question(
this,
1584 tr(
"Delete preset group"),
1585 tr(
"Do you want to delete preset group '%1'?")
1586 .
arg(item->text(0)), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes)
1590 ui->presetTree->clear();
1617 pluginsDialog.exec();
1629 loggingDialog.exec();
1636 myPositionDialog.exec();
1641 qDebug(
"MainWindow::on_action_DeviceUserArguments_triggered");
1643 deviceUserArgsDialog.exec();
1648 qDebug(
"MainWindow::on_action_AMBE_triggered");
1650 ambeDevicesDialog.exec();
1656 int currentSourceTabIndex =
ui->tabInputsSelect->currentIndex();
1658 if (currentSourceTabIndex >= 0)
1660 qDebug(
"MainWindow::sampleSourceChanged: tab at %d", currentSourceTabIndex);
1687 if (userArgs.size() > 0) {
1692 std::vector<DeviceUISet*>::iterator it =
m_deviceUIs.begin();
1693 int nbOfBuddies = 0;
1697 if (*it != deviceUI)
1699 if ((*it)->m_deviceSourceEngine)
1704 (*it)->m_deviceAPI->addSourceBuddy(deviceUI->
m_deviceAPI);
1709 if ((*it)->m_deviceSinkEngine)
1714 (*it)->m_deviceAPI->addSourceBuddy(deviceUI->
m_deviceAPI);
1721 if (nbOfBuddies == 0) {
1741 if (currentSourceTabIndex == 0)
1752 int currentSinkTabIndex =
ui->tabInputsSelect->currentIndex();
1754 if (currentSinkTabIndex >= 0)
1756 qDebug(
"MainWindow::sampleSinkChanged: tab at %d", currentSinkTabIndex);
1782 if (userArgs.size() > 0) {
1787 std::vector<DeviceUISet*>::iterator it =
m_deviceUIs.begin();
1788 int nbOfBuddies = 0;
1792 if (*it != deviceUI)
1794 if ((*it)->m_deviceSourceEngine)
1799 (*it)->m_deviceAPI->addSinkBuddy(deviceUI->
m_deviceAPI);
1804 if ((*it)->m_deviceSinkEngine)
1809 (*it)->m_deviceAPI->addSinkBuddy(deviceUI->
m_deviceAPI);
1816 if (nbOfBuddies == 0) {
1832 m_deviceUIs.back()->m_deviceAPI->getSampleSink()->init();
1841 int currentMIMOTabIndex =
ui->tabInputsSelect->currentIndex();
1843 if (currentMIMOTabIndex >= 0)
1845 qDebug(
"MainWindow::sampleMIMOChanged: tab at %d", currentMIMOTabIndex);
1872 if (userArgs.size() > 0) {
1888 m_deviceUIs.back()->m_deviceAPI->getSampleMIMO()->init();
1898 int currentSourceTabIndex =
ui->tabInputsSelect->currentIndex();
1900 if (currentSourceTabIndex >= 0)
1919 qDebug(
"MainWindow::channelAddClicked: MIMO: tab: %d nbRx: %d nbTx: %d selected: %d",
1920 currentSourceTabIndex, nbRxChannels, nbTxChannels, selectedIndex);
1922 if (selectedIndex < nbRxChannels) {
1925 }
else if (selectedIndex < nbRxChannels + nbTxChannels) {
1927 selectedIndex - nbRxChannels, deviceUI, deviceUI->
m_deviceAPI);
1954 QMessageBox::information(
this, tr(
"Message"), tr(
"MIMO operation not supported yet"));
1968 int inputViewIndex =
ui->tabInputsView->currentIndex();
1979 ui->tabSpectra->setCurrentIndex(inputViewIndex);
1980 ui->tabChannels->setCurrentIndex(inputViewIndex);
1981 ui->tabInputsSelect->setCurrentIndex(inputViewIndex);
1982 ui->tabSpectraGUI->setCurrentIndex(inputViewIndex);
1987 m_dateTimeWidget->setText(QDateTime::currentDateTime().toString(
"yyyy-MM-dd HH:mm:ss t"));
2014 #if QT_VERSION >= 0x050400 2015 QString appInfoStr(tr(
"%1 %2 Qt %3 %4b %5 %6 DSP Rx:%7b Tx:%8b PID %9")
2016 .
arg(qApp->applicationName())
2017 .
arg(qApp->applicationVersion())
2018 .
arg(QT_VERSION_STR)
2019 .arg(QT_POINTER_SIZE*8)
2020 .arg(QSysInfo::currentCpuArchitecture())
2021 .arg(QSysInfo::prettyProductName())
2024 .arg(qApp->applicationPid()));
2026 QString appInfoStr(tr(
"%1 %2 Qt %3 %4b DSP Rx:%5b Tx:%6b PID %7")
2027 .
arg(qApp->applicationName())
2028 .
arg(qApp->applicationVersion())
2029 .
arg(QT_VERSION_STR)
2030 .arg(QT_POINTER_SIZE*8)
2033 .arg(qApp->applicationPid()));
2042 int currentDeviceSetIndex =
ui->tabInputsSelect->currentIndex();
2050 && (command->
getKey() == key)
MessageQueue m_inputMessageQueue
void setSampleMIMO(DeviceSampleMIMO *mimo)
Set the device sample MIMO.
May expose any number of input and/or output streams.
void on_presetExport_clicked()
void updatePresetControls()
void setHardwareId(const QString &id)
void setBuddyLeader(bool isBuddyLeader)
void listRxChannels(QList< QString > &list)
const QString & getLogFileName() const
void setUseFileLogger(bool use)
void on_presetTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
int getFileSinkDeviceIndex() const
Get Tx default device.
GLSpectrumGUI * m_spectrumGUI
void commandKeysConnect(QObject *object, const char *slot)
Message * pop()
Pop message from queue.
int getDeviceIndex() const
void loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
virtual DeviceSampleSource * createSampleSourcePluginInstance(const QString &sourceId, DeviceAPI *deviceAPI)
int sequence
The device sequence. >0 when more than one device of the same type is connected.
void removeLastDeviceMIMOEngine()
virtual void init()=0
initializations to be done when all collaborating objects are created and possibly connected ...
void setSampleSource(DeviceSampleSource *source)
Set the device sample source (single Rx)
Qt::KeyboardModifiers getKeyModifiers() const
void stopDeviceEngine()
Stop the device engine corresponding to the stream type.
int getSourceIndex() const
QString displayedName
The human readable name.
void on_commandKeyboardConnect_toggled(bool checked)
void addChannelRollup(int deviceTabIndex, QWidget *widget)
bool handleMessage(const Message &cmd)
void addCommand(Command *command)
void setMessageRect(QRect rect, int alignment=Qt::AlignLeft)
void setSamplingDevicePluginInstanceGUI(PluginInstanceGUI *gui)
int getDeviceSetIndex() const
DeviceSampleSource * getSampleSource()
Return pointer to the device sample source (single Rx) or nullptr.
std::vector< DeviceUISet * > m_deviceUIs
WebAPIRequestMapper * m_requestMapper
void createOrSetFileLogger(const FileLoggerSettings &settings, const int refreshInterval=10000)
void setLayout(const QByteArray &data)
int getChannelRegistrationIndex() const
const QString & getDescription() const
quint64 getCenterFrequency() const
DSPDeviceSourceEngine * addDeviceSourceEngine()
QTreeWidgetItem * addPresetToTree(const Preset *preset)
void loadPlugins(const QString &pluginsSubDir)
bool getMIMOSupport() const
void saveTxChannelSettings(Preset *preset)
void on_presetDelete_clicked()
void setDescription(const QString &description)
bool getUseLogFile() const
Exposes a single output stream that can be one of the streams of a physical device.
virtual DeviceSampleMIMO * createSampleMIMOPluginInstance(const QString &mimoId, DeviceAPI *deviceAPI)
void toCommand(Command &command) const
virtual PluginInstanceGUI * createSampleSinkPluginInstanceGUI(const QString &sinkId, QWidget **widget, DeviceUISet *deviceUISet)
void removeSpectrumSink(BasebandSampleSink *spectrumSink)
Add a spectrum vis baseband sample sink.
void removeSink(BasebandSampleSink *sink)
Remove a sample sink.
void deleteCommand(const Command *command)
void addViewAction(QAction *action)
QString hardwareId
The internal id that identifies the type of hardware (i.e. HackRF, BladeRF, ...)
void setAdapter(WebAPIAdapterInterface *adapter)
void stop()
This thread stop.
DSPDeviceSinkEngine * addDeviceSinkEngine()
const Command * getCommand(int index) const
void on_action_addMIMODevice_triggered()
QComboBox * getChannelSelector()
void on_commandRun_clicked()
qtwebapp::LoggerWithFile * m_logger
bool isSourcePreset() const
virtual MessageQueue * getInputMessageQueue()=0
void on_action_AMBE_triggered()
void loadPresetSettings(const Preset *preset, int tabIndex)
void start()
This thread start.
int getRxSamplingDeviceIndex(const QString &deviceId, int sequence)
void stopProcess()
Stop process sequence.
void setSamplingDeviceSequence(int sequence)
QString getKeyLabel() const
void on_settingsSave_clicked()
FileLoggerSettings getFileLoggerSettings() const
void closeEvent(QCloseEvent *)
bool getMIMOSupport() const
DeviceSampleSink * getSampleSink()
Return pointer to the device sample sink (single Tx) or nullptr.
Preset * newPreset(const QString &group, const QString &description)
Exposes a single input stream that can be one of the streams of a physical device.
int getNumberOfAvailableRxChannels() const
DSPDeviceSourceEngine * m_deviceSourceEngine
Preset * getPreset() const
void on_presetSave_clicked()
bool hasFileLogger() const
Fixed< IntType, IntBits > arg(const std::complex< Fixed< IntType, IntBits > > &val)
void setSamplingDeviceId(const QString &id)
CommandKeyReceiver * m_commandKeyReceiver
void on_commandDuplicate_clicked()
void stopGeneration()
Stop generation sequence.
void run(const QString &apiAddress, int apiPort, int deviceSetIndex)
void setSamplingDeviceDisplayName(const QString &name)
void commandKeyPressed(Qt::Key key, Qt::KeyboardModifiers keyModifiers, bool release)
void on_commandDelete_clicked()
const PluginInterface::SamplingDevice * getMIMOSamplingDevice(int deviceIndex) const
void on_action_View_Fullscreen_toggled(bool checked)
const QByteArray & getLayout() const
void renamePresetGroup(const QString &oldGroupName, const QString &newGroupName)
SamplingDeviceControl * m_samplingDeviceControl
int getPresetCount() const
void on_presetTree_itemActivated(QTreeWidgetItem *item, int column)
QList< DeviceWidgetTabData > m_deviceWidgetTabs
void loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
virtual void deleteSampleMIMOPluginInstanceMIMO(DeviceSampleMIMO *mimo)
#define MESSAGE_CLASS_DEFINITION(Name, BaseClass)
void setSpectrumConfig(const QByteArray &data)
AMBEEngine * getAMBEEngine()
const QString & getSamplingDeviceId() const
int getDeviceSetIndex() const
void tabInputViewIndexChanged()
void saveRxChannelSettings(Preset *preset)
void removeSpectrumSink(BasebandSampleSink *spectrumSink)
Add a spectrum vis baseband sample sink.
int getChannelIndex() const
void addRollupWidget(QWidget *rollupWidget)
void on_presetUpdate_clicked()
int getDeviceSetIndex() const
void setDeviceGUI(int deviceTabIndex, QWidget *gui, const QString &deviceDisplayName, int deviceType=0)
void removeLastDeviceSinkEngine()
QtMsgType getFileMinLogLevel() const
void createRxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet, DeviceAPI *deviceAPI)
WebAPIServer * m_apiServer
void saveSamplingDeviceSettings(Preset *preset)
int deviceNbItems
Number of items (or streams) in the device. >1 for composite devices.
void deleteCommandGroup(const QString &groupName)
const QByteArray & getSpectrumConfig() const
QByteArray serialize() const
void setDescription(const QString &description)
void on_action_addSinkDevice_triggered()
WebAPIAdapterGUI * m_apiAdapter
Preset * getWorkingPreset()
void setConsoleMinMessageLevel(const QtMsgType &msgLevel)
virtual PluginInstanceGUI * createSampleMIMOPluginInstanceGUI(const QString &mimoId, QWidget **widget, DeviceUISet *deviceUISet)
virtual PluginInstanceGUI * createSampleSourcePluginInstanceGUI(const QString &sourceId, QWidget **widget, DeviceUISet *deviceUISet)
void setDescription(const QString &description)
void removeLastDeviceSourceEngine()
ChannelWindow * m_channelWindow
PluginAPI * getPluginAPI()
const QString & getHost() const
void stopAcquistion()
Stop acquisition sequence.
void on_action_My_Position_triggered()
void setAMBEEngine(AMBEEngine *ambeEngine)
void setGroup(const QString &group)
static bool match(const Message *message)
void stop()
This thread stop.
void on_commandsSave_clicked()
void on_action_DeviceUserArguments_triggered()
int getDeviceSetIndex() const
virtual void setMessageQueueToGUI(MessageQueue *queue)=0
void addSourceDevice(int deviceIndex)
void deletePreset(const Preset *preset)
void setSourcePreset(bool isSourcePreset)
QString description() const
int getTestMIMODeviceIndex() const
Get MIMO default device.
void on_presetLoad_clicked()
virtual DeviceSampleSink * createSampleSinkPluginInstance(const QString &sinkId, DeviceAPI *deviceAPI)
void setMIMOSupport(bool mimoSupport)
void sampleSourceChanged()
void addSink(BasebandSampleSink *sink)
Add a sample sink.
const QString & getSourceDeviceId() const
void setRelease(bool release)
DSPDeviceSinkEngine * m_deviceSinkEngine
QString id
The internal plugin ID corresponding to the device (i.e. for HackRF input, for HackRF output ...
void logToFile(const QtMsgType type, const QString &message, const QString &file="", const QString &function="", const int line=0)
static MainWindow * m_instance
int getDeviceType() const
void listTxChannels(QList< QString > &list)
const Preset * getPreset(int index) const
QString serial
The device serial number defined by the vendor or a fake one (SDRplay)
QByteArray m_mainWindowState
void createTxChannelInstance(int channelPluginIndex, DeviceUISet *deviceUISet, DeviceAPI *deviceAPI)
virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink)
virtual QByteArray serialize() const
const QString & getSamplingDeviceSerial() const
PluginInterface * getPluginInterface()
friend class WebAPIAdapterGUI
AudioDeviceManager * getAudioDeviceManager()
void showStatusMessage(const QString &message, const QColor &color=Qt::black)
void addSpectrumSink(BasebandSampleSink *spectrumSink)
Add a spectrum vis baseband sample sink.
void on_commandOutput_clicked()
const Preset * getPreset() const
virtual void deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui)
int getDeviceSetIndex() const
const PluginInterface::SamplingDevice * getTxSamplingDevice(int deviceIndex) const
void commandKeysDisconnect(QObject *object, const char *slot)
virtual void setMessageQueueToGUI(MessageQueue *queue)=0
void setAudioDeviceManager(AudioDeviceManager *audioDeviceManager)
void deleteTxChannel(int channelIndex)
PluginInstanceGUI * getSamplingDevicePluginInstanceGUI()
void start()
This thread start.
const QString & getHardwareId() const
const QString & getGroup() const
void on_action_About_triggered()
void on_presetEdit_clicked()
void start()
This thread start.
void savePresetSettings(Preset *preset, int tabIndex)
DeviceUserArgs & getDeviceUserArgs()
void setSamplingDeviceSerial(const QString &serial)
void on_action_addSourceDevice_triggered()
void deletePresetGroup(const QString &groupName)
virtual const char * getIdentifier() const
bool deserialize(const QByteArray &data)
const PluginInterface::SamplingDevice * getRxSamplingDevice(int deviceIndex) const
virtual void deleteSampleMIMOPluginInstanceGUI(PluginInstanceGUI *ui)
void fromCommand(const Command &command)
void on_action_Loaded_Plugins_triggered()
virtual void deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source)
DSPDeviceMIMOEngine * addDeviceMIMOEngine()
bool getAssociateKey() const
void setDeviceItemIndex(uint32_t index)
QLabel * m_dateTimeWidget
QLabel * m_showSystemWidget
void channelAddClicked(bool checked)
const QString & getSamplingDeviceDisplayName() const
void setFileMinMessageLevel(const QtMsgType &msgLevel)
const Preset * getPreset() const
void on_commandNew_clicked()
QTreeWidgetItem * addCommandToTree(const Command *command)
void resetSamplingDeviceId()
void setGroup(const QString &group)
int getCommandCount() const
virtual void setMessageQueueToGUI(MessageQueue *queue)=0
void setSelectedDeviceIndex(int index)
void loadSamplingDeviceSettings(const Preset *preset)
QtMsgType getConsoleMinLogLevel() const
int getFileInputDeviceIndex() const
Get Rx default device.
int getSelectedDeviceIndex() const
const QString & getDescription() const
void on_presetImport_clicked()
void deleteChannel(int deviceSetIndex, int channelIndex)
const QString & getServerAddress() const
void setSamplingDevicePluginInterface(PluginInterface *iface)
PluginManager * m_pluginManager
static DeviceEnumerator * instance()
void on_action_removeLastDevice_triggered()
int deviceItemIndex
For composite devices this is the Rx or Tx stream index. -1 if not initialized.
DeviceSampleMIMO * getSampleMIMO()
Return pointer to the device sample MIMO or nullptr.
void on_commandEdit_clicked()
void setDeviceNbItems(uint32_t nbItems)
void setSampleSink(DeviceSampleSink *sink)
Set the device sample sink (single Tx)
uint16_t getServerPort() const
void on_action_Audio_triggered()
int getNumberOfAvailableTxChannels() const
const QString & getGroup() const
void addSpectrumSink(BasebandSampleSink *spectrumSink)
Add a spectrum vis baseband sample sink.
int getDeviceSetIndex() const
DSPDeviceMIMOEngine * m_deviceMIMOEngine
void setHardwareUserArguments(const QString &userArguments)
void saveCommandSettings()
virtual bool deserialize(const QByteArray &data)
MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser &parser, QWidget *parent=0)
void stop()
This thread stop.
void renameCommandGroup(const QString &oldGroupName, const QString &newGroupName)
QString findUserArgs(const QString &id, int sequence)
void on_action_Logging_triggered()
void setSourceIndex(int value)
void setSourceDeviceId(const QString &deviceId)
void deleteRxChannel(int channelIndex)