diff --git a/ci-scripts/checkAddedWarnings.sh b/ci-scripts/checkAddedWarnings.sh
index d366059a85..bda8287a78 100755
--- a/ci-scripts/checkAddedWarnings.sh
+++ b/ci-scripts/checkAddedWarnings.sh
@@ -110,7 +110,7 @@ MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-sta
NB_WARNINGS_FILES=0
# Retrieve list of warnings
-LIST_WARNING_FILES=`egrep "error:|warning:" archives/*/*.Rel15.txt archives/*/basic_simulator_*txt | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | sed -e "s#^.*/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" -e "s#common/utils/.*/itti#common/utils/itti#" | awk -F ":" '{print $1}' | sort | uniq`
+LIST_WARNING_FILES=`egrep "error:|warning:" archives/*/*.Rel15.txt | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | sed -e "s#^.*/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" -e "s#common/utils/.*/itti#common/utils/itti#" | awk -F ":" '{print $1}' | sort | uniq`
echo ""
echo "List of files that have been modified by the Merge Request AND"
diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh
index 0a75ff25b7..44d200c3b6 100755
--- a/ci-scripts/reportBuildLocally.sh
+++ b/ci-scripts/reportBuildLocally.sh
@@ -53,7 +53,7 @@ function details_table {
echo "
Message | " >> $3
echo " " >> $3
- LIST_MESSAGES=`egrep "error:|warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto"`
+ LIST_MESSAGES=`egrep "error:|warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto|disabling jobserver mode"`
COMPLETE_MESSAGE="start"
for MESSAGE in $LIST_MESSAGES
do
@@ -146,7 +146,7 @@ function summary_table_row {
else
echo " $NB_ERRORS" >> ./build_results.html
fi
- NB_WARNINGS=`egrep "warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | egrep -c "warning:"`
+ NB_WARNINGS=`egrep "warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto|disabling jobserver mode" | egrep -c "warning:"`
if [ $NB_WARNINGS -eq 0 ]
then
echo " | $NB_WARNINGS" >> ./build_results.html
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index d3c589a63f..1b90f18a5d 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -185,7 +185,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU
# set a flag for changes in the source code
# these changes are related to hardcoded path to include .h files
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3")
-set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -Og -fno-delete-null-pointer-checks")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -O0 -fno-delete-null-pointer-checks")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3")
set(GIT_BRANCH "UNKNOWN")
@@ -2247,20 +2247,20 @@ add_library(SIMU_COMMON
# Simulation library
##########################
set (SIMUSRC
-${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/channel_sim.c
-${OPENAIR1_DIR}/SIMULATION/RF/rf.c
-${OPENAIR1_DIR}/SIMULATION/RF/dac.c
-${OPENAIR1_DIR}/SIMULATION/RF/adc.c
-#${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
-)
+ ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
+ ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c
+ ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c
+ ${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c
+ ${OPENAIR1_DIR}/SIMULATION/TOOLS/channel_sim.c
+ ${OPENAIR1_DIR}/SIMULATION/RF/rf.c
+ ${OPENAIR1_DIR}/SIMULATION/RF/dac.c
+ ${OPENAIR1_DIR}/SIMULATION/RF/adc.c
+ #${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
+ )
# Simulation library
##########################
-add_library( SIMU SHARED ${SIMUSRC} )
+add_library(SIMU SHARED ${SIMUSRC} )
add_library(SIMU_ETH
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
@@ -2638,7 +2638,8 @@ target_link_libraries (lte-uesoftmodem
-Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
- PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
+
+ PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
-Wl,--end-group z dl)
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 9a5d5f370c..20d965c71c 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -406,7 +406,7 @@ function main() {
shift 1;;
-k | --skip-shared-libraries)
SKIP_SHARED_LIB_FLAG="True"
- echo_info "Skipping build of shared libraries, rfsimulator, basicsimulator and transport protocol libraries"
+ echo_info "Skipping build of shared libraries, rfsimulator and transport protocol libraries"
shift;;
--ninja)
CMAKE_CMD="$CMAKE_CMD -GNinja"
@@ -896,7 +896,7 @@ function main() {
$build_dir rfsimulator \
librfsimulator.so $dbin/librfsimulator.so.$REL
- echo_info "Compiling basicsimulator"
+ echo_info "Compiling tcp_bridge_oai"
compilations \
$build_dir tcp_bridge_oai \
libtcp_bridge_oai.so $dbin/libtcp_bridge_oai.so.$REL
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 20bc5dc2b9..5a59b9a8cc 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -150,7 +150,9 @@ clean_all_files() {
set_openair_env
dir=$OPENAIR_DIR/cmake_targets
rm -rf $dir/log $OPENAIR_DIR/targets/bin/*
- rm -rf $dir/ran_build $dir/lte-simulators/build
+ rm -rf $dir/ran_build $dir/ran_build_noLOG
+ rm -rf $dir/lte-simulators/build
+ rm -rf $dir/phy_simulators/build $dir/nas_sim_tools/build
rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build
}
@@ -167,7 +169,7 @@ check_warnings() {
#we look for 'warning:' in the compilation log file
#this is how gcc starts a warning
#this is not perfect, we may get false positive
- warning_count=`grep "warning:" "$1"|wc -l`
+ warning_count=`grep "warning:" "$1" | egrep -v "jobserver unavailable|disabling jobserver mode" | wc -l`
if [ $warning_count -gt 0 ]; then
echo_error "WARNING: $warning_count warnings. See $1"
fi
@@ -177,7 +179,6 @@ compilations() {
cd $OPENAIR_DIR/cmake_targets/$1/build
set +e
{
- rm -f $3
if [ "$BUILD_COVERITY_SCAN" == "1" ]; then
COV_SCAN_PREFIX="cov-build --dir cov-int"
else
diff --git a/common/ran_context.h b/common/ran_context.h
index 4819db6960..e8d8ed0653 100644
--- a/common/ran_context.h
+++ b/common/ran_context.h
@@ -113,11 +113,11 @@ typedef struct {
// LTS: not coherent (xxx_frame_parms cardinatlity wtih xNB (so one carrier))
struct RU_t_s **ru;
/// Mask to indicate fronthaul setup status of RU (hard-limit to 64 RUs)
- //uint64_t ru_mask;
+ uint64_t ru_mask;
/// Mutex for protecting ru_mask
- //pthread_mutex_t ru_mutex;
+ pthread_mutex_t ru_mutex;
/// condition variable for signaling setup completion of an RU
- //pthread_cond_t ru_cond;
+ pthread_cond_t ru_cond;
} RAN_CONTEXT_t;
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index dbee6f1e6f..761420a703 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -634,7 +634,7 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
int computeSamplesShift(PHY_VARS_NR_UE *UE) {
if (IS_SOFTMODEM_RFSIM) {
- LOG_E(PHY,"SET rx_offset %d \n",UE->rx_offset);
+ LOG_D(PHY,"SET rx_offset %d \n",UE->rx_offset);
//UE->rx_offset_diff=0;
return 0;
}
@@ -857,8 +857,9 @@ void *UE_thread(void *arg) {
usleep(200);
}
- if ( decoded_frame_rx != curMsg->proc.frame_rx &&
- ((decoded_frame_rx+1) % MAX_FRAME_NUMBER) != curMsg->proc.frame_rx )
+ if ( (decoded_frame_rx != curMsg->proc.frame_rx) &&
+ (((decoded_frame_rx+1) % MAX_FRAME_NUMBER) != curMsg->proc.frame_rx) &&
+ (((decoded_frame_rx+2) % MAX_FRAME_NUMBER) != curMsg->proc.frame_rx))
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
decoded_frame_rx, curMsg->proc.frame_rx );
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 9b2b704833..2eaf624404 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -76,37 +76,12 @@ unsigned short config_frames[4] = {2,9,11,13};
#include
#include
-#include
-
-
/* Callbacks, globals and object handlers */
-extern void reset_stats( FL_OBJECT *, long );
-//extern void initTpool(char *params, tpool_t *pool, bool performanceMeas);
-
-/* Forms and Objects */
-
-typedef struct {
- FL_FORM *stats_form;
- void *vdata;
- char *cdata;
- long ldata;
- FL_OBJECT *stats_text;
- FL_OBJECT *stats_button;
-} FD_stats_form;
-
-extern FD_stats_form *create_form_stats_form( void );
-
#include "PHY/TOOLS/nr_phy_scope.h"
//#include "stats.h"
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
// at eNB 0, an UL scope for every UE
-FD_phy_scope_nrue *form_nrue[NUMBER_OF_UE_MAX];
-//FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
-//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
-char title[255];
-static pthread_t forms_thread; //xforms
-
#include
#include "executables/softmodem-common.h"
#include "executables/thread-common.h"
@@ -304,35 +279,6 @@ void reset_stats(FL_OBJECT *button, long arg) {
}*/
}
-static void *scope_thread(void *arg) {
- sleep(5);
-
- while (!oai_exit) {
- phy_scope_nrUE(form_nrue[0],
- PHY_vars_UE_g[0][0],
- 0,0,1);
- usleep(100*1000);
- }
-
- pthread_exit((void *)arg);
-}
-
-
-void init_scope(void) {
- int fl_argc=1;
-
- if (do_forms==1) {
- char *name="5G-UE-scope";
- fl_initialize (&fl_argc, &name, NULL, 0, 0);
- int UE_id = 0;
- form_nrue[UE_id] = create_phy_scope_nrue();
- sprintf (title, "NR DL SCOPE UE");
- fl_show_form (form_nrue[UE_id]->phy_scope_nrue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
- threadCreate(&forms_thread, scope_thread, NULL, "scope", -1, OAI_PRIORITY_RT_LOW);
- }
-
-}
-
void *l2l1_task(void *arg) {
MessageDef *message_p = NULL;
int result;
@@ -782,7 +728,8 @@ int main( int argc, char **argv ) {
memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
configure_linux();
mlockall(MCL_CURRENT | MCL_FUTURE);
- init_scope();
+ if (do_forms)
+ init_scope(PHY_vars_UE_g[0][0]);
number_of_cards = 1;
for(int CC_id=0; CC_idQm,
pdsch_vars[eNB_id]->llr_length[symbol],
pdsch_vars[eNB_id]->llr_offset[symbol],
(int16_t*)pdsch_vars[eNB_id]->llr[0],
- pllr_symbol_cw0);
- */
+ pllr_symbol_cw0,
+ signal_energy(pdsch_vars[eNB_id]->rxdataF_comp0[0], 7*2*frame_parms->N_RB_DL*12));
switch (dlsch0_harq->Qm) {
case 2 :
if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 034d41e114..5c18160d66 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -339,7 +339,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
#endif
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
+ dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
@@ -363,7 +363,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
dft(dftsize,(int16_t *)tmp_dft_in,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
+ dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
}
#if UE_TIMING_TRACE
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index c704efdb1f..fcd61b33bf 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -669,14 +669,16 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->llr_offset[symbol] = len*dlsch0_harq->Qm + llr_offset_symbol;
- /*LOG_I(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n",
+ LOG_I(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x energy %d\n",
symbol,
nb_rb,dlsch0_harq->Qm,
pdsch_vars[eNB_id]->llr_length[symbol],
pdsch_vars[eNB_id]->llr_offset[symbol],
(int16_t*)pdsch_vars[eNB_id]->llr[0],
- pllr_symbol_cw0);*/
-
+ pllr_symbol_cw0,
+ signal_energy(pdsch_vars[eNB_id]->rxdataF_comp0[0], 7*2*frame_parms->N_RB_DL*12));
+ //if (ue->current_thread_id[nr_tti_rx] ==0 )
+ //phy_scope_nrUE(NULL, ue, 0, 0, 0);
/*printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
symbol,
nb_rb,dlsch0_harq->Qm,
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index 027354ef77..02cf000f37 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -9,6 +9,8 @@
*
* http://www.openairinterface.org/?page_id=698
*
+ * Author and copyright: Laurent Thomas, open-cells.com
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -26,6 +28,7 @@
#include "executables/nr-softmodem-common.h"
#define TPUT_WINDOW_LENGTH 100
+#define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
int otg_enabled;
FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
@@ -36,16 +39,34 @@ float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_ue_max[NUMBER_OF_UE_MAX] = {0};
-void drawsymbol(FL_OBJECT *obj, int id,
+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);
+} OAIgraph_t;
+
+/* Forms and Objects */
+typedef struct {
+ FL_FORM *phy_scope;
+ OAIgraph_t graph[20];
+ FL_OBJECT *button_0;
+} FD_phy_scope_t;
+
+typedef struct {
+ FL_FORM *stats_form;
+ void *vdata;
+ char *cdata;
+ long ldata;
+ FL_OBJECT *stats_text;
+ FL_OBJECT *stats_button;
+} FD_stats_form;
+
+static void drawsymbol(FL_OBJECT *obj, int id,
FL_POINT *p, int n, int w, int h) {
fl_points( p, n, FL_YELLOW);
}
-
-
-static void ia_receiver_on_off( FL_OBJECT *button, long arg)
-{
-
+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;
@@ -57,9 +78,7 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg)
}
}
-static void dl_traffic_on_off( FL_OBJECT *button, long arg)
-{
-
+static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
fl_set_object_label(button, "DL Traffic ON");
otg_enabled = 1;
@@ -71,224 +90,168 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg)
}
}
-FD_phy_scope_gnb *create_phy_scope_gnb( void )
-{
-
- FL_OBJECT *obj;
- FD_phy_scope_gnb *fdui = fl_malloc( sizeof *fdui );
-
- // Define form
- fdui->phy_scope_gnb = 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 );
-
- // Received signal
- fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
- fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
- fl_set_xyplot_symbol(fdui->rxsig_t, 0, drawsymbol);
- // Time-domain channel response
- fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "SRS Frequency Response (samples, abs)" );
- fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
- fl_set_xyplot_symbol(fdui->chest_t, 0, drawsymbol);
-
- // Frequency-domain channel response
- fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" );
- fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds( fdui->chest_f,30,70);
- fl_set_xyplot_symbol(fdui->chest_f, 0, drawsymbol);
-
-
- // LLR of PUSCH
- fdui->pusch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 200, "PUSCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pusch_llr, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pusch_llr, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pusch_llr, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pusch_llr,2);
- fl_set_xyplot_symbol(fdui->pusch_llr, 0, drawsymbol);
-
-
- // I/Q PUSCH comp
- fdui->pusch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 200, "PUSCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pusch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pusch_comp, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pusch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pusch_comp,2);
- fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
-
- // I/Q PUCCH comp (format 1)
- fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH1 Energy (SR)" );
- fl_set_object_boxtype( fdui->pucch_comp1, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pucch_comp1, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pucch_comp1,2);
- fl_set_xyplot_symbol(fdui->pucch_comp1, 0, drawsymbol);
-
- // fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
-
- // I/Q PUCCH comp (fromat 1a/b)
- fdui->pucch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 600, 240, 100, "PUCCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pucch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pucch_comp, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pucch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pucch_comp,2);
- fl_set_xyplot_symbol(fdui->pucch_comp, 0, drawsymbol);
-
- // fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
-
- // Throughput on PUSCH
- fdui->pusch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 480, 500, 100, "PUSCH Throughput [frame]/[kbit/s]" );
- fl_set_object_boxtype( fdui->pusch_tput, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pusch_tput, FL_BLACK, FL_WHITE );
- fl_set_object_lcolor( fdui->pusch_tput, FL_WHITE ); // Label color
- fl_set_xyplot_symbol(fdui->pusch_tput, 0, drawsymbol);
-
-
- // Generic eNB Button
- 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_gnb->fdui = fdui;
-
- return fdui;
+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);
+ return graph;
}
-void phy_scope_gNB(FD_phy_scope_gnb *form,
+static OAIgraph_t gNBcommonGraph( void (*funct) (FL_OBJECT *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;
+ return graph;
+}
+
+static OAIgraph_t nrUEcommonGraph( void (*funct) (FL_OBJECT *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;
+ 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)
-{
- NR_DL_FRAME_PARMS *frame_parms = &phy_vars_gnb->frame_parms;
- //int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
+ RU_t *phy_vars_ru,
+ int UE_id) {
+ static FD_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].graph, phy_vars_gnb, phy_vars_ru, UE_id);
+ i++;
+ }
+
+ fl_check_forms();
+}
+
+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;
+
+ NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- //uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE
- // float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
- // uint32_t total_dlsch_bitrate = phy_vars_gnb->total_dlsch_bitrate;
- // uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
- int Qm = 2;
+ int16_t **rxsig_t = phy_vars_ru->common.rxdata;
+ float rxsig_t_dB[nb_antennas_rx][frame_parms->samples_per_frame];
+ float time[frame_parms->samples_per_frame];
+
+ if (rxsig_t[0] != NULL) {
+ for (int i=0; isamples_per_frame; i++) {
+ rxsig_t_dB[0][i] = 10*log10(1.0+(float) ((rxsig_t[0][2*i])*(rxsig_t[0][2*i])+
+ (rxsig_t[0][2*i+1])*(rxsig_t[0][2*i+1])));
+ time[i] = (float) i;
+ }
+
+ fl_set_xyplot_data(graph,time,rxsig_t_dB[0],frame_parms->samples_per_frame,"","","");
+ }
+
+ for (int arx=1; arxsamples_per_frame; i++) {
+ rxsig_t_dB[arx][i] = 10*log10(1.0+(float) ((rxsig_t[arx][2*i])*(rxsig_t[arx][2*i])+
+ (rxsig_t[arx][2*i+1])*(rxsig_t[arx][2*i+1])));
+ }
+
+ fl_add_xyplot_overlay(graph,arx,time,rxsig_t_dB[arx],frame_parms->samples_per_frame,rx_antenna_colors[arx]);
+ }
+ }
+}
+
+static void timeResponse (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
+ // Channel Impulse Response
+ 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;
+ int16_t **chest_t = (int16_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[nb_antennas_rx][2*frame_parms->ofdm_symbol_size];
+
+ if (chest_t[0] !=NULL) {
+ for (int i=0; i<(2*frame_parms->ofdm_symbol_size); i++) {
+ //i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
+ int i2=i;
+ //time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
+ time2[i] = (float)i;
+ chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1]));
+
+ if (chest_t_abs[0][i] > ymax)
+ ymax = chest_t_abs[0][i];
+ }
+
+ fl_set_xyplot_data(graph,time2,chest_t_abs[0],(2*frame_parms->ofdm_symbol_size),"","","");
+ }
+
+ for (int arx=1; arxofdm_symbol_size>>3); i++) {
+ chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
+
+ if (chest_t_abs[arx][i] > ymax)
+ ymax = chest_t_abs[arx][i];
+ }
+
+ fl_add_xyplot_overlay(graph,arx,time2,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
+ fl_set_xyplot_overlay_type(graph,arx,FL_DASHED_XYPLOT);
+ }
+ }
+
+ // Avoid flickering effect
+ // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
+ fl_set_xyplot_ybounds(graph,0,ymax);
+}
+
+static void frequencyResponse (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
+ // Channel Frequency Response
+ if (!phy_vars_ru->common.rxdataF)
+ return;
+
+ NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
+ uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
+ int16_t **rxsig_f = (int16_t **) phy_vars_ru->common.rxdataF;
+ float rxsig_f_dB[nb_antennas_rx][frame_parms->samples_per_slot_wCP];
+ float time[frame_parms->samples_per_slot_wCP];
+
+ if (rxsig_f[0] != NULL) {
+ for (int i=0; isamples_per_slot_wCP; i++) {
+ rxsig_f_dB[0][i] = 10*log10(1.0+(float) ((rxsig_f[0][2*i])*(rxsig_f[0][2*i])+(rxsig_f[0][2*i+1])*(rxsig_f[0][2*i+1])));
+ time[i] = (float) i;
+ }
+
+ fl_set_xyplot_data(graph,time,rxsig_f_dB[0],frame_parms->samples_per_slot_wCP,"","","");
+ }
/*
- if (!RC.nrmac[0]->UE_info.active[UE_id])
- return;
-
- // choose max MCS to compute coded_bits_per_codeword
- if (phy_vars_gnb->ulsch[UE_id][0]!=NULL) {
- for (harq_pid=0; harq_pid<3; harq_pid++) {
- //Qm = cmax(phy_vars_gnb->ulsch[UE_id][0]->harq_processes->Qm,Qm);
- }
- }
- */
- int32_t *pucch1_thres = (int32_t*) NULL; // phy_vars_gnb->pucch1_stats_thres[UE_id];
-
-
- // Received signal in time domain of receive antenna 0
- if (phy_vars_ru->common.rxdata) {
- int16_t **rxsig_t = phy_vars_ru->common.rxdata;
- float rxsig_t_dB[nb_antennas_rx][frame_parms->samples_per_frame];
- float time[frame_parms->samples_per_frame];
- if (rxsig_t[0] != NULL) {
- for (int i=0; isamples_per_frame; i++) {
- rxsig_t_dB[0][i] = 10*log10(1.0+(float) ((rxsig_t[0][2*i])*(rxsig_t[0][2*i])+(rxsig_t[0][2*i+1])*(rxsig_t[0][2*i+1])));
- time[i] = (float) i;
- }
-
- fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],frame_parms->samples_per_frame,"","","");
- }
-
- for (int arx=1; arxsamples_per_frame; i++) {
- rxsig_t_dB[arx][i] = 10*log10(1.0+(float) ((rxsig_t[arx][2*i])*(rxsig_t[arx][2*i])+(rxsig_t[arx][2*i+1])*(rxsig_t[arx][2*i+1])));
- }
-
- fl_add_xyplot_overlay(form->rxsig_t,arx,time,rxsig_t_dB[arx],frame_parms->samples_per_frame,rx_antenna_colors[arx]);
- }
- }
- }
-
- // Channel Impulse Response
- if (phy_vars_gnb->pusch_vars[UE_id]->ul_ch_estimates_time) {
- int16_t **chest_t = (int16_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[nb_antennas_rx][2*frame_parms->ofdm_symbol_size];
-
- if (chest_t[0] !=NULL) {
- for (int i=0; i<(2*frame_parms->ofdm_symbol_size); i++) {
- //i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size;
- int i2=i;
- //time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1));
- time2[i] = (float)i;
- chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1]));
-
- if (chest_t_abs[0][i] > ymax)
- ymax = chest_t_abs[0][i];
- }
-
- fl_set_xyplot_data(form->chest_t,time2,chest_t_abs[0],(2*frame_parms->ofdm_symbol_size),"","","");
- }
-
- for (int arx=1; arxofdm_symbol_size>>3); i++) {
- chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1]));
-
- if (chest_t_abs[arx][i] > ymax)
- ymax = chest_t_abs[arx][i];
- }
-
- fl_add_xyplot_overlay(form->chest_t,arx,time2,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
- fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
- }
- }
-
- // Avoid flickering effect
- // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
- fl_set_xyplot_ybounds(form->chest_t,0,ymax);
- }
-
- // Channel Frequency Response
- if (phy_vars_ru->common.rxdataF) {
- int16_t **rxsig_f = (int16_t**) phy_vars_ru->common.rxdataF;
- float rxsig_f_dB[nb_antennas_rx][frame_parms->samples_per_slot_wCP];
- float time[frame_parms->samples_per_slot_wCP];
- if (rxsig_f[0] != NULL) {
- for (int i=0; isamples_per_slot_wCP; i++) {
- rxsig_f_dB[0][i] = 10*log10(1.0+(float) ((rxsig_f[0][2*i])*(rxsig_f[0][2*i])+(rxsig_f[0][2*i+1])*(rxsig_f[0][2*i+1])));
- time[i] = (float) i;
- }
-
- fl_set_xyplot_data(form->chest_t,time,rxsig_f_dB[0],frame_parms->samples_per_slot_wCP,"","","");
- }
-
- /*
for (arx=0; arxchest_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);
@@ -296,532 +259,510 @@ void phy_scope_gNB(FD_phy_scope_gnb *form,
fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ fl_add_xyplot_overlay(form->chest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
// other tx antennas
if (nb_antennas_tx > 1) {
- if (nb_antennas_rx > 1) {
- for (atx=1; atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
- }
- } else { // 1 rx antenna
- atx=1;
- arx=0;
- fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
+ if (nb_antennas_rx > 1) {
+ for (atx=1; atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
}
- */
- }
+ }
+ } else { // 1 rx antenna
+ atx=1;
+ arx=0;
+ fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
+ }
+ }
+ */
+}
+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) {
- int16_t *pusch_llr = (int16_t*) phy_vars_gnb->pusch_vars[UE_id]->llr;
-
- int coded_bits_per_codeword = 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 i=0; ipusch_llr,bit,llr,coded_bits_per_codeword,"","","");
+ if (!phy_vars_gnb->pusch_vars[UE_id]->llr)
+ return;
+
+ NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
+ int Qm = 2;
+ int16_t *pusch_llr = (int16_t *) phy_vars_gnb->pusch_vars[UE_id]->llr;
+ int coded_bits_per_codeword = 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 i=0; ipusch_vars[UE_id]->rxdataF_comp) {
- int32_t *pusch_comp = (int32_t*) phy_vars_gnb->pusch_vars[UE_id]->rxdataF_comp;
+ if (!phy_vars_gnb->pusch_vars[UE_id]->rxdataF_comp)
+ return;
- int sz=frame_parms->symbols_per_tti*12*frame_parms->N_RB_UL;
- float I[sz], Q[sz];
- int ind=0;
+ NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
+ int32_t *pusch_comp = (int32_t *) phy_vars_gnb->pusch_vars[UE_id]->rxdataF_comp;
+ int sz=frame_parms->symbols_per_tti*12*frame_parms->N_RB_UL;
+ float I[sz], Q[sz];
+ int ind=0;
- for (int k=0; ksymbols_per_tti; k++) {
- for (int i=0; i<12*frame_parms->N_RB_UL; i++) {
- I[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i];
- Q[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i+1];
- ind++;
- }
+ for (int k=0; ksymbols_per_tti; k++) {
+ for (int i=0; i<12*frame_parms->N_RB_UL; i++) {
+ I[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i];
+ Q[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i+1];
+ ind++;
}
-
- fl_set_xyplot_data(form->pusch_comp,I,Q,ind,"","","");
}
+ fl_set_xyplot_data(graph,I,Q,ind,"","","");
+
// PUSCH I/Q of MF Output
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];
-
+ 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];
- for (int ind=0; ind<10240; ind++) {
+ for (int ind=0; ind<10240; ind++) {
I_pucch[ind] = (float)pucch1ab_comp[2*(ind)];
Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1];
A_pucch[ind] = pucch1_comp?(10*log10(pucch1_comp[ind])):0;
B_pucch[ind] = ind;
+ int32_t *pucch1_thres = (int32_t *) NULL; // phy_vars_gnb->pucch1_stats_thres[UE_id];
C_pucch[ind] = pucch1_thres?(float)pucch1_thres[ind]:0;
}
- fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","","");
- fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","","");
- fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED);
- fl_set_xyplot_ybounds(form->pucch_comp,-5000,5000);
- fl_set_xyplot_xbounds(form->pucch_comp,-5000,5000);
- fl_set_xyplot_ybounds(form->pucch_comp1,0,80);
+ fl_set_xyplot_data(graph,I_pucch,Q_pucch,10240,"","","");
+ fl_set_xyplot_data(graph,B_pucch,A_pucch,1024,"","","");
+ fl_add_xyplot_overlay(graph,1,B_pucch,C_pucch,1024,FL_RED);
+ fl_set_xyplot_ybounds(graph,-5000,5000);
+ fl_set_xyplot_xbounds(graph,-5000,5000);
+ fl_set_xyplot_ybounds(graph,0,80);
}
+}
+static void pucchEnergy (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
+}
+static void pucchIQ (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
+}
+
+static void puschThroughtput (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
// 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;
-// tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
-
- fl_set_xyplot_data(form->pusch_tput,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","","");
-
+ // tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0;
+ 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);
-
- fl_check_forms();
}
-FD_phy_scope_nrue *create_phy_scope_nrue( void )
-{
-
+static FD_phy_scope_t *create_phy_scope_gnb(int UE_id ) {
FL_OBJECT *obj;
- FD_phy_scope_nrue *fdui = fl_malloc( sizeof *fdui );
-
+ FD_phy_scope_t *fdui = fl_malloc( sizeof *fdui );
// Define form
- fdui->phy_scope_nrue = fl_bgn_form( FL_NO_BOX, 800, 900 );
-
+ 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, 900, "" );
+ obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 800, "" );
fl_set_object_color( obj, FL_BLACK, FL_BLACK );
-
// Received signal
- fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" );
- fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
- fl_set_xyplot_symbol(fdui->rxsig_t, 0, drawsymbol);
-
-
+ fdui->graph[0] = gNBcommonGraph( timeSignal, FL_IMPULSE_XYPLOT, 20, 20, 370, 100,
+ "Received Signal (Time-Domain, dB)", FL_RED );
// Time-domain channel response
- fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
- fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color
- fl_set_xyplot_symbol(fdui->chest_t, 0, drawsymbol);
-
-
+ fdui->graph[1] = gNBcommonGraph( timeResponse, FL_NORMAL_XYPLOT, 410, 20, 370, 100,
+ "SRS Frequency Response (samples, abs)", FL_RED );
// Frequency-domain channel response
- fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency data (RE, dB)" );
- fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED );
- fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds( fdui->chest_f,30,70);
- fl_set_xyplot_symbol(fdui->chest_f, 0, drawsymbol);
+ fdui->graph[2] = gNBcommonGraph( frequencyResponse, FL_IMPULSE_XYPLOT, 20, 140, 760, 100,
+ "Channel Frequency Response (RE, dB)", FL_RED );
+ // LLR of PUSCH
+ fdui->graph[3] = gNBcommonGraph( puschLLR, FL_POINTS_XYPLOT, 20, 260, 500, 200,
+ "PUSCH Log-Likelihood Ratios (LLR, mag)", FL_YELLOW );
+ // I/Q PUSCH comp
+ fdui->graph[4] = gNBcommonGraph( puschIQ, FL_POINTS_XYPLOT, 540, 260, 240, 200,
+ "PUSCH I/Q of MF Output", FL_YELLOW );
+ // I/Q PUCCH comp (format 1)
+ fdui->graph[5] = gNBcommonGraph( pucchEnergy, FL_POINTS_XYPLOT, 540, 480, 240, 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, 540, 600, 240, 100,
+ "PUCCH I/Q of MF Output", FL_YELLOW );
+ // Throughput on PUSCH
+ fdui->graph[7] = gNBcommonGraph( puschThroughtput, FL_NORMAL_XYPLOT, 20, 480, 500, 100,
+ "PUSCH Throughput [frame]/[kbit/s]", FL_WHITE );
+ fdui->graph[8].graph=NULL;
- // LLR of PBCH
- fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN );
- fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pbch_llr,2);
- fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR);
- //fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920);
- fl_set_xyplot_symbol(fdui->pbch_llr, 0, drawsymbol);
-
-
- // I/Q PBCH comp
- fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN );
- fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pbch_comp,2);
- // fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100);
- // fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100);
-
- // LLR of PDCCH
- fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN );
- fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdcch_llr,2);
- fl_set_xyplot_symbol(fdui->pdcch_llr, 0, drawsymbol);
-
-
- // I/Q PDCCH comp
- fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN );
- fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdcch_comp,2);
- fl_set_xyplot_xgrid( fdui->pdcch_comp,FL_GRID_MAJOR);
- fl_set_xyplot_symbol(fdui->pdcch_comp, 0, drawsymbol);
-
-
- // LLR of PDSCH
- fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" );
- fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdsch_llr,2);
- fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR);
- fl_set_xyplot_symbol(fdui->pdsch_llr, 0, drawsymbol);
-
-
- // I/Q PDSCH comp
- fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500, 240, 200, "PDSCH I/Q of MF Output" );
- fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW );
- fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color
- fl_set_xyplot_symbolsize( fdui->pdsch_comp,2);
- fl_set_xyplot_symbol(fdui->pdsch_comp, 0, drawsymbol);
-
-
- // Throughput on PDSCH
- fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" );
- fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX );
- fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE );
- fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color
- fl_set_xyplot_symbol(fdui->pdsch_tput, 0, drawsymbol);
-
-
- // Generic UE Button
- 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;
- fl_set_button(fdui->button_0,0);
- fl_set_object_label(fdui->button_0, "IA Receiver OFF");
- 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);
+ // 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_nrue->fdui = fdui;
-
+ 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);
return fdui;
}
-void phy_scope_nrUE(FD_phy_scope_nrue *form,
- PHY_VARS_NR_UE *phy_vars_ue,
- int eNB_id,
- int UE_id,
- uint8_t subframe)
-{
- int i,arx,atx,ind,k;
- NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
- //int nsymb_ce = frame_parms->ofdm_symbol_size;//*frame_parms->symbols_per_tti;
- int samples_per_frame = frame_parms->samples_per_frame;
- uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_gNB;
- //int16_t *pdsch_mag;
- int num_pdcch_symbols=2;
- int symbol, first_symbol=2,nb_re;
- int nb_rb_pdsch=50,nb_symb_sch=9;
- float ymax=1;
- static int overlay = 0;
- /*
- int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
- int mcs = 0;
- unsigned char harq_pid = 0;
- */
+static FD_phy_scope_t *form_gnb[NUMBER_OF_UE_MAX]= {0};
+static unsigned char scope_enb_num_ue = 1;
- /*
- if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
- harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid;
+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
- if (harq_pid>=8)
- return;
+ while (!oai_exit) {
+ int ue_cnt=0;
- mcs = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs;
-
- // Button 0
- if(!phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) {
- // we are in TM5
- fl_show_object(form->button_0);
+ for(int UE_id=0; UE_idgNB, p->ru, UE_id);
+ ue_cnt++;
+ }
}
+
+ usleep(99*1000);
}
- if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) {
- num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
- }
+ // printf("%s",stats_buffer);
+ /*#ifdef ENABLE_XFORMS_WRITE_STATS
- // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
- if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) {
- coded_bits_per_codeword = get_G(frame_parms,
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb,
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
- get_Qm(mcs),
- phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl,
- num_pdcch_symbols,
- frame,
- subframe,
- beamforming_mode);
- } else {
- coded_bits_per_codeword = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti);
- }
+ if (eNB_stats) {
+ rewind (gNB_stats);
+ fwrite (stats_buffer, 1, len, gNB_stats);
+ fclose (gNB_stats);
+ }
+
+ #endif
+ pthread_exit((void *)arg);
+ }*/
+ return NULL;
+}
+
+void startScope(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_idpdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0];
-
+static void ueTimeResponse (FL_OBJECT *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) {
- int16_t** rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata;
+ 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;
+ int16_t **rxsig_t = (int16_t **) phy_vars_ue->common_vars.rxdata;
float rxsig_t_dB[nb_antennas_rx][samples_per_frame];
float time[samples_per_frame];
-
- if (rxsig_t[0] != NULL) {
- for (i=0; irxsig_t,time,rxsig_t_dB[0],samples_per_frame,"","","");
+ if (rxsig_t[0] != NULL) {
+ for (int i=0; irxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
+ for (int arx=1; arxis_synchronized==0) {
//float corr[samples_per_frame];
- for (ind=0;ind<3;ind++) {
+ for (int ind=0; ind<3; ind++) {
/*
- if (pss_corr_ue[ind]) {
- for (i=0; ichest_t,time,corr,samples_per_frame,"","","");
- else
- fl_add_xyplot_overlay(form->chest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]);
+ if (pss_corr_ue[ind]) {
+ for (i=0; ichest_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;
+ }
*/
}
- }
- else {
-
- if (overlay) { //there was a previous overlay
- fl_clear_xyplot(form->chest_t);
- overlay = 0;
- }
+ // if the UE is not synchronized, we can make only the time*power graph
+ }
+}
+
+static void ueChannelResponse (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Channel Impulse Response
-
- if (phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time) {
- int16_t **chest_t = (int16_t**) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time;
+ if (!phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time)
+ return;
- ymax = 0;
- float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
- float time[frame_parms->ofdm_symbol_size>>3];
- if (chest_t[0] !=NULL) {
- for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
- chest_t_abs[0][i] = (float) (chest_t[0][2*i]*chest_t[0][2*i]+chest_t[0][2*i+1]*chest_t[0][2*i+1]);
- time[i] = (float) i;
+ NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
+ uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
+ int16_t **chest_t = (int16_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time;
+ int ymax = 0;
+ float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
+ float time[frame_parms->ofdm_symbol_size>>3];
- if (chest_t_abs[0][i] > ymax)
- ymax = chest_t_abs[0][i];
- }
+ if (chest_t[0] !=NULL) {
+ for (int i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
+ chest_t_abs[0][i] = (float) (chest_t[0][2*i]*chest_t[0][2*i]+chest_t[0][2*i+1]*chest_t[0][2*i+1]);
+ time[i] = (float) i;
- fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","","");
+ if (chest_t_abs[0][i] > ymax)
+ ymax = chest_t_abs[0][i];
}
- /*
- for (arx=1; arxofdm_symbol_size>>3); i++) {
- chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]);
- if (chest_t_abs[arx][i] > ymax)
- ymax = chest_t_abs[arx][i];
- }
-
- fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
- fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT);
- }
- }
- */
- // Avoid flickering effect
- // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
- fl_set_xyplot_ybounds(form->chest_t,0,(double) ymax);
- }
+ fl_set_xyplot_data(graph,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","","");
}
+ for (int arx=1; arxofdm_symbol_size>>3); i++) {
+ chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]);
+
+ if (chest_t_abs[arx][i] > ymax)
+ ymax = chest_t_abs[arx][i];
+ }
+
+ fl_add_xyplot_overlay(graph,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
+ fl_set_xyplot_overlay_type(graph,arx,FL_DASHED_XYPLOT);
+ }
+ }
+
+ // Avoid flickering effect
+ // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
+ fl_set_xyplot_ybounds(graph,0,(double) ymax);
+}
+
+static void uePbchFrequencyResp (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Channel Frequency Response (includes 5 complex sample for filter)
- if (phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates) {
- int16_t ** chest_f = (int16_t**) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates;
+ if (!phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates)
+ return;
- ind = 0;
- float chest_f_abs[frame_parms->ofdm_symbol_size];
- float freq[frame_parms->ofdm_symbol_size];
+ NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
+ uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
+ uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_gNB;
+ int16_t **chest_f = (int16_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates;
+ int ind = 0;
+ float chest_f_abs[frame_parms->ofdm_symbol_size];
+ float freq[frame_parms->ofdm_symbol_size];
- for (atx=0; atxofdm_symbol_size; k++) {
- freq[ind] = (float)ind;
- float Re = (float)(chest_f[(atx<<1)+arx][6144+(2*k)]);
- float Im = (float)(chest_f[(atx<<1)+arx][6144+(2*k)+1]);
-
- chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
- ind++;
- }
+ for (int atx=0; atxofdm_symbol_size; k++) {
+ freq[ind] = (float)ind;
+ float Re = (float)(chest_f[(atx<<1)+arx][6144+(2*k)]);
+ float Im = (float)(chest_f[(atx<<1)+arx][6144+(2*k)+1]);
+ chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
+ ind++;
}
}
}
-
- // 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,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(form->chest_f,freq,chest_f_abs,frame_parms->ofdm_symbol_size,"","","");
-
- /*
- for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
-
- // other tx antennas
- if (nb_antennas_tx > 1) {
- if (nb_antennas_rx > 1) {
- for (atx=1; atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
- }
- } else { // 1 rx antenna
- atx=1;
- arx=0;
- fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]);
- }
- }
- */
}
-
+
+ // 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,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,"","","");
+}
+
+static void uePbchLLR (FL_OBJECT *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) {
- int16_t* pbch_llr = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->llr;
+ if ( !phy_vars_ue->pbch_vars[eNB_id]->llr)
+ return;
+
+ int16_t *pbch_llr = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->llr;
float llr_pbch[1920], bit_pbch[1920];
- for (i=0; i<864; i++) {
- llr_pbch[i] = (float) pbch_llr[i];
- bit_pbch[i] = (float) i;
- }
-
- fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,864,"","","");
+ for (int i=0; i<864; i++) {
+ llr_pbch[i] = (float) pbch_llr[i];
+ bit_pbch[i] = (float) i;
}
- first_symbol=1;
+ fl_set_xyplot_data(graph,bit_pbch,llr_pbch,864,"","","");
+}
+static void uePbchIQ (FL_OBJECT *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]) {
- int16_t * pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
+ if (!phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0])
+ return;
- float I[432];
- float Q[432];
- for (symbol=first_symbol; symbol<(first_symbol+3); symbol++) {
- if (symbol == 2 || symbol == 6)
- nb_re = 72;
- else
- nb_re = 180;
- for (i=0; ipbch_vars[eNB_id]->rxdataF_comp[0];
+ localBuff(I,180*3);
+ localBuff(Q,180*3);
+ int first_symbol=1;
+ int base=0;
+
+ for (int symbol=first_symbol; symbol<(first_symbol+3); symbol++) {
+ int nb_re;
+
+ if (symbol == 2 || symbol == 6)
+ nb_re = 72;
+ else
+ nb_re = 180;
+
+ AssertFatal(base+nb_re<180*3,"");
+
+ for (int i=0; ipbch_comp,I,Q,432,"","","");
+
+ base+=nb_re;
}
+ fl_set_xyplot_data(graph,I,Q,base,"","","");
+}
+
+static void uePcchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+
// PDCCH LLRs
- if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr) {
- int8_t* pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr;
+ if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr)
+ return;
- float llr_pdcch[12*frame_parms->N_RB_DL*num_pdcch_symbols*2];
- float bit_pdcch[12*frame_parms->N_RB_DL*num_pdcch_symbols*2];
+ NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
+ uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
+ uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx;
+ int16_t **chest_f = (int16_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates;
+ int ind = 0;
+ float chest_f_abs[frame_parms->ofdm_symbol_size];
+ float freq[frame_parms->ofdm_symbol_size];
- for (i=0; i<100; i++) { //12*frame_parms->N_RB_DL*2*num_pdcch_symbols
- llr_pdcch[i] = (float) pdcch_llr[2*24*9 +i];
- bit_pdcch[i] = (float) i;
- }
-
- fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","","");
- }
-
- // PDCCH I/Q of MF Output
- if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0]) {
- int16_t* pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0];
-
- float I[frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2];
- float Q[frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2];
- for (i=0; i<100; i++) {
- I[i] = pdcch_comp[2*50*12+2*i];
- Q[i] = pdcch_comp[2*50*12+2*i+1];
- }
- fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","","");
- }
-
- // PDSCH LLRs
- if (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]) {
- int16_t *pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0
- // pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
-
- int num_re = 4500;
- int Qm = 2;
- int coded_bits_per_codeword = num_re*Qm;
- float llr[coded_bits_per_codeword];
- float bit[coded_bits_per_codeword];
-
- for (i=0; ipdsch_llr,0,coded_bits_per_codeword);
- fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","","");
- }
-
- first_symbol = 2;
- ind = 0;
- // PDSCH I/Q of MF Output
- if (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0]) {
- int16_t* pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0];
-
- float I[nb_symb_sch];
- float Q[nb_symb_sch];
- for (symbol=0;symbolN_RB_DL*12+i) ];
- Q[ind] = pdsch_comp[2*((first_symbol+symbol)*frame_parms->N_RB_DL*12+i)+1];
- ind++;
+ for (int atx=0; atxofdm_symbol_size; k++) {
+ freq[ind] = (float)ind;
+ float Re = (float)(chest_f[(atx<<1)+arx][6144+(2*k)]);
+ float Im = (float)(chest_f[(atx<<1)+arx][6144+(2*k)+1]);
+ chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
+ ind++;
+ }
}
}
-
- fl_set_xyplot_data(form->pdsch_comp,I,Q,nb_symb_sch*nb_rb_pdsch*12,"","","");
}
+
+ // 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,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,"","","");
+}
+
+static void uePcchIQ (FL_OBJECT *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
+ 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];
+
+ for (int i=0; i< nb; i++) {
+ I[base+i] = pdcch_comp[i*2];
+ Q[base+i] = pdcch_comp[i*2+1];
+ }
+
+ base+=nb;
+ }
+
+ fl_set_xyplot_data(graph,I,Q,base,"","","");
+}
+
+static void uePdschLLR (FL_OBJECT *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;
+
+ int num_re = 4500;
+ int Qm = 2;
+ int coded_bits_per_codeword = num_re*Qm;
+ localBuff(llr,coded_bits_per_codeword*RX_NB_TH_MAX);
+ localBuff(bit,coded_bits_per_codeword*RX_NB_TH_MAX);
+ int base=0;
+
+ for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
+ int16_t *pdsch_llr = (int16_t *) phy_vars_ue->pdsch_vars[thr][eNB_id]->llr[0]; // stream 0
+
+ for (int i=0; ipdsch_llr,0,coded_bits_per_codeword);
+ fl_set_xyplot_data(graph,bit,llr,base,"","","");
+}
+
+static void uePdschIQ (FL_OBJECT *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;
+
+ NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
+ int sz=7*2*frame_parms->N_RB_DL*12; // size of the malloced buffer
+ localBuff(I,sz*RX_NB_TH_MAX);
+ localBuff(Q,sz*RX_NB_TH_MAX);
+ 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];
+
+ for (int s=0; s tput_ue_max[UE_id]) {
- tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
+ tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1];
}
fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","","");
fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
*/
+}
+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 ) {
+ FL_OBJECT *obj;
+ FD_phy_scope_t *fdui = fl_malloc( sizeof *fdui );
+ // 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 );
+ // Received signal
+ fdui->graph[0] = nrUEcommonGraph(ueTimeResponse,
+ FL_IMPULSE_XYPLOT, 20, 20, 370, 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 );
+ // Frequency-domain channel response
+ fdui->graph[2] = nrUEcommonGraph(uePbchFrequencyResp,
+ FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency data (RE, dB)", FL_RED );
+ // LLR of PBCH
+ fdui->graph[3] = nrUEcommonGraph(uePbchLLR,
+ FL_POINTS_XYPLOT, 20, 260, 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 );
+ // LLR of PDCCH
+ fdui->graph[5] = nrUEcommonGraph(uePcchLLR,
+ FL_POINTS_XYPLOT, 20, 380, 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 );
+ // LLR of PDSCH
+ fdui->graph[7] = nrUEcommonGraph(uePdschLLR,
+ FL_POINTS_XYPLOT, 20, 500, 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 );
+ // Throughput on PDSCH
+ fdui->graph[9] = nrUEcommonGraph(uePdschThroughput,
+ FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]", FL_WHITE );
+ fdui->graph[10].graph=NULL;
+ // Generic UE Button
+ 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;
+ fl_set_button(fdui->button_0,0);
+ fl_set_object_label(fdui->button_0, "IA Receiver OFF");
+ 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);
+ fl_end_form( );
+ fdui->phy_scope->fdui = fdui;
+ char buf[100];
+ sprintf(buf,"NR DL SCOPE UE %d", ID);
+ fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, buf);
+ return fdui;
+}
+
+void phy_scope_nrUE(FD_phy_scope_t *form,
+ PHY_VARS_NR_UE *phy_vars_ue,
+ int eNB_id,
+ int UE_id) {
+ static FD_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].nrUEfunct(form->graph[i].graph, phy_vars_ue, eNB_id, UE_id);
+ i++;
+ }
+
fl_check_forms();
}
-
-typedef struct {
- FL_FORM *stats_form;
- void *vdata;
- char *cdata;
- long ldata;
- FL_OBJECT *stats_text;
- FL_OBJECT *stats_button;
-} FD_stats_form;
-
-
-// current status is that every UE has a DL scope for a SINGLE eNB (gnb_id=0)
-// at eNB 0, an UL scope for every UE
-FD_phy_scope_gnb *form_gnb[NUMBER_OF_UE_MAX];
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
//char title[255];
-unsigned char scope_enb_num_ue = 1;
//static pthread_t forms_thread; //xforms
-
-
-void reset_stats_gNB(FL_OBJECT *button,
- long arg)
-{
+static void reset_stats_gNB(FL_OBJECT *button,
+ long arg) {
int i,k;
//PHY_VARS_gNB *phy_vars_gNB = RC.gNB[0][0];
for (i=0; idlsch[i][0]->Mlimit; j++) {
- phy_vars_gNB->UE_stats[i].dlsch_NAK[k][j]=0;
- phy_vars_gNB->UE_stats[i].dlsch_ACK[k][j]=0;
- phy_vars_gNB->UE_stats[i].dlsch_trials[k][j]=0;
- }
- phy_vars_gNB->UE_stats[i].dlsch_l2_errors[k]=0;
- phy_vars_gNB->UE_stats[i].ulsch_errors[k]=0;
- phy_vars_gNB->UE_stats[i].ulsch_consecutive_errors=0;
- phy_vars_gNB->UE_stats[i].dlsch_sliding_cnt=0;
- phy_vars_gNB->UE_stats[i].dlsch_NAK_round0=0;
- phy_vars_gNB->UE_stats[i].dlsch_mcs_offset=0;*/
- }
- }
-}
-
-
-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
-
- while (!oai_exit) {
- int ue_cnt=0;
-
- for(int UE_id=0; UE_idgNB, p->ru, UE_id);
- ue_cnt++;
+ phy_vars_gNB->UE_stats[i].dlsch_NAK[k][j]=0;
+ phy_vars_gNB->UE_stats[i].dlsch_ACK[k][j]=0;
+ phy_vars_gNB->UE_stats[i].dlsch_trials[k][j]=0;
}
+ phy_vars_gNB->UE_stats[i].dlsch_l2_errors[k]=0;
+ phy_vars_gNB->UE_stats[i].ulsch_errors[k]=0;
+ phy_vars_gNB->UE_stats[i].ulsch_consecutive_errors=0;
+ phy_vars_gNB->UE_stats[i].dlsch_sliding_cnt=0;
+ phy_vars_gNB->UE_stats[i].dlsch_NAK_round0=0;
+ phy_vars_gNB->UE_stats[i].dlsch_mcs_offset=0;*/
}
- sleep(1);
}
-
-// 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;
}
-FD_stats_form * create_form_stats_form( void ) {
+static FD_stats_form *create_form_stats_form(int ID) {
FL_OBJECT *obj;
FD_stats_form *fdui = fl_malloc( sizeof *fdui );
fdui->vdata = fdui->cdata = NULL;
@@ -941,23 +908,32 @@ FD_stats_form * create_form_stats_form( void ) {
return fdui;
}
-void startScope(scopeParms_t * p) {
- //FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
- char title[255];
- 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_idphy_scope_gnb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
- } // UE_id
+static FD_phy_scope_t *form_nrue[NUMBER_OF_UE_MAX];
+static pthread_t forms_thread;
- pthread_t forms_thread;
- threadCreate(&forms_thread, scope_thread_gNB, p, "scope", -1, OAI_PRIORITY_RT_LOW);
+static void *scope_thread(void *arg) {
+ PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg;
+
+ while (!oai_exit) {
+ phy_scope_nrUE(form_nrue[0],
+ ue,
+ 0,0);
+ sleep(100*1000);
+ }
+
+ pthread_exit((void *)arg);
}
+
+void init_scope(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);
+ threadCreate(&forms_thread, scope_thread, ue, "scope", -1, OAI_PRIORITY_RT_LOW);
+}
+
+
+
+
+
+
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.h b/openair1/PHY/TOOLS/nr_phy_scope.h
index 29229d6b12..31353f180c 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.h
+++ b/openair1/PHY/TOOLS/nr_phy_scope.h
@@ -35,37 +35,6 @@
//#include "PHY/impl_defs_top.h"
#include "PHY/defs_nr_UE.h"
-/* Forms and Objects */
-typedef struct {
- FL_FORM * phy_scope_gnb;
- FL_OBJECT * rxsig_t;
- FL_OBJECT * chest_f;
- FL_OBJECT * chest_t;
- FL_OBJECT * pusch_comp;
- FL_OBJECT * pucch_comp;
- FL_OBJECT * pucch_comp1;
- FL_OBJECT * pusch_llr;
- FL_OBJECT * pusch_tput;
- FL_OBJECT * button_0;
-} FD_phy_scope_gnb;
-
-typedef struct {
- FL_FORM * phy_scope_nrue;
- FL_OBJECT * rxsig_t;
- FL_OBJECT * chest_f;
- FL_OBJECT * chest_t;
- FL_OBJECT * pbch_comp;
- FL_OBJECT * pbch_llr;
- FL_OBJECT * pdcch_comp;
- FL_OBJECT * pdcch_llr;
- FL_OBJECT * pdsch_comp;
- FL_OBJECT * pdsch_llr;
- FL_OBJECT * pdsch_comp1;
- FL_OBJECT * pdsch_llr1;
- FL_OBJECT * pdsch_tput;
- FL_OBJECT * button_0;
-} FD_phy_scope_nrue;
-
typedef struct {
int *argc;
char **argv;
@@ -73,17 +42,8 @@ typedef struct {
PHY_VARS_gNB *gNB;
} scopeParms_t;
-extern unsigned char scope_enb_num_ue;
-FD_phy_scope_nrue * create_phy_scope_nrue( void );
-
-void phy_scope_nrUE(FD_phy_scope_nrue *form,
- PHY_VARS_NR_UE *phy_vars_ue,
- int eNB_id,
- int UE_id,
- uint8_t subframe);
-
-
void startScope(scopeParms_t * p);
+void init_scope(PHY_VARS_NR_UE *ue);
extern RAN_CONTEXT_t RC;
#endif
diff --git a/openair2/ENB_APP/flexran_agent_extern.h b/openair2/ENB_APP/flexran_agent_extern.h
index 8c3d1c069f..2a5930e1a8 100644
--- a/openair2/ENB_APP/flexran_agent_extern.h
+++ b/openair2/ENB_APP/flexran_agent_extern.h
@@ -41,11 +41,9 @@
AGENT_PHY_xface *flexran_agent_get_phy_xface(mid_t mod_id);
/* Control module interface for the communication of the MAC Control Module with the agent */
-//AGENT_MAC_xface *flexran_agent_get_mac_xface(mid_t mod_id);
+
extern AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB];
#define flexran_agent_get_mac_xface(mod_id) (agent_mac_xface[mod_id])
-
-
/* Control module interface for the communication of the RRC Control Module with the agent */
// AGENT_RRC_xface *flexran_agent_get_rrc_xface(mid_t mod_id);
extern AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB];
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index d072ff71d5..f419ec0790 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -131,7 +131,6 @@ void *gNB_app_task(void *args_p)
uint32_t gnb_nb = RC.nb_nr_inst;
uint32_t gnb_id_start = 0;
uint32_t gnb_id_end = gnb_id_start + gnb_nb;
- uint32_t x2_register_gnb_pending = 0;
uint32_t gnb_id;
MessageDef *msg_p = NULL;
const char *msg_name = NULL;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 0dc533a574..4e07eeb9b2 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -2670,7 +2670,6 @@ void nr_ue_send_sdu(module_id_t module_idP,
LOG_D(MAC, "Handling PDU frame %d slot %d\n", frameP, slotP);
uint8_t * pduP = pdu;
- NR_UE_MAC_INST_t *UE_mac_inst = get_mac_inst(module_idP);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 702b034809..8c8b0b9b43 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -375,7 +375,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
int CC_id, UE_id = 0;
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
NR_UE_list_t *UE_list = &gNB->UE_list;
- NR_UE_sched_ctrl_t *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
NR_COMMON_channels_t *cc = gNB->common_channels;
NR_sched_pucch *pucch_sched = (NR_sched_pucch*) malloc(sizeof(NR_sched_pucch));
@@ -424,6 +423,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
// TbD once RACH is available, start ta_timer when UE is connected
#if 0
+ NR_UE_sched_ctrl_t *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
if (ue_sched_ctl->ta_timer) ue_sched_ctl->ta_timer--;
if (ue_sched_ctl->ta_timer == 0) {
|