Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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 UE
Commits
35f512d7
Commit
35f512d7
authored
Jun 24, 2020
by
laurent
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
5G scope cleaning round 2
parent
8325b92c
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
260 additions
and
360 deletions
+260
-360
executables/nr-uesoftmodem.c
executables/nr-uesoftmodem.c
+1
-1
openair1/PHY/TOOLS/nr_phy_scope.c
openair1/PHY/TOOLS/nr_phy_scope.c
+253
-349
openair1/PHY/TOOLS/nr_phy_scope.h
openair1/PHY/TOOLS/nr_phy_scope.h
+0
-1
openair1/SCHED_NR/phy_frame_config_nr.h
openair1/SCHED_NR/phy_frame_config_nr.h
+2
-0
openair2/LAYER2/NR_MAC_UE/mac_proto.h
openair2/LAYER2/NR_MAC_UE/mac_proto.h
+1
-0
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+1
-1
openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
+1
-1
openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
+1
-0
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
-3
No files found.
executables/nr-uesoftmodem.c
View file @
35f512d7
...
...
@@ -249,7 +249,7 @@ void exit_function(const char *file, const char *function, const int line, const
}
void
reset_stats
(
FL_OBJECT
*
button
,
long
arg
)
{
void
reset_stats
(
long
arg
)
{
//int i,j,k;
/*PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[0][0];
...
...
openair1/PHY/TOOLS/nr_phy_scope.c
View file @
35f512d7
...
...
@@ -26,6 +26,7 @@
#include <stdlib.h>
#include "nr_phy_scope.h"
#include "executables/nr-softmodem-common.h"
#include <forms.h>
#define TPUT_WINDOW_LENGTH 100
#define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
...
...
@@ -47,8 +48,13 @@ typedef struct {
typedef
struct
OAIgraph
{
FL_OBJECT
*
graph
;
void
(
*
gNBfunct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
);
void
(
*
nrUEfunct
)
(
FL_OBJECT
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
);
float
maxX
;
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
;
/* Forms and Objects */
...
...
@@ -56,7 +62,7 @@ typedef struct {
FL_FORM
*
phy_scope
;
OAIgraph_t
graph
[
20
];
FL_OBJECT
*
button_0
;
}
FD
_phy_scope_t
;
}
OAI
_phy_scope_t
;
typedef
struct
{
FL_FORM
*
stats_form
;
...
...
@@ -72,18 +78,8 @@ static void drawsymbol(FL_OBJECT *obj, int id,
fl_points
(
p
,
n
,
FL_YELLOW
);
}
static
void
ia_receiver_on_off
(
FL_OBJECT
*
button
,
long
arg
)
{
if
(
fl_get_button
(
button
))
{
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
);
}
}
// button callback example
#if 0
static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
fl_set_object_label(button, "DL Traffic ON");
...
...
@@ -95,201 +91,197 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
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
)
{
FL_OBJECT
*
graph
;
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_xyplot_symbol
(
graph
,
0
,
drawsymbol
);
fl_set_object_color
(
graph
,
FL_BLACK
,
pointColor
);
fl_set_xyplot_symbol
(
graph
,
-
1
,
drawsymbol
);
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
)
{
OAIgraph_t
graph
;
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
gNBfunct
=
funct
;
graph
.
nrUEfunct
=
NULL
;
graph
.
maxX
=
0
;
graph
.
maxY
=
0
;
graph
.
minX
=
0
;
graph
.
minY
=
0
;
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
)
{
OAIgraph_t
graph
;
graph
.
graph
=
commonGraph
(
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
graph
.
gNBfunct
=
NULL
;
graph
.
nrUEfunct
=
funct
;
graph
.
maxX
=
0
;
graph
.
maxY
=
0
;
graph
.
minX
=
0
;
graph
.
minY
=
0
;
return
graph
;
}
void
phy_scope_gNB
(
FD_phy_scope_t
*
form
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
static
FD_phy_scope_t
*
remeberForm
=
NULL
;
static
void
setRange
(
OAIgraph_t
*
graph
,
float
minX
,
float
maxX
,
float
minY
,
float
maxY
)
{
if
(
maxX
>
graph
->
maxX
||
maxY
>
graph
->
maxY
||
minX
<
graph
->
minX
||
minY
<
graph
->
minY
)
{
graph
->
maxX
=
max
(
graph
->
maxX
,
maxX
);
graph
->
minX
=
min
(
graph
->
minX
,
minX
);
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
)
form
=
remeberForm
;
static
void
oai_xygraph
(
OAIgraph_t
*
graph
,
float
*
x
,
float
*
y
,
int
len
,
int
layer
,
int
NoAutoScale
)
{
if
(
layer
==
0
)
fl_set_xyplot_data
(
graph
->
graph
,
x
,
y
,
len
,
""
,
""
,
""
);
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
)
{
form
->
graph
[
i
].
gNBfunct
(
form
->
graph
[
i
].
graph
,
phy_vars_gnb
,
phy_vars_ru
,
UE_id
);
i
++
;
setRange
(
graph
,
minX
,
maxX
,
minY
,
maxY
);
}
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
)
{
// Received signal in time domain of receive antenna 0
if
(
!
phy_vars_ru
->
common
.
rxdata
)
return
;
static
void
genericLogPowerPerAntena
(
OAIgraph_t
*
graph
,
const
int
nb_ant
,
const
scopeSample_t
**
data
,
const
int
len
)
{
float
*
values
=
malloc
(
len
*
sizeof
(
*
values
));
float
*
time
=
malloc
(
len
*
sizeof
(
*
time
));
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
scopeSample_t
**
rxsig_t
=
(
scopeSample_t
**
)
phy_vars_ru
->
common
.
rxdata
;
float
rxsig_t_dB
[
frame_parms
->
samples_per_frame
];
float
time
[
frame_parms
->
samples_per_frame
];
for
(
int
ant
=
0
;
ant
<
nb_ant
;
ant
++
)
{
if
(
data
[
ant
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
len
;
i
+=
8
)
{
float
*
vals
=
values
+
i
;
float
*
tim
=
time
+
i
;
const
scopeSample_t
*
in
=&
(
data
[
ant
][
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
]));
time
[
i
]
=
i
;
for
(
int
k
=
0
;
k
<
8
;
k
++
)
{
vals
[
k
]
=
10
*
log10
(
1
.
0
+
SquaredNorm
(
in
[
k
]));
tim
[
k
]
=
i
+
k
;
}
}
if
(
arx
==
0
)
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
]);
oai_xygraph
(
graph
,
time
,
values
,
len
,
ant
,
10
);
}
}
}
static
void
timeResponse
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
)
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
uint8_t
nb_antennas_rx
=
frame_parms
->
nb_antennas_rx
;
scopeSample_t
**
chest_t
=
(
scopeSample_t
**
)
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
ul_ch_estimates_time
;
int
ymax
=
0
;
float
time2
[
2
*
frame_parms
->
ofdm_symbol_size
];
float
chest_t_abs
[
2
*
frame_parms
->
ofdm_symbol_size
];
free
(
values
);
free
(
time
);
}
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
]));
static
void
genericPowerPerAntena
(
OAIgraph_t
*
graph
,
const
int
nb_ant
,
const
scopeSample_t
**
data
,
const
int
len
)
{
float
values
[
len
];
float
time
[
len
];
if
(
chest_t_abs
[
i
]
>
ymax
)
ymax
=
chest_t_abs
[
i
];
for
(
int
ant
=
0
;
ant
<
nb_ant
;
ant
++
)
{
if
(
data
[
ant
]
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
values
[
i
]
=
SquaredNorm
(
data
[
ant
][
i
]);
time
[
i
]
=
i
;
}
if
(
arx
==
0
)
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
);
}
oai_xygraph
(
graph
,
time
,
values
,
len
,
ant
,
10
);
}
}
// 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
)
{
//
Channel Frequency Response
if
(
!
phy_vars_ru
->
common
.
rxdata
F
)
static
void
timeSignal
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
const
int
nb_UEs
)
{
//
Received signal in time domain of receive antenna 0
if
(
!
phy_vars_ru
->
common
.
rxdata
)
return
;
NR_DL_FRAME_PARMS
*
frame_parms
=&
phy_vars_gnb
->
frame_parms
;
//uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
scopeSample_t
**
rxsig_f
=
(
scopeSample_t
**
)
phy_vars_ru
->
common
.
rxdataF
;
float
rxsig_f_dB
[
frame_parms
->
samples_per_slot_wCP
]
;
float
time
[
frame_parms
->
samples_per_slot_wCP
];
genericLogPowerPerAntena
(
graph
,
frame_parms
->
nb_antennas_rx
,
(
const
scopeSample_t
**
)
phy_vars_ru
->
common
.
rxdata
,
frame_parms
->
samples_per_frame
)
;
}
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
;
}
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
fl_set_xyplot_data
(
graph
,
time
,
rxsig_f_dB
,
frame_parms
->
samples_per_slot_wCP
,
""
,
""
,
""
);
}
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
scopeSample_t
*
data
=
(
scopeSample_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
ul_ch_estimates_time
[
ant
];
/*
for (int arx=1; arx<nb_antennas_rx; arx++) {
if (chest_f[(atx<<1)+arx] != NULL) {
for (int k=0; k<nsymb_ce; k++) {
time[k] = (float)ind;
chest_f_abs[k] = (short)10*log10(1.0+SquaredNorm(chest_f[(atx<<1)+arx][k]));
ind++;
if
(
data
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
values
[
i
]
=
SquaredNorm
(
data
[
i
]);
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
)
{
// PUSCH LLRs
if
(
!
phy_vars_gnb
->
pusch_vars
[
UE_id
]
->
llr
)
return
;
static
void
frequencyResponse
(
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
;
genericLogPowerPerAntena
(
graph
,
frame_parms
->
nb_antennas_rx
,
(
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;
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;
float
llr
[
coded_bits_per_codeword
];
float
bit
[
coded_bits_per_codeword
];
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
int16_t
*
pusch_llr
=
(
int16_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
llr
;
if
(
pusch_llr
)
{
for
(
int
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
llr
[
i
]
=
(
float
)
pusch_llr
[
i
];
bit
[
i
]
=
(
float
)
i
;
}
fl_set_xyplot_data
(
graph
,
bit
,
llr
,
coded_bits_per_codeword
,
""
,
""
,
""
);
oai_xygraph
(
graph
,
bit
,
llr
,
coded_bits_per_codeword
,
ue
,
10
);
}
}
}
static
void
puschIQ
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
// 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
;
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
;
float
I
[
sz
],
Q
[
sz
];
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
scopeSample_t
*
pusch_comp
=
(
scopeSample_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
rxdataF_comp
[
0
];
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
// Code to fixed, disabled for cppcheck
#if 0
if (NULL) {
/*
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];
float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
...
...
@@ -310,17 +302,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_ybounds(graph,0,80);
}
#endif
}
static
void
pucchEnergy
(
FL_OBJECT
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
)
{
*/
}
static
void
pucchIQ
(
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
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
/*
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) );
tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) 0;
...
...
@@ -328,224 +318,126 @@ 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_get_xyplot_ybounds(form->pusch_tput,&ymin,&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
;
FD_phy_scope_t
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
// Define form
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
800
);
// This the whole UI box
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
fdui
->
graph
[
0
]
=
gNBcommonGraph
(
timeSignal
,
FL_
IMPULSE_XYPLOT
,
20
,
20
,
37
0
,
100
,
fdui
->
graph
[
0
]
=
gNBcommonGraph
(
timeSignal
,
FL_
NORMAL_XYPLOT
,
0
,
curY
,
40
0
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
// 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
);
fl_get_object_bbox
(
fdui
->
graph
[
0
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// Frequency-domain channel response
fdui
->
graph
[
2
]
=
gNBcommonGraph
(
frequencyResponse
,
FL_
IMPULSE_XYPLOT
,
20
,
140
,
76
0
,
100
,
fdui
->
graph
[
2
]
=
gNBcommonGraph
(
frequencyResponse
,
FL_
NORMAL_XYPLOT
,
0
,
curY
,
80
0
,
100
,
"Channel Frequency Response (RE, dB)"
,
FL_RED
);
fl_get_object_bbox
(
fdui
->
graph
[
2
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// 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
);
// 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
);
fl_get_object_bbox
(
fdui
->
graph
[
3
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// 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
);
// fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
// 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
);
fl_get_object_bbox
(
fdui
->
graph
[
6
].
graph
,
&
x
,
&
y
,
&
w
,
&
h
);
curY
+=
h
;
// 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
);
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
(
);
fdui
->
phy_scope
->
fdui
=
fdui
;
char
title
[
100
];
sprintf
(
title
,
"LTE UL SCOPE eNB for UE %d"
,
UE_id
);
fl_show_form
(
fdui
->
phy_scope
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
title
);
fl_show_form
(
fdui
->
phy_scope
,
FL_PLACE_HOTSPOT
,
FL_FULLBORDER
,
"LTE UL SCOPE gNB"
);
return
fdui
;
}
static
FD_phy_scope_t
*
form_gnb
[
NUMBER_OF_UE_MAX
]
=
{
0
};
static
unsigned
char
scope_enb_num_ue
=
1
;
static
const
int
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
)
{
scopeParms_t
*
p
=
(
scopeParms_t
*
)
arg
;
//# ifdef ENABLE_XFORMS_WRITE_STATS
// FILE *gNB_stats = fopen("gNB_stats.txt", "w");
//#endif
size_t
stksize
;
pthread_attr_t
atr
;
size_t
stksize
=
0
;
pthread_attr_t
atr
=
{
0
}
;
pthread_attr_getstacksize
(
&
atr
,
&
stksize
);
pthread_attr_setstacksize
(
&
atr
,
32
*
1024
*
1024
);
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
)
{
int
ue_cnt
=
0
;
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
++
;
}
}
phy_scope_gNB
(
form_gnb
,
p
->
gNB
,
p
->
ru
,
nb_ue
);
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
;
}
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
;
memcpy
(
&
parms
,
p
,
sizeof
(
parms
));
pthread_t
forms_thread
;
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
if
(
!
phy_vars_ue
->
common_vars
.
rxdata
)
return
;
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
}
genericLogPowerPerAntena
(
graph
,
phy_vars_ue
->
frame_parms
.
nb_antennas_rx
,
(
const
scopeSample_t
**
)
phy_vars_ue
->
common_vars
.
rxdata
,
phy_vars_ue
->
frame_parms
.
samples_per_frame
);
}
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
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
)
return
;
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
);
genericPowerPerAntena
(
graph
,
phy_vars_ue
->
frame_parms
.
nb_antennas_rx
,
(
const
scopeSample_t
**
)
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates_time
,
phy_vars_ue
->
frame_parms
.
ofdm_symbol_size
>>
3
);
}
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)
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
dl_ch_estimates
)
return
;
...
...
@@ -575,10 +467,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*2,2);
//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
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
llr
)
return
;
...
...
@@ -591,15 +483,15 @@ static void uePbchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_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
if
(
!
phy_vars_ue
->
pbch_vars
[
eNB_id
]
->
rxdataF_comp
[
0
])
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
(
Q
,
180
*
3
);
int
first_symbol
=
1
;
...
...
@@ -616,17 +508,17 @@ static void uePbchIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id
AssertFatal
(
base
+
nb_re
<
180
*
3
,
""
);
for
(
int
i
=
0
;
i
<
nb_re
;
i
++
)
{
I
[
base
+
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
]
;
Q
[
base
+
i
]
=
pbch_comp
[
2
*
symbol
*
20
*
12
+
2
*
i
+
1
]
;
I
[
base
+
i
]
=
pbch_comp
[
symbol
*
20
*
12
+
i
].
r
;
Q
[
base
+
i
]
=
pbch_comp
[
symbol
*
20
*
12
+
i
].
i
;
}
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
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
llr
)
return
;
...
...
@@ -656,34 +548,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*2,2);
//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
if
(
!
phy_vars_ue
->
pdcch_vars
[
0
][
eNB_id
]
->
rxdataF_comp
[
0
])
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
(
Q
,
nb
*
RX_NB_TH_MAX
);
int
base
=
0
;
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
++
)
{
I
[
base
+
i
]
=
pdcch_comp
[
i
*
2
]
;
Q
[
base
+
i
]
=
pdcch_comp
[
i
*
2
+
1
]
;
I
[
base
+
i
]
=
pdcch_comp
[
i
].
r
;
Q
[
base
+
i
]
=
pdcch_comp
[
i
].
i
;
}
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
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
llr
[
0
])
return
;
...
...
@@ -707,10 +599,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_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
if
(
!
phy_vars_ue
->
pdsch_vars
[
0
][
eNB_id
]
->
rxdataF_comp0
[
0
])
return
;
...
...
@@ -722,17 +614,20 @@ static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
int
base
=
0
;
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
++
)
{
I
[
s
+
base
]
+=
pdsch_comp
[
2
*
s
]
;
Q
[
s
+
base
]
+=
pdsch_comp
[
2
*
s
+
1
]
;
I
[
s
+
base
]
+=
pdsch_comp
[
s
].
r
;
Q
[
s
+
base
]
+=
pdsch_comp
[
s
].
i
;
}
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
...
...
@@ -752,50 +647,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
FD_phy_scope_t
*
create_phy_scope_nrue
(
int
ID
)
{
static
OAI_phy_scope_t
*
create_phy_scope_nrue
(
int
ID
)
{
FL_OBJECT
*
obj
;
FD_phy_scope_t
*
fdui
=
fl_malloc
(
sizeof
*
fdui
);
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
// Define form
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
900
);
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
900
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
int
curY
=
0
,
x
,
y
,
w
,
h
;
// Received signal
fdui
->
graph
[
0
]
=
nrUEcommonGraph
(
ueTimeResponse
,
FL_
IMPULSE_XYPLOT
,
20
,
20
,
37
0
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
FL_
NORMAL_XYPLOT
,
0
,
curY
,
40
0
,
100
,
"Received Signal (Time-Domain, dB)"
,
FL_RED
);
// Time-domain channel response
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
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
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
);
// I/Q PBCH comp
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
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
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
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
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
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
;
// Generic UE Button
#if 0
fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
//openair_daq_vars.use_ia_receiver = 0;
...
...
@@ -804,6 +708,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_callback(fdui->button_0, ia_receiver_on_off, 0 );
fl_hide_object(fdui->button_0);
#endif
fl_end_form
(
);
fdui
->
phy_scope
->
fdui
=
fdui
;
char
buf
[
100
];
...
...
@@ -812,11 +717,11 @@ static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
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
,
int
eNB_id
,
int
UE_id
)
{
static
FD
_phy_scope_t
*
remeberForm
=
NULL
;
static
OAI
_phy_scope_t
*
remeberForm
=
NULL
;
if
(
form
==
NULL
)
form
=
remeberForm
;
...
...
@@ -829,15 +734,13 @@ void phy_scope_nrUE(FD_phy_scope_t *form,
int
i
=
0
;
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
++
;
}
fl_check_forms
();
}
static
FD_phy_scope_t
*
form_nrue
[
NUMBER_OF_UE_MAX
];
static
pthread_t
forms_thread
;
static
void
*
nrUEscopeThread
(
void
*
arg
)
{
PHY_VARS_NR_UE
*
ue
=
(
PHY_VARS_NR_UE
*
)
arg
;
...
...
@@ -845,9 +748,13 @@ static void *nrUEscopeThread(void *arg) {
pthread_attr_t
atr
;
pthread_attr_getstacksize
(
&
atr
,
&
stksize
);
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
)
{
phy_scope_nrUE
(
form_nrue
[
0
]
,
phy_scope_nrUE
(
form_nrue
,
ue
,
0
,
0
);
usleep
(
99
*
1000
);
...
...
@@ -857,10 +764,7 @@ static void *nrUEscopeThread(void *arg) {
}
void
nrUEinitScope
(
PHY_VARS_NR_UE
*
ue
)
{
int
fl_argc
=
1
;
char
*
name
=
"5G-UE-scope"
;
fl_initialize
(
&
fl_argc
,
&
name
,
NULL
,
0
,
0
);
form_nrue
[
0
]
=
create_phy_scope_nrue
(
0
);
pthread_t
forms_thread
;
threadCreate
(
&
forms_thread
,
nrUEscopeThread
,
ue
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
...
...
@@ -893,7 +797,7 @@ static void reset_stats_gNB(FL_OBJECT *button,
static FD_stats_form *create_form_stats_form(int ID) {
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->ldata = 0;
fdui->stats_form = fl_bgn_form( FL_NO_BOX, 1115, 900 );
...
...
openair1/PHY/TOOLS/nr_phy_scope.h
View file @
35f512d7
...
...
@@ -28,7 +28,6 @@
#include <openairinterface5g_limits.h>
#include "common/ran_context.h"
#include <openair1/PHY/defs_gNB.h>
#include <forms.h>
#include "PHY/defs_gNB.h"
//#include "PHY/defs_nrUE.h"
//#include "PHY/impl_defs_top.h"
...
...
openair1/SCHED_NR/phy_frame_config_nr.h
View file @
35f512d7
...
...
@@ -32,6 +32,7 @@
#ifndef PHY_FRAME_CONFIG_NR_H
#define PHY_FRAME_CONFIG_NR_H
#include <nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h>
/************** DEFINE ********************************************/
#define TDD_CONFIG_NB_FRAMES (2)
...
...
@@ -79,6 +80,7 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms);
@returns nr_slot_t : downlink or uplink */
nr_slot_t
nr_slot_select
(
nfapi_nr_config_request_scf_t
*
cfg
,
int
nr_frame
,
int
nr_tti
);
int
nr_ue_slot_select
(
fapi_nr_config_request_t
*
cfg
,
int
nr_frame
,
int
nr_tti
);
/** \brief This function frees tdd configuration for nr
* @param frame_parms NR DL Frame parameters
...
...
openair2/LAYER2/NR_MAC_UE/mac_proto.h
View file @
35f512d7
...
...
@@ -263,5 +263,6 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
void
nr_Msg3_transmitted
(
module_id_t
mod_id
,
uint8_t
CC_id
,
frame_t
frameP
,
uint8_t
gNB_id
);
void
nr_ue_msg2_scheduler
(
module_id_t
mod_id
,
uint16_t
rach_frame
,
uint16_t
rach_slot
,
uint16_t
*
msg2_frame
,
uint16_t
*
msg2_slot
);
#endif
/** @}*/
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
View file @
35f512d7
...
...
@@ -50,7 +50,7 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst)
//LOG_I(MAC, "[MAIN] init UE MAC functions \n");
//init mac here
nr_ue_mac_inst
=
(
NR_UE_MAC_INST_t
*
)
malloc
(
sizeof
(
NR_UE_MAC_INST_t
)
*
NB_NR_UE_MAC_INST
);
nr_ue_mac_inst
=
(
NR_UE_MAC_INST_t
*
)
calloc
(
sizeof
(
NR_UE_MAC_INST_t
),
NB_NR_UE_MAC_INST
);
if
(
rrc_inst
)
{
nr_rrc_mac_config_req_ue
(
0
,
0
,
0
,
NULL
,
rrc_inst
->
cell_group_config
->
spCellConfig
);
...
...
openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
View file @
35f512d7
...
...
@@ -91,8 +91,8 @@ int8_t nr_get_DELTA_PREAMBLE(module_id_t mod_id, int CC_id, uint16_t prach_forma
prachConfigIndex
=
nr_rach_ConfigCommon
->
rach_ConfigGeneric
.
prach_ConfigurationIndex
;
if
(
prach_sequence_length
==
0
)
{
switch
(
prach_format
)
{
AssertFatal
(
prach_format
<
4
,
"Illegal PRACH format %d for sequence length 839
\n
"
,
prach_format
);
switch
(
prach_format
)
{
// long preamble formats
case
0
:
...
...
openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
View file @
35f512d7
...
...
@@ -44,6 +44,7 @@
#include "NR_MAC_UE/mac.h"
#include "NR_MAC_UE/mac_proto.h"
#include "NR_MAC_COMMON/nr_mac_extern.h"
#include <common/utils/nr/nr_common.h>
#define DEBUG_RAR
...
...
openair2/LAYER2/PDCP_v10.1.0/pdcp.h
View file @
35f512d7
...
...
@@ -34,10 +34,6 @@
#ifndef __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 "COMMON/platform_constants.h"
...
...
openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
View file @
35f512d7
...
...
@@ -55,7 +55,6 @@ extern int otg_enabled;
#include "common/utils/LOG/log.h"
#include "UTIL/OTG/otg_tx.h"
#include "nfapi/oai_integration/vendor_ext.h"
#include "UTIL/FIFO/pad_list.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "platform_constants.h"
#include "msc.h"
...
...
@@ -91,7 +90,6 @@ extern struct msghdr nas_msg_rx;
extern
uint16_t
inst_pdcp_list
[
NUMBER_OF_UE_MAX
];
#endif
extern
Packet_OTG_List_t
*
otg_pdcp_buffer
;
# include "gtpv1u_eNB_task.h"
...
...
@@ -122,7 +120,6 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
int
sizeToWrite
=
sizeof
(
pdcp_data_ind_header_t
)
+
pdcpHead
->
data_size
;
void
*
pdcpData
=
(
void
*
)(
pdcpHead
+
1
);
if
(
rb_id
==
10
)
{
//hardcoded for PC5-Signaling
if
(
LOG_DEBUGFLAG
(
DEBUG_PDCP
)
)
{
debug_pdcp_pc5s_sdu
((
sidelink_pc5s_element
*
)
pdcpData
,
...
...
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