1 #ifndef WATERFALL_3D_DISPLAY_PLOT_HPP
2 #define WATERFALL_3D_DISPLAY_PLOT_HPP
4 #include <highResTimeFunctions.h>
6 #include <waterfallGlobalData.h>
7 #include <qwt3d_surfaceplot.h>
9 #include <qwt3d_color.h>
10 #include <qwt_color_map.h>
12 class Waterfall3DColorMap:public Qwt3D::Color, public QwtLinearColorMap{
14 Waterfall3DColorMap();
15 virtual ~Waterfall3DColorMap();
17 virtual Qwt3D::RGBA operator()(double x, double y, double z)const;
18 virtual Qwt3D::ColorVector& createVector(Qwt3D::ColorVector& vec);
20 virtual void SetInterval(const double minValue, const double maxValue);
25 QwtDoubleInterval _interval;
28 class Waterfall3DDisplayPlot:public Qwt3D::SurfacePlot{
32 class IntensityScale:public Qwt3D::LinearScale{
34 friend class Qwt3D::Axis;
35 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
41 explicit IntensityScale(const double newFloor):_floor(newFloor){ }
42 virtual ~IntensityScale(){}
44 virtual QString ticLabel(unsigned int idx) const{
45 if (idx<majors_p.size())
47 return QString("%1").arg( majors_p[idx] + GetFloorValue(), 0, 'f', 0 );
52 virtual double GetFloorValue()const{ return _floor; }
53 virtual void SetFloorValue(const double newFloor){ _floor = newFloor; }
55 //! Returns a new heap based object utilized from qwt3d_ptr
56 Scale* clone() const {return new IntensityScale(*this);}
59 class TimeScale:public Qwt3D::LinearScale{
61 friend class Qwt3D::Axis;
62 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
63 friend class Waterfall3DDisplayPlot;
66 Waterfall3DDisplayPlot* _plot;
69 TimeScale(Waterfall3DDisplayPlot* plot ):_plot(plot){
74 virtual QString ticLabel(unsigned int idx) const{
75 if (idx<majors_p.size())
77 const timespec markerTime = timespec_add(_plot->_dataTimestamp, -(_plot->_timePerFFT) * majors_p[idx]);
79 gmtime_r(&markerTime.tv_sec, &timeTm);
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);
90 //! Returns a new heap based object utilized from qwt3d_ptr
91 Scale* clone() const {return new TimeScale(*this);}
94 class FrequencyScale: public Qwt3D::LinearScale{
96 friend class Qwt3D::Axis;
97 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
99 double _centerFrequency;
100 bool _useCenterFrequencyFlag;
102 FrequencyScale(bool useCenterFrequencyFlag, double centerFrequency):_centerFrequency(centerFrequency),_useCenterFrequencyFlag(useCenterFrequencyFlag){}
103 virtual ~FrequencyScale(){}
105 virtual QString ticLabel(unsigned int idx) const{
106 if (idx<majors_p.size())
108 if(!_useCenterFrequencyFlag){
109 return QString("%1").arg( majors_p[idx], 0, 'f', 0 );
113 return QString("%1").arg( (majors_p[idx] + _centerFrequency)/1000.0, 0, 'f', 3 );
119 //! Returns a new heap based object utilized from qwt3d_ptr
120 Scale* clone() const {return new FrequencyScale(*this);}
124 Waterfall3DDisplayPlot(QWidget*);
125 virtual ~Waterfall3DDisplayPlot();
130 bool loadFromData(double** data, unsigned int columns, unsigned int rows
131 ,double minx, double maxx, double miny, double maxy);
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;
139 void PlotNewData(const double* dataPoints, const int64_t numDataPoints, const double timePerFFT, const timespec timestamp, const int droppedFrames);
141 void SetIntensityRange(const double minIntensity, const double maxIntensity);
143 virtual void replot(void);
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;
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;
157 void UpdatedLowerIntensityLevel(const double);
158 void UpdatedUpperIntensityLevel(const double);
162 double _startFrequency;
163 double _stopFrequency;
165 Waterfall3DData* _waterfallData;
167 timespec _lastReplot;
171 double _displayIntervalTime;
173 int _intensityColorMapType;
174 QColor _userDefinedLowIntensityColor;
175 QColor _userDefinedHighIntensityColor;
177 bool _useCenterFrequencyFlag;
178 double _centerFrequency;
180 timespec _dataTimestamp;
184 bool _createCoordinateSystemFlag;
190 #endif /* WATERFALL_3D_DISPLAY_PLOT_HPP */