| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2023-11-18 11:02:48 +00:00
										 |  |  | // Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany //
 | 
					
						
							|  |  |  | // written by Christian Daniel                                                   //
 | 
					
						
							|  |  |  | // Copyright (C) 2015-2023 Edouard Griffiths, F4EXB <f4exb06@gmail.com>          //
 | 
					
						
							|  |  |  | // Copyright (C) 2021-2023 Jon Beniston, M7RCE <jon@beniston.com>                //
 | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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                  //
 | 
					
						
							| 
									
										
										
										
											2019-04-11 04:39:30 +00:00
										 |  |  | // (at your option) any later version.                                           //
 | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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 <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QDockWidget>
 | 
					
						
							|  |  |  | #include <QMainWindow>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 23:52:05 +00:00
										 |  |  | #include "device/deviceuiset.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | #include "dsp/spectrumvis.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-09 23:52:05 +00:00
										 |  |  | #include "dsp/dspengine.h"
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | #include "dsp/dspcommands.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | #include "gui/glspectrum.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-12 15:06:55 +00:00
										 |  |  | #include "gui/glscope.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | #include "gui/basicchannelsettingsdialog.h"
 | 
					
						
							| 
									
										
										
										
											2022-12-20 10:31:15 +00:00
										 |  |  | #include "gui/dialpopup.h"
 | 
					
						
							|  |  |  | #include "gui/dialogpositioner.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | #include "plugin/pluginapi.h"
 | 
					
						
							|  |  |  | #include "util/db.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-12 19:59:04 +00:00
										 |  |  | #include "maincore.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 23:52:05 +00:00
										 |  |  | #include "ui_chanalyzergui.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | #include "chanalyzer.h"
 | 
					
						
							|  |  |  | #include "chanalyzergui.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | ChannelAnalyzerGUI* ChannelAnalyzerGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  |     ChannelAnalyzerGUI* gui = new ChannelAnalyzerGUI(pluginAPI, deviceUISet, rxChannel); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	return gui; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::destroy() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	delete this; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::resetToDefaults() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     m_settings.resetToDefaults(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::displaySettings() | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     m_channelMarker.blockSignals(true); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     m_channelMarker.setBandwidth(m_settings.m_bandwidth * 2); | 
					
						
							|  |  |  |     m_channelMarker.setTitle(m_settings.m_title); | 
					
						
							|  |  |  |     m_channelMarker.setLowCutoff(m_settings.m_lowCutoff); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     if (m_settings.m_ssb) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_settings.m_bandwidth < 0) { | 
					
						
							|  |  |  |             m_channelMarker.setSidebands(ChannelMarker::lsb); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             m_channelMarker.setSidebands(ChannelMarker::usb); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_channelMarker.setSidebands(ChannelMarker::dsb); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_channelMarker.blockSignals(false); | 
					
						
							|  |  |  |     m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setTitleColor(m_settings.m_rgbColor); | 
					
						
							|  |  |  |     setWindowTitle(m_channelMarker.getTitle()); | 
					
						
							| 
									
										
										
										
											2022-04-12 14:20:45 +00:00
										 |  |  |     setTitle(m_channelMarker.getTitle()); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     blockApplySettings(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     ui->useRationalDownsampler->setChecked(m_settings.m_rationalDownSample); | 
					
						
							|  |  |  |     setSinkSampleRate(); | 
					
						
							| 
									
										
										
										
											2018-05-22 17:25:55 +00:00
										 |  |  |     if (m_settings.m_ssb) { | 
					
						
							|  |  |  |         ui->BWLabel->setText("LP"); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         ui->BWLabel->setText("BP"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ui->ssb->setChecked(m_settings.m_ssb); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     ui->BW->setValue(m_settings.m_bandwidth/100); | 
					
						
							|  |  |  |     ui->lowCut->setValue(m_settings.m_lowCutoff/100); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     ui->deltaFrequency->setValue(m_settings.m_inputFrequencyOffset); | 
					
						
							|  |  |  |     ui->log2Decim->setCurrentIndex(m_settings.m_log2Decim); | 
					
						
							| 
									
										
										
										
											2018-05-20 00:24:38 +00:00
										 |  |  |     displayPLLSettings(); | 
					
						
							| 
									
										
										
										
											2018-05-20 17:41:36 +00:00
										 |  |  |     ui->signalSelect->setCurrentIndex((int) m_settings.m_inputType); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:20:36 +00:00
										 |  |  |     ui->rrcFilter->setChecked(m_settings.m_rrc); | 
					
						
							|  |  |  |     QString rolloffStr = QString::number(m_settings.m_rrcRolloff/100.0, 'f', 2); | 
					
						
							|  |  |  |     ui->rrcRolloffText->setText(rolloffStr); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-12 14:20:45 +00:00
										 |  |  |     getRollupContents()->restoreState(m_rollupState); | 
					
						
							| 
									
										
										
										
											2022-04-13 09:08:21 +00:00
										 |  |  |     updateAbsoluteCenterFrequency(); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     blockApplySettings(false); | 
					
						
							| 
									
										
										
										
											2018-05-20 00:24:38 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::displayPLLSettings() | 
					
						
							| 
									
										
										
										
											2018-05-20 00:24:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  |     if (m_settings.m_costasLoop) | 
					
						
							|  |  |  |         ui->pllType->setCurrentIndex(2); | 
					
						
							|  |  |  |     else if (m_settings.m_fll) | 
					
						
							|  |  |  |         ui->pllType->setCurrentIndex(1); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         ui->pllType->setCurrentIndex(0); | 
					
						
							|  |  |  |     setPLLVisibility(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     for(; ((m_settings.m_pllPskOrder>>i) & 1) == 0; i++); | 
					
						
							|  |  |  |     if (m_settings.m_costasLoop) | 
					
						
							|  |  |  |         ui->pllPskOrder->setCurrentIndex(i==0 ? 0 : i-1); | 
					
						
							| 
									
										
										
										
											2018-05-20 00:24:38 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |         ui->pllPskOrder->setCurrentIndex(i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ui->pll->setChecked(m_settings.m_pll); | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  |     ui->pllBandwidth->setValue((int)(m_settings.m_pllBandwidth*1000.0)); | 
					
						
							|  |  |  |     QString bandwidthStr = QString::number(m_settings.m_pllBandwidth, 'f', 3); | 
					
						
							|  |  |  |     ui->pllBandwidthText->setText(bandwidthStr); | 
					
						
							|  |  |  |     ui->pllDampingFactor->setValue((int)(m_settings.m_pllDampingFactor*10.0)); | 
					
						
							|  |  |  |     QString factorStr = QString::number(m_settings.m_pllDampingFactor, 'f', 1); | 
					
						
							|  |  |  |     ui->pllDampingFactorText->setText(factorStr); | 
					
						
							|  |  |  |     ui->pllLoopGain->setValue((int)(m_settings.m_pllLoopGain)); | 
					
						
							|  |  |  |     QString gainStr = QString::number(m_settings.m_pllLoopGain, 'f', 0); | 
					
						
							|  |  |  |     ui->pllLoopGainText->setText(gainStr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ChannelAnalyzerGUI::setPLLVisibility() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ui->pllToolbar->setVisible(m_settings.m_pll); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // BW
 | 
					
						
							|  |  |  |     ui->pllPskOrder->setVisible(!m_settings.m_fll); | 
					
						
							|  |  |  |     ui->pllLine1->setVisible(!m_settings.m_fll); | 
					
						
							|  |  |  |     ui->pllBandwidthLabel->setVisible(!m_settings.m_fll); | 
					
						
							|  |  |  |     ui->pllBandwidth->setVisible(!m_settings.m_fll); | 
					
						
							|  |  |  |     ui->pllBandwidthText->setVisible(!m_settings.m_fll); | 
					
						
							|  |  |  |     ui->pllLine2->setVisible(!m_settings.m_fll); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Damping factor and gain
 | 
					
						
							|  |  |  |     bool stdPll = !m_settings.m_fll && !m_settings.m_costasLoop; | 
					
						
							|  |  |  |     ui->pllDamplingFactor->setVisible(stdPll); | 
					
						
							|  |  |  |     ui->pllDampingFactor->setVisible(stdPll); | 
					
						
							|  |  |  |     ui->pllDampingFactorText->setVisible(stdPll); | 
					
						
							|  |  |  |     ui->pllLine3->setVisible(stdPll); | 
					
						
							|  |  |  |     ui->pllLoopGainLabel->setVisible(stdPll); | 
					
						
							|  |  |  |     ui->pllLoopGain->setVisible(stdPll); | 
					
						
							|  |  |  |     ui->pllLoopGainText->setVisible(stdPll); | 
					
						
							|  |  |  |     ui->pllLine4->setVisible(stdPll); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Order
 | 
					
						
							|  |  |  |     ui->pllPskOrder->blockSignals(true); | 
					
						
							|  |  |  |     ui->pllPskOrder->clear(); | 
					
						
							|  |  |  |     if (stdPll) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("CW"); | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("BPSK"); | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("QPSK"); | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("8PSK"); | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("16PSK"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (m_settings.m_costasLoop) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("BPSK"); | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("QPSK"); | 
					
						
							|  |  |  |         ui->pllPskOrder->addItem("8PSK"); | 
					
						
							|  |  |  |         if (m_settings.m_pllPskOrder < 2) | 
					
						
							|  |  |  |             m_settings.m_pllPskOrder = 2; | 
					
						
							|  |  |  |         else if (m_settings.m_pllPskOrder > 8) | 
					
						
							|  |  |  |             m_settings.m_pllPskOrder = 8; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     for(; ((m_settings.m_pllPskOrder>>i) & 1) == 0; i++); | 
					
						
							|  |  |  |     if (m_settings.m_costasLoop) | 
					
						
							|  |  |  |         ui->pllPskOrder->setCurrentIndex(i==0 ? 0 : i-1); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         ui->pllPskOrder->setCurrentIndex(i); | 
					
						
							|  |  |  |     ui->pllPskOrder->blockSignals(false); | 
					
						
							| 
									
										
										
										
											2022-04-12 14:20:45 +00:00
										 |  |  |     getRollupContents()->arrangeRollups(); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::setSpectrumDisplay() | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     int sinkSampleRate = getSinkSampleRate(); | 
					
						
							|  |  |  |     qDebug("ChannelAnalyzerGUI::setSpectrumDisplay: m_sinkSampleRate: %d", sinkSampleRate); | 
					
						
							| 
									
										
										
										
											2023-04-09 09:47:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     SpectrumSettings spectrumSettings = m_spectrumVis->getSettings(); | 
					
						
							|  |  |  |     spectrumSettings.m_ssb = m_settings.m_ssb; | 
					
						
							|  |  |  |     SpectrumVis::MsgConfigureSpectrumVis *msg = SpectrumVis::MsgConfigureSpectrumVis::create(spectrumSettings, false); | 
					
						
							|  |  |  |     m_spectrumVis->getInputMessageQueue()->push(msg); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     if (m_settings.m_ssb) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-07-08 23:19:39 +00:00
										 |  |  |         ui->glSpectrum->setCenterFrequency(0); | 
					
						
							|  |  |  |         ui->glSpectrum->setSampleRate(sinkSampleRate); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |         ui->glSpectrum->setLsbDisplay(ui->BW->value() < 0); | 
					
						
							| 
									
										
										
										
											2023-07-08 23:19:39 +00:00
										 |  |  |         ui->glSpectrum->setSsbSpectrum(true); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ui->glSpectrum->setCenterFrequency(0); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |         ui->glSpectrum->setSampleRate(sinkSampleRate); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |         ui->glSpectrum->setLsbDisplay(false); | 
					
						
							| 
									
										
										
										
											2023-07-08 23:19:39 +00:00
										 |  |  |         ui->glSpectrum->setSsbSpectrum(false); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | QByteArray ChannelAnalyzerGUI::serialize() const | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     return m_settings.serialize(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | bool ChannelAnalyzerGUI::deserialize(const QByteArray& data) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-02-11 01:32:27 +00:00
										 |  |  |     if (m_settings.deserialize(data)) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |         displaySettings(); | 
					
						
							|  |  |  |         applySettings(true); // will have true
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |         m_settings.resetToDefaults(); | 
					
						
							|  |  |  |         displaySettings(); | 
					
						
							|  |  |  |         applySettings(true); // will have true
 | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | bool ChannelAnalyzerGUI::handleMessage(const Message& message) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     if (DSPSignalNotification::match(message)) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |         DSPSignalNotification& cmd = (DSPSignalNotification&) message; | 
					
						
							|  |  |  |         m_basebandSampleRate = cmd.getSampleRate(); | 
					
						
							| 
									
										
										
										
											2022-04-13 09:08:21 +00:00
										 |  |  |         m_deviceCenterFrequency = cmd.getCenterFrequency(); | 
					
						
							|  |  |  |         ui->deltaFrequency->setValueRange(false, 8, -m_basebandSampleRate/2, m_basebandSampleRate/2); | 
					
						
							|  |  |  |         ui->deltaFrequencyLabel->setToolTip(tr("Range %1 %L2 Hz").arg(QChar(0xB1)).arg(m_basebandSampleRate/2)); | 
					
						
							|  |  |  |         updateAbsoluteCenterFrequency(); | 
					
						
							| 
									
										
										
										
											2021-07-10 20:41:24 +00:00
										 |  |  |         qDebug("ChannelAnalyzerGUI::handleMessage: DSPSignalNotification: m_basebandSampleRate: %d", m_basebandSampleRate); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |         setSinkSampleRate(); | 
					
						
							| 
									
										
										
										
											2021-12-01 07:25:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (ChannelAnalyzer::MsgConfigureChannelAnalyzer::match(message)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         qDebug("ChannelAnalyzerGUI::handleMessage: ChannelAnalyzer::MsgConfigureChannelAnalyzer"); | 
					
						
							|  |  |  |         const ChannelAnalyzer::MsgConfigureChannelAnalyzer& cfg = (ChannelAnalyzer::MsgConfigureChannelAnalyzer&) message; | 
					
						
							|  |  |  |         m_settings = cfg.getSettings(); | 
					
						
							|  |  |  |         blockApplySettings(true); | 
					
						
							|  |  |  |         ui->spectrumGUI->updateSettings(); | 
					
						
							|  |  |  |         ui->scopeGUI->updateSettings(); | 
					
						
							| 
									
										
										
										
											2021-12-02 22:54:39 +00:00
										 |  |  |         m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker)); | 
					
						
							| 
									
										
										
										
											2021-12-01 07:25:32 +00:00
										 |  |  |         displaySettings(); | 
					
						
							|  |  |  |         blockApplySettings(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::handleInputMessages() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     Message* message; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ((message = getInputMessageQueue()->pop()) != 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         qDebug("ChannelAnalyzerGUI::handleInputMessages: message: %s", message->getIdentifier()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (handleMessage(*message)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             delete message; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::channelMarkerChangedByCursor() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-11-13 23:35:25 +00:00
										 |  |  |     ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); | 
					
						
							| 
									
										
										
										
											2022-04-13 09:08:21 +00:00
										 |  |  |     updateAbsoluteCenterFrequency(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::channelMarkerHighlightedByCursor() | 
					
						
							| 
									
										
										
										
											2017-11-14 21:58:35 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-04-25 22:42:26 +00:00
										 |  |  |     setHighlighted(m_channelMarker.getHighlighted()); | 
					
						
							| 
									
										
										
										
											2017-11-14 21:58:35 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::tick() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-06-26 18:03:56 +00:00
										 |  |  | 	m_channelPowerAvg(m_channelAnalyzer->getMagSqAvg()); | 
					
						
							|  |  |  | 	double powDb = CalcDb::dbPower((double) m_channelPowerAvg); | 
					
						
							|  |  |  | 	ui->channelPower->setText(tr("%1 dB").arg(powDb, 0, 'f', 1)); | 
					
						
							| 
									
										
										
										
											2018-05-12 04:01:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (m_channelAnalyzer->isPllLocked()) { | 
					
						
							|  |  |  | 	    ui->pll->setStyleSheet("QToolButton { background-color : green; }"); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	    ui->pll->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-05-18 17:03:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 	if (ui->pll->isChecked()) | 
					
						
							| 
									
										
										
										
											2018-05-18 17:03:54 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  |         double sampleRate = (double) m_channelAnalyzer->getChannelSampleRate(); | 
					
						
							| 
									
										
										
										
											2019-05-04 02:54:16 +00:00
										 |  |  | 		int freq = (m_channelAnalyzer->getPllFrequency() * sampleRate) / (2.0*M_PI); | 
					
						
							| 
									
										
										
										
											2018-05-18 17:03:54 +00:00
										 |  |  | 		ui->pll->setToolTip(tr("PLL lock. Freq = %1 Hz").arg(freq)); | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  | 		ui->pllLockFrequency->setText(tr("%1 Hz").arg(freq)); | 
					
						
							| 
									
										
										
										
											2018-05-18 17:03:54 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_rationalDownSamplerRate_changed(quint64 value) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     m_settings.m_rationalDownSamplerRate = value; | 
					
						
							|  |  |  |     setSinkSampleRate(); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     applySettings(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_pll_toggled(bool checked) | 
					
						
							| 
									
										
										
										
											2018-05-12 04:01:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-18 17:03:54 +00:00
										 |  |  | 	if (!checked) { | 
					
						
							|  |  |  | 		ui->pll->setToolTip(tr("PLL lock")); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-20 00:24:38 +00:00
										 |  |  | 	m_settings.m_pll = checked; | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  |     setPLLVisibility(); | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ChannelAnalyzerGUI::on_pllType_currentIndexChanged(int index) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_settings.m_fll = (index == 1); | 
					
						
							|  |  |  |     m_settings.m_costasLoop = (index == 2); | 
					
						
							|  |  |  |     setPLLVisibility(); | 
					
						
							| 
									
										
										
										
											2018-05-12 04:01:54 +00:00
										 |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged(int index) | 
					
						
							| 
									
										
										
										
											2018-05-14 18:47:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  |     if (m_settings.m_costasLoop) | 
					
						
							|  |  |  |         m_settings.m_pllPskOrder = (1<<(index+1)); | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |         m_settings.m_pllPskOrder = (1<<index); | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ChannelAnalyzerGUI::on_pllBandwidth_valueChanged(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_settings.m_pllBandwidth = value/1000.0; | 
					
						
							|  |  |  |     QString bandwidthStr = QString::number(m_settings.m_pllBandwidth, 'f', 3); | 
					
						
							|  |  |  |     ui->pllBandwidthText->setText(bandwidthStr); | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_settings.m_pllDampingFactor = value/10.0; | 
					
						
							|  |  |  |     QString factorStr = QString::number(m_settings.m_pllDampingFactor, 'f', 1); | 
					
						
							|  |  |  |     ui->pllDampingFactorText->setText(factorStr); | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-05-20 00:24:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-05 13:37:49 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_pllLoopGain_valueChanged(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_settings.m_pllLoopGain = value; | 
					
						
							|  |  |  |     QString gainStr = QString::number(m_settings.m_pllLoopGain, 'f', 0); | 
					
						
							|  |  |  |     ui->pllLoopGainText->setText(gainStr); | 
					
						
							| 
									
										
										
										
											2018-05-20 00:24:38 +00:00
										 |  |  |     applySettings(); | 
					
						
							| 
									
										
										
										
											2018-05-14 18:47:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_useRationalDownsampler_toggled(bool checked) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     m_settings.m_rationalDownSample = checked; | 
					
						
							|  |  |  |     setSinkSampleRate(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged(int index) | 
					
						
							| 
									
										
										
										
											2018-05-20 16:17:53 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  |     m_settings.m_inputType = (ChannelAnalyzerSettings::InputType) index; | 
					
						
							| 
									
										
										
										
											2019-10-27 21:25:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_settings.m_inputType == ChannelAnalyzerSettings::InputAutoCorr) { | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |         m_scopeVis->setTraceChunkSize(ChannelAnalyzerSink::m_corrFFTLen); | 
					
						
							| 
									
										
										
										
											2019-10-27 21:25:05 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2021-05-30 08:49:52 +00:00
										 |  |  |         m_scopeVis->setTraceChunkSize(GLScopeSettings::m_traceChunkDefaultSize); | 
					
						
							| 
									
										
										
										
											2019-10-27 21:25:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ui->scopeGUI->traceLengthChange(); | 
					
						
							| 
									
										
										
										
											2018-05-20 16:17:53 +00:00
										 |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_deltaFrequency_changed(qint64 value) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     m_channelMarker.setCenterFrequency(value); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); | 
					
						
							| 
									
										
										
										
											2022-04-13 09:08:21 +00:00
										 |  |  |     updateAbsoluteCenterFrequency(); | 
					
						
							| 
									
										
										
										
											2017-11-15 00:58:44 +00:00
										 |  |  |     applySettings(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_rrcFilter_toggled(bool checked) | 
					
						
							| 
									
										
										
										
											2018-05-22 00:20:36 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     m_settings.m_rrc = checked; | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_rrcRolloff_valueChanged(int value) | 
					
						
							| 
									
										
										
										
											2018-05-22 00:20:36 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     m_settings.m_rrcRolloff = value; | 
					
						
							|  |  |  |     QString rolloffStr = QString::number(value/100.0, 'f', 2); | 
					
						
							|  |  |  |     ui->rrcRolloffText->setText(rolloffStr); | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-12 23:45:03 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_BW_valueChanged(int value) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-12 23:45:03 +00:00
										 |  |  |     (void) value; | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     setFiltersUIBoundaries(); | 
					
						
							|  |  |  |     m_settings.m_bandwidth = ui->BW->value() * 100; | 
					
						
							|  |  |  |     m_settings.m_lowCutoff = ui->lowCut->value() * 100; | 
					
						
							|  |  |  | 	applySettings(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-12 23:45:03 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-12 23:45:03 +00:00
										 |  |  |     (void) value; | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 	setFiltersUIBoundaries(); | 
					
						
							|  |  |  | 	m_settings.m_bandwidth = ui->BW->value() * 100; | 
					
						
							|  |  |  | 	m_settings.m_lowCutoff = ui->lowCut->value() * 100; | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged(int index) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     if ((index < 0) || (index > 6)) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     m_settings.m_log2Decim = index; | 
					
						
							|  |  |  |     setSinkSampleRate(); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     applySettings(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::on_ssb_toggled(bool checked) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 	m_settings.m_ssb = checked; | 
					
						
							| 
									
										
										
										
											2018-05-22 17:25:55 +00:00
										 |  |  | 	if (checked) { | 
					
						
							|  |  |  | 	    ui->BWLabel->setText("LP"); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 	    ui->BWLabel->setText("BP"); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     setFiltersUIBoundaries(); | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-12 23:45:03 +00:00
										 |  |  | void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown) | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-12 23:45:03 +00:00
										 |  |  |     (void) widget; | 
					
						
							|  |  |  |     (void) rollDown; | 
					
						
							| 
									
										
										
										
											2021-11-24 09:50:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												dd maximize button to MainSpectrum and expandible Channels and Features.
Add sizeToContents in ChannelGUI and FeatureGUI, called when widget is
rolled, so we can remove resizing code from all of the individual
channels and features.
In RollupContents, use minimumSizeHint for calculated size, so that
minimumWidth can come from .ui file.
In DeviceGUI::sizeToContents(), call adjustSize(), so Device GUIs start
out at minimum needed size (which should restore appearance prior to
last patch).
In stackSubWindows, use available space for channels if no
spectrum/features present.
In stackSubWindows, fix spectrum from being sized too big, resulting in
scroll bars appearing.
Reset user-defined channel width in stackSubWindows, when channels are
removed.
Don't stack maximized windows.
There's one hack in Channel/FeatureGUI::maximizeWindow(). It seems that
when maximimzing a window, QOpenGLWidgets aren't always paint properly
immediately afterwards, so the code forces an additional update. I can't
see why the first call to paintGL doesn't work.
											
										 
											2022-11-11 12:24:27 +00:00
										 |  |  |     getRollupContents()->saveState(m_rollupState); | 
					
						
							| 
									
										
										
										
											2021-11-24 09:50:42 +00:00
										 |  |  |     applySettings(); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p) | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-08-25 21:36:46 +00:00
										 |  |  |     if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings) | 
					
						
							| 
									
										
										
										
											2019-05-09 19:07:05 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         BasicChannelSettingsDialog dialog(&m_channelMarker, this); | 
					
						
							| 
									
										
										
										
											2022-02-11 01:32:27 +00:00
										 |  |  |         dialog.setUseReverseAPI(m_settings.m_useReverseAPI); | 
					
						
							|  |  |  |         dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); | 
					
						
							|  |  |  |         dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); | 
					
						
							|  |  |  |         dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); | 
					
						
							|  |  |  |         dialog.setReverseAPIChannelIndex(m_settings.m_reverseAPIChannelIndex); | 
					
						
							| 
									
										
										
										
											2022-04-17 23:42:03 +00:00
										 |  |  |         dialog.setDefaultTitle(m_displayedName); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_deviceUISet->m_deviceMIMOEngine) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             dialog.setNumberOfStreams(m_channelAnalyzer->getNumberOfDeviceStreams()); | 
					
						
							|  |  |  |             dialog.setStreamIndex(m_settings.m_streamIndex); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 19:07:05 +00:00
										 |  |  |         dialog.move(p); | 
					
						
							| 
									
										
										
										
											2022-12-20 10:31:15 +00:00
										 |  |  |         new DialogPositioner(&dialog, false); | 
					
						
							| 
									
										
										
										
											2019-05-09 19:07:05 +00:00
										 |  |  |         dialog.exec(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 19:07:05 +00:00
										 |  |  |         m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); | 
					
						
							|  |  |  |         m_settings.m_title = m_channelMarker.getTitle(); | 
					
						
							| 
									
										
										
										
											2022-02-11 01:32:27 +00:00
										 |  |  |         m_settings.m_useReverseAPI = dialog.useReverseAPI(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIChannelIndex = dialog.getReverseAPIChannelIndex(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 19:07:05 +00:00
										 |  |  |         setWindowTitle(m_settings.m_title); | 
					
						
							| 
									
										
										
										
											2022-04-12 14:20:45 +00:00
										 |  |  |         setTitle(m_channelMarker.getTitle()); | 
					
						
							| 
									
										
										
										
											2019-05-09 19:07:05 +00:00
										 |  |  |         setTitleColor(m_settings.m_rgbColor); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-17 23:42:03 +00:00
										 |  |  |         if (m_deviceUISet->m_deviceMIMOEngine) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             m_settings.m_streamIndex = dialog.getSelectedStreamIndex(); | 
					
						
							|  |  |  |             m_channelMarker.clearStreamIndexes(); | 
					
						
							|  |  |  |             m_channelMarker.addStreamIndex(m_settings.m_streamIndex); | 
					
						
							|  |  |  |             updateIndexLabel(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 19:07:05 +00:00
										 |  |  |         applySettings(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resetContextMenuType(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : | 
					
						
							| 
									
										
										
										
											2020-10-04 04:16:15 +00:00
										 |  |  | 	ChannelGUI(parent), | 
					
						
							| 
									
										
										
										
											2018-05-30 13:49:28 +00:00
										 |  |  | 	ui(new Ui::ChannelAnalyzerGUI), | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	m_pluginAPI(pluginAPI), | 
					
						
							|  |  |  | 	m_deviceUISet(deviceUISet), | 
					
						
							|  |  |  | 	m_channelMarker(this), | 
					
						
							|  |  |  | 	m_doApplySettings(true), | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 	m_basebandSampleRate(48000) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	setAttribute(Qt::WA_DeleteOnClose, true); | 
					
						
							| 
									
										
										
										
											2022-04-24 10:28:56 +00:00
										 |  |  |     m_helpURL = "plugins/channelrx/chanalyzer/readme.md"; | 
					
						
							|  |  |  |     RollupContents *rollupContents = getRollupContents(); | 
					
						
							|  |  |  | 	ui->setupUi(rollupContents); | 
					
						
							|  |  |  |     setSizePolicy(rollupContents->sizePolicy()); | 
					
						
							|  |  |  |     rollupContents->arrangeRollups(); | 
					
						
							|  |  |  | 	connect(rollupContents, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 	connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-14 20:07:48 +00:00
										 |  |  | 	m_channelAnalyzer = (ChannelAnalyzer*) rxChannel; | 
					
						
							| 
									
										
										
										
											2021-07-10 20:41:24 +00:00
										 |  |  |     m_basebandSampleRate = m_channelAnalyzer->getChannelSampleRate(); | 
					
						
							|  |  |  |     qDebug("ChannelAnalyzerGUI::ChannelAnalyzerGUI: m_basebandSampleRate: %d", m_basebandSampleRate); | 
					
						
							| 
									
										
										
										
											2020-04-30 07:57:05 +00:00
										 |  |  |     m_spectrumVis = m_channelAnalyzer->getSpectrumVis(); | 
					
						
							|  |  |  | 	m_spectrumVis->setGLSpectrum(ui->glSpectrum); | 
					
						
							| 
									
										
										
										
											2021-05-30 11:12:00 +00:00
										 |  |  |     m_scopeVis = m_channelAnalyzer->getScopeVis(); | 
					
						
							|  |  |  |     m_scopeVis->setGLScope(ui->glScope); | 
					
						
							| 
									
										
										
										
											2020-10-07 19:28:32 +00:00
										 |  |  |     m_basebandSampleRate = m_channelAnalyzer->getChannelSampleRate(); | 
					
						
							| 
									
										
										
										
											2021-06-05 17:26:26 +00:00
										 |  |  |     m_scopeVis->setSpectrumVis(m_spectrumVis); | 
					
						
							|  |  |  |     m_channelAnalyzer->setScopeVis(m_scopeVis); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	m_channelAnalyzer->setMessageQueueToGUI(getInputMessageQueue()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03))); | 
					
						
							|  |  |  |     ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); | 
					
						
							| 
									
										
										
										
											2020-07-01 11:14:48 +00:00
										 |  |  |     ui->deltaFrequency->setValueRange(false, 8, -99999999, 99999999); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 	ui->rationalDownSamplerRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow)); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 	ui->glSpectrum->setCenterFrequency(m_basebandSampleRate/2); | 
					
						
							|  |  |  | 	ui->glSpectrum->setSampleRate(m_basebandSampleRate); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     ui->glSpectrum->setLsbDisplay(false); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-12 19:59:04 +00:00
										 |  |  | 	ui->glScope->connectTimer(MainCore::instance()->getMasterTimer()); | 
					
						
							|  |  |  | 	connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-13 23:35:25 +00:00
										 |  |  | 	m_channelMarker.blockSignals(true); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	m_channelMarker.setColor(Qt::gray); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 	m_channelMarker.setBandwidth(m_basebandSampleRate); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	m_channelMarker.setSidebands(ChannelMarker::usb); | 
					
						
							|  |  |  | 	m_channelMarker.setCenterFrequency(0); | 
					
						
							| 
									
										
										
										
											2018-05-30 09:49:54 +00:00
										 |  |  | 	m_channelMarker.setTitle("Channel Analyzer"); | 
					
						
							| 
									
										
										
										
											2017-11-13 23:35:25 +00:00
										 |  |  |     m_channelMarker.blockSignals(false); | 
					
						
							|  |  |  | 	m_channelMarker.setVisible(true); // activate signal on the last setting only
 | 
					
						
							|  |  |  | 	setTitleColor(m_channelMarker.getColor()); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	m_deviceUISet->addChannelMarker(&m_channelMarker); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-01 00:33:50 +00:00
										 |  |  | 	ui->spectrumGUI->setBuddies(m_spectrumVis, ui->glSpectrum); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-09 09:47:50 +00:00
										 |  |  |     SpectrumSettings spectrumSettings = m_spectrumVis->getSettings(); | 
					
						
							|  |  |  |     spectrumSettings.m_displayWaterfall = true; | 
					
						
							|  |  |  |     spectrumSettings.m_displayMaxHold = false; | 
					
						
							|  |  |  |     spectrumSettings.m_ssb = false; | 
					
						
							|  |  |  |     SpectrumVis::MsgConfigureSpectrumVis *msg = SpectrumVis::MsgConfigureSpectrumVis::create(spectrumSettings, false); | 
					
						
							|  |  |  |     m_spectrumVis->getInputMessageQueue()->push(msg); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 	m_settings.setChannelMarker(&m_channelMarker); | 
					
						
							| 
									
										
										
										
											2022-01-09 04:27:12 +00:00
										 |  |  |     m_settings.setRollupState(&m_rollupState); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     m_settings.setSpectrumGUI(ui->spectrumGUI); | 
					
						
							|  |  |  |     m_settings.setScopeGUI(ui->scopeGUI); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-13 23:35:25 +00:00
										 |  |  | 	connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor())); | 
					
						
							| 
									
										
										
										
											2017-11-14 21:58:35 +00:00
										 |  |  |     connect(&m_channelMarker, SIGNAL(highlightedByCursor()), this, SLOT(channelMarkerHighlightedByCursor())); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 	displaySettings(); | 
					
						
							| 
									
										
										
										
											2022-04-12 14:20:45 +00:00
										 |  |  |     makeUIConnections(); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  | 	applySettings(true); | 
					
						
							| 
									
										
										
										
											2022-12-20 10:31:15 +00:00
										 |  |  |     DialPopup::addPopupsToChildDials(this); | 
					
						
							| 
									
										
										
										
											2023-11-13 20:51:03 +00:00
										 |  |  |     m_resizer.enableChildMouseTracking(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | ChannelAnalyzerGUI::~ChannelAnalyzerGUI() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-10-07 19:28:32 +00:00
										 |  |  |     qDebug("ChannelAnalyzerGUI::~ChannelAnalyzerGUI"); | 
					
						
							|  |  |  | 	ui->glScope->disconnectTimer(); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	delete ui; | 
					
						
							| 
									
										
										
										
											2020-10-07 19:28:32 +00:00
										 |  |  |     qDebug("ChannelAnalyzerGUI::~ChannelAnalyzerGUI: done"); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 00:08:58 +00:00
										 |  |  | int ChannelAnalyzerGUI::getSinkSampleRate() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_settings.m_rationalDownSample ? | 
					
						
							|  |  |  |         m_settings.m_rationalDownSamplerRate | 
					
						
							|  |  |  |         : m_basebandSampleRate / (1<<m_settings.m_log2Decim); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | void ChannelAnalyzerGUI::setSinkSampleRate() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-07-19 09:45:35 +00:00
										 |  |  |     unsigned int nominalSinkSampleRate = m_basebandSampleRate / (1<<m_settings.m_log2Decim); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 09:45:35 +00:00
										 |  |  |     ui->rationalDownSamplerRate->setValueRange(7, 0.5*nominalSinkSampleRate, nominalSinkSampleRate); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     ui->rationalDownSamplerRate->setValue(m_settings.m_rationalDownSamplerRate); | 
					
						
							| 
									
										
										
										
											2020-07-19 09:45:35 +00:00
										 |  |  |     m_settings.m_rationalDownSamplerRate = ui->rationalDownSamplerRate->getValueNew(); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     unsigned int sinkSampleRate = getSinkSampleRate(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 09:45:35 +00:00
										 |  |  | 	qDebug("ChannelAnalyzerGUI::setSinkSampleRate: nominalSinkSampleRate: %u sinkSampleRate: %u", | 
					
						
							|  |  |  |         nominalSinkSampleRate, sinkSampleRate); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	setFiltersUIBoundaries(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 	QString s = QString::number(sinkSampleRate/1000.0, 'f', 1); | 
					
						
							|  |  |  | 	ui->sinkSampleRateText->setText(tr("%1 kS/s").arg(s)); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  | 	m_scopeVis->setLiveRate(sinkSampleRate == 0 ? 48000 : sinkSampleRate); | 
					
						
							| 
									
										
										
										
											2021-07-10 20:41:24 +00:00
										 |  |  |     ui->scopeGUI->setSampleRate(sinkSampleRate == 0 ? 48000 : sinkSampleRate); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::setFiltersUIBoundaries() | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     int sinkSampleRate = getSinkSampleRate(); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     bool dsb = !ui->ssb->isChecked(); | 
					
						
							|  |  |  |     int bw = ui->BW->value(); | 
					
						
							|  |  |  |     int lw = ui->lowCut->value(); | 
					
						
							| 
									
										
										
										
											2019-11-24 09:12:58 +00:00
										 |  |  |     int bwMax = sinkSampleRate / 200; | 
					
						
							| 
									
										
										
										
											2017-11-11 04:10:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     bw = bw < -bwMax ? -bwMax : bw > bwMax ? bwMax : bw; | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     if (bw < 0) { | 
					
						
							|  |  |  |         lw = lw < bw+1 ? bw+1 : lw < 0 ? lw : 0; | 
					
						
							|  |  |  |     } else if (bw > 0) { | 
					
						
							|  |  |  |         lw = lw > bw-1 ? bw-1 : lw < 0 ? 0 : lw; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         lw = 0; | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     if (dsb) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         bw = bw < 0 ? -bw : bw; | 
					
						
							|  |  |  |         lw = 0; | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     QString bwStr = QString::number(bw/10.0, 'f', 1); | 
					
						
							|  |  |  |     QString lwStr = QString::number(lw/10.0, 'f', 1); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     if (dsb) { | 
					
						
							|  |  |  |         ui->BWText->setText(tr("%1%2k").arg(QChar(0xB1, 0x00)).arg(bwStr)); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         ui->BWText->setText(tr("%1k").arg(bwStr)); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     ui->lowCutText->setText(tr("%1k").arg(lwStr)); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     ui->BW->blockSignals(true); | 
					
						
							|  |  |  |     ui->lowCut->blockSignals(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ui->BW->setMaximum(bwMax); | 
					
						
							|  |  |  |     ui->BW->setMinimum(dsb ? 0 : -bwMax); | 
					
						
							|  |  |  |     ui->BW->setValue(bw); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ui->lowCut->setMaximum(dsb ? 0 :  bw); | 
					
						
							|  |  |  |     ui->lowCut->setMinimum(dsb ? 0 : -bw); | 
					
						
							|  |  |  |     ui->lowCut->setValue(lw); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |     ui->lowCut->blockSignals(false); | 
					
						
							|  |  |  |     ui->BW->blockSignals(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setSpectrumDisplay(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_channelMarker.setBandwidth(bw * 200); | 
					
						
							|  |  |  |     m_channelMarker.setSidebands(dsb ? ChannelMarker::dsb : bw < 0 ? ChannelMarker::lsb : ChannelMarker::usb); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!dsb) { | 
					
						
							|  |  |  |         m_channelMarker.setLowCutoff(lw * 100); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::blockApplySettings(bool block) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     ui->glScope->blockSignals(block); | 
					
						
							|  |  |  |     ui->glSpectrum->blockSignals(block); | 
					
						
							|  |  |  |     m_doApplySettings = !block; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  | void ChannelAnalyzerGUI::applySettings(bool force) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (m_doApplySettings) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-05-30 13:37:56 +00:00
										 |  |  |         ChannelAnalyzer::MsgConfigureChannelAnalyzer* message = | 
					
						
							|  |  |  |                 ChannelAnalyzer::MsgConfigureChannelAnalyzer::create( m_settings, force); | 
					
						
							| 
									
										
										
										
											2018-05-19 23:10:08 +00:00
										 |  |  |         m_channelAnalyzer->getInputMessageQueue()->push(message); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-22 17:21:24 +00:00
										 |  |  | void ChannelAnalyzerGUI::leaveEvent(QEvent* event) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	m_channelMarker.setHighlighted(false); | 
					
						
							| 
									
										
										
										
											2022-04-22 17:21:24 +00:00
										 |  |  |     ChannelGUI::leaveEvent(event); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-17 14:36:12 +00:00
										 |  |  | void ChannelAnalyzerGUI::enterEvent(EnterEventType* event) | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	m_channelMarker.setHighlighted(true); | 
					
						
							| 
									
										
										
										
											2022-04-22 17:21:24 +00:00
										 |  |  |     ChannelGUI::enterEvent(event); | 
					
						
							| 
									
										
										
										
											2017-10-31 21:37:57 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-12 14:20:45 +00:00
										 |  |  | void ChannelAnalyzerGUI::makeUIConnections() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &ChannelAnalyzerGUI::on_deltaFrequency_changed); | 
					
						
							|  |  |  |     QObject::connect(ui->rationalDownSamplerRate, &ValueDial::changed, this, &ChannelAnalyzerGUI::on_rationalDownSamplerRate_changed); | 
					
						
							|  |  |  |     QObject::connect(ui->pll, &QToolButton::toggled, this, &ChannelAnalyzerGUI::on_pll_toggled); | 
					
						
							|  |  |  |     QObject::connect(ui->pllType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ChannelAnalyzerGUI::on_pllType_currentIndexChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->pllPskOrder, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->pllBandwidth, &QDial::valueChanged, this, &ChannelAnalyzerGUI::on_pllBandwidth_valueChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->pllDampingFactor, &QDial::valueChanged, this, &ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->pllLoopGain, &QDial::valueChanged, this, &ChannelAnalyzerGUI::on_pllLoopGain_valueChanged); | 
					
						
							| 
									
										
										
										
											2022-04-26 06:32:33 +00:00
										 |  |  |     QObject::connect(ui->log2Decim, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged); | 
					
						
							| 
									
										
										
										
											2022-04-12 14:20:45 +00:00
										 |  |  |     QObject::connect(ui->useRationalDownsampler, &ButtonSwitch::toggled, this, &ChannelAnalyzerGUI::on_useRationalDownsampler_toggled); | 
					
						
							|  |  |  |     QObject::connect(ui->signalSelect, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->rrcFilter, &ButtonSwitch::toggled, this, &ChannelAnalyzerGUI::on_rrcFilter_toggled); | 
					
						
							|  |  |  |     QObject::connect(ui->rrcRolloff, &QDial::valueChanged, this, &ChannelAnalyzerGUI::on_rrcRolloff_valueChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->BW, &QSlider::valueChanged, this, &ChannelAnalyzerGUI::on_BW_valueChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->lowCut, &QSlider::valueChanged, this, &ChannelAnalyzerGUI::on_lowCut_valueChanged); | 
					
						
							|  |  |  |     QObject::connect(ui->ssb, &QCheckBox::toggled, this, &ChannelAnalyzerGUI::on_ssb_toggled); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-04-13 09:08:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | void ChannelAnalyzerGUI::updateAbsoluteCenterFrequency() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     setStatusFrequency(m_deviceCenterFrequency + m_settings.m_inputFrequencyOffset); | 
					
						
							|  |  |  | } |