Removing Waterfall3DPlot. The qwt_plot3d is too much of a hassle to deal with and...
[debian/gnuradio] / gr-qtgui / src / lib / spectrumdisplayform.cc
index 0170f78623afa3d05ed9758ffdddef051a007bbe..e0509a294853715b0f44966a1106b9ffe01c3a06 100644 (file)
@@ -17,10 +17,6 @@ SpectrumDisplayForm::SpectrumDisplayForm(bool useOpenGL, QWidget* parent)
   _frequencyDisplayPlot = new FrequencyDisplayPlot(FrequencyPlotDisplayFrame);
   _waterfallDisplayPlot = new WaterfallDisplayPlot(WaterfallPlotDisplayFrame);
 
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    _waterfall3DDisplayPlot = new Waterfall3DDisplayPlot(Waterfall3DPlotDisplayFrame);
-  }
-
   _timeDomainDisplayPlot = new TimeDomainDisplayPlot(TimeDomainDisplayFrame);
   _constellationDisplayPlot = new ConstellationDisplayPlot(ConstellationDisplayFrame);
   _numRealDataPoints = 1024;
@@ -38,14 +34,6 @@ SpectrumDisplayForm::SpectrumDisplayForm(bool useOpenGL, QWidget* parent)
   WaterfallMinimumIntensityWheel->setTickCnt(50);
   WaterfallMinimumIntensityWheel->setValue(-200);
   
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    Waterfall3DMaximumIntensityWheel->setRange(-200, 0);
-    Waterfall3DMaximumIntensityWheel->setTickCnt(50);
-    Waterfall3DMinimumIntensityWheel->setRange(-200, 0);
-    Waterfall3DMinimumIntensityWheel->setTickCnt(50);
-    Waterfall3DMinimumIntensityWheel->setValue(-200);
-  }
-
   _peakFrequency = 0;
   _peakAmplitude = -HUGE_VAL;
   
@@ -68,7 +56,6 @@ SpectrumDisplayForm::SpectrumDisplayForm(bool useOpenGL, QWidget* parent)
 
   ToggleTabFrequency(false);
   ToggleTabWaterfall(false);
-  ToggleTabWaterfall3D(false);
   ToggleTabTime(false);
   ToggleTabConstellation(false);
 
@@ -82,7 +69,7 @@ SpectrumDisplayForm::~SpectrumDisplayForm()
   // Qt deletes children when parent is deleted
 
   // Don't worry about deleting Display Plots - they are deleted when parents are deleted
-  /*   delete _intValidator; */
+  delete _intValidator;
 
   delete[] _realFFTDataPoints;
   delete[] _averagedValues;
@@ -93,6 +80,7 @@ SpectrumDisplayForm::~SpectrumDisplayForm()
 
   delete _historyVector;
 
+  displayTimer->stop();
   delete displayTimer;
 }
 
@@ -121,7 +109,7 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   const double* realTimeDomainDataPoints = spectrumUpdateEvent->getRealTimeDomainPoints();
   const double* imagTimeDomainDataPoints = spectrumUpdateEvent->getImagTimeDomainPoints();
   const uint64_t numTimeDomainDataPoints = spectrumUpdateEvent->getNumTimeDomainDataPoints();
-  const timespec dataTimestamp = spectrumUpdateEvent->getDataTimestamp();;
+  const timespec dataTimestamp = spectrumUpdateEvent->getDataTimestamp();
   const bool repeatDataFlag = spectrumUpdateEvent->getRepeatDataFlag();
   const bool lastOfMultipleUpdatesFlag = spectrumUpdateEvent->getLastOfMultipleUpdateFlag();
   const timespec generatedTimestamp = spectrumUpdateEvent->getEventGeneratedTimestamp();
@@ -133,18 +121,24 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   const std::complex<float>* complexDataPointsPtr = complexDataPoints+numFFTDataPoints/2;
   double* realFFTDataPointsPtr = _realFFTDataPoints;
 
+  double sumMean = 0.0;
+  double localPeakAmplitude = -HUGE_VAL;
+  double localPeakFrequency = 0.0;
+  const double fftBinSize = (_stopFrequency-_startFrequency) /
+    static_cast<double>(numFFTDataPoints);
+
   // Run this twice to perform the fftshift operation on the data here as well
+  std::complex<float> scaleFactor = std::complex<float>((float)numFFTDataPoints);
   for(uint64_t point = 0; point < numFFTDataPoints/2; point++){
-    // Calculate dBm
-    // 50 ohm load assumption
-    // 10 * log10 (v^2 / (2 * 50.0 * .001)) = 10 * log10( v^2 * 10)
-    // 75 ohm load assumption
-    // 10 * log10 (v^2 / (2 * 75.0 * .001)) = 10 * log10( v^2 * 15)
-
-    // perform scaling here
-    std::complex<float> pt = (*complexDataPointsPtr) / std::complex<float>((float)numFFTDataPoints);
+    std::complex<float> pt = (*complexDataPointsPtr) / scaleFactor;
     *realFFTDataPointsPtr = 10.0*log10((pt.real() * pt.real() + pt.imag()*pt.imag()) + 1e-20);
 
+    if(*realFFTDataPointsPtr > localPeakAmplitude) {
+      localPeakFrequency = static_cast<float>(point) * fftBinSize;
+      localPeakAmplitude = *realFFTDataPointsPtr;
+    }
+    sumMean += *realFFTDataPointsPtr;
+    
     complexDataPointsPtr++;
     realFFTDataPointsPtr++;
   }
@@ -153,9 +147,15 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   // second half of the plotted data
   complexDataPointsPtr = complexDataPoints;
   for(uint64_t point = 0; point < numFFTDataPoints/2; point++){
-    std::complex<float> pt = (*complexDataPointsPtr) / std::complex<float>((float)numFFTDataPoints);
+    std::complex<float> pt = (*complexDataPointsPtr) / scaleFactor;
     *realFFTDataPointsPtr = 10.0*log10((pt.real() * pt.real() + pt.imag()*pt.imag()) + 1e-20);
 
+    if(*realFFTDataPointsPtr > localPeakAmplitude) {
+      localPeakFrequency = static_cast<float>(point) * fftBinSize;
+      localPeakAmplitude = *realFFTDataPointsPtr;
+    }
+    sumMean += *realFFTDataPointsPtr;
+
     complexDataPointsPtr++;
     realFFTDataPointsPtr++;
   }
@@ -164,24 +164,9 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   if(!repeatDataFlag){
     _AverageHistory(_realFFTDataPoints);
 
-    double sumMean;
-    const double fft_bin_size = (_stopFrequency-_startFrequency) /
-      static_cast<double>(numFFTDataPoints);
-
-    // find the peak, sum (for mean), etc
-    _peakAmplitude = -HUGE_VAL;
-    sumMean = 0.0;
-    for(uint64_t number = 0; number < numFFTDataPoints; number++){
-      // find peak
-      if(_realFFTDataPoints[number] > _peakAmplitude){
-       // Calculate the frequency relative to the local bw, adjust for _startFrequency later
-        _peakFrequency = (static_cast<float>(number) * fft_bin_size);
-        _peakAmplitude = _realFFTDataPoints[number];
-        // _peakBin = number;
-      }
-      // sum (for mean)
-      sumMean += _realFFTDataPoints[number];
-    }
+    // Only use the local info if we are not repeating data
+    _peakAmplitude = localPeakAmplitude;
+    _peakFrequency = localPeakFrequency;
 
     // calculate the spectral mean
     // +20 because for the comparison below we only want to throw out bins
@@ -231,13 +216,6 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
                                           d_update_time, dataTimestamp, 
                                           spectrumUpdateEvent->getDroppedFFTFrames());
       }
-      if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-       if( _openGLWaterfall3DFlag == 1 && (tabindex == d_plot_waterfall3d)) {
-         _waterfall3DDisplayPlot->PlotNewData(_realFFTDataPoints, numFFTDataPoints, 
-                                              d_update_time, dataTimestamp, 
-                                              spectrumUpdateEvent->getDroppedFFTFrames());
-       }
-      }
     }
 
     
@@ -265,12 +243,6 @@ SpectrumDisplayForm::resizeEvent( QResizeEvent *e )
   s.setHeight(WaterfallPlotDisplayFrame->height());
   emit _waterfallDisplayPlot->resizeSlot(&s);
 
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    s.setWidth(Waterfall3DPlotDisplayFrame->width());
-    s.setHeight(Waterfall3DPlotDisplayFrame->height());
-    emit _waterfall3DDisplayPlot->resizeSlot(&s);
-  }
-
   s.setWidth(ConstellationDisplayFrame->width());
   s.setHeight(ConstellationDisplayFrame->height());
   emit _constellationDisplayPlot->resizeSlot(&s);
@@ -289,30 +261,6 @@ SpectrumDisplayForm::customEvent( QEvent * e)
     waterfallMinimumIntensityChangedCB(WaterfallMinimumIntensityWheel->value());
     waterfallMaximumIntensityChangedCB(WaterfallMaximumIntensityWheel->value());
 
-    // If the video card doesn't support OpenGL then don't display the 3D Waterfall
-    if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-      waterfall3DMinimumIntensityChangedCB(Waterfall3DMinimumIntensityWheel->value());
-      waterfall3DMaximumIntensityChangedCB(Waterfall3DMaximumIntensityWheel->value());
-      
-      // Check for Hardware Acceleration of the OpenGL
-      if(!_waterfall3DDisplayPlot->format().directRendering()){
-       // Only ask this once while the program is running...
-       if(_openGLWaterfall3DFlag == -1){
-         _openGLWaterfall3DFlag = 0;
-         if(QMessageBox::warning(this, "OpenGL Direct Rendering NOT Supported", "<center>The system's video card hardware or current drivers do not support direct hardware rendering of the OpenGL modules.</center><br><center>Software rendering is VERY processor intensive.</center><br><center>Do you want to use software rendering?</center>", QMessageBox::Yes, QMessageBox::No | QMessageBox::Default | QMessageBox::Escape) == QMessageBox::Yes){
-           _openGLWaterfall3DFlag = 1;
-         }
-       }
-      }
-      else{
-       _openGLWaterfall3DFlag = 1;
-      }
-    }
-    
-    if(_openGLWaterfall3DFlag != 1){
-      ToggleTabWaterfall3D(false);
-    }
-
     // Clear any previous display
     Reset();
   }
@@ -345,8 +293,6 @@ SpectrumDisplayForm::UpdateGuiTimer()
   // all of the plots.
   _frequencyDisplayPlot->canvas()->update();
   _waterfallDisplayPlot->canvas()->update();
-  //if((QGLFormat::hasOpenGL()) && (_useOpenGL))
-  //_waterfall3DDisplayPlot->canvas()->update();
   _timeDomainDisplayPlot->canvas()->update();
   _constellationDisplayPlot->canvas()->update();
 }
@@ -415,6 +361,7 @@ SpectrumDisplayForm::SetFrequencyRange(const double newCenterFrequency,
 
   if(fdiff > 0) {
     std::string strunits[4] = {"Hz", "kHz", "MHz", "GHz"};
+    std::string strtime[4] = {"sec", "ms", "us", "ns"};
     double units10 = floor(log10(fdiff));
     double units3  = std::max(floor(units10 / 3.0), 0.0);
     double units = pow(10, (units10-fmod(units10, 3.0)));
@@ -424,23 +371,18 @@ SpectrumDisplayForm::SetFrequencyRange(const double newCenterFrequency,
     _stopFrequency = newStopFrequency;
     _centerFrequency = newCenterFrequency;
 
-    _frequencyDisplayPlot->SetFrequencyRange(newStartFrequency,
-                                            newStopFrequency,
-                                            newCenterFrequency,
+    _frequencyDisplayPlot->SetFrequencyRange(_startFrequency,
+                                            _stopFrequency,
+                                            _centerFrequency,
                                             UseRFFrequenciesCheckBox->isChecked(),
                                             units, strunits[iunit]);
-    _waterfallDisplayPlot->SetFrequencyRange(newStartFrequency,
-                                            newStopFrequency,
-                                            newCenterFrequency,
+    _waterfallDisplayPlot->SetFrequencyRange(_startFrequency,
+                                            _stopFrequency,
+                                            _centerFrequency,
                                             UseRFFrequenciesCheckBox->isChecked(),
                                             units, strunits[iunit]);
-    if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-      _waterfall3DDisplayPlot->SetFrequencyRange(newStartFrequency,
-                                                newStopFrequency,
-                                                newCenterFrequency,
-                                                UseRFFrequenciesCheckBox->isChecked(),
-                                                units, strunits[iunit]);
-    }
+    _timeDomainDisplayPlot->SetSampleRate(_stopFrequency - _startFrequency,
+                                         units, strtime[iunit]);
   }
 }
 
@@ -529,9 +471,6 @@ SpectrumDisplayForm::Reset()
   AverageDataReset();
 
   _waterfallDisplayPlot->Reset();
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    _waterfall3DDisplayPlot->Reset();
-  }
 }
 
 
@@ -606,40 +545,6 @@ SpectrumDisplayForm::waterfallMinimumIntensityChangedCB( double newValue )
                                           WaterfallMaximumIntensityWheel->value());
 }
 
-void
-SpectrumDisplayForm::waterfall3DMaximumIntensityChangedCB( double newValue )
-{
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    if(newValue > Waterfall3DMinimumIntensityWheel->value()){
-      Waterfall3DMaximumIntensityLabel->setText(QString("%1 dB").arg(newValue, 0, 'f', 0));
-    }
-    else{
-      Waterfall3DMaximumIntensityWheel->setValue(Waterfall3DMinimumIntensityWheel->value());
-    }
-    
-    _waterfall3DDisplayPlot->SetIntensityRange(Waterfall3DMinimumIntensityWheel->value(),
-                                              Waterfall3DMaximumIntensityWheel->value());
-  }
-}
-
-
-void
-SpectrumDisplayForm::waterfall3DMinimumIntensityChangedCB( double newValue )
-{
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    if(newValue < Waterfall3DMaximumIntensityWheel->value()){
-      Waterfall3DMinimumIntensityLabel->setText(QString("%1 dB").arg(newValue, 0, 'f', 0));
-    }
-    else{
-      Waterfall3DMinimumIntensityWheel->setValue(Waterfall3DMaximumIntensityWheel->value());
-    }
-    
-    _waterfall3DDisplayPlot->SetIntensityRange(Waterfall3DMinimumIntensityWheel->value(),
-                                              Waterfall3DMaximumIntensityWheel->value());
-  }
-}
-
-
 void
 SpectrumDisplayForm::FFTComboBoxSelectedCB( const QString &fftSizeString )
 {
@@ -665,24 +570,6 @@ SpectrumDisplayForm::WaterfallAutoScaleBtnCB()
   waterfallMaximumIntensityChangedCB(maximumIntensity);
 }
 
-void
-SpectrumDisplayForm::Waterfall3DAutoScaleBtnCB()
-{
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    double minimumIntensity = _noiseFloorAmplitude - 5;
-    if(minimumIntensity < Waterfall3DMinimumIntensityWheel->minValue()){
-      minimumIntensity = Waterfall3DMinimumIntensityWheel->minValue();
-    }
-    Waterfall3DMinimumIntensityWheel->setValue(minimumIntensity);
-    double maximumIntensity = _peakAmplitude + 10;
-    if(maximumIntensity > Waterfall3DMaximumIntensityWheel->maxValue()){
-      maximumIntensity = Waterfall3DMaximumIntensityWheel->maxValue();
-    }
-    Waterfall3DMaximumIntensityWheel->setValue(maximumIntensity);
-    waterfallMaximumIntensityChangedCB(maximumIntensity);
-  }
-}
-
 void
 SpectrumDisplayForm::WaterfallIntensityColorTypeChanged( int newType )
 {
@@ -709,35 +596,6 @@ SpectrumDisplayForm::WaterfallIntensityColorTypeChanged( int newType )
   _waterfallDisplayPlot->SetIntensityColorMapType(newType, lowIntensityColor, highIntensityColor);
 }
 
-void
-SpectrumDisplayForm::Waterfall3DIntensityColorTypeChanged( int newType )
-{
-  if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-    QColor lowIntensityColor;
-    QColor highIntensityColor;
-    if(newType == Waterfall3DDisplayPlot::INTENSITY_COLOR_MAP_TYPE_USER_DEFINED){
-      // Select the Low Intensity Color
-      lowIntensityColor = _waterfallDisplayPlot->GetUserDefinedLowIntensityColor();
-      if(!lowIntensityColor.isValid()){
-       lowIntensityColor = Qt::black;
-      }
-      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()){
-       highIntensityColor = Qt::white;
-      }
-      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);
-  }
-}
-
-
 void
 SpectrumDisplayForm::ToggleTabFrequency(const bool state)
 {
@@ -768,23 +626,6 @@ SpectrumDisplayForm::ToggleTabWaterfall(const bool state)
   }
 }
 
-void
-SpectrumDisplayForm::ToggleTabWaterfall3D(const bool state)
-{
-  if(state == true) {
-    if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
-      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)
 {