summaryrefslogtreecommitdiff
path: root/gr-qtgui/lib/freqdisplayform.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-qtgui/lib/freqdisplayform.cc')
-rw-r--r--gr-qtgui/lib/freqdisplayform.cc162
1 files changed, 162 insertions, 0 deletions
diff --git a/gr-qtgui/lib/freqdisplayform.cc b/gr-qtgui/lib/freqdisplayform.cc
new file mode 100644
index 0000000000..410bb4a048
--- /dev/null
+++ b/gr-qtgui/lib/freqdisplayform.cc
@@ -0,0 +1,162 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio 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 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <cmath>
+#include <QMessageBox>
+#include <freqdisplayform.h>
+#include <iostream>
+
+FreqDisplayForm::FreqDisplayForm(int nplots, QWidget* parent)
+ : DisplayForm(nplots, parent)
+{
+ _intValidator = new QIntValidator(this);
+ _intValidator->setBottom(0);
+
+ _layout = new QGridLayout(this);
+ _displayPlot = new FrequencyDisplayPlot(nplots, this);
+ _layout->addWidget(_displayPlot, 0, 0);
+ setLayout(_layout);
+
+ _numRealDataPoints = 1024;
+ _fftsize = 1024;
+ _fftavg = 1.0;
+
+ FFTSizeMenu *sizemenu = new FFTSizeMenu(this);
+ FFTAverageMenu *avgmenu = new FFTAverageMenu(this);
+ FFTWindowMenu *winmenu = new FFTWindowMenu(this);
+ _menu->addMenu(sizemenu);
+ _menu->addMenu(avgmenu);
+ _menu->addMenu(winmenu);
+ connect(sizemenu, SIGNAL(whichTrigger(int)),
+ this, SLOT(setFFTSize(const int)));
+ connect(avgmenu, SIGNAL(whichTrigger(float)),
+ this, SLOT(setFFTAverage(const float)));
+ connect(winmenu, SIGNAL(whichTrigger(gr::filter::firdes::win_type)),
+ this, SLOT(setFFTWindowType(const gr::filter::firdes::win_type)));
+
+ Reset();
+
+ connect(_displayPlot, SIGNAL(plotPointSelected(const QPointF)),
+ this, SLOT(onPlotPointSelected(const QPointF)));
+}
+
+FreqDisplayForm::~FreqDisplayForm()
+{
+ // Qt deletes children when parent is deleted
+
+ // Don't worry about deleting Display Plots - they are deleted when parents are deleted
+ delete _intValidator;
+}
+
+FrequencyDisplayPlot*
+FreqDisplayForm::getPlot()
+{
+ return ((FrequencyDisplayPlot*)_displayPlot);
+}
+
+void
+FreqDisplayForm::newData(const QEvent *updateEvent)
+{
+ FreqUpdateEvent *fevent = (FreqUpdateEvent*)updateEvent;
+ const std::vector<double*> dataPoints = fevent->getPoints();
+ const uint64_t numDataPoints = fevent->getNumDataPoints();
+
+ getPlot()->PlotNewData(dataPoints, numDataPoints,
+ 0, 0, 0, d_update_time);
+}
+
+void
+FreqDisplayForm::customEvent( QEvent * e)
+{
+ if(e->type() == FreqUpdateEvent::Type()) {
+ newData(e);
+ }
+}
+
+int
+FreqDisplayForm::getFFTSize() const
+{
+ return _fftsize;
+}
+
+float
+FreqDisplayForm::getFFTAverage() const
+{
+ return _fftavg;
+}
+
+gr::filter::firdes::win_type
+FreqDisplayForm::getFFTWindowType() const
+{
+ return _fftwintype;
+}
+
+void
+FreqDisplayForm::setFFTSize(const int newsize)
+{
+ _fftsize = newsize;
+}
+
+void
+FreqDisplayForm::setFFTAverage(const float newavg)
+{
+ _fftavg = newavg;
+ getPlot()->replot();
+}
+
+void
+FreqDisplayForm::setFFTWindowType(const gr::filter::firdes::win_type newwin)
+{
+ _fftwintype = newwin;
+}
+
+void
+FreqDisplayForm::setFrequencyRange(const double newCenterFrequency,
+ const double newStartFrequency,
+ const double newStopFrequency)
+{
+ double fdiff = std::max(fabs(newStartFrequency), fabs(newStopFrequency));
+
+ if(fdiff > 0) {
+ std::string strunits[4] = {"Hz", "kHz", "MHz", "GHz"};
+ double units10 = floor(log10(fdiff));
+ double units3 = std::max(floor(units10 / 3.0), 0.0);
+ double units = pow(10, (units10-fmod(units10, 3.0)));
+ int iunit = static_cast<int>(units3);
+
+ _startFrequency = newStartFrequency;
+ _stopFrequency = newStopFrequency;
+ double centerFrequency = newCenterFrequency;
+
+ getPlot()->SetFrequencyRange(_startFrequency,
+ _stopFrequency,
+ centerFrequency,
+ true,
+ units, strunits[iunit]);
+ }
+}
+
+void
+FreqDisplayForm::setYaxis(double min, double max)
+{
+ getPlot()->setYaxis(min, max);
+}