summaryrefslogtreecommitdiff
path: root/gr-qtgui/include/qtgui
diff options
context:
space:
mode:
Diffstat (limited to 'gr-qtgui/include/qtgui')
-rw-r--r--gr-qtgui/include/qtgui/CMakeLists.txt52
-rw-r--r--gr-qtgui/include/qtgui/ConstellationDisplayPlot.h70
-rw-r--r--gr-qtgui/include/qtgui/DisplayPlot.h287
-rw-r--r--gr-qtgui/include/qtgui/FrequencyDisplayPlot.h160
-rw-r--r--gr-qtgui/include/qtgui/SpectrumGUIClass.h130
-rw-r--r--gr-qtgui/include/qtgui/TimeDomainDisplayPlot.h67
-rw-r--r--gr-qtgui/include/qtgui/TimeRasterDisplayPlot.h104
-rw-r--r--gr-qtgui/include/qtgui/WaterfallDisplayPlot.h121
-rw-r--r--gr-qtgui/include/qtgui/api.h2
-rw-r--r--gr-qtgui/include/qtgui/const_sink_c.h1
-rw-r--r--gr-qtgui/include/qtgui/constellationdisplayform.h62
-rw-r--r--gr-qtgui/include/qtgui/displayform.h131
-rw-r--r--gr-qtgui/include/qtgui/form_menus.h1001
-rw-r--r--gr-qtgui/include/qtgui/freqdisplayform.h74
-rw-r--r--gr-qtgui/include/qtgui/plot_raster.h93
-rw-r--r--gr-qtgui/include/qtgui/plot_waterfall.h89
-rw-r--r--gr-qtgui/include/qtgui/qtgui_types.h196
-rw-r--r--gr-qtgui/include/qtgui/spectrumUpdateEvents.h264
-rw-r--r--gr-qtgui/include/qtgui/spectrumdisplayform.h139
-rw-r--r--gr-qtgui/include/qtgui/timeRasterGlobalData.h78
-rw-r--r--gr-qtgui/include/qtgui/timedisplayform.h77
-rw-r--r--gr-qtgui/include/qtgui/timerasterdisplayform.h89
-rw-r--r--gr-qtgui/include/qtgui/waterfallGlobalData.h81
-rw-r--r--gr-qtgui/include/qtgui/waterfalldisplayform.h95
24 files changed, 3447 insertions, 16 deletions
diff --git a/gr-qtgui/include/qtgui/CMakeLists.txt b/gr-qtgui/include/qtgui/CMakeLists.txt
index f3ef6808e8..8f95837fec 100644
--- a/gr-qtgui/include/qtgui/CMakeLists.txt
+++ b/gr-qtgui/include/qtgui/CMakeLists.txt
@@ -21,19 +21,41 @@
# Install the header files
########################################################################
install(FILES
- api.h
- time_sink_c.h
- time_sink_f.h
- time_raster_sink_b.h
- time_raster_sink_f.h
- freq_sink_c.h
- freq_sink_f.h
- const_sink_c.h
- waterfall_sink_c.h
- waterfall_sink_f.h
- sink_c.h
- sink_f.h
- utils.h
- DESTINATION ${GR_INCLUDE_DIR}/gnuradio/qtgui
- COMPONENT "qtgui_devel"
+ api.h
+ CMakeLists.txt
+ constellationdisplayform.h
+ ConstellationDisplayPlot.h
+ const_sink_c.h
+ displayform.h
+ DisplayPlot.h
+ form_menus.h
+ freqdisplayform.h
+ freq_sink_c.h
+ freq_sink_f.h
+ FrequencyDisplayPlot.h
+ plot_raster.h
+ plot_waterfall.h
+ qtgui_types.h
+ sink_c.h
+ sink_f.h
+ spectrumdisplayform.h
+ SpectrumGUIClass.h
+ spectrumUpdateEvents.h
+ timedisplayform.h
+ TimeDomainDisplayPlot.h
+ timerasterdisplayform.h
+ TimeRasterDisplayPlot.h
+ timeRasterGlobalData.h
+ time_raster_sink_b.h
+ time_raster_sink_f.h
+ time_sink_c.h
+ time_sink_f.h
+ utils.h
+ waterfalldisplayform.h
+ WaterfallDisplayPlot.h
+ waterfallGlobalData.h
+ waterfall_sink_c.h
+ waterfall_sink_f.h
+ DESTINATION ${GR_INCLUDE_DIR}/gnuradio/qtgui
+ COMPONENT "qtgui_devel"
)
diff --git a/gr-qtgui/include/qtgui/ConstellationDisplayPlot.h b/gr-qtgui/include/qtgui/ConstellationDisplayPlot.h
new file mode 100644
index 0000000000..2c33a74301
--- /dev/null
+++ b/gr-qtgui/include/qtgui/ConstellationDisplayPlot.h
@@ -0,0 +1,70 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef CONSTELLATION_DISPLAY_PLOT_H
+#define CONSTELLATION_DISPLAY_PLOT_H
+
+#include <stdint.h>
+#include <cstdio>
+#include <vector>
+#include <qtgui/DisplayPlot.h>
+
+class ConstellationDisplayPlot : public DisplayPlot
+{
+ Q_OBJECT
+
+public:
+ ConstellationDisplayPlot(int nplots, QWidget*);
+ virtual ~ConstellationDisplayPlot();
+
+ void plotNewData(const std::vector<double*> realDataPoints,
+ const std::vector<double*> imagDataPoints,
+ const int64_t numDataPoints,
+ const double timeInterval);
+
+ // Old method to be removed
+ void plotNewData(const double* realDataPoints,
+ const double* imagDataPoints,
+ const int64_t numDataPoints,
+ const double timeInterval);
+
+ void replot();
+
+ void set_xaxis(double min, double max);
+ void set_yaxis(double min, double max);
+ void set_axis(double xmin, double xmax,
+ double ymin, double ymax);
+ void set_pen_size(int size);
+
+public slots:
+ void setAutoScale(bool state);
+
+private:
+ void _autoScale(double bottom, double top);
+
+ std::vector<double*> _realDataPoints;
+ std::vector<double*> _imagDataPoints;
+
+ int64_t _penSize;
+};
+
+#endif /* CONSTELLATION_DISPLAY_PLOT_H */
diff --git a/gr-qtgui/include/qtgui/DisplayPlot.h b/gr-qtgui/include/qtgui/DisplayPlot.h
new file mode 100644
index 0000000000..d9ee16e087
--- /dev/null
+++ b/gr-qtgui/include/qtgui/DisplayPlot.h
@@ -0,0 +1,287 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef DOMAIN_DISPLAY_PLOT_H
+#define DOMAIN_DISPLAY_PLOT_H
+
+#include <stdint.h>
+#include <cstdio>
+#include <vector>
+#include <qwt_plot.h>
+#include <qwt_painter.h>
+#include <qwt_plot_canvas.h>
+#include <qwt_plot_curve.h>
+#include <qwt_scale_engine.h>
+#include <qwt_scale_widget.h>
+#include <qwt_plot_zoomer.h>
+#include <qwt_plot_panner.h>
+#include <qwt_plot_magnifier.h>
+#include <qwt_plot_marker.h>
+#include <qwt_symbol.h>
+#include <qtgui/utils.h>
+
+#if QWT_VERSION >= 0x060000
+#include <qwt_compat.h>
+#endif
+
+typedef QList<QColor> QColorList;
+Q_DECLARE_METATYPE ( QColorList )
+
+class DisplayPlot:public QwtPlot{
+ Q_OBJECT
+
+ Q_PROPERTY ( QColor line_color1 READ getLineColor1 WRITE setLineColor1 )
+ Q_PROPERTY ( QColor line_color2 READ getLineColor2 WRITE setLineColor2 )
+ Q_PROPERTY ( QColor line_color3 READ getLineColor3 WRITE setLineColor3 )
+ Q_PROPERTY ( QColor line_color4 READ getLineColor4 WRITE setLineColor4 )
+ Q_PROPERTY ( QColor line_color5 READ getLineColor5 WRITE setLineColor5 )
+ Q_PROPERTY ( QColor line_color6 READ getLineColor6 WRITE setLineColor6 )
+ Q_PROPERTY ( QColor line_color7 READ getLineColor7 WRITE setLineColor7 )
+ Q_PROPERTY ( QColor line_color8 READ getLineColor8 WRITE setLineColor8 )
+ Q_PROPERTY ( QColor line_color9 READ getLineColor9 WRITE setLineColor9 )
+
+ Q_PROPERTY ( int line_width1 READ getLineWidth1 WRITE setLineWidth1 )
+ Q_PROPERTY ( int line_width2 READ getLineWidth2 WRITE setLineWidth2 )
+ Q_PROPERTY ( int line_width3 READ getLineWidth3 WRITE setLineWidth3 )
+ Q_PROPERTY ( int line_width4 READ getLineWidth4 WRITE setLineWidth4 )
+ Q_PROPERTY ( int line_width5 READ getLineWidth5 WRITE setLineWidth5 )
+ Q_PROPERTY ( int line_width6 READ getLineWidth6 WRITE setLineWidth6 )
+ Q_PROPERTY ( int line_width7 READ getLineWidth7 WRITE setLineWidth7 )
+ Q_PROPERTY ( int line_width8 READ getLineWidth8 WRITE setLineWidth8 )
+ Q_PROPERTY ( int line_width9 READ getLineWidth9 WRITE setLineWidth9 )
+
+ Q_PROPERTY ( Qt::PenStyle line_style1 READ getLineStyle1 WRITE setLineStyle1 )
+ Q_PROPERTY ( Qt::PenStyle line_style2 READ getLineStyle2 WRITE setLineStyle2 )
+ Q_PROPERTY ( Qt::PenStyle line_style3 READ getLineStyle3 WRITE setLineStyle3 )
+ Q_PROPERTY ( Qt::PenStyle line_style4 READ getLineStyle4 WRITE setLineStyle4 )
+ Q_PROPERTY ( Qt::PenStyle line_style5 READ getLineStyle5 WRITE setLineStyle5 )
+ Q_PROPERTY ( Qt::PenStyle line_style6 READ getLineStyle6 WRITE setLineStyle6 )
+ Q_PROPERTY ( Qt::PenStyle line_style7 READ getLineStyle7 WRITE setLineStyle7 )
+ Q_PROPERTY ( Qt::PenStyle line_style8 READ getLineStyle8 WRITE setLineStyle8 )
+ Q_PROPERTY ( Qt::PenStyle line_style9 READ getLineStyle9 WRITE setLineStyle9 )
+
+ typedef QwtSymbol::Style QwtSymbolStyle;
+
+ Q_ENUMS ( QwtSymbolStyle )
+ Q_PROPERTY ( QwtSymbolStyle line_marker1 READ getLineMarker1 WRITE setLineMarker1 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker2 READ getLineMarker2 WRITE setLineMarker2 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker3 READ getLineMarker3 WRITE setLineMarker3 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker4 READ getLineMarker4 WRITE setLineMarker4 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker5 READ getLineMarker5 WRITE setLineMarker5 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker6 READ getLineMarker6 WRITE setLineMarker6 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker7 READ getLineMarker7 WRITE setLineMarker7 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker8 READ getLineMarker8 WRITE setLineMarker8 )
+ Q_PROPERTY ( QwtSymbolStyle line_marker9 READ getLineMarker9 WRITE setLineMarker9 )
+
+ Q_PROPERTY ( int marker_alpha1 READ getMarkerAlpha1 WRITE setMarkerAlpha1 )
+ Q_PROPERTY ( int marker_alpha2 READ getMarkerAlpha2 WRITE setMarkerAlpha2 )
+ Q_PROPERTY ( int marker_alpha3 READ getMarkerAlpha3 WRITE setMarkerAlpha3 )
+ Q_PROPERTY ( int marker_alpha4 READ getMarkerAlpha4 WRITE setMarkerAlpha4 )
+ Q_PROPERTY ( int marker_alpha5 READ getMarkerAlpha5 WRITE setMarkerAlpha5 )
+ Q_PROPERTY ( int marker_alpha6 READ getMarkerAlpha6 WRITE setMarkerAlpha6 )
+ Q_PROPERTY ( int marker_alpha7 READ getMarkerAlpha7 WRITE setMarkerAlpha7 )
+ Q_PROPERTY ( int marker_alpha8 READ getMarkerAlpha8 WRITE setMarkerAlpha8 )
+ Q_PROPERTY ( int marker_alpha9 READ getMarkerAlpha9 WRITE setMarkerAlpha9 )
+
+ Q_PROPERTY ( QColor zoomer_color READ getZoomerColor WRITE setZoomerColor )
+ Q_PROPERTY ( QColor palette_color READ getPaletteColor WRITE setPaletteColor )
+ Q_PROPERTY ( int yaxis_label_font_size READ getYaxisLabelFontSize WRITE setYaxisLabelFontSize )
+ Q_PROPERTY ( int xaxis_label_font_size READ getXaxisLabelFontSize WRITE setXaxisLabelFontSize )
+ Q_PROPERTY ( int axes_label_font_size READ getAxesLabelFontSize WRITE setAxesLabelFontSize )
+
+public:
+ DisplayPlot(int nplots, QWidget*);
+ virtual ~DisplayPlot();
+
+ virtual void replot() = 0;
+
+ const QColor getLineColor1 () const;
+ const QColor getLineColor2 () const;
+ const QColor getLineColor3 () const;
+ const QColor getLineColor4 () const;
+ const QColor getLineColor5 () const;
+ const QColor getLineColor6 () const;
+ const QColor getLineColor7 () const;
+ const QColor getLineColor8 () const;
+ const QColor getLineColor9 () const;
+
+ int getLineWidth1 () const;
+ int getLineWidth2 () const;
+ int getLineWidth3 () const;
+ int getLineWidth4 () const;
+ int getLineWidth5 () const;
+ int getLineWidth6 () const;
+ int getLineWidth7 () const;
+ int getLineWidth8 () const;
+ int getLineWidth9 () const;
+
+ const Qt::PenStyle getLineStyle1 () const;
+ const Qt::PenStyle getLineStyle2 () const;
+ const Qt::PenStyle getLineStyle3 () const;
+ const Qt::PenStyle getLineStyle4 () const;
+ const Qt::PenStyle getLineStyle5 () const;
+ const Qt::PenStyle getLineStyle6 () const;
+ const Qt::PenStyle getLineStyle7 () const;
+ const Qt::PenStyle getLineStyle8 () const;
+ const Qt::PenStyle getLineStyle9 () const;
+
+ const QwtSymbol::Style getLineMarker1 () const;
+ const QwtSymbol::Style getLineMarker2 () const;
+ const QwtSymbol::Style getLineMarker3 () const;
+ const QwtSymbol::Style getLineMarker4 () const;
+ const QwtSymbol::Style getLineMarker5 () const;
+ const QwtSymbol::Style getLineMarker6 () const;
+ const QwtSymbol::Style getLineMarker7 () const;
+ const QwtSymbol::Style getLineMarker8 () const;
+ const QwtSymbol::Style getLineMarker9 () const;
+
+ int getMarkerAlpha1 () const;
+ int getMarkerAlpha2 () const;
+ int getMarkerAlpha3 () const;
+ int getMarkerAlpha4 () const;
+ int getMarkerAlpha5 () const;
+ int getMarkerAlpha6 () const;
+ int getMarkerAlpha7 () const;
+ int getMarkerAlpha8 () const;
+ int getMarkerAlpha9 () const;
+
+ QColor getZoomerColor() const;
+ QColor getPaletteColor() const;
+ int getAxisLabelFontSize(int axisId) const;
+ int getYaxisLabelFontSize() const;
+ int getXaxisLabelFontSize() const;
+ int getAxesLabelFontSize() const;
+
+ // Make sure to create your won PlotNewData method in the derived
+ // class:
+ // void PlotNewData(...);
+
+public slots:
+ void setYaxis(double min, double max);
+ void setXaxis(double min, double max);
+ void setLineLabel(int which, QString label);
+ QString getLineLabel(int which);
+ void setLineColor(int which, QColor color);
+ QColor getLineColor(int which) const;
+ void setLineWidth(int which, int width);
+ int getLineWidth(int which) const;
+ void setLineStyle(int which, Qt::PenStyle style);
+ const Qt::PenStyle getLineStyle(int which) const;
+ void setLineMarker(int which, QwtSymbol::Style marker);
+ const QwtSymbol::Style getLineMarker(int which) const;
+ void setMarkerAlpha(int which, int alpha);
+ int getMarkerAlpha(int which) const;
+ // Need a function for each curve for setting via stylesheet.
+ // Can't use preprocessor directives because we're inside a Q_OBJECT.
+ void setLineColor1 (QColor);
+ void setLineColor2 (QColor);
+ void setLineColor3 (QColor);
+ void setLineColor4 (QColor);
+ void setLineColor5 (QColor);
+ void setLineColor6 (QColor);
+ void setLineColor7 (QColor);
+ void setLineColor8 (QColor);
+ void setLineColor9 (QColor);
+
+ void setLineWidth1 (int);
+ void setLineWidth2 (int);
+ void setLineWidth3 (int);
+ void setLineWidth4 (int);
+ void setLineWidth5 (int);
+ void setLineWidth6 (int);
+ void setLineWidth7 (int);
+ void setLineWidth8 (int);
+ void setLineWidth9 (int);
+
+ void setLineStyle1 (Qt::PenStyle);
+ void setLineStyle2 (Qt::PenStyle);
+ void setLineStyle3 (Qt::PenStyle);
+ void setLineStyle4 (Qt::PenStyle);
+ void setLineStyle5 (Qt::PenStyle);
+ void setLineStyle6 (Qt::PenStyle);
+ void setLineStyle7 (Qt::PenStyle);
+ void setLineStyle8 (Qt::PenStyle);
+ void setLineStyle9 (Qt::PenStyle);
+
+ void setLineMarker1 (QwtSymbol::Style);
+ void setLineMarker2 (QwtSymbol::Style);
+ void setLineMarker3 (QwtSymbol::Style);
+ void setLineMarker4 (QwtSymbol::Style);
+ void setLineMarker5 (QwtSymbol::Style);
+ void setLineMarker6 (QwtSymbol::Style);
+ void setLineMarker7 (QwtSymbol::Style);
+ void setLineMarker8 (QwtSymbol::Style);
+ void setLineMarker9 (QwtSymbol::Style);
+
+ void setMarkerAlpha1 (int);
+ void setMarkerAlpha2 (int);
+ void setMarkerAlpha3 (int);
+ void setMarkerAlpha4 (int);
+ void setMarkerAlpha5 (int);
+ void setMarkerAlpha6 (int);
+ void setMarkerAlpha7 (int);
+ void setMarkerAlpha8 (int);
+ void setMarkerAlpha9 (int);
+
+ void setZoomerColor(QColor c);
+ void setPaletteColor(QColor c);
+ void setAxisLabelFontSize(int axisId, int fs);
+ void setYaxisLabelFontSize(int fs);
+ void setXaxisLabelFontSize(int fs);
+ void setAxesLabelFontSize(int fs);
+
+ void setStop(bool on);
+
+ void resizeSlot(QSize *s);
+
+ // Because of the preprocessing of slots in QT, these are not
+ // easily separated by the version check. Make one for each
+ // version until it's worked out.
+ void onPickerPointSelected(const QwtDoublePoint & p);
+ void onPickerPointSelected6(const QPointF & p);
+
+signals:
+ void plotPointSelected(const QPointF p);
+
+protected slots:
+ void legendEntryChecked(QwtPlotItem *plotItem, bool on);
+
+protected:
+ int _nplots;
+ std::vector<QwtPlotCurve*> _plot_curve;
+
+ QwtPlotPanner* _panner;
+ QwtPlotZoomer* _zoomer;
+
+ QwtDblClickPlotPicker *_picker;
+ QwtPlotMagnifier *_magnifier;
+
+ int64_t _numPoints;
+
+ bool _stop;
+
+ QList<QColor> _trace_colors;
+
+ bool _autoscale_state;
+};
+
+#endif /* DOMAIN_DISPLAY_PLOT_H */
diff --git a/gr-qtgui/include/qtgui/FrequencyDisplayPlot.h b/gr-qtgui/include/qtgui/FrequencyDisplayPlot.h
new file mode 100644
index 0000000000..ae438f143f
--- /dev/null
+++ b/gr-qtgui/include/qtgui/FrequencyDisplayPlot.h
@@ -0,0 +1,160 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2011 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.
+ */
+
+#ifndef FREQUENCY_DISPLAY_PLOT_HPP
+#define FREQUENCY_DISPLAY_PLOT_HPP
+
+#include <stdint.h>
+#include <cstdio>
+#include <vector>
+#include <qtgui/DisplayPlot.h>
+
+class FrequencyDisplayPlot: public DisplayPlot
+{
+ Q_OBJECT
+
+ Q_PROPERTY ( QColor min_fft_color READ getMinFFTColor WRITE setMinFFTColor )
+ Q_PROPERTY ( QColor max_fft_color READ getMaxFFTColor WRITE setMaxFFTColor )
+ Q_PROPERTY ( bool min_fft_visible READ getMinFFTVisible WRITE setMinFFTVisible )
+ Q_PROPERTY ( bool max_fft_visible READ getMaxFFTVisible WRITE setMaxFFTVisible )
+ Q_PROPERTY ( QColor marker_lower_intensity_color READ getMarkerLowerIntensityColor WRITE setMarkerLowerIntensityColor )
+ Q_PROPERTY ( bool marker_lower_intensity_visible READ getMarkerLowerIntensityVisible WRITE setMarkerLowerIntensityVisible )
+ Q_PROPERTY ( QColor marker_upper_intensity_color READ getMarkerUpperIntensityColor WRITE setMarkerUpperIntensityColor )
+ Q_PROPERTY ( bool marker_upper_intensity_visible READ getMarkerUpperIntensityVisible WRITE setMarkerUpperIntensityVisible )
+ Q_PROPERTY ( QColor marker_peak_amplitude_color READ getMarkerPeakAmplitudeColor WRITE setMarkerPeakAmplitudeColor )
+ Q_PROPERTY ( QColor marker_noise_floor_amplitude_color READ getMarkerNoiseFloorAmplitudeColor WRITE setMarkerNoiseFloorAmplitudeColor )
+ Q_PROPERTY ( bool marker_noise_floor_amplitude_visible READ getMarkerNoiseFloorAmplitudeVisible WRITE setMarkerNoiseFloorAmplitudeVisible )
+ Q_PROPERTY ( QColor marker_CF_color READ getMarkerCFColor WRITE setMarkerCFColor )
+
+public:
+ FrequencyDisplayPlot(int nplots, QWidget*);
+ virtual ~FrequencyDisplayPlot();
+
+ void setFrequencyRange(const double, const double,
+ const double units=1000.0,
+ const std::string &strunits = "kHz");
+ double getStartFrequency()const;
+ double getStopFrequency()const;
+
+ void plotNewData(const std::vector<double*> dataPoints,
+ const int64_t numDataPoints,
+ const double noiseFloorAmplitude, const double peakFrequency,
+ const double peakAmplitude, const double timeInterval);
+
+ // Old method to be removed
+ void plotNewData(const double* dataPoints,
+ const int64_t numDataPoints,
+ const double noiseFloorAmplitude, const double peakFrequency,
+ const double peakAmplitude, const double timeInterval);
+
+ void clearMaxData();
+ void clearMinData();
+
+ void replot();
+
+ void setYaxis(double min, double max);
+
+ void setTraceColour (QColor);
+ void setBGColour (QColor c);
+ void showCFMarker (const bool);
+
+ const bool getMaxFFTVisible() const;
+ const bool getMinFFTVisible() const;
+ const QColor getMinFFTColor() const;
+ const QColor getMaxFFTColor() const;
+ const QColor getMarkerLowerIntensityColor () const;
+ const bool getMarkerLowerIntensityVisible () const;
+ const QColor getMarkerUpperIntensityColor () const;
+ const bool getMarkerUpperIntensityVisible () const;
+ const QColor getMarkerPeakAmplitudeColor () const;
+ const bool getMarkerNoiseFloorAmplitudeVisible () const;
+ const QColor getMarkerNoiseFloorAmplitudeColor () const;
+ const QColor getMarkerCFColor () const;
+
+public slots:
+ void setMaxFFTVisible(const bool);
+ void setMinFFTVisible(const bool);
+ void setMinFFTColor (QColor c);
+ void setMaxFFTColor (QColor c);
+ void setMarkerLowerIntensityColor (QColor c);
+ void setMarkerLowerIntensityVisible (bool visible);
+ void setMarkerUpperIntensityColor (QColor c);
+ void setMarkerUpperIntensityVisible (bool visible);
+ void setMarkerPeakAmplitudeColor (QColor c);
+ void setMarkerNoiseFloorAmplitudeVisible (bool visible);
+ void setMarkerNoiseFloorAmplitudeColor (QColor c);
+ void setMarkerCFColor (QColor c);
+
+ void setLowerIntensityLevel(const double);
+ void setUpperIntensityLevel(const double);
+
+ void onPickerPointSelected(const QwtDoublePoint & p);
+ void onPickerPointSelected6(const QPointF & p);
+
+ void setAutoScale(bool state);
+
+private:
+ void _resetXAxisPoints();
+ void _autoScale(double bottom, double top);
+
+ std::vector<double*> _dataPoints;
+
+ QwtPlotCurve* _min_fft_plot_curve;
+ QwtPlotCurve* _max_fft_plot_curve;
+ QColor _min_fft_color;
+ bool _min_fft_visible;
+ QColor _max_fft_color;
+ bool _max_fft_visible;
+ QColor _marker_lower_intensity_color;
+ bool _marker_lower_intensity_visible;
+ QColor _marker_upper_intensity_color;
+ bool _marker_upper_intensity_visible;
+ QColor _marker_peak_amplitude_color;
+ QColor _marker_noise_floor_amplitude_color;
+ bool _marker_noise_floor_amplitude_visible;
+ QColor _marker_CF_color;
+
+ double _startFrequency;
+ double _stopFrequency;
+ double _maxYAxis;
+ double _minYAxis;
+
+ QwtPlotMarker* _lower_intensity_marker;
+ QwtPlotMarker* _upper_intensity_marker;
+
+ QwtPlotMarker *_markerPeakAmplitude;
+ QwtPlotMarker *_markerNoiseFloorAmplitude;
+ QwtPlotMarker *_markerCF;
+
+ double* _xAxisPoints;
+ int _xAxisMultiplier;
+
+ double* _minFFTPoints;
+ double* _maxFFTPoints;
+
+ double _peakFrequency;
+ double _peakAmplitude;
+
+ double _noiseFloorAmplitude;
+};
+
+#endif /* FREQUENCY_DISPLAY_PLOT_HPP */
diff --git a/gr-qtgui/include/qtgui/SpectrumGUIClass.h b/gr-qtgui/include/qtgui/SpectrumGUIClass.h
new file mode 100644
index 0000000000..48b6a37501
--- /dev/null
+++ b/gr-qtgui/include/qtgui/SpectrumGUIClass.h
@@ -0,0 +1,130 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2011 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.
+ */
+
+#ifndef SPECTRUM_GUI_CLASS_HPP
+#define SPECTRUM_GUI_CLASS_HPP
+
+#include <thread/thread.h>
+#include <qwidget.h>
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qslider.h>
+#include <qtgui/spectrumUpdateEvents.h>
+
+class SpectrumDisplayForm;
+#include <qtgui/spectrumdisplayform.h>
+
+#include <cmath>
+
+#include <complex>
+#include <vector>
+#include <string>
+
+class SpectrumGUIClass
+{
+public:
+ SpectrumGUIClass(const uint64_t maxDataSize, const uint64_t fftSize,
+ const double newCenterFrequency,
+ const double newStartFrequency,
+ const double newStopFrequency);
+ ~SpectrumGUIClass();
+ void reset();
+
+ void openSpectrumWindow(QWidget*,
+ const bool frequency=true, const bool waterfall=true,
+ const bool time=true, const bool constellation=true);
+ void setDisplayTitle(const std::string);
+
+ bool getWindowOpenFlag();
+ void setWindowOpenFlag(const bool);
+
+ void setFrequencyRange(const double, const double, const double);
+ double getStartFrequency();
+ double getStopFrequency();
+ double getCenterFrequency();
+
+ void updateWindow(const bool, const float*,
+ const uint64_t, const float*,
+ const uint64_t, const float*,
+ const uint64_t,
+ const gr::high_res_timer_type, const bool);
+
+ float getPowerValue();
+ void setPowerValue(const float);
+
+ int getWindowType();
+ void setWindowType(const int);
+
+ int getFFTSize();
+ int getFFTSizeIndex();
+ void setFFTSize(const int);
+
+ gr::high_res_timer_type getLastGUIUpdateTime();
+ void setLastGUIUpdateTime(const gr::high_res_timer_type);
+
+ unsigned int getPendingGUIUpdateEvents();
+ void incrementPendingGUIUpdateEvents();
+ void decrementPendingGUIUpdateEvents();
+ void resetPendingGUIUpdateEvents();
+
+ static const long MAX_FFT_SIZE;
+ static const long MIN_FFT_SIZE;
+
+ QWidget* qwidget();
+
+ void setTimeDomainAxis(double min, double max);
+ void setConstellationAxis(double xmin, double xmax,
+ double ymin, double ymax);
+ void setConstellationPenSize(int size);
+ void setFrequencyAxis(double min, double max);
+
+ void setUpdateTime(double t);
+
+protected:
+
+private:
+
+ gr::thread::mutex d_mutex;
+ int64_t _dataPoints;
+ std::string _title;
+ double _centerFrequency;
+ double _startFrequency;
+ double _stopFrequency;
+ float _powerValue;
+ bool _windowOpennedFlag;
+ int _windowType;
+ int64_t _lastDataPointCount;
+ int _fftSize;
+ gr::high_res_timer_type _lastGUIUpdateTime;
+ unsigned int _pendingGUIUpdateEventsCount;
+ int _droppedEntriesCount;
+ bool _fftBuffersCreatedFlag;
+ double _updateTime;
+
+ SpectrumDisplayForm* _spectrumDisplayForm;
+
+ float* _fftPoints;
+ double* _realTimeDomainPoints;
+ double* _imagTimeDomainPoints;
+};
+
+#endif /* SPECTRUM_GUI_CLASS_HPP */
diff --git a/gr-qtgui/include/qtgui/TimeDomainDisplayPlot.h b/gr-qtgui/include/qtgui/TimeDomainDisplayPlot.h
new file mode 100644
index 0000000000..f7e695d51b
--- /dev/null
+++ b/gr-qtgui/include/qtgui/TimeDomainDisplayPlot.h
@@ -0,0 +1,67 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef TIME_DOMAIN_DISPLAY_PLOT_H
+#define TIME_DOMAIN_DISPLAY_PLOT_H
+
+#include <stdint.h>
+#include <cstdio>
+#include <vector>
+#include <qtgui/DisplayPlot.h>
+
+class TimeDomainDisplayPlot: public DisplayPlot
+{
+ Q_OBJECT
+
+public:
+ TimeDomainDisplayPlot(int nplots, QWidget*);
+ virtual ~TimeDomainDisplayPlot();
+
+ void plotNewData(const std::vector<double*> dataPoints,
+ const int64_t numDataPoints, const double timeInterval);
+
+ void replot();
+
+ void stemPlot(bool en);
+
+public slots:
+ void setSampleRate(double sr, double units,
+ const std::string &strunits);
+
+ void setAutoScale(bool state);
+ void setSemilogx(bool en);
+ void setSemilogy(bool en);
+
+private:
+ void _resetXAxisPoints();
+ void _autoScale(double bottom, double top);
+
+ std::vector<double*> _dataPoints;
+ double* _xAxisPoints;
+
+ double _sampleRate;
+
+ bool d_semilogx;
+ bool d_semilogy;
+};
+
+#endif /* TIME_DOMAIN_DISPLAY_PLOT_H */
diff --git a/gr-qtgui/include/qtgui/TimeRasterDisplayPlot.h b/gr-qtgui/include/qtgui/TimeRasterDisplayPlot.h
new file mode 100644
index 0000000000..fce22e9df1
--- /dev/null
+++ b/gr-qtgui/include/qtgui/TimeRasterDisplayPlot.h
@@ -0,0 +1,104 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012,2013 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.
+ */
+
+#ifndef TIMERASTER_DISPLAY_PLOT_H
+#define TIMERASTER_DISPLAY_PLOT_H
+
+#include <stdint.h>
+#include <cstdio>
+#include <vector>
+#include <qwt_plot_rasteritem.h>
+#include <qtgui/DisplayPlot.h>
+#include <qtgui/timeRasterGlobalData.h>
+#include <qtgui/plot_raster.h>
+#include <high_res_timer.h>
+
+#if QWT_VERSION < 0x060000
+#include <qtgui/plot_waterfall.h>
+#else
+#include <qwt_compat.h>
+#endif
+
+class TimeRasterDisplayPlot: public DisplayPlot
+{
+ Q_OBJECT
+
+public:
+ TimeRasterDisplayPlot(int nplots,
+ double samp_rate,
+ double rows, double cols,
+ QWidget*);
+ virtual ~TimeRasterDisplayPlot();
+
+ void reset();
+
+ void setNumRows(double rows);
+ void setNumCols(double cols);
+ void setAlpha(int which, int alpha);
+ void setSampleRate(double samprate);
+
+ double numRows() const;
+ double numCols() const;
+
+ int getAlpha(int which);
+
+ void setPlotDimensions(const double rows, const double cols,
+ const double units, const std::string &strunits);
+
+ void plotNewData(const std::vector<double*> dataPoints,
+ const int64_t numDataPoints);
+
+ void plotNewData(const double* dataPoints,
+ const int64_t numDataPoints);
+
+ void setIntensityRange(const double minIntensity,
+ const double maxIntensity);
+
+ void replot(void);
+
+ int getIntensityColorMapType(int) const;
+ void setIntensityColorMapType(const int, const int, const QColor, const QColor);
+ const QColor getUserDefinedLowIntensityColor() const;
+ const QColor getUserDefinedHighIntensityColor() const;
+
+ double getMinIntensity(int which) const;
+ double getMaxIntensity(int which) const;
+
+signals:
+ void updatedLowerIntensityLevel(const double);
+ void updatedUpperIntensityLevel(const double);
+
+private:
+ void _updateIntensityRangeDisplay();
+
+ std::vector<TimeRasterData*> d_data;
+ std::vector<PlotTimeRaster*> d_raster;
+
+ double d_samp_rate;
+ double d_rows, d_cols;
+
+ std::vector<int> d_color_map_type;
+ QColor d_low_intensity;
+ QColor d_high_intensity;
+};
+
+#endif /* TIMERASTER_DISPLAY_PLOT_H */
diff --git a/gr-qtgui/include/qtgui/WaterfallDisplayPlot.h b/gr-qtgui/include/qtgui/WaterfallDisplayPlot.h
new file mode 100644
index 0000000000..6659f4f2d6
--- /dev/null
+++ b/gr-qtgui/include/qtgui/WaterfallDisplayPlot.h
@@ -0,0 +1,121 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WATERFALL_DISPLAY_PLOT_H
+#define WATERFALL_DISPLAY_PLOT_H
+
+#include <stdint.h>
+#include <cstdio>
+#include <vector>
+#include <qwt_plot_spectrogram.h>
+#include <qtgui/DisplayPlot.h>
+#include <qtgui/waterfallGlobalData.h>
+#include <high_res_timer.h>
+
+#if QWT_VERSION < 0x060000
+#include <qtgui/plot_waterfall.h>
+#else
+#include <qwt_compat.h>
+#endif
+
+class WaterfallDisplayPlot: public DisplayPlot
+{
+ Q_OBJECT
+
+ Q_PROPERTY ( int intensity_color_map_type1 READ getIntensityColorMapType1 WRITE setIntensityColorMapType1 )
+ Q_PROPERTY ( QColor low_intensity_color READ getUserDefinedLowIntensityColor WRITE setUserDefinedLowIntensityColor )
+ Q_PROPERTY ( QColor high_intensity_color READ getUserDefinedHighIntensityColor WRITE setUserDefinedHighIntensityColor )
+
+
+public:
+ WaterfallDisplayPlot(int nplots, QWidget*);
+ virtual ~WaterfallDisplayPlot();
+
+ void resetAxis();
+
+ void setFrequencyRange(const double, const double,
+ const double units=1000.0,
+ const std::string &strunits = "kHz");
+ double getStartFrequency() const;
+ double getStopFrequency() const;
+
+ void plotNewData(const std::vector<double*> dataPoints,
+ const int64_t numDataPoints,
+ const double timePerFFT,
+ const gr::high_res_timer_type timestamp,
+ const int droppedFrames);
+
+ // to be removed
+ void plotNewData(const double* dataPoints,
+ const int64_t numDataPoints,
+ const double timePerFFT,
+ const gr::high_res_timer_type timestamp,
+ const int droppedFrames);
+
+ void setIntensityRange(const double minIntensity, const double maxIntensity);
+ double getMinIntensity(int which) const;
+ double getMaxIntensity(int which) const;
+
+ void replot(void);
+ void clearData();
+
+ int getIntensityColorMapType(int) const;
+ int getIntensityColorMapType1() const;
+ const QColor getUserDefinedLowIntensityColor() const;
+ const QColor getUserDefinedHighIntensityColor() const;
+
+ int getAlpha(int which);
+ void setAlpha(int which, int alpha);
+
+public slots:
+ void setIntensityColorMapType(const int, const int, const QColor, const QColor);
+ void setIntensityColorMapType1(int);
+ void setUserDefinedLowIntensityColor(QColor);
+ void setUserDefinedHighIntensityColor(QColor);
+
+signals:
+ void updatedLowerIntensityLevel(const double);
+ void updatedUpperIntensityLevel(const double);
+
+private:
+ void _updateIntensityRangeDisplay();
+
+ double _startFrequency;
+ double _stopFrequency;
+ int _xAxisMultiplier;
+
+ std::vector<WaterfallData*> d_data;
+
+#if QWT_VERSION < 0x060000
+ std::vector<PlotWaterfall*> d_spectrogram;
+#else
+ std::vector<QwtPlotSpectrogram*> d_spectrogram;
+#endif
+
+ gr::high_res_timer_type _lastReplot;
+
+ std::vector<int> _intensityColorMapType;
+ QColor _userDefinedLowIntensityColor;
+ QColor _userDefinedHighIntensityColor;
+};
+
+#endif /* WATERFALL_DISPLAY_PLOT_H */
diff --git a/gr-qtgui/include/qtgui/api.h b/gr-qtgui/include/qtgui/api.h
index e88948e07b..888dd656c8 100644
--- a/gr-qtgui/include/qtgui/api.h
+++ b/gr-qtgui/include/qtgui/api.h
@@ -22,7 +22,7 @@
#ifndef INCLUDED_QTGUI_API_H
#define INCLUDED_QTGUI_API_H
-#include <gruel/attributes.h>
+#include <attributes.h>
#ifdef gnuradio_qtgui_EXPORTS
# define QTGUI_API __GR_ATTR_EXPORT
diff --git a/gr-qtgui/include/qtgui/const_sink_c.h b/gr-qtgui/include/qtgui/const_sink_c.h
index e0c358bcad..b81c53295f 100644
--- a/gr-qtgui/include/qtgui/const_sink_c.h
+++ b/gr-qtgui/include/qtgui/const_sink_c.h
@@ -28,6 +28,7 @@
#include <gr_sync_block.h>
#include <qapplication.h>
#include <filter/firdes.h>
+
namespace gr {
namespace qtgui {
diff --git a/gr-qtgui/include/qtgui/constellationdisplayform.h b/gr-qtgui/include/qtgui/constellationdisplayform.h
new file mode 100644
index 0000000000..40cfe8999f
--- /dev/null
+++ b/gr-qtgui/include/qtgui/constellationdisplayform.h
@@ -0,0 +1,62 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef CONSTELLATION_DISPLAY_FORM_H
+#define CONSTELLATION_DISPLAY_FORM_H
+
+#include <qtgui/spectrumUpdateEvents.h>
+#include <qtgui/ConstellationDisplayPlot.h>
+#include <QtGui/QtGui>
+#include <vector>
+
+#include <qtgui/displayform.h>
+
+class ConstellationDisplayForm : public DisplayForm
+{
+ Q_OBJECT
+
+public:
+ ConstellationDisplayForm(int nplots=1, QWidget* parent = 0);
+ ~ConstellationDisplayForm();
+
+ ConstellationDisplayPlot* getPlot();
+
+ int getNPoints() const;
+
+public slots:
+ void customEvent(QEvent * e);
+ void setNPoints(const int);
+
+ void setSampleRate(const QString &samprate);
+ void setYaxis(double min, double max);
+ void setXaxis(double min, double max);
+ void autoScale(bool en);
+
+private slots:
+ void newData(const QEvent*);
+
+private:
+ QIntValidator* _intValidator;
+ int d_npoints;
+};
+
+#endif /* CONSTELLATION_DISPLAY_FORM_H */
diff --git a/gr-qtgui/include/qtgui/displayform.h b/gr-qtgui/include/qtgui/displayform.h
new file mode 100644
index 0000000000..47f17ad41d
--- /dev/null
+++ b/gr-qtgui/include/qtgui/displayform.h
@@ -0,0 +1,131 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef DISPLAY_FORM_H
+#define DISPLAY_FORM_H
+
+#include <qtgui/spectrumUpdateEvents.h>
+#include <QtGui/QtGui>
+#include <vector>
+
+#include <qwt_plot_grid.h>
+#include <qwt_plot_layout.h>
+
+#include <qtgui/DisplayPlot.h>
+#include <qtgui/form_menus.h>
+
+class DisplayForm : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ DisplayForm(int nplots=1, QWidget* parent = 0);
+ ~DisplayForm();
+
+ virtual DisplayPlot* getPlot() = 0;
+ void Reset();
+ bool isClosed() const;
+
+ void enableMenu(bool en=true);
+
+public slots:
+ void resizeEvent( QResizeEvent * e );
+ void mousePressEvent( QMouseEvent * e);
+ virtual void customEvent( QEvent * e ) = 0;
+
+ void closeEvent( QCloseEvent * e );
+
+ void setUpdateTime(double t);
+
+ void setTitle(const QString &title);
+ void setLineLabel(int which, const QString &label);
+ void setLineColor(int which, const QString &color);
+ void setLineWidth(int which, int width);
+ void setLineStyle(int which, Qt::PenStyle style);
+ void setLineMarker(int which, QwtSymbol::Style style);
+ void setMarkerAlpha(int which, int alpha);
+
+ QString title();
+ QString lineLabel(int which);
+ QString lineColor(int which);
+ int lineWidth(int which);
+ Qt::PenStyle lineStyle(int which);
+ QwtSymbol::Style lineMarker(int which);
+ int markerAlpha(int which);
+
+ virtual void setSampleRate(const QString &rate) = 0;
+
+ void setStop(bool on);
+ void setStop();
+
+ void setGrid(bool on);
+
+ void saveFigure();
+
+private slots:
+ virtual void newData(const QEvent*) = 0;
+ virtual void autoScale(bool) = 0;
+ void updateGuiTimer();
+
+ void onPlotPointSelected(const QPointF p);
+
+signals:
+ void plotPointSelected(const QPointF p, int type);
+
+protected:
+ bool _isclosed;
+
+ int _nplots;
+
+ QGridLayout *_layout;
+ DisplayPlot* _displayPlot;
+ bool _systemSpecifiedFlag;
+
+ QwtPlotGrid *_grid;
+
+ bool _menu_on;
+ QMenu *_menu;
+
+ QAction *_stop_act;
+ bool _stop_state;
+ QAction *_grid_act;
+ bool _grid_state;
+
+ QAction *_autoscale_act;
+ bool _autoscale_state;
+
+ QList<QMenu*> _lines_menu;
+ QList<LineTitleAction*> _line_title_act;
+ QList<LineColorMenu*> _line_color_menu;
+ QList<LineWidthMenu*> _line_width_menu;
+ QList<LineStyleMenu*> _line_style_menu;
+ QList<LineMarkerMenu*> _line_marker_menu;
+ QList<MarkerAlphaMenu*> _marker_alpha_menu;
+
+ PopupMenu *_samp_rate_act;
+ QAction *_save_act;
+
+ QTimer *d_displayTimer;
+ double d_update_time;
+};
+
+#endif /* DISPLAY_FORM_H */
diff --git a/gr-qtgui/include/qtgui/form_menus.h b/gr-qtgui/include/qtgui/form_menus.h
new file mode 100644
index 0000000000..7f5b8ae6e7
--- /dev/null
+++ b/gr-qtgui/include/qtgui/form_menus.h
@@ -0,0 +1,1001 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef FORM_MENUS_H
+#define FORM_MENUS_H
+
+#include <stdexcept>
+#include <vector>
+#include <QtGui/QtGui>
+#include <qwt_symbol.h>
+#include <filter/firdes.h>
+#include <qtgui/qtgui_types.h>
+
+class LineColorMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ LineColorMenu(int which, QWidget *parent)
+ : QMenu("Line Color", parent), d_which(which)
+ {
+ d_act.push_back(new QAction("Blue", this));
+ d_act.push_back(new QAction("Red", this));
+ d_act.push_back(new QAction("Green", this));
+ d_act.push_back(new QAction("Black", this));
+ d_act.push_back(new QAction("Cyan", this));
+ d_act.push_back(new QAction("Magenta", this));
+ d_act.push_back(new QAction("Yellow", this));
+ d_act.push_back(new QAction("Gray", this));
+ d_act.push_back(new QAction("Dark Red", this));
+ d_act.push_back(new QAction("Dark Green", this));
+ d_act.push_back(new QAction("Dark Blue", this));
+ d_act.push_back(new QAction("Dark Gray", this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getBlue()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getRed()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getGreen()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getBlack()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(getCyan()));
+ connect(d_act[5], SIGNAL(triggered()), this, SLOT(getMagenta()));
+ connect(d_act[6], SIGNAL(triggered()), this, SLOT(getYellow()));
+ connect(d_act[7], SIGNAL(triggered()), this, SLOT(getGray()));
+ connect(d_act[8], SIGNAL(triggered()), this, SLOT(getDarkRed()));
+ connect(d_act[9], SIGNAL(triggered()), this, SLOT(getDarkGreen()));
+ connect(d_act[10], SIGNAL(triggered()), this, SLOT(getDarkBlue()));
+ connect(d_act[11], SIGNAL(triggered()), this, SLOT(getDarkGray()));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~LineColorMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("LineColorMenu::getAction: which out of range.\n");
+ }
+
+signals:
+ void whichTrigger(int which, const QString &name);
+
+public slots:
+ void getBlue() { emit whichTrigger(d_which, "blue"); }
+ void getRed() { emit whichTrigger(d_which, "red"); }
+ void getGreen() { emit whichTrigger(d_which, "green"); }
+ void getBlack() { emit whichTrigger(d_which, "black"); }
+ void getCyan() { emit whichTrigger(d_which, "cyan"); }
+ void getMagenta() { emit whichTrigger(d_which, "magenta"); }
+ void getYellow() { emit whichTrigger(d_which, "yellow"); }
+ void getGray() { emit whichTrigger(d_which, "gray"); }
+ void getDarkRed() { emit whichTrigger(d_which, "darkred"); }
+ void getDarkGreen() { emit whichTrigger(d_which, "darkgreen"); }
+ void getDarkBlue() { emit whichTrigger(d_which, "darkblue"); }
+ void getDarkGray() { emit whichTrigger(d_which, "darkgray"); }
+
+private:
+ QList<QAction *> d_act;
+ int d_which;
+};
+
+
+/********************************************************************/
+
+
+class LineWidthMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ LineWidthMenu(int which, QWidget *parent)
+ : QMenu("Line Width", parent), d_which(which)
+ {
+ d_act.push_back(new QAction("1", this));
+ d_act.push_back(new QAction("2", this));
+ d_act.push_back(new QAction("3", this));
+ d_act.push_back(new QAction("4", this));
+ d_act.push_back(new QAction("5", this));
+ d_act.push_back(new QAction("6", this));
+ d_act.push_back(new QAction("7", this));
+ d_act.push_back(new QAction("8", this));
+ d_act.push_back(new QAction("9", this));
+ d_act.push_back(new QAction("10", this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getOne()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getTwo()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getThree()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getFour()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(getFive()));
+ connect(d_act[5], SIGNAL(triggered()), this, SLOT(getSix()));
+ connect(d_act[6], SIGNAL(triggered()), this, SLOT(getSeven()));
+ connect(d_act[7], SIGNAL(triggered()), this, SLOT(getEight()));
+ connect(d_act[8], SIGNAL(triggered()), this, SLOT(getNine()));
+ connect(d_act[9], SIGNAL(triggered()), this, SLOT(getTen()));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~LineWidthMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("LineWidthMenu::getAction: which out of range.\n");
+ }
+
+signals:
+ void whichTrigger(int which, int width);
+
+public slots:
+ void getOne() { emit whichTrigger(d_which, 1); }
+ void getTwo() { emit whichTrigger(d_which, 2); }
+ void getThree() { emit whichTrigger(d_which, 3); }
+ void getFour() { emit whichTrigger(d_which, 4); }
+ void getFive() { emit whichTrigger(d_which, 5); }
+ void getSix() { emit whichTrigger(d_which, 6); }
+ void getSeven() { emit whichTrigger(d_which, 7); }
+ void getEight() { emit whichTrigger(d_which, 8); }
+ void getNine() { emit whichTrigger(d_which, 9); }
+ void getTen() { emit whichTrigger(d_which, 10); }
+
+private:
+ QList<QAction *> d_act;
+ int d_which;
+};
+
+
+/********************************************************************/
+
+
+class LineStyleMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ LineStyleMenu(int which, QWidget *parent)
+ : QMenu("Line Style", parent), d_which(which)
+ {
+ d_act.push_back(new QAction("None", this));
+ d_act.push_back(new QAction("Solid", this));
+ d_act.push_back(new QAction("Dash", this));
+ d_act.push_back(new QAction("Dots", this));
+ d_act.push_back(new QAction("Dash-Dot", this));
+ d_act.push_back(new QAction("Dash-Dot-Dot", this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getSolid()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getDash()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getDots()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(getDashDot()));
+ connect(d_act[5], SIGNAL(triggered()), this, SLOT(getDashDotDot()));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~LineStyleMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("LineStyleMenu::getAction: which out of range.\n");
+ }
+
+signals:
+ void whichTrigger(int which, Qt::PenStyle);
+
+public slots:
+ void getNone() { emit whichTrigger(d_which, Qt::NoPen); }
+ void getSolid() { emit whichTrigger(d_which, Qt::SolidLine); }
+ void getDash() { emit whichTrigger(d_which, Qt::DashLine); }
+ void getDots() { emit whichTrigger(d_which, Qt::DotLine); }
+ void getDashDot() { emit whichTrigger(d_which, Qt::DashDotLine); }
+ void getDashDotDot() { emit whichTrigger(d_which, Qt::DashDotDotLine); }
+
+private:
+ QList<QAction *> d_act;
+ int d_which;
+};
+
+
+/********************************************************************/
+
+
+class LineMarkerMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ LineMarkerMenu(int which, QWidget *parent)
+ : QMenu("Line Marker", parent), d_which(which)
+ {
+ d_act.push_back(new QAction("None", this));
+ d_act.push_back(new QAction("Circle", this));
+ d_act.push_back(new QAction("Rectangle", this));
+ d_act.push_back(new QAction("Diamond", this));
+ d_act.push_back(new QAction("Triangle", this));
+ d_act.push_back(new QAction("Down Triangle", this));
+ d_act.push_back(new QAction("Left Triangle", this));
+ d_act.push_back(new QAction("Right Triangle", this));
+ d_act.push_back(new QAction("Cross", this));
+ d_act.push_back(new QAction("X-Cross", this));
+ d_act.push_back(new QAction("Horiz. Line", this));
+ d_act.push_back(new QAction("Vert. Line", this));
+ d_act.push_back(new QAction("Star 1", this));
+ d_act.push_back(new QAction("Star 2", this));
+ d_act.push_back(new QAction("Hexagon", this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getCircle()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getRect()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getDiamond()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(getTriangle()));
+ connect(d_act[5], SIGNAL(triggered()), this, SLOT(getDTriangle()));
+ connect(d_act[6], SIGNAL(triggered()), this, SLOT(getLTriangle()));
+ connect(d_act[7], SIGNAL(triggered()), this, SLOT(getRTriangle()));
+ connect(d_act[8], SIGNAL(triggered()), this, SLOT(getCross()));
+ connect(d_act[9], SIGNAL(triggered()), this, SLOT(getXCross()));
+ connect(d_act[10], SIGNAL(triggered()), this, SLOT(getHLine()));
+ connect(d_act[11], SIGNAL(triggered()), this, SLOT(getVLine()));
+ connect(d_act[12], SIGNAL(triggered()), this, SLOT(getStar1()));
+ connect(d_act[13], SIGNAL(triggered()), this, SLOT(getStar2()));
+ connect(d_act[14], SIGNAL(triggered()), this, SLOT(getHexagon()));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~LineMarkerMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("LineMarkerMenu::getAction: which out of range.\n");
+ }
+
+signals:
+ void whichTrigger(int which, QwtSymbol::Style);
+
+public slots:
+ void getNone() { emit whichTrigger(d_which, QwtSymbol::NoSymbol); }
+ void getCircle() { emit whichTrigger(d_which, QwtSymbol::Ellipse); }
+ void getRect() { emit whichTrigger(d_which, QwtSymbol::Rect); }
+ void getDiamond() { emit whichTrigger(d_which, QwtSymbol::Diamond); }
+ void getTriangle() { emit whichTrigger(d_which, QwtSymbol::Triangle); }
+ void getDTriangle() { emit whichTrigger(d_which, QwtSymbol::DTriangle); }
+ void getLTriangle() { emit whichTrigger(d_which, QwtSymbol::LTriangle); }
+ void getRTriangle() { emit whichTrigger(d_which, QwtSymbol::RTriangle); }
+ void getCross() { emit whichTrigger(d_which, QwtSymbol::Cross); }
+ void getXCross() { emit whichTrigger(d_which, QwtSymbol::XCross); }
+ void getHLine() { emit whichTrigger(d_which, QwtSymbol::HLine); }
+ void getVLine() { emit whichTrigger(d_which, QwtSymbol::VLine); }
+ void getStar1() { emit whichTrigger(d_which, QwtSymbol::Star1); }
+ void getStar2() { emit whichTrigger(d_which, QwtSymbol::Star2); }
+ void getHexagon() { emit whichTrigger(d_which, QwtSymbol::Hexagon); }
+
+private:
+ QList<QAction *> d_act;
+ int d_which;
+};
+
+
+/********************************************************************/
+
+
+class MarkerAlphaMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ MarkerAlphaMenu(int which, QWidget *parent)
+ : QMenu("Line Transparency", parent), d_which(which)
+ {
+ d_act.push_back(new QAction("None", this));
+ d_act.push_back(new QAction("Low", this));
+ d_act.push_back(new QAction("Medium", this));
+ d_act.push_back(new QAction("High", this));
+ d_act.push_back(new QAction("Off", this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getLow()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getMedium()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getHigh()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(getOff()));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~MarkerAlphaMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("MarkerAlphaMenu::getAction: which out of range.\n");
+ }
+
+signals:
+ void whichTrigger(int which, int);
+
+public slots:
+ void getNone() { emit whichTrigger(d_which, 255); }
+ void getLow() { emit whichTrigger(d_which, 200); }
+ void getMedium() { emit whichTrigger(d_which, 125); }
+ void getHigh() { emit whichTrigger(d_which, 50); }
+ void getOff() { emit whichTrigger(d_which, 0); }
+
+private:
+ QList<QAction *> d_act;
+ int d_which;
+};
+
+
+/********************************************************************/
+
+
+class LineTitleAction: public QAction
+{
+ Q_OBJECT
+
+public:
+ LineTitleAction(int which, QWidget *parent)
+ : QAction("Line Title", parent), d_which(which)
+ {
+ d_diag = new QDialog(parent);
+ d_diag->setModal(true);
+
+ d_text = new QLineEdit();
+
+ QGridLayout *layout = new QGridLayout(d_diag);
+ QPushButton *btn_ok = new QPushButton(tr("OK"));
+ QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
+
+ layout->addWidget(d_text, 0, 0, 1, 2);
+ layout->addWidget(btn_ok, 1, 0);
+ layout->addWidget(btn_cancel, 1, 1);
+
+ connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
+ connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
+
+ connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
+ }
+
+ ~LineTitleAction()
+ {}
+
+signals:
+ void whichTrigger(int which, const QString &text);
+
+public slots:
+ void getTextDiag()
+ {
+ d_diag->exec();
+ }
+
+private slots:
+ void getText()
+ {
+ emit whichTrigger(d_which, d_text->text());
+ d_diag->accept();
+ }
+
+private:
+ int d_which;
+
+ QDialog *d_diag;
+ QLineEdit *d_text;
+};
+
+
+/********************************************************************/
+
+
+class OtherAction: public QAction
+{
+ Q_OBJECT
+
+public:
+ OtherAction(QWidget *parent)
+ : QAction("Other", parent)
+ {
+ d_diag = new QDialog(parent);
+ d_diag->setModal(true);
+
+ d_text = new QLineEdit();
+
+ QGridLayout *layout = new QGridLayout(d_diag);
+ QPushButton *btn_ok = new QPushButton(tr("OK"));
+ QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
+
+ layout->addWidget(d_text, 0, 0, 1, 2);
+ layout->addWidget(btn_ok, 1, 0);
+ layout->addWidget(btn_cancel, 1, 1);
+
+ connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
+ connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
+
+ connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
+ }
+
+ ~OtherAction()
+ {}
+
+signals:
+ void whichTrigger(const QString &text);
+
+public slots:
+ void getTextDiag()
+ {
+ d_diag->exec();
+ }
+
+private slots:
+ void getText()
+ {
+ emit whichTrigger(d_text->text());
+ d_diag->accept();
+ }
+
+private:
+ QDialog *d_diag;
+ QLineEdit *d_text;
+};
+
+/********************************************************************/
+
+
+class OtherDualAction: public QAction
+{
+ Q_OBJECT
+
+public:
+ OtherDualAction(QString label0, QString label1, QWidget *parent)
+ : QAction("Other", parent)
+ {
+ d_diag = new QDialog(parent);
+ d_diag->setModal(true);
+
+ d_text0 = new QLineEdit();
+ d_text1 = new QLineEdit();
+
+ QLabel *_label0 = new QLabel(label0);
+ QLabel *_label1 = new QLabel(label1);
+
+ QGridLayout *layout = new QGridLayout(d_diag);
+ QPushButton *btn_ok = new QPushButton(tr("OK"));
+ QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
+
+ layout->addWidget(_label0, 0, 0, 1, 2);
+ layout->addWidget(_label1, 1, 0, 1, 2);
+
+ layout->addWidget(d_text0, 0, 1, 1, 2);
+ layout->addWidget(d_text1, 1, 1, 1, 2);
+ layout->addWidget(btn_ok, 2, 0);
+ layout->addWidget(btn_cancel, 2, 1);
+
+ connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
+ connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
+
+ connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
+ }
+
+ ~OtherDualAction()
+ {}
+
+signals:
+ void whichTrigger(const QString &text0, const QString &text1);
+
+public slots:
+ void getTextDiag()
+ {
+ d_diag->exec();
+ }
+
+private slots:
+ void getText()
+ {
+ emit whichTrigger(d_text0->text(), d_text1->text());
+ d_diag->accept();
+ }
+
+private:
+ QDialog *d_diag;
+ QLineEdit *d_text0;
+ QLineEdit *d_text1;
+};
+
+
+/********************************************************************/
+
+
+class FFTSizeMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ FFTSizeMenu(QWidget *parent)
+ : QMenu("FFT Size", parent)
+ {
+ d_act.push_back(new QAction("32", this));
+ d_act.push_back(new QAction("64", this));
+ d_act.push_back(new QAction("128", this));
+ d_act.push_back(new QAction("256", this));
+ d_act.push_back(new QAction("512", this));
+ d_act.push_back(new QAction("1024", this));
+ d_act.push_back(new QAction("2048", this));
+ d_act.push_back(new QAction("4096", this));
+ d_act.push_back(new QAction("8192", this));
+ d_act.push_back(new QAction("16384", this));
+ d_act.push_back(new QAction("32768", this));
+ d_act.push_back(new OtherAction(this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(get05()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(get06()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(get07()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(get08()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(get09()));
+ connect(d_act[5], SIGNAL(triggered()), this, SLOT(get10()));
+ connect(d_act[6], SIGNAL(triggered()), this, SLOT(get11()));
+ connect(d_act[7], SIGNAL(triggered()), this, SLOT(get12()));
+ connect(d_act[8], SIGNAL(triggered()), this, SLOT(get13()));
+ connect(d_act[9], SIGNAL(triggered()), this, SLOT(get14()));
+ connect(d_act[10], SIGNAL(triggered()), this, SLOT(get15()));
+ connect(d_act[11], SIGNAL(whichTrigger(const QString&)),
+ this, SLOT(getOther(const QString&)));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~FFTSizeMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("FFTSizeMenu::getAction: which out of range.\n");
+ }
+
+ signals:
+ void whichTrigger(int size);
+
+ public slots:
+ void get05() { emit whichTrigger(32); }
+ void get06() { emit whichTrigger(64); }
+ void get07() { emit whichTrigger(128); }
+ void get08() { emit whichTrigger(256); }
+ void get09() { emit whichTrigger(512); }
+ void get10() { emit whichTrigger(1024); }
+ void get11() { emit whichTrigger(2048); }
+ void get12() { emit whichTrigger(4096); }
+ void get13() { emit whichTrigger(8192); }
+ void get14() { emit whichTrigger(16384); }
+ void get15() { emit whichTrigger(32768); }
+ void getOther(const QString &str)
+ {
+ int value = str.toInt();
+ emit whichTrigger(value);
+ }
+
+private:
+ QList<QAction *> d_act;
+ OtherAction *d_other;
+};
+
+
+/********************************************************************/
+
+
+class FFTAverageMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ FFTAverageMenu(QWidget *parent)
+ : QMenu("FFT Average", parent)
+ {
+ d_act.push_back(new QAction("Off", this));
+ d_act.push_back(new QAction("High", this));
+ d_act.push_back(new QAction("Medium", this));
+ d_act.push_back(new QAction("Low", this));
+ d_act.push_back(new OtherAction(this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getOff()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getHigh()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getMedium()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getLow()));
+ connect(d_act[4], SIGNAL(whichTrigger(const QString&)),
+ this, SLOT(getOther(const QString&)));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~FFTAverageMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("FFTSizeMenu::getAction: which out of range.\n");
+ }
+
+ signals:
+ void whichTrigger(float alpha);
+
+ public slots:
+ void getOff() { emit whichTrigger(1.0); }
+ void getHigh() { emit whichTrigger(0.05); }
+ void getMedium() { emit whichTrigger(0.1); }
+ void getLow() { emit whichTrigger(0.2); }
+ void getOther(const QString &str)
+ {
+ float value = str.toFloat();
+ emit whichTrigger(value);
+ }
+
+private:
+ QList<QAction *> d_act;
+ OtherAction *d_other;
+};
+
+
+/********************************************************************/
+
+
+class FFTWindowMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ FFTWindowMenu(QWidget *parent)
+ : QMenu("FFT Window", parent)
+ {
+ d_act.push_back(new QAction("None", this));
+ d_act.push_back(new QAction("Hamming", this));
+ d_act.push_back(new QAction("Hann", this));
+ d_act.push_back(new QAction("Blackman", this));
+ d_act.push_back(new QAction("Blackman-harris", this));
+ d_act.push_back(new QAction("Rectangular", this));
+ d_act.push_back(new QAction("Kaiser", this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getHamming()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getHann()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getBlackman()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(getBlackmanharris()));
+ connect(d_act[5], SIGNAL(triggered()), this, SLOT(getRectangular()));
+ connect(d_act[6], SIGNAL(triggered()), this, SLOT(getKaiser()));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+ }
+
+ ~FFTWindowMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("FFTWindowMenu::getAction: which out of range.\n");
+ }
+
+signals:
+ void whichTrigger(const gr::filter::firdes::win_type type);
+
+public slots:
+ void getNone() { emit whichTrigger(gr::filter::firdes::WIN_NONE); }
+ void getHamming() { emit whichTrigger(gr::filter::firdes::WIN_HAMMING); }
+ void getHann() { emit whichTrigger(gr::filter::firdes::WIN_HANN); }
+ void getBlackman() { emit whichTrigger(gr::filter::firdes::WIN_BLACKMAN); }
+ void getBlackmanharris() { emit whichTrigger(gr::filter::firdes::WIN_BLACKMAN_hARRIS); }
+ void getRectangular() { emit whichTrigger(gr::filter::firdes::WIN_RECTANGULAR); }
+ void getKaiser() { emit whichTrigger(gr::filter::firdes::WIN_KAISER); }
+
+private:
+ QList<QAction *> d_act;
+ int d_which;
+};
+
+
+/********************************************************************/
+
+
+class NPointsMenu: public QAction
+{
+ Q_OBJECT
+
+public:
+ NPointsMenu(QWidget *parent)
+ : QAction("Number of Points", parent)
+ {
+ d_diag = new QDialog(parent);
+ d_diag->setModal(true);
+
+ d_text = new QLineEdit();
+
+ QGridLayout *layout = new QGridLayout(d_diag);
+ QPushButton *btn_ok = new QPushButton(tr("OK"));
+ QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
+
+ layout->addWidget(d_text, 0, 0, 1, 2);
+ layout->addWidget(btn_ok, 1, 0);
+ layout->addWidget(btn_cancel, 1, 1);
+
+ connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
+ connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
+
+ connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
+ }
+
+ ~NPointsMenu()
+ {}
+
+signals:
+ void whichTrigger(const int npts);
+
+public slots:
+ void getTextDiag()
+ {
+ d_diag->show();
+ }
+
+private slots:
+ void getText()
+ {
+ emit whichTrigger(d_text->text().toInt());
+ d_diag->accept();
+ }
+
+private:
+ QDialog *d_diag;
+ QLineEdit *d_text;
+};
+
+
+/********************************************************************/
+
+
+class ColorMapMenu: public QMenu
+{
+ Q_OBJECT
+
+public:
+ ColorMapMenu(int which, QWidget *parent)
+ : QMenu("Color Map", parent), d_which(which)
+ {
+ d_act.push_back(new QAction("Multi-Color", this));
+ d_act.push_back(new QAction("White Hot", this));
+ d_act.push_back(new QAction("Black Hot", this));
+ d_act.push_back(new QAction("Incandescent", this));
+ d_act.push_back(new QAction("Other", this));
+ //d_act.push_back(new OtherDualAction("Min Intensity: ", "Max Intensity: ", this));
+
+ connect(d_act[0], SIGNAL(triggered()), this, SLOT(getMultiColor()));
+ connect(d_act[1], SIGNAL(triggered()), this, SLOT(getWhiteHot()));
+ connect(d_act[2], SIGNAL(triggered()), this, SLOT(getBlackHot()));
+ connect(d_act[3], SIGNAL(triggered()), this, SLOT(getIncandescent()));
+ connect(d_act[4], SIGNAL(triggered()), this, SLOT(getOther()));
+
+ QListIterator<QAction*> i(d_act);
+ while(i.hasNext()) {
+ QAction *a = i.next();
+ addAction(a);
+ }
+
+ d_max_value = QColor("white");
+ d_min_value = QColor("white");
+ }
+
+ ~ColorMapMenu()
+ {}
+
+ int getNumActions() const
+ {
+ return d_act.size();
+ }
+
+ QAction * getAction(int which)
+ {
+ if(which < d_act.size())
+ return d_act[which];
+ else
+ throw std::runtime_error("ColorMapMenu::getAction: which out of range.\n");
+ }
+
+ signals:
+ void whichTrigger(int which, const int type,
+ const QColor &min_color=QColor(),
+ const QColor &max_color=QColor());
+
+ public slots:
+ void getMultiColor() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR); }
+ void getWhiteHot() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_WHITE_HOT); }
+ void getBlackHot() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_BLACK_HOT); }
+ void getIncandescent() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_INCANDESCENT); }
+ //void getOther(d_which, const QString &min_str, const QString &max_str)
+ void getOther()
+ {
+ QMessageBox::information(this, "Set low and high intensities",
+ "In the next windows, select the low and then the high intensity colors.",
+ QMessageBox::Ok);
+ d_min_value = QColorDialog::getColor(d_min_value, this);
+ d_max_value = QColorDialog::getColor(d_max_value, this);
+
+ emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_USER_DEFINED,
+ d_min_value, d_max_value);
+ }
+
+private:
+ QList<QAction *> d_act;
+ OtherDualAction *d_other;
+ QColor d_max_value, d_min_value;
+ int d_which;
+};
+
+
+/********************************************************************/
+
+
+class PopupMenu: public QAction
+{
+ Q_OBJECT
+
+public:
+ PopupMenu(QString desc, QWidget *parent)
+ : QAction(desc, parent)
+ {
+ d_diag = new QDialog(parent);
+ d_diag->setModal(true);
+
+ d_text = new QLineEdit();
+
+ QGridLayout *layout = new QGridLayout(d_diag);
+ QPushButton *btn_ok = new QPushButton(tr("OK"));
+ QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
+
+ layout->addWidget(d_text, 0, 0, 1, 2);
+ layout->addWidget(btn_ok, 1, 0);
+ layout->addWidget(btn_cancel, 1, 1);
+
+ connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
+ connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
+
+ connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
+ }
+
+ ~PopupMenu()
+ {}
+
+signals:
+ void whichTrigger(const QString data);
+
+public slots:
+ void getTextDiag()
+ {
+ d_diag->show();
+ }
+
+private slots:
+ void getText()
+ {
+ emit whichTrigger(d_text->text());
+ d_diag->accept();
+ }
+
+private:
+ QDialog *d_diag;
+ QLineEdit *d_text;
+};
+
+
+/********************************************************************/
+
+
+#endif /* FORM_MENUS_H */
diff --git a/gr-qtgui/include/qtgui/freqdisplayform.h b/gr-qtgui/include/qtgui/freqdisplayform.h
new file mode 100644
index 0000000000..2daba90919
--- /dev/null
+++ b/gr-qtgui/include/qtgui/freqdisplayform.h
@@ -0,0 +1,74 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef FREQ_DISPLAY_FORM_H
+#define FREQ_DISPLAY_FORM_H
+
+#include <qtgui/spectrumUpdateEvents.h>
+#include <qtgui/FrequencyDisplayPlot.h>
+#include <QtGui/QtGui>
+#include <vector>
+#include <filter/firdes.h>
+
+#include <qtgui/displayform.h>
+
+class FreqDisplayForm : public DisplayForm
+{
+ Q_OBJECT
+
+ public:
+ FreqDisplayForm(int nplots=1, QWidget* parent = 0);
+ ~FreqDisplayForm();
+
+ FrequencyDisplayPlot* getPlot();
+
+ int getFFTSize() const;
+ float getFFTAverage() const;
+ gr::filter::firdes::win_type getFFTWindowType() const;
+
+public slots:
+ void customEvent(QEvent *e);
+
+ void setSampleRate(const QString &samprate);
+ void setFFTSize(const int);
+ void setFFTAverage(const float);
+ void setFFTWindowType(const gr::filter::firdes::win_type);
+
+ void setFrequencyRange(const double centerfreq,
+ const double bandwidth);
+ void setYaxis(double min, double max);
+ void autoScale(bool en);
+
+private slots:
+ void newData(const QEvent *updateEvent);
+
+private:
+ uint64_t _numRealDataPoints;
+ QIntValidator* _intValidator;
+
+ double _samp_rate, _center_freq;
+ int _fftsize;
+ float _fftavg;
+ gr::filter::firdes::win_type _fftwintype;
+};
+
+#endif /* FREQ_DISPLAY_FORM_H */
diff --git a/gr-qtgui/include/qtgui/plot_raster.h b/gr-qtgui/include/qtgui/plot_raster.h
new file mode 100644
index 0000000000..5692cc4ba8
--- /dev/null
+++ b/gr-qtgui/include/qtgui/plot_raster.h
@@ -0,0 +1,93 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012,2013 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.
+ */
+
+#ifndef PLOT_TIMERASTER_H
+#define PLOT_TIMERASTER_H
+
+#include <qglobal.h>
+#include <qtgui/timeRasterGlobalData.h>
+#include <qwt_plot_rasteritem.h>
+
+#if QWT_VERSION >= 0x060000
+#include <qwt_point_3d.h> // doesn't seem necessary, but is...
+#include <qwt_compat.h>
+#endif
+
+class QwtColorMap;
+
+/*!
+ \brief A plot item, which displays a time raster.
+
+ A time raster displays threedimenional data, where the 3rd dimension
+ ( the intensity ) is displayed using colors. The colors are calculated
+ from the values using a color map.
+
+ \sa QwtRasterData, QwtColorMap
+*/
+
+class PlotTimeRaster: public QwtPlotRasterItem
+{
+public:
+ explicit PlotTimeRaster(const QString &title = QString::null);
+ virtual ~PlotTimeRaster();
+
+ const TimeRasterData* data()const;
+
+ void setData(TimeRasterData *data);
+
+ void setColorMap(const QwtColorMap *map);
+
+ const QwtColorMap &colorMap() const;
+
+#if QWT_VERSION < 0x060000
+ virtual QwtDoubleRect boundingRect() const;
+ virtual QSize rasterHint(const QwtDoubleRect &) const;
+ virtual QwtDoubleInterval interval(Qt::Axis ax) const;
+#else
+ virtual QwtInterval interval(Qt::Axis ax) const;
+#endif
+
+ virtual int rtti() const;
+
+ virtual void draw(QPainter *p,
+ const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap,
+ const QRect &rect) const;
+
+protected:
+#if QWT_VERSION < 0x060000
+ QImage renderImage(const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap,
+ const QwtDoubleRect &rect) const;
+#else
+ QImage renderImage(const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap,
+ const QRectF &rect,
+ const QSize &size=QSize(0,0)) const;
+#endif
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/gr-qtgui/include/qtgui/plot_waterfall.h b/gr-qtgui/include/qtgui/plot_waterfall.h
new file mode 100644
index 0000000000..4c764fd764
--- /dev/null
+++ b/gr-qtgui/include/qtgui/plot_waterfall.h
@@ -0,0 +1,89 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef PLOT_WATERFALL_H
+#define PLOT_WATERFALL_H
+
+#include <qglobal.h>
+#include <qtgui/waterfallGlobalData.h>
+#include <qwt_plot_rasteritem.h>
+
+#if QWT_VERSION >= 0x060000
+#include <qwt_point_3d.h> // doesn't seem necessary, but is...
+#include <qwt_compat.h>
+#endif
+
+class QwtColorMap;
+
+/*!
+ \brief A plot item, which displays a waterfall spectrogram
+
+ A waterfall displays threedimenional data, where the 3rd dimension
+ ( the intensity ) is displayed using colors. The colors are calculated
+ from the values using a color map.
+
+ \sa QwtRasterData, QwtColorMap
+*/
+
+class PlotWaterfall: public QwtPlotRasterItem
+{
+public:
+ explicit PlotWaterfall(WaterfallData* data,
+ const QString &title = QString::null);
+ virtual ~PlotWaterfall();
+
+ const WaterfallData* data()const;
+
+ void setColorMap(const QwtColorMap &);
+
+ const QwtColorMap &colorMap() const;
+
+#if QWT_VERSION < 0x060000
+ virtual QwtDoubleRect boundingRect() const;
+ virtual QSize rasterHint(const QwtDoubleRect &) const;
+#endif
+
+ virtual int rtti() const;
+
+ virtual void draw(QPainter *p,
+ const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap,
+ const QRect &rect) const;
+
+protected:
+#if QWT_VERSION < 0x060000
+ QImage renderImage(const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap,
+ const QwtDoubleRect &rect) const;
+#else
+ QImage renderImage(const QwtScaleMap &xMap,
+ const QwtScaleMap &yMap,
+ const QRectF &rect,
+ const QSize &size=QSize(0,0)) const;
+#endif
+
+private:
+ class PrivateData;
+ PrivateData *d_data;
+};
+
+#endif
diff --git a/gr-qtgui/include/qtgui/qtgui_types.h b/gr-qtgui/include/qtgui/qtgui_types.h
new file mode 100644
index 0000000000..135350dbb8
--- /dev/null
+++ b/gr-qtgui/include/qtgui/qtgui_types.h
@@ -0,0 +1,196 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef QTGUI_TYPES_H
+#define QTGUI_TYPES_H
+
+#include <qwt_color_map.h>
+#include <qwt_scale_draw.h>
+#include <high_res_timer.h>
+
+class FreqOffsetAndPrecisionClass
+{
+public:
+ FreqOffsetAndPrecisionClass(const int freqPrecision)
+ {
+ _frequencyPrecision = freqPrecision;
+ _centerFrequency = 0;
+ }
+
+ virtual ~FreqOffsetAndPrecisionClass()
+ {
+ }
+
+ virtual unsigned int getFrequencyPrecision() const
+ {
+ return _frequencyPrecision;
+ }
+
+ virtual void setFrequencyPrecision(const unsigned int newPrecision)
+ {
+ _frequencyPrecision = newPrecision;
+ }
+
+ virtual double getCenterFrequency() const
+ {
+ return _centerFrequency;
+ }
+
+ virtual void setCenterFrequency(const double newFreq)
+ {
+ _centerFrequency = newFreq;
+ }
+
+protected:
+
+private:
+ unsigned int _frequencyPrecision;
+ double _centerFrequency;
+};
+
+class TimeScaleData
+{
+public:
+ TimeScaleData()
+ {
+ _zeroTime = 0;
+ _secondsPerLine = 1.0;
+ }
+
+ virtual ~TimeScaleData()
+ {
+ }
+
+ virtual gr::high_res_timer_type getZeroTime() const
+ {
+ return _zeroTime;
+ }
+
+ virtual void setZeroTime(const gr::high_res_timer_type newTime)
+ {
+ _zeroTime = newTime - gr::high_res_timer_epoch();
+ }
+
+ virtual void setSecondsPerLine(const double newTime)
+ {
+ _secondsPerLine = newTime;
+ }
+
+ virtual double getSecondsPerLine() const
+ {
+ return _secondsPerLine;
+ }
+
+
+protected:
+
+private:
+ gr::high_res_timer_type _zeroTime;
+ double _secondsPerLine;
+
+};
+
+/***********************************************************************
+ * Text scale widget to provide X (freq) axis text
+ **********************************************************************/
+class FreqDisplayScaleDraw: public QwtScaleDraw, FreqOffsetAndPrecisionClass
+{
+public:
+ FreqDisplayScaleDraw(const unsigned int precision)
+ : QwtScaleDraw(), FreqOffsetAndPrecisionClass(precision)
+ {
+ }
+
+ virtual QwtText label(double value) const
+ {
+ return QString("%1").arg(value, 0, 'f', getFrequencyPrecision());
+ }
+
+ virtual void initiateUpdate(void)
+ {
+ invalidateCache();
+ }
+
+protected:
+
+private:
+
+};
+
+enum{
+ INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR = 0,
+ INTENSITY_COLOR_MAP_TYPE_WHITE_HOT = 1,
+ INTENSITY_COLOR_MAP_TYPE_BLACK_HOT = 2,
+ INTENSITY_COLOR_MAP_TYPE_INCANDESCENT = 3,
+ INTENSITY_COLOR_MAP_TYPE_USER_DEFINED = 4
+};
+
+class ColorMap_MultiColor: public QwtLinearColorMap
+{
+public:
+ ColorMap_MultiColor():
+ QwtLinearColorMap(Qt::darkCyan, Qt::white)
+ {
+ addColorStop(0.25, Qt::cyan);
+ addColorStop(0.5, Qt::yellow);
+ addColorStop(0.75, Qt::red);
+ }
+};
+
+class ColorMap_WhiteHot: public QwtLinearColorMap
+{
+public:
+ ColorMap_WhiteHot():
+ QwtLinearColorMap(Qt::black, Qt::white)
+ {
+ }
+};
+
+class ColorMap_BlackHot: public QwtLinearColorMap
+{
+public:
+ ColorMap_BlackHot():
+ QwtLinearColorMap(Qt::white, Qt::black)
+ {
+ }
+};
+
+class ColorMap_Incandescent: public QwtLinearColorMap
+{
+public:
+ ColorMap_Incandescent():
+ QwtLinearColorMap(Qt::black, Qt::white)
+ {
+ addColorStop(0.5, Qt::darkRed);
+ }
+};
+
+class ColorMap_UserDefined: public QwtLinearColorMap
+{
+public:
+ ColorMap_UserDefined(QColor low, QColor high):
+ QwtLinearColorMap(low, high)
+ {
+ }
+};
+
+#endif //QTGUI_TYPES_H
diff --git a/gr-qtgui/include/qtgui/spectrumUpdateEvents.h b/gr-qtgui/include/qtgui/spectrumUpdateEvents.h
new file mode 100644
index 0000000000..df61f7fdb2
--- /dev/null
+++ b/gr-qtgui/include/qtgui/spectrumUpdateEvents.h
@@ -0,0 +1,264 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2013 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.
+ */
+
+#ifndef SPECTRUM_UPDATE_EVENTS_H
+#define SPECTRUM_UPDATE_EVENTS_H
+
+#include <stdint.h>
+#include <QEvent>
+#include <QString>
+#include <complex>
+#include <vector>
+#include <high_res_timer.h>
+
+static const int SpectrumUpdateEventType = 10005;
+static const int SpectrumWindowCaptionEventType = 10008;
+static const int SpectrumWindowResetEventType = 10009;
+static const int SpectrumFrequencyRangeEventType = 10010;
+
+class SpectrumUpdateEvent:public QEvent{
+
+public:
+ SpectrumUpdateEvent(const float* fftPoints,
+ const uint64_t numFFTDataPoints,
+ const double* realTimeDomainPoints,
+ const double* imagTimeDomainPoints,
+ const uint64_t numTimeDomainDataPoints,
+ const gr::high_res_timer_type dataTimestamp,
+ const bool repeatDataFlag,
+ const bool lastOfMultipleUpdateFlag,
+ const gr::high_res_timer_type generatedTimestamp,
+ const int droppedFFTFrames);
+
+ ~SpectrumUpdateEvent();
+
+ const float* getFFTPoints() const;
+ const double* getRealTimeDomainPoints() const;
+ const double* getImagTimeDomainPoints() const;
+ uint64_t getNumFFTDataPoints() const;
+ uint64_t getNumTimeDomainDataPoints() const;
+ gr::high_res_timer_type getDataTimestamp() const;
+ bool getRepeatDataFlag() const;
+ bool getLastOfMultipleUpdateFlag() const;
+ gr::high_res_timer_type getEventGeneratedTimestamp() const;
+ int getDroppedFFTFrames() const;
+
+protected:
+
+private:
+ float* _fftPoints;
+ double* _realDataTimeDomainPoints;
+ double* _imagDataTimeDomainPoints;
+ uint64_t _numFFTDataPoints;
+ uint64_t _numTimeDomainDataPoints;
+ gr::high_res_timer_type _dataTimestamp;
+ bool _repeatDataFlag;
+ bool _lastOfMultipleUpdateFlag;
+ gr::high_res_timer_type _eventGeneratedTimestamp;
+ int _droppedFFTFrames;
+};
+
+class SpectrumWindowCaptionEvent:public QEvent{
+public:
+ SpectrumWindowCaptionEvent(const QString&);
+ ~SpectrumWindowCaptionEvent();
+ QString getLabel();
+
+protected:
+
+private:
+ QString _labelString;
+};
+
+class SpectrumWindowResetEvent:public QEvent{
+public:
+ SpectrumWindowResetEvent();
+ ~SpectrumWindowResetEvent();
+
+protected:
+
+private:
+
+};
+
+class SpectrumFrequencyRangeEvent:public QEvent{
+public:
+ SpectrumFrequencyRangeEvent(const double, const double, const double);
+ ~SpectrumFrequencyRangeEvent();
+ double GetCenterFrequency()const;
+ double GetStartFrequency()const;
+ double GetStopFrequency()const;
+
+protected:
+
+private:
+ double _centerFrequency;
+ double _startFrequency;
+ double _stopFrequency;
+};
+
+
+class TimeUpdateEvent: public QEvent
+{
+public:
+ TimeUpdateEvent(const std::vector<double*> timeDomainPoints,
+ const uint64_t numTimeDomainDataPoints);
+
+ ~TimeUpdateEvent();
+
+ int which() const;
+ const std::vector<double*> getTimeDomainPoints() const;
+ uint64_t getNumTimeDomainDataPoints() const;
+ bool getRepeatDataFlag() const;
+
+ static QEvent::Type Type()
+ { return QEvent::Type(SpectrumUpdateEventType); }
+
+protected:
+
+private:
+ size_t _nplots;
+ std::vector<double*> _dataTimeDomainPoints;
+ uint64_t _numTimeDomainDataPoints;
+};
+
+
+/********************************************************************/
+
+
+class FreqUpdateEvent: public QEvent
+{
+public:
+ FreqUpdateEvent(const std::vector<double*> dataPoints,
+ const uint64_t numDataPoints);
+
+ ~FreqUpdateEvent();
+
+ int which() const;
+ const std::vector<double*> getPoints() const;
+ uint64_t getNumDataPoints() const;
+ bool getRepeatDataFlag() const;
+
+ static QEvent::Type Type()
+ { return QEvent::Type(SpectrumUpdateEventType); }
+
+protected:
+
+private:
+ size_t _nplots;
+ std::vector<double*> _dataPoints;
+ uint64_t _numDataPoints;
+};
+
+
+/********************************************************************/
+
+
+class ConstUpdateEvent: public QEvent
+{
+public:
+ ConstUpdateEvent(const std::vector<double*> realDataPoints,
+ const std::vector<double*> imagDataPoints,
+ const uint64_t numDataPoints);
+
+ ~ConstUpdateEvent();
+
+ int which() const;
+ const std::vector<double*> getRealPoints() const;
+ const std::vector<double*> getImagPoints() const;
+ uint64_t getNumDataPoints() const;
+ bool getRepeatDataFlag() const;
+
+ static QEvent::Type Type()
+ { return QEvent::Type(SpectrumUpdateEventType); }
+
+protected:
+
+private:
+ size_t _nplots;
+ std::vector<double*> _realDataPoints;
+ std::vector<double*> _imagDataPoints;
+ uint64_t _numDataPoints;
+};
+
+
+/********************************************************************/
+
+
+class WaterfallUpdateEvent: public QEvent
+{
+public:
+ WaterfallUpdateEvent(const std::vector<double*> dataPoints,
+ const uint64_t numDataPoints,
+ const gr::high_res_timer_type dataTimestamp);
+
+ ~WaterfallUpdateEvent();
+
+ int which() const;
+ const std::vector<double*> getPoints() const;
+ uint64_t getNumDataPoints() const;
+ bool getRepeatDataFlag() const;
+
+ gr::high_res_timer_type getDataTimestamp() const;
+
+ static QEvent::Type Type()
+ { return QEvent::Type(SpectrumUpdateEventType); }
+
+protected:
+
+private:
+ size_t _nplots;
+ std::vector<double*> _dataPoints;
+ uint64_t _numDataPoints;
+
+ gr::high_res_timer_type _dataTimestamp;
+};
+
+
+/********************************************************************/
+
+
+class TimeRasterUpdateEvent: public QEvent
+{
+public:
+ TimeRasterUpdateEvent(const std::vector<double*> dataPoints,
+ const uint64_t numDataPoints);
+ ~TimeRasterUpdateEvent();
+
+ int which() const;
+ const std::vector<double*> getPoints() const;
+ uint64_t getNumDataPoints() const;
+ bool getRepeatDataFlag() const;
+
+ static QEvent::Type Type()
+ { return QEvent::Type(SpectrumUpdateEventType); }
+
+protected:
+
+private:
+ size_t _nplots;
+ std::vector<double*> _dataPoints;
+ uint64_t _numDataPoints;
+};
+
+
+#endif /* SPECTRUM_UPDATE_EVENTS_H */
diff --git a/gr-qtgui/include/qtgui/spectrumdisplayform.h b/gr-qtgui/include/qtgui/spectrumdisplayform.h
new file mode 100644
index 0000000000..37a481245c
--- /dev/null
+++ b/gr-qtgui/include/qtgui/spectrumdisplayform.h
@@ -0,0 +1,139 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008-2011 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.
+ */
+
+#ifndef SPECTRUM_DISPLAY_FORM_H
+#define SPECTRUM_DISPLAY_FORM_H
+
+#include <spectrumdisplayform.ui.h>
+
+class SpectrumGUIClass;
+#include <qtgui/SpectrumGUIClass.h>
+
+#include <qtgui/SpectrumGUIClass.h>
+#include <qtgui/FrequencyDisplayPlot.h>
+#include <qtgui/WaterfallDisplayPlot.h>
+#include <qtgui/TimeDomainDisplayPlot.h>
+#include <qtgui/ConstellationDisplayPlot.h>
+#include <QValidator>
+#include <QTimer>
+#include <vector>
+
+class SpectrumDisplayForm : public QWidget, public Ui::SpectrumDisplayForm
+{
+ Q_OBJECT
+
+ public:
+ SpectrumDisplayForm(QWidget* parent = 0);
+ ~SpectrumDisplayForm();
+
+ 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);
+
+public slots:
+ void resizeEvent(QResizeEvent * e);
+ void customEvent(QEvent * e);
+ void avgLineEdit_valueChanged(int valueString);
+ void maxHoldCheckBox_toggled(bool newState);
+ void minHoldCheckBox_toggled(bool newState);
+ void minHoldResetBtn_clicked();
+ void maxHoldResetBtn_clicked();
+ void tabChanged(int index);
+
+ void setFrequencyRange(const double newCenterFrequency,
+ const double newStartFrequency,
+ const double newStopFrequency);
+ void closeEvent(QCloseEvent * e);
+ void windowTypeChanged(int newItem);
+ void useRFFrequenciesCB(bool useRFFlag);
+ void waterfallMaximumIntensityChangedCB(double);
+ void waterfallMinimumIntensityChangedCB(double);
+ void waterfallIntensityColorTypeChanged(int);
+ void waterfallAutoScaleBtnCB();
+ void fftComboBoxSelectedCB(const QString&);
+
+ void toggleTabFrequency(const bool state);
+ void toggleTabWaterfall(const bool state);
+ void toggleTabTime(const bool state);
+ void toggleTabConstellation(const bool state);
+
+ void setTimeDomainAxis(double min, double max);
+ void setConstellationAxis(double xmin, double xmax,
+ double ymin, double ymax);
+ void setConstellationPenSize(int size);
+ void setFrequencyAxis(double min, double max);
+ void setUpdateTime(double t);
+
+private slots:
+ void newFrequencyData(const SpectrumUpdateEvent*);
+ void updateGuiTimer();
+
+ void onFFTPlotPointSelected(const QPointF p);
+ void onWFallPlotPointSelected(const QPointF p);
+ void onTimePlotPointSelected(const QPointF p);
+ void onConstPlotPointSelected(const QPointF p);
+
+signals:
+ void plotPointSelected(const QPointF p, int type);
+
+private:
+ void _averageHistory(const double * newBuffer);
+
+ int _historyEntryCount;
+ int _historyEntry;
+ std::vector<double*>* _historyVector;
+ double* _averagedValues;
+ uint64_t _numRealDataPoints;
+ double* _realFFTDataPoints;
+ QIntValidator* _intValidator;
+ FrequencyDisplayPlot* _frequencyDisplayPlot;
+ WaterfallDisplayPlot* _waterfallDisplayPlot;
+ TimeDomainDisplayPlot* _timeDomainDisplayPlot;
+ ConstellationDisplayPlot* _constellationDisplayPlot;
+ SpectrumGUIClass* _system;
+ bool _systemSpecifiedFlag;
+ double _centerFrequency;
+ double _startFrequency;
+ double _noiseFloorAmplitude;
+ double _peakFrequency;
+ double _peakAmplitude;
+ double _stopFrequency;
+
+ //SpectrumUpdateEvent _lastSpectrumEvent;
+
+ // whether or not to use a particular display
+ int d_plot_fft;
+ int d_plot_waterfall;
+ int d_plot_time;
+ int d_plot_constellation;
+
+ QTimer *displayTimer;
+ double d_update_time;
+};
+
+#endif /* SPECTRUM_DISPLAY_FORM_H */
diff --git a/gr-qtgui/include/qtgui/timeRasterGlobalData.h b/gr-qtgui/include/qtgui/timeRasterGlobalData.h
new file mode 100644
index 0000000000..0a414432d1
--- /dev/null
+++ b/gr-qtgui/include/qtgui/timeRasterGlobalData.h
@@ -0,0 +1,78 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012,2013 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.
+ */
+
+#ifndef TIMERASTER_GLOBAL_DATA_HPP
+#define TIMERASTER_GLOBAL_DATA_HPP
+
+#include <qwt_raster_data.h>
+#include <inttypes.h>
+
+#if QWT_VERSION >= 0x060000
+#include <qwt_point_3d.h> // doesn't seem necessary, but is...
+#include <qwt_compat.h>
+#endif
+
+class TimeRasterData: public QwtRasterData
+{
+public:
+ TimeRasterData(const double rows, const double cols);
+ virtual ~TimeRasterData();
+
+ virtual void reset();
+ virtual void copy(const TimeRasterData*);
+
+ virtual void resizeData(const double rows, const double cols);
+
+ virtual QwtRasterData *copy() const;
+
+#if QWT_VERSION < 0x060000
+ virtual QwtDoubleInterval range() const;
+ virtual void setRange(const QwtDoubleInterval&);
+#endif
+
+ virtual double value(double x, double y) const;
+
+ virtual double getNumCols()const;
+ virtual double getNumRows()const;
+
+ virtual void addData(const double*, const int);
+
+ void incrementResidual();
+
+protected:
+
+ double* d_data;
+ double d_rows, d_cols;
+ double d_resid;
+ int d_nitems, d_totalitems, d_data_size;
+
+#if QWT_VERSION < 0x060000
+ QwtDoubleInterval d_intensityRange;
+#else
+ QwtInterval d_intensityRange;
+#endif
+
+private:
+
+};
+
+#endif /* TIMERASTER_GLOBAL_DATA_HPP */
diff --git a/gr-qtgui/include/qtgui/timedisplayform.h b/gr-qtgui/include/qtgui/timedisplayform.h
new file mode 100644
index 0000000000..4df4698e3f
--- /dev/null
+++ b/gr-qtgui/include/qtgui/timedisplayform.h
@@ -0,0 +1,77 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2011,2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef TIME_DISPLAY_FORM_H
+#define TIME_DISPLAY_FORM_H
+
+#include <qtgui/spectrumUpdateEvents.h>
+#include <qtgui/TimeDomainDisplayPlot.h>
+#include <QtGui/QtGui>
+#include <vector>
+
+#include <qtgui/displayform.h>
+
+class TimeDisplayForm : public DisplayForm
+{
+ Q_OBJECT
+
+ public:
+ TimeDisplayForm(int nplots=1, QWidget* parent = 0);
+ ~TimeDisplayForm();
+
+ TimeDomainDisplayPlot* getPlot();
+
+ int getNPoints() const;
+
+public slots:
+ void customEvent(QEvent * e);
+
+ void setSampleRate(const double samprate);
+ void setSampleRate(const QString &samprate);
+ void setYaxis(double min, double max);
+ void setNPoints(const int);
+ void setStem(bool en);
+ void autoScale(bool en);
+ void setSemilogx(bool en);
+ void setSemilogy(bool en);
+
+private slots:
+ void newData(const QEvent*);
+
+private:
+ QIntValidator* _intValidator;
+
+ double _startFrequency;
+ double _stopFrequency;
+
+ int d_npoints;
+
+ bool d_stem;
+ bool d_semilogx;
+ bool d_semilogy;
+
+ QAction *d_stemmenu;
+ QAction *d_semilogxmenu;
+ QAction *d_semilogymenu;
+};
+
+#endif /* TIME_DISPLAY_FORM_H */
diff --git a/gr-qtgui/include/qtgui/timerasterdisplayform.h b/gr-qtgui/include/qtgui/timerasterdisplayform.h
new file mode 100644
index 0000000000..8c68c52bca
--- /dev/null
+++ b/gr-qtgui/include/qtgui/timerasterdisplayform.h
@@ -0,0 +1,89 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012,2013 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.
+ */
+
+#ifndef TIMERASTER_DISPLAY_FORM_H
+#define TIMERASTER_DISPLAY_FORM_H
+
+#include <qtgui/spectrumUpdateEvents.h>
+#include <qtgui/TimeRasterDisplayPlot.h>
+#include <QtGui/QtGui>
+#include <vector>
+#include <filter/firdes.h>
+
+#include <qtgui/displayform.h>
+
+class TimeRasterDisplayForm : public DisplayForm
+{
+ Q_OBJECT
+
+ public:
+ TimeRasterDisplayForm(int nplots=1,
+ double samp_rate=1,
+ double rows=1,
+ double cols=1,
+ double zmax=1,
+ QWidget* parent = 0);
+ ~TimeRasterDisplayForm();
+
+ TimeRasterDisplayPlot* getPlot();
+
+ double numRows();
+ double numCols();
+
+ int getColorMap(int which);
+ int getAlpha(int which);
+ double getMinIntensity(int which);
+ double getMaxIntensity(int which);
+
+public slots:
+ void customEvent(QEvent *e);
+
+ void setNumRows(double rows);
+ void setNumCols(double cols);
+
+ void setNumRows(QString rows);
+ void setNumCols(QString cols);
+
+ void setSampleRate(const double samprate);
+ void setSampleRate(const QString &rate);
+
+ void setIntensityRange(const double minIntensity,
+ const double maxIntensity);
+
+ void setColorMap(int which,
+ const int newType,
+ const QColor lowColor=QColor("white"),
+ const QColor highColor=QColor("white"));
+
+ void setAlpha(int which, int alpha);
+
+ void autoScale(bool en=false);
+
+private slots:
+ void newData(const QEvent *updateEvent);
+
+private:
+ double _min_val;
+ double _max_val;
+};
+
+#endif /* TIMERASTER_DISPLAY_FORM_H */
diff --git a/gr-qtgui/include/qtgui/waterfallGlobalData.h b/gr-qtgui/include/qtgui/waterfallGlobalData.h
new file mode 100644
index 0000000000..8ab9590d0b
--- /dev/null
+++ b/gr-qtgui/include/qtgui/waterfallGlobalData.h
@@ -0,0 +1,81 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WATERFALL_GLOBAL_DATA_HPP
+#define WATERFALL_GLOBAL_DATA_HPP
+
+#include <qwt_raster_data.h>
+#include <inttypes.h>
+
+#if QWT_VERSION >= 0x060000
+#include <qwt_point_3d.h> // doesn't seem necessary, but is...
+#include <qwt_compat.h>
+#endif
+
+class WaterfallData: public QwtRasterData
+{
+public:
+ WaterfallData(const double, const double, const uint64_t, const unsigned int);
+ virtual ~WaterfallData();
+
+ virtual void reset();
+ virtual void copy(const WaterfallData*);
+
+ virtual void resizeData(const double, const double, const uint64_t);
+
+ virtual QwtRasterData *copy() const;
+
+#if QWT_VERSION < 0x060000
+ virtual QwtDoubleInterval range() const;
+ virtual void setRange(const QwtDoubleInterval&);
+#endif
+
+ virtual double value(double x, double y) const;
+
+ virtual uint64_t getNumFFTPoints()const;
+ virtual void addFFTData(const double*, const uint64_t, const int);
+
+ virtual double* getSpectrumDataBuffer()const;
+ virtual void setSpectrumDataBuffer(const double*);
+
+ virtual int getNumLinesToUpdate()const;
+ virtual void setNumLinesToUpdate(const int);
+ virtual void incrementNumLinesToUpdate();
+
+protected:
+
+ double* _spectrumData;
+ uint64_t _fftPoints;
+ uint64_t _historyLength;
+ int _numLinesToUpdate;
+
+#if QWT_VERSION < 0x060000
+ QwtDoubleInterval _intensityRange;
+#else
+ QwtInterval _intensityRange;
+#endif
+
+private:
+
+};
+
+#endif /* WATERFALL_GLOBAL_DATA_HPP */
diff --git a/gr-qtgui/include/qtgui/waterfalldisplayform.h b/gr-qtgui/include/qtgui/waterfalldisplayform.h
new file mode 100644
index 0000000000..56efe4ed27
--- /dev/null
+++ b/gr-qtgui/include/qtgui/waterfalldisplayform.h
@@ -0,0 +1,95 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WATERFALL_DISPLAY_FORM_H
+#define WATERFALL_DISPLAY_FORM_H
+
+#include <qtgui/spectrumUpdateEvents.h>
+#include <qtgui/WaterfallDisplayPlot.h>
+#include <QtGui/QtGui>
+#include <vector>
+#include <filter/firdes.h>
+
+#include <qtgui/displayform.h>
+
+class WaterfallDisplayForm : public DisplayForm
+{
+ Q_OBJECT
+
+ public:
+ WaterfallDisplayForm(int nplots=1, QWidget* parent = 0);
+ ~WaterfallDisplayForm();
+
+ WaterfallDisplayPlot* getPlot();
+
+ int getFFTSize() const;
+ float getFFTAverage() const;
+ gr::filter::firdes::win_type getFFTWindowType() const;
+
+ int getColorMap(int which);
+ int getAlpha(int which);
+ double getMinIntensity(int which);
+ double getMaxIntensity(int which);
+
+ void clearData();
+
+public slots:
+ void customEvent(QEvent *e);
+
+ void setSampleRate(const QString &samprate);
+ void setFFTSize(const int);
+ void setFFTAverage(const float);
+ void setFFTWindowType(const gr::filter::firdes::win_type);
+
+ void setFrequencyRange(const double centerfreq,
+ const double bandwidth);
+
+ void setIntensityRange(const double minIntensity,
+ const double maxIntensity);
+
+ void setAlpha(int which, int alpha);
+
+ void setColorMap(int which,
+ const int newType,
+ const QColor lowColor=QColor("white"),
+ const QColor highColor=QColor("white"));
+
+ void autoScale(bool en=false);
+
+private slots:
+ void newData(const QEvent *updateEvent);
+
+private:
+ uint64_t _numRealDataPoints;
+ QIntValidator* _intValidator;
+
+ double _samp_rate, _center_freq;
+ double _time_per_slice;
+ int _fftsize;
+ float _fftavg;
+ gr::filter::firdes::win_type _fftwintype;
+
+ double _min_val;
+ double _max_val;
+};
+
+#endif /* WATERFALL_DISPLAY_FORM_H */