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
wangjie
OpenXG-RAN
Commits
15a1af31
Commit
15a1af31
authored
Dec 12, 2016
by
hbilel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[OAI-UE] adapt T-tracer to support OAI-UE
parent
3bf8768d
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
865 additions
and
5 deletions
+865
-5
common/utils/T/T_messages.txt
common/utils/T/T_messages.txt
+75
-0
common/utils/T/tracer/Makefile
common/utils/T/tracer/Makefile
+6
-1
common/utils/T/tracer/ue.c
common/utils/T/tracer/ue.c
+728
-0
openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
+6
-0
openair1/PHY/LTE_TRANSPORT/dci.c
openair1/PHY/LTE_TRANSPORT/dci.c
+6
-1
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+5
-0
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+7
-0
openair1/PHY/LTE_TRANSPORT/phich.c
openair1/PHY/LTE_TRANSPORT/phich.c
+4
-2
openair1/PHY/defs.h
openair1/PHY/defs.h
+1
-0
openair1/SCHED/phy_procedures_lte_ue.c
openair1/SCHED/phy_procedures_lte_ue.c
+27
-1
No files found.
common/utils/T/T_messages.txt
View file @
15a1af31
...
@@ -1938,3 +1938,78 @@ ID = VCD_FUNCTION_RECV_IF5
...
@@ -1938,3 +1938,78 @@ ID = VCD_FUNCTION_RECV_IF5
DESC = VCD function RECV_IF5
DESC = VCD function RECV_IF5
GROUP = ALL:VCD:ENB:VCD_FUNCTION
GROUP = ALL:VCD:ENB:VCD_FUNCTION
FORMAT = int,value
FORMAT = int,value
#################
#### UE LOGS ####
#################
#general logs
ID = UE_MASTER_TICK
DESC = UE master tick - one tick per ms, to be used as "reference clock", mostly for ticktime view
GROUP = ALL:GENERAL:UE
FORMAT = int,eNB_ID : int,frame : int,subframe
#PHY logs
ID = UE_PHY_UL_TICK
DESC = UE uplink tick - one tick per ms at start of uplink processing
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe
ID = UE_PHY_DL_TICK
DESC = UE downlink tick - one tick per ms at start of downlink processing
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe
ID = UE_PHY_DLSCH_UE_DCI
DESC = UE downlink UE specific DCI as sent by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
ID = UE_PHY_DLSCH_UE_ACK
DESC = UE downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
ID = UE_PHY_DLSCH_UE_NACK
DESC = UE downlink UE NACK as seen by the PHY layer in process_HARQ_feedback
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
ID = UE_PHY_ULSCH_UE_DCI
DESC = UE uplink UE specific DCI as sent by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS
ID = UE_PHY_ULSCH_UE_ACK
DESC = UE uplink UE ACK as seen by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
ID = UE_PHY_ULSCH_UE_NACK
DESC = UE uplink UE NACK as seen by the PHY layer
GROUP = ALL:PHY:GRAPHIC:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
ID = UE_PHY_INPUT_SIGNAL
DESC = UE received signal in the time domain for a duration of 1ms
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata
ID = UE_PHY_DL_CHANNEL_ESTIMATE
DESC = UE channel estimation in the time domain
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,antenna : buffer,chest_t
ID = UE_PHY_PDCCH_IQ
DESC = UE PDCCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,I : int,Q
ID = UE_PHY_PDCCH_ENERGY
DESC = UE PDSCH 1 energy and threshold
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,energy : int,threshold
ID = UE_PHY_PDSCH_IQ
DESC = UE PDSCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp
ID = UE_PHY_PDSCH_ENERGY
DESC = UE PDSCH 1 energy and threshold
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,energy : int,threshold
ID = UE_PHY_PUSCH_TX_POWER
DESC = UE PUSCH tx power
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,power
ID = UE_PHY_PUCCH_TX_POWER
DESC = UE PDSCH 1 energy and threshold
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,power
common/utils/T/tracer/Makefile
View file @
15a1af31
...
@@ -5,7 +5,7 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I.
...
@@ -5,7 +5,7 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I.
LIBS
=
-lX11
-lm
-lpng
-lXft
LIBS
=
-lX11
-lm
-lpng
-lXft
all
:
record replay extract_config textlog enb vcd macpdu2wireshark
all
:
record replay extract_config textlog enb
ue
vcd macpdu2wireshark
record
:
utils.o record.o database.o config.o
record
:
utils.o record.o database.o config.o
$(CC)
$(CFLAGS)
-o
record
$^
$(LIBS)
$(CC)
$(CFLAGS)
-o
record
$^
$(LIBS)
...
@@ -26,6 +26,11 @@ enb: utils.o enb.o database.o event.o handler.o config.o \
...
@@ -26,6 +26,11 @@ enb: utils.o enb.o database.o event.o handler.o config.o \
filter/filter.a
filter/filter.a
$(CC)
$(CFLAGS)
-o
enb
$^
$(LIBS)
$(CC)
$(CFLAGS)
-o
enb
$^
$(LIBS)
ue
:
utils.o ue.o database.o event.o handler.o config.o
\
event_selector.o view/view.a gui/gui.a logger/logger.a
\
filter/filter.a
$(CC)
$(CFLAGS)
-o
ue
$^
$(LIBS)
vcd
:
utils.o vcd.o database.o event.o handler.o config.o
\
vcd
:
utils.o vcd.o database.o event.o handler.o config.o
\
event_selector.o view/view.a gui/gui.a logger/logger.a
\
event_selector.o view/view.a gui/gui.a logger/logger.a
\
filter/filter.a
filter/filter.a
...
...
common/utils/T/tracer/ue.c
0 → 100644
View file @
15a1af31
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include "database.h"
#include "event.h"
#include "handler.h"
#include "logger/logger.h"
#include "view/view.h"
#include "gui/gui.h"
#include "filter/filter.h"
#include "utils.h"
#include "../T_defs.h"
#include "event_selector.h"
#include "openair_logo.h"
#include "config.h"
typedef
struct
{
view
*
phyview
;
view
*
macview
;
view
*
rlcview
;
view
*
pdcpview
;
view
*
rrcview
;
view
*
legacy
;
widget
*
current_ue_label
;
widget
*
prev_ue_button
;
widget
*
next_ue_button
;
widget
*
pdsch_iq_ue_xy_plot
;
widget
*
dl_estimate_ue_xy_plot
;
widget
*
pdcch_energy_ue_xy_plot
;
widget
*
pdcch_iq_ue_xy_plot
;
widget
*
dl_ul_harq_ue_label
;
widget
*
dl_mcs_xy_plot
;
widget
*
ul_mcs_xy_plot
;
logger
*
pdsch_iq_ue_logger
;
logger
*
dl_estimate_ue_logger
;
logger
*
pdcch_energy_ue_threshold_logger
;
logger
*
pdcch_energy_ue_energy_logger
;
logger
*
pdcch_iq_ue_logger
;
logger
*
dl_dci_logger
[
8
];
logger
*
dl_ack_logger
[
8
];
logger
*
dl_nack_logger
[
8
];
logger
*
ul_dci_logger
[
8
];
logger
*
ul_dci_retransmission_logger
[
8
];
logger
*
ul_ack_logger
[
8
];
logger
*
ul_nack_logger
[
8
];
logger
*
dl_mcs_logger
;
logger
*
ul_mcs_logger
;
}
ue_gui
;
typedef
struct
{
int
socket
;
int
*
is_on
;
int
nevents
;
pthread_mutex_t
lock
;
ue_gui
*
e
;
int
ue
;
/* what UE is displayed in the UE specific views */
void
*
database
;
}
ue_data
;
void
is_on_changed
(
void
*
_d
)
{
ue_data
*
d
=
_d
;
char
t
;
if
(
pthread_mutex_lock
(
&
d
->
lock
))
abort
();
if
(
d
->
socket
==
-
1
)
goto
no_connection
;
t
=
1
;
if
(
socket_send
(
d
->
socket
,
&
t
,
1
)
==
-
1
||
socket_send
(
d
->
socket
,
&
d
->
nevents
,
sizeof
(
int
))
==
-
1
||
socket_send
(
d
->
socket
,
d
->
is_on
,
d
->
nevents
*
sizeof
(
int
))
==
-
1
)
goto
connection_dies
;
no_connection:
if
(
pthread_mutex_unlock
(
&
d
->
lock
))
abort
();
return
;
connection_dies:
close
(
d
->
socket
);
d
->
socket
=
-
1
;
if
(
pthread_mutex_unlock
(
&
d
->
lock
))
abort
();
}
void
usage
(
void
)
{
printf
(
"options:
\n
"
" -d <database file> this option is mandatory
\n
"
" -on <GROUP or ID> turn log ON for given GROUP or ID
\n
"
" -off <GROUP or ID> turn log OFF for given GROUP or ID
\n
"
" -ON turn all logs ON
\n
"
" -OFF turn all logs OFF
\n
"
" note: you may pass several -on/-off/-ON/-OFF,
\n
"
" they will be processed in order
\n
"
" by default, all is off
\n
"
" -ip <host> connect to given IP address (default %s)
\n
"
" -p <port> connect to given port (default %d)
\n
"
" -debug-gui activate GUI debug logs
\n
"
,
DEFAULT_REMOTE_IP
,
DEFAULT_REMOTE_PORT
);
exit
(
1
);
}
static
void
*
gui_thread
(
void
*
_g
)
{
gui
*
g
=
_g
;
gui_loop
(
g
);
return
NULL
;
}
static
filter
*
ticktime_filter
(
void
*
database
,
char
*
event
,
int
i
,
int
ue
)
{
/* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */
return
filter_and
(
filter_eq
(
filter_evarg
(
database
,
event
,
"harq_pid"
),
filter_int
(
i
)),
filter_and
(
filter_eq
(
filter_evarg
(
database
,
event
,
"UE_id"
),
filter_int
(
ue
)),
filter_eq
(
filter_evarg
(
database
,
event
,
"eNB_ID"
),
filter_int
(
0
))));
}
static
void
set_current_ue
(
gui
*
g
,
ue_data
*
e
,
int
ue
)
{
int
i
;
char
s
[
256
];
sprintf
(
s
,
"[UE %d] "
,
ue
);
label_set_text
(
g
,
e
->
e
->
current_ue_label
,
s
);
sprintf
(
s
,
"PDSCH IQ [UE %d]"
,
ue
);
xy_plot_set_title
(
g
,
e
->
e
->
pdsch_iq_ue_xy_plot
,
s
);
sprintf
(
s
,
"DL estimated channel [UE %d]"
,
ue
);
xy_plot_set_title
(
g
,
e
->
e
->
dl_estimate_ue_xy_plot
,
s
);
sprintf
(
s
,
"PDCCH energy [UE %d]"
,
ue
);
xy_plot_set_title
(
g
,
e
->
e
->
pdcch_energy_ue_xy_plot
,
s
);
sprintf
(
s
,
"PDCCH IQ [UE %d]"
,
ue
);
xy_plot_set_title
(
g
,
e
->
e
->
pdcch_iq_ue_xy_plot
,
s
);
sprintf
(
s
,
"DL/UL HARQ (x8) [UE %d]"
,
ue
);
label_set_text
(
g
,
e
->
e
->
dl_ul_harq_ue_label
,
s
);
sprintf
(
s
,
"DL MCS [UE %d]"
,
ue
);
xy_plot_set_title
(
g
,
e
->
e
->
dl_mcs_xy_plot
,
s
);
sprintf
(
s
,
"UL MCS [UE %d]"
,
ue
);
xy_plot_set_title
(
g
,
e
->
e
->
ul_mcs_xy_plot
,
s
);
logger_set_filter
(
e
->
e
->
pdsch_iq_ue_logger
,
filter_eq
(
filter_evarg
(
e
->
database
,
"UE_PHY_PDSCH_IQ"
,
"UE_ID"
),
filter_int
(
ue
)));
logger_set_filter
(
e
->
e
->
dl_estimate_ue_logger
,
filter_eq
(
filter_evarg
(
e
->
database
,
"UE_PHY_DL_CHANNEL_ESTIMATE"
,
"UE_ID"
),
filter_int
(
ue
)));
logger_set_filter
(
e
->
e
->
pdcch_energy_ue_threshold_logger
,
filter_eq
(
filter_evarg
(
e
->
database
,
"UE_PHY_PDCCH_ENERGY"
,
"UE_ID"
),
filter_int
(
ue
)));
/*logger_set_filter(e->pucch1_energy_ue_energy_logger,
filter_eq(
filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
filter_int(ue)));*/
logger_set_filter
(
e
->
e
->
pdcch_iq_ue_logger
,
filter_eq
(
filter_evarg
(
e
->
database
,
"UE_PHY_PDCCH_IQ"
,
"UE_ID"
),
filter_int
(
ue
)));
for
(
i
=
0
;
i
<
8
;
i
++
)
{
logger_set_filter
(
e
->
e
->
dl_dci_logger
[
i
],
ticktime_filter
(
e
->
database
,
"UE_PHY_DLSCH_UE_DCI"
,
i
,
ue
));
logger_set_filter
(
e
->
e
->
dl_ack_logger
[
i
],
ticktime_filter
(
e
->
database
,
"UE_PHY_DLSCH_UE_ACK"
,
i
,
ue
));
logger_set_filter
(
e
->
e
->
dl_nack_logger
[
i
],
ticktime_filter
(
e
->
database
,
"UE_PHY_DLSCH_UE_NACK"
,
i
,
ue
));
logger_set_filter
(
e
->
e
->
ul_dci_logger
[
i
],
ticktime_filter
(
e
->
database
,
"UE_PHY_ULSCH_UE_DCI"
,
i
,
ue
));
/*logger_set_filter(e->ul_dci_retransmission_logger[i],
ticktime_filter(e->database,
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));*/
logger_set_filter
(
e
->
e
->
ul_ack_logger
[
i
],
ticktime_filter
(
e
->
database
,
"UE_PHY_ULSCH_UE_ACK"
,
i
,
ue
));
logger_set_filter
(
e
->
e
->
ul_nack_logger
[
i
],
ticktime_filter
(
e
->
database
,
"UE_PHY_ULSCH_UE_NACK"
,
i
,
ue
));
}
logger_set_filter
(
e
->
e
->
dl_mcs_logger
,
filter_eq
(
filter_evarg
(
e
->
database
,
"UE_PHY_DLSCH_UE_DCI"
,
"UE_id"
),
filter_int
(
ue
)));
logger_set_filter
(
e
->
e
->
ul_mcs_logger
,
filter_eq
(
filter_evarg
(
e
->
database
,
"UE_PHY_ULSCH_UE_DCI"
,
"UE_id"
),
filter_int
(
ue
)));
}
static
void
click
(
void
*
private
,
gui
*
g
,
char
*
notification
,
widget
*
w
,
void
*
notification_data
)
{
int
*
d
=
notification_data
;
int
button
=
d
[
0
];
ue_data
*
ed
=
private
;
ue_gui
*
e
=
ed
->
e
;
int
ue
=
ed
->
ue
;
if
(
button
!=
1
)
return
;
if
(
w
==
e
->
prev_ue_button
)
{
ue
--
;
if
(
ue
<
0
)
ue
=
0
;
}
if
(
w
==
e
->
next_ue_button
)
ue
++
;
if
(
pthread_mutex_lock
(
&
ed
->
lock
))
abort
();
if
(
ue
!=
ed
->
ue
)
{
set_current_ue
(
g
,
ed
,
ue
);
ed
->
ue
=
ue
;
}
if
(
pthread_mutex_unlock
(
&
ed
->
lock
))
abort
();
}
static
void
ue_main_gui
(
ue_gui
*
e
,
gui
*
g
,
event_handler
*
h
,
void
*
database
,
ue_data
*
ed
)
{
widget
*
main_window
;
widget
*
top_container
;
widget
*
line
,
*
col
;
widget
*
logo
;
widget
*
input_signal_plot
;
logger
*
input_signal_log
;
view
*
input_signal_view
;
widget
*
timeline_plot
;
logger
*
timelog
;
view
*
timeview
;
view
*
subview
;
//widget *text;
//view *textview;
int
i
;
widget
*
w
,
*
w2
;
view
*
v
;
logger
*
l
;
main_window
=
new_toplevel_window
(
g
,
1200
,
900
,
"eNB tracer"
);
top_container
=
new_container
(
g
,
VERTICAL
);
widget_add_child
(
g
,
main_window
,
top_container
,
-
1
);
line
=
new_container
(
g
,
HORIZONTAL
);
widget_add_child
(
g
,
top_container
,
line
,
-
1
);
logo
=
new_image
(
g
,
openair_logo_png
,
openair_logo_png_len
);
/* logo + prev/next UE buttons */
col
=
new_container
(
g
,
VERTICAL
);
widget_add_child
(
g
,
col
,
logo
,
-
1
);
w
=
new_container
(
g
,
HORIZONTAL
);
widget_add_child
(
g
,
col
,
w
,
-
1
);
w2
=
new_label
(
g
,
""
);
widget_add_child
(
g
,
w
,
w2
,
-
1
);
e
->
current_ue_label
=
w2
;
/* TODO: use button widget, not label widget */
w2
=
new_label
(
g
,
" [prev UE] "
);
widget_add_child
(
g
,
w
,
w2
,
-
1
);
label_set_clickable
(
g
,
w2
,
1
);
e
->
prev_ue_button
=
w2
;
w2
=
new_label
(
g
,
" [next UE] "
);
widget_add_child
(
g
,
w
,
w2
,
-
1
);
label_set_clickable
(
g
,
w2
,
1
);
e
->
next_ue_button
=
w2
;
widget_add_child
(
g
,
line
,
col
,
-
1
);
input_signal_plot
=
new_xy_plot
(
g
,
256
,
55
,
"input signal"
,
20
);
widget_add_child
(
g
,
line
,
input_signal_plot
,
-
1
);
xy_plot_set_range
(
g
,
input_signal_plot
,
0
,
7680
*
10
,
20
,
70
);
input_signal_log
=
new_framelog
(
h
,
database
,
"UE_PHY_INPUT_SIGNAL"
,
"subframe"
,
"rxdata"
);
/* a skip value of 10 means to process 1 frame over 10, that is
* more or less 10 frames per second
*/
framelog_set_skip
(
input_signal_log
,
10
);
input_signal_view
=
new_view_xy
(
7680
*
10
,
10
,
g
,
input_signal_plot
,
new_color
(
g
,
"#0c0c72"
),
XY_LOOP_MODE
);
logger_add_view
(
input_signal_log
,
input_signal_view
);
/* UE x PDSCH IQ data */
w
=
new_xy_plot
(
g
,
55
,
55
,
""
,
50
);
e
->
pdsch_iq_ue_xy_plot
=
w
;
widget_add_child
(
g
,
line
,
w
,
-
1
);
xy_plot_set_range
(
g
,
w
,
-
1000
,
1000
,
-
1000
,
1000
);
l
=
new_iqlog
(
h
,
database
,
"UE_PHY_PDSCH_IQ"
,
"nb_rb"
,
"N_RB_UL"
,
"symbols_per_tti"
,
"pusch_comp"
);
v
=
new_view_xy
(
100
*
12
*
14
,
10
,
g
,
w
,
new_color
(
g
,
"#000"
),
XY_FORCED_MODE
);
logger_add_view
(
l
,
v
);
e
->
pdsch_iq_ue_logger
=
l
;
/* UE x estimated DL channel */
w
=
new_xy_plot
(
g
,
280
,
55
,
""
,
50
);
e
->
dl_estimate_ue_xy_plot
=
w
;
widget_add_child
(
g
,
line
,
w
,
-
1
);
xy_plot_set_range
(
g
,
w
,
0
,
512
*
10
,
-
10
,
80
);
l
=
new_framelog
(
h
,
database
,
"UE_PHY_DL_CHANNEL_ESTIMATE"
,
"subframe"
,
"chest_t"
);
//framelog_set_skip(input_signal_log, 10);
framelog_set_update_only_at_sf9
(
l
,
0
);
v
=
new_view_xy
(
512
*
10
,
10
,
g
,
w
,
new_color
(
g
,
"#0c0c72"
),
XY_LOOP_MODE
);
logger_add_view
(
l
,
v
);
e
->
dl_estimate_ue_logger
=
l
;
/* UE x PDCCH energy */
w
=
new_xy_plot
(
g
,
128
,
55
,
""
,
50
);
e
->
pdcch_energy_ue_xy_plot
=
w
;
widget_add_child
(
g
,
line
,
w
,
-
1
);
xy_plot_set_range
(
g
,
w
,
0
,
1024
*
10
,
-
10
,
80
);
l
=
new_ttilog
(
h
,
database
,
"UE_PHY_PDCCH_ENERGY"
,
"frame"
,
"subframe"
,
"threshold"
,
0
);
v
=
new_view_tti
(
10
,
g
,
w
,
new_color
(
g
,
"#ff0000"
));
logger_add_view
(
l
,
v
);
e
->
pdcch_energy_ue_threshold_logger
=
l
;
/* UE x PDCCH IQ data */
w
=
new_xy_plot
(
g
,
55
,
55
,
""
,
50
);
e
->
pdcch_iq_ue_xy_plot
=
w
;
widget_add_child
(
g
,
line
,
w
,
-
1
);
xy_plot_set_range
(
g
,
w
,
-
2000
,
2000
,
-
2000
,
2000
);
l
=
new_iqdotlog
(
h
,
database
,
"UE_PHY_PDCCH_IQ"
,
"I"
,
"Q"
);
v
=
new_view_xy
(
500
,
10
,
g
,
w
,
new_color
(
g
,
"#000"
),
XY_LOOP_MODE
);
logger_add_view
(
l
,
v
);
e
->
pdcch_iq_ue_logger
=
l
;
/* UE x DL mcs */
line
=
new_container
(
g
,
HORIZONTAL
);
widget_add_child
(
g
,
top_container
,
line
,
-
1
);
w
=
new_xy_plot
(
g
,
128
,
55
,
""
,
20
);
xy_plot_set_range
(
g
,
w
,
0
,
1024
*
10
,
-
2
,
30
);
e
->
dl_mcs_xy_plot
=
w
;
widget_add_child
(
g
,
line
,
w
,
-
1
);
l
=
new_ticked_ttilog
(
h
,
database
,
"UE_PHY_DL_TICK"
,
"frame"
,
"subframe"
,
"UE_PHY_DLSCH_UE_DCI"
,
"mcs"
,
0
,
-
1
);
v
=
new_view_tti
(
10
,
g
,
w
,
new_color
(
g
,
"#0c0c72"
));
logger_add_view
(
l
,
v
);
e
->
dl_mcs_logger
=
l
;
/* UE x UL mcs */
w
=
new_xy_plot
(
g
,
128
,
55
,
""
,
20
);
xy_plot_set_range
(
g
,
w
,
0
,
1024
*
10
,
-
2
,
30
);
e
->
ul_mcs_xy_plot
=
w
;
widget_add_child
(
g
,
line
,
w
,
-
1
);
l
=
new_ticked_ttilog
(
h
,
database
,
"UE_PHY_DL_TICK"
,
"frame"
,
"subframe"
,
"UE_PHY_ULSCH_UE_DCI"
,
"mcs"
,
0
,
-
1
);
v
=
new_view_tti
(
10
,
g
,
w
,
new_color
(
g
,
"#0c0c72"
));
logger_add_view
(
l
,
v
);
e
->
ul_mcs_logger
=
l
;
/* downlink/uplink UE DCIs */
widget_add_child
(
g
,
top_container
,
new_label
(
g
,
"DL/UL TICK/DCI/ACK/NACK [all UEs]"
),
-
1
);
line
=
new_container
(
g
,
HORIZONTAL
);
widget_add_child
(
g
,
top_container
,
line
,
-
1
);
timeline_plot
=
new_timeline
(
g
,
512
,
8
,
5
);
widget_add_child
(
g
,
line
,
timeline_plot
,
-
1
);
container_set_child_growable
(
g
,
line
,
timeline_plot
,
1
);
for
(
i
=
0
;
i
<
8
;
i
++
)
timeline_set_subline_background_color
(
g
,
timeline_plot
,
i
,
new_color
(
g
,
i
==
0
||
i
==
4
?
"#aaf"
:
"#eee"
));
timeview
=
new_view_time
(
3600
,
10
,
g
,
timeline_plot
);
/* DL tick logging */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_DL_TICK"
);
subview
=
new_subview_time
(
timeview
,
0
,
new_color
(
g
,
"#77c"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* DL DCI logging */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_DLSCH_UE_DCI"
);
subview
=
new_subview_time
(
timeview
,
1
,
new_color
(
g
,
"#228"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* DL ACK */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_DLSCH_UE_ACK"
);
subview
=
new_subview_time
(
timeview
,
2
,
new_color
(
g
,
"#282"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* DL NACK */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_DLSCH_UE_NACK"
);
subview
=
new_subview_time
(
timeview
,
3
,
new_color
(
g
,
"#f22"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* UL tick logging */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_UL_TICK"
);
subview
=
new_subview_time
(
timeview
,
4
,
new_color
(
g
,
"#77c"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* UL DCI logging */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_ULSCH_UE_DCI"
);
subview
=
new_subview_time
(
timeview
,
5
,
new_color
(
g
,
"#228"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* UL retransmission without DCI logging */
//timelog = new_timelog(h,database,"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION");
//subview = new_subview_time(timeview, 5, new_color(g, "#f22"), 3600*1000);
//logger_add_view(timelog, subview);
/* UL ACK */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_ULSCH_UE_ACK"
);
subview
=
new_subview_time
(
timeview
,
6
,
new_color
(
g
,
"#282"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* UL NACK */
timelog
=
new_timelog
(
h
,
database
,
"UE_PHY_ULSCH_UE_NACK"
);
subview
=
new_subview_time
(
timeview
,
7
,
new_color
(
g
,
"#f22"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* harq processes' ticktime view */
e
->
dl_ul_harq_ue_label
=
new_label
(
g
,
""
);
widget_add_child
(
g
,
top_container
,
e
->
dl_ul_harq_ue_label
,
-
1
);
line
=
new_container
(
g
,
HORIZONTAL
);
widget_add_child
(
g
,
top_container
,
line
,
-
1
);
timeline_plot
=
new_timeline
(
g
,
512
,
2
*
8
+
2
,
3
);
widget_add_child
(
g
,
line
,
timeline_plot
,
-
1
);
container_set_child_growable
(
g
,
line
,
timeline_plot
,
1
);
for
(
i
=
0
;
i
<
2
*
8
+
2
;
i
++
)
timeline_set_subline_background_color
(
g
,
timeline_plot
,
i
,
new_color
(
g
,
i
==
0
||
i
==
9
?
"#ddd"
:
(
i
%
9
)
&
1
?
"#e6e6e6"
:
"#eee"
));
timeview
=
new_view_ticktime
(
10
,
g
,
timeline_plot
);
ticktime_set_tick
(
timeview
,
new_ticklog
(
h
,
database
,
"ENB_MASTER_TICK"
,
"frame"
,
"subframe"
));
/* tick */
timelog
=
new_ticklog
(
h
,
database
,
"ENB_MASTER_TICK"
,
"frame"
,
"subframe"
);
/* tick on DL view */
subview
=
new_subview_ticktime
(
timeview
,
0
,
new_color
(
g
,
"#bbb"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* tick on UL view */
subview
=
new_subview_ticktime
(
timeview
,
9
,
new_color
(
g
,
"#bbb"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
/* DL DCI */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
timelog
=
new_ticklog
(
h
,
database
,
"UE_PHY_DLSCH_UE_DCI"
,
"frame"
,
"subframe"
);
subview
=
new_subview_ticktime
(
timeview
,
i
+
1
,
new_color
(
g
,
"#55f"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
e
->
dl_dci_logger
[
i
]
=
timelog
;
}
/* DL ACK */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
timelog
=
new_ticklog
(
h
,
database
,
"UE_PHY_DLSCH_UE_ACK"
,
"frame"
,
"subframe"
);
subview
=
new_subview_ticktime
(
timeview
,
i
+
1
,
new_color
(
g
,
"#282"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
e
->
dl_ack_logger
[
i
]
=
timelog
;
}
/* DL NACK */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
timelog
=
new_ticklog
(
h
,
database
,
"UE_PHY_DLSCH_UE_NACK"
,
"frame"
,
"subframe"
);
subview
=
new_subview_ticktime
(
timeview
,
i
+
1
,
new_color
(
g
,
"#f22"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
e
->
dl_nack_logger
[
i
]
=
timelog
;
}
/* UL DCI/retransmission without DCI */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
/* first transmission */
timelog
=
new_ticklog
(
h
,
database
,
"UE_PHY_ULSCH_UE_DCI"
,
"frame"
,
"subframe"
);
subview
=
new_subview_ticktime
(
timeview
,
i
+
9
+
1
,
new_color
(
g
,
"#55f"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
e
->
ul_dci_logger
[
i
]
=
timelog
;
/* retransmission */
/*
timelog = new_ticklog(h, database,
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe");
subview = new_subview_ticktime(timeview, i+9+1,
new_color(g,"#99f"), 3600*1000);
logger_add_view(timelog, subview);
e->ul_dci_retransmission_logger[i] = timelog;
*/
}
/* UL ACK */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
timelog
=
new_ticklog
(
h
,
database
,
"UE_PHY_ULSCH_UE_ACK"
,
"frame"
,
"subframe"
);
subview
=
new_subview_ticktime
(
timeview
,
i
+
9
+
1
,
new_color
(
g
,
"#282"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
e
->
ul_ack_logger
[
i
]
=
timelog
;
}
/* UL NACK */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
timelog
=
new_ticklog
(
h
,
database
,
"UE_PHY_ULSCH_UE_NACK"
,
"frame"
,
"subframe"
);
subview
=
new_subview_ticktime
(
timeview
,
i
+
9
+
1
,
new_color
(
g
,
"#f22"
),
3600
*
1000
);
logger_add_view
(
timelog
,
subview
);
e
->
ul_nack_logger
[
i
]
=
timelog
;
}
#if 0
/* phy/mac/rlc/pdcp/rrc textlog */
line = new_container(g, HORIZONTAL);
widget_add_child(g, top_container, line, -1);
container_set_child_growable(g, top_container, line, 1);
/* phy */
col = new_container(g, VERTICAL);
widget_add_child(g, line, col, -1);
container_set_child_growable(g, line, col, 1);
widget_add_child(g, col, new_label(g, "PHY"), -1);
text = new_textlist(g, 100, 10, new_color(g, "#afa"));
widget_add_child(g, col, text, -1);
container_set_child_growable(g, col, text, 1);
textview = new_view_textlist(10000, 10, g, text);
e->phyview = textview;
/* mac */
col = new_container(g, VERTICAL);
widget_add_child(g, line, col, -1);
container_set_child_growable(g, line, col, 1);
widget_add_child(g, col, new_label(g, "MAC"), -1);
text = new_textlist(g, 100, 10, new_color(g, "#adf"));
widget_add_child(g, col, text, -1);
container_set_child_growable(g, col, text, 1);
textview = new_view_textlist(10000, 10, g, text);
e->macview = textview;
line = new_container(g, HORIZONTAL);
widget_add_child(g, top_container, line, -1);
container_set_child_growable(g, top_container, line, 1);
/* rlc */
col = new_container(g, VERTICAL);
widget_add_child(g, line, col, -1);
container_set_child_growable(g, line, col, 1);
widget_add_child(g, col, new_label(g, "RLC"), -1);
text = new_textlist(g, 100, 10, new_color(g, "#aff"));
widget_add_child(g, col, text, -1);
container_set_child_growable(g, col, text, 1);
textview = new_view_textlist(10000, 10, g, text);
e->rlcview = textview;
/* pdcp */
col = new_container(g, VERTICAL);
widget_add_child(g, line, col, -1);
container_set_child_growable(g, line, col, 1);
widget_add_child(g, col, new_label(g, "PDCP"), -1);
text = new_textlist(g, 100, 10, new_color(g, "#ed9"));
widget_add_child(g, col, text, -1);
container_set_child_growable(g, col, text, 1);
textview = new_view_textlist(10000, 10, g, text);
e->pdcpview = textview;
line = new_container(g, HORIZONTAL);
widget_add_child(g, top_container, line, -1);
container_set_child_growable(g, top_container, line, 1);
/* rrc */
col = new_container(g, VERTICAL);
widget_add_child(g, line, col, -1);
container_set_child_growable(g, line, col, 1);
widget_add_child(g, col, new_label(g, "RRC"), -1);
text = new_textlist(g, 100, 10, new_color(g, "#fdb"));
widget_add_child(g, col, text, -1);
container_set_child_growable(g, col, text, 1);
textview = new_view_textlist(10000, 10, g, text);
e->rrcview = textview;
/* legacy logs (LOG_I, LOG_D, ...) */
widget_add_child(g, top_container, new_label(g, "LEGACY"), -1);
text = new_textlist(g, 100, 10, new_color(g, "#eeb"));
widget_add_child(g, top_container, text, -1);
container_set_child_growable(g, top_container, text, 1);
e->legacy = new_view_textlist(10000, 10, g, text);
#endif
set_current_ue
(
g
,
ed
,
0
);
register_notifier
(
g
,
"click"
,
e
->
prev_ue_button
,
click
,
ed
);
register_notifier
(
g
,
"click"
,
e
->
next_ue_button
,
click
,
ed
);
}
void
view_add_log
(
view
*
v
,
char
*
log
,
event_handler
*
h
,
void
*
database
,
int
*
is_on
)
{
logger
*
textlog
;
char
*
name
,
*
desc
;
database_get_generic_description
(
database
,
event_id_from_name
(
database
,
log
),
&
name
,
&
desc
);
textlog
=
new_textlog
(
h
,
database
,
name
,
desc
);
logger_add_view
(
textlog
,
v
);
free
(
name
);
free
(
desc
);
on_off
(
database
,
log
,
is_on
,
1
);
}
int
main
(
int
n
,
char
**
v
)
{
extern
int
volatile
gui_logd
;
char
*
database_filename
=
NULL
;
void
*
database
;
char
*
ip
=
DEFAULT_REMOTE_IP
;
int
port
=
DEFAULT_REMOTE_PORT
;
char
**
on_off_name
;
int
*
on_off_action
;
int
on_off_n
=
0
;
int
*
is_on
;
int
number_of_events
;
int
i
;
event_handler
*
h
;
gui
*
g
;
ue_gui
eg
;
ue_data
ue_data
;
/* write on a socket fails if the other end is closed and we get SIGPIPE */
if
(
signal
(
SIGPIPE
,
SIG_IGN
)
==
SIG_ERR
)
abort
();
on_off_name
=
malloc
(
n
*
sizeof
(
char
*
));
if
(
on_off_name
==
NULL
)
abort
();
on_off_action
=
malloc
(
n
*
sizeof
(
int
));
if
(
on_off_action
==
NULL
)
abort
();
for
(
i
=
1
;
i
<
n
;
i
++
)
{
if
(
!
strcmp
(
v
[
i
],
"-h"
)
||
!
strcmp
(
v
[
i
],
"--help"
))
usage
();
if
(
!
strcmp
(
v
[
i
],
"-d"
))
{
if
(
i
>
n
-
2
)
usage
();
database_filename
=
v
[
++
i
];
continue
;
}
if
(
!
strcmp
(
v
[
i
],
"-ip"
))
{
if
(
i
>
n
-
2
)
usage
();
ip
=
v
[
++
i
];
continue
;
}
if
(
!
strcmp
(
v
[
i
],
"-p"
))
{
if
(
i
>
n
-
2
)
usage
();
port
=
atoi
(
v
[
++
i
]);
continue
;
}
if
(
!
strcmp
(
v
[
i
],
"-on"
))
{
if
(
i
>
n
-
2
)
usage
();
on_off_name
[
on_off_n
]
=
v
[
++
i
];
on_off_action
[
on_off_n
++
]
=
1
;
continue
;
}
if
(
!
strcmp
(
v
[
i
],
"-off"
))
{
if
(
i
>
n
-
2
)
usage
();
on_off_name
[
on_off_n
]
=
v
[
++
i
];
on_off_action
[
on_off_n
++
]
=
0
;
continue
;
}
if
(
!
strcmp
(
v
[
i
],
"-ON"
))
{
on_off_name
[
on_off_n
]
=
NULL
;
on_off_action
[
on_off_n
++
]
=
1
;
continue
;
}
if
(
!
strcmp
(
v
[
i
],
"-OFF"
))
{
on_off_name
[
on_off_n
]
=
NULL
;
on_off_action
[
on_off_n
++
]
=
0
;
continue
;
}
if
(
!
strcmp
(
v
[
i
],
"-debug-gui"
))
{
gui_logd
=
1
;
continue
;
}
usage
();
}
if
(
database_filename
==
NULL
)
{
printf
(
"ERROR: provide a database file (-d)
\n
"
);
exit
(
1
);
}
database
=
parse_database
(
database_filename
);
load_config_file
(
database_filename
);
number_of_events
=
number_of_ids
(
database
);
is_on
=
calloc
(
number_of_events
,
sizeof
(
int
));
if
(
is_on
==
NULL
)
abort
();
h
=
new_handler
(
database
);
g
=
gui_init
();
new_thread
(
gui_thread
,
g
);
ue_data
.
ue
=
0
;
ue_data
.
e
=
&
eg
;
ue_data
.
database
=
database
;
ue_main_gui
(
&
eg
,
g
,
h
,
database
,
&
ue_data
);
for
(
i
=
0
;
i
<
number_of_events
;
i
++
)
{
logger
*
textlog
;
char
*
name
,
*
desc
;
database_get_generic_description
(
database
,
i
,
&
name
,
&
desc
);
if
(
!
strncmp
(
name
,
"LEGACY_"
,
7
))
{
textlog
=
new_textlog
(
h
,
database
,
name
,
desc
);
logger_add_view
(
textlog
,
eg
.
legacy
);
}
free
(
name
);
free
(
desc
);
}
on_off
(
database
,
"UE_PHY_UL_TICK"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_DL_TICK"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_DLSCH_UE_DCI"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_DLSCH_UE_ACK"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_DLSCH_UE_NACK"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_ULSCH_UE_DCI"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_ULSCH_UE_ACK"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_ULSCH_UE_NACK"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_INPUT_SIGNAL"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_DL_CHANNEL_ESTIMATE"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_PDCCH_IQ"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_PDCCH_ENERGY"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_PDSCH_IQ"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_PDSCH_ENERGY"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_PUSCH_TX_POWER"
,
is_on
,
1
);
on_off
(
database
,
"UE_PHY_PUCCH_TX_POWER"
,
is_on
,
1
);
/*
on_off(database, "LEGACY_GROUP_INFO", is_on, 1);
on_off(database, "LEGACY_GROUP_ERROR", is_on, 1);
on_off(database, "LEGACY_GROUP_WARNING", is_on, 1);
*/
view_add_log
(
eg
.
phyview
,
"UE_PHY_UL_TICK"
,
h
,
database
,
is_on
);
view_add_log
(
eg
.
phyview
,
"UE_PHY_DL_TICK"
,
h
,
database
,
is_on
);
view_add_log
(
eg
.
phyview
,
"UE_PHY_DLSCH_UE_DCI"
,
h
,
database
,
is_on
);
view_add_log
(
eg
.
phyview
,
"UE_PHY_DLSCH_UE_ACK"
,
h
,
database
,
is_on
);
view_add_log
(
eg
.
phyview
,
"UE_PHY_DLSCH_UE_NACK"
,
h
,
database
,
is_on
);
view_add_log
(
eg
.
phyview
,
"UE_PHY_ULSCH_UE_DCI"
,
h
,
database
,
is_on
);
view_add_log
(
eg
.
phyview
,
"UE_PHY_ULSCH_UE_ACK"
,
h
,
database
,
is_on
);
view_add_log
(
eg
.
phyview
,
"UE_PHY_ULSCH_UE_NACK"
,
h
,
database
,
is_on
);
/* deactivate those two by default, they are a bit heavy */
//on_off(database, "ENB_MAC_UE_UL_SDU_WITH_DATA", is_on, 0);
//on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 0);
for
(
i
=
0
;
i
<
on_off_n
;
i
++
)
on_off
(
database
,
on_off_name
[
i
],
is_on
,
on_off_action
[
i
]);
ue_data
.
socket
=
-
1
;
ue_data
.
is_on
=
is_on
;
ue_data
.
nevents
=
number_of_events
;
if
(
pthread_mutex_init
(
&
ue_data
.
lock
,
NULL
))
abort
();
setup_event_selector
(
g
,
database
,
is_on
,
is_on_changed
,
&
ue_data
);
restart:
clear_remote_config
();
ue_data
.
socket
=
connect_to
(
ip
,
port
);
/* send the first message - activate selected traces */
is_on_changed
(
&
ue_data
);
/* read messages */
while
(
1
)
{
char
v
[
T_BUFFER_MAX
];
event
e
;
e
=
get_event
(
ue_data
.
socket
,
v
,
database
);
if
(
e
.
type
==
-
1
)
goto
restart
;
if
(
pthread_mutex_lock
(
&
ue_data
.
lock
))
abort
();
handle_event
(
h
,
e
);
if
(
pthread_mutex_unlock
(
&
ue_data
.
lock
))
abort
();
}
return
0
;
}
openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
View file @
15a1af31
...
@@ -738,6 +738,12 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
...
@@ -738,6 +738,12 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
(
int16_t
*
)
ue
->
common_vars
.
dl_ch_estimates_time
[
eNB_offset
][(
p
<<
1
)
+
aarx
],
1
);
(
int16_t
*
)
ue
->
common_vars
.
dl_ch_estimates_time
[
eNB_offset
][(
p
<<
1
)
+
aarx
],
1
);
}
}
#if T_TRACER
T
(
T_ENB_PHY_UL_CHANNEL_ESTIMATE
,
T_INT
(
eNB_id
),
T_INT
(
ue
->
Mod_id
),
T_INT
(
ue
->
proc
.
proc_rxtx
[(
Ns
>>
1
)
&
1
].
frame_rx
),
T_INT
(
ue
->
proc
.
proc_rxtx
[(
Ns
>>
1
)
&
1
].
subframe_rx
),
T_INT
(
0
),
T_BUFFER
(
ue
->
common_vars
.
dl_ch_estimates_time
[
eNB_offset
][
0
][
0
],
512
*
4
));
#endif
return
(
0
);
return
(
0
);
}
}
openair1/PHY/LTE_TRANSPORT/dci.c
View file @
15a1af31
...
@@ -1754,7 +1754,6 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
...
@@ -1754,7 +1754,6 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
LOG_I
(
PHY
,
"subframe %d: pdcch log2_maxh = %d (%d,%d)
\n
"
,
subframe
,
log2_maxh
,
avgP
[
0
],
avgs
);
LOG_I
(
PHY
,
"subframe %d: pdcch log2_maxh = %d (%d,%d)
\n
"
,
subframe
,
log2_maxh
,
avgP
[
0
],
avgs
);
#endif
#endif
for
(
s
=
0
;
s
<
n_pdcch_symbols
;
s
++
)
{
for
(
s
=
0
;
s
<
n_pdcch_symbols
;
s
++
)
{
pdcch_channel_compensation
(
pdcch_vars
[
eNB_id
]
->
rxdataF_ext
,
pdcch_channel_compensation
(
pdcch_vars
[
eNB_id
]
->
rxdataF_ext
,
pdcch_vars
[
eNB_id
]
->
dl_ch_estimates_ext
,
pdcch_vars
[
eNB_id
]
->
dl_ch_estimates_ext
,
...
@@ -1851,6 +1850,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
...
@@ -1851,6 +1850,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
/*#ifdef DEBUG_PHY
/*#ifdef DEBUG_PHY
write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
#endif*/
#endif*/
#ifdef MU_RECEIVER
#ifdef MU_RECEIVER
}
}
...
@@ -1858,6 +1858,11 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
...
@@ -1858,6 +1858,11 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
}
}
T
(
T_UE_PHY_PDCCH_IQ
,
T_INT
(
eNB_id
),
T_INT
(
0
),
T_INT
(
-
1
),
T_INT
(
subframe
),
T_INT
(
0
),
T_BUFFER
(
pdcch_vars
[
eNB_id
]
->
llr
[
0
],
frame_parms
->
N_RB_DL
*
12
*
n_pdcch_symbols
*
4
));
// decode pcfich here
// decode pcfich here
n_pdcch_symbols
=
rx_pcfich
(
frame_parms
,
n_pdcch_symbols
=
rx_pcfich
(
frame_parms
,
subframe
,
subframe
,
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
View file @
15a1af31
...
@@ -629,6 +629,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
...
@@ -629,6 +629,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
status
=
SCH_IDLE
;
}
}
T
(
T_UE_PHY_DLSCH_UE_NACK
,
T_INT
(
0
),
T_INT
(
-
1
),
T_INT
(
subframe
),
T_INT
(
phy_vars_ue
->
Mod_id
),
T_INT
(
dlsch
->
rnti
),
T_INT
(
harq_pid
));
return
((
1
+
dlsch
->
max_turbo_iterations
));
return
((
1
+
dlsch
->
max_turbo_iterations
));
}
else
{
}
else
{
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
status
=
SCH_IDLE
;
...
@@ -640,6 +642,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
...
@@ -640,6 +642,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
{
{
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
subframe
,
harq_pid
,
harq_process
->
round
,
harq_process
->
TBS
);
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
subframe
,
harq_pid
,
harq_process
->
round
,
harq_process
->
TBS
);
}
}
T
(
T_UE_PHY_DLSCH_UE_ACK
,
T_INT
(
0
),
T_INT
(
-
1
),
T_INT
(
subframe
),
T_INT
(
phy_vars_ue
->
Mod_id
),
T_INT
(
dlsch
->
rnti
),
T_INT
(
harq_pid
));
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
}
}
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
View file @
15a1af31
...
@@ -825,6 +825,13 @@ int rx_pdsch(PHY_VARS_UE *ue,
...
@@ -825,6 +825,13 @@ int rx_pdsch(PHY_VARS_UE *ue,
return
(
-
1
);
return
(
-
1
);
break
;
break
;
}
}
T
(
T_UE_PHY_PDSCH_IQ
,
T_INT
(
eNB_id
),
T_INT
(
ue
->
Mod_id
),
T_INT
(
-
1
),
T_INT
(
subframe
),
T_INT
(
nb_rb
),
T_INT
(
frame_parms
->
N_RB_UL
),
T_INT
(
frame_parms
->
symbols_per_tti
),
T_BUFFER
(
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
[
eNB_id
][
0
],
2
*
/* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_tti
*
2
));
return
(
0
);
return
(
0
);
}
}
...
...
openair1/PHY/LTE_TRANSPORT/phich.c
View file @
15a1af31
...
@@ -1414,7 +1414,8 @@ void rx_phich(PHY_VARS_UE *ue,
...
@@ -1414,7 +1414,8 @@ void rx_phich(PHY_VARS_UE *ue,
//LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round);
//LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round);
}
}
}
}
T
(
T_UE_PHY_ULSCH_UE_NACK
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
proc
->
frame_rx
),
T_INT
(
subframe
),
T_INT
(
i
),
T_INT
(
ulsch
->
rnti
),
T_INT
(
harq_pid
));
}
else
{
//ACK
}
else
{
//ACK
if
(
ue
->
ulsch_Msg3_active
[
eNB_id
]
==
1
)
{
if
(
ue
->
ulsch_Msg3_active
[
eNB_id
]
==
1
)
{
...
@@ -1449,7 +1450,8 @@ void rx_phich(PHY_VARS_UE *ue,
...
@@ -1449,7 +1450,8 @@ void rx_phich(PHY_VARS_UE *ue,
// inform MAC?
// inform MAC?
ue
->
ulsch_Msg3_active
[
eNB_id
]
=
0
;
ue
->
ulsch_Msg3_active
[
eNB_id
]
=
0
;
//LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH ACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
T
(
T_UE_PHY_ULSCH_UE_ACK
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
proc
->
frame_rx
),
T_INT
(
subframe
),
T_INT
(
i
),
T_INT
(
ulsch
->
rnti
),
T_INT
(
harq_pid
));
}
}
}
}
...
...
openair1/PHY/defs.h
View file @
15a1af31
...
@@ -124,6 +124,7 @@ static inline void* malloc16_clear( size_t size )
...
@@ -124,6 +124,7 @@ static inline void* malloc16_clear( size_t size )
#include "PHY/TOOLS/defs.h"
#include "PHY/TOOLS/defs.h"
#include "platform_types.h"
#include "platform_types.h"
#define OPENAIR_LTE
#ifdef OPENAIR_LTE
#ifdef OPENAIR_LTE
#include "PHY/LTE_TRANSPORT/defs.h"
#include "PHY/LTE_TRANSPORT/defs.h"
...
...
openair1/SCHED/phy_procedures_lte_ue.c
View file @
15a1af31
...
@@ -1885,6 +1885,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
...
@@ -1885,6 +1885,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX
,
VCD_FUNCTION_IN
);
T
(
T_UE_PHY_UL_TICK
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame_tx
),
T_INT
(
subframe_tx
));
ue
->
generate_ul_signal
[
eNB_id
]
=
0
;
ue
->
generate_ul_signal
[
eNB_id
]
=
0
;
start_meas
(
&
ue
->
phy_proc_tx
);
start_meas
(
&
ue
->
phy_proc_tx
);
...
@@ -2587,7 +2589,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
...
@@ -2587,7 +2589,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
//
dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
//dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
if
((
ue
->
UE_mode
[
eNB_id
]
>
PRACH
)
&&
if
((
ue
->
UE_mode
[
eNB_id
]
>
PRACH
)
&&
(
generate_ue_dlsch_params_from_dci
(
frame_rx
,
(
generate_ue_dlsch_params_from_dci
(
frame_rx
,
subframe_rx
,
subframe_rx
,
...
@@ -2602,6 +2604,12 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
...
@@ -2602,6 +2604,12 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
P_RNTI
,
P_RNTI
,
ue
->
transmission_mode
[
eNB_id
]
<
7
?
0
:
ue
->
transmission_mode
[
eNB_id
])
==
0
))
{
ue
->
transmission_mode
[
eNB_id
]
<
7
?
0
:
ue
->
transmission_mode
[
eNB_id
])
==
0
))
{
T
(
T_UE_PHY_DLSCH_UE_DCI
,
T_INT
(
eNB_id
),
T_INT
(
frame_rx
),
T_INT
(
subframe_rx
),
T_INT
(
ue
->
Mod_id
),
T_INT
(
dci_alloc_rx
[
i
].
rnti
),
T_INT
(
dci_alloc_rx
[
i
].
format
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
]
->
mcs
),
T_INT
(
ue
->
dlsch
[
eNB_id
][
0
]
->
harq_processes
[
ue
->
dlsch
[
eNB_id
][
0
]
->
current_harq_pid
]
->
TBS
));
ue
->
dlsch_received
[
eNB_id
]
++
;
ue
->
dlsch_received
[
eNB_id
]
++
;
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_PHY_PROC
...
@@ -2746,6 +2754,19 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
...
@@ -2746,6 +2754,19 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
LOG_D
(
PHY
,
"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)
\n
"
,
ue
->
Mod_id
,
subframe_rx
);
LOG_D
(
PHY
,
"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)
\n
"
,
ue
->
Mod_id
,
subframe_rx
);
#endif
#endif
LTE_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
uint8_t
harq_pid
=
subframe2harq_pid
(
frame_parms
,
pdcch_alloc2ul_frame
(
frame_parms
,
proc
->
frame_rx
,
proc
->
subframe_rx
),
pdcch_alloc2ul_subframe
(
frame_parms
,
proc
->
subframe_rx
));
T
(
T_UE_PHY_ULSCH_UE_DCI
,
T_INT
(
eNB_id
),
T_INT
(
proc
->
frame_rx
),
T_INT
(
proc
->
subframe_rx
),
T_INT
(
ue
->
Mod_id
),
T_INT
(
dci_alloc_rx
[
i
].
rnti
),
T_INT
(
harq_pid
),
T_INT
(
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
mcs
),
T_INT
(
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
round
),
T_INT
(
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
first_rb
),
T_INT
(
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
nb_rb
),
T_INT
(
ue
->
ulsch
[
eNB_id
]
->
harq_processes
[
harq_pid
]
->
TBS
));
}
}
}
else
if
(
(
dci_alloc_rx
[
i
].
rnti
==
ue
->
ulsch
[
eNB_id
]
->
cba_rnti
[
0
])
&&
}
else
if
(
(
dci_alloc_rx
[
i
].
rnti
==
ue
->
ulsch
[
eNB_id
]
->
cba_rnti
[
0
])
&&
(
dci_alloc_rx
[
i
].
format
==
format0
))
{
(
dci_alloc_rx
[
i
].
format
==
format0
))
{
...
@@ -3312,6 +3333,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
...
@@ -3312,6 +3333,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX
,
VCD_FUNCTION_IN
);
T
(
T_UE_PHY_DL_TICK
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame_rx
),
T_INT
(
subframe_rx
));
T
(
T_UE_PHY_INPUT_SIGNAL
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame_rx
),
T_INT
(
subframe_rx
),
T_INT
(
0
),
T_BUFFER
(
&
ue
->
common_vars
.
rxdata
[
0
][
subframe_rx
*
ue
->
frame_parms
.
samples_per_tti
],
ue
->
frame_parms
.
samples_per_tti
*
4
));
start_meas
(
&
ue
->
phy_proc_rx
);
start_meas
(
&
ue
->
phy_proc_rx
);
...
...
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