Commit 3d1d4687 authored by Thomas Schlichter's avatar Thomas Schlichter

changes from review and updated indentation with clang-format

parent 4b15a77a
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <QApplication> #include <QApplication>
#include <QtWidgets> #include <QtWidgets>
#include <QMessageBox>
#include <QPainter> #include <QPainter>
#include <QtGui> #include <QtGui>
#include <QLineEdit> #include <QLineEdit>
...@@ -72,19 +71,22 @@ float Limits_KPI_ue[2][2] = { ...@@ -72,19 +71,22 @@ float Limits_KPI_ue[2][2] = {
}; };
// Holds status of active plots // Holds status of active plots
bool currentActivePlots[static_cast<int>(PlotTypeGnb::config)]; std::set<LLRPlot *> puschLlrSet;
std::set<IQPlot *> puschIqSet;
LLRPlotGnb *puschLlr;
IQPlotGnb *puschIq;
void scopeUpdaterGnb(enum PlotTypeGnbIf plotType, int numElt) void scopeUpdaterGnb(enum PlotTypeGnbIf plotType, int numElt)
{ {
if (plotType == puschLLRe && currentActivePlots[static_cast<int>(PlotTypeGnb::puschLLR)]) { switch (plotType) {
puschLlr->len = numElt; case puschLLRe:
puschLlr->newData->updateScope(); for (auto puschLlr = puschLlrSet.begin(); puschLlr != puschLlrSet.end(); puschLlr++) {
} else if (plotType == puschIQe && currentActivePlots[static_cast<int>(PlotTypeGnb::puschIQ)]) { (*puschLlr)->updatePlot(numElt);
puschIq->len = numElt; }
puschIq->newData->updateScope(); break;
case puschIQe:
for (auto puschIq = puschIqSet.begin(); puschIq != puschIqSet.end(); puschIq++) {
(*puschIq)->updatePlot(numElt);
}
break;
} }
} }
...@@ -196,7 +198,8 @@ KPIListSelectUE::KPIListSelectUE(QWidget *parent) : QComboBox(parent) ...@@ -196,7 +198,8 @@ KPIListSelectUE::KPIListSelectUE(QWidget *parent) : QComboBox(parent)
this->addItem("Configs", static_cast<int>(PlotTypeUE::config)); this->addItem("Configs", static_cast<int>(PlotTypeUE::config));
} }
WaterFall::WaterFall(complex16 *values, NR_DL_FRAME_PARMS *frame_parms, QWidget *parent) : QWidget(parent), values(values), frame_parms(frame_parms) WaterFall::WaterFall(complex16 *values, NR_DL_FRAME_PARMS *frame_parms, QWidget *parent)
: QWidget(parent), values(values), frame_parms(frame_parms)
{ {
this->iteration = 0; this->iteration = 0;
this->image = nullptr; this->image = nullptr;
...@@ -205,8 +208,8 @@ WaterFall::WaterFall(complex16 *values, NR_DL_FRAME_PARMS *frame_parms, QWidget ...@@ -205,8 +208,8 @@ WaterFall::WaterFall(complex16 *values, NR_DL_FRAME_PARMS *frame_parms, QWidget
startTimer(100); startTimer(100);
} }
/* this function to plot the waterfall graph for the RX signal in time domain for one frame. x-axis shows the frame divided into slots /* this function to plot the waterfall graph for the RX signal in time domain for one frame. x-axis shows the frame divided into
and the y-axis is a color map depending on the SquaredNorm of the received signal at the correspoinding slot. */ slots and the y-axis is a color map depending on the SquaredNorm of the received signal at the correspoinding slot. */
void WaterFall::timerEvent(QTimerEvent *event) void WaterFall::timerEvent(QTimerEvent *event)
{ {
if (!this->isVisible()) if (!this->isVisible())
...@@ -363,7 +366,8 @@ void CIRPlotUE::timerEvent(QTimerEvent *event) ...@@ -363,7 +366,8 @@ void CIRPlotUE::timerEvent(QTimerEvent *event)
} }
} }
LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len) LLRPlot::LLRPlot(int16_t *data, int len, int interval, std::set<LLRPlot *> *notificationSet)
: data(data), len(len), notificationSet(notificationSet)
{ {
this->legend()->hide(); this->legend()->hide();
...@@ -378,7 +382,6 @@ LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len) ...@@ -378,7 +382,6 @@ LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len)
// add new X axis // add new X axis
this->axisX = new QValueAxis(); this->axisX = new QValueAxis();
this->axisX->setLabelFormat("%d"); this->axisX->setLabelFormat("%d");
this->axisX->setRange(0, len);
this->addAxis(this->axisX, Qt::AlignBottom); this->addAxis(this->axisX, Qt::AlignBottom);
this->series->attachAxis(this->axisX); this->series->attachAxis(this->axisX);
...@@ -387,55 +390,30 @@ LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len) ...@@ -387,55 +390,30 @@ LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len)
this->addAxis(this->axisY, Qt::AlignLeft); this->addAxis(this->axisY, Qt::AlignLeft);
this->series->attachAxis(this->axisY); this->series->attachAxis(this->axisY);
startTimer(1000); if (interval)
} startTimer(interval);
LLRPlotGnb::LLRPlotGnb(int16_t *data, int len, PlotTypeGnb plotType) : data(data)
{
this->len = len;
this->plotType = plotType;
NewDataHere *newData = new NewDataHere();
this->newData = newData;
puschLlr = this;
connect(newData, &NewDataHere::updateScope, this, &LLRPlotGnb::updatePlot);
this->legend()->hide();
// add new series to the chart
this->series = new QScatterSeries();
this->series->setMarkerSize(3);
this->series->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
this->series->setColor(Qt::blue);
this->series->setPen(Qt::NoPen);
this->addSeries(series);
// add new X axis if (notificationSet)
this->axisX = new QValueAxis(); notificationSet->insert(this);
this->axisX->setLabelFormat("%d");
this->axisX->setRange(0, len);
this->addAxis(this->axisX, Qt::AlignBottom);
this->series->attachAxis(this->axisX);
// add new Y axis
this->axisY = new QValueAxis();
this->addAxis(this->axisY, Qt::AlignLeft);
this->series->attachAxis(this->axisY);
} }
LLRPlotGnb::~LLRPlotGnb() LLRPlot::~LLRPlot()
{ {
currentActivePlots[static_cast<int>(this->plotType)] = false; if (this->notificationSet)
puschLlr = nullptr; this->notificationSet->erase(this);
} }
void LLRPlotGnb::updatePlot() void LLRPlot::updatePlot(int len)
{ {
this->len = len;
if (!this->isVisible()) if (!this->isVisible())
return; return;
QVector<QPointF> points(this->len); QVector<QPointF> points(len);
int maxY = this->axisY->max(); int maxY = this->axisY->max();
for (int i = 0; i < this->len; i++) { for (int i = 0; i < len; i++) {
points[i] = QPointF(i, this->data[i]); points[i] = QPointF(i, this->data[i]);
maxY = std::max(maxY, abs(this->data[i])); maxY = std::max(maxY, abs(this->data[i]));
} }
...@@ -447,19 +425,7 @@ void LLRPlotGnb::updatePlot() ...@@ -447,19 +425,7 @@ void LLRPlotGnb::updatePlot()
void LLRPlot::timerEvent(QTimerEvent *event) void LLRPlot::timerEvent(QTimerEvent *event)
{ {
if (!this->isVisible()) this->updatePlot(this->len);
return;
QVector<QPointF> points(this->len);
int maxY = this->axisY->max();
for (int i = 0; i < this->len; i++) {
points[i] = QPointF(i, this->data[i]);
maxY = std::max(maxY, abs(this->data[i]));
}
this->axisY->setRange(-maxY, maxY);
this->series->replace(points);
} }
void LLRPlotUE::timerEvent(QTimerEvent *event) void LLRPlotUE::timerEvent(QTimerEvent *event)
...@@ -484,14 +450,9 @@ void LLRPlotUE::timerEvent(QTimerEvent *event) ...@@ -484,14 +450,9 @@ void LLRPlotUE::timerEvent(QTimerEvent *event)
} }
} }
IQPlotGnb::IQPlotGnb(complex16 *data, int len, PlotTypeGnb plotType) : data(data) IQPlot::IQPlot(complex16 *data, int len, int interval, std::set<IQPlot *> *notificationSet)
: data(data), len(len), notificationSet(notificationSet)
{ {
this->len = len;
this->plotType = plotType;
NewDataHere *newData = new NewDataHere();
this->newData = newData;
puschIq = this;
connect(newData, &NewDataHere::updateScope, this, &IQPlotGnb::updatePlot);
this->legend()->hide(); this->legend()->hide();
// add new series to the chart // add new series to the chart
...@@ -511,24 +472,32 @@ IQPlotGnb::IQPlotGnb(complex16 *data, int len, PlotTypeGnb plotType) : data(data ...@@ -511,24 +472,32 @@ IQPlotGnb::IQPlotGnb(complex16 *data, int len, PlotTypeGnb plotType) : data(data
this->axisY = new QValueAxis(); this->axisY = new QValueAxis();
this->addAxis(this->axisY, Qt::AlignLeft); this->addAxis(this->axisY, Qt::AlignLeft);
this->series->attachAxis(this->axisY); this->series->attachAxis(this->axisY);
if (interval)
startTimer(interval);
if (notificationSet)
notificationSet->insert(this);
} }
IQPlotGnb::~IQPlotGnb() IQPlot::~IQPlot()
{ {
currentActivePlots[static_cast<int>(this->plotType)] = false; if (this->notificationSet)
puschIq = nullptr; this->notificationSet->erase(this);
} }
void IQPlotGnb::updatePlot() void IQPlot::updatePlot(int len)
{ {
this->len = len;
if (!this->isVisible()) if (!this->isVisible())
return; return;
QVector<QPointF> points(this->len); QVector<QPointF> points(len);
int maxX = this->axisX->max(); int maxX = this->axisX->max();
int maxY = this->axisY->max(); int maxY = this->axisY->max();
for (int i = 0; i < this->len; i++) { for (int i = 0; i < len; i++) {
points[i] = QPointF(this->data[i].r, this->data[i].i); points[i] = QPointF(this->data[i].r, this->data[i].i);
maxX = std::max(maxX, abs(this->data[i].r)); maxX = std::max(maxX, abs(this->data[i].r));
...@@ -540,50 +509,9 @@ void IQPlotGnb::updatePlot() ...@@ -540,50 +509,9 @@ void IQPlotGnb::updatePlot()
this->series->replace(points); this->series->replace(points);
} }
IQPlot::IQPlot(complex16 *data, int len) : data(data), len(len)
{
this->legend()->hide();
// add new series to the chart
this->series = new QScatterSeries();
this->series->setMarkerSize(3);
this->series->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
this->series->setColor(Qt::blue);
this->series->setPen(Qt::NoPen);
this->addSeries(series);
// add new X axis
this->axisX = new QValueAxis();
this->addAxis(this->axisX, Qt::AlignBottom);
this->series->attachAxis(this->axisX);
// add new Y axis
this->axisY = new QValueAxis();
this->addAxis(this->axisY, Qt::AlignLeft);
this->series->attachAxis(this->axisY);
startTimer(1000);
}
void IQPlot::timerEvent(QTimerEvent *event) void IQPlot::timerEvent(QTimerEvent *event)
{ {
if (!this->isVisible()) this->updatePlot(this->len);
return;
QVector<QPointF> points(this->len);
int maxX = this->axisX->max();
int maxY = this->axisY->max();
for (int i = 0; i < this->len; i++) {
points[i] = QPointF(this->data[i].r, this->data[i].i);
maxX = std::max(maxX, abs(this->data[i].r));
maxY = std::max(maxY, abs(this->data[i].i));
}
this->axisX->setRange(-maxX, maxX);
this->axisY->setRange(-maxY, maxY);
this->series->replace(points);
} }
void IQPlotUE::timerEvent(QTimerEvent *event) void IQPlotUE::timerEvent(QTimerEvent *event)
...@@ -796,7 +724,10 @@ PainterWidgetGnb::PainterWidgetGnb(QWidget *config, QComboBox *comboBox, scopeDa ...@@ -796,7 +724,10 @@ PainterWidgetGnb::PainterWidgetGnb(QWidget *config, QComboBox *comboBox, scopeDa
this->plotType = PlotTypeGnb::empty; this->plotType = PlotTypeGnb::empty;
makeConnections(this->comboBox->currentIndex()); makeConnections(this->comboBox->currentIndex());
connect(this->comboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &PainterWidgetGnb::makeConnections); connect(this->comboBox,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&PainterWidgetGnb::makeConnections);
} }
float PainterWidgetGnb::getValue() float PainterWidgetGnb::getValue()
...@@ -871,15 +802,6 @@ void PainterWidgetGnb::makeConnections(int type) ...@@ -871,15 +802,6 @@ void PainterWidgetGnb::makeConnections(int type)
return; return;
} }
if (currentActivePlots[static_cast<int>(plotType)]) {
QMessageBox::information(
this,
tr("gNB Scope"),
tr("Plot already exists."));
return;
}
const PlotTypeGnb prevPlotType = this->plotType;
this->plotType = plotType; this->plotType = plotType;
this->chartView->hide(); this->chartView->hide();
QChart *prevChart = this->chartView->chart(); QChart *prevChart = this->chartView->chart();
...@@ -905,76 +827,74 @@ void PainterWidgetGnb::makeConnections(int type) ...@@ -905,76 +827,74 @@ void PainterWidgetGnb::makeConnections(int type)
QChart *newChart = nullptr; QChart *newChart = nullptr;
if (plotType == PlotTypeGnb::empty) { switch (plotType) {
newChart = new QChart(); case PlotTypeGnb::empty: {
currentActivePlots[static_cast<int>(prevPlotType)] = false; newChart = new QChart();
} else { break;
switch (plotType) { }
case PlotTypeGnb::CIR: { case PlotTypeGnb::CIR: {
newChart = new CIRPlot((complex16 *)p->gNB->pusch_vars[0].ul_ch_estimates_time[0], frame_parms->ofdm_symbol_size); newChart = new CIRPlot((complex16 *)p->gNB->pusch_vars[0].ul_ch_estimates_time[0], frame_parms->ofdm_symbol_size);
break; break;
} }
case PlotTypeGnb::puschLLR: {
int init_coded_bits_per_codeword = 100;
newChart = new LLRPlotGnb((int16_t *)p->gNB->pusch_vars[0].llr, init_coded_bits_per_codeword, plotType);
break;
}
case PlotTypeGnb::puschIQ: {
int init_num_re = 100;
newChart = new IQPlotGnb((complex16 *)p->gNB->pusch_vars[0].rxdataF_comp[0], init_num_re, plotType);
break;
}
case PlotTypeGnb::puschSNR: {
newChart = new KPIPlot(this);
break;
}
case PlotTypeGnb::puschBLER: {
newChart = new KPIPlot(this, Limits_KPI_gNB[0]);
break;
}
case PlotTypeGnb::puschMCS: {
newChart = new KPIPlot(this);
break;
}
case PlotTypeGnb::puschRETX: {
newChart = new RTXPlot(targetUE->mac_stats.ul.rounds);
break;
}
case PlotTypeGnb::puschThroughput: {
newChart = new KPIPlot(this, Limits_KPI_gNB[1]);
break;
}
case PlotTypeGnb::pdschSNR: { case PlotTypeGnb::puschLLR: {
newChart = new KPIPlot(this); int init_coded_bits_per_codeword = 100;
break; newChart = new LLRPlot((int16_t *)p->gNB->pusch_vars[0].llr, init_coded_bits_per_codeword, 0, &puschLlrSet);
} break;
case PlotTypeGnb::pdschBLER: { }
newChart = new KPIPlot(this, Limits_KPI_gNB[2]); case PlotTypeGnb::puschIQ: {
break; int init_num_re = 100;
} newChart = new IQPlot((complex16 *)p->gNB->pusch_vars[0].rxdataF_comp[0], init_num_re, 0, &puschIqSet);
case PlotTypeGnb::pdschMCS: { break;
newChart = new KPIPlot(this); }
break; case PlotTypeGnb::puschSNR: {
} newChart = new KPIPlot(this);
case PlotTypeGnb::pdschRETX: { break;
newChart = new RTXPlot(targetUE->mac_stats.dl.rounds); }
break; case PlotTypeGnb::puschBLER: {
} newChart = new KPIPlot(this, Limits_KPI_gNB[0]);
case PlotTypeGnb::pdschThroughput: { break;
newChart = new KPIPlot(this, Limits_KPI_gNB[3]); }
break; case PlotTypeGnb::puschMCS: {
} newChart = new KPIPlot(this);
case PlotTypeGnb::pdschRBs: { break;
newChart = new KPIPlot(this); }
break; case PlotTypeGnb::puschRETX: {
} newChart = new RTXPlot(targetUE->mac_stats.ul.rounds);
break;
}
case PlotTypeGnb::puschThroughput: {
newChart = new KPIPlot(this, Limits_KPI_gNB[1]);
break;
}
default: case PlotTypeGnb::pdschSNR: {
break; newChart = new KPIPlot(this);
break;
}
case PlotTypeGnb::pdschBLER: {
newChart = new KPIPlot(this, Limits_KPI_gNB[2]);
break;
}
case PlotTypeGnb::pdschMCS: {
newChart = new KPIPlot(this);
break;
}
case PlotTypeGnb::pdschRETX: {
newChart = new RTXPlot(targetUE->mac_stats.dl.rounds);
break;
} }
currentActivePlots[static_cast<int>(plotType)] = true; case PlotTypeGnb::pdschThroughput: {
newChart = new KPIPlot(this, Limits_KPI_gNB[3]);
break;
}
case PlotTypeGnb::pdschRBs: {
newChart = new KPIPlot(this);
break;
}
default:
break;
} }
this->chartView->setChart(newChart); this->chartView->setChart(newChart);
...@@ -984,7 +904,8 @@ void PainterWidgetGnb::makeConnections(int type) ...@@ -984,7 +904,8 @@ void PainterWidgetGnb::makeConnections(int type)
/* @UE: This is the main function of the UE sub-widgets, i.e., for each KPI. This function will be called /* @UE: This is the main function of the UE sub-widgets, i.e., for each KPI. This function will be called
only once when the the sub-widget is created, and it mainly initializes the widget variables and structures. */ only once when the the sub-widget is created, and it mainly initializes the widget variables and structures. */
PainterWidgetUE::PainterWidgetUE(QWidget *config, QComboBox *comboBox, PHY_VARS_NR_UE *ue) : config(config), comboBox(comboBox), ue(ue) PainterWidgetUE::PainterWidgetUE(QWidget *config, QComboBox *comboBox, PHY_VARS_NR_UE *ue)
: config(config), comboBox(comboBox), ue(ue)
{ {
this->chartView = new QChartView(this); this->chartView = new QChartView(this);
this->chartView->hide(); this->chartView->hide();
...@@ -992,7 +913,10 @@ PainterWidgetUE::PainterWidgetUE(QWidget *config, QComboBox *comboBox, PHY_VARS_ ...@@ -992,7 +913,10 @@ PainterWidgetUE::PainterWidgetUE(QWidget *config, QComboBox *comboBox, PHY_VARS_
this->plotType = PlotTypeUE::empty; this->plotType = PlotTypeUE::empty;
makeConnections(this->comboBox->currentIndex()); makeConnections(this->comboBox->currentIndex());
connect(this->comboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &PainterWidgetUE::makeConnections); connect(this->comboBox,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&PainterWidgetUE::makeConnections);
} }
float PainterWidgetUE::getValue() float PainterWidgetUE::getValue()
...@@ -1029,7 +953,6 @@ float PainterWidgetUE::getValue() ...@@ -1029,7 +953,6 @@ float PainterWidgetUE::getValue()
case PlotTypeUE::timingAdvance: case PlotTypeUE::timingAdvance:
return (float)this->ue->timing_advance; return (float)this->ue->timing_advance;
default: default:
return 0; return 0;
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#ifndef QT_SCOPE_MAINWINDOW_H #ifndef QT_SCOPE_MAINWINDOW_H
#define QT_SCOPE_MAINWINDOW_H #define QT_SCOPE_MAINWINDOW_H
#include <set>
#include <QtCharts> #include <QtCharts>
extern "C" { extern "C" {
...@@ -94,7 +95,8 @@ class ValueProvider { ...@@ -94,7 +95,8 @@ class ValueProvider {
class ValueProviderUE : public ValueProvider { class ValueProviderUE : public ValueProvider {
public: public:
/// This pure virtual function is meant to provide the graph values to be plotted /// This pure virtual function is meant to provide the graph values to be plotted
virtual scopeGraphData_t *getPlotValue() { virtual scopeGraphData_t *getPlotValue()
{
return nullptr; return nullptr;
} }
}; };
...@@ -234,7 +236,9 @@ class CIRPlotUE : public CIRPlot { ...@@ -234,7 +236,9 @@ class CIRPlotUE : public CIRPlot {
Q_OBJECT Q_OBJECT
public: public:
CIRPlotUE(complex16 *data, int len, ValueProviderUE *valueProvider) : CIRPlot(data, len), valueProvider(valueProvider) {} CIRPlotUE(complex16 *data, int len, ValueProviderUE *valueProvider) : CIRPlot(data, len), valueProvider(valueProvider)
{
}
protected: protected:
/// This function is triggered when the own timer expires. It updates the plotted CIR /// This function is triggered when the own timer expires. It updates the plotted CIR
...@@ -254,54 +258,26 @@ class NewDataHere : public QObject { ...@@ -254,54 +258,26 @@ class NewDataHere : public QObject {
}; };
/// Chart class for plotting LLRs /// Chart class for plotting LLRs
class LLRPlotGnb : public QChart { class LLRPlot : public QChart {
Q_OBJECT Q_OBJECT
public: public:
/// Constructor /// Constructor
/// \param data Pointer to the LLR data /// \param data Pointer to the LLR data
/// \param len Length of the LLR data /// \param len Length of the LLR data
LLRPlotGnb(int16_t *data, int len, PlotTypeGnb plotType); /// \param interval update interval in ms (0 means no timer-triggered updates)
~LLRPlotGnb(); /// \param notificationSet pointer to a std::set for update notifications
LLRPlot(int16_t *data, int len, int interval = 1000, std::set<LLRPlot *> *notificationSet = nullptr);
public slots:
void updatePlot();
public:
/// Length of the LLR data
int len;
NewDataHere *newData;
private: /// Destructor
/// Pointer to the LLR data ~LLRPlot();
int16_t *data;
/// Scatter series used to plot the LLR in the chart
QScatterSeries *series;
/// Horizontal axis of the chart
QValueAxis *axisX;
/// Vertical axis of the chart public slots:
QValueAxis *axisY; /// This function updates the plotted LLR
void updatePlot(int len);
/// Currently plotted KPI type
PlotTypeGnb plotType;
};
/// Chart class for plotting LLRs
class LLRPlot : public QChart {
Q_OBJECT
public:
/// Constructor
/// \param data Pointer to the LLR data
/// \param len Length of the LLR data
LLRPlot(int16_t *data, int len);
protected: protected:
/// This function is triggered when the own timer expires. It updates the plotted LLR /// This function is triggered when the own timer expires. It calls updatePlot() to update the plotted LLR
/// \param event Pointer to the timer event /// \param event Pointer to the timer event
virtual void timerEvent(QTimerEvent *event) override; virtual void timerEvent(QTimerEvent *event) override;
...@@ -311,6 +287,9 @@ class LLRPlot : public QChart { ...@@ -311,6 +287,9 @@ class LLRPlot : public QChart {
/// Length of the LLR data /// Length of the LLR data
int len; int len;
/// Pointer to a std::set for update notifications
std::set<LLRPlot *> *notificationSet;
/// Scatter series used to plot the LLR in the chart /// Scatter series used to plot the LLR in the chart
QScatterSeries *series; QScatterSeries *series;
...@@ -325,7 +304,9 @@ class LLRPlotUE : public LLRPlot { ...@@ -325,7 +304,9 @@ class LLRPlotUE : public LLRPlot {
Q_OBJECT Q_OBJECT
public: public:
LLRPlotUE(int16_t *data, int len, ValueProviderUE *valueProvider) : LLRPlot(data, len), valueProvider(valueProvider) {} LLRPlotUE(int16_t *data, int len, ValueProviderUE *valueProvider) : LLRPlot(data, len), valueProvider(valueProvider)
{
}
protected: protected:
/// This function is triggered when the own timer expires. It updates the plotted I/Q constellation diagram /// This function is triggered when the own timer expires. It updates the plotted I/Q constellation diagram
...@@ -337,53 +318,26 @@ class LLRPlotUE : public LLRPlot { ...@@ -337,53 +318,26 @@ class LLRPlotUE : public LLRPlot {
}; };
/// Chart class for plotting the I/Q constellation diagram /// Chart class for plotting the I/Q constellation diagram
class IQPlotGnb : public QChart { class IQPlot : public QChart {
Q_OBJECT Q_OBJECT
public: public:
/// Constructor /// Constructor
/// \param data Pointer to the complex I/Q data /// \param data Pointer to the complex I/Q data
/// \param len Length of the I/Q data /// \param len Length of the I/Q data
IQPlotGnb(complex16 *data, int len, PlotTypeGnb plotType); /// \param interval update interval in ms (0 means no timer-triggered updates)
~IQPlotGnb(); /// \param notificationSet pointer to a std::set for update notifications
IQPlot(complex16 *data, int len, int interval = 1000, std::set<IQPlot *> *notificationSet = nullptr);
/// Length of the I/Q data
int len;
NewDataHere *newData; /// Destructor
~IQPlot();
public slots: public slots:
void updatePlot(); /// This function updates the plotted I/Q constellation diagram
void updatePlot(int len);
private:
/// Pointer to the I/Q data
complex16 *data;
/// Scatter series used to plot the I/Q constellation diagram
QScatterSeries *series;
/// Horizontal axis of the chart
QValueAxis *axisX;
/// Vertical axis of the chart
QValueAxis *axisY;
/// Currently plotted KPI type
PlotTypeGnb plotType;
};
/// Chart class for plotting the I/Q constellation diagram
class IQPlot : public QChart {
Q_OBJECT
public:
/// Constructor
/// \param data Pointer to the complex I/Q data
/// \param len Length of the I/Q data
IQPlot(complex16 *data, int len);
protected: protected:
/// This function is triggered when the own timer expires. It updates the plotted I/Q constellation diagram /// This function is triggered when the own timer expires. It calls updatePlot() to update the plotted I/Q constellation diagram
/// \param event Pointer to the timer event /// \param event Pointer to the timer event
virtual void timerEvent(QTimerEvent *event) override; virtual void timerEvent(QTimerEvent *event) override;
...@@ -393,6 +347,9 @@ class IQPlot : public QChart { ...@@ -393,6 +347,9 @@ class IQPlot : public QChart {
/// Length of the I/Q data /// Length of the I/Q data
int len; int len;
/// Pointer to a std::set for update notifications
std::set<IQPlot *> *notificationSet;
/// Scatter series used to plot the I/Q constellation diagram /// Scatter series used to plot the I/Q constellation diagram
QScatterSeries *series; QScatterSeries *series;
...@@ -407,7 +364,9 @@ class IQPlotUE : public IQPlot { ...@@ -407,7 +364,9 @@ class IQPlotUE : public IQPlot {
Q_OBJECT Q_OBJECT
public: public:
IQPlotUE(complex16 *data, int len, ValueProviderUE *valueProvider) : IQPlot(data, len), valueProvider(valueProvider) {} IQPlotUE(complex16 *data, int len, ValueProviderUE *valueProvider) : IQPlot(data, len), valueProvider(valueProvider)
{
}
protected: protected:
/// This function is triggered when the own timer expires. It updates the plotted I/Q constellation diagram /// This function is triggered when the own timer expires. It updates the plotted I/Q constellation diagram
......
...@@ -71,23 +71,8 @@ enum scopeDataType { ...@@ -71,23 +71,8 @@ enum scopeDataType {
}; };
enum PlotTypeGnbIf { enum PlotTypeGnbIf {
empty,
waterFall,
CIR,
puschLLRe, puschLLRe,
puschIQe, puschIQe,
puschSNR,
puschBLER,
puschMCS,
puschRETX,
puschThroughput,
pdschSNR,
pdschBLER,
pdschMCS,
pdschRETX,
pdschThroughput,
pdschRBs,
config
}; };
#define COPIES_MEM 4 #define COPIES_MEM 4
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment