Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
spbro
OpenXG-RAN
Commits
3d1d4687
Commit
3d1d4687
authored
Mar 15, 2023
by
Thomas Schlichter
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
changes from review and updated indentation with clang-format
parent
4b15a77a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
161 additions
and
294 deletions
+161
-294
openair1/PHY/TOOLS/nr_phy_qt_scope.cpp
openair1/PHY/TOOLS/nr_phy_qt_scope.cpp
+124
-201
openair1/PHY/TOOLS/nr_phy_qt_scope.h
openair1/PHY/TOOLS/nr_phy_qt_scope.h
+37
-78
openair1/PHY/TOOLS/phy_scope_interface.h
openair1/PHY/TOOLS/phy_scope_interface.h
+0
-15
No files found.
openair1/PHY/TOOLS/nr_phy_qt_scope.cpp
View file @
3d1d4687
...
...
@@ -23,7 +23,6 @@
#include <QApplication>
#include <QtWidgets>
#include <QMessageBox>
#include <QPainter>
#include <QtGui>
#include <QLineEdit>
...
...
@@ -72,19 +71,22 @@ float Limits_KPI_ue[2][2] = {
};
// Holds status of active plots
bool
currentActivePlots
[
static_cast
<
int
>
(
PlotTypeGnb
::
config
)];
LLRPlotGnb
*
puschLlr
;
IQPlotGnb
*
puschIq
;
std
::
set
<
LLRPlot
*>
puschLlrSet
;
std
::
set
<
IQPlot
*>
puschIqSet
;
void
scopeUpdaterGnb
(
enum
PlotTypeGnbIf
plotType
,
int
numElt
)
{
if
(
plotType
==
puschLLRe
&&
currentActivePlots
[
static_cast
<
int
>
(
PlotTypeGnb
::
puschLLR
)])
{
puschLlr
->
len
=
numElt
;
puschLlr
->
newData
->
updateScope
();
}
else
if
(
plotType
==
puschIQe
&&
currentActivePlots
[
static_cast
<
int
>
(
PlotTypeGnb
::
puschIQ
)])
{
puschIq
->
len
=
numElt
;
puschIq
->
newData
->
updateScope
();
switch
(
plotType
)
{
case
puschLLRe
:
for
(
auto
puschLlr
=
puschLlrSet
.
begin
();
puschLlr
!=
puschLlrSet
.
end
();
puschLlr
++
)
{
(
*
puschLlr
)
->
updatePlot
(
numElt
);
}
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)
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
->
image
=
nullptr
;
...
...
@@ -205,8 +208,8 @@ WaterFall::WaterFall(complex16 *values, NR_DL_FRAME_PARMS *frame_parms, QWidget
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
and the y-axis is a color map depending on the SquaredNorm of the received signal at the correspoinding slot. */
/* 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
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
)
{
if
(
!
this
->
isVisible
())
...
...
@@ -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
();
...
...
@@ -378,7 +382,6 @@ LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len)
// add new X axis
this
->
axisX
=
new
QValueAxis
();
this
->
axisX
->
setLabelFormat
(
"%d"
);
this
->
axisX
->
setRange
(
0
,
len
);
this
->
addAxis
(
this
->
axisX
,
Qt
::
AlignBottom
);
this
->
series
->
attachAxis
(
this
->
axisX
);
...
...
@@ -387,55 +390,30 @@ LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len)
this
->
addAxis
(
this
->
axisY
,
Qt
::
AlignLeft
);
this
->
series
->
attachAxis
(
this
->
axisY
);
startTimer
(
1000
);
}
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
);
if
(
interval
)
startTimer
(
interval
);
// add new X axis
this
->
axisX
=
new
QValueAxis
();
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
);
if
(
notificationSet
)
notificationSet
->
insert
(
this
);
}
LLRPlot
Gnb
::~
LLRPlotGnb
()
LLRPlot
::~
LLRPlot
()
{
currentActivePlots
[
static_cast
<
int
>
(
this
->
plotType
)]
=
false
;
puschLlr
=
nullptr
;
if
(
this
->
notificationSet
)
this
->
notificationSet
->
erase
(
this
)
;
}
void
LLRPlot
Gnb
::
updatePlot
(
)
void
LLRPlot
::
updatePlot
(
int
len
)
{
this
->
len
=
len
;
if
(
!
this
->
isVisible
())
return
;
QVector
<
QPointF
>
points
(
this
->
len
);
QVector
<
QPointF
>
points
(
len
);
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
]);
maxY
=
std
::
max
(
maxY
,
abs
(
this
->
data
[
i
]));
}
...
...
@@ -447,19 +425,7 @@ void LLRPlotGnb::updatePlot()
void
LLRPlot
::
timerEvent
(
QTimerEvent
*
event
)
{
if
(
!
this
->
isVisible
())
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
);
this
->
updatePlot
(
this
->
len
);
}
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
();
// add new series to the chart
...
...
@@ -511,24 +472,32 @@ IQPlotGnb::IQPlotGnb(complex16 *data, int len, PlotTypeGnb plotType) : data(data
this
->
axisY
=
new
QValueAxis
();
this
->
addAxis
(
this
->
axisY
,
Qt
::
AlignLeft
);
this
->
series
->
attachAxis
(
this
->
axisY
);
if
(
interval
)
startTimer
(
interval
);
if
(
notificationSet
)
notificationSet
->
insert
(
this
);
}
IQPlot
Gnb
::~
IQPlotGnb
()
IQPlot
::~
IQPlot
()
{
currentActivePlots
[
static_cast
<
int
>
(
this
->
plotType
)]
=
false
;
puschIq
=
nullptr
;
if
(
this
->
notificationSet
)
this
->
notificationSet
->
erase
(
this
)
;
}
void
IQPlot
Gnb
::
updatePlot
(
)
void
IQPlot
::
updatePlot
(
int
len
)
{
this
->
len
=
len
;
if
(
!
this
->
isVisible
())
return
;
QVector
<
QPointF
>
points
(
this
->
len
);
QVector
<
QPointF
>
points
(
len
);
int
maxX
=
this
->
axisX
->
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
);
maxX
=
std
::
max
(
maxX
,
abs
(
this
->
data
[
i
].
r
));
...
...
@@ -540,50 +509,9 @@ void IQPlotGnb::updatePlot()
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
)
{
if
(
!
this
->
isVisible
())
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
);
this
->
updatePlot
(
this
->
len
);
}
void
IQPlotUE
::
timerEvent
(
QTimerEvent
*
event
)
...
...
@@ -796,7 +724,10 @@ PainterWidgetGnb::PainterWidgetGnb(QWidget *config, QComboBox *comboBox, scopeDa
this
->
plotType
=
PlotTypeGnb
::
empty
;
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
()
...
...
@@ -871,15 +802,6 @@ void PainterWidgetGnb::makeConnections(int type)
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
->
chartView
->
hide
();
QChart
*
prevChart
=
this
->
chartView
->
chart
();
...
...
@@ -905,76 +827,74 @@ void PainterWidgetGnb::makeConnections(int type)
QChart
*
newChart
=
nullptr
;
if
(
plotType
==
PlotTypeGnb
::
empty
)
{
newChart
=
new
QChart
();
currentActivePlots
[
static_cast
<
int
>
(
prevPlotType
)]
=
false
;
}
else
{
switch
(
plotType
)
{
case
PlotTypeGnb
:
:
CIR
:
{
newChart
=
new
CIRPlot
((
complex16
*
)
p
->
gNB
->
pusch_vars
[
0
].
ul_ch_estimates_time
[
0
],
frame_parms
->
ofdm_symbol_size
);
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
;
}
switch
(
plotType
)
{
case
PlotTypeGnb
:
:
empty
:
{
newChart
=
new
QChart
();
break
;
}
case
PlotTypeGnb
:
:
CIR
:
{
newChart
=
new
CIRPlot
((
complex16
*
)
p
->
gNB
->
pusch_vars
[
0
].
ul_ch_estimates_time
[
0
],
frame_parms
->
ofdm_symbol_size
);
break
;
}
case
PlotTypeGnb
:
:
pdschSNR
:
{
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
;
}
case
PlotTypeGnb
:
:
pdschThroughput
:
{
newChart
=
new
KPIPlot
(
this
,
Limits_KPI_gNB
[
3
]);
break
;
}
case
PlotTypeGnb
:
:
pdschRBs
:
{
newChart
=
new
KPIPlot
(
this
);
break
;
}
case
PlotTypeGnb
:
:
puschLLR
:
{
int
init_coded_bits_per_codeword
=
100
;
newChart
=
new
LLRPlot
((
int16_t
*
)
p
->
gNB
->
pusch_vars
[
0
].
llr
,
init_coded_bits_per_codeword
,
0
,
&
puschLlrSet
);
break
;
}
case
PlotTypeGnb
:
:
puschIQ
:
{
int
init_num_re
=
100
;
newChart
=
new
IQPlot
((
complex16
*
)
p
->
gNB
->
pusch_vars
[
0
].
rxdataF_comp
[
0
],
init_num_re
,
0
,
&
puschIqSet
);
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
;
}
default:
break
;
case
PlotTypeGnb
:
:
pdschSNR
:
{
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
);
...
...
@@ -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
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
->
hide
();
...
...
@@ -992,7 +913,10 @@ PainterWidgetUE::PainterWidgetUE(QWidget *config, QComboBox *comboBox, PHY_VARS_
this
->
plotType
=
PlotTypeUE
::
empty
;
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
()
...
...
@@ -1029,7 +953,6 @@ float PainterWidgetUE::getValue()
case
PlotTypeUE
:
:
timingAdvance
:
return
(
float
)
this
->
ue
->
timing_advance
;
default:
return
0
;
}
...
...
openair1/PHY/TOOLS/nr_phy_qt_scope.h
View file @
3d1d4687
...
...
@@ -24,6 +24,7 @@
#ifndef QT_SCOPE_MAINWINDOW_H
#define QT_SCOPE_MAINWINDOW_H
#include <set>
#include <QtCharts>
extern
"C"
{
...
...
@@ -94,7 +95,8 @@ class ValueProvider {
class
ValueProviderUE
:
public
ValueProvider
{
public:
/// This pure virtual function is meant to provide the graph values to be plotted
virtual
scopeGraphData_t
*
getPlotValue
()
{
virtual
scopeGraphData_t
*
getPlotValue
()
{
return
nullptr
;
}
};
...
...
@@ -234,7 +236,9 @@ class CIRPlotUE : public CIRPlot {
Q_OBJECT
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:
/// This function is triggered when the own timer expires. It updates the plotted CIR
...
...
@@ -254,54 +258,26 @@ class NewDataHere : public QObject {
};
/// Chart class for plotting LLRs
class
LLRPlot
Gnb
:
public
QChart
{
class
LLRPlot
:
public
QChart
{
Q_OBJECT
public:
/// Constructor
/// \param data Pointer to the LLR data
/// \param len Length of the LLR data
LLRPlotGnb
(
int16_t
*
data
,
int
len
,
PlotTypeGnb
plotType
);
~
LLRPlotGnb
();
public
slots
:
void
updatePlot
();
public:
/// Length of the LLR data
int
len
;
NewDataHere
*
newData
;
/// \param interval update interval in ms (0 means no timer-triggered updates)
/// \param notificationSet pointer to a std::set for update notifications
LLRPlot
(
int16_t
*
data
,
int
len
,
int
interval
=
1000
,
std
::
set
<
LLRPlot
*>
*
notificationSet
=
nullptr
);
private:
/// Pointer to the LLR data
int16_t
*
data
;
/// Scatter series used to plot the LLR in the chart
QScatterSeries
*
series
;
/// Horizontal axis of the chart
QValueAxis
*
axisX
;
/// Destructor
~
LLRPlot
();
/// Vertical axis of the chart
QValueAxis
*
axisY
;
/// 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
);
public
slots
:
/// This function updates the plotted LLR
void
updatePlot
(
int
len
);
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
virtual
void
timerEvent
(
QTimerEvent
*
event
)
override
;
...
...
@@ -311,6 +287,9 @@ class LLRPlot : public QChart {
/// Length of the LLR data
int
len
;
/// Pointer to a std::set for update notifications
std
::
set
<
LLRPlot
*>
*
notificationSet
;
/// Scatter series used to plot the LLR in the chart
QScatterSeries
*
series
;
...
...
@@ -325,7 +304,9 @@ class LLRPlotUE : public LLRPlot {
Q_OBJECT
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:
/// 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 {
};
/// Chart class for plotting the I/Q constellation diagram
class
IQPlot
Gnb
:
public
QChart
{
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
IQPlotGnb
(
complex16
*
data
,
int
len
,
PlotTypeGnb
plotType
);
~
IQPlotGnb
();
/// Length of the I/Q data
int
len
;
/// \param interval update interval in ms (0 means no timer-triggered updates)
/// \param notificationSet pointer to a std::set for update notifications
IQPlot
(
complex16
*
data
,
int
len
,
int
interval
=
1000
,
std
::
set
<
IQPlot
*>
*
notificationSet
=
nullptr
);
NewDataHere
*
newData
;
/// Destructor
~
IQPlot
();
public
slots
:
void
updatePlot
();
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
);
/// This function updates the plotted I/Q constellation diagram
void
updatePlot
(
int
len
);
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
virtual
void
timerEvent
(
QTimerEvent
*
event
)
override
;
...
...
@@ -393,6 +347,9 @@ class IQPlot : public QChart {
/// Length of the I/Q data
int
len
;
/// Pointer to a std::set for update notifications
std
::
set
<
IQPlot
*>
*
notificationSet
;
/// Scatter series used to plot the I/Q constellation diagram
QScatterSeries
*
series
;
...
...
@@ -407,7 +364,9 @@ class IQPlotUE : public IQPlot {
Q_OBJECT
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:
/// This function is triggered when the own timer expires. It updates the plotted I/Q constellation diagram
...
...
openair1/PHY/TOOLS/phy_scope_interface.h
View file @
3d1d4687
...
...
@@ -71,23 +71,8 @@ enum scopeDataType {
};
enum
PlotTypeGnbIf
{
empty
,
waterFall
,
CIR
,
puschLLRe
,
puschIQe
,
puschSNR
,
puschBLER
,
puschMCS
,
puschRETX
,
puschThroughput
,
pdschSNR
,
pdschBLER
,
pdschMCS
,
pdschRETX
,
pdschThroughput
,
pdschRBs
,
config
};
#define COPIES_MEM 4
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment