[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r10850 - in gnuradio/trunk: config gr-qtgui/src/lib gr
From: |
trondeau |
Subject: |
[Commit-gnuradio] r10850 - in gnuradio/trunk: config gr-qtgui/src/lib gr-qtgui/src/python |
Date: |
Tue, 14 Apr 2009 21:49:04 -0600 (MDT) |
Author: trondeau
Date: 2009-04-14 21:49:04 -0600 (Tue, 14 Apr 2009)
New Revision: 10850
Added:
gnuradio/trunk/gr-qtgui/src/python/pyqt_example.py
gnuradio/trunk/gr-qtgui/src/python/pyqt_example_f.py
gnuradio/trunk/gr-qtgui/src/python/usrp2_display.py
gnuradio/trunk/gr-qtgui/src/python/usrp_display.py
Removed:
gnuradio/trunk/gr-qtgui/src/python/qttest_c.py
gnuradio/trunk/gr-qtgui/src/python/qttest_f.py
Modified:
gnuradio/trunk/config/grc_gr_qtgui.m4
gnuradio/trunk/gr-qtgui/src/lib/ConstellationDisplayPlot.cc
gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.cc
gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.h
gnuradio/trunk/gr-qtgui/src/lib/Makefile.am
gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.cc
gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.h
gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc
gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h
gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.cc
gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.h
gnuradio/trunk/gr-qtgui/src/lib/qtgui.i
gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.cc
gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.h
gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.cc
gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.h
gnuradio/trunk/gr-qtgui/src/lib/spectrumUpdateEvents.cc
gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.cc
gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.h
gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.ui
gnuradio/trunk/gr-qtgui/src/python/Makefile.am
gnuradio/trunk/gr-qtgui/src/python/qt_digital.py
Log:
Merging qtdevel2 branch -r10565:10849. This adds a lot of fixes and
capabilities to the qtgui package. Most importantly, it allows interaction
between PyQt and the C++ Qt routines in the gnuradio library.
Modified: gnuradio/trunk/config/grc_gr_qtgui.m4
===================================================================
--- gnuradio/trunk/config/grc_gr_qtgui.m4 2009-04-15 02:50:12 UTC (rev
10849)
+++ gnuradio/trunk/config/grc_gr_qtgui.m4 2009-04-15 03:49:04 UTC (rev
10850)
@@ -28,7 +28,15 @@
dnl yes : if the --enable code passed muster and all dependencies are
met
dnl no : otherwise
+ PYTHON_CHECK_MODULE([PyQt4.QtCore], [PyQt4 for Qt4], \
+ [passed=yes], [passed=no], \
+ [PyQt4.QtCore.PYQT_VERSION >= 260000])
+ # Enable this if we want to test for PyQwt, too
+ #PYTHON_CHECK_MODULE([PyQt4.Qwt5], [PyQwt5 for Qt4], \
+ # [passed=yes], [passed=no], \
+ # [PyQt4.Qwt5.QWT_VERSION >= 327000])
+
# Check for:
# QtOpenGL
# QtGui
Modified: gnuradio/trunk/gr-qtgui/src/lib/ConstellationDisplayPlot.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/ConstellationDisplayPlot.cc 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/ConstellationDisplayPlot.cc 2009-04-15
03:49:04 UTC (rev 10850)
@@ -100,11 +100,8 @@
_zoomer->setRubberBandPen(c);
_zoomer->setTrackerPen(c);
- QwtLegend* legendDisplay = new QwtLegend(this);
- legendDisplay->setItemMode(QwtLegend::CheckableItem);
- insertLegend(legendDisplay);
-
- connect(this, SIGNAL( legendChecked(QwtPlotItem *, bool ) ), this, SLOT(
LegendEntryChecked(QwtPlotItem *, bool ) ));
+ connect(this, SIGNAL( legendChecked(QwtPlotItem *, bool ) ),
+ this, SLOT( LegendEntryChecked(QwtPlotItem *, bool ) ));
}
ConstellationDisplayPlot::~ConstellationDisplayPlot(){
Modified: gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.cc 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.cc 2009-04-15
03:49:04 UTC (rev 10850)
@@ -8,18 +8,22 @@
class FreqPrecisionClass
{
public:
- FreqPrecisionClass(const int freqPrecision){
+ FreqPrecisionClass(const int freqPrecision)
+ {
_frequencyPrecision = freqPrecision;
}
- virtual ~FreqPrecisionClass(){
+ virtual ~FreqPrecisionClass()
+ {
}
- virtual unsigned int GetFrequencyPrecision()const{
+ virtual unsigned int GetFrequencyPrecision() const
+ {
return _frequencyPrecision;
}
- virtual void SetFrequencyPrecision(const unsigned int newPrecision){
+ virtual void SetFrequencyPrecision(const unsigned int newPrecision)
+ {
_frequencyPrecision = newPrecision;
}
protected:
@@ -29,17 +33,20 @@
};
-class FreqDisplayScaleDraw: public QwtScaleDraw, public FreqPrecisionClass{
+class FreqDisplayScaleDraw: public QwtScaleDraw, public FreqPrecisionClass
+{
public:
- FreqDisplayScaleDraw(const unsigned int precision):QwtScaleDraw(),
FreqPrecisionClass(precision){
-
+ FreqDisplayScaleDraw(const unsigned int precision)
+ : QwtScaleDraw(), FreqPrecisionClass(precision)
+ {
}
- virtual ~FreqDisplayScaleDraw(){
-
+ virtual ~FreqDisplayScaleDraw()
+ {
}
- virtual QwtText label(double value)const{
+ virtual QwtText label(double value) const
+ {
return QString("%1").arg(value, 0, 'f', GetFrequencyPrecision());
}
@@ -52,7 +59,8 @@
class FreqDisplayZoomer: public QwtPlotZoomer, public FreqPrecisionClass
{
public:
- FreqDisplayZoomer(QwtPlotCanvas* canvas, const unsigned int
freqPrecision):QwtPlotZoomer(canvas),FreqPrecisionClass(freqPrecision)
+ FreqDisplayZoomer(QwtPlotCanvas* canvas, const unsigned int freqPrecision)
+ : QwtPlotZoomer(canvas),FreqPrecisionClass(freqPrecision)
{
setTrackerMode(QwtPicker::AlwaysOn);
}
@@ -74,7 +82,9 @@
}
};
-FrequencyDisplayPlot::FrequencyDisplayPlot(QWidget* parent):QwtPlot(parent){
+FrequencyDisplayPlot::FrequencyDisplayPlot(QWidget* parent)
+ : QwtPlot(parent)
+{
_startFrequency = 0;
_stopFrequency = 4000;
@@ -199,10 +209,10 @@
const QColor c(Qt::darkRed);
_zoomer->setRubberBandPen(c);
_zoomer->setTrackerPen(c);
-
}
-FrequencyDisplayPlot::~FrequencyDisplayPlot(){
+FrequencyDisplayPlot::~FrequencyDisplayPlot()
+{
delete[] _dataPoints;
delete[] _maxFFTPoints;
delete[] _minFFTPoints;
@@ -212,49 +222,37 @@
// _zoomer and _panner deleted when parent deleted
}
-void FrequencyDisplayPlot::SetFrequencyRange(const double constStartFreq,
const double constStopFreq, const double centerFrequency, const bool
useCenterFrequencyFlag){
- double startFreq = constStartFreq;
- double stopFreq = constStopFreq;
+void
+FrequencyDisplayPlot::SetFrequencyRange(const double constStartFreq,
+ const double constStopFreq,
+ const double constCenterFreq,
+ const bool useCenterFrequencyFlag,
+ const double units, const std::string
&strunits)
+{
+ double startFreq = constStartFreq / units;
+ double stopFreq = constStopFreq / units;
+ double centerFreq = constCenterFreq / units;
_useCenterFrequencyFlag = useCenterFrequencyFlag;
if(_useCenterFrequencyFlag){
- startFreq = (startFreq + centerFrequency) / 1000.0;
- stopFreq = (stopFreq + centerFrequency) / 1000.0;
+ startFreq = (startFreq + centerFreq);
+ stopFreq = (stopFreq + centerFreq);
}
- if((stopFreq > 0) && (stopFreq > startFreq)){
- _startFrequency = startFreq;
- _stopFrequency = stopFreq;
- _resetXAxisPoints();
+ _startFrequency = startFreq;
+ _stopFrequency = stopFreq;
+ _resetXAxisPoints();
+
+ setAxisScale(QwtPlot::xBottom, _startFrequency, _stopFrequency);
+ setAxisScaleDraw(QwtPlot::xBottom, new FreqDisplayScaleDraw(2));
+ setAxisTitle(QwtPlot::xBottom, QString("Frequency
(%1)").arg(strunits.c_str()));
+ ((FreqDisplayZoomer*)_zoomer)->SetFrequencyPrecision(2);
- // Load up the new base zoom settings
- QwtDoubleRect newSize = _zoomer->zoomBase();
- newSize.setLeft(_startFrequency);
- newSize.setWidth(_stopFrequency-_startFrequency);
- _zoomer->setZoomBase(newSize);
-
- // Zooms back to the base and clears any other zoom levels
- _zoomer->zoom(0);
-
- setAxisScale(QwtPlot::xBottom, _startFrequency, _stopFrequency);
- }
-
- if(useCenterFrequencyFlag){
- setAxisScaleDraw(QwtPlot::xBottom, new FreqDisplayScaleDraw(3));
- setAxisTitle(QwtPlot::xBottom, "RF Frequency (kHz)");
- ((FreqDisplayZoomer*)_zoomer)->SetFrequencyPrecision(3);
- }
- else{
- setAxisScaleDraw(QwtPlot::xBottom, new FreqDisplayScaleDraw(0));
- setAxisTitle(QwtPlot::xBottom, "Frequency (Hz)");
- ((FreqDisplayZoomer*)_zoomer)->SetFrequencyPrecision(0);
- }
-
// Load up the new base zoom settings
QwtDoubleRect newSize = _zoomer->zoomBase();
newSize.setLeft(_startFrequency);
- newSize.setWidth(_stopFrequency-_startFrequency);
+ newSize.setWidth(_stopFrequency-_startFrequency);
_zoomer->setZoomBase(newSize);
// Zooms back to the base and clears any other zoom levels
@@ -262,16 +260,21 @@
}
-double FrequencyDisplayPlot::GetStartFrequency()const{
+double
+FrequencyDisplayPlot::GetStartFrequency() const
+{
return _startFrequency;
}
-double FrequencyDisplayPlot::GetStopFrequency()const{
+double
+FrequencyDisplayPlot::GetStopFrequency() const
+{
return _stopFrequency;
}
-void FrequencyDisplayPlot::replot(){
-
+void
+FrequencyDisplayPlot::replot()
+{
const timespec startTime = get_highres_clock();
_markerNoiseFloorAmplitude->setYValue(_noiseFloorAmplitude);
@@ -296,7 +299,11 @@
}
}
-void FrequencyDisplayPlot::PlotNewData(const double* dataPoints, const int64_t
numDataPoints, const double noiseFloorAmplitude, const double peakFrequency,
const double peakAmplitude){
+void
+FrequencyDisplayPlot::PlotNewData(const double* dataPoints, const int64_t
numDataPoints,
+ const double noiseFloorAmplitude, const
double peakFrequency,
+ const double peakAmplitude)
+{
if(numDataPoints > 0){
if(numDataPoints != _numPoints){
@@ -345,27 +352,37 @@
}
}
-void FrequencyDisplayPlot::ClearMaxData(){
+void
+FrequencyDisplayPlot::ClearMaxData()
+{
for(int64_t number = 0; number < _numPoints; number++){
_maxFFTPoints[number] = -280.0;
}
}
-void FrequencyDisplayPlot::ClearMinData(){
+void
+FrequencyDisplayPlot::ClearMinData()
+{
for(int64_t number = 0; number < _numPoints; number++){
_minFFTPoints[number] = 200.0;
}
}
-void FrequencyDisplayPlot::SetMaxFFTVisible(const bool visibleFlag){
+void
+FrequencyDisplayPlot::SetMaxFFTVisible(const bool visibleFlag)
+{
_max_fft_plot_curve->setVisible(visibleFlag);
}
-void FrequencyDisplayPlot::SetMinFFTVisible(const bool visibleFlag){
+void
+FrequencyDisplayPlot::SetMinFFTVisible(const bool visibleFlag)
+{
_min_fft_plot_curve->setVisible(visibleFlag);
}
-void FrequencyDisplayPlot::_resetXAxisPoints(){
+void
+FrequencyDisplayPlot::_resetXAxisPoints()
+{
double fft_bin_size = (_stopFrequency-_startFrequency) /
static_cast<double>(_numPoints);
double freqValue = _startFrequency;
for(int64_t loc = 0; loc < _numPoints; loc++){
@@ -374,11 +391,15 @@
}
}
-void FrequencyDisplayPlot::SetLowerIntensityLevel(const double
lowerIntensityLevel){
+void
+FrequencyDisplayPlot::SetLowerIntensityLevel(const double lowerIntensityLevel)
+{
_lower_intensity_marker->setYValue( lowerIntensityLevel );
}
-void FrequencyDisplayPlot::SetUpperIntensityLevel(const double
upperIntensityLevel){
+void
+FrequencyDisplayPlot::SetUpperIntensityLevel(const double upperIntensityLevel)
+{
_upper_intensity_marker->setYValue( upperIntensityLevel );
}
Modified: gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.h
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.h 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/FrequencyDisplayPlot.h 2009-04-15
03:49:04 UTC (rev 10850)
@@ -20,11 +20,16 @@
FrequencyDisplayPlot(QWidget*);
virtual ~FrequencyDisplayPlot();
- void SetFrequencyRange(const double, const double, const double, const bool);
+ void SetFrequencyRange(const double, const double,
+ const double, const bool,
+ const double units=1000.0,
+ const std::string &strunits = "kHz");
double GetStartFrequency()const;
double GetStopFrequency()const;
- void PlotNewData(const double* dataPoints, const int64_t numDataPoints,
const double noiseFloorAmplitude, const double peakFrequency, const double
peakAmplitude);
+ void PlotNewData(const double* dataPoints, const int64_t numDataPoints,
+ const double noiseFloorAmplitude, const double peakFrequency,
+ const double peakAmplitude);
void ClearMaxData();
void ClearMinData();
Modified: gnuradio/trunk/gr-qtgui/src/lib/Makefile.am
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/Makefile.am 2009-04-15 02:50:12 UTC (rev
10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/Makefile.am 2009-04-15 03:49:04 UTC (rev
10850)
@@ -108,7 +108,7 @@
# This ends up at:
# ${prefix}/lib/python${python_version}/site-packages/gnuradio
qtgui_pythondir_category = \
- gnuradio
+ gnuradio/qtgui
# additional libraries for linking with the SWIG-generated library
qtgui_la_swig_libadd = \
Modified: gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.cc 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.cc 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -9,8 +9,11 @@
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;
@@ -40,7 +43,8 @@
_powerValue = 1;
}
-SpectrumGUIClass::~SpectrumGUIClass(){
+SpectrumGUIClass::~SpectrumGUIClass()
+{
if(GetWindowOpenFlag()){
delete _spectrumDisplayForm;
}
@@ -54,7 +58,12 @@
//delete _windowStateLock;
}
-void SpectrumGUIClass::OpenSpectrumWindow(QWidget* parent){
+void
+SpectrumGUIClass::OpenSpectrumWindow(QWidget* parent,
+ const bool frequency, const bool waterfall,
+ const bool waterfall3d, const bool time,
+ const bool constellation)
+{
//_windowStateLock->Lock();
if(!_windowOpennedFlag){
@@ -73,6 +82,13 @@
// Called from the Event Thread
_spectrumDisplayForm = new SpectrumDisplayForm(parent);
+
+ // Toggle Windows on/off
+ _spectrumDisplayForm->ToggleTabFrequency(frequency);
+ _spectrumDisplayForm->ToggleTabWaterfall(waterfall);
+ _spectrumDisplayForm->ToggleTabWaterfall3D(waterfall3d);
+ _spectrumDisplayForm->ToggleTabTime(time);
+ _spectrumDisplayForm->ToggleTabConstellation(constellation);
_windowOpennedFlag = true;
@@ -86,10 +102,9 @@
SetDisplayTitle(_title);
Reset();
- qApp->postEvent(_spectrumDisplayForm, new
QEvent(QEvent::Type(QEvent::User+3)));
+ qApp->postEvent(_spectrumDisplayForm,
+ new QEvent(QEvent::Type(QEvent::User+3)));
- _spectrumDisplayForm->show();
-
qApp->processEvents();
timespec_reset(&_lastGUIUpdateTime);
@@ -101,11 +116,14 @@
qApp->processEvents();
}
-void SpectrumGUIClass::Reset(){
- if(GetWindowOpenFlag()){
- qApp->postEvent(_spectrumDisplayForm, new
SpectrumFrequencyRangeEvent(_centerFrequency,
-
_startFrequency,
-
_stopFrequency));
+void
+SpectrumGUIClass::Reset()
+{
+ if(GetWindowOpenFlag()) {
+ qApp->postEvent(_spectrumDisplayForm,
+ new SpectrumFrequencyRangeEvent(_centerFrequency,
+ _startFrequency,
+ _stopFrequency));
qApp->postEvent(_spectrumDisplayForm, new SpectrumWindowResetEvent());
}
_droppedEntriesCount = 0;
@@ -113,16 +131,20 @@
// ResetPendingGUIUpdateEvents();
}
-void SpectrumGUIClass::SetDisplayTitle(const std::string newString){
+void
+SpectrumGUIClass::SetDisplayTitle(const std::string newString)
+{
_title.assign(newString);
if(GetWindowOpenFlag()){
- qApp->postEvent(_spectrumDisplayForm, new
SpectrumWindowCaptionEvent(_title.c_str()));
+ qApp->postEvent(_spectrumDisplayForm,
+ new SpectrumWindowCaptionEvent(_title.c_str()));
}
-
}
-bool SpectrumGUIClass::GetWindowOpenFlag(){
+bool
+SpectrumGUIClass::GetWindowOpenFlag()
+{
bool returnFlag = false;
//_windowStateLock->Lock();
returnFlag = _windowOpennedFlag;
@@ -131,21 +153,33 @@
}
-void SpectrumGUIClass::SetWindowOpenFlag(const bool newFlag){
+void
+SpectrumGUIClass::SetWindowOpenFlag(const bool newFlag)
+{
//_windowStateLock->Lock();
_windowOpennedFlag = newFlag;
//_windowStateLock->Unlock();
}
-void SpectrumGUIClass::SetFrequencyRange(const double centerFreq, const double
startFreq, const double stopFreq){
+void
+SpectrumGUIClass::SetFrequencyRange(const double centerFreq,
+ const double startFreq,
+ const double stopFreq)
+{
//_windowStateLock->Lock();
_centerFrequency = centerFreq;
_startFrequency = startFreq;
_stopFrequency = stopFreq;
+
+ _spectrumDisplayForm->SetFrequencyRange(_centerFrequency,
+ _startFrequency,
+ _stopFrequency);
//_windowStateLock->Unlock();
}
-double SpectrumGUIClass::GetStartFrequency()const{
+double
+SpectrumGUIClass::GetStartFrequency() const
+{
double returnValue = 0.0;
//_windowStateLock->Lock();
returnValue = _startFrequency;
@@ -153,7 +187,9 @@
return returnValue;
}
-double SpectrumGUIClass::GetStopFrequency()const{
+double
+SpectrumGUIClass::GetStopFrequency() const
+{
double returnValue = 0.0;
//_windowStateLock->Lock();
returnValue = _stopFrequency;
@@ -161,7 +197,9 @@
return returnValue;
}
-double SpectrumGUIClass::GetCenterFrequency()const{
+double
+SpectrumGUIClass::GetCenterFrequency() const
+{
double returnValue = 0.0;
//_windowStateLock->Lock();
returnValue = _centerFrequency;
@@ -170,8 +208,18 @@
}
-void SpectrumGUIClass::UpdateWindow(const bool updateDisplayFlag, const
std::complex<float>* fftBuffer, const uint64_t inputBufferSize, const float*
realTimeDomainData, const uint64_t realTimeDomainDataSize, const float*
complexTimeDomainData, const uint64_t complexTimeDomainDataSize, const double
timePerFFT, const timespec timestamp, const bool lastOfMultipleFFTUpdateFlag){
-
+void
+SpectrumGUIClass::UpdateWindow(const bool updateDisplayFlag,
+ const std::complex<float>* fftBuffer,
+ const uint64_t inputBufferSize,
+ const float* realTimeDomainData,
+ const uint64_t realTimeDomainDataSize,
+ const float* complexTimeDomainData,
+ const uint64_t complexTimeDomainDataSize,
+ const double timePerFFT,
+ const timespec timestamp,
+ const bool lastOfMultipleFFTUpdateFlag)
+{
int64_t bufferSize = inputBufferSize;
bool repeatDataFlag = false;
if(bufferSize > _dataPoints){
@@ -179,7 +227,7 @@
}
int64_t timeDomainBufferSize = 0;
- if( updateDisplayFlag){
+ if(updateDisplayFlag){
if((fftBuffer != NULL) && (bufferSize > 0)){
memcpy(_fftPoints, fftBuffer, bufferSize * sizeof(std::complex<float>));
}
@@ -225,25 +273,36 @@
const timespec currentTime = get_highres_clock();
const timespec lastUpdateGUITime = GetLastGUIUpdateTime();
- if((diff_timespec(currentTime, lastUpdateGUITime) > (4*timePerFFT)) &&
(GetPendingGUIUpdateEvents() > 0) && !timespec_empty(&lastUpdateGUITime)){
+ if((diff_timespec(currentTime, lastUpdateGUITime) > (4*timePerFFT)) &&
+ (GetPendingGUIUpdateEvents() > 0) && !timespec_empty(&lastUpdateGUITime))
{
// Do not update the display if too much data is pending to be displayed
_droppedEntriesCount++;
}
else{
// Draw the Data
IncrementPendingGUIUpdateEvents();
- qApp->postEvent(_spectrumDisplayForm, new SpectrumUpdateEvent(_fftPoints,
bufferSize, _realTimeDomainPoints, _imagTimeDomainPoints, timeDomainBufferSize,
timePerFFT, timestamp, repeatDataFlag, lastOfMultipleFFTUpdateFlag,
currentTime, _droppedEntriesCount));
+ qApp->postEvent(_spectrumDisplayForm,
+ new SpectrumUpdateEvent(_fftPoints, bufferSize,
+ _realTimeDomainPoints,
+ _imagTimeDomainPoints,
+ timeDomainBufferSize,
+ timePerFFT, timestamp,
+ repeatDataFlag,
+ lastOfMultipleFFTUpdateFlag,
+ currentTime,
+ _droppedEntriesCount));
- // Only reset the dropped entries counter if this is not repeat data since
repeat data is dropped by the display systems
+ // Only reset the dropped entries counter if this is not
+ // repeat data since repeat data is dropped by the display systems
if(!repeatDataFlag){
_droppedEntriesCount = 0;
}
-
- //qApp->wakeUpGuiThread();
}
}
-float SpectrumGUIClass::GetPowerValue()const{
+float
+SpectrumGUIClass::GetPowerValue() const
+{
float returnValue = 0;
//_windowStateLock->Lock();
returnValue = _powerValue;
@@ -251,13 +310,17 @@
return returnValue;
}
-void SpectrumGUIClass::SetPowerValue(const float value){
+void
+SpectrumGUIClass::SetPowerValue(const float value)
+{
//_windowStateLock->Lock();
_powerValue = value;
//_windowStateLock->Unlock();
}
-int SpectrumGUIClass::GetWindowType()const{
+int
+SpectrumGUIClass::GetWindowType() const
+{
int returnValue = 0;
//_windowStateLock->Lock();
returnValue = _windowType;
@@ -265,13 +328,17 @@
return returnValue;
}
-void SpectrumGUIClass::SetWindowType(const int newType){
+void
+SpectrumGUIClass::SetWindowType(const int newType)
+{
//_windowStateLock->Lock();
_windowType = newType;
//_windowStateLock->Unlock();
}
-int SpectrumGUIClass::GetFFTSize()const{
+int
+SpectrumGUIClass::GetFFTSize() const
+{
int returnValue = 0;
//_windowStateLock->Lock();
returnValue = _fftSize;
@@ -279,7 +346,9 @@
return returnValue;
}
-int SpectrumGUIClass::GetFFTSizeIndex()const{
+int
+SpectrumGUIClass::GetFFTSizeIndex() const
+{
int fftsize = GetFFTSize();
switch(fftsize) {
case(1024): return 0; break;
@@ -292,13 +361,17 @@
}
}
-void SpectrumGUIClass::SetFFTSize(const int newSize){
+void
+SpectrumGUIClass::SetFFTSize(const int newSize)
+{
//_windowStateLock->Lock();
_fftSize = newSize;
//_windowStateLock->Unlock();
}
-timespec SpectrumGUIClass::GetLastGUIUpdateTime()const{
+timespec
+SpectrumGUIClass::GetLastGUIUpdateTime() const
+{
timespec returnValue;
//_windowStateLock->Lock();
returnValue = _lastGUIUpdateTime;
@@ -306,13 +379,17 @@
return returnValue;
}
-void SpectrumGUIClass::SetLastGUIUpdateTime(const timespec newTime){
+void
+SpectrumGUIClass::SetLastGUIUpdateTime(const timespec newTime)
+{
//_windowStateLock->Lock();
_lastGUIUpdateTime = newTime;
//_windowStateLock->Unlock();
}
-unsigned int SpectrumGUIClass::GetPendingGUIUpdateEvents()const{
+unsigned int
+SpectrumGUIClass::GetPendingGUIUpdateEvents() const
+{
unsigned int returnValue = 0;
//_windowStateLock->Lock();
returnValue = _pendingGUIUpdateEventsCount;
@@ -320,13 +397,17 @@
return returnValue;
}
-void SpectrumGUIClass::IncrementPendingGUIUpdateEvents(){
+void
+SpectrumGUIClass::IncrementPendingGUIUpdateEvents()
+{
//_windowStateLock->Lock();
_pendingGUIUpdateEventsCount++;
//_windowStateLock->Unlock();
}
-void SpectrumGUIClass::DecrementPendingGUIUpdateEvents(){
+void
+SpectrumGUIClass::DecrementPendingGUIUpdateEvents()
+{
//_windowStateLock->Lock();
if(_pendingGUIUpdateEventsCount > 0){
_pendingGUIUpdateEventsCount--;
@@ -334,11 +415,20 @@
//_windowStateLock->Unlock();
}
-void SpectrumGUIClass::ResetPendingGUIUpdateEvents(){
+void
+SpectrumGUIClass::ResetPendingGUIUpdateEvents()
+{
//_windowStateLock->Lock();
_pendingGUIUpdateEventsCount = 0;
//_windowStateLock->Unlock();
}
+QWidget*
+SpectrumGUIClass::qwidget()
+{
+ return (QWidget*)_spectrumDisplayForm;
+}
+
+
#endif /* SPECTRUM_GUI_CLASS_CPP */
Modified: gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.h
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.h 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/SpectrumGUIClass.h 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -19,13 +19,18 @@
#include <vector>
#include <string>
-class SpectrumGUIClass{
+class SpectrumGUIClass
+{
public:
- SpectrumGUIClass(const uint64_t, const uint64_t, const double, const double);
+ SpectrumGUIClass(const uint64_t maxDataSize, const uint64_t fftSize,
+ const double newStartFrequency, const double
newStopFrequency);
~SpectrumGUIClass();
void Reset();
- void OpenSpectrumWindow(QWidget*);
+ void OpenSpectrumWindow(QWidget*,
+ const bool frequency=true, const bool waterfall=true,
+ const bool waterfall3d=true, const bool time=true,
+ const bool constellation=true);
void SetDisplayTitle(const std::string);
bool GetWindowOpenFlag();
@@ -36,7 +41,11 @@
double GetStopFrequency()const;
double GetCenterFrequency()const;
- void UpdateWindow(const bool, const std::complex<float>*, const uint64_t,
const float*, const uint64_t, const float*, const uint64_t, const double, const
timespec, const bool);
+ void UpdateWindow(const bool, const std::complex<float>*,
+ const uint64_t, const float*,
+ const uint64_t, const float*,
+ const uint64_t, const double,
+ const timespec, const bool);
float GetPowerValue()const;
void SetPowerValue(const float);
@@ -59,6 +68,8 @@
static const long MAX_FFT_SIZE = /*1048576*/32768;
static const long MIN_FFT_SIZE = 1024;
+ QWidget* qwidget();
+
protected:
private:
Modified: gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.cc 2009-04-15
03:49:04 UTC (rev 10850)
@@ -111,8 +111,18 @@
_timePerFFT = 1.0;
}
-void Waterfall3DDisplayPlot::SetFrequencyRange(const double startFreq, const
double stopFreq, const double centerFreq, const bool useCenterFrequencyFlag){
- if((stopFreq > 0) && (stopFreq > startFreq)){
+void
+Waterfall3DDisplayPlot::SetFrequencyRange(const double constStartFreq,
+ const double constStopFreq,
+ const double constCenterFreq,
+ const bool useCenterFrequencyFlag,
+ const double units, const std::string
&strunits)
+{
+ double startFreq = constStartFreq / units;
+ double stopFreq = constStopFreq / units;
+ double centerFreq = constCenterFreq / units;
+
+ if(stopFreq > startFreq) {
_startFrequency = startFreq;
_stopFrequency = stopFreq;
Modified: gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/Waterfall3DDisplayPlot.h 2009-04-15
03:49:04 UTC (rev 10850)
@@ -130,7 +130,9 @@
bool loadFromData(double** data, unsigned int columns, unsigned int rows
,double minx, double maxx, double miny, double maxy);
- void SetFrequencyRange(const double, const double, const double, const bool);
+ void SetFrequencyRange(const double, const double,
+ const double, const bool,
+ const double units, const std::string &strunits);
double GetStartFrequency()const;
double GetStopFrequency()const;
Modified: gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.cc 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.cc 2009-04-15
03:49:04 UTC (rev 10850)
@@ -182,7 +182,9 @@
const int WaterfallDisplayPlot::INTENSITY_COLOR_MAP_TYPE_INCANDESCENT;
const int WaterfallDisplayPlot::INTENSITY_COLOR_MAP_TYPE_USER_DEFINED;
-WaterfallDisplayPlot::WaterfallDisplayPlot(QWidget* parent):QwtPlot(parent){
+WaterfallDisplayPlot::WaterfallDisplayPlot(QWidget* parent)
+ : QwtPlot(parent)
+{
_zoomer = NULL;
_startFrequency = 0;
_stopFrequency = 4000;
@@ -253,11 +255,14 @@
_UpdateIntensityRangeDisplay();
}
-WaterfallDisplayPlot::~WaterfallDisplayPlot(){
+WaterfallDisplayPlot::~WaterfallDisplayPlot()
+{
delete _waterfallData;
}
-void WaterfallDisplayPlot::Reset(){
+void
+WaterfallDisplayPlot::Reset()
+{
_waterfallData->ResizeData(_startFrequency, _stopFrequency, _numPoints);
_waterfallData->Reset();
@@ -270,25 +275,31 @@
_zoomer->zoom(0);
}
-void WaterfallDisplayPlot::SetFrequencyRange(const double startFreq, const
double stopFreq, const double centerFreq, const bool useCenterFrequencyFlag){
- if((stopFreq > 0) && (stopFreq > startFreq)){
- _startFrequency = startFreq;
- _stopFrequency = stopFreq;
+void
+WaterfallDisplayPlot::SetFrequencyRange(const double constStartFreq,
+ const double constStopFreq,
+ const double constCenterFreq,
+ const bool useCenterFrequencyFlag,
+ const double units, const std::string
&strunits)
+{
+ double startFreq = constStartFreq / units;
+ double stopFreq = constStopFreq / units;
+ double centerFreq = constCenterFreq / units;
+ if(stopFreq > startFreq) {
+ _startFrequency = 1000*startFreq;
+ _stopFrequency = 1000*stopFreq;
+
+ setAxisScale(QwtPlot::xBottom, _startFrequency, _stopFrequency);
+
if((axisScaleDraw(QwtPlot::xBottom) != NULL) && (_zoomer != NULL)){
WaterfallFreqDisplayScaleDraw* freqScale =
((WaterfallFreqDisplayScaleDraw*)axisScaleDraw(QwtPlot::xBottom));
freqScale->SetCenterFrequency(centerFreq);
((WaterfallZoomer*)_zoomer)->SetCenterFrequency(centerFreq);
- if(useCenterFrequencyFlag){
- freqScale->SetFrequencyPrecision( 3 );
- ((WaterfallZoomer*)_zoomer)->SetFrequencyPrecision( 3 );
- setAxisTitle(QwtPlot::xBottom, "Frequency (kHz)");
- }
- else{
- freqScale->SetFrequencyPrecision( 0 );
- ((WaterfallZoomer*)_zoomer)->SetFrequencyPrecision( 0 );
- setAxisTitle(QwtPlot::xBottom, "Frequency (Hz)");
- }
+
+ freqScale->SetFrequencyPrecision( 2 );
+ ((WaterfallZoomer*)_zoomer)->SetFrequencyPrecision( 2 );
+ setAxisTitle(QwtPlot::xBottom, QString("Frequency
(%1)").arg(strunits.c_str()));
}
Reset();
@@ -461,7 +472,7 @@
rightAxis->setColorBarEnabled(true);
rightAxis->setColorMap(d_spectrogram->data()->range(),
d_spectrogram->colorMap());
-
+
setAxisScale(QwtPlot::yRight,
d_spectrogram->data()->range().minValue(),
d_spectrogram->data()->range().maxValue() );
Modified: gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.h
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.h 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/WaterfallDisplayPlot.h 2009-04-15
03:49:04 UTC (rev 10850)
@@ -18,11 +18,16 @@
void Reset();
- void SetFrequencyRange(const double, const double, const double, const bool);
+ void SetFrequencyRange(const double, const double,
+ const double, const bool,
+ const double units=1000.0,
+ const std::string &strunits = "kHz");
double GetStartFrequency()const;
double GetStopFrequency()const;
- void PlotNewData(const double* dataPoints, const int64_t numDataPoints,
const double timePerFFT, const timespec timestamp, const int droppedFrames);
+ void PlotNewData(const double* dataPoints, const int64_t numDataPoints,
+ const double timePerFFT, const timespec timestamp,
+ const int droppedFrames);
void SetIntensityRange(const double minIntensity, const double maxIntensity);
Modified: gnuradio/trunk/gr-qtgui/src/lib/qtgui.i
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/qtgui.i 2009-04-15 02:50:12 UTC (rev
10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/qtgui.i 2009-04-15 03:49:04 UTC (rev
10850)
@@ -31,22 +31,37 @@
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");
+ const std::string &name="Display",
+ bool plotfreq=true, bool
plotwaterfall=true,
+ bool plotwaterfall3d=true, bool
plottime=true,
+ bool plotconst=true,
+ QWidget *parent=NULL);
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);
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool
plottime,
+ bool plotconst,
+ QWidget *parent);
qtgui_sink_c (int fftsize, int wintype,
- float fmin, float fmax, const std::string &name);
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent);
public:
- void start_app();
- void initialize();
- void initialize(QApplication *qapp);
- QApplication* get_qapplication();
+ void exec_();
+ PyObject* pyqwidget();
+
+ void set_frequency_range(const double centerfreq,
+ const double startfreq,
+ const double stopfreq);
};
@@ -56,25 +71,34 @@
GR_SWIG_BLOCK_MAGIC(qtgui,sink_f)
-qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize,
- const std::vector<float> &window,
- float fmin, float fmax,
- const std::string &name="Display");
+qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
+ float fmin=-0.5, float fmax=0.5,
+ const std::string &name="Display",
+ bool plotfreq=true, bool
plotwaterfall=true,
+ bool plotwaterfall3d=true, bool
plottime=true,
+ bool plotconst=true,
+ QWidget *parent=NULL);
class qtgui_sink_f : public gr_block
{
private:
- friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize,
- const std::vector<float> &window,
- float fmin, float fmax,
- const std::string &name);
- qtgui_sink_f (int fftsize,
- const std::vector<float> &window,
+ friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool
plottime,
+ bool plotconst,
+ QWidget *parent);
+ qtgui_sink_f (int fftsize, int wintype,
float fmin, float fmax,
- const std::string &name);
-
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent);
+
public:
- void start_app();
+ void exec_();
+ PyObject* pyqwidget();
};
-
Modified: gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.cc 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.cc 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -32,24 +32,46 @@
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,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent)
{
- return qtgui_sink_c_sptr (new qtgui_sink_c (fftsize, wintype, fmin, fmax,
name));
+ return qtgui_sink_c_sptr (new qtgui_sink_c (fftsize, wintype,
+ fmin, fmax, name,
+ plotfreq, plotwaterfall,
+ plotwaterfall3d, plottime,
+ plotconst,
+ parent));
}
qtgui_sink_c::qtgui_sink_c (int fftsize, int wintype,
- float fmin, float fmax, const std::string &name)
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent)
: gr_block ("sink_c",
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)
+ d_fftsize(fftsize),
+ d_wintype((gr_firdes::win_type)(wintype)),
+ d_fmin(fmin), d_fmax(fmax), d_name(name),
+ d_plotfreq(plotfreq), d_plotwaterfall(plotwaterfall),
+ d_plotwaterfall3d(plotwaterfall3d), d_plottime(plottime),
+ d_plotconst(plotconst),
+ d_parent(parent)
{
d_main_gui = NULL;
pthread_mutex_init(&d_pmutex, NULL);
lock();
- d_shift = true; // Perform fftshift operation; this is usually desired when
plotting
+ // Perform fftshift operation;
+ // this is usually desired when plotting
+ d_shift = true;
d_fft = new gri_fft_complex (d_fftsize, true);
@@ -60,7 +82,7 @@
buildwindow();
- //initialize();
+ initialize();
}
qtgui_sink_c::~qtgui_sink_c()
@@ -68,7 +90,6 @@
delete d_object;
delete [] d_fftdata;
delete [] d_residbuf;
- delete d_main_gui;
delete d_fft;
}
@@ -86,48 +107,61 @@
void
qtgui_sink_c::initialize()
{
- int argc;
- char **argv = NULL;
- d_qApplication = new QApplication(argc, argv);
- __initialize();
-}
+ if(qApp != NULL) {
+ d_qApplication = qApp;
+ }
+ else {
+ int argc;
+ char **argv = NULL;
+ d_qApplication = new QApplication(argc, argv);
+ }
+ uint64_t maxBufferSize = 32768;
+ d_main_gui = new SpectrumGUIClass(maxBufferSize, d_fftsize,
+ d_fmin, d_fmax);
-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);
d_main_gui->SetFFTSize(d_fftsize);
d_main_gui->SetWindowType((int)d_wintype);
- d_main_gui->OpenSpectrumWindow(NULL);
+ d_main_gui->OpenSpectrumWindow(d_parent,
+ d_plotfreq, d_plotwaterfall,
+ d_plotwaterfall3d, d_plottime,
+ d_plotconst);
+
d_object = new qtgui_obj(d_qApplication);
qApp->postEvent(d_object, new qtgui_event(&d_pmutex));
}
-QApplication*
-qtgui_sink_c::get_qapplication()
+
+void
+qtgui_sink_c::exec_()
{
- return d_qApplication;
+ d_qApplication->exec();
}
+QWidget*
+qtgui_sink_c::qwidget()
+{
+ return d_main_gui->qwidget();
+}
+PyObject*
+qtgui_sink_c::pyqwidget()
+{
+ PyObject *w = PyLong_FromVoidPtr((void*)d_main_gui->qwidget());
+ PyObject *retarg = Py_BuildValue("N", w);
+ return retarg;
+}
+
void
-qtgui_sink_c::start_app()
+qtgui_sink_c::set_frequency_range(const double centerfreq,
+ const double startfreq,
+ const double stopfreq)
{
- d_qApplication->exec();
+ d_main_gui->SetFrequencyRange(centerfreq, startfreq, stopfreq);
}
-
void
qtgui_sink_c::fft(const gr_complex *data_in, int size, gr_complex *data_out)
{
@@ -221,39 +255,47 @@
// Update the FFT size from the application
fftresize();
windowreset();
+
+ const timespec currentTime = get_highres_clock();
+ const timespec lastUpdateGUITime = d_main_gui->GetLastGUIUpdateTime();
- if(d_index) {
- int filler = std::min(d_fftsize - d_index, noutput_items);
+ if(diff_timespec(currentTime, lastUpdateGUITime) > 0.25) {
- memcpy(&d_residbuf[d_index], &in[0], sizeof(gr_complex)*filler);
- d_index += filler;
- i = filler;
- j = filler;
- }
-
- if(d_index == d_fftsize) {
- d_index = 0;
- fft(d_residbuf, d_fftsize, d_fftdata);
+ if(d_index) {
+ int filler = std::min(d_fftsize - d_index, noutput_items);
+
+ memcpy(&d_residbuf[d_index], &in[0], sizeof(gr_complex)*filler);
+ d_index += filler;
+ i = filler;
+ j = filler;
+ }
- d_main_gui->UpdateWindow(true, d_fftdata, d_fftsize, NULL, 0,
(float*)d_residbuf, d_fftsize,
- 1.0/4.0, convert_to_timespec(0.0), true);
- }
-
- for(; i < noutput_items; i+=d_fftsize) {
- if(noutput_items - i > d_fftsize) {
- j += d_fftsize;
- fft(&in[i], d_fftsize, d_fftdata);
+ if(d_index == d_fftsize) {
+ d_index = 0;
+ fft(d_residbuf, d_fftsize, d_fftdata);
- d_main_gui->UpdateWindow(true, d_fftdata, d_fftsize, NULL, 0,
(float*)&in[i], d_fftsize,
+ d_main_gui->UpdateWindow(true, d_fftdata, d_fftsize, NULL, 0,
+ (float*)d_residbuf, d_fftsize,
1.0/4.0, convert_to_timespec(0.0), true);
}
+
+ for(; i < noutput_items; i+=d_fftsize) {
+ if(noutput_items - i > d_fftsize) {
+ j += d_fftsize;
+ fft(&in[i], d_fftsize, d_fftdata);
+
+ d_main_gui->UpdateWindow(true, d_fftdata, d_fftsize, NULL, 0,
+ (float*)&in[i], d_fftsize,
+ 1.0/4.0, convert_to_timespec(0.0), true);
+ }
+ }
+
+ if(noutput_items > j) {
+ d_index = noutput_items - j;
+ memcpy(d_residbuf, &in[j], sizeof(gr_complex)*d_index);
+ }
}
- if(noutput_items > j) {
- d_index = noutput_items - j;
- memcpy(d_residbuf, &in[j], sizeof(gr_complex)*d_index);
- }
-
pthread_mutex_unlock(&d_pmutex);
consume_each(noutput_items);
Modified: gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.h
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.h 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_c.h 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -28,25 +28,40 @@
#include <gri_fft.h>
#include <qapplication.h>
#include <qtgui.h>
+#include <Python.h>
#include "SpectrumGUIClass.h"
-
class qtgui_sink_c;
typedef boost::shared_ptr<qtgui_sink_c> qtgui_sink_c_sptr;
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="Spectrum Display",
+ bool plotfreq=true, bool
plotwaterfall=true,
+ bool plotwaterfall3d=true, bool
plottime=true,
+ bool plotconst=true,
+ QWidget *parent=NULL);
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,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool
plottime,
+ bool plotconst,
+ QWidget *parent);
qtgui_sink_c (int fftsize, int wintype,
- float fmin, float fmax, const std::string &name);
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent);
- void __initialize();
-
+ void initialize();
+
int d_fftsize;
gr_firdes::win_type d_wintype;
std::vector<float> d_window;
@@ -63,8 +78,11 @@
int d_index;
gr_complex *d_residbuf;
- SpectrumGUIClass *d_main_gui;
+ bool d_plotfreq, d_plotwaterfall, d_plotwaterfall3d, d_plottime, d_plotconst;
+ QWidget *d_parent;
+ SpectrumGUIClass *d_main_gui;
+
void windowreset();
void buildwindow();
void fftresize();
@@ -72,13 +90,15 @@
public:
~qtgui_sink_c();
- void initialize();
- void initialize(QApplication *qapp);
- void start_app();
+ void exec_();
void lock();
void unlock();
+ QWidget* qwidget();
+ PyObject* pyqwidget();
- QApplication* get_qapplication();
+ void set_frequency_range(const double centerfreq,
+ const double startfreq,
+ const double stopfreq);
QApplication *d_qApplication;
qtgui_obj *d_object;
Modified: gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.cc 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.cc 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -31,39 +31,65 @@
#include <QTimer>
qtgui_sink_f_sptr
-qtgui_make_sink_f (int fftsize, const std::vector<float> &window,
- float fmin, float fmax, const std::string &name)
+qtgui_make_sink_f (int fftsize, int wintype,
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent)
{
- return qtgui_sink_f_sptr (new qtgui_sink_f (fftsize, window, fmin, fmax,
name));
+ return qtgui_sink_f_sptr (new qtgui_sink_f (fftsize, wintype,
+ fmin, fmax, name,
+ plotfreq, plotwaterfall,
+ plotwaterfall3d, plottime,
+ plotconst,
+ parent));
}
-qtgui_sink_f::qtgui_sink_f (int fftsize, const std::vector<float> &window,
- float fmin, float fmax, const std::string &name)
+qtgui_sink_f::qtgui_sink_f (int fftsize, int wintype,
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent)
: gr_block ("sink_f",
gr_make_io_signature (1, 1, sizeof(float)),
gr_make_io_signature (0, 0, 0)),
- d_fftsize(fftsize), d_window(window),
- d_fmin(fmin), d_fmax(fmax), d_name(name)
+ d_fftsize(fftsize),
+ d_wintype((gr_firdes::win_type)(wintype)),
+ d_fmin(fmin), d_fmax(fmax), d_name(name),
+ d_plotfreq(plotfreq), d_plotwaterfall(plotwaterfall),
+ d_plotwaterfall3d(plotwaterfall3d), d_plottime(plottime),
+ d_plotconst(plotconst),
+ d_parent(parent)
{
d_main_gui = NULL;
pthread_mutex_init(&d_pmutex, NULL);
lock();
- d_shift = true; // Perform fftshift operation; this is usually desired when
plotting
+ // Perform fftshift operation;
+ // this is usually desired when plotting
+ d_shift = true;
d_fft = new gri_fft_complex (d_fftsize, true);
- fftdata = new gr_complex[d_fftsize];
+ d_fftdata = new gr_complex[d_fftsize];
d_index = 0;
d_residbuf = new float[d_fftsize];
+
+ buildwindow();
+
+ initialize();
}
qtgui_sink_f::~qtgui_sink_f()
{
- delete [] fftdata;
+ delete d_object;
+ delete [] d_fftdata;
delete [] d_residbuf;
- delete d_main_gui;
delete d_fft;
}
@@ -78,23 +104,63 @@
}
void
-qtgui_sink_f::start_app()
+qtgui_sink_f::initialize()
{
- d_qApplication = new QApplication(0, NULL);
+ if(qApp != NULL) {
+ d_qApplication = qApp;
+ }
+ else {
+ int argc;
+ char **argv = NULL;
+ d_qApplication = new QApplication(argc, argv);
+ }
+
uint64_t maxBufferSize = 32768;
- d_main_gui = new SpectrumGUIClass(maxBufferSize, d_fftsize, d_fmin, d_fmax);
+ d_main_gui = new SpectrumGUIClass(maxBufferSize, d_fftsize,
+ d_fmin, d_fmax);
d_main_gui->SetDisplayTitle(d_name);
- d_main_gui->OpenSpectrumWindow(NULL);
+ d_main_gui->SetFFTSize(d_fftsize);
+ d_main_gui->SetWindowType((int)d_wintype);
- qtgui_obj object(d_qApplication);
- qApp->postEvent(&object, new qtgui_event(&d_pmutex));
+ d_main_gui->OpenSpectrumWindow(d_parent,
+ d_plotfreq, d_plotwaterfall,
+ d_plotwaterfall3d, d_plottime,
+ d_plotconst);
+ d_object = new qtgui_obj(d_qApplication);
+ qApp->postEvent(d_object, new qtgui_event(&d_pmutex));
+}
+
+void
+qtgui_sink_f::exec_()
+{
d_qApplication->exec();
}
+QWidget*
+qtgui_sink_f::qwidget()
+{
+ return d_main_gui->qwidget();
+}
+PyObject*
+qtgui_sink_f::pyqwidget()
+{
+ PyObject *w = PyLong_FromVoidPtr((void*)d_main_gui->qwidget());
+ PyObject *retarg = Py_BuildValue("N", w);
+ return retarg;
+}
+
void
+qtgui_sink_f::set_frequency_range(const double centerfreq,
+ const double startfreq,
+ const double stopfreq)
+{
+ d_main_gui->SetFrequencyRange(centerfreq, startfreq, stopfreq);
+}
+
+void
qtgui_sink_f::fft(const float *data_in, int size, gr_complex *data_out)
{
if (d_window.size()) {
@@ -104,7 +170,7 @@
}
else {
gr_complex *dst = d_fft->get_inbuf();
- for (unsigned int i = 0; i < size; i++) // float to complex
conversion
+ for (int i = 0; i < size; i++) // float to complex conversion
dst[i] = data_in[i];
}
@@ -125,7 +191,55 @@
}
}
+void
+qtgui_sink_f::windowreset()
+{
+ gr_firdes::win_type newwintype =
(gr_firdes::win_type)d_main_gui->GetWindowType();
+ if(d_wintype != newwintype) {
+ d_wintype = newwintype;
+ buildwindow();
+ }
+}
+void
+qtgui_sink_f::buildwindow()
+{
+ d_window.clear();
+ if(d_wintype != 0) {
+ d_window = gr_firdes::window(d_wintype, d_fftsize, 6.76);
+ }
+}
+
+void
+qtgui_sink_f::fftresize()
+{
+ int newfftsize = d_main_gui->GetFFTSize();
+
+ if(newfftsize != d_fftsize) {
+
+ // Resize the fftdata buffer; no need to preserve old data
+ delete [] d_fftdata;
+ d_fftdata = new gr_complex[newfftsize];
+
+ // Resize residbuf and replace data
+ delete [] d_residbuf;
+ d_residbuf = new float[newfftsize];
+
+ // Set new fft size and reset buffer index
+ // (throws away any currently held data, but who cares?)
+ d_fftsize = newfftsize;
+ d_index = 0;
+
+ // Reset window to reflect new size
+ buildwindow();
+
+ // Reset FFTW plan for new size
+ delete d_fft;
+ d_fft = new gri_fft_complex (d_fftsize, true);
+ }
+}
+
+
int
qtgui_sink_f::general_work (int noutput_items,
gr_vector_int &ninput_items,
@@ -147,19 +261,21 @@
if(d_index == d_fftsize) {
d_index = 0;
- fft(d_residbuf, d_fftsize, fftdata);
+ fft(d_residbuf, d_fftsize, d_fftdata);
- d_main_gui->UpdateWindow(true, fftdata, d_fftsize, d_residbuf, d_fftsize,
NULL, 0,
+ d_main_gui->UpdateWindow(true, d_fftdata, d_fftsize,
+ d_residbuf, d_fftsize, NULL, 0,
1.0/4.0, convert_to_timespec(0.0), true);
}
for(; i < noutput_items; i+=d_fftsize) {
if(noutput_items - i > d_fftsize) {
j += d_fftsize;
- fft(&in[i], d_fftsize, fftdata);
+ fft(&in[i], d_fftsize, d_fftdata);
- d_main_gui->UpdateWindow(true, fftdata, d_fftsize, &in[i], d_fftsize,
NULL, 0,
- 1.0/4.0, convert_to_timespec(0.0), true);
+ d_main_gui->UpdateWindow(true, d_fftdata, d_fftsize, &in[i],
+ d_fftsize, NULL, 0, 1.0/4.0,
+ convert_to_timespec(0.0), true);
}
}
Modified: gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.h
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.h 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/qtgui_sink_f.h 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -24,27 +24,46 @@
#define INCLUDED_QTGUI_SINK_F_H
#include <gr_block.h>
+#include <gr_firdes.h>
#include <gri_fft.h>
#include <qapplication.h>
#include <qtgui.h>
+#include <Python.h>
#include "SpectrumGUIClass.h"
-
class qtgui_sink_f;
typedef boost::shared_ptr<qtgui_sink_f> qtgui_sink_f_sptr;
-qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, const std::vector<float>
&window,
- float fmin=-0.5, float fmax=0.5, const
std::string &name="Display");
+qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
+ float fmin=-0.5, float fmax=0.5,
+ const std::string &name="Spectrum Display",
+ bool plotfreq=true, bool
plotwaterfall=true,
+ bool plotwaterfall3d=true, bool
plottime=true,
+ bool plotconst=true,
+ QWidget *parent=NULL);
class qtgui_sink_f : public gr_block
{
private:
- friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, const
std::vector<float> &window,
- float fmin, float fmax, const
std::string &name);
- qtgui_sink_f (int fftsize, const std::vector<float> &window,
- float fmin, float fmax, const std::string &name);
-
+ friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool
plottime,
+ bool plotconst,
+ QWidget *parent);
+ qtgui_sink_f (int fftsize, int wintype,
+ float fmin, float fmax,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plotwaterfall3d, bool plottime,
+ bool plotconst,
+ QWidget *parent);
+
+ void initialize();
+
int d_fftsize;
+ gr_firdes::win_type d_wintype;
std::vector<float> d_window;
float d_fmin;
float d_fmax;
@@ -54,24 +73,36 @@
bool d_shift;
gri_fft_complex *d_fft;
- gr_complex *fftdata;
+ gr_complex *d_fftdata;
int d_index;
float *d_residbuf;
+ bool d_plotfreq, d_plotwaterfall, d_plotwaterfall3d, d_plottime, d_plotconst;
+
+ QWidget *d_parent;
SpectrumGUIClass *d_main_gui;
+ void windowreset();
+ void buildwindow();
+ void fftresize();
void fft(const float *data_in, int size, gr_complex *data_out);
public:
~qtgui_sink_f();
- void start_app();
+ void exec_();
void lock();
void unlock();
+ QWidget* qwidget();
+ PyObject* pyqwidget();
- QApplication *d_qApplication
-;
+ void set_frequency_range(const double centerfreq,
+ const double startfreq,
+ const double stopfreq);
+ QApplication *d_qApplication;
+ qtgui_obj *d_object;
+
int general_work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
Modified: gnuradio/trunk/gr-qtgui/src/lib/spectrumUpdateEvents.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/spectrumUpdateEvents.cc 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/spectrumUpdateEvents.cc 2009-04-15
03:49:04 UTC (rev 10850)
@@ -3,8 +3,19 @@
#include <spectrumUpdateEvents.h>
-SpectrumUpdateEvent::SpectrumUpdateEvent(const std::complex<float>* fftPoints,
const uint64_t numFFTDataPoints, const double* realTimeDomainPoints, const
double* imagTimeDomainPoints, const uint64_t numTimeDomainDataPoints, const
double timePerFFT, const timespec dataTimestamp, const bool repeatDataFlag,
const bool lastOfMultipleUpdateFlag, const timespec generatedTimestamp, const
int droppedFFTFrames):QEvent(QEvent::Type(10005)){
-
+SpectrumUpdateEvent::SpectrumUpdateEvent(const std::complex<float>* fftPoints,
+ const uint64_t numFFTDataPoints,
+ const double* realTimeDomainPoints,
+ const double* imagTimeDomainPoints,
+ const uint64_t numTimeDomainDataPoints,
+ const double timePerFFT,
+ const timespec dataTimestamp,
+ const bool repeatDataFlag,
+ const bool lastOfMultipleUpdateFlag,
+ const timespec generatedTimestamp,
+ const int droppedFFTFrames)
+ : QEvent(QEvent::Type(10005))
+{
_numFFTDataPoints = numFFTDataPoints;
if(_numFFTDataPoints < 1){
_numFFTDataPoints = 1;
@@ -22,13 +33,15 @@
_realDataTimeDomainPoints = new double[_numTimeDomainDataPoints];
memset(_realDataTimeDomainPoints, 0x0,
_numTimeDomainDataPoints*sizeof(double));
if(numTimeDomainDataPoints > 0){
- memcpy(_realDataTimeDomainPoints, realTimeDomainPoints,
numTimeDomainDataPoints*sizeof(double));
+ memcpy(_realDataTimeDomainPoints, realTimeDomainPoints,
+ numTimeDomainDataPoints*sizeof(double));
}
_imagDataTimeDomainPoints = new double[_numTimeDomainDataPoints];
memset(_imagDataTimeDomainPoints, 0x0,
_numTimeDomainDataPoints*sizeof(double));
if(numTimeDomainDataPoints > 0){
- memcpy(_imagDataTimeDomainPoints, imagTimeDomainPoints,
numTimeDomainDataPoints*sizeof(double));
+ memcpy(_imagDataTimeDomainPoints, imagTimeDomainPoints,
+ numTimeDomainDataPoints*sizeof(double));
}
_dataTimestamp = dataTimestamp;
_timePerFFT = timePerFFT;
@@ -44,87 +57,126 @@
delete[] _imagDataTimeDomainPoints;
}
-const std::complex<float>* SpectrumUpdateEvent::getFFTPoints()const{
+const std::complex<float>*
+SpectrumUpdateEvent::getFFTPoints() const
+{
return _fftPoints;
}
-const double* SpectrumUpdateEvent::getRealTimeDomainPoints()const{
+const double*
+SpectrumUpdateEvent::getRealTimeDomainPoints() const
+{
return _realDataTimeDomainPoints;
}
-const double* SpectrumUpdateEvent::getImagTimeDomainPoints()const{
+const double*
+SpectrumUpdateEvent::getImagTimeDomainPoints() const
+{
return _imagDataTimeDomainPoints;
}
-uint64_t SpectrumUpdateEvent::getNumFFTDataPoints()const{
+uint64_t
+SpectrumUpdateEvent::getNumFFTDataPoints() const
+{
return _numFFTDataPoints;
}
-uint64_t SpectrumUpdateEvent::getNumTimeDomainDataPoints()const{
+uint64_t
+SpectrumUpdateEvent::getNumTimeDomainDataPoints() const
+{
return _numTimeDomainDataPoints;
}
-double SpectrumUpdateEvent::getTimePerFFT()const{
+double
+SpectrumUpdateEvent::getTimePerFFT() const
+{
return _timePerFFT;
}
-timespec SpectrumUpdateEvent::getDataTimestamp()const{
+timespec
+SpectrumUpdateEvent::getDataTimestamp() const
+{
return _dataTimestamp;
}
-bool SpectrumUpdateEvent::getRepeatDataFlag()const{
+bool
+SpectrumUpdateEvent::getRepeatDataFlag() const
+{
return _repeatDataFlag;
}
-bool SpectrumUpdateEvent::getLastOfMultipleUpdateFlag()const{
+bool
+SpectrumUpdateEvent::getLastOfMultipleUpdateFlag() const
+{
return _lastOfMultipleUpdateFlag;
}
-timespec SpectrumUpdateEvent::getEventGeneratedTimestamp()const{
+timespec
+SpectrumUpdateEvent::getEventGeneratedTimestamp() const
+{
return _eventGeneratedTimestamp;
}
-int SpectrumUpdateEvent::getDroppedFFTFrames()const{
+int
+SpectrumUpdateEvent::getDroppedFFTFrames() const
+{
return _droppedFFTFrames;
}
-SpectrumWindowCaptionEvent::SpectrumWindowCaptionEvent(const QString&
newLbl):QEvent(QEvent::Type(10008)){
+SpectrumWindowCaptionEvent::SpectrumWindowCaptionEvent(const QString& newLbl)
+ : QEvent(QEvent::Type(10008))
+{
_labelString = newLbl;
}
-SpectrumWindowCaptionEvent::~SpectrumWindowCaptionEvent(){
+SpectrumWindowCaptionEvent::~SpectrumWindowCaptionEvent()
+{
}
-QString SpectrumWindowCaptionEvent::getLabel(){
+QString
+SpectrumWindowCaptionEvent::getLabel()
+{
return _labelString;
}
-SpectrumWindowResetEvent::SpectrumWindowResetEvent():QEvent(QEvent::Type(10009)){
+SpectrumWindowResetEvent::SpectrumWindowResetEvent()
+ : QEvent(QEvent::Type(10009))
+{
}
-SpectrumWindowResetEvent::~SpectrumWindowResetEvent(){
-
+SpectrumWindowResetEvent::~SpectrumWindowResetEvent()
+{
}
- SpectrumFrequencyRangeEvent::SpectrumFrequencyRangeEvent(const double
centerFreq, const double startFreq, const double
stopFreq):QEvent(QEvent::Type(10010)){
+SpectrumFrequencyRangeEvent::SpectrumFrequencyRangeEvent(const double
centerFreq,
+ const double startFreq,
+ const double stopFreq)
+ : QEvent(QEvent::Type(10010))
+{
_centerFrequency = centerFreq;
_startFrequency = startFreq;
_stopFrequency = stopFreq;
}
-SpectrumFrequencyRangeEvent::~SpectrumFrequencyRangeEvent(){
-
+SpectrumFrequencyRangeEvent::~SpectrumFrequencyRangeEvent()
+{
}
-double SpectrumFrequencyRangeEvent::GetCenterFrequency()const{
+double
+SpectrumFrequencyRangeEvent::GetCenterFrequency() const
+{
return _centerFrequency;
}
-double SpectrumFrequencyRangeEvent::GetStartFrequency()const{
+double
+SpectrumFrequencyRangeEvent::GetStartFrequency() const
+{
return _startFrequency;
}
-double SpectrumFrequencyRangeEvent::GetStopFrequency()const{
+double
+SpectrumFrequencyRangeEvent::GetStopFrequency() const
+{
return _stopFrequency;
}
Modified: gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.cc
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.cc 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.cc 2009-04-15
03:49:04 UTC (rev 10850)
@@ -5,14 +5,16 @@
int SpectrumDisplayForm::_openGLWaterfall3DFlag = -1;
-SpectrumDisplayForm::SpectrumDisplayForm(QWidget* parent) : QDialog(parent){
+SpectrumDisplayForm::SpectrumDisplayForm(QWidget* parent)
+ : QWidget(parent)
+{
setupUi(this);
-
+
_systemSpecifiedFlag = false;
_intValidator = new QIntValidator(this);
_intValidator->setBottom(0);
- _frequencyDisplayPlot = new FrequencyDisplayPlot(Tab1PlotDisplayFrame);
- _waterfallDisplayPlot = new WaterfallDisplayPlot(Tab2PlotDisplayFrame);
+ _frequencyDisplayPlot = new FrequencyDisplayPlot(FrequencyPlotDisplayFrame);
+ _waterfallDisplayPlot = new WaterfallDisplayPlot(WaterfallPlotDisplayFrame);
_waterfall3DDisplayPlot = new
Waterfall3DDisplayPlot(Waterfall3DPlotDisplayFrame);
_timeDomainDisplayPlot = new TimeDomainDisplayPlot(TimeDomainDisplayFrame);
_constellationDisplayPlot = new
ConstellationDisplayPlot(ConstellationDisplayFrame);
@@ -42,7 +44,7 @@
_peakAmplitude = -HUGE_VAL;
_noiseFloorAmplitude = -HUGE_VAL;
-
+
connect(_waterfallDisplayPlot, SIGNAL(UpdatedLowerIntensityLevel(const
double)),
_frequencyDisplayPlot, SLOT(SetLowerIntensityLevel(const double)));
connect(_waterfallDisplayPlot, SIGNAL(UpdatedUpperIntensityLevel(const
double)),
@@ -50,16 +52,23 @@
_frequencyDisplayPlot->SetLowerIntensityLevel(-200);
_frequencyDisplayPlot->SetUpperIntensityLevel(-200);
-
+
// Load up the acceptable FFT sizes...
FFTSizeComboBox->clear();
for(long fftSize = SpectrumGUIClass::MIN_FFT_SIZE; fftSize <=
SpectrumGUIClass::MAX_FFT_SIZE; fftSize *= 2){
FFTSizeComboBox->insertItem(FFTSizeComboBox->count(),
QString("%1").arg(fftSize));
}
Reset();
+
+ ToggleTabFrequency(false);
+ ToggleTabWaterfall(false);
+ ToggleTabWaterfall3D(false);
+ ToggleTabTime(false);
+ ToggleTabConstellation(false);
}
-SpectrumDisplayForm::~SpectrumDisplayForm(){
+SpectrumDisplayForm::~SpectrumDisplayForm()
+{
// Qt deletes children when parent is deleted
// Don't worry about deleting Display Plots - they are deleted when parents
are deleted
@@ -75,9 +84,10 @@
delete _historyVector;
}
-void SpectrumDisplayForm::setSystem( SpectrumGUIClass * newSystem,
- const uint64_t numFFTDataPoints,
- const uint64_t numTimeDomainDataPoints )
+void
+SpectrumDisplayForm::setSystem( SpectrumGUIClass * newSystem,
+ const uint64_t numFFTDataPoints,
+ const uint64_t numTimeDomainDataPoints )
{
ResizeBuffers(numFFTDataPoints, numTimeDomainDataPoints);
@@ -90,7 +100,8 @@
}
}
-void SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent*
spectrumUpdateEvent)
+void
+SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent*
spectrumUpdateEvent)
{
const std::complex<float>* complexDataPoints =
spectrumUpdateEvent->getFFTPoints();
const uint64_t numFFTDataPoints = spectrumUpdateEvent->getNumFFTDataPoints();
@@ -116,12 +127,14 @@
// 75 ohm load assumption
// 10 * log10 (v^2 / (2 * 75.0 * .001)) = 10 * log10( v^2 * 15)
- *realFFTDataPointsPtr = 10.0*log10((((*complexDataPointsPtr).real() *
(*complexDataPointsPtr).real()) +
((*complexDataPointsPtr).imag()*(*complexDataPointsPtr).imag())) + 1e-20);
+ *realFFTDataPointsPtr = 10.0*log10((((*complexDataPointsPtr).real() *
(*complexDataPointsPtr).real()) +
+
((*complexDataPointsPtr).imag()*(*complexDataPointsPtr).imag())) + 1e-20);
complexDataPointsPtr++;
realFFTDataPointsPtr++;
}
+ int tabindex = SpectrumTypeTab->currentIndex();
// Don't update the averaging history if this is repeated data
if(!repeatDataFlag){
@@ -167,36 +180,46 @@
}
if(lastOfMultipleUpdatesFlag){
- _frequencyDisplayPlot->PlotNewData(_averagedValues, numFFTDataPoints,
- _noiseFloorAmplitude, _peakFrequency,
- _peakAmplitude);
- _timeDomainDisplayPlot->PlotNewData(realTimeDomainDataPoints,
- imagTimeDomainDataPoints,
- numTimeDomainDataPoints);
- _constellationDisplayPlot->PlotNewData(realTimeDomainDataPoints,
- imagTimeDomainDataPoints,
- numTimeDomainDataPoints);
- }
- // Don't update the repeated data for the waterfall
- if(!repeatDataFlag){
- _waterfallDisplayPlot->PlotNewData(_realFFTDataPoints, numFFTDataPoints,
- timePerFFT, dataTimestamp,
-
spectrumUpdateEvent->getDroppedFFTFrames());
- if( _openGLWaterfall3DFlag == 1 ){
- _waterfall3DDisplayPlot->PlotNewData(_realFFTDataPoints,
numFFTDataPoints,
+ if(tabindex == d_plot_fft) {
+ _frequencyDisplayPlot->PlotNewData(_averagedValues, numFFTDataPoints,
+ _noiseFloorAmplitude, _peakFrequency,
+ _peakAmplitude);
+ }
+ if(tabindex == d_plot_time) {
+ _timeDomainDisplayPlot->PlotNewData(realTimeDomainDataPoints,
+ imagTimeDomainDataPoints,
+ numTimeDomainDataPoints);
+ }
+ if(tabindex == d_plot_constellation) {
+ _constellationDisplayPlot->PlotNewData(realTimeDomainDataPoints,
+ imagTimeDomainDataPoints,
+ numTimeDomainDataPoints);
+ }
+
+ // Don't update the repeated data for the waterfall
+ if(!repeatDataFlag){
+ if(tabindex == d_plot_waterfall) {
+ _waterfallDisplayPlot->PlotNewData(_realFFTDataPoints,
numFFTDataPoints,
timePerFFT, dataTimestamp,
spectrumUpdateEvent->getDroppedFFTFrames());
+ }
+ if( _openGLWaterfall3DFlag == 1 && (tabindex == d_plot_waterfall3d)) {
+ _waterfall3DDisplayPlot->PlotNewData(_realFFTDataPoints,
numFFTDataPoints,
+ timePerFFT, dataTimestamp,
+
spectrumUpdateEvent->getDroppedFFTFrames());
+ }
}
+
+ // Tell the system the GUI has been updated
+ if(_systemSpecifiedFlag){
+ _system->SetLastGUIUpdateTime(generatedTimestamp);
+ _system->DecrementPendingGUIUpdateEvents();
+ }
}
-
- // Tell the system the GUI has been updated
- if(_systemSpecifiedFlag){
- _system->SetLastGUIUpdateTime(generatedTimestamp);
- _system->DecrementPendingGUIUpdateEvents();
- }
}
-void SpectrumDisplayForm::resizeEvent( QResizeEvent *e )
+void
+SpectrumDisplayForm::resizeEvent( QResizeEvent *e )
{
// Let the actual window resize its width, but not its height
QSize newSize(e->size().width(), e->oldSize().height());
@@ -207,29 +230,38 @@
SpectrumTypeTab->resize( e->size().width(), e->size().height()-60);
// Tell the TabXFreqDisplay to resize
- //Tab1PlotDisplayFrame->resize(e->size().width()-4,
- //Tab1PlotDisplayFrame->height());
- Tab1PlotDisplayFrame->resize(e->size().width()-4,
- e->size().height()-140);
- Tab2PlotDisplayFrame->resize(e->size().width()-4,
- e->size().height()-140);
- Waterfall3DPlotDisplayFrame->resize(e->size().width()-4,
- e->size().height()-140);
- TimeDomainDisplayFrame->resize(e->size().width()-4,
+ FrequencyPlotDisplayFrame->resize(e->size().width()-4,
+ e->size().height()-140);
+ _frequencyDisplayPlot->resize( FrequencyPlotDisplayFrame->width()-4,
e->size().height()-140);
- ConstellationDisplayFrame->resize(e->size().width()-4,
+
+ // Move the Power Lbl and Line Edit
+ PowerLabel->move(e->size().width()-(415-324) - PowerLabel->width(),
+ e->size().height()-135);
+ PowerLineEdit->move(e->size().width()-(415-318) - PowerLineEdit->width(),
+ e->size().height()-115);
+
+ // Move the Avg Lbl and Line Edit
+ AvgLabel->move(e->size().width()-(415-406) - AvgLabel->width(),
+ e->size().height()-135);
+ AvgLineEdit->move(e->size().width()-(415-400) - AvgLineEdit->width(),
+ e->size().height()-115);
+
+ // Move Max and Min check boxes
+ MaxHoldCheckBox->move(MaxHoldCheckBox->x(),
+ e->size().height()-135);
+ MaxHoldResetBtn->move(MaxHoldResetBtn->x(),
+ e->size().height()-135);
+ MinHoldCheckBox->move(MinHoldCheckBox->x(),
+ e->size().height()-115);
+ MinHoldResetBtn->move(MinHoldResetBtn->x(),
+ e->size().height()-115);
+
+ WaterfallPlotDisplayFrame->resize(e->size().width()-4,
e->size().height()-140);
- _frequencyDisplayPlot->resize( Tab1PlotDisplayFrame->width()-4,
+ _waterfallDisplayPlot->resize( WaterfallPlotDisplayFrame->width()-4,
e->size().height()-140);
- _waterfallDisplayPlot->resize( Tab2PlotDisplayFrame->width()-4,
- e->size().height()-140);
- _waterfall3DDisplayPlot->resize( Waterfall3DPlotDisplayFrame->width()-4,
- e->size().height()-140);
- _timeDomainDisplayPlot->resize( TimeDomainDisplayFrame->width()-4,
- e->size().height()-140);
- _constellationDisplayPlot->resize( TimeDomainDisplayFrame->width()-4,
- e->size().height()-140);
-
+
// Move the IntensityWheels and Labels
WaterfallMaximumIntensityLabel->move(width() - 5 -
WaterfallMaximumIntensityLabel->width(),
@@ -237,7 +269,7 @@
WaterfallMaximumIntensityWheel->resize(WaterfallMaximumIntensityLabel->x() -
5 -
WaterfallMaximumIntensityWheel->x(),
WaterfallMaximumIntensityWheel->height());
-
+
WaterfallMinimumIntensityLabel->move(width() - 5 -
WaterfallMinimumIntensityLabel->width(),
height() - 115);
@@ -246,14 +278,20 @@
WaterfallMaximumIntensityWheel->height());
WaterfallMinimumIntensityWheel->move(WaterfallMinimumIntensityWheel->x(),
height() - 115);
-
+ WaterfallAutoScaleBtn->move(WaterfallAutoScaleBtn->x(),
+ e->size().height()-115);
+
+ Waterfall3DPlotDisplayFrame->resize(e->size().width()-4,
+ e->size().height()-140);
+ _waterfall3DDisplayPlot->resize( Waterfall3DPlotDisplayFrame->width()-4,
+ e->size().height()-140);
+
Waterfall3DMaximumIntensityLabel->move(width() - 5 -
Waterfall3DMaximumIntensityLabel->width(),
Waterfall3DMaximumIntensityLabel->y());
Waterfall3DMaximumIntensityWheel->resize(Waterfall3DMaximumIntensityLabel->x()
- 5 -
Waterfall3DMaximumIntensityWheel->x(),
Waterfall3DMaximumIntensityWheel->height());
-
Waterfall3DMinimumIntensityLabel->move(width() - 5 -
Waterfall3DMinimumIntensityLabel->width(),
height() - 115);
@@ -262,42 +300,25 @@
Waterfall3DMaximumIntensityWheel->height());
Waterfall3DMinimumIntensityWheel->move(Waterfall3DMinimumIntensityWheel->x(),
height() - 115);
-
- // Move Waterfall and Waterfall3D Auto Scan button
- WaterfallAutoScaleBtn->move(WaterfallAutoScaleBtn->x(),
- e->size().height()-115);
Waterfall3DAutoScaleBtn->move(WaterfallAutoScaleBtn->x(),
- e->size().height()-115);
+ e->size().height()-115);
-
- // Move the Power Lbl and Line Edit
- PowerLabel->move(e->size().width()-(415-324) - PowerLabel->width(),
- e->size().height()-135);
- PowerLineEdit->move(e->size().width()-(415-318) - PowerLineEdit->width(),
- e->size().height()-115);
-
- // Move the Avg Lbl and Line Edit
- AvgLabel->move(e->size().width()-(415-406) - AvgLabel->width(),
- e->size().height()-135);
- AvgLineEdit->move(e->size().width()-(415-400) - AvgLineEdit->width(),
- e->size().height()-115);
-
- // Move Max and Min check boxes
- MaxHoldCheckBox->move(MaxHoldCheckBox->x(),
- e->size().height()-135);
- MaxHoldResetBtn->move(MaxHoldResetBtn->x(),
- e->size().height()-135);
- MinHoldCheckBox->move(MinHoldCheckBox->x(),
- e->size().height()-115);
- MinHoldResetBtn->move(MinHoldResetBtn->x(),
- e->size().height()-115);
+ TimeDomainDisplayFrame->resize(e->size().width()-4,
+ e->size().height()-140);
+ _timeDomainDisplayPlot->resize( TimeDomainDisplayFrame->width()-4,
+ e->size().height()-140);
+ ConstellationDisplayFrame->resize(e->size().width()-4,
+ e->size().height()-140);
+ _constellationDisplayPlot->resize( TimeDomainDisplayFrame->width()-4,
+ e->size().height()-140);
+
// Move the FFT Size Combobox and label
FFTSizeComboBox->move(width() - 5 - FFTSizeComboBox->width(),
height()-50);
FFTSizeLabel->move(width() - 10 - FFTSizeComboBox->width() -
FFTSizeLabel->width(),
height()-50);
-
+
// Move the lower check and combo boxes
UseRFFrequenciesCheckBox->move(UseRFFrequenciesCheckBox->x(), height()-50);
WindowLbl->move(WindowLbl->x(), height()-25);
@@ -305,7 +326,8 @@
}
-void SpectrumDisplayForm::customEvent( QEvent * e)
+void
+SpectrumDisplayForm::customEvent( QEvent * e)
{
if(e->type() == QEvent::User+3){
if(_systemSpecifiedFlag){
@@ -337,15 +359,13 @@
_openGLWaterfall3DFlag = 1;
}
}
-
+
if(_openGLWaterfall3DFlag != 1){
- SpectrumTypeTab->removeTab(SpectrumTypeTab->indexOf(Waterfall3DPage));
+ ToggleTabWaterfall3D(false);
}
// Clear any previous display
Reset();
-
- show();
}
else if(e->type() == 10005){
SpectrumUpdateEvent* spectrumUpdateEvent = (SpectrumUpdateEvent*)e;
@@ -369,7 +389,8 @@
}
}
-void SpectrumDisplayForm::AvgLineEdit_textChanged( const QString &valueString )
+void
+SpectrumDisplayForm::AvgLineEdit_textChanged( const QString &valueString )
{
if(!valueString.isEmpty()){
int value = valueString.toInt();
@@ -382,7 +403,8 @@
}
-void SpectrumDisplayForm::MaxHoldCheckBox_toggled( bool newState )
+void
+SpectrumDisplayForm::MaxHoldCheckBox_toggled( bool newState )
{
MaxHoldResetBtn->setEnabled(newState);
_frequencyDisplayPlot->SetMaxFFTVisible(newState);
@@ -390,7 +412,8 @@
}
-void SpectrumDisplayForm::MinHoldCheckBox_toggled( bool newState )
+void
+SpectrumDisplayForm::MinHoldCheckBox_toggled( bool newState )
{
MinHoldResetBtn->setEnabled(newState);
_frequencyDisplayPlot->SetMinFFTVisible(newState);
@@ -398,21 +421,24 @@
}
-void SpectrumDisplayForm::MinHoldResetBtn_clicked()
+void
+SpectrumDisplayForm::MinHoldResetBtn_clicked()
{
_frequencyDisplayPlot->ClearMinData();
_frequencyDisplayPlot->replot();
}
-void SpectrumDisplayForm::MaxHoldResetBtn_clicked()
+void
+SpectrumDisplayForm::MaxHoldResetBtn_clicked()
{
_frequencyDisplayPlot->ClearMaxData();
_frequencyDisplayPlot->replot();
}
-void SpectrumDisplayForm::PowerLineEdit_textChanged( const QString
&valueString )
+void
+SpectrumDisplayForm::PowerLineEdit_textChanged( const QString &valueString )
{
if(_systemSpecifiedFlag){
if(!valueString.isEmpty()){
@@ -435,18 +461,47 @@
}
}
-void SpectrumDisplayForm::SetFrequencyRange(const double newStartFrequency,
const double newStopFrequency, const double newCenterFrequency){
- _frequencyDisplayPlot->SetFrequencyRange(newStartFrequency,
newStopFrequency, newCenterFrequency, UseRFFrequenciesCheckBox->isChecked());
- _waterfallDisplayPlot->SetFrequencyRange(newStartFrequency,
newStopFrequency, newCenterFrequency, UseRFFrequenciesCheckBox->isChecked());
- _waterfall3DDisplayPlot->SetFrequencyRange(newStartFrequency,
newStopFrequency, newCenterFrequency, UseRFFrequenciesCheckBox->isChecked());
+void
+SpectrumDisplayForm::SetFrequencyRange(const double newStartFrequency,
+ const double newStopFrequency,
+ const double newCenterFrequency)
+{
+ double fdiff = abs(newStartFrequency - newStopFrequency);
+ if(fdiff > 0) {
+ std::string strunits[4] = {"Hz", "kHz", "MHz", "GHz"};
+ double units10 = floor(log10(fdiff));
+ double units3 = floor(units10 / 3.0);
+ double units = pow(10, units10);
+ int iunit = static_cast<int>(units3);
+
+ _frequencyDisplayPlot->SetFrequencyRange(newStartFrequency,
+ newStopFrequency,
+ newCenterFrequency,
+
UseRFFrequenciesCheckBox->isChecked(),
+ units, strunits[iunit]);
+ _waterfallDisplayPlot->SetFrequencyRange(newStartFrequency,
+ newStopFrequency,
+ newCenterFrequency,
+
UseRFFrequenciesCheckBox->isChecked(),
+ units, strunits[iunit]);
+ _waterfall3DDisplayPlot->SetFrequencyRange(newStartFrequency,
+ newStopFrequency,
+ newCenterFrequency,
+
UseRFFrequenciesCheckBox->isChecked(),
+ units, strunits[iunit]);
+ }
}
-int SpectrumDisplayForm::GetAverageCount(){
+int
+SpectrumDisplayForm::GetAverageCount()
+{
return _historyVector->size();
}
-void SpectrumDisplayForm::SetAverageCount(const int newCount){
+void
+SpectrumDisplayForm::SetAverageCount(const int newCount)
+{
if(newCount > -1){
if(newCount != static_cast<int>(_historyVector->size())){
std::vector<double*>::iterator pos;
@@ -464,10 +519,13 @@
}
}
-void SpectrumDisplayForm::_AverageHistory(const double* newBuffer){
+void
+SpectrumDisplayForm::_AverageHistory(const double* newBuffer)
+{
if(_numRealDataPoints > 0){
if(_historyVector->size() > 0){
- memcpy(_historyVector->operator[](_historyEntry), newBuffer,
_numRealDataPoints*sizeof(double));
+ memcpy(_historyVector->operator[](_historyEntry), newBuffer,
+ _numRealDataPoints*sizeof(double));
// Increment the next location to store data
_historyEntryCount++;
@@ -492,7 +550,10 @@
}
}
-void SpectrumDisplayForm::ResizeBuffers( const uint64_t numFFTDataPoints,
const uint64_t /*numTimeDomainDataPoints*/ ){
+void
+SpectrumDisplayForm::ResizeBuffers( const uint64_t numFFTDataPoints,
+ const uint64_t /*numTimeDomainDataPoints*/ )
+{
// Convert from Complex to Real for certain Displays
if(_numRealDataPoints != numFFTDataPoints){
_numRealDataPoints = numFFTDataPoints;
@@ -511,7 +572,9 @@
}
}
-void SpectrumDisplayForm::Reset(){
+void
+SpectrumDisplayForm::Reset()
+{
AverageDataReset();
_waterfallDisplayPlot->Reset();
@@ -519,7 +582,9 @@
}
-void SpectrumDisplayForm::AverageDataReset(){
+void
+SpectrumDisplayForm::AverageDataReset()
+{
_historyEntry = 0;
_historyEntryCount = 0;
@@ -530,7 +595,8 @@
}
-void SpectrumDisplayForm::closeEvent( QCloseEvent *e )
+void
+SpectrumDisplayForm::closeEvent( QCloseEvent *e )
{
if(_systemSpecifiedFlag){
_system->SetWindowOpenFlag(false);
@@ -542,7 +608,8 @@
}
-void SpectrumDisplayForm::WindowTypeChanged( int newItem )
+void
+SpectrumDisplayForm::WindowTypeChanged( int newItem )
{
if(_systemSpecifiedFlag){
_system->SetWindowType(newItem);
@@ -550,7 +617,8 @@
}
-void SpectrumDisplayForm::UseRFFrequenciesCB( bool useRFFlag )
+void
+SpectrumDisplayForm::UseRFFrequenciesCB( bool useRFFlag )
{
if(useRFFlag){
SetFrequencyRange(_startFrequency, _stopFrequency, _centerFrequency);
@@ -561,7 +629,8 @@
}
-void SpectrumDisplayForm::waterfallMaximumIntensityChangedCB( double newValue )
+void
+SpectrumDisplayForm::waterfallMaximumIntensityChangedCB( double newValue )
{
if(newValue > WaterfallMinimumIntensityWheel->value()){
WaterfallMaximumIntensityLabel->setText(QString("%1 dB").arg(newValue, 0,
'f', 0));
@@ -569,11 +638,14 @@
else{
WaterfallMaximumIntensityWheel->setValue(WaterfallMinimumIntensityWheel->value());
}
-
_waterfallDisplayPlot->SetIntensityRange(WaterfallMinimumIntensityWheel->value(),
WaterfallMaximumIntensityWheel->value());
+
+
_waterfallDisplayPlot->SetIntensityRange(WaterfallMinimumIntensityWheel->value(),
+
WaterfallMaximumIntensityWheel->value());
}
-void SpectrumDisplayForm::waterfallMinimumIntensityChangedCB( double newValue )
+void
+SpectrumDisplayForm::waterfallMinimumIntensityChangedCB( double newValue )
{
if(newValue < WaterfallMaximumIntensityWheel->value()){
WaterfallMinimumIntensityLabel->setText(QString("%1 dB").arg(newValue, 0,
'f', 0));
@@ -581,10 +653,13 @@
else{
WaterfallMinimumIntensityWheel->setValue(WaterfallMaximumIntensityWheel->value());
}
-
_waterfallDisplayPlot->SetIntensityRange(WaterfallMinimumIntensityWheel->value(),
WaterfallMaximumIntensityWheel->value());
+
+
_waterfallDisplayPlot->SetIntensityRange(WaterfallMinimumIntensityWheel->value(),
+
WaterfallMaximumIntensityWheel->value());
}
-void SpectrumDisplayForm::waterfall3DMaximumIntensityChangedCB( double
newValue )
+void
+SpectrumDisplayForm::waterfall3DMaximumIntensityChangedCB( double newValue )
{
if(newValue > Waterfall3DMinimumIntensityWheel->value()){
Waterfall3DMaximumIntensityLabel->setText(QString("%1 dB").arg(newValue,
0, 'f', 0));
@@ -592,11 +667,14 @@
else{
Waterfall3DMaximumIntensityWheel->setValue(Waterfall3DMinimumIntensityWheel->value());
}
-
_waterfall3DDisplayPlot->SetIntensityRange(Waterfall3DMinimumIntensityWheel->value(),
Waterfall3DMaximumIntensityWheel->value());
+
+
_waterfall3DDisplayPlot->SetIntensityRange(Waterfall3DMinimumIntensityWheel->value(),
+
Waterfall3DMaximumIntensityWheel->value());
}
-void SpectrumDisplayForm::waterfall3DMinimumIntensityChangedCB( double
newValue )
+void
+SpectrumDisplayForm::waterfall3DMinimumIntensityChangedCB( double newValue )
{
if(newValue < Waterfall3DMaximumIntensityWheel->value()){
Waterfall3DMinimumIntensityLabel->setText(QString("%1 dB").arg(newValue,
0, 'f', 0));
@@ -604,11 +682,14 @@
else{
Waterfall3DMinimumIntensityWheel->setValue(Waterfall3DMaximumIntensityWheel->value());
}
-
_waterfall3DDisplayPlot->SetIntensityRange(Waterfall3DMinimumIntensityWheel->value(),
Waterfall3DMaximumIntensityWheel->value());
+
+
_waterfall3DDisplayPlot->SetIntensityRange(Waterfall3DMinimumIntensityWheel->value(),
+
Waterfall3DMaximumIntensityWheel->value());
}
-void SpectrumDisplayForm::FFTComboBoxSelectedCB( const QString &fftSizeString )
+void
+SpectrumDisplayForm::FFTComboBoxSelectedCB( const QString &fftSizeString )
{
if(_systemSpecifiedFlag){
_system->SetFFTSize(fftSizeString.toLong());
@@ -616,7 +697,8 @@
}
-void SpectrumDisplayForm::WaterfallAutoScaleBtnCB()
+void
+SpectrumDisplayForm::WaterfallAutoScaleBtnCB()
{
double minimumIntensity = _noiseFloorAmplitude - 5;
if(minimumIntensity < WaterfallMinimumIntensityWheel->minValue()){
@@ -631,7 +713,8 @@
waterfallMaximumIntensityChangedCB(maximumIntensity);
}
-void SpectrumDisplayForm::Waterfall3DAutoScaleBtnCB()
+void
+SpectrumDisplayForm::Waterfall3DAutoScaleBtnCB()
{
double minimumIntensity = _noiseFloorAmplitude - 5;
if(minimumIntensity < Waterfall3DMinimumIntensityWheel->minValue()){
@@ -646,7 +729,8 @@
waterfallMaximumIntensityChangedCB(maximumIntensity);
}
-void SpectrumDisplayForm::WaterfallIntensityColorTypeChanged( int newType )
+void
+SpectrumDisplayForm::WaterfallIntensityColorTypeChanged( int newType )
{
QColor lowIntensityColor;
QColor highIntensityColor;
@@ -658,7 +742,7 @@
}
QMessageBox::information(this, "Low Intensity Color Selection", "In the
next window, select the low intensity color for the waterfall display",
QMessageBox::Ok);
lowIntensityColor = QColorDialog::getColor(lowIntensityColor, this);
-
+
// Select the High Intensity Color
highIntensityColor =
_waterfallDisplayPlot->GetUserDefinedHighIntensityColor();
if(!highIntensityColor.isValid()){
@@ -667,10 +751,12 @@
QMessageBox::information(this, "High Intensity Color Selection", "In the
next window, select the high intensity color for the waterfall display",
QMessageBox::Ok);
highIntensityColor = QColorDialog::getColor(highIntensityColor, this);
}
+
_waterfallDisplayPlot->SetIntensityColorMapType(newType, lowIntensityColor,
highIntensityColor);
}
-void SpectrumDisplayForm::Waterfall3DIntensityColorTypeChanged( int newType )
+void
+SpectrumDisplayForm::Waterfall3DIntensityColorTypeChanged( int newType )
{
QColor lowIntensityColor;
QColor highIntensityColor;
@@ -682,7 +768,7 @@
}
QMessageBox::information(this, "Low Intensity Color Selection", "In the
next window, select the low intensity color for the waterfall display",
QMessageBox::Ok);
lowIntensityColor = QColorDialog::getColor(lowIntensityColor, this);
-
+
// Select the High Intensity Color
highIntensityColor =
_waterfallDisplayPlot->GetUserDefinedHighIntensityColor();
if(!highIntensityColor.isValid()){
@@ -691,5 +777,82 @@
QMessageBox::information(this, "High Intensity Color Selection", "In the
next window, select the high intensity color for the waterfall display",
QMessageBox::Ok);
highIntensityColor = QColorDialog::getColor(highIntensityColor, this);
}
- _waterfall3DDisplayPlot->SetIntensityColorMapType(newType,
lowIntensityColor, highIntensityColor);
+ _waterfall3DDisplayPlot->SetIntensityColorMapType(newType, lowIntensityColor,
+ highIntensityColor);
}
+
+
+void
+SpectrumDisplayForm::ToggleTabFrequency(const bool state)
+{
+ if(state == true) {
+ if(d_plot_fft == -1) {
+ SpectrumTypeTab->addTab(FrequencyPage, "Frequency Display");
+ d_plot_fft = SpectrumTypeTab->count()-1;
+ }
+ }
+ else {
+ SpectrumTypeTab->removeTab(SpectrumTypeTab->indexOf(FrequencyPage));
+ d_plot_fft = -1;
+ }
+}
+
+void
+SpectrumDisplayForm::ToggleTabWaterfall(const bool state)
+{
+ if(state == true) {
+ if(d_plot_waterfall == -1) {
+ SpectrumTypeTab->addTab(WaterfallPage, "Waterfall Display");
+ d_plot_waterfall = SpectrumTypeTab->count()-1;
+ }
+ }
+ else {
+ SpectrumTypeTab->removeTab(SpectrumTypeTab->indexOf(WaterfallPage));
+ d_plot_waterfall = -1;
+ }
+}
+
+void
+SpectrumDisplayForm::ToggleTabWaterfall3D(const bool state)
+{
+ if(state == true) {
+ if(d_plot_waterfall3d == -1) {
+ SpectrumTypeTab->addTab(Waterfall3DPage, "3D Waterfall Display");
+ d_plot_waterfall3d = SpectrumTypeTab->count()-1;
+ }
+ }
+ else {
+ SpectrumTypeTab->removeTab(SpectrumTypeTab->indexOf(Waterfall3DPage));
+ d_plot_waterfall3d = -1;
+ }
+}
+
+void
+SpectrumDisplayForm::ToggleTabTime(const bool state)
+{
+ if(state == true) {
+ if(d_plot_time == -1) {
+ SpectrumTypeTab->addTab(TimeDomainPage, "Time Domain Display");
+ d_plot_time = SpectrumTypeTab->count()-1;
+ }
+ }
+ else {
+ SpectrumTypeTab->removeTab(SpectrumTypeTab->indexOf(TimeDomainPage));
+ d_plot_time = -1;
+ }
+}
+
+void
+SpectrumDisplayForm::ToggleTabConstellation(const bool state)
+{
+ if(state == true) {
+ if(d_plot_constellation == -1) {
+ SpectrumTypeTab->addTab(ConstellationPage, "Constellation Display");
+ d_plot_constellation = SpectrumTypeTab->count()-1;
+ }
+ }
+ else {
+ SpectrumTypeTab->removeTab(SpectrumTypeTab->indexOf(ConstellationPage));
+ d_plot_constellation = -1;
+ }
+}
Modified: gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.h
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.h 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.h 2009-04-15
03:49:04 UTC (rev 10850)
@@ -15,7 +15,7 @@
#include <QValidator>
#include <vector>
-class SpectrumDisplayForm : public QDialog, public Ui::SpectrumDisplayForm
+class SpectrumDisplayForm : public QWidget, public Ui::SpectrumDisplayForm
{
Q_OBJECT
@@ -23,13 +23,15 @@
SpectrumDisplayForm(QWidget* parent = 0);
~SpectrumDisplayForm();
- void setSystem( SpectrumGUIClass * newSystem, const uint64_t
numFFTDataPoints, const uint64_t numTimeDomainDataPoints );
+ void setSystem( SpectrumGUIClass * newSystem, const uint64_t
numFFTDataPoints,
+ const uint64_t numTimeDomainDataPoints );
int GetAverageCount();
void SetAverageCount( const int newCount );
void Reset();
void AverageDataReset();
- void ResizeBuffers( const uint64_t numFFTDataPoints, const uint64_t
numTimeDomainDataPoints );
+ void ResizeBuffers( const uint64_t numFFTDataPoints,
+ const uint64_t numTimeDomainDataPoints );
public slots:
void resizeEvent( QResizeEvent * e );
@@ -40,7 +42,9 @@
void MinHoldResetBtn_clicked();
void MaxHoldResetBtn_clicked();
void PowerLineEdit_textChanged( const QString& valueString );
- void SetFrequencyRange( const double newStartFrequency, const double
newStopFrequency, const double newCenterFrequency );
+ void SetFrequencyRange( const double newStartFrequency,
+ const double newStopFrequency,
+ const double newCenterFrequency );
void closeEvent( QCloseEvent * e );
void WindowTypeChanged( int newItem );
void UseRFFrequenciesCB( bool useRFFlag );
@@ -54,7 +58,13 @@
void Waterfall3DAutoScaleBtnCB();
void FFTComboBoxSelectedCB(const QString&);
+ void ToggleTabFrequency(const bool state);
+ void ToggleTabWaterfall(const bool state);
+ void ToggleTabWaterfall3D(const bool state);
+ void ToggleTabTime(const bool state);
+ void ToggleTabConstellation(const bool state);
+
private slots:
void newFrequencyData( const SpectrumUpdateEvent* );
@@ -84,6 +94,13 @@
double _peakAmplitude;
static int _openGLWaterfall3DFlag;
double _stopFrequency;
+
+ // whether or not to use a particular display
+ int d_plot_fft;
+ int d_plot_waterfall;
+ int d_plot_waterfall3d;
+ int d_plot_time;
+ int d_plot_constellation;
};
#endif /* SPECTRUM_DISPLAY_FORM_H */
Modified: gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.ui
===================================================================
--- gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.ui 2009-04-15
02:50:12 UTC (rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/lib/spectrumdisplayform.ui 2009-04-15
03:49:04 UTC (rev 10850)
@@ -1,6 +1,6 @@
<ui version="4.0" >
<class>SpectrumDisplayForm</class>
- <widget class="QDialog" name="SpectrumDisplayForm" >
+ <widget class="QWidget" name="SpectrumDisplayForm" >
<property name="geometry" >
<rect>
<x>0</x>
@@ -286,7 +286,7 @@
<bool>false</bool>
</property>
</widget>
- <widget class="QFrame" name="Tab1PlotDisplayFrame" >
+ <widget class="QFrame" name="FrequencyPlotDisplayFrame" >
<property name="geometry" >
<rect>
<x>5</x>
@@ -402,7 +402,7 @@
<bool>false</bool>
</property>
</widget>
- <widget class="QFrame" name="Tab2PlotDisplayFrame" >
+ <widget class="QFrame" name="WaterfallPlotDisplayFrame" >
<property name="geometry" >
<rect>
<x>5</x>
Modified: gnuradio/trunk/gr-qtgui/src/python/Makefile.am
===================================================================
--- gnuradio/trunk/gr-qtgui/src/python/Makefile.am 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/python/Makefile.am 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -1,5 +1,5 @@
#
-# Copyright 2004,2009 Free Software Foundation, Inc.
+# Copyright 2008,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -21,9 +21,12 @@
include $(top_srcdir)/Makefile.common
-noinst_PYTHON = \
- qttest_f.py \
- qttest_c.py
+noinst_PYTHON = \
+ pyqt_example_f.py \
+ pyqt_example.py \
+ qt_digital.py \
+ usrp2_display.py \
+ usrp_display.py
qtguipythondir = $(grpythondir)/qtgui
Copied: gnuradio/trunk/gr-qtgui/src/python/pyqt_example.py (from rev 10849,
gnuradio/branches/developers/trondeau/qtdevel2/gr-qtgui/src/python/pyqt_example.py)
===================================================================
--- gnuradio/trunk/gr-qtgui/src/python/pyqt_example.py
(rev 0)
+++ gnuradio/trunk/gr-qtgui/src/python/pyqt_example.py 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, blks2
+from gnuradio.qtgui import qtgui
+from PyQt4 import QtGui, QtCore
+import sys, sip
+
+class dialog_box(QtGui.QWidget):
+ def __init__(self, display, control):
+ QtGui.QWidget.__init__(self, None)
+ self.setWindowTitle('PyQt Test GUI')
+
+ self.boxlayout = QtGui.QBoxLayout(QtGui.QBoxLayout.LeftToRight, self)
+ self.boxlayout.addWidget(display, 1)
+ self.boxlayout.addWidget(control)
+
+ self.resize(800, 500)
+
+class control_box(QtGui.QWidget):
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.setWindowTitle('Control Panel')
+
+ self.setToolTip('Control the signals')
+ QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))
+
+ self.layout = QtGui.QFormLayout(self)
+
+ # Control the first signal
+ self.freq1Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 1 Frequency:", self.freq1Edit)
+ self.connect(self.freq1Edit, QtCore.SIGNAL("editingFinished()"),
+ self.freq1EditText)
+
+ self.amp1Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 1 Amplitude:", self.amp1Edit)
+ self.connect(self.amp1Edit, QtCore.SIGNAL("editingFinished()"),
+ self.amp1EditText)
+
+
+ # Control the second signal
+ self.freq2Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 2 Frequency:", self.freq2Edit)
+ self.connect(self.freq2Edit, QtCore.SIGNAL("editingFinished()"),
+ self.freq2EditText)
+
+
+ self.amp2Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 2 Amplitude:", self.amp2Edit)
+ self.connect(self.amp2Edit, QtCore.SIGNAL("editingFinished()"),
+ self.amp2EditText)
+
+ self.quit = QtGui.QPushButton('Close', self)
+ self.layout.addWidget(self.quit)
+
+ self.connect(self.quit, QtCore.SIGNAL('clicked()'),
+ QtGui.qApp, QtCore.SLOT('quit()'))
+
+ def attach_signal1(self, signal):
+ self.signal1 = signal
+
self.freq1Edit.setText(QtCore.QString("%1").arg(self.signal1.frequency()))
+
self.amp1Edit.setText(QtCore.QString("%1").arg(self.signal1.amplitude()))
+
+ def attach_signal2(self, signal):
+ self.signal2 = signal
+
self.freq2Edit.setText(QtCore.QString("%1").arg(self.signal2.frequency()))
+
self.amp2Edit.setText(QtCore.QString("%1").arg(self.signal2.amplitude()))
+
+ def freq1EditText(self):
+ try:
+ newfreq = float(self.freq1Edit.text())
+ self.signal1.set_frequency(newfreq)
+ except ValueError:
+ print "Bad frequency value entered"
+
+ def amp1EditText(self):
+ try:
+ newamp = float(self.amp1Edit.text())
+ self.signal1.set_amplitude(newamp)
+ except ValueError:
+ print "Bad amplitude value entered"
+
+
+ def freq2EditText(self):
+ try:
+ newfreq = float(self.freq2Edit.text())
+ self.signal2.set_frequency(newfreq)
+ except ValueError:
+ print "Bad frequency value entered"
+
+ def amp2EditText(self):
+ try:
+ newamp = float(self.amp2Edit.text())
+ self.signal2.set_amplitude(newamp)
+ except ValueError:
+ print "Bad amplitude value entered"
+
+
+class my_top_block(gr.top_block):
+ def __init__(self):
+ gr.top_block.__init__(self)
+
+ Rs = 8000
+ f1 = 1000
+ f2 = 2000
+
+ fftsize = 2048
+
+ self.qapp = QtGui.QApplication(sys.argv)
+
+ 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()
+ channel = blks2.channel_model(0.001)
+ thr = gr.throttle(gr.sizeof_gr_complex, 100*fftsize)
+ self.snk1 = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
+ -Rs/2, Rs/2,
+ "Complex Signal Example",
+ True, True, False, True, False)
+
+ self.connect(src1, (src,0))
+ self.connect(src2, (src,1))
+ self.connect(src, channel, thr, self.snk1)
+
+ self.ctrl_win = control_box()
+ self.ctrl_win.attach_signal1(src1)
+ self.ctrl_win.attach_signal2(src2)
+
+ # Get the reference pointer to the SpectrumDisplayForm QWidget
+ pyQt = self.snk1.pyqwidget()
+
+ # Wrap the pointer as a PyQt SIP object
+ # This can now be manipulated as a PyQt4.QtGui.QWidget
+ pyWin = sip.wrapinstance(pyQt, QtGui.QWidget)
+
+ self.main_box = dialog_box(pyWin, self.ctrl_win)
+
+ self.main_box.show()
+
+if __name__ == "__main__":
+ tb = my_top_block();
+ tb.start()
+ tb.qapp.exec_()
+
Copied: gnuradio/trunk/gr-qtgui/src/python/pyqt_example_f.py (from rev 10849,
gnuradio/branches/developers/trondeau/qtdevel2/gr-qtgui/src/python/pyqt_example_f.py)
===================================================================
--- gnuradio/trunk/gr-qtgui/src/python/pyqt_example_f.py
(rev 0)
+++ gnuradio/trunk/gr-qtgui/src/python/pyqt_example_f.py 2009-04-15
03:49:04 UTC (rev 10850)
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, blks2
+from gnuradio.qtgui import qtgui
+from PyQt4 import QtGui, QtCore
+import sys, sip
+
+class dialog_box(QtGui.QWidget):
+ def __init__(self, display, control):
+ QtGui.QWidget.__init__(self, None)
+ self.setWindowTitle('PyQt Test GUI')
+
+ self.boxlayout = QtGui.QBoxLayout(QtGui.QBoxLayout.LeftToRight, self)
+ self.boxlayout.addWidget(display, 1)
+ self.boxlayout.addWidget(control)
+
+ self.resize(800, 500)
+
+class control_box(QtGui.QWidget):
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.setWindowTitle('Control Panel')
+
+ self.setToolTip('Control the signals')
+ QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))
+
+ self.layout = QtGui.QFormLayout(self)
+
+ # Control the first signal
+ self.freq1Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 1 Frequency:", self.freq1Edit)
+ self.connect(self.freq1Edit, QtCore.SIGNAL("editingFinished()"),
+ self.freq1EditText)
+
+ self.amp1Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 1 Amplitude:", self.amp1Edit)
+ self.connect(self.amp1Edit, QtCore.SIGNAL("editingFinished()"),
+ self.amp1EditText)
+
+
+ # Control the second signal
+ self.freq2Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 2 Frequency:", self.freq2Edit)
+ self.connect(self.freq2Edit, QtCore.SIGNAL("editingFinished()"),
+ self.freq2EditText)
+
+
+ self.amp2Edit = QtGui.QLineEdit(self)
+ self.layout.addRow("Signal 2 Amplitude:", self.amp2Edit)
+ self.connect(self.amp2Edit, QtCore.SIGNAL("editingFinished()"),
+ self.amp2EditText)
+
+ self.quit = QtGui.QPushButton('Close', self)
+ self.layout.addWidget(self.quit)
+
+ self.connect(self.quit, QtCore.SIGNAL('clicked()'),
+ QtGui.qApp, QtCore.SLOT('quit()'))
+
+ def attach_signal1(self, signal):
+ self.signal1 = signal
+
self.freq1Edit.setText(QtCore.QString("%1").arg(self.signal1.frequency()))
+
self.amp1Edit.setText(QtCore.QString("%1").arg(self.signal1.amplitude()))
+
+ def attach_signal2(self, signal):
+ self.signal2 = signal
+
self.freq2Edit.setText(QtCore.QString("%1").arg(self.signal2.frequency()))
+
self.amp2Edit.setText(QtCore.QString("%1").arg(self.signal2.amplitude()))
+
+ def freq1EditText(self):
+ try:
+ newfreq = float(self.freq1Edit.text())
+ self.signal1.set_frequency(newfreq)
+ except ValueError:
+ print "Bad frequency value entered"
+
+ def amp1EditText(self):
+ try:
+ newamp = float(self.amp1Edit.text())
+ self.signal1.set_amplitude(newamp)
+ except ValueError:
+ print "Bad amplitude value entered"
+
+
+ def freq2EditText(self):
+ try:
+ newfreq = float(self.freq2Edit.text())
+ self.signal2.set_frequency(newfreq)
+ except ValueError:
+ print "Bad frequency value entered"
+
+ def amp2EditText(self):
+ try:
+ newamp = float(self.amp2Edit.text())
+ self.signal2.set_amplitude(newamp)
+ except ValueError:
+ print "Bad amplitude value entered"
+
+
+class my_top_block(gr.top_block):
+ def __init__(self):
+ gr.top_block.__init__(self)
+
+ Rs = 8000
+ f1 = 1000
+ f2 = 2000
+
+ fftsize = 2048
+
+ self.qapp = QtGui.QApplication(sys.argv)
+
+ src1 = gr.sig_source_f(Rs, gr.GR_SIN_WAVE, f1, 0.1, 0)
+ src2 = gr.sig_source_f(Rs, gr.GR_SIN_WAVE, f2, 0.1, 0)
+ src = gr.add_ff()
+ thr = gr.throttle(gr.sizeof_float, 100*fftsize)
+ self.snk1 = qtgui.sink_f(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
+ -Rs/2, Rs/2,
+ "Float Signal Example",
+ True, True, False, True, False)
+
+ self.connect(src1, (src,0))
+ self.connect(src2, (src,1))
+ self.connect(src, thr, self.snk1)
+
+ self.ctrl_win = control_box()
+ self.ctrl_win.attach_signal1(src1)
+ self.ctrl_win.attach_signal2(src2)
+
+ # Get the reference pointer to the SpectrumDisplayForm QWidget
+ pyQt = self.snk1.pyqwidget()
+
+ # Wrap the pointer as a PyQt SIP object
+ # This can now be manipulated as a PyQt4.QtGui.QWidget
+ pyWin = sip.wrapinstance(pyQt, QtGui.QWidget)
+
+ self.main_box = dialog_box(pyWin, self.ctrl_win)
+
+ self.main_box.show()
+
+if __name__ == "__main__":
+ tb = my_top_block();
+ tb.start()
+ tb.qapp.exec_()
+
Modified: gnuradio/trunk/gr-qtgui/src/python/qt_digital.py
===================================================================
--- gnuradio/trunk/gr-qtgui/src/python/qt_digital.py 2009-04-15 02:50:12 UTC
(rev 10849)
+++ gnuradio/trunk/gr-qtgui/src/python/qt_digital.py 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -2,12 +2,109 @@
from gnuradio import gr, blks2
from gnuradio.qtgui import qtgui
+from PyQt4 import QtGui, QtCore
+import sys, sip
import scipy
+class dialog_box(QtGui.QWidget):
+ def __init__(self, display_tx, display_rx, channel):
+ QtGui.QWidget.__init__(self, None)
+ self.setWindowTitle('Digital Signal Examples')
+
+ self.control = control_panel(channel, self)
+
+ hlayout = QtGui.QHBoxLayout()
+ hlayout.addWidget(display_tx)
+ hlayout.addWidget(display_rx)
+ hlayout.setGeometry(QtCore.QRect(0,0,100,100))
+
+ vlayout = QtGui.QVBoxLayout()
+ vlayout.addLayout(hlayout)
+ vlayout.addLayout(self.control.layout, -1)
+ #vlayout.addStretch(-1)
+
+ self.setLayout(vlayout)
+ self.resize(1000, 1000)
+
+class control_panel(QtGui.QWidget):
+ def __init__(self, channel, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.setWindowTitle('Control Panel')
+
+ self.channel = channel
+
+ self.layout = QtGui.QFormLayout()
+
+ # Set channel noise
+ self.noiseEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Noise Amplitude:", self.noiseEdit)
+ self.connect(self.noiseEdit, QtCore.SIGNAL("editingFinished()"),
+ self.noiseEditText)
+
+ # Set channel frequency offset
+ self.freqEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Frequency Offset:", self.freqEdit)
+ self.connect(self.freqEdit, QtCore.SIGNAL("editingFinished()"),
+ self.freqEditText)
+
+ # Set channel timing offset
+ self.timeEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Timing Offset:", self.timeEdit)
+ self.connect(self.timeEdit, QtCore.SIGNAL("editingFinished()"),
+ self.timeEditText)
+
+ self.quit = QtGui.QPushButton('Close', self)
+ self.layout.addRow(self.quit)
+
+ self.connect(self.quit, QtCore.SIGNAL('clicked()'),
+ QtGui.qApp, QtCore.SLOT('quit()'))
+
+ def set_noise(self, noise):
+ self.noise = noise
+ self.noiseEdit.setText(QtCore.QString("%1").arg(self.noise))
+
+ def set_frequency(self, freq):
+ self.freq = freq
+ self.freqEdit.setText(QtCore.QString("%1").arg(self.freq))
+
+ def set_time_offset(self, to):
+ self.timing_offset = to
+ self.timeEdit.setText(QtCore.QString("%1").arg(self.timing_offset))
+
+ def noiseEditText(self):
+ try:
+ noise = self.noiseEdit.text().toDouble()[0]
+ self.channel.noise.set_amplitude(noise)
+
+ self.noise = noise
+ except RuntimeError:
+ pass
+
+ def freqEditText(self):
+ try:
+ freq = self.freqEdit.text().toDouble()[0]
+ self.channel.freq_offset.set_frequency(freq)
+
+ self.freq = freq
+ except RuntimeError:
+ pass
+
+ def timeEditText(self):
+ try:
+ to = self.timeEdit.text().toDouble()[0]
+ self.channel.timing_offset.set_interp_ratio(to)
+
+ self.timing_offset = to
+ except RuntimeError:
+ pass
+
+
class my_top_block(gr.top_block):
def __init__(self):
gr.top_block.__init__(self)
+ self.qapp = QtGui.QApplication(sys.argv)
+
sps = 2
excess_bw = 0.35
gray_code = True
@@ -20,21 +117,36 @@
rrctaps = gr.firdes.root_raised_cosine(1, sps, 1, excess_bw, 21)
rx_rrc = gr.fir_filter_ccf(sps, rrctaps)
-
+
+ noise = 1e-7
+ fo = 1e-6
+ to = 1.0
+ channel = blks2.channel_model(noise, fo, to)
+
thr = gr.throttle(gr.sizeof_gr_complex, 10*fftsize)
- self.snk_tx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
-1/2, 1/2)
- self.snk_rx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
-1/2, 1/2)
+ self.snk_tx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
-1/2, 1/2,
+ "Tx", True, True, False, True, True)
- self.connect(src, mod, self.snk_tx)
- self.connect(mod, rx_rrc, thr, self.snk_rx)
+ self.snk_rx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
-1/2, 1/2,
+ "Rx", True, True, False, True, True)
+
+ self.connect(src, mod, channel, self.snk_tx)
+ self.connect(channel, rx_rrc, thr, self.snk_rx)
- self.snk_tx.initialize()
- qapp = self.snk_tx.get_qapplication()
- self.snk_rx.initialize(qapp)
+ pyTxQt = self.snk_tx.pyqwidget()
+ pyTx = sip.wrapinstance(pyTxQt, QtGui.QWidget)
+ pyRxQt = self.snk_rx.pyqwidget()
+ pyRx = sip.wrapinstance(pyRxQt, QtGui.QWidget)
+
+ self.main_box = dialog_box(pyTx, pyRx, channel)
+ self.main_box.control.set_noise(noise)
+ self.main_box.control.set_frequency(fo)
+ self.main_box.control.set_time_offset(to)
+
+ self.main_box.show()
+
if __name__ == "__main__":
tb = my_top_block();
tb.start()
- tb.snk_tx.start_app();
- #tb.wait();
-
+ tb.qapp.exec_()
Copied: gnuradio/trunk/gr-qtgui/src/python/usrp2_display.py (from rev 10849,
gnuradio/branches/developers/trondeau/qtdevel2/gr-qtgui/src/python/usrp2_display.py)
===================================================================
--- gnuradio/trunk/gr-qtgui/src/python/usrp2_display.py
(rev 0)
+++ gnuradio/trunk/gr-qtgui/src/python/usrp2_display.py 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -0,0 +1,231 @@
+#!/usr/bin/env python
+#
+# Copyright 2009 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.
+#
+
+from gnuradio import gr, gru
+from gnuradio import usrp2
+from gnuradio import eng_notation
+from gnuradio.eng_option import eng_option
+from gnuradio.qtgui import qtgui
+from optparse import OptionParser
+from PyQt4 import QtGui, QtCore
+import sys, sip
+
+class dialog_box(QtGui.QWidget):
+ def __init__(self, display, control):
+ QtGui.QWidget.__init__(self, None)
+ self.setWindowTitle('USRP2 Display')
+
+ self.boxlayout = QtGui.QBoxLayout(QtGui.QBoxLayout.LeftToRight, self)
+ self.boxlayout.addWidget(display, 1)
+ self.boxlayout.addWidget(control)
+
+ self.resize(800, 500)
+
+class control_panel(QtGui.QWidget):
+ def __init__(self, usrp, qtsink, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.setWindowTitle('USRP2 Control Panel')
+
+ self.usrp = usrp
+ self.qtsink = qtsink
+ self.adc_rate = self.usrp.adc_rate()
+
+ self.freq = 0
+ self.decim = 0
+ self.bw = 0
+ self.gain = 0
+
+ self.setToolTip('Set the values of the USRP2')
+ QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))
+
+ self.layout = QtGui.QFormLayout(self)
+
+ # Received frequency
+ self.freqEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Frequency:", self.freqEdit)
+ self.connect(self.freqEdit, QtCore.SIGNAL("editingFinished()"),
+ self.freqEditText)
+
+ # Receiver gain
+ self.gainEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Gain:", self.gainEdit)
+ self.connect(self.gainEdit, QtCore.SIGNAL("editingFinished()"),
+ self.gainEditText)
+
+
+ # Decim / Bandwidth
+ self.decimEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Decim Rate:", self.decimEdit)
+ self.connect(self.decimEdit, QtCore.SIGNAL("editingFinished()"),
+ self.decimEditText)
+
+ self.quit = QtGui.QPushButton('Close', self)
+ self.layout.addRow(self.quit)
+
+ self.connect(self.quit, QtCore.SIGNAL('clicked()'),
+ QtGui.qApp, QtCore.SLOT('quit()'))
+
+ def set_frequency(self, freq):
+ self.freq = freq
+ sfreq = eng_notation.num_to_str(self.freq)
+ self.freqEdit.setText(QtCore.QString("%1").arg(sfreq))
+
+ def set_gain(self, gain):
+ self.gain = gain
+ self.gainEdit.setText(QtCore.QString("%1").arg(self.gain))
+
+ def set_decim(self, decim):
+ self.decim = decim
+ self.bw = self.adc_rate / float(self.decim) / 1000.0
+ self.decimEdit.setText(QtCore.QString("%1").arg(self.decim))
+
+ def freqEditText(self):
+ try:
+ freq = eng_notation.str_to_num(self.freqEdit.text().toAscii())
+ r = self.usrp.set_center_freq(freq)
+ self.freq = freq
+ self.qtsink.set_frequency_range(self.freq, self.freq-self.bw/2.0,
self.freq+self.bw/2.0)
+ except RuntimeError:
+ pass
+
+ #self.set_frequency(self.freq)
+
+ def gainEditText(self):
+ try:
+ gain = float(self.gainEdit.text())
+ self.usrp.set_gain(gain)
+ self.gain = gain
+ except ValueError:
+ pass
+
+ #self.set_gain(gain)
+
+ def decimEditText(self):
+ try:
+ decim = int(self.decimEdit.text())
+ self.usrp.set_decim(decim)
+
+ self.decim = decim
+ self.bw = self.adc_rate / self.decim
+ self.qtsink.set_frequency_range(-self.bw/2.0, self.bw/2.0,
self.freq)
+
+ except ValueError:
+ pass
+
+ #self.set_decim(decim)
+
+class app_top_block(gr.top_block):
+ def __init__(self):
+ gr.top_block.__init__(self)
+
+ parser = OptionParser(option_class=eng_option)
+ parser.add_option("-e", "--interface", type="string", default="eth0",
+ help="select Ethernet interface, default is eth0")
+ parser.add_option("-m", "--mac-addr", type="string", default="",
+ help="select USRP by MAC address, default is
auto-select")
+ parser.add_option("-d", "--decim", type="int", default=16,
+ help="set fgpa decimation rate to DECIM
[default=%default]")
+ parser.add_option("-f", "--freq", type="eng_float", default=None,
+ help="set frequency to FREQ", metavar="FREQ")
+ parser.add_option("-g", "--gain", type="eng_float", default=None,
+ help="set gain in dB (default is midpoint)")
+ parser.add_option("--fft-size", type="int", default=1024,
+ help="Set number of FFT bins [default=%default]")
+ (options, args) = parser.parse_args()
+
+ if len(args) != 0:
+ parser.print_help()
+ sys.exit(1)
+ self.options = options
+ self.show_debug_info = True
+
+ self.qapp = QtGui.QApplication(sys.argv)
+
+ self.u = usrp2.source_32fc(options.interface, options.mac_addr)
+ self.u.set_decim(options.decim)
+
+ input_rate = self.u.adc_rate() / self.u.decim()
+
+ self.snk = qtgui.sink_c(options.fft_size,
gr.firdes.WIN_BLACKMAN_hARRIS,
+ -input_rate/2, input_rate/2,
+ "USRP2 Display",
+ True, True, False, True, False)
+
+ self.connect(self.u, self.snk)
+
+ if options.gain is None:
+ # if no gain was specified, use the mid-point in dB
+ g = self.u.gain_range()
+ options.gain = float(g[0]+g[1])/2
+
+ if options.freq is None:
+ # if no freq was specified, use the mid-point
+ r = self.u.freq_range()
+ options.freq = float(r[0]+r[1])/2
+
+ self.set_gain(options.gain)
+ r = self.u.set_center_freq(options.freq)
+
+ if self.show_debug_info:
+ print "Decimation rate: ", self.u.decim()
+ print "Bandwidth: ", input_rate
+ print "D'board: ", self.u.daughterboard_id()
+
+
+ self.ctrl_win = control_panel(self.u, self.snk)
+
+ self.ctrl_win.set_frequency(options.freq)
+ self.ctrl_win.set_gain(options.gain)
+ self.ctrl_win.set_decim(options.decim)
+
+ # Get the reference pointer to the SpectrumDisplayForm QWidget
+ pyQt = self.snk.pyqwidget()
+
+ # Wrap the pointer as a PyQt SIP object
+ # This can now be manipulated as a PyQt4.QtGui.QWidget
+ pyWin = sip.wrapinstance(pyQt, QtGui.QWidget)
+
+ self.main_box = dialog_box(pyWin, self.ctrl_win)
+
+ self.main_box.show()
+
+ def set_gain(self, gain):
+ self.u.set_gain(gain)
+
+ def set_decim(self, decim):
+ ok = self.u.set_decim(decim)
+ if not ok:
+ print "set_decim failed"
+ input_rate = self.u.adc_rate() / self.u.decim()
+ return ok
+
+def main ():
+ tb = app_top_block()
+ tb.start()
+ tb.snk.exec_();
+
+if __name__ == '__main__':
+ try:
+ main ()
+ except KeyboardInterrupt:
+ pass
+
Copied: gnuradio/trunk/gr-qtgui/src/python/usrp_display.py (from rev 10849,
gnuradio/branches/developers/trondeau/qtdevel2/gr-qtgui/src/python/usrp_display.py)
===================================================================
--- gnuradio/trunk/gr-qtgui/src/python/usrp_display.py
(rev 0)
+++ gnuradio/trunk/gr-qtgui/src/python/usrp_display.py 2009-04-15 03:49:04 UTC
(rev 10850)
@@ -0,0 +1,208 @@
+#!/usr/bin/env python
+
+from gnuradio import gr
+from gnuradio import usrp
+from gnuradio import eng_notation
+from gnuradio.eng_option import eng_option
+from gnuradio.qtgui import qtgui
+from optparse import OptionParser
+from PyQt4 import QtGui, QtCore
+import sys, sip
+
+class dialog_box(QtGui.QWidget):
+ def __init__(self, display, control):
+ QtGui.QWidget.__init__(self, None)
+ self.setWindowTitle('USRP FFT')
+
+ self.boxlayout = QtGui.QBoxLayout(QtGui.QBoxLayout.LeftToRight, self)
+ self.boxlayout.addWidget(display, 1)
+ self.boxlayout.addWidget(control)
+
+ self.resize(800, 500)
+
+class control_panel(QtGui.QWidget):
+ def __init__(self, usrp, subdev, qtsink, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+ self.setWindowTitle('USRP Control Panel')
+
+ self.usrp = usrp
+ self.subdev = subdev
+ self.qtsink = qtsink
+ self.adc_rate = self.usrp.converter_rate()
+
+ self.freq = 0
+ self.decim = 0
+ self.bw = 0
+ self.gain = 0
+
+ self.setToolTip('Set the values of the USRP')
+ QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))
+
+ self.layout = QtGui.QFormLayout(self)
+
+ # Received frequency
+ self.freqEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Frequency:", self.freqEdit)
+ self.connect(self.freqEdit, QtCore.SIGNAL("editingFinished()"),
+ self.freqEditText)
+
+ # Receiver gain
+ self.gainEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Gain:", self.gainEdit)
+ self.connect(self.gainEdit, QtCore.SIGNAL("editingFinished()"),
+ self.gainEditText)
+
+
+ # Decim / Bandwidth
+ self.decimEdit = QtGui.QLineEdit(self)
+ self.layout.addRow("Decim Rate:", self.decimEdit)
+ self.connect(self.decimEdit, QtCore.SIGNAL("editingFinished()"),
+ self.decimEditText)
+
+ self.quit = QtGui.QPushButton('Close', self)
+ self.layout.addRow(self.quit)
+
+ self.connect(self.quit, QtCore.SIGNAL('clicked()'),
+ QtGui.qApp, QtCore.SLOT('quit()'))
+
+ def set_frequency(self, freq):
+ self.freq = freq
+ sfreq = eng_notation.num_to_str(self.freq)
+ self.freqEdit.setText(QtCore.QString("%1").arg(sfreq))
+
+ def set_gain(self, gain):
+ self.gain = gain
+ self.gainEdit.setText(QtCore.QString("%1").arg(self.gain))
+
+ def set_decim(self, decim):
+ self.decim = decim
+ self.bw = self.adc_rate / float(self.decim) / 1000.0
+ self.decimEdit.setText(QtCore.QString("%1").arg(self.decim))
+
+ def freqEditText(self):
+ try:
+ freq = eng_notation.str_to_num(self.freqEdit.text().toAscii())
+ self.usrp.tune(0, self.subdev, freq)
+ self.freq = freq
+ self.qtsink.set_frequency_range(self.freq, self.freq-self.bw/2.0,
self.freq+self.bw/2.0)
+ except RuntimeError:
+ pass
+
+ #self.set_frequency(self.freq)
+
+ def gainEditText(self):
+ try:
+ gain = float(self.gainEdit.text())
+ self.subdev.set_gain(gain)
+ self.gain = gain
+ except ValueError:
+ pass
+
+ #self.set_gain(gain)
+
+ def decimEditText(self):
+ try:
+ decim = int(self.decimEdit.text())
+ self.usrp.set_decim_rate(decim)
+
+ self.decim = decim
+ self.bw = self.adc_rate / self.decim
+ self.qtsink.set_frequency_range(-self.bw/2.0, self.bw/2.0,
self.freq)
+
+ except ValueError:
+ pass
+
+ #self.set_decim(decim)
+
+
+class my_top_block(gr.top_block):
+ def __init__(self):
+ gr.top_block.__init__(self)
+
+ parser = OptionParser(option_class=eng_option)
+ parser.add_option("-w", "--which", type="int", default=0,
+ help="select which USRP (0, 1, ...) default is
%default",
+ metavar="NUM")
+ parser.add_option("-R", "--rx-subdev-spec", type="subdev",
default=None,
+ help="select USRP Rx side A or B (default=first one
with a daughterboard)")
+ parser.add_option("-A", "--antenna", default=None,
+ help="select Rx Antenna (only on RFX-series boards)")
+ parser.add_option("-d", "--decim", type="int", default=16,
+ help="set fgpa decimation rate to DECIM
[default=%default]")
+ parser.add_option("-f", "--freq", type="eng_float", default=None,
+ help="set frequency to FREQ", metavar="FREQ")
+ parser.add_option("-g", "--gain", type="eng_float", default=None,
+ help="set gain in dB [default is midpoint]")
+ parser.add_option("-W", "--waterfall", action="store_true",
default=False,
+ help="Enable waterfall display")
+ parser.add_option("-8", "--width-8", action="store_true",
default=False,
+ help="Enable 8-bit samples across USB")
+ parser.add_option( "--no-hb", action="store_true", default=False,
+ help="don't use halfband filter in usrp")
+ parser.add_option("-S", "--oscilloscope", action="store_true",
default=False,
+ help="Enable oscilloscope display")
+ parser.add_option("", "--avg-alpha", type="eng_float", default=1e-1,
+ help="Set fftsink averaging factor,
[default=%default]")
+ parser.add_option("", "--ref-scale", type="eng_float", default=13490.0,
+ help="Set dBFS=0dB input value, [default=%default]")
+ parser.add_option("", "--fft-size", type="int", default=1024,
+ help="Set FFT frame size, [default=%default]");
+
+ (options, args) = parser.parse_args()
+ if len(args) != 0:
+ parser.print_help()
+ sys.exit(1)
+ self.options = options
+ self.show_debug_info = True
+
+ # Call this before creating the Qt sink
+ self.qapp = QtGui.QApplication(sys.argv)
+
+ self.u = usrp.source_c(which=options.which, decim_rate=options.decim)
+ rx_subdev_spec = (0,0)
+ self.u.set_mux(usrp.determine_rx_mux_value(self.u, rx_subdev_spec))
+ self.subdev = usrp.selected_subdev(self.u, rx_subdev_spec)
+
+ if options.gain is None:
+ # if no gain was specified, use the mid-point in dB
+ g = self.subdev.gain_range()
+ options.gain = float(g[0]+g[1])/2
+ self.subdev.set_gain(options.gain)
+
+ if options.freq is None:
+ # if no frequency was specified, use the mid-point of the subdev
+ f = self.subdev.freq_range()
+ options.freq = float(f[0]+f[1])/2
+ self.u.tune(0, self.subdev, options.freq)
+
+ fftsize = 2048
+ input_rate = self.u.converter_rate() / self.u.decim_rate()
+ self.snk = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
+ -input_rate/2, input_rate/2,
+ "USRP Display",
+ True, True, False, True, False)
+
+ amp = gr.multiply_const_cc(0.001)
+ self.connect(self.u, amp, self.snk)
+
+ self.ctrl_win = control_panel(self.u, self.subdev, self.snk)
+
+ self.ctrl_win.set_frequency(options.freq)
+ self.ctrl_win.set_gain(options.gain)
+ self.ctrl_win.set_decim(options.decim)
+
+ # Get the reference pointer to the SpectrumDisplayForm QWidget
+ pyQt = self.snk.pyqwidget()
+
+ # Wrap the pointer as a PyQt SIP object
+ # This can now be manipulated as a PyQt4.QtGui.QWidget
+ pyWin = sip.wrapinstance(pyQt, QtGui.QWidget)
+
+ self.main_box = dialog_box(pyWin, self.ctrl_win)
+
+ self.main_box.show()
+
+if __name__ == "__main__":
+ tb = my_top_block();
+ tb.start()
+ tb.qapp.exec_()
Property changes on: gnuradio/trunk/gr-qtgui/src/python/usrp_display.py
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mergeinfo
+
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r10850 - in gnuradio/trunk: config gr-qtgui/src/lib gr-qtgui/src/python,
trondeau <=