Commit a9ba117a authored by laurent's avatar laurent

first version scope reworked

parents 64e3e971 90b10268
...@@ -110,7 +110,7 @@ MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-sta ...@@ -110,7 +110,7 @@ MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-sta
NB_WARNINGS_FILES=0 NB_WARNINGS_FILES=0
# Retrieve list of warnings # 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 ""
echo "List of files that have been modified by the Merge Request AND" echo "List of files that have been modified by the Merge Request AND"
......
...@@ -53,7 +53,7 @@ function details_table { ...@@ -53,7 +53,7 @@ function details_table {
echo " <th>Message</th>" >> $3 echo " <th>Message</th>" >> $3
echo " </tr>" >> $3 echo " </tr>" >> $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" COMPLETE_MESSAGE="start"
for MESSAGE in $LIST_MESSAGES for MESSAGE in $LIST_MESSAGES
do do
...@@ -146,7 +146,7 @@ function summary_table_row { ...@@ -146,7 +146,7 @@ function summary_table_row {
else else
echo " <td bgcolor = \"red\" >$NB_ERRORS</th>" >> ./build_results.html echo " <td bgcolor = \"red\" >$NB_ERRORS</th>" >> ./build_results.html
fi 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 ] if [ $NB_WARNINGS -eq 0 ]
then then
echo " <td bgcolor = \"green\" >$NB_WARNINGS</th>" >> ./build_results.html echo " <td bgcolor = \"green\" >$NB_WARNINGS</th>" >> ./build_results.html
......
...@@ -185,7 +185,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU ...@@ -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 # set a flag for changes in the source code
# these changes are related to hardcoded path to include .h files # 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_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(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3")
set(GIT_BRANCH "UNKNOWN") set(GIT_BRANCH "UNKNOWN")
...@@ -2247,20 +2247,20 @@ add_library(SIMU_COMMON ...@@ -2247,20 +2247,20 @@ add_library(SIMU_COMMON
# Simulation library # Simulation library
########################## ##########################
set (SIMUSRC set (SIMUSRC
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c
${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c
${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c
${OPENAIR1_DIR}/SIMULATION/TOOLS/channel_sim.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/channel_sim.c
${OPENAIR1_DIR}/SIMULATION/RF/rf.c ${OPENAIR1_DIR}/SIMULATION/RF/rf.c
${OPENAIR1_DIR}/SIMULATION/RF/dac.c ${OPENAIR1_DIR}/SIMULATION/RF/dac.c
${OPENAIR1_DIR}/SIMULATION/RF/adc.c ${OPENAIR1_DIR}/SIMULATION/RF/adc.c
#${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c #${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
) )
# Simulation library # Simulation library
########################## ##########################
add_library( SIMU SHARED ${SIMUSRC} ) add_library(SIMU SHARED ${SIMUSRC} )
add_library(SIMU_ETH add_library(SIMU_ETH
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
...@@ -2638,7 +2638,8 @@ target_link_libraries (lte-uesoftmodem ...@@ -2638,7 +2638,8 @@ target_link_libraries (lte-uesoftmodem
-Wl,--start-group -Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB 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 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} ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
-Wl,--end-group z dl) -Wl,--end-group z dl)
......
...@@ -406,7 +406,7 @@ function main() { ...@@ -406,7 +406,7 @@ function main() {
shift 1;; shift 1;;
-k | --skip-shared-libraries) -k | --skip-shared-libraries)
SKIP_SHARED_LIB_FLAG="True" 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;; shift;;
--ninja) --ninja)
CMAKE_CMD="$CMAKE_CMD -GNinja" CMAKE_CMD="$CMAKE_CMD -GNinja"
...@@ -896,7 +896,7 @@ function main() { ...@@ -896,7 +896,7 @@ function main() {
$build_dir rfsimulator \ $build_dir rfsimulator \
librfsimulator.so $dbin/librfsimulator.so.$REL librfsimulator.so $dbin/librfsimulator.so.$REL
echo_info "Compiling basicsimulator" echo_info "Compiling tcp_bridge_oai"
compilations \ compilations \
$build_dir tcp_bridge_oai \ $build_dir tcp_bridge_oai \
libtcp_bridge_oai.so $dbin/libtcp_bridge_oai.so.$REL libtcp_bridge_oai.so $dbin/libtcp_bridge_oai.so.$REL
......
...@@ -150,7 +150,9 @@ clean_all_files() { ...@@ -150,7 +150,9 @@ clean_all_files() {
set_openair_env set_openair_env
dir=$OPENAIR_DIR/cmake_targets dir=$OPENAIR_DIR/cmake_targets
rm -rf $dir/log $OPENAIR_DIR/targets/bin/* 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/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build
} }
...@@ -167,7 +169,7 @@ check_warnings() { ...@@ -167,7 +169,7 @@ check_warnings() {
#we look for 'warning:' in the compilation log file #we look for 'warning:' in the compilation log file
#this is how gcc starts a warning #this is how gcc starts a warning
#this is not perfect, we may get false positive #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 if [ $warning_count -gt 0 ]; then
echo_error "WARNING: $warning_count warnings. See $1" echo_error "WARNING: $warning_count warnings. See $1"
fi fi
...@@ -177,7 +179,6 @@ compilations() { ...@@ -177,7 +179,6 @@ compilations() {
cd $OPENAIR_DIR/cmake_targets/$1/build cd $OPENAIR_DIR/cmake_targets/$1/build
set +e set +e
{ {
rm -f $3
if [ "$BUILD_COVERITY_SCAN" == "1" ]; then if [ "$BUILD_COVERITY_SCAN" == "1" ]; then
COV_SCAN_PREFIX="cov-build --dir cov-int" COV_SCAN_PREFIX="cov-build --dir cov-int"
else else
......
...@@ -113,11 +113,11 @@ typedef struct { ...@@ -113,11 +113,11 @@ typedef struct {
// LTS: not coherent (xxx_frame_parms cardinatlity wtih xNB (so one carrier)) // LTS: not coherent (xxx_frame_parms cardinatlity wtih xNB (so one carrier))
struct RU_t_s **ru; struct RU_t_s **ru;
/// Mask to indicate fronthaul setup status of RU (hard-limit to 64 RUs) /// 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 /// Mutex for protecting ru_mask
//pthread_mutex_t ru_mutex; pthread_mutex_t ru_mutex;
/// condition variable for signaling setup completion of an RU /// condition variable for signaling setup completion of an RU
//pthread_cond_t ru_cond; pthread_cond_t ru_cond;
} RAN_CONTEXT_t; } RAN_CONTEXT_t;
......
...@@ -634,7 +634,7 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) { ...@@ -634,7 +634,7 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
int computeSamplesShift(PHY_VARS_NR_UE *UE) { int computeSamplesShift(PHY_VARS_NR_UE *UE) {
if (IS_SOFTMODEM_RFSIM) { 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; //UE->rx_offset_diff=0;
return 0; return 0;
} }
...@@ -857,8 +857,9 @@ void *UE_thread(void *arg) { ...@@ -857,8 +857,9 @@ void *UE_thread(void *arg) {
usleep(200); usleep(200);
} }
if ( decoded_frame_rx != 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+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", 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 ); decoded_frame_rx, curMsg->proc.frame_rx );
......
...@@ -76,37 +76,12 @@ unsigned short config_frames[4] = {2,9,11,13}; ...@@ -76,37 +76,12 @@ unsigned short config_frames[4] = {2,9,11,13};
#include <openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h> #include <openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h>
#include <openair1/SCHED_NR_UE/fapi_nr_ue_l1.h> #include <openair1/SCHED_NR_UE/fapi_nr_ue_l1.h>
#include <forms.h>
/* Callbacks, globals and object handlers */ /* 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 "PHY/TOOLS/nr_phy_scope.h"
//#include "stats.h" //#include "stats.h"
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // 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 // 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 <executables/nr-uesoftmodem.h> #include <executables/nr-uesoftmodem.h>
#include "executables/softmodem-common.h" #include "executables/softmodem-common.h"
#include "executables/thread-common.h" #include "executables/thread-common.h"
...@@ -304,35 +279,6 @@ void reset_stats(FL_OBJECT *button, long arg) { ...@@ -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) { void *l2l1_task(void *arg) {
MessageDef *message_p = NULL; MessageDef *message_p = NULL;
int result; int result;
...@@ -782,7 +728,8 @@ int main( int argc, char **argv ) { ...@@ -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); memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
configure_linux(); configure_linux();
mlockall(MCL_CURRENT | MCL_FUTURE); mlockall(MCL_CURRENT | MCL_FUTURE);
init_scope(); if (do_forms)
init_scope(PHY_vars_UE_g[0][0]);
number_of_cards = 1; number_of_cards = 1;
for(int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { for(int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
......
...@@ -821,15 +821,14 @@ int rx_pdsch(PHY_VARS_UE *ue, ...@@ -821,15 +821,14 @@ int rx_pdsch(PHY_VARS_UE *ue,
pllr_symbol_cw0 += llr_offset_symbol; pllr_symbol_cw0 += llr_offset_symbol;
pllr_symbol_cw1 += llr_offset_symbol; pllr_symbol_cw1 += llr_offset_symbol;
/* LOG_D(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p energy: %d\n",
LOG_I(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
frame, subframe,symbol, frame, subframe,symbol,
nb_rb,dlsch0_harq->Qm, nb_rb,dlsch0_harq->Qm,
pdsch_vars[eNB_id]->llr_length[symbol], pdsch_vars[eNB_id]->llr_length[symbol],
pdsch_vars[eNB_id]->llr_offset[symbol], pdsch_vars[eNB_id]->llr_offset[symbol],
(int16_t*)pdsch_vars[eNB_id]->llr[0], (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) { switch (dlsch0_harq->Qm) {
case 2 : case 2 :
if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
......
...@@ -339,7 +339,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, ...@@ -339,7 +339,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
#endif #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); (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 #if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats); stop_meas(&ue->rx_dft_stats);
...@@ -363,7 +363,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, ...@@ -363,7 +363,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
dft(dftsize,(int16_t *)tmp_dft_in, 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); (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 } 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); (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 #if UE_TIMING_TRACE
......
...@@ -669,14 +669,16 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, ...@@ -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; 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, symbol,
nb_rb,dlsch0_harq->Qm, nb_rb,dlsch0_harq->Qm,
pdsch_vars[eNB_id]->llr_length[symbol], pdsch_vars[eNB_id]->llr_length[symbol],
pdsch_vars[eNB_id]->llr_offset[symbol], pdsch_vars[eNB_id]->llr_offset[symbol],
(int16_t*)pdsch_vars[eNB_id]->llr[0], (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", /*printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
symbol, symbol,
nb_rb,dlsch0_harq->Qm, nb_rb,dlsch0_harq->Qm,
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
* *
* http://www.openairinterface.org/?page_id=698 * 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 * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
...@@ -26,6 +28,7 @@ ...@@ -26,6 +28,7 @@
#include "executables/nr-softmodem-common.h" #include "executables/nr-softmodem-common.h"
#define TPUT_WINDOW_LENGTH 100 #define TPUT_WINDOW_LENGTH 100
#define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
int otg_enabled; int otg_enabled;
FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW}; 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}}; ...@@ -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[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
float tput_ue_max[NUMBER_OF_UE_MAX] = {0}; float tput_ue_max[NUMBER_OF_UE_MAX] = {0};
void drawsymbol(FL_OBJECT *obj, int id, typedef struct OAIgraph {
FL_POINT *p, int n, int w, int h) { FL_OBJECT *graph;
fl_points( p, n, FL_YELLOW); 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 ia_receiver_on_off( FL_OBJECT *button, long arg) 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) {
if (fl_get_button(button)) { if (fl_get_button(button)) {
fl_set_object_label(button, "IA Receiver ON"); fl_set_object_label(button, "IA Receiver ON");
// PHY_vars_UE_g[0][0]->use_ia_receiver = 1; // 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) ...@@ -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)) { if (fl_get_button(button)) {
fl_set_object_label(button, "DL Traffic ON"); fl_set_object_label(button, "DL Traffic ON");
otg_enabled = 1; otg_enabled = 1;
...@@ -71,158 +90,96 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg) ...@@ -71,158 +90,96 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg)
} }
} }
FD_phy_scope_gnb *create_phy_scope_gnb( void ) 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_OBJECT *obj; fl_set_object_boxtype(graph, FL_EMBOSSED_BOX );
FD_phy_scope_gnb *fdui = fl_malloc( sizeof *fdui ); fl_set_object_lcolor(graph, FL_WHITE ); // Label color
fl_set_xyplot_symbol(graph, 0, drawsymbol);
// Define form fl_set_object_color(graph, FL_BLACK, pointColor);
fdui->phy_scope_gnb = fl_bgn_form( FL_NO_BOX, 800, 800 ); return graph;
}
// 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( ); static OAIgraph_t gNBcommonGraph( void (*funct) (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id),
fdui->phy_scope_gnb->fdui = fdui; 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;
}
return fdui; 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_gnb *form, void phy_scope_gNB(FD_phy_scope_t *form,
PHY_VARS_gNB *phy_vars_gnb, PHY_VARS_gNB *phy_vars_gnb,
RU_t *phy_vars_ru, RU_t *phy_vars_ru,
int UE_id) int UE_id) {
{ static FD_phy_scope_t *remeberForm=NULL;
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;
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;
/* if (form==NULL)
if (!RC.nrmac[0]->UE_info.active[UE_id]) form=remeberForm;
return; else
remeberForm=form;
if (form==NULL) return;
int i=0;
// choose max MCS to compute coded_bits_per_codeword while (form->graph[i].graph) {
if (phy_vars_gnb->ulsch[UE_id][0]!=NULL) { form->graph[i].gNBfunct(form->graph[i].graph, phy_vars_gnb, phy_vars_ru, UE_id);
for (harq_pid=0; harq_pid<3; harq_pid++) { i++;
//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];
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 // Received signal in time domain of receive antenna 0
if (phy_vars_ru->common.rxdata) { 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;
int16_t **rxsig_t = 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 rxsig_t_dB[nb_antennas_rx][frame_parms->samples_per_frame];
float time[frame_parms->samples_per_frame]; float time[frame_parms->samples_per_frame];
if (rxsig_t[0] != NULL) { if (rxsig_t[0] != NULL) {
for (int i=0; i<frame_parms->samples_per_frame; i++) { for (int i=0; i<frame_parms->samples_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]))); 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; time[i] = (float) i;
} }
fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],frame_parms->samples_per_frame,"","",""); fl_set_xyplot_data(graph,time,rxsig_t_dB[0],frame_parms->samples_per_frame,"","","");
} }
for (int arx=1; arx<nb_antennas_rx; arx++) { for (int arx=1; arx<nb_antennas_rx; arx++) {
if (rxsig_t[arx] != NULL) { if (rxsig_t[arx] != NULL) {
for (int i=0; i<frame_parms->samples_per_frame; i++) { for (int i=0; i<frame_parms->samples_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]))); 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]); 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 // Channel Impulse Response
if (phy_vars_gnb->pusch_vars[UE_id]->ul_ch_estimates_time) { 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; 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; int ymax = 0;
float time2[2*frame_parms->ofdm_symbol_size]; float time2[2*frame_parms->ofdm_symbol_size];
float chest_t_abs[nb_antennas_rx][2*frame_parms->ofdm_symbol_size]; float chest_t_abs[nb_antennas_rx][2*frame_parms->ofdm_symbol_size];
...@@ -239,7 +196,7 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, ...@@ -239,7 +196,7 @@ void phy_scope_gNB(FD_phy_scope_gnb *form,
ymax = chest_t_abs[0][i]; ymax = chest_t_abs[0][i];
} }
fl_set_xyplot_data(form->chest_t,time2,chest_t_abs[0],(2*frame_parms->ofdm_symbol_size),"","",""); fl_set_xyplot_data(graph,time2,chest_t_abs[0],(2*frame_parms->ofdm_symbol_size),"","","");
} }
for (int arx=1; arx<nb_antennas_rx; arx++) { for (int arx=1; arx<nb_antennas_rx; arx++) {
...@@ -251,28 +208,34 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, ...@@ -251,28 +208,34 @@ void phy_scope_gNB(FD_phy_scope_gnb *form,
ymax = chest_t_abs[arx][i]; 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_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(form->chest_t,arx,FL_DASHED_XYPLOT); fl_set_xyplot_overlay_type(graph,arx,FL_DASHED_XYPLOT);
} }
} }
// Avoid flickering effect // Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
fl_set_xyplot_ybounds(form->chest_t,0,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 // Channel Frequency Response
if (phy_vars_ru->common.rxdataF) { if (!phy_vars_ru->common.rxdataF)
int16_t **rxsig_f = (int16_t**) 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 rxsig_f_dB[nb_antennas_rx][frame_parms->samples_per_slot_wCP];
float time[frame_parms->samples_per_slot_wCP]; float time[frame_parms->samples_per_slot_wCP];
if (rxsig_f[0] != NULL) { if (rxsig_f[0] != NULL) {
for (int i=0; i<frame_parms->samples_per_slot_wCP; i++) { for (int i=0; i<frame_parms->samples_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]))); 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; time[i] = (float) i;
} }
fl_set_xyplot_data(form->chest_t,time,rxsig_f_dB[0],frame_parms->samples_per_slot_wCP,"","",""); fl_set_xyplot_data(graph,time,rxsig_f_dB[0],frame_parms->samples_per_slot_wCP,"","","");
} }
/* /*
...@@ -314,27 +277,35 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, ...@@ -314,27 +277,35 @@ void phy_scope_gNB(FD_phy_scope_gnb *form,
} }
} }
*/ */
} }
static void puschLLR (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
// PUSCH LLRs // PUSCH LLRs
if (phy_vars_gnb->pusch_vars[UE_id]->llr) { if (!phy_vars_gnb->pusch_vars[UE_id]->llr)
int16_t *pusch_llr = (int16_t*) 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; int coded_bits_per_codeword = frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti;
float llr[coded_bits_per_codeword]; float llr[coded_bits_per_codeword];
float bit[coded_bits_per_codeword]; float bit[coded_bits_per_codeword];
for (int i=0; i<coded_bits_per_codeword; i++) { for (int i=0; i<coded_bits_per_codeword; i++) {
llr[i] = (float) pusch_llr[i]; llr[i] = (float) pusch_llr[i];
bit[i] = (float) i; bit[i] = (float) i;
} }
fl_set_xyplot_data(form->pusch_llr,bit,llr,coded_bits_per_codeword,"","",""); fl_set_xyplot_data(graph,bit,llr,coded_bits_per_codeword,"","","");
} }
static void puschIQ (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
// PUSCH I/Q of MF Output // PUSCH I/Q of MF Output
if (phy_vars_gnb->pusch_vars[UE_id]->rxdataF_comp) { if (!phy_vars_gnb->pusch_vars[UE_id]->rxdataF_comp)
int32_t *pusch_comp = (int32_t*) phy_vars_gnb->pusch_vars[UE_id]->rxdataF_comp; return;
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; int sz=frame_parms->symbols_per_tti*12*frame_parms->N_RB_UL;
float I[sz], Q[sz]; float I[sz], Q[sz];
int ind=0; int ind=0;
...@@ -347,265 +318,193 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, ...@@ -347,265 +318,193 @@ void phy_scope_gNB(FD_phy_scope_gnb *form,
} }
} }
fl_set_xyplot_data(form->pusch_comp,I,Q,ind,"","",""); fl_set_xyplot_data(graph,I,Q,ind,"","","");
}
// PUSCH I/Q of MF Output // PUSCH I/Q of MF Output
if (NULL) { if (NULL) {
int32_t *pucch1ab_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1ab_stats[UE_id];
int32_t* pucch1ab_comp = (int32_t*) NULL; //phy_vars_gnb->pucch1ab_stats[UE_id]; int32_t *pucch1_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1_stats[UE_id];
int32_t *pucch1_comp = (int32_t*) NULL;//phy_vars_gnb->pucch1_stats[UE_id];
float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240]; float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
for (int ind=0; ind<10240; ind++) {
for (int ind=0; ind<10240; ind++) {
I_pucch[ind] = (float)pucch1ab_comp[2*(ind)]; I_pucch[ind] = (float)pucch1ab_comp[2*(ind)];
Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1]; Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1];
A_pucch[ind] = pucch1_comp?(10*log10(pucch1_comp[ind])):0; A_pucch[ind] = pucch1_comp?(10*log10(pucch1_comp[ind])):0;
B_pucch[ind] = ind; 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; 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 // PUSCH Throughput
memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) ); memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) ); memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) 0; tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) 0;
// tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0; // 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_set_xyplot_data(form->pusch_tput,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","","");
// fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax); // fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax);
// fl_set_xyplot_ybounds(form->pusch_tput,0,ymax); // fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
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; FL_OBJECT *obj;
FD_phy_scope_nrue *fdui = fl_malloc( sizeof *fdui ); FD_phy_scope_t *fdui = fl_malloc( sizeof *fdui );
// Define form // 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 // 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 ); fl_set_object_color( obj, FL_BLACK, FL_BLACK );
// Received signal // Received signal
fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" ); fdui->graph[0] = gNBcommonGraph( timeSignal, FL_IMPULSE_XYPLOT, 20, 20, 370, 100,
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX ); "Received Signal (Time-Domain, dB)", FL_RED );
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 // Time-domain channel response
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); fdui->graph[1] = gNBcommonGraph( timeResponse, FL_NORMAL_XYPLOT, 410, 20, 370, 100,
fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX ); "SRS Frequency Response (samples, abs)", FL_RED );
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 // Frequency-domain channel response
fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency data (RE, dB)" ); fdui->graph[2] = gNBcommonGraph( frequencyResponse, FL_IMPULSE_XYPLOT, 20, 140, 760, 100,
fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX ); "Channel Frequency Response (RE, dB)", FL_RED );
fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED ); // LLR of PUSCH
fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color fdui->graph[3] = gNBcommonGraph( puschLLR, FL_POINTS_XYPLOT, 20, 260, 500, 200,
fl_set_xyplot_ybounds( fdui->chest_f,30,70); "PUSCH Log-Likelihood Ratios (LLR, mag)", FL_YELLOW );
fl_set_xyplot_symbol(fdui->chest_f, 0, drawsymbol); // I/Q PUSCH comp
fdui->graph[4] = gNBcommonGraph( puschIQ, FL_POINTS_XYPLOT, 540, 260, 240, 200,
// LLR of PBCH "PUSCH I/Q of MF Output", FL_YELLOW );
fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" ); // I/Q PUCCH comp (format 1)
fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX ); fdui->graph[5] = gNBcommonGraph( pucchEnergy, FL_POINTS_XYPLOT, 540, 480, 240, 100,
fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN ); "PUCCH1 Energy (SR)", FL_YELLOW );
fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color // fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
fl_set_xyplot_symbolsize( fdui->pbch_llr,2); // I/Q PUCCH comp (fromat 1a/b)
fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR); fdui->graph[6] = gNBcommonGraph( pucchIQ, FL_POINTS_XYPLOT, 540, 600, 240, 100,
//fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920); "PUCCH I/Q of MF Output", FL_YELLOW );
fl_set_xyplot_symbol(fdui->pbch_llr, 0, drawsymbol); // Throughput on PUSCH
fdui->graph[7] = gNBcommonGraph( puschThroughtput, FL_NORMAL_XYPLOT, 20, 480, 500, 100,
"PUSCH Throughput [frame]/[kbit/s]", FL_WHITE );
// I/Q PBCH comp fdui->graph[8].graph=NULL;
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 // Generic eNB Button
fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" ); 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_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
//openair_daq_vars.use_ia_receiver = 0;
fl_set_button(fdui->button_0,0); fl_set_button(fdui->button_0,0);
fl_set_object_label(fdui->button_0, "IA Receiver OFF"); 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_color(fdui->button_0, FL_RED, FL_RED);
fl_set_object_callback(fdui->button_0, ia_receiver_on_off, 0 ); fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 );
fl_hide_object(fdui->button_0); }
fl_end_form( ); 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; return fdui;
} }
void phy_scope_nrUE(FD_phy_scope_nrue *form, static FD_phy_scope_t *form_gnb[NUMBER_OF_UE_MAX]= {0};
PHY_VARS_NR_UE *phy_vars_ue, static unsigned char scope_enb_num_ue = 1;
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 void *scope_thread_gNB(void *arg) {
if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { scopeParms_t *p=(scopeParms_t *) arg;
harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid; //# ifdef ENABLE_XFORMS_WRITE_STATS
// FILE *gNB_stats = fopen("gNB_stats.txt", "w");
if (harq_pid>=8) //#endif
return;
mcs = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs; while (!oai_exit) {
int ue_cnt=0;
// Button 0 for(int UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
if(!phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { if ((ue_cnt<scope_enb_num_ue)) {
// we are in TM5 //this function needs to be written
fl_show_object(form->button_0); phy_scope_gNB(form_gnb[ue_cnt], p->gNB, p->ru, UE_id);
ue_cnt++;
} }
} }
if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) { usleep(99*1000);
num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols;
} }
// coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); // printf("%s",stats_buffer);
if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { /*#ifdef ENABLE_XFORMS_WRITE_STATS
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, if (eNB_stats) {
phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, rewind (gNB_stats);
get_Qm(mcs), fwrite (stats_buffer, 1, len, gNB_stats);
phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, fclose (gNB_stats);
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);
} }
*/
#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_id<scope_enb_num_ue; UE_id++) {
form_gnb[UE_id] = create_phy_scope_gnb(UE_id);
} // UE_id
//pdsch_mag = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0]; pthread_t forms_thread;
threadCreate(&forms_thread, scope_thread_gNB, p, "scope", -1, OAI_PRIORITY_RT_LOW);
}
static void ueTimeResponse (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Received signal in time domain of receive antenna 0 // Received signal in time domain of receive antenna 0
if ( phy_vars_ue->common_vars.rxdata) { if (! phy_vars_ue->common_vars.rxdata)
int16_t** rxsig_t = (int16_t**) 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 rxsig_t_dB[nb_antennas_rx][samples_per_frame];
float time[samples_per_frame]; float time[samples_per_frame];
if (rxsig_t[0] != NULL) { if (rxsig_t[0] != NULL) {
for (i=0; i<samples_per_frame; i++) { for (int i=0; i<samples_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]))); 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; time[i] = (float) i;
} }
fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],samples_per_frame,"","",""); fl_set_xyplot_data(graph,time,rxsig_t_dB[0],samples_per_frame,"","","");
} }
/* for (int arx=1; arx<nb_antennas_rx; arx++) {
for (arx=1; arx<nb_antennas_rx; arx++) {
if (rxsig_t[arx] != NULL) { if (rxsig_t[arx] != NULL) {
for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) { for (int i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; 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]))); 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_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]); fl_add_xyplot_overlay(graph,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
} }
} }
*/
}
if (phy_vars_ue->is_synchronized==0) { if (phy_vars_ue->is_synchronized==0) {
//float corr[samples_per_frame]; //float corr[samples_per_frame];
for (ind=0;ind<3;ind++) { for (int ind=0; ind<3; ind++) {
/* /*
if (pss_corr_ue[ind]) { if (pss_corr_ue[ind]) {
for (i=0; i<samples_per_frame; i++) { for (i=0; i<samples_per_frame; i++) {
...@@ -622,24 +521,25 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form, ...@@ -622,24 +521,25 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form,
} }
*/ */
} }
}
else {
if (overlay) { //there was a previous overlay // if the UE is not synchronized, we can make only the time*power graph
fl_clear_xyplot(form->chest_t);
overlay = 0;
} }
}
static void ueChannelResponse (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Channel Impulse Response // Channel Impulse Response
if (!phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time)
return;
if (phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time) { NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
int16_t **chest_t = (int16_t**) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time; 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;
ymax = 0; int ymax = 0;
float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size]; float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size];
float time[frame_parms->ofdm_symbol_size>>3]; float time[frame_parms->ofdm_symbol_size>>3];
if (chest_t[0] !=NULL) { if (chest_t[0] !=NULL) {
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) { 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]); 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; time[i] = (float) i;
...@@ -647,45 +547,48 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form, ...@@ -647,45 +547,48 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form,
ymax = chest_t_abs[0][i]; ymax = chest_t_abs[0][i];
} }
fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","",""); fl_set_xyplot_data(graph,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","","");
} }
/*
for (arx=1; arx<nb_antennas_rx; arx++) { for (int arx=1; arx<nb_antennas_rx; arx++) {
if (chest_t[arx] !=NULL) { if (chest_t[arx] !=NULL) {
for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) { for (int i=0; i<(frame_parms->ofdm_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]); 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) if (chest_t_abs[arx][i] > ymax)
ymax = chest_t_abs[arx][i]; 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_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(form->chest_t,arx,FL_DASHED_XYPLOT); fl_set_xyplot_overlay_type(graph,arx,FL_DASHED_XYPLOT);
} }
} }
*/
// Avoid flickering effect // Avoid flickering effect
// fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work... // 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_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) // Channel Frequency Response (includes 5 complex sample for filter)
if (phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates) { if (!phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates)
int16_t ** chest_f = (int16_t**) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates; return;
ind = 0; 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 chest_f_abs[frame_parms->ofdm_symbol_size];
float freq[frame_parms->ofdm_symbol_size]; float freq[frame_parms->ofdm_symbol_size];
for (atx=0; atx<nb_antennas_tx; atx++) { for (int atx=0; atx<nb_antennas_tx; atx++) {
for (arx=0; arx<nb_antennas_rx; arx++) { for (int arx=0; arx<nb_antennas_rx; arx++) {
if (chest_f[(atx<<1)+arx] != NULL) { if (chest_f[(atx<<1)+arx] != NULL) {
for (k=0; k<frame_parms->ofdm_symbol_size; k++) { for (int k=0; k<frame_parms->ofdm_symbol_size; k++) {
freq[ind] = (float)ind; freq[ind] = (float)ind;
float Re = (float)(chest_f[(atx<<1)+arx][6144+(2*k)]); float Re = (float)(chest_f[(atx<<1)+arx][6144+(2*k)]);
float Im = (float)(chest_f[(atx<<1)+arx][6144+(2*k)+1]); 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)); chest_f_abs[ind] = (short)10*log10(1.0+((double)Re*Re + (double)Im*Im));
ind++; ind++;
} }
...@@ -698,130 +601,168 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form, ...@@ -698,130 +601,168 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form,
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2); //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2); // fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR); //fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,frame_parms->ofdm_symbol_size,"","",""); fl_set_xyplot_data(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,"","","");
}
/*
for (arx=1; arx<nb_antennas_rx; 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; atx<nb_antennas_tx; atx++) {
for (arx=0; arx<nb_antennas_rx; arx++) {
fl_add_xyplot_overlay(form->chest_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 uePbchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PBCH LLRs // PBCH LLRs
if ( phy_vars_ue->pbch_vars[eNB_id]->llr) { if ( !phy_vars_ue->pbch_vars[eNB_id]->llr)
int16_t* pbch_llr = (int16_t*) 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]; float llr_pbch[1920], bit_pbch[1920];
for (i=0; i<864; i++) { for (int i=0; i<864; i++) {
llr_pbch[i] = (float) pbch_llr[i]; llr_pbch[i] = (float) pbch_llr[i];
bit_pbch[i] = (float) i; bit_pbch[i] = (float) i;
} }
fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,864,"","",""); fl_set_xyplot_data(graph,bit_pbch,llr_pbch,864,"","","");
} }
first_symbol=1;
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 // PBCH I/Q of MF Output
if (phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]) { if (!phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0])
int16_t * pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; return;
int16_t *pbch_comp = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
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;
float I[432];
float Q[432];
for (symbol=first_symbol; symbol<(first_symbol+3); symbol++) {
if (symbol == 2 || symbol == 6) if (symbol == 2 || symbol == 6)
nb_re = 72; nb_re = 72;
else else
nb_re = 180; nb_re = 180;
for (i=0; i<nb_re; i++) {
I[i] = pbch_comp[2*symbol*20*12+2*i]; AssertFatal(base+nb_re<180*3,"");
Q[i] = pbch_comp[2*symbol*20*12+2*i+1];
} for (int i=0; i<nb_re; i++) {
I[base+i] = pbch_comp[2*symbol*20*12+2*i];
Q[base+i] = pbch_comp[2*symbol*20*12+2*i+1];
} }
fl_set_xyplot_data(form->pbch_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 // PDCCH LLRs
if (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)
int8_t* pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr; return;
float llr_pdcch[12*frame_parms->N_RB_DL*num_pdcch_symbols*2]; NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
float bit_pdcch[12*frame_parms->N_RB_DL*num_pdcch_symbols*2]; 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 for (int atx=0; atx<nb_antennas_tx; atx++) {
llr_pdcch[i] = (float) pdcch_llr[2*24*9 +i]; for (int arx=0; arx<nb_antennas_rx; arx++) {
bit_pdcch[i] = (float) i; if (chest_f[(atx<<1)+arx] != NULL) {
for (int k=0; k<frame_parms->ofdm_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->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","","");
} }
// 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 // PDCCH I/Q of MF Output
if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0]) { if (!phy_vars_ue->pdcch_vars[0][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]; 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];
float I[frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2]; for (int i=0; i< nb; i++) {
float Q[frame_parms->ofdm_symbol_size*frame_parms->symbols_per_slot*2]; I[base+i] = pdcch_comp[i*2];
for (i=0; i<100; i++) { Q[base+i] = pdcch_comp[i*2+1];
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,"","","");
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 // PDSCH LLRs
if (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]) { if (!phy_vars_ue->pdsch_vars[0][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 return;
// pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
int num_re = 4500; int num_re = 4500;
int Qm = 2; int Qm = 2;
int coded_bits_per_codeword = num_re*Qm; int coded_bits_per_codeword = num_re*Qm;
float llr[coded_bits_per_codeword]; localBuff(llr,coded_bits_per_codeword*RX_NB_TH_MAX);
float bit[coded_bits_per_codeword]; localBuff(bit,coded_bits_per_codeword*RX_NB_TH_MAX);
int base=0;
for (i=0; i<coded_bits_per_codeword; i++) { for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
llr[i] = (float) pdsch_llr[i]; int16_t *pdsch_llr = (int16_t *) phy_vars_ue->pdsch_vars[thr][eNB_id]->llr[0]; // stream 0
bit[i] = (float) i;
for (int i=0; i<coded_bits_per_codeword; i++) {
llr[base+i] = (float) pdsch_llr[i];
bit[base+i] = (float) base+i;
} }
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); base+=coded_bits_per_codeword;
fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","","");
} }
first_symbol = 2; //fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
ind = 0; 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 // PDSCH I/Q of MF Output
if (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0]) { if (!phy_vars_ue->pdsch_vars[0][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]; return;
float I[nb_symb_sch]; NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
float Q[nb_symb_sch]; int sz=7*2*frame_parms->N_RB_DL*12; // size of the malloced buffer
for (symbol=0;symbol<nb_symb_sch;symbol++) { localBuff(I,sz*RX_NB_TH_MAX);
for (i=0; i<nb_rb_pdsch*12; i++) { localBuff(Q,sz*RX_NB_TH_MAX);
I[ind] = pdsch_comp[2*((first_symbol+symbol)*frame_parms->N_RB_DL*12+i) ]; int base=0;
Q[ind] = pdsch_comp[2*((first_symbol+symbol)*frame_parms->N_RB_DL*12+i)+1];
ind++; 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<sz; s++) {
I[s+base] += pdsch_comp[2*s];
Q[s+base] += pdsch_comp[2*s+1];
} }
fl_set_xyplot_data(form->pdsch_comp,I,Q,nb_symb_sch*nb_rb_pdsch*12,"","",""); base+=sz;
} }
fl_set_xyplot_data(graph,I,Q,base,"","","");
/* /*
// PDSCH Throughput // PDSCH Throughput
...@@ -839,33 +780,95 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form, ...@@ -839,33 +780,95 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form,
fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]); fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]);
*/ */
}
fl_check_forms(); 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;
}
typedef struct { void phy_scope_nrUE(FD_phy_scope_t *form,
FL_FORM *stats_form; PHY_VARS_NR_UE *phy_vars_ue,
void *vdata; int eNB_id,
char *cdata; int UE_id) {
long ldata; static FD_phy_scope_t *remeberForm=NULL;
FL_OBJECT *stats_text;
FL_OBJECT *stats_button;
} FD_stats_form;
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();
}
// 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; //FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
//char title[255]; //char title[255];
unsigned char scope_enb_num_ue = 1;
//static pthread_t forms_thread; //xforms //static pthread_t forms_thread; //xforms
static void reset_stats_gNB(FL_OBJECT *button,
long arg) {
void reset_stats_gNB(FL_OBJECT *button,
long arg)
{
int i,k; int i,k;
//PHY_VARS_gNB *phy_vars_gNB = RC.gNB[0][0]; //PHY_VARS_gNB *phy_vars_gNB = RC.gNB[0][0];
...@@ -886,43 +889,7 @@ void reset_stats_gNB(FL_OBJECT *button, ...@@ -886,43 +889,7 @@ void reset_stats_gNB(FL_OBJECT *button,
} }
} }
static FD_stats_form *create_form_stats_form(int ID) {
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_id<NUMBER_OF_UE_MAX; UE_id++) {
if ((ue_cnt<scope_enb_num_ue)) {
//this function needs to be written
phy_scope_gNB(form_gnb[ue_cnt], p->gNB, p->ru, UE_id);
ue_cnt++;
}
}
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 ) {
FL_OBJECT *obj; FL_OBJECT *obj;
FD_stats_form *fdui = fl_malloc( sizeof *fdui ); FD_stats_form *fdui = fl_malloc( sizeof *fdui );
fdui->vdata = fdui->cdata = NULL; fdui->vdata = fdui->cdata = NULL;
...@@ -941,23 +908,32 @@ FD_stats_form * create_form_stats_form( void ) { ...@@ -941,23 +908,32 @@ FD_stats_form * create_form_stats_form( void ) {
return fdui; return fdui;
} }
void startScope(scopeParms_t * p) { static FD_phy_scope_t *form_nrue[NUMBER_OF_UE_MAX];
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL; static pthread_t forms_thread;
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_id<scope_enb_num_ue; UE_id++) { static void *scope_thread(void *arg) {
form_gnb[UE_id] = create_phy_scope_gnb(); PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg;
sprintf (title, "LTE UL SCOPE eNB for UE %d",UE_id);
fl_show_form (form_gnb[UE_id]->phy_scope_gnb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
} // UE_id
pthread_t forms_thread; while (!oai_exit) {
threadCreate(&forms_thread, scope_thread_gNB, p, "scope", -1, OAI_PRIORITY_RT_LOW); 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);
} }
...@@ -35,37 +35,6 @@ ...@@ -35,37 +35,6 @@
//#include "PHY/impl_defs_top.h" //#include "PHY/impl_defs_top.h"
#include "PHY/defs_nr_UE.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 { typedef struct {
int *argc; int *argc;
char **argv; char **argv;
...@@ -73,17 +42,8 @@ typedef struct { ...@@ -73,17 +42,8 @@ typedef struct {
PHY_VARS_gNB *gNB; PHY_VARS_gNB *gNB;
} scopeParms_t; } 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 startScope(scopeParms_t * p);
void init_scope(PHY_VARS_NR_UE *ue);
extern RAN_CONTEXT_t RC; extern RAN_CONTEXT_t RC;
#endif #endif
...@@ -41,11 +41,9 @@ ...@@ -41,11 +41,9 @@
AGENT_PHY_xface *flexran_agent_get_phy_xface(mid_t mod_id); 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 */ /* 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]; extern AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB];
#define flexran_agent_get_mac_xface(mod_id) (agent_mac_xface[mod_id]) #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 */ /* 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); // AGENT_RRC_xface *flexran_agent_get_rrc_xface(mid_t mod_id);
extern AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]; extern AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB];
......
...@@ -131,7 +131,6 @@ void *gNB_app_task(void *args_p) ...@@ -131,7 +131,6 @@ void *gNB_app_task(void *args_p)
uint32_t gnb_nb = RC.nb_nr_inst; uint32_t gnb_nb = RC.nb_nr_inst;
uint32_t gnb_id_start = 0; uint32_t gnb_id_start = 0;
uint32_t gnb_id_end = gnb_id_start + gnb_nb; uint32_t gnb_id_end = gnb_id_start + gnb_nb;
uint32_t x2_register_gnb_pending = 0;
uint32_t gnb_id; uint32_t gnb_id;
MessageDef *msg_p = NULL; MessageDef *msg_p = NULL;
const char *msg_name = NULL; const char *msg_name = NULL;
......
...@@ -2670,7 +2670,6 @@ void nr_ue_send_sdu(module_id_t module_idP, ...@@ -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); LOG_D(MAC, "Handling PDU frame %d slot %d\n", frameP, slotP);
uint8_t * pduP = pdu; 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); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
......
...@@ -375,7 +375,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -375,7 +375,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
int CC_id, UE_id = 0; int CC_id, UE_id = 0;
gNB_MAC_INST *gNB = RC.nrmac[module_idP]; gNB_MAC_INST *gNB = RC.nrmac[module_idP];
NR_UE_list_t *UE_list = &gNB->UE_list; 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_COMMON_channels_t *cc = gNB->common_channels;
NR_sched_pucch *pucch_sched = (NR_sched_pucch*) malloc(sizeof(NR_sched_pucch)); 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, ...@@ -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 // TbD once RACH is available, start ta_timer when UE is connected
#if 0 #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) ue_sched_ctl->ta_timer--;
if (ue_sched_ctl->ta_timer == 0) { if (ue_sched_ctl->ta_timer == 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment