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
Michael Black
OpenXG-RAN
Commits
e4b2689e
Commit
e4b2689e
authored
4 years ago
by
laurent
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
continue scope rebuild
parent
bc480ad9
Branches unavailable
2023.w22
2023.w21
2023.w20
2023.w19
2023.w18
2023.w18b
2023.w16
2023.w15
2023.w14
2023.w13
2023.w12
2023.w11
2023.w11b
2023.w10
2023.w10b
2023.w09
2023.w08
2023.w08b
2023.w07
2023.w06
2023.w05
2023.w03
2023.w02
2022.42
2022.41
2022.w51
2022.w50
2022.w49
2022.w48
2022.w47
2022.w46
2022.w45
2022.w43
2022.w42
2022.w42b
2022.w41
2022.w40
2022.w39
2022.w38
2022.w37
2022.w37b
2022.w36
2022.w35
2022.w33
2022.w32
2022.w31
2022.w31b
2022.w30
2022.w29
2022.w26
2022.w25
2022.w24
2022.w24b
2022.w23
2022.w22
2022.w21
2022.w20
2022.w19
2022.w18
2022.w17
2022.w15
2022.w15b
2022.w14a
2022.w13
2022.w13b
2022.w13a
2022.w12
2022.w10
2022.w09
2022.w09b
2022.w08
2022.w08b
2022.w07
2022.w07b
2022.w06
2022.w06a
2022.w05
2022.w05b
2022.w03_hotfix
2022.w03_b
2022.w02
2022.w01
2021.wk46
2021.wk14_a
2021.wk13_d
2021.wk13_c
2021.w51_c
2021.w51_a
2021.w50_a
2021.w49_b
2021.w49_a
2021.w48
2021.w47
2021.w46
2021.w46-powder
2021.w45
2021.w45_b
2021.w44
2021.w43
2021.w42
2021.w37
2021.w36
2021.w35
2021.w34
2021.w33
2021.w32
2021.w31
2021.w30
2021.w29
2021.w28
2021.w27
2021.w26
2021.w25
2021.w24
2021.w23
2021.w22
2021.w20
2021.w19
2021.w18_b
2021.w18_a
2021.w17_b
2021.w16
2021.w15
2021.w14
2021.w13_a
2021.w12
2021.w11
2021.w10
2021.w09
2021.w08
2021.w06
2021.w05
2021.w04
2021.w02
2020.w51_2
2020.w51
2020.w50
2020.w49
2020.w48_2
2020.w48
2020.w47
2020.w46_2
2020.w46
2020.w45_2
setparam
flexran-eol
benetel_phase_rotation
benetel_gnb_rel_2.0
benetel_gnb_rel_1.0
benetel_enb_rel_2.0
benetel_enb_rel_1.0
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
241 additions
and
349 deletions
+241
-349
openair1/PHY/TOOLS/nr_phy_scope.c
openair1/PHY/TOOLS/nr_phy_scope.c
+241
-343
openair2/LAYER2/PDCP_v10.1.0/pdcp.h
openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+0
-4
openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+0
-2
No files found.
openair1/PHY/TOOLS/nr_phy_scope.c
View file @
e4b2689e
...
@@ -48,8 +48,13 @@ typedef struct {
...
@@ -48,8 +48,13 @@ typedef struct {
typedef
struct
OAIgraph
{
typedef
struct
OAIgraph
{
FL_OBJECT
*
graph
;
FL_OBJECT
*
graph
;
void
(
*
gNBfunct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
);
float
maxX
;
void
(
*
nrUEfunct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
);
float
maxY
;
float
minX
;
float
minY
;
int
iteration
;
void
(
*
gNBfunct
)
(
struct
OAIgraph
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
);
void
(
*
nrUEfunct
)(
struct
OAIgraph
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
);
}
OAIgraph_t
;
}
OAIgraph_t
;
/* Forms and Objects */
/* Forms and Objects */
...
@@ -57,7 +62,7 @@ typedef struct {
...
@@ -57,7 +62,7 @@ typedef struct {
FL_FORM
*
phy_scope
;
FL_FORM
*
phy_scope
;
OAIgraph_t
graph
[
20
];
OAIgraph_t
graph
[
20
];
FL_OBJECT
*
button_0
;
FL_OBJECT
*
button_0
;
}
FD
_phy_scope_t
;
}
OAI
_phy_scope_t
;
typedef
struct
{
typedef
struct
{
FL_FORM
*
stats_form
;
FL_FORM
*
stats_form
;
...
@@ -73,18 +78,8 @@ static void drawsymbol(FL_OBJECT *obj, int id,
...
@@ -73,18 +78,8 @@ static void drawsymbol(FL_OBJECT *obj, int id,
fl_points
(
p
,
n
,
FL_YELLOW
);
fl_points
(
p
,
n
,
FL_YELLOW
);
}
}
static
void
ia_receiver_on_off
(
FL_OBJECT
*
button
,
long
arg
)
{
// button callback example
if
(
fl_get_button
(
button
))
{
#if 0
fl_set_object_label
(
button
,
"IA Receiver ON"
);
// PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
fl_set_object_color
(
button
,
FL_GREEN
,
FL_GREEN
);
}
else
{
fl_set_object_label
(
button
,
"IA Receiver OFF"
);
// PHY_vars_UE_g[0][0]->use_ia_receiver = 0;
fl_set_object_color
(
button
,
FL_RED
,
FL_RED
);
}
}
static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
if (fl_get_button(button)) {
fl_set_object_label(button, "DL Traffic ON");
fl_set_object_label(button, "DL Traffic ON");
...
@@ -96,198 +91,188 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
...
@@ -96,198 +91,188 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
fl_set_object_color(button, FL_RED, FL_RED);
fl_set_object_color(button, FL_RED, FL_RED);
}
}
}
}
#endif
static
FL_OBJECT
*
commonGraph
(
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
static
FL_OBJECT
*
commonGraph
(
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
FL_OBJECT
*
graph
;
FL_OBJECT
*
graph
;
graph
=
fl_add_xyplot
(
type
,
x
,
y
,
w
,
h
,
label
);
graph
=
fl_add_xyplot
(
type
,
x
,
y
,
w
,
h
,
label
);
fl_set_object_boxtype
(
graph
,
FL_EMBOSSED_BOX
);
fl_set_object_lcolor
(
graph
,
FL_WHITE
);
// Label color
fl_set_object_lcolor
(
graph
,
FL_WHITE
);
// Label color
fl_set_xyplot_symbol
(
graph
,
0
,
drawsymbol
);
fl_set_object_color
(
graph
,
FL_BLACK
,
pointColor
);
fl_set_object_color
(
graph
,
FL_BLACK
,
pointColor
);
fl_set_xyplot_symbol
(
graph
,
-
1
,
drawsymbol
);
return
graph
;
return
graph
;
}
}
static
OAIgraph_t
gNBcommonGraph
(
void
(
*
funct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
),
static
OAIgraph_t
gNBcommonGraph
(
void
(
*
funct
)
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
),
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
OAIgraph_t
graph
;
OAIgraph_t
graph
;
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
gNBfunct
=
funct
;
graph
.
gNBfunct
=
funct
;
graph
.
nrUEfunct
=
NULL
;
graph
.
nrUEfunct
=
NULL
;
graph
.
maxX
=
0
;
graph
.
maxY
=
0
;
graph
.
minX
=
0
;
graph
.
minY
=
0
;
return
graph
;
return
graph
;
}
}
static
OAIgraph_t
nrUEcommonGraph
(
void
(
*
funct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
),
static
OAIgraph_t
nrUEcommonGraph
(
void
(
*
funct
)
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
),
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
OAIgraph_t
graph
;
OAIgraph_t
graph
;
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
gNBfunct
=
NULL
;
graph
.
gNBfunct
=
NULL
;
graph
.
nrUEfunct
=
funct
;
graph
.
nrUEfunct
=
funct
;
graph
.
maxX
=
0
;
graph
.
maxY
=
0
;
graph
.
minX
=
0
;
graph
.
minY
=
0
;
return
graph
;
return
graph
;
}
}
void
phy_scope_gNB
(
FD_phy_scope_t
*
form
,
static
void
setRange
(
OAIgraph_t
*
graph
,
float
minX
,
float
maxX
,
float
minY
,
float
maxY
)
{
PHY_VARS_gNB
*
phy_vars_gnb
,
if
(
maxX
>
graph
->
maxX
||
maxY
>
graph
->
maxY
||
minX
<
graph
->
minX
||
minY
<
graph
->
minY
)
{
RU_t
*
phy_vars_ru
,
graph
->
maxX
=
max
(
graph
->
maxX
,
maxX
);
int
UE_id
)
{
graph
->
minX
=
min
(
graph
->
minX
,
minX
);
static
FD_phy_scope_t
*
remeberForm
=
NULL
;
graph
->
maxY
=
max
(
graph
->
maxY
,
maxY
);
graph
->
minY
=
min
(
graph
->
minY
,
minY
);
fl_set_xyplot_ybounds
(
graph
->
graph
,
graph
->
minY
,
graph
->
maxY
);
fl_set_xyplot_xbounds
(
graph
->
graph
,
graph
->
minX
,
graph
->
maxX
);
}
}
if
(
form
==
NULL
)
static
void
oai_xygraph
(
OAIgraph_t
*
graph
,
float
*
x
,
float
*
y
,
int
len
,
int
layer
,
int
NoAutoScale
)
{
form
=
remeberForm
;
if
(
layer
==
0
)
fl_set_xyplot_data
(
graph
->
graph
,
x
,
y
,
len
,
""
,
""
,
""
);
else
else
remeberForm
=
form
;
fl_add_xyplot_overlay
(
graph
->
graph
,
layer
,
x
,
y
,
len
,
rx_antenna_colors
[
layer
])
;
if
(
form
==
NULL
)
return
;
if
(
NoAutoScale
&&
graph
->
iteration
%
NoAutoScale
==
0
)
{
float
maxX
=
0
,
maxY
=
0
,
minX
=
0
,
minY
=
0
;
int
i
=
0
;
for
(
int
k
=
0
;
k
<
len
;
k
++
)
{
maxX
=
max
(
maxX
,
x
[
k
]);
minX
=
min
(
minX
,
x
[
k
]);
maxY
=
max
(
maxY
,
y
[
k
]);
minY
=
min
(
minY
,
y
[
k
]);
}
while
(
form
->
graph
[
i
].
graph
)
{
setRange
(
graph
,
minX
,
maxX
,
minY
,
maxY
);
form
->
graph
[
i
].
gNBfunct
(
form
->
graph
[
i
].
graph
,
phy_vars_gnb
,
phy_vars_ru
,
UE_id
);
i
++
;
}
}
fl_check_forms
()
;
graph
->
iteration
++
;
}
}
static
void
timeSignal
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
void
genericLogPowerPerAntena
(
OAIgraph_t
*
graph
,
const
int
nb_ant
,
const
scopeSample_t
**
data
,
const
int
len
)
{
// Received signal in time domain of receive antenna 0
float
values
[
len
];
if
(
!
phy_vars_ru
->
common
.
rxdata
)
float
time
[
len
];
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
for
(
int
ant
=
0
;
ant
<
nb_ant
;
ant
++
)
{
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
if
(
data
[
ant
]
!=
NULL
)
{
scopeSample_t
**
rxsig_t
=
(
scopeSample_t
**
)
phy_vars_ru
->
common
.
rxdata
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
float
rxsig_t_dB
[
frame_parms
->
samples_per_frame
];
values
[
i
]
=
10
*
log10
(
1
.
0
+
SquaredNorm
(
data
[
ant
][
i
]));
float
time
[
frame_parms
->
samples_per_frame
];
time
[
i
]
=
i
;
for
(
int
arx
=
0
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
rxsig_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
samples_per_frame
;
i
++
)
{
rxsig_t_dB
[
i
]
=
10
*
log10
(
1
.
0
+
SquaredNorm
(
rxsig_t
[
arx
][
i
]));
}
}
if
(
arx
==
0
)
oai_xygraph
(
graph
,
time
,
values
,
len
,
ant
,
10
);
fl_set_xyplot_data
(
graph
,
time
,
rxsig_t_dB
,
frame_parms
->
samples_per_frame
,
""
,
""
,
""
);
else
fl_add_xyplot_overlay
(
graph
,
arx
,
time
,
rxsig_t_dB
,
frame_parms
->
samples_per_frame
,
rx_antenna_colors
[
arx
]);
}
}
}
}
}
}
static
void
timeResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
void
genericPowerPerAntena
(
OAIgraph_t
*
graph
,
const
int
nb_ant
,
const
scopeSample_t
**
data
,
const
int
len
)
{
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
)
float
values
[
len
];
return
;
float
time
[
len
]
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
for
(
int
ant
=
0
;
ant
<
nb_ant
;
ant
++
)
{
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
if
(
data
[
ant
]
!=
NULL
)
{
scopeSample_t
**
chest_t
=
(
scopeSample_t
**
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
int
ymax
=
0
;
values
[
i
]
=
SquaredNorm
(
data
[
ant
][
i
]);
float
time2
[
2
*
frame_parms
->
ofdm_symbol_size
];
time
[
i
]
=
i
;
float
chest_t_abs
[
2
*
frame_parms
->
ofdm_symbol_size
];
for
(
int
arx
=
0
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
2
*
frame_parms
->
ofdm_symbol_size
);
i
++
)
{
time2
[
i
]
=
(
float
)
i
;
chest_t_abs
[
i
]
=
10
*
log10
(
1
.
0
+
SquaredNorm
(
chest_t
[
0
][
i
]));
if
(
chest_t_abs
[
i
]
>
ymax
)
ymax
=
chest_t_abs
[
i
];
}
}
if
(
arx
==
0
)
oai_xygraph
(
graph
,
time
,
values
,
len
,
ant
,
10
);
fl_set_xyplot_data
(
graph
,
time2
,
chest_t_abs
,(
2
*
frame_parms
->
ofdm_symbol_size
),
""
,
""
,
""
);
else
{
fl_add_xyplot_overlay
(
graph
,
arx
,
time2
,
chest_t_abs
,(
frame_parms
->
ofdm_symbol_size
>>
3
),
rx_antenna_colors
[
arx
]);
fl_set_xyplot_overlay_type
(
graph
,
arx
,
FL_DASHED_XYPLOT
);
}
}
}
}
}
// Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
fl_set_xyplot_ybounds
(
graph
,
0
,
ymax
);
}
}
static
void
frequencyResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
void
timeSignal
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
const
int
nb_UEs
)
{
//
Channel Frequency Response
//
Received signal in time domain of receive antenna 0
if
(
!
phy_vars_ru
->
common
.
rxdata
F
)
if
(
!
phy_vars_ru
->
common
.
rxdata
)
return
;
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
//uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
genericLogPowerPerAntena
(
graph
,
frame_parms
->
nb_antennas_rx
,
scopeSample_t
**
rxsig_f
=
(
scopeSample_t
**
)
phy_vars_ru
->
common
.
rxdataF
;
(
const
scopeSample_t
**
)
phy_vars_ru
->
common
.
rxdata
,
float
rxsig_f_dB
[
frame_parms
->
samples_per_slot_wCP
];
frame_parms
->
samples_per_frame
);
float
time
[
frame_parms
->
samples_per_slot_wCP
];
}
if
(
rxsig_f
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
samples_per_slot_wCP
;
i
++
)
{
rxsig_f_dB
[
i
]
=
10
*
log10
(
1
.
0
+
SquaredNorm
(
rxsig_f
[
0
][
i
]));
time
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
graph
,
time
,
rxsig_f_dB
,
frame_parms
->
samples_per_slot_wCP
,
""
,
""
,
""
);
static
void
timeResponse
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
}
const
int
len
=
2
*
phy_vars_gnb
->
frame_parms
.
ofdm_symbol_size
;
float
values
[
len
];
float
time
[
len
];
const
int
ant
=
0
;
// display antenna 0 for each UE
/*
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
for (int arx=1; arx<nb_antennas_rx; arx++) {
scopeSample_t
*
data
=
(
scopeSample_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
ul_ch_estimates_time
[
ant
];
if (chest_f[(atx<<1)+arx] != NULL) {
for (int k=0; k<nsymb_ce; k++
) {
if
(
data
!=
NULL
)
{
time[k] = (float)ind;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
chest_f_abs[k] = (short)10*log10(1.0+SquaredNorm(chest_f[(atx<<1)+arx][k])
);
values
[
i
]
=
SquaredNorm
(
data
[
i
]
);
ind++
;
time
[
i
]
=
i
;
}
}
fl_add_xyplot_overlay(form->chest_f,1,time,chest_f_abs,nsymb_ce,rx_antenna_colors[arx]);
oai_xygraph
(
graph
,
time
,
values
,
len
,
ue
,
10
);
}
}
}
}
*/
/*
// tx antenna 0
fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3);
fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
*/
}
}
static
void
puschLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
void
frequencyResponse
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
// PUSCH LLRs
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
llr
)
genericLogPowerPerAntena
(
graph
,
frame_parms
->
nb_antennas_rx
,
return
;
(
const
scopeSample_t
**
)
phy_vars_ru
->
common
.
rxdataF
,
frame_parms
->
samples_per_slot_wCP
);
}
//NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
static
void
puschLLR
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
//int Qm = 2;
//int Qm = 2;
int16_t
*
pusch_llr
=
(
int16_t
*
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
llr
;
int
coded_bits_per_codeword
=
3
*
8
*
6144
+
12
;
// (8*((3*8*6144)+12)); // frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti;
int
coded_bits_per_codeword
=
3
*
8
*
6144
+
12
;
// (8*((3*8*6144)+12)); // frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti;
float
llr
[
coded_bits_per_codeword
];
float
llr
[
coded_bits_per_codeword
];
float
bit
[
coded_bits_per_codeword
];
float
bit
[
coded_bits_per_codeword
];
for
(
int
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
llr
[
i
]
=
(
float
)
pusch_llr
[
i
];
int16_t
*
pusch_llr
=
(
int16_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
llr
;
bit
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
graph
,
bit
,
llr
,
coded_bits_per_codeword
,
""
,
""
,
""
);
if
(
pusch_llr
)
{
}
for
(
int
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
llr
[
i
]
=
(
float
)
pusch_llr
[
i
];
bit
[
i
]
=
(
float
)
i
;
}
static
void
puschIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
oai_xygraph
(
graph
,
bit
,
llr
,
coded_bits_per_codeword
,
ue
,
10
);
// PUSCH I/Q of MF Output
}
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
rxdataF_comp
)
}
return
;
}
static
void
puschIQ
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
scopeSample_t
*
pusch_comp
=
(
scopeSample_t
*
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
rxdataF_comp
[
0
];
int
sz
=
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_slot
;
int
sz
=
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_slot
;
float
I
[
sz
],
Q
[
sz
];
float
I
[
sz
],
Q
[
sz
];
for
(
int
k
=
0
;
k
<
sz
;
k
++
)
{
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
I
[
k
]
=
pusch_comp
[
k
].
r
;
scopeSample_t
*
pusch_comp
=
(
scopeSample_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
rxdataF_comp
[
0
];
Q
[
k
]
=
pusch_comp
[
k
].
i
;
}
if
(
pusch_comp
)
{
for
(
int
k
=
0
;
k
<
sz
;
k
++
)
{
I
[
k
]
=
pusch_comp
[
k
].
r
;
Q
[
k
]
=
pusch_comp
[
k
].
i
;
}
fl_set_xyplot_data
(
graph
,
I
,
Q
,
sz
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
I
,
Q
,
sz
,
ue
,
10
);
}
}
}
static
void
pucchEnergy
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
// PUSCH I/Q of MF Output
// PUSCH I/Q of MF Output
if
(
NULL
)
{
/*
int32_t *pucch1ab_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1ab_stats[UE_id];
int32_t *pucch1ab_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1ab_stats[UE_id];
int32_t *pucch1_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1_stats[UE_id];
int32_t *pucch1_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1_stats[UE_id];
float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
...
@@ -308,16 +293,15 @@ static void puschIQ (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_var
...
@@ -308,16 +293,15 @@ static void puschIQ (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_var
fl_set_xyplot_xbounds(graph,-5000,5000);
fl_set_xyplot_xbounds(graph,-5000,5000);
fl_set_xyplot_ybounds(graph,0,80);
fl_set_xyplot_ybounds(graph,0,80);
}
}
*/
}
}
static
void
pucchEnergy
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
void
pucchIQ
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
}
static
void
pucchIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
}
}
static
void
puschThroughtput
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
void
puschThroughtput
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
// PUSCH Throughput
// PUSCH Throughput
/*
memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) 0;
tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) 0;
...
@@ -325,64 +309,81 @@ static void puschThroughtput (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t
...
@@ -325,64 +309,81 @@ static void puschThroughtput (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t
fl_set_xyplot_data(graph,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","","");
fl_set_xyplot_data(graph,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","","");
// fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax);
// fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax);
// fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
// fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
*/
}
}
static
FD_phy_scope_t
*
create_phy_scope_gnb
(
int
UE_id
)
{
static
OAI_phy_scope_t
*
create_phy_scope_gnb
(
void
)
{
FL_OBJECT
*
obj
;
FL_OBJECT
*
obj
;
FD_phy_scope_t
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
// Define form
// Define form
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
800
);
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
800
);
// This the whole UI box
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
800
,
""
);
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
800
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_WHITE
);
int
curY
=
0
,
x
,
y
,
w
,
h
;
// Received signal
// Received signal
fdui
->
graph
[
0
]
=
gNBcommonGraph
(
timeSignal
,
FL_
IMPULSE_XYPLOT
,
20
,
20
,
37
0
,
100
,
fdui
->
graph
[
0
]
=
gNBcommonGraph
(
timeSignal
,
FL_
FILL_XYPLOT
,
0
,
curY
,
40
0
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
// Time-domain channel response
// Time-domain channel response
fdui
->
graph
[
1
]
=
gNBcommonGraph
(
timeResponse
,
FL_NORMAL_XYPLOT
,
410
,
20
,
37
0
,
100
,
fdui
->
graph
[
1
]
=
gNBcommonGraph
(
timeResponse
,
FL_NORMAL_XYPLOT
,
410
,
curY
,
40
0
,
100
,
"SRS Frequency Response (samples, abs)"
,
FL_RED
);
"SRS Frequency Response (samples, abs)"
,
FL_RED
);
fl_get_object_bbox
(
fdui
->
graph
[
0
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// Frequency-domain channel response
// Frequency-domain channel response
fdui
->
graph
[
2
]
=
gNBcommonGraph
(
frequencyResponse
,
FL_
IMPULSE_XYPLOT
,
20
,
140
,
76
0
,
100
,
fdui
->
graph
[
2
]
=
gNBcommonGraph
(
frequencyResponse
,
FL_
FILL_XYPLOT
,
0
,
curY
,
80
0
,
100
,
"Channel Frequency Response (RE, dB)"
,
FL_RED
);
"Channel Frequency Response (RE, dB)"
,
FL_RED
);
fl_get_object_bbox
(
fdui
->
graph
[
2
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// LLR of PUSCH
// LLR of PUSCH
fdui
->
graph
[
3
]
=
gNBcommonGraph
(
puschLLR
,
FL_POINTS_XYPLOT
,
20
,
260
,
500
,
200
,
fdui
->
graph
[
3
]
=
gNBcommonGraph
(
puschLLR
,
FL_POINTS_XYPLOT
,
0
,
curY
,
500
,
200
,
"PUSCH Log-Likelihood Ratios (LLR, mag)"
,
FL_YELLOW
);
"PUSCH Log-Likelihood Ratios (LLR, mag)"
,
FL_YELLOW
);
// I/Q PUSCH comp
// I/Q PUSCH comp
fdui
->
graph
[
4
]
=
gNBcommonGraph
(
puschIQ
,
FL_POINTS_XYPLOT
,
5
40
,
260
,
24
0
,
200
,
fdui
->
graph
[
4
]
=
gNBcommonGraph
(
puschIQ
,
FL_POINTS_XYPLOT
,
5
00
,
curY
,
30
0
,
200
,
"PUSCH I/Q of MF Output"
,
FL_YELLOW
);
"PUSCH I/Q of MF Output"
,
FL_YELLOW
);
fl_get_object_bbox
(
fdui
->
graph
[
3
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// I/Q PUCCH comp (format 1)
// I/Q PUCCH comp (format 1)
fdui
->
graph
[
5
]
=
gNBcommonGraph
(
pucchEnergy
,
FL_POINTS_XYPLOT
,
540
,
480
,
24
0
,
100
,
fdui
->
graph
[
5
]
=
gNBcommonGraph
(
pucchEnergy
,
FL_POINTS_XYPLOT
,
0
,
curY
,
30
0
,
100
,
"PUCCH1 Energy (SR)"
,
FL_YELLOW
);
"PUCCH1 Energy (SR)"
,
FL_YELLOW
);
// fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
// fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
// I/Q PUCCH comp (fromat 1a/b)
// I/Q PUCCH comp (fromat 1a/b)
fdui
->
graph
[
6
]
=
gNBcommonGraph
(
pucchIQ
,
FL_POINTS_XYPLOT
,
5
40
,
600
,
24
0
,
100
,
fdui
->
graph
[
6
]
=
gNBcommonGraph
(
pucchIQ
,
FL_POINTS_XYPLOT
,
5
00
,
curY
,
30
0
,
100
,
"PUCCH I/Q of MF Output"
,
FL_YELLOW
);
"PUCCH I/Q of MF Output"
,
FL_YELLOW
);
fl_get_object_bbox
(
fdui
->
graph
[
6
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// Throughput on PUSCH
// Throughput on PUSCH
fdui
->
graph
[
7
]
=
gNBcommonGraph
(
puschThroughtput
,
FL_NORMAL_XYPLOT
,
20
,
480
,
500
,
100
,
fdui
->
graph
[
7
]
=
gNBcommonGraph
(
puschThroughtput
,
FL_NORMAL_XYPLOT
,
0
,
curY
,
500
,
100
,
"PUSCH Throughput [frame]/[kbit/s]"
,
FL_WHITE
);
"PUSCH Throughput [frame]/[kbit/s]"
,
FL_WHITE
);
fdui
->
graph
[
8
].
graph
=
NULL
;
fdui
->
graph
[
8
].
graph
=
NULL
;
// Generic eNB Button
if
(
0
)
{
// code kept to later add command buttons
fdui
->
button_0
=
fl_add_button
(
FL_PUSH_BUTTON
,
20
,
600
,
240
,
40
,
""
);
fl_set_object_lalign
(
fdui
->
button_0
,
FL_ALIGN_CENTER
);
fl_set_button
(
fdui
->
button_0
,
0
);
otg_enabled
=
0
;
fl_set_object_label
(
fdui
->
button_0
,
"DL Traffic OFF"
);
fl_set_object_color
(
fdui
->
button_0
,
FL_RED
,
FL_RED
);
fl_set_object_callback
(
fdui
->
button_0
,
dl_traffic_on_off
,
0
);
}
fl_end_form
(
);
fl_end_form
(
);
fdui
->
phy_scope
->
fdui
=
fdui
;
fdui
->
phy_scope
->
fdui
=
fdui
;
char
title
[
100
];
fl_show_form
(
fdui
->
phy_scope
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
"LTE UL SCOPE gNB"
);
sprintf
(
title
,
"LTE UL SCOPE eNB for UE %d"
,
UE_id
);
fl_show_form
(
fdui
->
phy_scope
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
title
);
return
fdui
;
return
fdui
;
}
}
static
FD_phy_scope_t
*
form_gnb
[
NUMBER_OF_UE_MAX
]
=
{
0
};
static
const
int
scope_enb_num_ue
=
1
;
static
unsigned
char
scope_enb_num_ue
=
1
;
void
phy_scope_gNB
(
OAI_phy_scope_t
*
form
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
OAI_phy_scope_t
*
remeberForm
=
NULL
;
if
(
form
==
NULL
)
form
=
remeberForm
;
else
remeberForm
=
form
;
if
(
form
==
NULL
)
return
;
int
i
=
0
;
while
(
form
->
graph
[
i
].
graph
)
{
form
->
graph
[
i
].
gNBfunct
(
form
->
graph
+
i
,
phy_vars_gnb
,
phy_vars_ru
,
UE_id
);
i
++
;
}
fl_check_forms
();
}
static
void
*
scope_thread_gNB
(
void
*
arg
)
{
static
void
*
scope_thread_gNB
(
void
*
arg
)
{
scopeParms_t
*
p
=
(
scopeParms_t
*
)
arg
;
scopeParms_t
*
p
=
(
scopeParms_t
*
)
arg
;
...
@@ -394,155 +395,40 @@ static void *scope_thread_gNB(void *arg) {
...
@@ -394,155 +395,40 @@ static void *scope_thread_gNB(void *arg) {
pthread_attr_getstacksize
(
&
atr
,
&
stksize
);
pthread_attr_getstacksize
(
&
atr
,
&
stksize
);
pthread_attr_setstacksize
(
&
atr
,
32
*
1024
*
1024
);
pthread_attr_setstacksize
(
&
atr
,
32
*
1024
*
1024
);
sleep
(
3
);
// no clean interthread barriers
sleep
(
3
);
// no clean interthread barriers
fl_initialize
(
p
->
argc
,
p
->
argv
,
NULL
,
0
,
0
);
int
nb_ue
=
min
(
NUMBER_OF_UE_MAX
,
scope_enb_num_ue
);
OAI_phy_scope_t
*
form_gnb
=
create_phy_scope_gnb
();
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
int
ue_cnt
=
0
;
phy_scope_gNB
(
form_gnb
,
p
->
gNB
,
p
->
ru
,
nb_ue
);
for
(
int
UE_id
=
0
;
UE_id
<
NUMBER_OF_UE_MAX
;
UE_id
++
)
{
if
((
ue_cnt
<
scope_enb_num_ue
))
{
//this function needs to be written
phy_scope_gNB
(
form_gnb
[
ue_cnt
],
p
->
gNB
,
p
->
ru
,
UE_id
);
ue_cnt
++
;
}
}
usleep
(
99
*
1000
);
usleep
(
99
*
1000
);
}
}
// printf("%s",stats_buffer);
/*#ifdef ENABLE_XFORMS_WRITE_STATS
if (eNB_stats) {
rewind (gNB_stats);
fwrite (stats_buffer, 1, len, gNB_stats);
fclose (gNB_stats);
}
#endif
pthread_exit((void *)arg);
}*/
return
NULL
;
return
NULL
;
}
}
void
gNBinitScope
(
scopeParms_t
*
p
)
{
void
gNBinitScope
(
scopeParms_t
*
p
)
{
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
fl_initialize
(
p
->
argc
,
p
->
argv
,
NULL
,
0
,
0
);
/*
form_stats_l2 = create_form_stats_form();
fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
form_stats = create_form_stats_form();
fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
*/
for
(
int
UE_id
=
0
;
UE_id
<
scope_enb_num_ue
;
UE_id
++
)
{
form_gnb
[
UE_id
]
=
create_phy_scope_gnb
(
UE_id
);
}
// UE_id
static
scopeParms_t
parms
;
static
scopeParms_t
parms
;
memcpy
(
&
parms
,
p
,
sizeof
(
parms
));
memcpy
(
&
parms
,
p
,
sizeof
(
parms
));
pthread_t
forms_thread
;
pthread_t
forms_thread
;
threadCreate
(
&
forms_thread
,
scope_thread_gNB
,
&
parms
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
threadCreate
(
&
forms_thread
,
scope_thread_gNB
,
&
parms
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
}
static
void
ueTimeResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
ueTimeResponse
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// Received signal in time domain of receive antenna 0
// Received signal in time domain of receive antenna 0
if
(
!
phy_vars_ue
->
common_vars
.
rxdata
)
genericLogPowerPerAntena
(
graph
,
phy_vars_ue
->
frame_parms
.
nb_antennas_rx
,
return
;
(
const
scopeSample_t
**
)
phy_vars_ue
->
common_vars
.
rxdata
,
phy_vars_ue
->
frame_parms
.
samples_per_frame
);
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
int
samples_per_frame
=
frame_parms
->
samples_per_frame
;
scopeSample_t
**
rxsig_t
=
(
scopeSample_t
**
)
phy_vars_ue
->
common_vars
.
rxdata
;
float
rxsig_t_dB
[
samples_per_frame
];
float
time
[
samples_per_frame
];
if
(
rxsig_t
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
samples_per_frame
;
i
++
)
{
rxsig_t_dB
[
i
]
=
10
*
log10
(
1
.
0
+
SquaredNorm
(
rxsig_t
[
0
][
i
]));
time
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
graph
,
time
,
rxsig_t_dB
,
samples_per_frame
,
""
,
""
,
""
);
}
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
rxsig_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
FRAME_LENGTH_COMPLEX_SAMPLES
;
i
++
)
{
rxsig_t_dB
[
i
]
=
10
*
log10
(
1
.
0
+
SquaredNorm
(
rxsig_t
[
arx
][
i
]));
}
fl_add_xyplot_overlay
(
graph
,
arx
,
time
,
rxsig_t_dB
,
FRAME_LENGTH_COMPLEX_SAMPLES
,
rx_antenna_colors
[
arx
]);
}
}
if
(
phy_vars_ue
->
is_synchronized
==
0
)
{
//float corr[samples_per_frame];
for
(
int
ind
=
0
;
ind
<
3
;
ind
++
)
{
/*
if (pss_corr_ue[ind]) {
for (i=0; i<samples_per_frame; i++) {
corr[i] = (float) pss_corr_ue[ind][i];
time[i] = (float) i;
}
if (ind==0)
fl_set_xyplot_data(form->chest_t,time,corr,samples_per_frame,"","","");
else
fl_add_xyplot_overlay(form->chest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]);
overlay = 1;
}
*/
}
// if the UE is not synchronized, we can make only the time*power graph
}
}
}
static
void
ueChannelResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
ueChannelResponse
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// Channel Impulse Response
// Channel Impulse Response
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
)
genericPowerPerAntena
(
graph
,
phy_vars_ue
->
frame_parms
.
nb_antennas_rx
,
return
;
(
const
scopeSample_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
,
phy_vars_ue
->
frame_parms
.
ofdm_symbol_size
>>
3
);
NR_DL_FRAME_PARMS
*
frame_parms
=
&
phy_vars_ue
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
scopeSample_t
**
chest_t
=
(
scopeSample_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
;
int
ymax
=
0
;
float
chest_t_abs
[
frame_parms
->
ofdm_symbol_size
];
float
time
[
frame_parms
->
ofdm_symbol_size
>>
3
];
if
(
chest_t
[
0
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
frame_parms
->
ofdm_symbol_size
>>
3
);
i
++
)
{
chest_t_abs
[
i
]
=
SquaredNorm
(
chest_t
[
0
][
i
]);
time
[
i
]
=
(
float
)
i
;
if
(
chest_t_abs
[
i
]
>
ymax
)
ymax
=
chest_t_abs
[
i
];
}
fl_set_xyplot_data
(
graph
,
time
,
chest_t_abs
,(
frame_parms
->
ofdm_symbol_size
>>
3
),
""
,
""
,
""
);
}
for
(
int
arx
=
1
;
arx
<
nb_antennas_rx
;
arx
++
)
{
if
(
chest_t
[
arx
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
frame_parms
->
ofdm_symbol_size
>>
3
);
i
++
)
{
chest_t_abs
[
i
]
=
SquaredNorm
(
chest_t
[
arx
][
i
]);
if
(
chest_t_abs
[
i
]
>
ymax
)
ymax
=
chest_t_abs
[
i
];
}
fl_add_xyplot_overlay
(
graph
,
arx
,
time
,
chest_t_abs
,(
frame_parms
->
ofdm_symbol_size
>>
3
),
rx_antenna_colors
[
arx
]);
fl_set_xyplot_overlay_type
(
graph
,
arx
,
FL_DASHED_XYPLOT
);
}
}
// Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
fl_set_xyplot_ybounds
(
graph
,
0
,(
double
)
ymax
);
}
}
static
void
uePbchFrequencyResp
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
uePbchFrequencyResp
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// Channel Frequency Response (includes 5 complex sample for filter)
// Channel Frequency Response (includes 5 complex sample for filter)
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
)
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
)
return
;
return
;
...
@@ -572,10 +458,10 @@ static void uePbchFrequencyResp (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue,
...
@@ -572,10 +458,10 @@ static void uePbchFrequencyResp (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue,
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data
(
graph
,
freq
,
chest_f_abs
,
frame_parms
->
ofdm_symbol_size
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
freq
,
chest_f_abs
,
frame_parms
->
ofdm_symbol_size
,
0
,
10
);
}
}
static
void
uePbchLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
uePbchLLR
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PBCH LLRs
// PBCH LLRs
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
llr
)
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
llr
)
return
;
return
;
...
@@ -588,15 +474,15 @@ static void uePbchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
...
@@ -588,15 +474,15 @@ static void uePbchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
bit_pbch
[
i
]
=
(
float
)
i
;
bit_pbch
[
i
]
=
(
float
)
i
;
}
}
fl_set_xyplot_data
(
graph
,
bit_pbch
,
llr_pbch
,
864
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
bit_pbch
,
llr_pbch
,
864
,
0
,
10
);
}
}
static
void
uePbchIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
uePbchIQ
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PBCH I/Q of MF Output
// PBCH I/Q of MF Output
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
])
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
])
return
;
return
;
int16_t
*
pbch_comp
=
(
int16
_t
*
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
];
scopeSample_t
*
pbch_comp
=
(
scopeSample
_t
*
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
];
localBuff
(
I
,
180
*
3
);
localBuff
(
I
,
180
*
3
);
localBuff
(
Q
,
180
*
3
);
localBuff
(
Q
,
180
*
3
);
int
first_symbol
=
1
;
int
first_symbol
=
1
;
...
@@ -613,17 +499,17 @@ static void uePbchIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id
...
@@ -613,17 +499,17 @@ static void uePbchIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id
AssertFatal
(
base
+
nb_re
<
180
*
3
,
""
);
AssertFatal
(
base
+
nb_re
<
180
*
3
,
""
);
for
(
int
i
=
0
;
i
<
nb_re
;
i
++
)
{
for
(
int
i
=
0
;
i
<
nb_re
;
i
++
)
{
I
[
base
+
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
]
;
I
[
base
+
i
]
=
pbch_comp
[
symbol
*
20
*
12
+
i
].
r
;
Q
[
base
+
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
+
1
]
;
Q
[
base
+
i
]
=
pbch_comp
[
symbol
*
20
*
12
+
i
].
i
;
}
}
base
+=
nb_re
;
base
+=
nb_re
;
}
}
fl_set_xyplot_data
(
graph
,
I
,
Q
,
base
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
I
,
Q
,
base
,
0
,
10
);
}
}
static
void
uePcchLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
uePcchLLR
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDCCH LLRs
// PDCCH LLRs
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
)
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
)
return
;
return
;
...
@@ -653,34 +539,34 @@ static void uePcchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
...
@@ -653,34 +539,34 @@ static void uePcchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data
(
graph
,
freq
,
chest_f_abs
,
frame_parms
->
ofdm_symbol_size
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
freq
,
chest_f_abs
,
frame_parms
->
ofdm_symbol_size
,
0
,
10
);
}
}
static
void
uePcchIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
uePcchIQ
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDCCH I/Q of MF Output
// PDCCH I/Q of MF Output
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
])
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
])
return
;
return
;
int
nb
=
12
*
273
*
4
;
// 12*frame_parms->N_RB_DL*num_pdcch_symbols
int
nb
=
4
*
273
*
12
;
// 12*frame_parms->N_RB_DL*num_pdcch_symbols
localBuff
(
I
,
nb
*
RX_NB_TH_MAX
);
localBuff
(
I
,
nb
*
RX_NB_TH_MAX
);
localBuff
(
Q
,
nb
*
RX_NB_TH_MAX
);
localBuff
(
Q
,
nb
*
RX_NB_TH_MAX
);
int
base
=
0
;
int
base
=
0
;
for
(
int
thr
=
0
;
thr
<
RX_NB_TH_MAX
;
thr
++
)
{
for
(
int
thr
=
0
;
thr
<
RX_NB_TH_MAX
;
thr
++
)
{
int16_t
*
pdcch_comp
=
(
int16
_t
*
)
phy_vars_ue
->
pdcch_vars
[
thr
][
eNB_id
]
->
rxdataF_comp
[
0
];
scopeSample_t
*
pdcch_comp
=
(
scopeSample
_t
*
)
phy_vars_ue
->
pdcch_vars
[
thr
][
eNB_id
]
->
rxdataF_comp
[
0
];
for
(
int
i
=
0
;
i
<
nb
;
i
++
)
{
for
(
int
i
=
0
;
i
<
nb
;
i
++
)
{
I
[
base
+
i
]
=
pdcch_comp
[
i
*
2
]
;
I
[
base
+
i
]
=
pdcch_comp
[
i
].
r
;
Q
[
base
+
i
]
=
pdcch_comp
[
i
*
2
+
1
]
;
Q
[
base
+
i
]
=
pdcch_comp
[
i
].
i
;
}
}
base
+=
nb
;
base
+=
nb
;
}
}
fl_set_xyplot_data
(
graph
,
I
,
Q
,
base
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
I
,
Q
,
base
,
0
,
10
);
}
}
static
void
uePdschLLR
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
uePdschLLR
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDSCH LLRs
// PDSCH LLRs
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
llr
[
0
])
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
llr
[
0
])
return
;
return
;
...
@@ -704,10 +590,10 @@ static void uePdschLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_
...
@@ -704,10 +590,10 @@ static void uePdschLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_
}
}
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
fl_set_xyplot_data
(
graph
,
bit
,
llr
,
base
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
bit
,
llr
,
base
,
0
,
10
);
}
}
static
void
uePdschIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
void
uePdschIQ
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
// PDSCH I/Q of MF Output
// PDSCH I/Q of MF Output
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
rxdataF_comp0
[
0
])
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
rxdataF_comp0
[
0
])
return
;
return
;
...
@@ -719,17 +605,20 @@ static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
...
@@ -719,17 +605,20 @@ static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
int
base
=
0
;
int
base
=
0
;
for
(
int
thr
=
0
;
thr
<
RX_NB_TH_MAX
;
thr
++
)
{
for
(
int
thr
=
0
;
thr
<
RX_NB_TH_MAX
;
thr
++
)
{
int16_t
*
pdsch_comp
=
(
int16
_t
*
)
phy_vars_ue
->
pdsch_vars
[
thr
][
eNB_id
]
->
rxdataF_comp0
[
0
];
scopeSample_t
*
pdsch_comp
=
(
scopeSample
_t
*
)
phy_vars_ue
->
pdsch_vars
[
thr
][
eNB_id
]
->
rxdataF_comp0
[
0
];
for
(
int
s
=
0
;
s
<
sz
;
s
++
)
{
for
(
int
s
=
0
;
s
<
sz
;
s
++
)
{
I
[
s
+
base
]
+=
pdsch_comp
[
2
*
s
]
;
I
[
s
+
base
]
+=
pdsch_comp
[
s
].
r
;
Q
[
s
+
base
]
+=
pdsch_comp
[
2
*
s
+
1
]
;
Q
[
s
+
base
]
+=
pdsch_comp
[
s
].
i
;
}
}
base
+=
sz
;
base
+=
sz
;
}
}
fl_set_xyplot_data
(
graph
,
I
,
Q
,
base
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
I
,
Q
,
base
,
0
,
10
);
}
static
void
uePdschThroughput
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
/*
/*
// PDSCH Throughput
// PDSCH Throughput
...
@@ -749,50 +638,59 @@ static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
...
@@ -749,50 +638,59 @@ static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
*/
*/
}
}
static
void
uePdschThroughput
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
static
OAI_phy_scope_t
*
create_phy_scope_nrue
(
int
ID
)
{
}
static
FD_phy_scope_t
*
create_phy_scope_nrue
(
int
ID
)
{
FL_OBJECT
*
obj
;
FL_OBJECT
*
obj
;
FD_phy_scope_t
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
// Define form
// Define form
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
900
);
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
900
);
// This the whole UI box
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
900
,
""
);
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
900
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
int
curY
=
0
,
x
,
y
,
w
,
h
;
// Received signal
// Received signal
fdui
->
graph
[
0
]
=
nrUEcommonGraph
(
ueTimeResponse
,
fdui
->
graph
[
0
]
=
nrUEcommonGraph
(
ueTimeResponse
,
FL_
IMPULSE_XYPLOT
,
20
,
20
,
37
0
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
FL_
FILL_XYPLOT
,
0
,
curY
,
40
0
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
// Time-domain channel response
// Time-domain channel response
fdui
->
graph
[
1
]
=
nrUEcommonGraph
(
ueChannelResponse
,
fdui
->
graph
[
1
]
=
nrUEcommonGraph
(
ueChannelResponse
,
FL_NORMAL_XYPLOT
,
410
,
20
,
370
,
100
,
"Channel Impulse Response (samples, abs)"
,
FL_RED
);
FL_NORMAL_XYPLOT
,
400
,
curY
,
400
,
100
,
"Channel Impulse Response (samples, abs)"
,
FL_RED
);
fl_get_object_bbox
(
fdui
->
graph
[
0
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// Frequency-domain channel response
// Frequency-domain channel response
fdui
->
graph
[
2
]
=
nrUEcommonGraph
(
uePbchFrequencyResp
,
fdui
->
graph
[
2
]
=
nrUEcommonGraph
(
uePbchFrequencyResp
,
FL_IMPULSE_XYPLOT
,
20
,
140
,
760
,
100
,
"Channel Frequency data (RE, dB)"
,
FL_RED
);
FL_IMPULSE_XYPLOT
,
0
,
curY
,
800
,
100
,
"Channel Frequency data (RE, dB)"
,
FL_RED
);
fl_get_object_bbox
(
fdui
->
graph
[
2
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// LLR of PBCH
// LLR of PBCH
fdui
->
graph
[
3
]
=
nrUEcommonGraph
(
uePbchLLR
,
fdui
->
graph
[
3
]
=
nrUEcommonGraph
(
uePbchLLR
,
FL_POINTS_XYPLOT
,
20
,
260
,
500
,
100
,
"PBCH Log-Likelihood Ratios (LLR, mag)"
,
FL_GREEN
);
FL_POINTS_XYPLOT
,
0
,
curY
,
500
,
100
,
"PBCH Log-Likelihood Ratios (LLR, mag)"
,
FL_GREEN
);
fl_set_xyplot_xgrid
(
fdui
->
graph
[
3
].
graph
,
FL_GRID_MAJOR
);
fl_set_xyplot_xgrid
(
fdui
->
graph
[
3
].
graph
,
FL_GRID_MAJOR
);
// I/Q PBCH comp
// I/Q PBCH comp
fdui
->
graph
[
4
]
=
nrUEcommonGraph
(
uePbchIQ
,
fdui
->
graph
[
4
]
=
nrUEcommonGraph
(
uePbchIQ
,
FL_POINTS_XYPLOT
,
540
,
260
,
240
,
100
,
"PBCH I/Q of MF Output"
,
FL_GREEN
);
FL_POINTS_XYPLOT
,
500
,
curY
,
300
,
100
,
"PBCH I/Q of MF Output"
,
FL_GREEN
);
fl_get_object_bbox
(
fdui
->
graph
[
3
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// LLR of PDCCH
// LLR of PDCCH
fdui
->
graph
[
5
]
=
nrUEcommonGraph
(
uePcchLLR
,
fdui
->
graph
[
5
]
=
nrUEcommonGraph
(
uePcchLLR
,
FL_POINTS_XYPLOT
,
20
,
380
,
500
,
100
,
"PDCCH Log-Likelihood Ratios (LLR, mag)"
,
FL_CYAN
);
FL_POINTS_XYPLOT
,
0
,
curY
,
500
,
100
,
"PDCCH Log-Likelihood Ratios (LLR, mag)"
,
FL_CYAN
);
// I/Q PDCCH comp
// I/Q PDCCH comp
fdui
->
graph
[
6
]
=
nrUEcommonGraph
(
uePcchIQ
,
fdui
->
graph
[
6
]
=
nrUEcommonGraph
(
uePcchIQ
,
FL_POINTS_XYPLOT
,
540
,
380
,
240
,
100
,
"PDCCH I/Q of MF Output"
,
FL_CYAN
);
FL_POINTS_XYPLOT
,
500
,
curY
,
300
,
100
,
"PDCCH I/Q of MF Output"
,
FL_CYAN
);
fl_get_object_bbox
(
fdui
->
graph
[
5
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// LLR of PDSCH
// LLR of PDSCH
fdui
->
graph
[
7
]
=
nrUEcommonGraph
(
uePdschLLR
,
fdui
->
graph
[
7
]
=
nrUEcommonGraph
(
uePdschLLR
,
FL_POINTS_XYPLOT
,
20
,
500
,
500
,
200
,
"PDSCH Log-Likelihood Ratios (LLR, mag)"
,
FL_YELLOW
);
FL_POINTS_XYPLOT
,
0
,
curY
,
500
,
200
,
"PDSCH Log-Likelihood Ratios (LLR, mag)"
,
FL_YELLOW
);
// I/Q PDSCH comp
// I/Q PDSCH comp
fdui
->
graph
[
8
]
=
nrUEcommonGraph
(
uePdschIQ
,
fdui
->
graph
[
8
]
=
nrUEcommonGraph
(
uePdschIQ
,
FL_POINTS_XYPLOT
,
540
,
500
,
240
,
200
,
"PDSCH I/Q of MF Output"
,
FL_YELLOW
);
FL_POINTS_XYPLOT
,
500
,
curY
,
300
,
200
,
"PDSCH I/Q of MF Output"
,
FL_YELLOW
);
fl_get_object_bbox
(
fdui
->
graph
[
8
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// Throughput on PDSCH
// Throughput on PDSCH
fdui
->
graph
[
9
]
=
nrUEcommonGraph
(
uePdschThroughput
,
fdui
->
graph
[
9
]
=
nrUEcommonGraph
(
uePdschThroughput
,
FL_NORMAL_XYPLOT
,
20
,
720
,
500
,
100
,
"PDSCH Throughput [frame]/[kbit/s]"
,
FL_WHITE
);
FL_NORMAL_XYPLOT
,
0
,
curY
,
500
,
100
,
"PDSCH Throughput [frame]/[kbit/s]"
,
FL_WHITE
);
fdui
->
graph
[
10
].
graph
=
NULL
;
fdui
->
graph
[
10
].
graph
=
NULL
;
// Generic UE Button
// Generic UE Button
#if 0
fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
//openair_daq_vars.use_ia_receiver = 0;
//openair_daq_vars.use_ia_receiver = 0;
...
@@ -801,6 +699,7 @@ static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
...
@@ -801,6 +699,7 @@ static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
fl_set_object_callback(fdui->button_0, ia_receiver_on_off, 0 );
fl_set_object_callback(fdui->button_0, ia_receiver_on_off, 0 );
fl_hide_object(fdui->button_0);
fl_hide_object(fdui->button_0);
#endif
fl_end_form
(
);
fl_end_form
(
);
fdui
->
phy_scope
->
fdui
=
fdui
;
fdui
->
phy_scope
->
fdui
=
fdui
;
char
buf
[
100
];
char
buf
[
100
];
...
@@ -809,11 +708,11 @@ static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
...
@@ -809,11 +708,11 @@ static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
return
fdui
;
return
fdui
;
}
}
void
phy_scope_nrUE
(
FD
_phy_scope_t
*
form
,
void
phy_scope_nrUE
(
OAI
_phy_scope_t
*
form
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
eNB_id
,
int
UE_id
)
{
int
UE_id
)
{
static
FD
_phy_scope_t
*
remeberForm
=
NULL
;
static
OAI
_phy_scope_t
*
remeberForm
=
NULL
;
if
(
form
==
NULL
)
if
(
form
==
NULL
)
form
=
remeberForm
;
form
=
remeberForm
;
...
@@ -826,15 +725,13 @@ void phy_scope_nrUE(FD_phy_scope_t *form,
...
@@ -826,15 +725,13 @@ void phy_scope_nrUE(FD_phy_scope_t *form,
int
i
=
0
;
int
i
=
0
;
while
(
form
->
graph
[
i
].
graph
)
{
while
(
form
->
graph
[
i
].
graph
)
{
form
->
graph
[
i
].
nrUEfunct
(
form
->
graph
[
i
].
graph
,
phy_vars_ue
,
eNB_id
,
UE_id
);
form
->
graph
[
i
].
nrUEfunct
(
form
->
graph
+
i
,
phy_vars_ue
,
eNB_id
,
UE_id
);
i
++
;
i
++
;
}
}
fl_check_forms
();
fl_check_forms
();
}
}
static
FD_phy_scope_t
*
form_nrue
[
NUMBER_OF_UE_MAX
];
static
pthread_t
forms_thread
;
static
void
*
nrUEscopeThread
(
void
*
arg
)
{
static
void
*
nrUEscopeThread
(
void
*
arg
)
{
PHY_VARS_NR_UE
*
ue
=
(
PHY_VARS_NR_UE
*
)
arg
;
PHY_VARS_NR_UE
*
ue
=
(
PHY_VARS_NR_UE
*
)
arg
;
...
@@ -842,9 +739,13 @@ static void *nrUEscopeThread(void *arg) {
...
@@ -842,9 +739,13 @@ static void *nrUEscopeThread(void *arg) {
pthread_attr_t
atr
;
pthread_attr_t
atr
;
pthread_attr_getstacksize
(
&
atr
,
&
stksize
);
pthread_attr_getstacksize
(
&
atr
,
&
stksize
);
pthread_attr_setstacksize
(
&
atr
,
32
*
1024
*
1024
);
pthread_attr_setstacksize
(
&
atr
,
32
*
1024
*
1024
);
int
fl_argc
=
1
;
char
*
name
=
"5G-UE-scope"
;
fl_initialize
(
&
fl_argc
,
&
name
,
NULL
,
0
,
0
);
OAI_phy_scope_t
*
form_nrue
=
create_phy_scope_nrue
(
0
);
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
phy_scope_nrUE
(
form_nrue
[
0
]
,
phy_scope_nrUE
(
form_nrue
,
ue
,
ue
,
0
,
0
);
0
,
0
);
usleep
(
99
*
1000
);
usleep
(
99
*
1000
);
...
@@ -854,10 +755,7 @@ static void *nrUEscopeThread(void *arg) {
...
@@ -854,10 +755,7 @@ static void *nrUEscopeThread(void *arg) {
}
}
void
nrUEinitScope
(
PHY_VARS_NR_UE
*
ue
)
{
void
nrUEinitScope
(
PHY_VARS_NR_UE
*
ue
)
{
int
fl_argc
=
1
;
pthread_t
forms_thread
;
char
*
name
=
"5G-UE-scope"
;
fl_initialize
(
&
fl_argc
,
&
name
,
NULL
,
0
,
0
);
form_nrue
[
0
]
=
create_phy_scope_nrue
(
0
);
threadCreate
(
&
forms_thread
,
nrUEscopeThread
,
ue
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
threadCreate
(
&
forms_thread
,
nrUEscopeThread
,
ue
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
}
...
@@ -890,7 +788,7 @@ static void reset_stats_gNB(FL_OBJECT *button,
...
@@ -890,7 +788,7 @@ static void reset_stats_gNB(FL_OBJECT *button,
static FD_stats_form *create_form_stats_form(int ID) {
static FD_stats_form *create_form_stats_form(int ID) {
FL_OBJECT *obj;
FL_OBJECT *obj;
FD_stats_form *fdui =
fl_malloc( sizeof *fdui
);
FD_stats_form *fdui =
calloc(( sizeof *fdui ),1
);
fdui->vdata = fdui->cdata = NULL;
fdui->vdata = fdui->cdata = NULL;
fdui->ldata = 0;
fdui->ldata = 0;
fdui->stats_form = fl_bgn_form( FL_NO_BOX, 1115, 900 );
fdui->stats_form = fl_bgn_form( FL_NO_BOX, 1115, 900 );
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/PDCP_v10.1.0/pdcp.h
View file @
e4b2689e
...
@@ -34,10 +34,6 @@
...
@@ -34,10 +34,6 @@
#ifndef __PDCP_H__
#ifndef __PDCP_H__
# define __PDCP_H__
# define __PDCP_H__
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#ifndef NON_ACCESS_STRATUM
#include "UTIL/MEM/mem_block.h"
#include "UTIL/LISTS/list.h"
#endif //NON_ACCESS_STRATUM
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#include "RRC/LTE/rrc_defs.h"
#include "RRC/LTE/rrc_defs.h"
#include "COMMON/platform_constants.h"
#include "COMMON/platform_constants.h"
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
View file @
e4b2689e
...
@@ -55,7 +55,6 @@ extern int otg_enabled;
...
@@ -55,7 +55,6 @@ extern int otg_enabled;
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/log.h"
#include "UTIL/OTG/otg_tx.h"
#include "UTIL/OTG/otg_tx.h"
#include "nfapi/oai_integration/vendor_ext.h"
#include "nfapi/oai_integration/vendor_ext.h"
#include "UTIL/FIFO/pad_list.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "platform_constants.h"
#include "platform_constants.h"
#include "msc.h"
#include "msc.h"
...
@@ -91,7 +90,6 @@ extern struct msghdr nas_msg_rx;
...
@@ -91,7 +90,6 @@ extern struct msghdr nas_msg_rx;
extern
uint16_t
inst_pdcp_list
[
NUMBER_OF_UE_MAX
];
extern
uint16_t
inst_pdcp_list
[
NUMBER_OF_UE_MAX
];
#endif
#endif
extern
Packet_OTG_List_t
*
otg_pdcp_buffer
;
# include "gtpv1u_eNB_task.h"
# include "gtpv1u_eNB_task.h"
...
...
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