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{
15 Waterfall3DColorMap();
16 virtual ~Waterfall3DColorMap();
18 virtual Qwt3D::RGBA operator()(double x, double y, double z)const;
19 virtual Qwt3D::ColorVector& createVector(Qwt3D::ColorVector& vec);
21 virtual void SetInterval(const double minValue, const double maxValue);
26 QwtDoubleInterval _interval;
29 class Waterfall3DDisplayPlot:public Qwt3D::SurfacePlot{
33 class IntensityScale:public Qwt3D::LinearScale{
35 friend class Qwt3D::Axis;
36 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
42 explicit IntensityScale(const double newFloor):_floor(newFloor){ }
43 virtual ~IntensityScale(){}
45 virtual QString ticLabel(unsigned int idx) const{
46 if (idx<majors_p.size())
48 return QString("%1").arg( majors_p[idx] + GetFloorValue(), 0, 'f', 0 );
53 virtual double GetFloorValue()const{ return _floor; }
54 virtual void SetFloorValue(const double newFloor){ _floor = newFloor; }
56 //! Returns a new heap based object utilized from qwt3d_ptr
57 Scale* clone() const {return new IntensityScale(*this);}
60 class TimeScale:public Qwt3D::LinearScale{
62 friend class Qwt3D::Axis;
63 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
64 friend class Waterfall3DDisplayPlot;
67 Waterfall3DDisplayPlot* _plot;
70 TimeScale(Waterfall3DDisplayPlot* plot ):_plot(plot){
75 virtual QString ticLabel(unsigned int idx) const{
76 if (idx<majors_p.size())
78 const timespec markerTime = timespec_add(_plot->_dataTimestamp, -(_plot->_timePerFFT) * majors_p[idx]);
80 gmtime_r(&markerTime.tv_sec, &timeTm);
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);
91 //! Returns a new heap based object utilized from qwt3d_ptr
92 Scale* clone() const {return new TimeScale(*this);}
95 class FrequencyScale: public Qwt3D::LinearScale{
97 friend class Qwt3D::Axis;
98 friend class Qwt3D::qwt3d_ptr<Qwt3D::Scale>;
100 double _centerFrequency;
101 bool _useCenterFrequencyFlag;
103 FrequencyScale(bool useCenterFrequencyFlag, double centerFrequency):_centerFrequency(centerFrequency),_useCenterFrequencyFlag(useCenterFrequencyFlag){}
104 virtual ~FrequencyScale(){}
106 virtual QString ticLabel(unsigned int idx) const{
107 if (idx<majors_p.size())
109 if(!_useCenterFrequencyFlag){
110 return QString("%1").arg( majors_p[idx], 0, 'f', 0 );
114 return QString("%1").arg( (majors_p[idx] + _centerFrequency)/1000.0, 0, 'f', 3 );
120 //! Returns a new heap based object utilized from qwt3d_ptr
121 Scale* clone() const {return new FrequencyScale(*this);}
125 Waterfall3DDisplayPlot(QWidget*);
126 virtual ~Waterfall3DDisplayPlot();
131 bool loadFromData(double** data, unsigned int columns, unsigned int rows
132 ,double minx, double maxx, double miny, double maxy);
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;
140 void PlotNewData(const double* dataPoints, const int64_t numDataPoints, const double timePerFFT, const timespec timestamp, const int droppedFrames);
142 void SetIntensityRange(const double minIntensity, const double maxIntensity);
144 virtual void replot(void);
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;
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;
158 void UpdatedLowerIntensityLevel(const double);
159 void UpdatedUpperIntensityLevel(const double);
163 double _startFrequency;
164 double _stopFrequency;
166 Waterfall3DData* _waterfallData;
168 timespec _lastReplot;
172 double _displayIntervalTime;
174 int _intensityColorMapType;
175 QColor _userDefinedLowIntensityColor;
176 QColor _userDefinedHighIntensityColor;
178 bool _useCenterFrequencyFlag;
179 double _centerFrequency;
181 timespec _dataTimestamp;
185 bool _createCoordinateSystemFlag;
191 #endif /* WATERFALL_3D_DISPLAY_PLOT_HPP */