1
#ifndef CONSTELLATION_DISPLAY_PLOT_C
2
#define CONSTELLATION_DISPLAY_PLOT_C
4
#include <ConstellationDisplayPlot.h>
6
#include <qwt_scale_draw.h>
7
#include <qwt_legend.h>
10
class ConstellationDisplayZoomer: public QwtPlotZoomer
13
ConstellationDisplayZoomer(QwtPlotCanvas* canvas):QwtPlotZoomer(canvas)
15
setTrackerMode(QwtPicker::AlwaysOn);
18
virtual ~ConstellationDisplayZoomer(){
22
virtual void updateTrackerText(){
27
virtual QwtText trackerText( const QwtDoublePoint& p ) const
29
QwtText t(QString("Sample %1, %2 V").arg(p.x(), 0, 'f', 0).arg(p.y(), 0, 'f', 4));
35
ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent):QwtPlot(parent){
36
timespec_reset(&_lastReplot);
38
resize(parent->width(), parent->height());
40
_displayIntervalTime = (1.0/10.0); // 1/10 of a second between updates
43
_realDataPoints = new double[_numPoints];
44
_imagDataPoints = new double[_numPoints];
46
// Disable polygon clipping
47
QwtPainter::setDeviceClipping(false);
49
// We don't need the cache here
50
canvas()->setPaintAttribute(QwtPlotCanvas::PaintCached, false);
51
canvas()->setPaintAttribute(QwtPlotCanvas::PaintPacked, false);
54
palette.setColor(canvas()->backgroundRole(), QColor("white"));
55
canvas()->setPalette(palette);
57
setAxisScaleEngine(QwtPlot::xBottom, new QwtLinearScaleEngine);
58
//setAxisScale(QwtPlot::xBottom, -1.0, 1.0);
60
setAxisTitle(QwtPlot::xBottom, "In-phase");
62
setAxisScaleEngine(QwtPlot::yLeft, new QwtLinearScaleEngine);
63
//setAxisScale(QwtPlot::yLeft, -1.0, 1.0);
65
setAxisTitle(QwtPlot::yLeft, "Quadrature");
67
// Automatically deleted when parent is deleted
68
_plot_curve = new QwtPlotCurve("Constellation Points");
69
_plot_curve->attach(this);
70
_plot_curve->setPen(QPen(Qt::blue, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
71
_plot_curve->setStyle(QwtPlotCurve::Dots);
72
_plot_curve->setRawData(_realDataPoints, _imagDataPoints, _numPoints);
74
memset(_realDataPoints, 0x0, _numPoints*sizeof(double));
75
memset(_imagDataPoints, 0x0, _numPoints*sizeof(double));
79
_zoomer = new ConstellationDisplayZoomer(canvas());
80
#if QT_VERSION < 0x040000
81
_zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
82
Qt::RightButton, Qt::ControlModifier);
84
_zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
85
Qt::RightButton, Qt::ControlModifier);
87
_zoomer->setMousePattern(QwtEventPattern::MouseSelect3,
90
_panner = new QwtPlotPanner(canvas());
91
_panner->setAxisEnabled(QwtPlot::yRight, false);
92
_panner->setMouseButton(Qt::MidButton);
94
// Avoid jumping when labels with more/less digits
95
// appear/disappear when scrolling vertically
97
const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font());
98
QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft);
99
sd->setMinimumExtent( fm.width("100.00") );
101
const QColor c(Qt::darkRed);
102
_zoomer->setRubberBandPen(c);
103
_zoomer->setTrackerPen(c);
105
connect(this, SIGNAL( legendChecked(QwtPlotItem *, bool ) ),
106
this, SLOT( LegendEntryChecked(QwtPlotItem *, bool ) ));
109
ConstellationDisplayPlot::~ConstellationDisplayPlot(){
110
delete[] _realDataPoints;
111
delete[] _imagDataPoints;
113
// _fft_plot_curves deleted when parent deleted
114
// _zoomer and _panner deleted when parent deleted
118
ConstellationDisplayPlot::set_xaxis(double min, double max)
120
setAxisScale(QwtPlot::xBottom, min, max);
124
ConstellationDisplayPlot::set_yaxis(double min, double max)
126
setAxisScale(QwtPlot::yLeft, min, max);
130
ConstellationDisplayPlot::set_axis(double xmin, double xmax,
131
double ymin, double ymax)
133
set_xaxis(xmin, xmax);
134
set_yaxis(ymin, ymax);
137
void ConstellationDisplayPlot::replot(){
139
const timespec startTime = get_highres_clock();
143
double differenceTime = (diff_timespec(get_highres_clock(), startTime));
145
differenceTime *= 99.0;
146
// Require at least a 10% duty cycle
147
if(differenceTime > (1.0/10.0)){
148
_displayIntervalTime = differenceTime;
152
void ConstellationDisplayPlot::PlotNewData(const double* realDataPoints, const double* imagDataPoints, const int64_t numDataPoints){
153
if(numDataPoints > 0){
155
if(numDataPoints != _numPoints){
156
_numPoints = numDataPoints;
158
delete[] _realDataPoints;
159
delete[] _imagDataPoints;
160
_realDataPoints = new double[_numPoints];
161
_imagDataPoints = new double[_numPoints];
163
_plot_curve->setRawData(_realDataPoints, _imagDataPoints, _numPoints);
165
memcpy(_realDataPoints, realDataPoints, numDataPoints*sizeof(double));
166
memcpy(_imagDataPoints, imagDataPoints, numDataPoints*sizeof(double));
170
// Allow at least a 50% duty cycle
171
if(diff_timespec(get_highres_clock(), _lastReplot) > _displayIntervalTime){
172
// Only replot the screen if it is visible
176
_lastReplot = get_highres_clock();
180
void ConstellationDisplayPlot::LegendEntryChecked(QwtPlotItem* plotItem, bool on){
181
plotItem->setVisible(!on);
184
#endif /* CONSTELLATION_DISPLAY_PLOT_C */