Imported Upstream version 3.2.2
[debian/gnuradio] / gr-qtgui / src / lib / Waterfall3DDisplayPlot.h
1 #ifndef WATERFALL_3D_DISPLAY_PLOT_HPP
2 #define WATERFALL_3D_DISPLAY_PLOT_HPP
3
4 #include <cstdio>
5 #include <highResTimeFunctions.h>
6
7 #include <waterfallGlobalData.h>
8 #include <qwt3d_surfaceplot.h>
9
10 #include <qwt3d_color.h>
11 #include <qwt_color_map.h>
12
13 class Waterfall3DColorMap:public Qwt3D::Color, public QwtLinearColorMap{
14 public:
15   Waterfall3DColorMap();
16   virtual ~Waterfall3DColorMap();
17
18   virtual Qwt3D::RGBA operator()(double x, double y, double z)const;
19   virtual Qwt3D::ColorVector& createVector(Qwt3D::ColorVector& vec);
20
21   virtual void SetInterval(const double minValue, const double maxValue);
22
23 protected:
24   
25 private:
26   QwtDoubleInterval _interval;
27 };
28
29 class Waterfall3DDisplayPlot:public Qwt3D::SurfacePlot{
30   Q_OBJECT
31
32   protected:
33   class IntensityScale:public Qwt3D::LinearScale{
34
35   friend class Qwt3D::Axis;
36   friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
37
38   private:
39     double _floor;
40
41   public:
42     explicit IntensityScale(const double newFloor):_floor(newFloor){ }
43     virtual ~IntensityScale(){}
44
45     virtual QString ticLabel(unsigned int idx) const{
46       if (idx<majors_p.size())
47         {
48           return QString("%1").arg( majors_p[idx] + GetFloorValue(), 0, 'f', 0 );
49         }
50       return QString("");
51     }
52
53     virtual double GetFloorValue()const{ return _floor; }
54     virtual void SetFloorValue(const double newFloor){ _floor = newFloor; }
55
56     //! Returns a new heap based object utilized from qwt3d_ptr
57     Scale* clone() const {return new IntensityScale(*this);} 
58   };
59   
60   class TimeScale:public Qwt3D::LinearScale{
61
62     friend class Qwt3D::Axis;
63     friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
64     friend class Waterfall3DDisplayPlot;
65
66   private:
67     Waterfall3DDisplayPlot* _plot;
68
69   public:
70     TimeScale(Waterfall3DDisplayPlot* plot ):_plot(plot){
71     }
72     virtual ~TimeScale(){
73     }
74
75     virtual QString ticLabel(unsigned int idx) const{
76       if (idx<majors_p.size())
77         {
78           const timespec markerTime = timespec_add(_plot->_dataTimestamp, -(_plot->_timePerFFT) * majors_p[idx]);
79           struct tm timeTm;
80           gmtime_r(&markerTime.tv_sec, &timeTm);
81           
82           char* timeBuffer = new char[128];
83           snprintf(timeBuffer, 128, "%02d:%02d:%02d.%03ld", timeTm.tm_hour, timeTm.tm_min, timeTm.tm_sec, (markerTime.tv_nsec / 1000000));
84           QString returnBuffer(timeBuffer);
85           delete[] timeBuffer;
86           return returnBuffer;
87         }
88       return QString("");
89     }
90
91     //! Returns a new heap based object utilized from qwt3d_ptr
92     Scale* clone() const {return new TimeScale(*this);}
93   };
94
95   class FrequencyScale: public Qwt3D::LinearScale{
96
97     friend class Qwt3D::Axis;
98     friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
99   private:
100     double _centerFrequency;
101     bool _useCenterFrequencyFlag;
102   public:
103     FrequencyScale(bool useCenterFrequencyFlag, double centerFrequency):_centerFrequency(centerFrequency),_useCenterFrequencyFlag(useCenterFrequencyFlag){}
104     virtual ~FrequencyScale(){}
105
106     virtual QString ticLabel(unsigned int idx) const{
107       if (idx<majors_p.size())
108         {
109           if(!_useCenterFrequencyFlag){
110             return QString("%1").arg(  majors_p[idx], 0, 'f', 0 );
111
112           }
113           else{
114             return QString("%1").arg(  (majors_p[idx] + _centerFrequency)/1000.0, 0, 'f', 3 );
115           }
116         }
117       return QString("");
118     }
119
120     //! Returns a new heap based object utilized from qwt3d_ptr
121     Scale* clone() const {return new FrequencyScale(*this);}
122   };
123
124 public:
125   Waterfall3DDisplayPlot(QWidget*);
126   virtual ~Waterfall3DDisplayPlot();
127                                                 
128   void Init();
129   void Reset();
130
131   bool loadFromData(double** data, unsigned int columns, unsigned int rows
132                     ,double minx, double maxx, double miny, double maxy);
133
134   void SetFrequencyRange(const double, const double,
135                          const double, const bool,
136                          const double units, const std::string &strunits);
137   double GetStartFrequency()const;
138   double GetStopFrequency()const;
139
140   void PlotNewData(const double* dataPoints, const int64_t numDataPoints, const double timePerFFT, const timespec timestamp, const int droppedFrames);
141
142   void SetIntensityRange(const double minIntensity, const double maxIntensity);
143
144   virtual void replot(void);
145
146   int GetIntensityColorMapType()const;
147   void SetIntensityColorMapType( const int, const QColor, const QColor, const bool forceFlag = false, const bool noReplotFlag = false );
148   const QColor GetUserDefinedLowIntensityColor()const;
149   const QColor GetUserDefinedHighIntensityColor()const;
150
151   static const int INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR = 0;
152   static const int INTENSITY_COLOR_MAP_TYPE_WHITE_HOT = 1;
153   static const int INTENSITY_COLOR_MAP_TYPE_BLACK_HOT = 2;
154   static const int INTENSITY_COLOR_MAP_TYPE_INCANDESCENT = 3;
155   static const int INTENSITY_COLOR_MAP_TYPE_USER_DEFINED = 4;
156
157 signals:
158   void UpdatedLowerIntensityLevel(const double);
159   void UpdatedUpperIntensityLevel(const double);
160
161 protected:
162
163   double _startFrequency;
164   double _stopFrequency;
165
166   Waterfall3DData* _waterfallData;
167
168   timespec _lastReplot;
169
170   int64_t _numPoints;
171
172   double _displayIntervalTime;
173
174   int _intensityColorMapType;
175   QColor _userDefinedLowIntensityColor;
176   QColor _userDefinedHighIntensityColor;
177
178   bool _useCenterFrequencyFlag;
179   double _centerFrequency;
180
181   timespec _dataTimestamp;
182   double _timePerFFT;
183   bool _initialized;
184
185   bool _createCoordinateSystemFlag;
186
187 private:
188
189 };
190
191 #endif /* WATERFALL_3D_DISPLAY_PLOT_HPP */