From 916a20271b7d81edc40dfc18468634311172c952 Mon Sep 17 00:00:00 2001 From: trondeau Date: Sat, 28 Feb 2009 03:41:15 +0000 Subject: [PATCH] some cleanup as well as adding a way to pass the Qapplication between sinks that allows multiple GUIs to be defined and run. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10535 221aa14e-8319-0410-a670-987f0aec2ac5 --- gr-qtgui/src/lib/Makefile.am | 6 +- gr-qtgui/src/lib/SpectrumGUIClass.cc | 7 +- gr-qtgui/src/lib/qtgui.i | 31 ++++++--- gr-qtgui/src/lib/qtgui_sink_c.cc | 36 ++++++++-- gr-qtgui/src/lib/qtgui_sink_c.h | 10 ++- gr-qtgui/src/lib/spectrumdisplayform.cc | 93 +++++++++++++++++-------- gr-qtgui/src/lib/spectrumdisplayform.ui | 57 +++++++-------- gr-qtgui/src/python/qttest_c.py | 20 ++++-- 8 files changed, 173 insertions(+), 87 deletions(-) diff --git a/gr-qtgui/src/lib/Makefile.am b/gr-qtgui/src/lib/Makefile.am index b3912100..41281e68 100644 --- a/gr-qtgui/src/lib/Makefile.am +++ b/gr-qtgui/src/lib/Makefile.am @@ -76,12 +76,12 @@ lib_LTLIBRARIES = libqtgui.la # These are the source files that go into the shared library libqtgui_la_SOURCES = \ - spectrumdisplayform.cc \ FrequencyDisplayPlot.cc \ TimeDomainDisplayPlot.cc \ WaterfallDisplayPlot.cc \ Waterfall3DDisplayPlot.cc \ waterfallGlobalData.cc \ + spectrumdisplayform.cc \ SpectrumGUIClass.cc \ spectrumUpdateEvents.cc \ plot_waterfall.cc \ @@ -95,15 +95,15 @@ _qtgui_la_SOURCES = \ # These headers get installed in ${prefix}/include/gnuradio grinclude_HEADERS = \ - spectrumdisplayform.h \ FrequencyDisplayPlot.h \ TimeDomainDisplayPlot.h \ WaterfallDisplayPlot.h \ Waterfall3DDisplayPlot.h \ - SpectrumGUIClass.h \ waterfallGlobalData.h \ highResTimeFunctions.h \ plot_waterfall.h \ + spectrumdisplayform.h \ + SpectrumGUIClass.h \ spectrumUpdateEvents.h \ qtgui.h \ qtgui_sink_c.h \ diff --git a/gr-qtgui/src/lib/SpectrumGUIClass.cc b/gr-qtgui/src/lib/SpectrumGUIClass.cc index a57395a6..f9988d8f 100644 --- a/gr-qtgui/src/lib/SpectrumGUIClass.cc +++ b/gr-qtgui/src/lib/SpectrumGUIClass.cc @@ -9,7 +9,8 @@ const long SpectrumGUIClass::MAX_FFT_SIZE; const long SpectrumGUIClass::MIN_FFT_SIZE; -SpectrumGUIClass::SpectrumGUIClass(const uint64_t maxDataSize, const uint64_t fftSize, const double newStartFrequency, const double newStopFrequency){ +SpectrumGUIClass::SpectrumGUIClass(const uint64_t maxDataSize, const uint64_t fftSize, + const double newStartFrequency, const double newStopFrequency){ _dataPoints = maxDataSize; if(_dataPoints < 2){ _dataPoints = 2; @@ -102,7 +103,9 @@ void SpectrumGUIClass::OpenSpectrumWindow(QWidget* parent){ void SpectrumGUIClass::Reset(){ if(GetWindowOpenFlag()){ - qApp->postEvent(_spectrumDisplayForm, new SpectrumFrequencyRangeEvent(_centerFrequency, _startFrequency, _stopFrequency)); + qApp->postEvent(_spectrumDisplayForm, new SpectrumFrequencyRangeEvent(_centerFrequency, + _startFrequency, + _stopFrequency)); qApp->postEvent(_spectrumDisplayForm, new SpectrumWindowResetEvent()); } _droppedEntriesCount = 0; diff --git a/gr-qtgui/src/lib/qtgui.i b/gr-qtgui/src/lib/qtgui.i index 129e9269..eba37833 100644 --- a/gr-qtgui/src/lib/qtgui.i +++ b/gr-qtgui/src/lib/qtgui.i @@ -30,40 +30,51 @@ GR_SWIG_BLOCK_MAGIC(qtgui,sink_c) qtgui_sink_c_sptr qtgui_make_sink_c (int fftsize, int wintype, - float fmin=-0.5, float fmax=0.5, const std::string &name="Display"); + float fmin=-0.5, float fmax=0.5, + const std::string &name="Display"); class qtgui_sink_c : public gr_block { private: friend qtgui_sink_c_sptr qtgui_make_sink_c (int fftsize, int wintype, - float fmin, float fmax, const std::string &name); + float fmin, float fmax, + const std::string &name); qtgui_sink_c (int fftsize, int wintype, float fmin, float fmax, const std::string &name); public: void start_app(); - + void initialize(); + void initialize(QApplication *qapp); + QApplication* get_qapplication(); }; -/****************************************************************************************/ +/*********************************************************************/ GR_SWIG_BLOCK_MAGIC(qtgui,sink_f) -qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, const std::vector &window, - float fmin, float fmax, const std::string &name="Display"); +qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, + const std::vector &window, + float fmin, float fmax, + const std::string &name="Display"); class qtgui_sink_f : public gr_block { private: - friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, const std::vector &window, - float fmin, float fmax, const std::string &name); - qtgui_sink_fy (int fftsize, const std::vector &window, - float fmin, float fmax, const std::string &name); + friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, + const std::vector &window, + float fmin, float fmax, + const std::string &name); + qtgui_sink_f (int fftsize, + const std::vector &window, + float fmin, float fmax, + const std::string &name); public: void start_app(); }; + diff --git a/gr-qtgui/src/lib/qtgui_sink_c.cc b/gr-qtgui/src/lib/qtgui_sink_c.cc index eaef58d6..fdd069e7 100644 --- a/gr-qtgui/src/lib/qtgui_sink_c.cc +++ b/gr-qtgui/src/lib/qtgui_sink_c.cc @@ -40,7 +40,7 @@ qtgui_make_sink_c (int fftsize, int wintype, qtgui_sink_c::qtgui_sink_c (int fftsize, int wintype, float fmin, float fmax, const std::string &name) : gr_block ("sink_c", - gr_make_io_signature (1, 1, sizeof(gr_complex)), + gr_make_io_signature (1, -1, sizeof(gr_complex)), gr_make_io_signature (0, 0, 0)), d_fftsize(fftsize), d_wintype((gr_firdes::win_type)(wintype)), d_fmin(fmin), d_fmax(fmax), d_name(name) @@ -59,10 +59,13 @@ qtgui_sink_c::qtgui_sink_c (int fftsize, int wintype, d_residbuf = new gr_complex[d_fftsize]; buildwindow(); + + //initialize(); } qtgui_sink_c::~qtgui_sink_c() { + delete d_object; delete [] d_fftdata; delete [] d_residbuf; delete d_main_gui; @@ -79,13 +82,27 @@ void qtgui_sink_c::unlock() pthread_mutex_unlock(&d_pmutex); } + void -qtgui_sink_c::start_app() +qtgui_sink_c::initialize() { int argc; char **argv = NULL; d_qApplication = new QApplication(argc, argv); + __initialize(); +} + +void +qtgui_sink_c::initialize(QApplication *qapp) +{ + d_qApplication = qapp; + __initialize(); +} + +void +qtgui_sink_c::__initialize() +{ uint64_t maxBufferSize = 32768; d_main_gui = new SpectrumGUIClass(maxBufferSize, d_fftsize, d_fmin, d_fmax); d_main_gui->SetDisplayTitle(d_name); @@ -93,9 +110,20 @@ qtgui_sink_c::start_app() d_main_gui->SetWindowType((int)d_wintype); d_main_gui->OpenSpectrumWindow(NULL); - qtgui_obj object(d_qApplication); - qApp->postEvent(&object, new qtgui_event(&d_pmutex)); + d_object = new qtgui_obj(d_qApplication); + qApp->postEvent(d_object, new qtgui_event(&d_pmutex)); +} + +QApplication* +qtgui_sink_c::get_qapplication() +{ + return d_qApplication; +} + +void +qtgui_sink_c::start_app() +{ d_qApplication->exec(); } diff --git a/gr-qtgui/src/lib/qtgui_sink_c.h b/gr-qtgui/src/lib/qtgui_sink_c.h index a6bd59f2..a1eb0564 100644 --- a/gr-qtgui/src/lib/qtgui_sink_c.h +++ b/gr-qtgui/src/lib/qtgui_sink_c.h @@ -44,6 +44,8 @@ private: float fmin, float fmax, const std::string &name); qtgui_sink_c (int fftsize, int wintype, float fmin, float fmax, const std::string &name); + + void __initialize(); int d_fftsize; gr_firdes::win_type d_wintype; @@ -70,12 +72,16 @@ private: public: ~qtgui_sink_c(); + void initialize(); + void initialize(QApplication *qapp); void start_app(); void lock(); void unlock(); - QApplication *d_qApplication -; + QApplication* get_qapplication(); + + QApplication *d_qApplication; + qtgui_obj *d_object; int general_work (int noutput_items, gr_vector_int &ninput_items, diff --git a/gr-qtgui/src/lib/spectrumdisplayform.cc b/gr-qtgui/src/lib/spectrumdisplayform.cc index 481a5526..e0b43ae3 100644 --- a/gr-qtgui/src/lib/spectrumdisplayform.cc +++ b/gr-qtgui/src/lib/spectrumdisplayform.cc @@ -123,7 +123,8 @@ void SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumU _AverageHistory(_realFFTDataPoints); double sumMean; - const double fft_bin_size = (_stopFrequency-_startFrequency) / static_cast(numFFTDataPoints); + const double fft_bin_size = (_stopFrequency-_startFrequency) / + static_cast(numFFTDataPoints); // find the peak, sum (for mean), etc _peakAmplitude = -HUGE_VAL; @@ -161,14 +162,22 @@ void SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumU } if(lastOfMultipleUpdatesFlag){ - _frequencyDisplayPlot->PlotNewData(_averagedValues, numFFTDataPoints, _noiseFloorAmplitude, _peakFrequency, _peakAmplitude); - _timeDomainDisplayPlot->PlotNewData(realTimeDomainDataPoints, imagTimeDomainDataPoints, numTimeDomainDataPoints); + _frequencyDisplayPlot->PlotNewData(_averagedValues, numFFTDataPoints, + _noiseFloorAmplitude, _peakFrequency, + _peakAmplitude); + _timeDomainDisplayPlot->PlotNewData(realTimeDomainDataPoints, + imagTimeDomainDataPoints, + numTimeDomainDataPoints); } // Don't update the repeated data for the waterfall if(!repeatDataFlag){ - _waterfallDisplayPlot->PlotNewData(_realFFTDataPoints, numFFTDataPoints, timePerFFT, dataTimestamp, spectrumUpdateEvent->getDroppedFFTFrames()); + _waterfallDisplayPlot->PlotNewData(_realFFTDataPoints, numFFTDataPoints, + timePerFFT, dataTimestamp, + spectrumUpdateEvent->getDroppedFFTFrames()); if( _openGLWaterfall3DFlag == 1 ){ - _waterfall3DDisplayPlot->PlotNewData(_realFFTDataPoints, numFFTDataPoints, timePerFFT, dataTimestamp, spectrumUpdateEvent->getDroppedFFTFrames()); + _waterfall3DDisplayPlot->PlotNewData(_realFFTDataPoints, numFFTDataPoints, + timePerFFT, dataTimestamp, + spectrumUpdateEvent->getDroppedFFTFrames()); } } @@ -190,42 +199,70 @@ void SpectrumDisplayForm::resizeEvent( QResizeEvent *e ) SpectrumTypeTab->resize( e->size().width(), SpectrumTypeTab->height()); // Tell the TabXFreqDisplay to resize - Tab1PlotDisplayFrame->resize(e->size().width()-4, Tab1PlotDisplayFrame->height()); - Tab2PlotDisplayFrame->resize(e->size().width()-4, Tab2PlotDisplayFrame->height()); - Waterfall3DPlotDisplayFrame->resize(e->size().width()-4, Waterfall3DPlotDisplayFrame->height()); - TimeDomainDisplayFrame->resize(e->size().width()-4, TimeDomainDisplayFrame->height()); - _frequencyDisplayPlot->resize( Tab1PlotDisplayFrame->width()-4, Tab1PlotDisplayFrame->height()); - _waterfallDisplayPlot->resize( Tab2PlotDisplayFrame->width()-4, Tab2PlotDisplayFrame->height()); - _waterfall3DDisplayPlot->resize( Waterfall3DPlotDisplayFrame->width()-4, Waterfall3DPlotDisplayFrame->height()); - _timeDomainDisplayPlot->resize( TimeDomainDisplayFrame->width()-4, TimeDomainDisplayFrame->height()); + Tab1PlotDisplayFrame->resize(e->size().width()-4, + Tab1PlotDisplayFrame->height()); + Tab2PlotDisplayFrame->resize(e->size().width()-4, + Tab2PlotDisplayFrame->height()); + Waterfall3DPlotDisplayFrame->resize(e->size().width()-4, + Waterfall3DPlotDisplayFrame->height()); + TimeDomainDisplayFrame->resize(e->size().width()-4, + TimeDomainDisplayFrame->height()); + _frequencyDisplayPlot->resize( Tab1PlotDisplayFrame->width()-4, + Tab1PlotDisplayFrame->height()); + _waterfallDisplayPlot->resize( Tab2PlotDisplayFrame->width()-4, + Tab2PlotDisplayFrame->height()); + _waterfall3DDisplayPlot->resize( Waterfall3DPlotDisplayFrame->width()-4, + Waterfall3DPlotDisplayFrame->height()); + _timeDomainDisplayPlot->resize( TimeDomainDisplayFrame->width()-4, + TimeDomainDisplayFrame->height()); // Move the IntensityWheels and Labels - WaterfallMaximumIntensityLabel->move(width() - 5 - WaterfallMaximumIntensityLabel->width(), WaterfallMaximumIntensityLabel->y()); - WaterfallMinimumIntensityLabel->move(width() - 5 - WaterfallMinimumIntensityLabel->width(), WaterfallMinimumIntensityLabel->y()); - WaterfallMaximumIntensityWheel->resize(WaterfallMaximumIntensityLabel->x() - 5 - WaterfallMaximumIntensityWheel->x(), WaterfallMaximumIntensityWheel->height()); - WaterfallMinimumIntensityWheel->resize(WaterfallMinimumIntensityLabel->x() - 5 - WaterfallMinimumIntensityWheel->x(), WaterfallMinimumIntensityWheel->height()); - - Waterfall3DMaximumIntensityLabel->move(width() - 5 - Waterfall3DMaximumIntensityLabel->width(), Waterfall3DMaximumIntensityLabel->y()); - Waterfall3DMinimumIntensityLabel->move(width() - 5 - Waterfall3DMinimumIntensityLabel->width(), Waterfall3DMinimumIntensityLabel->y()); - Waterfall3DMaximumIntensityWheel->resize(Waterfall3DMaximumIntensityLabel->x() - 5 - Waterfall3DMaximumIntensityWheel->x(), Waterfall3DMaximumIntensityWheel->height()); - Waterfall3DMinimumIntensityWheel->resize(Waterfall3DMinimumIntensityLabel->x() - 5 - Waterfall3DMinimumIntensityWheel->x(), Waterfall3DMinimumIntensityWheel->height()); + WaterfallMaximumIntensityLabel->move(width() - 5 - WaterfallMaximumIntensityLabel->width(), + WaterfallMaximumIntensityLabel->y()); + WaterfallMinimumIntensityLabel->move(width() - 5 - WaterfallMinimumIntensityLabel->width(), + WaterfallMinimumIntensityLabel->y()); + WaterfallMaximumIntensityWheel->resize(WaterfallMaximumIntensityLabel->x() - 5 - + WaterfallMaximumIntensityWheel->x(), + WaterfallMaximumIntensityWheel->height()); + WaterfallMinimumIntensityWheel->resize(WaterfallMinimumIntensityLabel->x() - 5 - + WaterfallMinimumIntensityWheel->x(), + WaterfallMinimumIntensityWheel->height()); + + Waterfall3DMaximumIntensityLabel->move(width() - 5 - + Waterfall3DMaximumIntensityLabel->width(), + Waterfall3DMaximumIntensityLabel->y()); + Waterfall3DMinimumIntensityLabel->move(width() - 5 - + Waterfall3DMinimumIntensityLabel->width(), + Waterfall3DMinimumIntensityLabel->y()); + Waterfall3DMaximumIntensityWheel->resize(Waterfall3DMaximumIntensityLabel->x() - 5 - + Waterfall3DMaximumIntensityWheel->x(), + Waterfall3DMaximumIntensityWheel->height()); + Waterfall3DMinimumIntensityWheel->resize(Waterfall3DMinimumIntensityLabel->x() - 5 - + Waterfall3DMinimumIntensityWheel->x(), + Waterfall3DMinimumIntensityWheel->height()); // Move the Power Lbl - PowerLabel->move(e->size().width()-(415-324) - PowerLabel->width(), PowerLabel->y()); + PowerLabel->move(e->size().width()-(415-324) - PowerLabel->width(), + PowerLabel->y()); // Move the Power Line Edit - PowerLineEdit->move(e->size().width()-(415-318) - PowerLineEdit->width(), PowerLineEdit->y()); + PowerLineEdit->move(e->size().width()-(415-318) - PowerLineEdit->width(), + PowerLineEdit->y()); // Move the Avg Lbl - AvgLabel->move(e->size().width()-(415-406) - AvgLabel->width(), AvgLabel->y()); + AvgLabel->move(e->size().width()-(415-406) - AvgLabel->width(), + AvgLabel->y()); // Move the Avg Line Edit - AvgLineEdit->move(e->size().width()-(415-400) - AvgLineEdit->width(), AvgLineEdit->y()); + AvgLineEdit->move(e->size().width()-(415-400) - AvgLineEdit->width(), + AvgLineEdit->y()); // Move the FFT Size Combobox and label - FFTSizeComboBox->move(width() - 5 - FFTSizeComboBox->width(), FFTSizeComboBox->y()); - FFTSizeLabel->move(width() - 10 - FFTSizeComboBox->width() - FFTSizeLabel->width(), FFTSizeLabel->y()); + FFTSizeComboBox->move(width() - 5 - FFTSizeComboBox->width(), + FFTSizeComboBox->y()); + FFTSizeLabel->move(width() - 10 - FFTSizeComboBox->width() - FFTSizeLabel->width(), + FFTSizeLabel->y()); } diff --git a/gr-qtgui/src/lib/spectrumdisplayform.ui b/gr-qtgui/src/lib/spectrumdisplayform.ui index f75022f3..aac323da 100644 --- a/gr-qtgui/src/lib/spectrumdisplayform.ui +++ b/gr-qtgui/src/lib/spectrumdisplayform.ui @@ -5,7 +5,7 @@ 0 0 - 637 + 633 436 @@ -157,6 +157,9 @@ 380 + + 0 + Frequency Display @@ -355,7 +358,7 @@ - + 215 @@ -370,19 +373,16 @@ Qt::WheelFocus - + true - - Qt::Horizontal - - + 200.000000000000000 - + 20.000000000000000 - + 0.000000000000000 @@ -418,7 +418,7 @@ QFrame::Plain - + 215 @@ -427,19 +427,16 @@ 24 - + true - - Qt::Horizontal - - + 200.000000000000000 - + 20.000000000000000 - + 0.000000000000000 @@ -528,7 +525,7 @@ Auto Scale - + 215 @@ -537,19 +534,16 @@ 24 - + true - - Qt::Horizontal - - + 200.000000000000000 - + 20.000000000000000 - + 0.000000000000000 @@ -620,7 +614,7 @@ - + 215 @@ -635,19 +629,16 @@ Qt::WheelFocus - + true - - Qt::Horizontal - - + 200.000000000000000 - + 20.000000000000000 - + 0.000000000000000 diff --git a/gr-qtgui/src/python/qttest_c.py b/gr-qtgui/src/python/qttest_c.py index 40d1f42b..c681c84a 100755 --- a/gr-qtgui/src/python/qttest_c.py +++ b/gr-qtgui/src/python/qttest_c.py @@ -7,21 +7,31 @@ class my_top_block(gr.top_block): def __init__(self): gr.top_block.__init__(self) + Rs = 8000 + f1 = 1000 + f2 = 2000 + fftsize = 2048 - src1 = gr.sig_source_c(1, gr.GR_SIN_WAVE, 0.1, 0.01, 0) - src2 = gr.sig_source_c(1, gr.GR_SIN_WAVE, 0.015, 0.01, 0) + src1 = gr.sig_source_c(Rs, gr.GR_SIN_WAVE, f1, 0.1, 0) + src2 = gr.sig_source_c(Rs, gr.GR_SIN_WAVE, f2, 0.1, 0) src = gr.add_cc() thr = gr.throttle(gr.sizeof_gr_complex, 20*fftsize) - self.snk = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS, -0.5, 0.5) + self.snk1 = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS, -Rs/2, Rs/2) + self.snk2 = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS, -Rs/2, Rs/2) self.connect(src1, (src,0)) self.connect(src2, (src,1)) - self.connect(src, thr, self.snk) + self.connect(src, thr, self.snk1) + self.connect(src1, self.snk2) + self.snk1.initialize() + qapp = self.snk1.get_qapplication() + self.snk2.initialize(qapp) + if __name__ == "__main__": tb = my_top_block(); tb.start() - tb.snk.start_app(); + tb.snk1.start_app(); #tb.wait(); -- 2.30.2