1 #ifndef WATERFALL_3D_DISPLAY_PLOT_HPP
2 #define WATERFALL_3D_DISPLAY_PLOT_HPP
5 #include <highResTimeFunctions.h>
7 #include <waterfallGlobalData.h>
8 #include <qwt3d_surfaceplot.h>
10 #include <qwt3d_color.h>
11 #include <qwt_color_map.h>
13 class Waterfall3DColorMap: public Qwt3D::Color, public QwtLinearColorMap
16 Waterfall3DColorMap();
17 virtual ~Waterfall3DColorMap();
19 virtual Qwt3D::RGBA operator()(double x, double y, double z)const;
20 virtual Qwt3D::ColorVector& createVector(Qwt3D::ColorVector& vec);
22 virtual void SetInterval(const double minValue, const double maxValue);
27 QwtDoubleInterval _interval;
30 class Waterfall3DDisplayPlot:public Qwt3D::SurfacePlot{
34 class IntensityScale:public Qwt3D::LinearScale{
36 friend class Qwt3D::Axis;
37 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
43 explicit IntensityScale(const double newFloor):_floor(newFloor){ }
44 virtual ~IntensityScale(){}
46 virtual QString ticLabel(unsigned int idx) const{
47 if (idx<majors_p.size())
49 return QString("%1").arg( majors_p[idx] + GetFloorValue(), 0, 'f', 0 );
54 virtual double GetFloorValue()const{ return _floor; }
55 virtual void SetFloorValue(const double newFloor){ _floor = newFloor; }
57 //! Returns a new heap based object utilized from qwt3d_ptr
58 Scale* clone() const {return new IntensityScale(*this);}
61 class TimeScale:public Qwt3D::LinearScale{
63 friend class Qwt3D::Axis;
64 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
65 friend class Waterfall3DDisplayPlot;
68 Waterfall3DDisplayPlot* _plot;
71 TimeScale(Waterfall3DDisplayPlot* plot ):_plot(plot){
76 virtual QString ticLabel(unsigned int idx) const{
77 if (idx<majors_p.size())
79 const timespec markerTime = timespec_add(_plot->_dataTimestamp,
80 -(_plot->_timePerFFT) * majors_p[idx]);
82 gmtime_r(&markerTime.tv_sec, &timeTm);
84 char* timeBuffer = new char[128];
85 snprintf(timeBuffer, 128, "%02d:%02d:%02d.%03ld", timeTm.tm_hour,
86 timeTm.tm_min, timeTm.tm_sec, (markerTime.tv_nsec / 1000000));
87 QString returnBuffer(timeBuffer);
94 //! Returns a new heap based object utilized from qwt3d_ptr
95 Scale* clone() const {return new TimeScale(*this);}
98 class FrequencyScale: public Qwt3D::LinearScale{
100 friend class Qwt3D::Axis;
101 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
103 double _centerFrequency;
104 bool _useCenterFrequencyFlag;
106 FrequencyScale(bool useCenterFrequencyFlag, double centerFrequency)
107 : _centerFrequency(centerFrequency),_useCenterFrequencyFlag(useCenterFrequencyFlag)
110 virtual ~FrequencyScale(){}
112 virtual QString ticLabel(unsigned int idx) const
114 if (idx<majors_p.size())
116 if(!_useCenterFrequencyFlag){
117 return QString("%1").arg( majors_p[idx], 0, 'f', 0 );
121 return QString("%1").arg( (majors_p[idx] + _centerFrequency)/1000.0, 0, 'f', 3 );
127 //! Returns a new heap based object utilized from qwt3d_ptr
128 Scale* clone() const {return new FrequencyScale(*this);}
132 Waterfall3DDisplayPlot(QWidget*);
133 virtual ~Waterfall3DDisplayPlot();
138 bool loadFromData(double** data, unsigned int columns, unsigned int rows
139 ,double minx, double maxx, double miny, double maxy);
141 void SetFrequencyRange(const double, const double,
142 const double, const bool,
143 const double units, const std::string &strunits);
144 double GetStartFrequency()const;
145 double GetStopFrequency()const;
147 void PlotNewData(const double* dataPoints, const int64_t numDataPoints,
148 const double timePerFFT, const timespec timestamp,
149 const int droppedFrames);
151 void SetIntensityRange(const double minIntensity, const double maxIntensity);
153 virtual void replot(void);
155 int GetIntensityColorMapType()const;
156 void SetIntensityColorMapType( const int, const QColor,
157 const QColor, const bool forceFlag = false,
158 const bool noReplotFlag = false );
159 const QColor GetUserDefinedLowIntensityColor()const;
160 const QColor GetUserDefinedHighIntensityColor()const;
162 static const int INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR = 0;
163 static const int INTENSITY_COLOR_MAP_TYPE_WHITE_HOT = 1;
164 static const int INTENSITY_COLOR_MAP_TYPE_BLACK_HOT = 2;
165 static const int INTENSITY_COLOR_MAP_TYPE_INCANDESCENT = 3;
166 static const int INTENSITY_COLOR_MAP_TYPE_USER_DEFINED = 4;
169 void resizeSlot( QSize *s );
173 void UpdatedLowerIntensityLevel(const double);
174 void UpdatedUpperIntensityLevel(const double);
178 double _startFrequency;
179 double _stopFrequency;
181 Waterfall3DData* _waterfallData;
183 timespec _lastReplot;
187 double _displayIntervalTime;
189 int _intensityColorMapType;
190 QColor _userDefinedLowIntensityColor;
191 QColor _userDefinedHighIntensityColor;
193 bool _useCenterFrequencyFlag;
194 double _centerFrequency;
196 timespec _dataTimestamp;
200 bool _createCoordinateSystemFlag;
206 #endif /* WATERFALL_3D_DISPLAY_PLOT_HPP */