From 15a1af31dba8c5d53a96d4081f7f060b0341f072 Mon Sep 17 00:00:00 2001 From: hbilel <haithem.bilel@alcatelonetouch.com> Date: Mon, 12 Dec 2016 19:02:11 +0100 Subject: [PATCH] [OAI-UE] adapt T-tracer to support OAI-UE --- common/utils/T/T_messages.txt | 75 ++ common/utils/T/tracer/Makefile | 7 +- common/utils/T/tracer/ue.c | 728 ++++++++++++++++++ .../lte_dl_channel_estimation.c | 6 + openair1/PHY/LTE_TRANSPORT/dci.c | 7 +- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 5 + .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 7 + openair1/PHY/LTE_TRANSPORT/phich.c | 6 +- openair1/PHY/defs.h | 1 + openair1/SCHED/phy_procedures_lte_ue.c | 28 +- 10 files changed, 865 insertions(+), 5 deletions(-) create mode 100644 common/utils/T/tracer/ue.c diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index d1807080bc..014c616e54 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -1938,3 +1938,78 @@ ID = VCD_FUNCTION_RECV_IF5 DESC = VCD function RECV_IF5 GROUP = ALL:VCD:ENB:VCD_FUNCTION 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 diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile index 71f1d25f92..f6c65f6400 100644 --- a/common/utils/T/tracer/Makefile +++ b/common/utils/T/tracer/Makefile @@ -5,7 +5,7 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I. 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 $(CC) $(CFLAGS) -o record $^ $(LIBS) @@ -26,6 +26,11 @@ enb: utils.o enb.o database.o event.o handler.o config.o \ filter/filter.a $(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 \ event_selector.o view/view.a gui/gui.a logger/logger.a \ filter/filter.a diff --git a/common/utils/T/tracer/ue.c b/common/utils/T/tracer/ue.c new file mode 100644 index 0000000000..a36df6a2cb --- /dev/null +++ b/common/utils/T/tracer/ue.c @@ -0,0 +1,728 @@ +#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 = ⪚ + 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; +} diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 45ed0f11c0..6067aba917 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -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); } +#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); } diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 7558367817..c511afba5e 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -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); #endif - for (s=0; s<n_pdcch_symbols; s++) { pdcch_channel_compensation(pdcch_vars[eNB_id]->rxdataF_ext, pdcch_vars[eNB_id]->dl_ch_estimates_ext, @@ -1851,6 +1850,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars, /*#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); #endif*/ + #ifdef MU_RECEIVER } @@ -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 n_pdcch_symbols = rx_pcfich(frame_parms, subframe, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 4a80110b22..48ea525fe8 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -629,6 +629,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, 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)); } else { harq_process->status = SCH_IDLE; @@ -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); } + 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); } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 33d7985768..2415007d71 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -825,6 +825,13 @@ int rx_pdsch(PHY_VARS_UE *ue, return(-1); 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); } diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 989567ca34..f896fc84ee 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -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); } } - + 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 if (ue->ulsch_Msg3_active[eNB_id] == 1) { @@ -1449,7 +1450,8 @@ void rx_phich(PHY_VARS_UE *ue, // inform MAC? 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)); } } diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index daf560a736..846e0be1ba 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -124,6 +124,7 @@ static inline void* malloc16_clear( size_t size ) #include "PHY/TOOLS/defs.h" #include "platform_types.h" +#define OPENAIR_LTE #ifdef OPENAIR_LTE #include "PHY/LTE_TRANSPORT/defs.h" diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 1c6aa6b20c..8b8f948c5e 100644 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -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); + 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; 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 - // 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) && (generate_ue_dlsch_params_from_dci(frame_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 P_RNTI, 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]++; #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 LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); #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]) && (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 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); -- 2.26.2