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
littleBu
OpenXG-RAN
Commits
86f0bee1
Commit
86f0bee1
authored
1 year ago
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_gNB_qtscope_llrPlot_fix' into integration_2023_w31
parents
5f240017
17b191a0
Branches unavailable
2025.w08
2025.w07
2025.w06
2025.w05
2025.w04
2025.w03
2025.w02
2024.w51
2024.w50
2024.w49
2024.w48
2024.w47
2024.w46
2024.w45
2024.w44
2024.w43
2024.w42
2024.w41
2024.w40
2024.w39
2024.w38
2024.w36
2024.w35
2024.w34
2024.w33
2024.w32
2024.w31
2024.w30
2024.w29
2024.w28
2024.w27
2024.w26
2024.w25
2024.w24
2024.w23
2024.w22
2024.w21
2024.w18
2024.w17
2024.w16
2024.w15
2024.w14
2024.w13
2024.w12
2024.w11
2024.w10
2024.w09
2024.w08
2024.w06
2024.w05
2024.w04
2024.w03
2024.w02
2024.w01
2023.w51
2023.w50
2023.w49
2023.w48
2023.w47
2023.w45
2023.w43
2023.w42
2023.w41
2023.w40
2023.w39
2023.w38
2023.w37
2023.w36
2023.w34
2023.w33
2023.w32
2023.w31
v2.2.0
v2.1.0
v2.0.0
ARC_1.3
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
161 additions
and
32 deletions
+161
-32
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+8
-0
openair1/PHY/TOOLS/nr_phy_qt_scope.cpp
openair1/PHY/TOOLS/nr_phy_qt_scope.cpp
+84
-24
openair1/PHY/TOOLS/nr_phy_qt_scope.h
openair1/PHY/TOOLS/nr_phy_qt_scope.h
+47
-8
openair1/PHY/TOOLS/nr_phy_scope.c
openair1/PHY/TOOLS/nr_phy_scope.c
+13
-0
openair1/PHY/TOOLS/phy_scope_interface.h
openair1/PHY/TOOLS/phy_scope_interface.h
+9
-0
No files found.
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
View file @
86f0bee1
...
...
@@ -8,6 +8,7 @@
#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
#include "PHY/defs_nr_common.h"
#include "common/utils/nr/nr_common.h"
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
//#define DEBUG_CH_COMP
//#define DEBUG_RB_EXT
...
...
@@ -2015,6 +2016,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
ad_shift
=
-
3
;
// For 2-layers, we are already doing a bit shift in the nr_ulsch_mmse_2layers() function, so we can use more bits
}
int
num_re_total
=
0
;
for
(
uint8_t
symbol
=
rel15_ul
->
start_symbol_index
;
symbol
<
(
rel15_ul
->
start_symbol_index
+
rel15_ul
->
nr_of_symbols
);
symbol
++
)
{
uint8_t
dmrs_symbol_flag
=
(
rel15_ul
->
ul_dmrs_symb_pos
>>
symbol
)
&
0x01
;
if
(
dmrs_symbol_flag
==
1
)
{
...
...
@@ -2037,6 +2039,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
nb_re_pusch
=
rel15_ul
->
rb_size
*
NR_NB_SC_PER_RB
;
}
num_re_total
+=
nb_re_pusch
;
pusch_vars
->
ul_valid_re_per_slot
[
symbol
]
=
nb_re_pusch
;
LOG_D
(
PHY
,
"symbol %d: nb_re_pusch %d, DMRS symbl used for Chest :%d
\n
"
,
symbol
,
nb_re_pusch
,
pusch_vars
->
dmrs_symbol
);
...
...
@@ -2214,4 +2217,9 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
rxdataF_ext_offset
+=
pusch_vars
->
ul_valid_re_per_slot
[
symbol
];
}
}
// symbol loop
if
(
!
(
frame
%
128
))
{
int
num_llr
=
num_re_total
*
rel15_ul
->
qam_mod_order
;
GnbScopeUpdate
(
gNB
,
puschLLRe
,
num_llr
);
GnbScopeUpdate
(
gNB
,
puschIQe
,
num_re_total
);
}
}
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/nr_phy_qt_scope.cpp
View file @
86f0bee1
...
...
@@ -70,6 +70,22 @@ float Limits_KPI_ue[2][2] = {
{
0.2
,
10
}
// Throughput in Mbs
};
// Plot updater
PlotUpdater
puschLlrUpdater
;
PlotUpdater
puschIqUpdater
;
void
scopeUpdaterGnb
(
enum
PlotTypeGnbIf
plotType
,
int
numElt
)
{
switch
(
plotType
)
{
case
puschLLRe
:
puschLlrUpdater
.
updatePlot
(
numElt
);
break
;
case
puschIQe
:
puschIqUpdater
.
updatePlot
(
numElt
);
break
;
}
}
/* This class creates the window when choosing the option 'Configs' to configure the threshold values. */
ConfigBoxFloat
::
ConfigBoxFloat
(
float
*
valuePtr
,
QWidget
*
parent
)
:
QLineEdit
(
parent
),
valuePtr
(
valuePtr
)
{
...
...
@@ -178,7 +194,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
;
...
...
@@ -187,8 +204,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
())
...
...
@@ -340,17 +357,19 @@ void CIRPlotUE::timerEvent(QTimerEvent *event)
maxY
=
std
::
max
(
maxY
,
value
);
}
this
->
axisX
->
setRange
(
-
this
->
len
/
2
,
this
->
len
/
2
);
this
->
axisY
->
setMax
(
maxY
);
this
->
series
->
replace
(
points
);
}
}
LLRPlot
::
LLRPlot
(
int16_t
*
data
,
int
len
)
:
data
(
data
),
len
(
len
)
LLRPlot
::
LLRPlot
(
int16_t
*
data
,
int
len
,
int
interval
,
PlotUpdater
*
plotUpdater
)
:
data
(
data
),
len
(
len
),
plotUpdater
(
plotUpdater
)
{
this
->
legend
()
->
hide
();
// add new series to the chart
this
->
series
=
new
QScatterSeries
();
this
->
series
->
setUseOpenGL
();
this
->
series
->
setMarkerSize
(
3
);
this
->
series
->
setMarkerShape
(
QScatterSeries
::
MarkerShapeRectangle
);
this
->
series
->
setColor
(
Qt
::
blue
);
...
...
@@ -360,7 +379,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
);
...
...
@@ -369,26 +387,44 @@ LLRPlot::LLRPlot(int16_t *data, int len) : data(data), len(len)
this
->
addAxis
(
this
->
axisY
,
Qt
::
AlignLeft
);
this
->
series
->
attachAxis
(
this
->
axisY
);
startTimer
(
1000
);
if
(
interval
)
startTimer
(
interval
);
if
(
plotUpdater
)
connect
(
plotUpdater
,
&
PlotUpdater
::
updatePlot
,
this
,
&
LLRPlot
::
updatePlot
,
Qt
::
QueuedConnection
);
}
void
LLRPlot
::
timerEvent
(
QTimerEvent
*
event
)
LLRPlot
::~
LLRPlot
(
)
{
if
(
this
->
plotUpdater
)
disconnect
(
this
->
plotUpdater
,
&
PlotUpdater
::
updatePlot
,
this
,
&
LLRPlot
::
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
]));
}
this
->
axisX
->
setRange
(
0
,
len
);
this
->
axisY
->
setRange
(
-
maxY
,
maxY
);
this
->
series
->
replace
(
points
);
}
void
LLRPlot
::
timerEvent
(
QTimerEvent
*
event
)
{
this
->
updatePlot
(
this
->
len
);
}
void
LLRPlotUE
::
timerEvent
(
QTimerEvent
*
event
)
{
if
(
!
this
->
isVisible
())
...
...
@@ -406,17 +442,19 @@ void LLRPlotUE::timerEvent(QTimerEvent *event)
maxY
=
std
::
max
(
maxY
,
abs
(
this
->
data
[
i
]));
}
this
->
axisX
->
setRange
(
0
,
this
->
len
);
this
->
axisY
->
setRange
(
-
maxY
,
maxY
);
this
->
series
->
replace
(
points
);
}
}
IQPlot
::
IQPlot
(
complex16
*
data
,
int
len
)
:
data
(
data
),
len
(
len
)
IQPlot
::
IQPlot
(
complex16
*
data
,
int
len
,
int
interval
,
PlotUpdater
*
plotUpdater
)
:
data
(
data
),
len
(
len
),
plotUpdater
(
plotUpdater
)
{
this
->
legend
()
->
hide
();
// add new series to the chart
this
->
series
=
new
QScatterSeries
();
this
->
series
->
setUseOpenGL
();
this
->
series
->
setMarkerSize
(
3
);
this
->
series
->
setMarkerShape
(
QScatterSeries
::
MarkerShapeRectangle
);
this
->
series
->
setColor
(
Qt
::
blue
);
...
...
@@ -433,19 +471,31 @@ IQPlot::IQPlot(complex16 *data, int len) : data(data), len(len)
this
->
addAxis
(
this
->
axisY
,
Qt
::
AlignLeft
);
this
->
series
->
attachAxis
(
this
->
axisY
);
startTimer
(
1000
);
if
(
interval
)
startTimer
(
interval
);
if
(
plotUpdater
)
connect
(
plotUpdater
,
&
PlotUpdater
::
updatePlot
,
this
,
&
IQPlot
::
updatePlot
,
Qt
::
QueuedConnection
);
}
void
IQPlot
::
timerEvent
(
QTimerEvent
*
event
)
IQPlot
::~
IQPlot
(
)
{
if
(
this
->
plotUpdater
)
disconnect
(
this
->
plotUpdater
,
&
PlotUpdater
::
updatePlot
,
this
,
&
IQPlot
::
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
));
...
...
@@ -457,6 +507,11 @@ void IQPlot::timerEvent(QTimerEvent *event)
this
->
series
->
replace
(
points
);
}
void
IQPlot
::
timerEvent
(
QTimerEvent
*
event
)
{
this
->
updatePlot
(
this
->
len
);
}
void
IQPlotUE
::
timerEvent
(
QTimerEvent
*
event
)
{
if
(
!
this
->
isVisible
())
...
...
@@ -667,7 +722,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
()
...
...
@@ -778,15 +836,13 @@ void PainterWidgetGnb::makeConnections(int type)
}
case
PlotTypeGnb
:
:
puschLLR
:
{
int
num_re
=
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_slot
;
int
Qm
=
2
;
int
coded_bits_per_codeword
=
num_re
*
Qm
;
newChart
=
new
LLRPlot
((
int16_t
*
)
p
->
gNB
->
pusch_vars
[
0
].
llr
,
coded_bits_per_codeword
);
int
init_coded_bits_per_codeword
=
100
;
newChart
=
new
LLRPlot
((
int16_t
*
)
p
->
gNB
->
pusch_vars
[
0
].
llr
,
init_coded_bits_per_codeword
,
0
,
&
puschLlrUpdater
);
break
;
}
case
PlotTypeGnb
:
:
puschIQ
:
{
int
num_re
=
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_slot
;
newChart
=
new
IQPlot
((
complex16
*
)
p
->
gNB
->
pusch_vars
[
0
].
rxdataF_comp
[
0
],
num_re
);
int
init_num_re
=
100
;
newChart
=
new
IQPlot
((
complex16
*
)
p
->
gNB
->
pusch_vars
[
0
].
rxdataF_comp
[
0
],
init_num_re
,
0
,
&
puschIqUpdater
);
break
;
}
case
PlotTypeGnb
:
:
puschSNR
:
{
...
...
@@ -846,7 +902,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
();
...
...
@@ -854,7 +911,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
()
...
...
@@ -891,7 +951,6 @@ float PainterWidgetUE::getValue()
case
PlotTypeUE
:
:
timingAdvance
:
return
(
float
)
this
->
ue
->
timing_advance
;
default:
return
0
;
}
...
...
@@ -1240,6 +1299,7 @@ void nrgNBinitQtScope(scopeParms_t *p)
scope
->
argc
=
p
->
argc
;
scope
->
argv
=
p
->
argv
;
scope
->
ru
=
p
->
ru
;
scope
->
scopeUpdater
=
scopeUpdaterGnb
;
scope
->
copyData
=
copyData
;
copyDataMutexInit
(
scope
);
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/nr_phy_qt_scope.h
View file @
86f0bee1
...
...
@@ -94,11 +94,20 @@ 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
;
}
};
/// Class for emitting a queued signal to update plots
class
PlotUpdater
:
public
QObject
{
Q_OBJECT
signals:
void
updatePlot
(
int
numElt
);
};
/// An editable GUI field for a dialog box to set certain KPI configurations
class
ConfigBoxFloat
:
public
QLineEdit
{
Q_OBJECT
...
...
@@ -234,7 +243,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
...
...
@@ -253,10 +264,19 @@ class LLRPlot : public QChart {
/// Constructor
/// \param data Pointer to the LLR data
/// \param len Length of the LLR data
LLRPlot
(
int16_t
*
data
,
int
len
);
/// \param interval update interval in ms (0 means no timer-triggered updates)
/// \param plotUpdater pointer to a PlotUpdater for update notifications
LLRPlot
(
int16_t
*
data
,
int
len
,
int
interval
=
1000
,
PlotUpdater
*
plotUpdater
=
nullptr
);
/// Destructor
~
LLRPlot
();
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
;
...
...
@@ -266,6 +286,9 @@ class LLRPlot : public QChart {
/// Length of the LLR data
int
len
;
/// Pointer to a PlotUpdater for update notifications
PlotUpdater
*
plotUpdater
;
/// Scatter series used to plot the LLR in the chart
QScatterSeries
*
series
;
...
...
@@ -280,7 +303,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
...
...
@@ -299,10 +324,19 @@ class IQPlot : public QChart {
/// Constructor
/// \param data Pointer to the complex I/Q data
/// \param len Length of the I/Q data
IQPlot
(
complex16
*
data
,
int
len
);
/// \param interval update interval in ms (0 means no timer-triggered updates)
/// \param plotUpdater pointer to a PlotUpdater for update notifications
IQPlot
(
complex16
*
data
,
int
len
,
int
interval
=
1000
,
PlotUpdater
*
plotUpdater
=
nullptr
);
/// Destructor
~
IQPlot
();
public
slots
:
/// 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
;
...
...
@@ -312,6 +346,9 @@ class IQPlot : public QChart {
/// Length of the I/Q data
int
len
;
/// Pointer to a PlotUpdater for update notifications
PlotUpdater
*
plotUpdater
;
/// Scatter series used to plot the I/Q constellation diagram
QScatterSeries
*
series
;
...
...
@@ -326,7 +363,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
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/nr_phy_scope.c
View file @
86f0bee1
...
...
@@ -738,6 +738,18 @@ static void *scope_thread_gNB(void *arg) {
}
#endif
static
void
scopeUpdaterGnb
(
enum
PlotTypeGnbIf
plotType
,
int
numElt
)
{
switch
(
plotType
)
{
case
puschLLRe
:
/* update PUSCH LLR plot */
break
;
case
puschIQe
:
/* update PUSCH IQ plot */
break
;
}
}
STATICFORXSCOPE
void
gNBinitScope
(
scopeParms_t
*
p
)
{
AssertFatal
(
p
->
gNB
->
scopeData
=
calloc
(
sizeof
(
scopeData_t
),
1
),
""
);
...
...
@@ -746,6 +758,7 @@ STATICFORXSCOPE void gNBinitScope(scopeParms_t *p)
scope
->
argv
=
p
->
argv
;
scope
->
ru
=
p
->
ru
;
scope
->
gNB
=
p
->
gNB
;
scope
->
scopeUpdater
=
scopeUpdaterGnb
;
scope
->
copyData
=
copyData
;
#ifndef WEBSRVSCOPE
pthread_t
forms_thread
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/phy_scope_interface.h
View file @
86f0bee1
...
...
@@ -70,6 +70,11 @@ enum scopeDataType {
MAX_SCOPE_TYPES
};
enum
PlotTypeGnbIf
{
puschLLRe
,
puschIQe
,
};
#define COPIES_MEM 4
typedef
struct
{
...
...
@@ -89,6 +94,7 @@ typedef struct scopeData_s {
pthread_mutex_t
copyDataMutex
;
scopeGraphData_t
*
copyDataBufs
[
MAX_SCOPE_TYPES
][
COPIES_MEM
];
int
copyDataBufsIdx
[
MAX_SCOPE_TYPES
];
void
(
*
scopeUpdater
)(
enum
PlotTypeGnbIf
plotType
,
int
numElements
);
}
scopeData_t
;
int
load_softscope
(
char
*
exectype
,
void
*
initarg
);
...
...
@@ -102,6 +108,9 @@ void copyData(void *, enum scopeDataType type, void *dataIn, int elementSz, int
#define gNBscopeCopy(gnb, type, ...) \
if (gnb->scopeData) \
((scopeData_t *)gnb->scopeData)->copyData((scopeData_t *)gNB->scopeData, type, ##__VA_ARGS__);
#define GnbScopeUpdate(gnb, type, numElt) \
if (gnb->scopeData) \
((scopeData_t *)gnb->scopeData)->scopeUpdater(type, numElt);
extended_kpi_ue
*
getKPIUE
();
...
...
This diff is collapsed.
Click to expand it.
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