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