mirror of https://github.com/PentHertz/srsLTE.git
196 lines
4.0 KiB
C++
196 lines
4.0 KiB
C++
#include "ComplexWidget.h"
|
|
#include "Lineplot.h"
|
|
#include "Events.h"
|
|
|
|
#include <qlayout.h>
|
|
#include <algorithm>
|
|
|
|
using namespace std;
|
|
|
|
ComplexWidget::ComplexWidget(QWidget *parent)
|
|
:QWidget(parent)
|
|
{
|
|
i_ = new Lineplot();
|
|
q_ = new Lineplot();
|
|
m_ = new Lineplot();
|
|
p_ = new Lineplot();
|
|
|
|
i_->setAxisTitle(QwtPlot::xBottom, "In-phase");
|
|
q_->setAxisTitle(QwtPlot::xBottom, "Quadrature");
|
|
m_->setAxisTitle(QwtPlot::xBottom, "Magnitude");
|
|
p_->setAxisTitle(QwtPlot::xBottom, "Phase");
|
|
|
|
QVBoxLayout* vLayout1 = new QVBoxLayout(this);
|
|
vLayout1->addWidget(i_);
|
|
vLayout1->addWidget(q_);
|
|
vLayout1->addWidget(m_);
|
|
vLayout1->addWidget(p_);
|
|
|
|
numPoints_ = 16;
|
|
iData_ = new double[numPoints_];
|
|
qData_ = new double[numPoints_];
|
|
mData_ = new double[numPoints_];
|
|
pData_ = new double[numPoints_];
|
|
timerId_ = startTimer(10);
|
|
haveNewData_ = false;
|
|
}
|
|
|
|
ComplexWidget::~ComplexWidget()
|
|
{
|
|
delete i_;
|
|
delete q_;
|
|
delete m_;
|
|
delete p_;
|
|
}
|
|
|
|
void ComplexWidget::customEvent( QEvent * e )
|
|
{
|
|
if(e->type() == ComplexDataEvent::type)
|
|
{
|
|
ComplexDataEvent* dataEvent = (ComplexDataEvent*)e;
|
|
setData(dataEvent);
|
|
}
|
|
}
|
|
|
|
void ComplexWidget::timerEvent(QTimerEvent *event)
|
|
{
|
|
if(event->timerId() == timerId_)
|
|
{
|
|
if(haveNewData_)
|
|
{
|
|
i_->replot();
|
|
q_->replot();
|
|
m_->replot();
|
|
p_->replot();
|
|
haveNewData_ = false;
|
|
}
|
|
return;
|
|
}
|
|
QWidget::timerEvent(event);
|
|
}
|
|
|
|
void ComplexWidget::setData(ComplexDataEvent* e)
|
|
{
|
|
if(e->numPoints_ != numPoints_)
|
|
{
|
|
numPoints_ = e->numPoints_;
|
|
delete [] iData_;
|
|
delete [] qData_;
|
|
delete [] mData_;
|
|
delete [] pData_;
|
|
|
|
iData_ = new double[numPoints_];
|
|
qData_ = new double[numPoints_];
|
|
mData_ = new double[numPoints_];
|
|
pData_ = new double[numPoints_];
|
|
}
|
|
|
|
transform(e->dataPoints_, &e->dataPoints_[numPoints_], iData_, opReal());
|
|
transform(e->dataPoints_, &e->dataPoints_[numPoints_], qData_, opImag());
|
|
transform(e->dataPoints_, &e->dataPoints_[numPoints_], mData_, opAbs());
|
|
transform(e->dataPoints_, &e->dataPoints_[numPoints_], pData_, opArg());
|
|
|
|
i_->setData(iData_, numPoints_);
|
|
q_->setData(qData_, numPoints_);
|
|
m_->setData(mData_, numPoints_);
|
|
p_->setData(pData_, numPoints_);
|
|
haveNewData_ = true;
|
|
}
|
|
|
|
void ComplexWidget::setWidgetTitle(QString title)
|
|
{
|
|
setWindowTitle(title);
|
|
}
|
|
|
|
void ComplexWidget::setWidgetXAxisScale(int id, double xMin, double xMax)
|
|
{
|
|
switch(id)
|
|
{
|
|
case 0:
|
|
i_->setAxisScale(QwtPlot::xBottom, xMin, xMax);
|
|
break;
|
|
case 1:
|
|
q_->setAxisScale(QwtPlot::xBottom, xMin, xMax);
|
|
break;
|
|
case 2:
|
|
m_->setAxisScale(QwtPlot::xBottom, xMin, xMax);
|
|
break;
|
|
case 3:
|
|
p_->setAxisScale(QwtPlot::xBottom, xMin, xMax);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ComplexWidget::setWidgetYAxisScale(int id, double yMin, double yMax)
|
|
{
|
|
switch(id)
|
|
{
|
|
case 0:
|
|
i_->setAxisScale(QwtPlot::yLeft, yMin, yMax);
|
|
break;
|
|
case 1:
|
|
q_->setAxisScale(QwtPlot::yLeft, yMin, yMax);
|
|
break;
|
|
case 2:
|
|
m_->setAxisScale(QwtPlot::yLeft, yMin, yMax);
|
|
break;
|
|
case 3:
|
|
p_->setAxisScale(QwtPlot::yLeft, yMin, yMax);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ComplexWidget::setWidgetXAxisAutoScale(int id, bool on=true)
|
|
{
|
|
switch(id)
|
|
{
|
|
case 0:
|
|
i_->setAxisAutoScale(QwtPlot::xBottom, on);
|
|
break;
|
|
case 1:
|
|
q_->setAxisAutoScale(QwtPlot::xBottom, on);
|
|
break;
|
|
case 2:
|
|
m_->setAxisAutoScale(QwtPlot::xBottom, on);
|
|
break;
|
|
case 3:
|
|
p_->setAxisAutoScale(QwtPlot::xBottom, on);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ComplexWidget::setWidgetYAxisAutoScale(int id, bool on=true)
|
|
{
|
|
switch(id)
|
|
{
|
|
case 0:
|
|
i_->setAxisAutoScale(QwtPlot::yLeft, on);
|
|
break;
|
|
case 1:
|
|
q_->setAxisAutoScale(QwtPlot::yLeft, on);
|
|
break;
|
|
case 2:
|
|
m_->setAxisAutoScale(QwtPlot::yLeft, on);
|
|
break;
|
|
case 3:
|
|
p_->setAxisAutoScale(QwtPlot::yLeft, on);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ComplexWidget::setWidgetXAxisRange(double xMin, double xMax)
|
|
{
|
|
i_->setXAxisRange(xMin, xMax);
|
|
q_->setXAxisRange(xMin, xMax);
|
|
m_->setXAxisRange(xMin, xMax);
|
|
p_->setXAxisRange(xMin, xMax);
|
|
}
|