📄 analogdemdlg.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 "AnalogDemDlg.h"
AnalogDemDlg::AnalogDemDlg(CDRMReceiver* pNDRMR, QWidget* parent,
const char* name, bool modal, WFlags f) : pDRMRec(pNDRMR),
AnalogDemDlgBase(parent, name, modal, f)
{
/* 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->GeomAnalogDemDlg.iXPos,
pDRMRec->GeomAnalogDemDlg.iYPos,
pDRMRec->GeomAnalogDemDlg.iWSize,
pDRMRec->GeomAnalogDemDlg.iHSize);
if (WinGeom.isValid() && !WinGeom.isEmpty() && !WinGeom.isNull())
setGeometry(WinGeom);
#else /* Under Linux only restore the size */
resize(pDRMRec->GeomAnalogDemDlg.iWSize,
pDRMRec->GeomAnalogDemDlg.iHSize);
#endif
/* Set Menu ***************************************************************/
/* View menu ------------------------------------------------------------ */
QPopupMenu* EvalWinMenu = new QPopupMenu(this);
CHECK_PTR(EvalWinMenu);
EvalWinMenu->insertItem(tr("S&tations Dialog..."), this,
SIGNAL(ViewStationsDlg()), CTRL+Key_T);
EvalWinMenu->insertSeparator();
EvalWinMenu->insertItem(tr("E&xit"), this, SLOT(close()), CTRL+Key_Q);
/* Settings menu ------------------------------------------------------- */
QPopupMenu* pSettingsMenu = new QPopupMenu(this);
CHECK_PTR(pSettingsMenu);
pSettingsMenu->insertItem(tr("&Sound Card Selection"),
new CSoundCardSelMenu(pDRMRec->GetSoundInterface(), this));
pSettingsMenu->insertItem(tr("&DRM (digital)"), this,
SIGNAL(SwitchToDRM()), CTRL+Key_D);
pSettingsMenu->insertItem(tr("New &AM Acquisition"), this,
SLOT(OnNewAMAcquisition()), CTRL+Key_A);
/* Main menu bar -------------------------------------------------------- */
QMenuBar* pMenu = new QMenuBar(this);
CHECK_PTR(pMenu);
pMenu->insertItem(tr("&View"), EvalWinMenu);
pMenu->insertItem(tr("&Settings"), pSettingsMenu);
pMenu->insertItem(tr("&?"), new CDreamHelpMenu(this));
pMenu->setSeparator(QMenuBar::InWindowsStyle);
/* Now tell the layout about the menu */
AnalogDemDlgBaseLayout->setMenuBar(pMenu);
/* Init main plot */
MainPlot->SetRecObj(pDRMRec);
MainPlot->SetPlotStyle(pDRMRec->iMainPlotColorStyle);
MainPlot->setMargin(1);
MainPlot->SetupChart(CDRMPlot::INPUT_SIG_PSD_ANALOG);
/* Add tool tip to show the user the possibility of choosing the AM IF */
QToolTip::add(MainPlot,
tr("Click on the plot to set the demodulation frequency"));
/* Set default settings -> AM: 10 kHz; SSB: 5 kHz; medium AGC */
iBwLSB = 5000; /* Hz */
iBwUSB = 5000; /* Hz */
iBwCW = 150; /* Hz */
iBwFM = 6000; /* Hz */
iBwAM = 10000; /* Hz */
pDRMRec->GetAMDemod()->SetDemodType(CAMDemodulation::DT_AM);
pDRMRec->GetAMDemod()->SetFilterBW(iBwAM);
pDRMRec->GetAMDemod()->SetAGCType(CAGC::AT_MEDIUM);
/* Init slider control for bandwidth setting */
SliderBandwidth->setRange(0, SOUNDCRD_SAMPLE_RATE / 2);
SliderBandwidth->setTickmarks(QSlider::Both);
SliderBandwidth->setTickInterval(1000); /* Each kHz a tick */
SliderBandwidth->setPageStep(1000); /* Hz */
/* Init PLL phase dial control */
PhaseDial->setMode(QwtDial::RotateNeedle);
PhaseDial->setWrapping(true);
PhaseDial->setReadOnly(true);
PhaseDial->setScale(0, 360, 45); /* Degrees */
PhaseDial->setOrigin(270);
PhaseDial->setNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow));
PhaseDial->setFrameShadow(QwtDial::Plain);
PhaseDial->setScaleOptions(QwtDial::ScaleTicks);
/* Update controls */
UpdateControls();
/* Connect controls ----------------------------------------------------- */
connect(ButtonDRM, SIGNAL(clicked()), this, SIGNAL(SwitchToDRM()));
connect(MainPlot, SIGNAL(xAxisValSet(double)),
this, SLOT(OnChartxAxisValSet(double)));
connect(ButtonWaterfall, SIGNAL(clicked()),
this, SLOT(OnButtonWaterfall()));
/* Button groups */
connect(ButtonGroupDemodulation, SIGNAL(clicked(int)),
this, SLOT(OnRadioDemodulation(int)));
connect(ButtonGroupAGC, SIGNAL(clicked(int)),
this, SLOT(OnRadioAGC(int)));
connect(ButtonGroupNoiseReduction, SIGNAL(clicked(int)),
this, SLOT(OnRadioNoiRed(int)));
/* Slider */
connect(SliderBandwidth, SIGNAL(valueChanged(int)),
this, SLOT(OnSliderBWChange(int)));
/* Check boxes */
connect(CheckBoxMuteAudio, SIGNAL(clicked()),
this, SLOT(OnCheckBoxMuteAudio()));
connect(CheckBoxSaveAudioWave, SIGNAL(clicked()),
this, SLOT(OnCheckSaveAudioWAV()));
connect(CheckBoxAutoFreqAcq, SIGNAL(clicked()),
this, SLOT(OnCheckAutoFreqAcq()));
connect(CheckBoxPLL, SIGNAL(clicked()),
this, SLOT(OnCheckPLL()));
/* Timers */
connect(&Timer, SIGNAL(timeout()),
this, SLOT(OnTimer()));
connect(&TimerPLLPhaseDial, SIGNAL(timeout()),
this, SLOT(OnTimerPLLPhaseDial()));
/* Activte real-time timers */
Timer.start(GUI_CONTROL_UPDATE_TIME);
TimerPLLPhaseDial.start(PLL_PHASE_DIAL_UPDATE_TIME);
}
void AnalogDemDlg::closeEvent(QCloseEvent* pEvent)
{
/* Set window geometry data in DRMReceiver module */
QRect WinGeom = geometry();
pDRMRec->GeomAnalogDemDlg.iXPos = WinGeom.x();
pDRMRec->GeomAnalogDemDlg.iYPos = WinGeom.y();
pDRMRec->GeomAnalogDemDlg.iHSize = WinGeom.height();
pDRMRec->GeomAnalogDemDlg.iWSize = WinGeom.width();
/* Tell the invisible main window to close, too */
emit Closed();
}
void AnalogDemDlg::UpdateControls()
{
/* Set demodulation type */
switch (pDRMRec->GetAMDemod()->GetDemodType())
{
case CAMDemodulation::DT_AM:
if (!RadioButtonDemAM->isChecked())
RadioButtonDemAM->setChecked(TRUE);
break;
case CAMDemodulation::DT_LSB:
if (!RadioButtonDemLSB->isChecked())
RadioButtonDemLSB->setChecked(TRUE);
break;
case CAMDemodulation::DT_USB:
if (!RadioButtonDemUSB->isChecked())
RadioButtonDemUSB->setChecked(TRUE);
break;
case CAMDemodulation::DT_CW:
if (!RadioButtonDemCW->isChecked())
RadioButtonDemCW->setChecked(TRUE);
break;
case CAMDemodulation::DT_FM:
if (!RadioButtonDemFM->isChecked())
RadioButtonDemFM->setChecked(TRUE);
break;
}
/* Set AGC type */
switch (pDRMRec->GetAMDemod()->GetAGCType())
{
case CAGC::AT_NO_AGC:
if (!RadioButtonAGCOff->isChecked())
RadioButtonAGCOff->setChecked(TRUE);
break;
case CAGC::AT_SLOW:
if (!RadioButtonAGCSlow->isChecked())
RadioButtonAGCSlow->setChecked(TRUE);
break;
case CAGC::AT_MEDIUM:
if (!RadioButtonAGCMed->isChecked())
RadioButtonAGCMed->setChecked(TRUE);
break;
case CAGC::AT_FAST:
if (!RadioButtonAGCFast->isChecked())
RadioButtonAGCFast->setChecked(TRUE);
break;
}
/* Set noise reduction type */
switch (pDRMRec->GetAMDemod()->GetNoiRedType())
{
case CAMDemodulation::NR_OFF:
if (!RadioButtonNoiRedOff->isChecked())
RadioButtonNoiRedOff->setChecked(TRUE);
break;
case CAMDemodulation::NR_LOW:
if (!RadioButtonNoiRedLow->isChecked())
RadioButtonNoiRedLow->setChecked(TRUE);
break;
case CAMDemodulation::NR_MEDIUM:
if (!RadioButtonNoiRedMed->isChecked())
RadioButtonNoiRedMed->setChecked(TRUE);
break;
case CAMDemodulation::NR_HIGH:
if (!RadioButtonNoiRedHigh->isChecked())
RadioButtonNoiRedHigh->setChecked(TRUE);
break;
}
/* Set filter bandwidth */
SliderBandwidth->setValue(pDRMRec->GetAMDemod()->GetFilterBW());
TextLabelBandWidth->setText(QString().setNum(
pDRMRec->GetAMDemod()->GetFilterBW()) + tr(" Hz"));
/* Update check boxes */
CheckBoxMuteAudio->setChecked(pDRMRec->GetWriteData()->GetMuteAudio());
CheckBoxSaveAudioWave->
setChecked(pDRMRec->GetWriteData()->GetIsWriteWaveFile());
CheckBoxAutoFreqAcq->
setChecked(pDRMRec->GetAMDemod()->AutoFreqAcqEnabled());
CheckBoxPLL->setChecked(pDRMRec->GetAMDemod()->PLLEnabled());
}
void AnalogDemDlg::OnTimer()
{
/* Carrier frequency of AM signal */
TextFreqOffset->setText(tr("Carrier<br>Frequency:<b><br>") +
QString().setNum(pDRMRec->GetAMDemod()->GetCurMixFreqOffs(), 'f', 2) +
" Hz</b>");
}
void AnalogDemDlg::OnTimerPLLPhaseDial()
{
CReal rCurPLLPhase;
if (pDRMRec->GetAMDemod()->GetPLLPhase(rCurPLLPhase) == TRUE)
{
/* Set current PLL phase (convert radiant in degree) */
PhaseDial->setValue(rCurPLLPhase * (CReal) 360.0 / (2 * crPi));
/* Check if control is enabled */
if (!PhaseDial->isEnabled())
PhaseDial->setEnabled(true);
}
else
{
/* Reset dial */
PhaseDial->setValue((CReal) 0.0);
/* Check if control is disabled */
if (PhaseDial->isEnabled())
PhaseDial->setEnabled(false);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -