📄 systemevaldlg.cpp
字号:
/******************************************************************************\
* Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik
* Copyright (c) 2001
*
* Author(s):
* Volker Fischer
*
* Description:
*
*
******************************************************************************
*
* 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; either version 2 of the License, or (at your option) any later
* version.
*
* 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 for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
\******************************************************************************/
#include "systemevalDlg.h"
/* Implementation *************************************************************/
systemevalDlg::systemevalDlg(CDRMReceiver* pNDRMR, QWidget* parent,
const char* name, bool modal, WFlags f) : vecpDRMPlots(0),
systemevalDlgBase(parent, name, modal, f), pDRMRec(pNDRMR)
{
/* Set help text for the controls */
AddWhatsThisHelp();
#ifdef _WIN32 /* This works only reliable under Windows :-( */
/* Get window geometry data from DRMReceiver module and apply it */
const QRect WinGeom(pDRMRec->GeomSystemEvalDlg.iXPos,
pDRMRec->GeomSystemEvalDlg.iYPos,
pDRMRec->GeomSystemEvalDlg.iWSize,
pDRMRec->GeomSystemEvalDlg.iHSize);
if (WinGeom.isValid() && !WinGeom.isEmpty() && !WinGeom.isNull())
setGeometry(WinGeom);
#else /* Under Linux only restore the size */
resize(pDRMRec->GeomSystemEvalDlg.iWSize,
pDRMRec->GeomSystemEvalDlg.iHSize);
#endif
/* Init controls -------------------------------------------------------- */
/* Init main plot */
MainPlot->SetRecObj(pDRMRec);
MainPlot->SetPlotStyle(pDRMRec->iMainPlotColorStyle);
MainPlot->setMargin(1);
/* Init slider control */
SliderNoOfIterations->setRange(0, 4);
SliderNoOfIterations->
setValue(pDRMRec->GetMSCMLC()->GetInitNumIterations());
TextNumOfIterations->setText(tr("MLC: Number of Iterations: ") +
QString().setNum(pDRMRec->GetMSCMLC()->GetInitNumIterations()));
/* Update times for color LEDs */
LEDFAC->SetUpdateTime(1500);
LEDSDC->SetUpdateTime(1500);
LEDMSC->SetUpdateTime(600);
LEDFrameSync->SetUpdateTime(600);
LEDTimeSync->SetUpdateTime(600);
LEDIOInterface->SetUpdateTime(2000); /* extra long -> red light stays long */
/* Init parameter for frequency edit for log file */
iCurFrequency = 0;
/* Update controls */
UpdateControls();
/* Init chart selector list view ---------------------------------------- */
ListViewCharSel->clear();
/* No sorting of items */
ListViewCharSel->setSorting(-1);
/* Insert parent list view items. Parent list view items should not be
selectable */
CCharSelItem* pHistoryLiViIt =
new CCharSelItem(ListViewCharSel, tr("History"),
CDRMPlot::NONE_OLD, FALSE);
CCharSelItem* pConstellationLiViIt =
new CCharSelItem(ListViewCharSel, tr("Constellation"),
CDRMPlot::NONE_OLD, FALSE);
CCharSelItem* pChannelLiViIt =
new CCharSelItem(ListViewCharSel, tr("Channel"),
CDRMPlot::NONE_OLD, FALSE);
CCharSelItem* pSpectrumLiViIt =
new CCharSelItem(ListViewCharSel, tr("Spectrum"),
CDRMPlot::NONE_OLD, FALSE);
/* Inser actual items. The list is not sorted -> items which are inserted
first show up at the end of the list */
/* Spectrum */
CCharSelItem* pListItSNRSpec = new CCharSelItem(pSpectrumLiViIt,
tr("SNR Spectrum"), CDRMPlot::SNR_SPECTRUM);
CCharSelItem* pListItAudSpec = new CCharSelItem(pSpectrumLiViIt,
tr("Audio Spectrum"), CDRMPlot::AUDIO_SPECTRUM);
CCharSelItem* pListItPowSpecDens = new CCharSelItem(pSpectrumLiViIt,
tr("Shifted PSD"), CDRMPlot::POWER_SPEC_DENSITY);
CCharSelItem* pListItInpSpecWater = new CCharSelItem(pSpectrumLiViIt,
tr("Waterfall Input Spectrum"), CDRMPlot::INP_SPEC_WATERF);
CCharSelItem* pListItInpSpectrNoAv = new CCharSelItem(pSpectrumLiViIt,
tr("Input Spectrum"), CDRMPlot::INPUTSPECTRUM_NO_AV);
CCharSelItem* pListItInpPSD = new CCharSelItem(pSpectrumLiViIt,
tr("Input PSD"), CDRMPlot::INPUT_SIG_PSD);
/* Constellation */
CCharSelItem* pListItConstMSC = new CCharSelItem(pConstellationLiViIt,
tr("MSC"), CDRMPlot::MSC_CONSTELLATION);
CCharSelItem* pListItConstSDC = new CCharSelItem(pConstellationLiViIt,
tr("SDC"), CDRMPlot::SDC_CONSTELLATION);
CCharSelItem* pListItConstFAC = new CCharSelItem(pConstellationLiViIt,
tr("FAC"), CDRMPlot::FAC_CONSTELLATION);
CCharSelItem* pListItConstAll = new CCharSelItem(pConstellationLiViIt,
tr("FAC / SDC / MSC"), CDRMPlot::ALL_CONSTELLATION);
/* History */
CCharSelItem* pListItHistFrSa = new CCharSelItem(pHistoryLiViIt,
tr("Frequency / Sample Rate"), CDRMPlot::FREQ_SAM_OFFS_HIST);
CCharSelItem* pListItHistDeDo = new CCharSelItem(pHistoryLiViIt,
tr("Delay / Doppler"), CDRMPlot::DOPPLER_DELAY_HIST);
CCharSelItem* pListItHistSNRAu = new CCharSelItem(pHistoryLiViIt,
tr("SNR / Audio"), CDRMPlot::SNR_AUDIO_HIST);
/* Channel */
CCharSelItem* pListItChanTF = new CCharSelItem(pChannelLiViIt,
tr("Transfer Function"), CDRMPlot::TRANSFERFUNCTION);
CCharSelItem* pListItChanIR = new CCharSelItem(pChannelLiViIt,
tr("Impulse Response"), CDRMPlot::AVERAGED_IR);
/* _WIN32 fix because in Visual c++ the GUI files are always compiled even
if USE_QT_GUI is set or not (problem with MDI in DRMReceiver) */
#ifdef USE_QT_GUI
/* If MDI in is enabled, disable some of the controls and use different
initialization for the chart and chart selector */
if (pDRMRec->GetMDI()->GetMDIInEnabled() == TRUE)
{
ListViewCharSel->setEnabled(FALSE);
SliderNoOfIterations->setEnabled(FALSE);
ButtonGroupChanEstFreqInt->setEnabled(FALSE);
ButtonGroupChanEstTimeInt->setEnabled(FALSE);
ButtonGroupTimeSyncTrack->setEnabled(FALSE);
CheckBoxFlipSpec->setEnabled(FALSE);
EdtFrequency->setText("0");
EdtFrequency->setEnabled(FALSE);
GroupBoxInterfRej->setEnabled(FALSE);
/* Only audio spectrum makes sence for MDI in */
ListViewCharSel->setSelected(pListItAudSpec, TRUE);
ListViewCharSel->setOpen(pSpectrumLiViIt, TRUE);
MainPlot->SetupChart(CDRMPlot::AUDIO_SPECTRUM);
}
else
{
/* Set chart type */
switch (pDRMRec->iSysEvalDlgPlotType)
{
case (int) CDRMPlot::POWER_SPEC_DENSITY:
ListViewCharSel->setOpen(pSpectrumLiViIt, TRUE);
ListViewCharSel->setSelected(pListItPowSpecDens, TRUE);
MainPlot->SetupChart(CDRMPlot::POWER_SPEC_DENSITY);
break;
case (int) CDRMPlot::INPUTSPECTRUM_NO_AV:
ListViewCharSel->setOpen(pSpectrumLiViIt, TRUE);
ListViewCharSel->setSelected(pListItInpSpectrNoAv, TRUE);
MainPlot->SetupChart(CDRMPlot::INPUTSPECTRUM_NO_AV);
break;
case (int) CDRMPlot::AUDIO_SPECTRUM:
ListViewCharSel->setOpen(pSpectrumLiViIt, TRUE);
ListViewCharSel->setSelected(pListItAudSpec, TRUE);
MainPlot->SetupChart(CDRMPlot::AUDIO_SPECTRUM);
break;
case (int) CDRMPlot::SNR_SPECTRUM:
ListViewCharSel->setOpen(pSpectrumLiViIt, TRUE);
ListViewCharSel->setSelected(pListItSNRSpec, TRUE);
MainPlot->SetupChart(CDRMPlot::SNR_SPECTRUM);
break;
case (int) CDRMPlot::INP_SPEC_WATERF:
ListViewCharSel->setOpen(pSpectrumLiViIt, TRUE);
ListViewCharSel->setSelected(pListItInpSpecWater, TRUE);
MainPlot->SetupChart(CDRMPlot::INP_SPEC_WATERF);
break;
case (int) CDRMPlot::TRANSFERFUNCTION:
ListViewCharSel->setOpen(pChannelLiViIt, TRUE);
ListViewCharSel->setSelected(pListItChanTF, TRUE);
MainPlot->SetupChart(CDRMPlot::TRANSFERFUNCTION);
break;
case (int) CDRMPlot::AVERAGED_IR:
ListViewCharSel->setOpen(pChannelLiViIt, TRUE);
ListViewCharSel->setSelected(pListItChanIR, TRUE);
MainPlot->SetupChart(CDRMPlot::AVERAGED_IR);
break;
case (int) CDRMPlot::FAC_CONSTELLATION:
ListViewCharSel->setOpen(pConstellationLiViIt, TRUE);
ListViewCharSel->setSelected(pListItConstFAC, TRUE);
MainPlot->SetupChart(CDRMPlot::FAC_CONSTELLATION);
break;
case (int) CDRMPlot::SDC_CONSTELLATION:
ListViewCharSel->setOpen(pConstellationLiViIt, TRUE);
ListViewCharSel->setSelected(pListItConstSDC, TRUE);
MainPlot->SetupChart(CDRMPlot::SDC_CONSTELLATION);
break;
case (int) CDRMPlot::MSC_CONSTELLATION:
ListViewCharSel->setOpen(pConstellationLiViIt, TRUE);
ListViewCharSel->setSelected(pListItConstMSC, TRUE);
MainPlot->SetupChart(CDRMPlot::MSC_CONSTELLATION);
break;
case (int) CDRMPlot::ALL_CONSTELLATION:
ListViewCharSel->setOpen(pConstellationLiViIt, TRUE);
ListViewCharSel->setSelected(pListItConstAll, TRUE);
MainPlot->SetupChart(CDRMPlot::ALL_CONSTELLATION);
break;
case (int) CDRMPlot::FREQ_SAM_OFFS_HIST:
ListViewCharSel->setOpen(pHistoryLiViIt, TRUE);
ListViewCharSel->setSelected(pListItHistFrSa, TRUE);
MainPlot->SetupChart(CDRMPlot::FREQ_SAM_OFFS_HIST);
break;
case (int) CDRMPlot::DOPPLER_DELAY_HIST:
ListViewCharSel->setOpen(pHistoryLiViIt, TRUE);
ListViewCharSel->setSelected(pListItHistDeDo, TRUE);
MainPlot->SetupChart(CDRMPlot::DOPPLER_DELAY_HIST);
break;
case (int) CDRMPlot::SNR_AUDIO_HIST:
ListViewCharSel->setOpen(pHistoryLiViIt, TRUE);
ListViewCharSel->setSelected(pListItHistSNRAu, TRUE);
MainPlot->SetupChart(CDRMPlot::SNR_AUDIO_HIST);
break;
default: /* INPUT_SIG_PSD, includes INPUT_SIG_PSD_ANALOG and NONE_OLD */
ListViewCharSel->setOpen(pSpectrumLiViIt, TRUE);
ListViewCharSel->setSelected(pListItInpPSD, TRUE);
MainPlot->SetupChart(CDRMPlot::INPUT_SIG_PSD);
break;
}
}
#endif
/* Init context menu for list view */
pListViewContextMenu = new QPopupMenu(this, tr("ListView context menu"));
pListViewContextMenu->insertItem(tr("&Open in separate window"), this,
SLOT(OnListViContMenu()));
/* Connect controls ----------------------------------------------------- */
connect(SliderNoOfIterations, SIGNAL(valueChanged(int)),
this, SLOT(OnSliderIterChange(int)));
/* Radio buttons */
connect(RadioButtonTiLinear, SIGNAL(clicked()),
this, SLOT(OnRadioTimeLinear()));
connect(RadioButtonTiWiener, SIGNAL(clicked()),
this, SLOT(OnRadioTimeWiener()));
connect(RadioButtonFreqLinear, SIGNAL(clicked()),
this, SLOT(OnRadioFrequencyLinear()));
connect(RadioButtonFreqDFT, SIGNAL(clicked()),
this, SLOT(OnRadioFrequencyDft()));
connect(RadioButtonFreqWiener, SIGNAL(clicked()),
this, SLOT(OnRadioFrequencyWiener()));
connect(RadioButtonTiSyncEnergy, SIGNAL(clicked()),
this, SLOT(OnRadioTiSyncEnergy()));
connect(RadioButtonTiSyncFirstPeak, SIGNAL(clicked()),
this, SLOT(OnRadioTiSyncFirstPeak()));
/* Char selector list view */
connect(ListViewCharSel, SIGNAL(selectionChanged(QListViewItem*)),
this, SLOT(OnListSelChanged(QListViewItem*)));
connect(ListViewCharSel,
SIGNAL(rightButtonClicked(QListViewItem*, const QPoint&, int)),
this, SLOT(OnListRightButClicked(QListViewItem*, const QPoint&, int)));
/* Buttons */
connect(buttonOk, SIGNAL(clicked()),
this, SLOT(accept()));
/* Check boxes */
connect(CheckBoxFlipSpec, SIGNAL(clicked()),
this, SLOT(OnCheckFlipSpectrum()));
connect(CheckBoxMuteAudio, SIGNAL(clicked()),
this, SLOT(OnCheckBoxMuteAudio()));
connect(CheckBoxWriteLog, SIGNAL(clicked()),
this, SLOT(OnCheckWriteLog()));
connect(CheckBoxSaveAudioWave, SIGNAL(clicked()),
this, SLOT(OnCheckSaveAudioWAV()));
connect(CheckBoxRecFilter, SIGNAL(clicked()),
this, SLOT(OnCheckRecFilter()));
connect(CheckBoxModiMetric, SIGNAL(clicked()),
this, SLOT(OnCheckModiMetric()));
connect(CheckBoxReverb, SIGNAL(clicked()),
this, SLOT(OnCheckBoxReverb()));
/* Timers */
connect(&Timer, SIGNAL(timeout()),
this, SLOT(OnTimer()));
connect(&TimerLogFileLong, SIGNAL(timeout()),
this, SLOT(OnTimerLogFileLong()));
connect(&TimerLogFileShort, SIGNAL(timeout()),
this, SLOT(OnTimerLogFileShort()));
connect(&TimerLogFileStart, SIGNAL(timeout()),
this, SLOT(OnTimerLogFileStart()));
/* Activte real-time timer */
Timer.start(GUI_CONTROL_UPDATE_TIME);
/* Activate delayed log file start if necessary (timer is set to shot
only once) */
if (pDRMRec->GetParameters()->ReceptLog.IsDelLogStart() == TRUE)
{
/* One shot timer */
TimerLogFileStart.start(pDRMRec->GetParameters()->
ReceptLog.GetDelLogStart() * 1000 /* ms */, TRUE);
}
}
systemevalDlg::~systemevalDlg()
{
/* Set window geometry data in DRMReceiver module */
QRect WinGeom = geometry();
pDRMRec->GeomSystemEvalDlg.iXPos = WinGeom.x();
pDRMRec->GeomSystemEvalDlg.iYPos = WinGeom.y();
pDRMRec->GeomSystemEvalDlg.iHSize = WinGeom.height();
pDRMRec->GeomSystemEvalDlg.iWSize = WinGeom.width();
/* Store current plot type. Convert plot type into an integer type.
TODO: better solution */
pDRMRec->iSysEvalDlgPlotType = (int) MainPlot->GetChartType();
/* Call the hide event handler routine to make sure the chart window sizes
and positions are stored */
hideEvent(NULL);
}
void systemevalDlg::UpdateControls()
{
/* Slider for MLC number of iterations */
const int iNumIt = pDRMRec->GetMSCMLC()->GetInitNumIterations();
if (SliderNoOfIterations->value() != iNumIt)
{
/* Update slider and label */
SliderNoOfIterations->setValue(iNumIt);
TextNumOfIterations->setText(tr("MLC: Number of Iterations: ") +
QString().setNum(iNumIt));
}
/* Update for channel estimation and time sync switches */
switch (pDRMRec->GetChanEst()->GetTimeInt())
{
case CChannelEstimation::TLINEAR:
if (!RadioButtonTiLinear->isChecked())
RadioButtonTiLinear->setChecked(TRUE);
break;
case CChannelEstimation::TWIENER:
if (!RadioButtonTiWiener->isChecked())
RadioButtonTiWiener->setChecked(TRUE);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -