diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 61135c2f08918ed4fb0f3e8a2d1f83ad5e89dbc2..90d2484b8f9bb16f5c25b213955cd4b63c50fe97 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -1488,6 +1488,7 @@ void *ru_thread( void *param ) { int slot_type = nr_slot_select(cfg,proc->frame_rx,proc->tti_rx); if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) { + //if (proc->tti_rx==8) { if (ru->feprx) ru->feprx(ru,proc->tti_rx); //LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1); diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 9812a0cdc0fe6ebb6739465fc34da8277995ca11..f0450b6e55c2c787c3fbd2fa5b41091da94c4d4f 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -852,6 +852,7 @@ void init_pdcp(void) { }*/ } + int main( int argc, char **argv ) { int i, ru_id, CC_id = 0; @@ -948,38 +949,8 @@ init_opt(); mlockall(MCL_CURRENT | MCL_FUTURE); pthread_cond_init(&sync_cond,NULL); pthread_mutex_init(&sync_mutex, NULL); -/*#ifdef XFORMS - int UE_id; - if (do_forms==1) { - fl_initialize (&argc, 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(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) { - for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - form_gnb[CC_id][UE_id] = create_phy_scope_gnb(); - sprintf (title, "LTE UL SCOPE eNB for CC_id %d, UE %d",CC_id,UE_id); - fl_show_form (form_gnb[CC_id][UE_id]->phy_scope_gnb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - - if (otg_enabled) { - fl_set_button(form_gnb[CC_id][UE_id]->button_0,1); - fl_set_object_label(form_gnb[CC_id][UE_id]->button_0,"DL Traffic ON"); - } else { - fl_set_button(form_gnb[CC_id][UE_id]->button_0,0); - fl_set_object_label(form_gnb[CC_id][UE_id]->button_0,"DL Traffic OFF"); - } - } // CC_id - } // UE_id - - threadCreate(&forms_thread, scope_thread, NULL, "scope", -1, OAI_PRIORITY_RT_LOW); - printf("Scope thread created, ret=%d\n",ret); - } - -#endif*/ - usleep(10*1000); + usleep(1000); if (nfapi_mode) { printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); @@ -1049,6 +1020,13 @@ init_opt(); // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration) printf("ALL RUs ready - init gNBs\n"); + if (do_forms==1) { + scopeParms_t p; + p.argc=&argc; + p.argv=argv; + startScope(&p); + } + if (nfapi_mode != 1 && nfapi_mode != 2) { printf("Not NFAPI mode - call init_eNB_afterRU()\n"); init_eNB_afterRU(); @@ -1082,28 +1060,7 @@ init_opt(); printf("Terminating application - oai_exit=%d\n",oai_exit); #endif - // stop threads -/*#ifdef XFORMS - - printf("waiting for XFORMS thread\n"); - - if (do_forms==1) { - pthread_join(forms_thread,&status); - fl_hide_form(form_stats->stats_form); - fl_free_form(form_stats->stats_form); - - fl_hide_form(form_stats_l2->stats_form); - fl_free_form(form_stats_l2->stats_form); - - for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) { - for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - fl_hide_form(form_enb[CC_id][UE_id]->phy_scope_gNB); - fl_free_form(form_enb[CC_id][UE_id]->phy_scope_gNB); - } - } - } - -#endif*/ + // stop threads printf("stopping MODEM threads\n"); // cleanup stop_gNB(NB_gNB_INST); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index c661fbd292d6971d67d69ae7b967367297f2fd5e..c26961874374357b1432e0255b7f2dfe43eef925 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -174,8 +174,10 @@ uint8_t nr_generate_dci_top(nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu, int rb_offset; int n_rb; + AssertFatal(pdcch_pdu!=NULL || ul_dci_pdu!=NULL,"At least one pointer has to be !NULL\n"); AssertFatal(pdcch_pdu==NULL || ul_dci_pdu==NULL,"Can't handle both DL and UL DCI in same slot\n"); + if (pdcch_pdu) pdcch_pdu_rel15 = &pdcch_pdu->pdcch_pdu_rel15; else if (ul_dci_pdu) pdcch_pdu_rel15 = &ul_dci_pdu->pdcch_pdu.pdcch_pdu_rel15; diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index c59132c3c281352358857e855f8386960f42e6c0..cc89fb3f9b6762f86c77f187fdc66d84acab5820 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -152,6 +152,7 @@ FD_phy_scope_gnb *create_phy_scope_gnb( void ) void phy_scope_gNB(FD_phy_scope_gnb *form, PHY_VARS_gNB *phy_vars_gnb, + RU_t *phy_vars_ru, int UE_id) { int i,i2,arx,atx,ind,k; @@ -159,7 +160,7 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, 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 - int16_t **rxsig_t; + int16_t **rxsig_t, **rxsig_f; int16_t **chest_t=NULL; int16_t **chest_f=NULL; int16_t *pusch_llr=NULL; @@ -171,17 +172,16 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, float *llr, *bit; float I[nsymb_ce*2], Q[nsymb_ce*2]; float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240]; - float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES]; - float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size]; - float *chest_f_abs; - float time[FRAME_LENGTH_COMPLEX_SAMPLES]; - float time2[2048]; + float *rxsig_t_dB[nb_antennas_rx]; + float *rxsig_f_dB[nb_antennas_rx]; + float time[frame_parms->samples_per_frame]; float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; // uint32_t total_dlsch_bitrate = phy_vars_gnb->total_dlsch_bitrate; int coded_bits_per_codeword = 0; uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2 int Qm = 2; + /* if (!RC.nrmac[0]->UE_list.active[UE_id]) return; @@ -191,14 +191,18 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, //Qm = cmax(phy_vars_gnb->ulsch[UE_id][0]->harq_processes->Qm,Qm); } } - + */ coded_bits_per_codeword = frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti; - chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); + for (arx=0; arx<nb_antennas_rx; arx++) { + rxsig_t_dB[arx] = (float*) calloc(frame_parms->samples_per_frame,sizeof(float)); + rxsig_f_dB[arx] = (float*) calloc(frame_parms->samples_per_slot_wCP,sizeof(float)); + } llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero bit = malloc(coded_bits_per_codeword*sizeof(float)); - rxsig_t = (int16_t**) phy_vars_gnb->common_vars.rxdata; + rxsig_t = (int16_t**) phy_vars_ru->common.rxdata; + rxsig_f = (int16_t**) phy_vars_ru->common.rxdataF; //chest_t = (int16_t**) phy_vars_gnb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; /* chest_t = (int16_t**) phy_vars_gnb->srs_vars[UE_id].srs_ch_estimates; chest_f = (int16_t**) phy_vars_gnb->pusch_vars[UE_id]->drs_ch_estimates; @@ -212,25 +216,26 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, // Received signal in time domain of receive antenna 0 if (rxsig_t != NULL) { if (rxsig_t[0] != NULL) { - for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) { + for (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]))); time[i] = (float) i; } - fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","",""); + fl_set_xyplot_data(form->rxsig_t,time,rxsig_t_dB[0],frame_parms->samples_per_frame,"","",""); } for (arx=1; arx<nb_antennas_rx; arx++) { if (rxsig_t[arx] != NULL) { - for (i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) { + for (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]))); } - 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(form->rxsig_t,arx,time,rxsig_t_dB[arx],frame_parms->samples_per_frame,rx_antenna_colors[arx]); } } } + /* // Channel Impulse Response if (chest_t != NULL) { ymax = 0; @@ -268,12 +273,22 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); fl_set_xyplot_ybounds(form->chest_t,0,ymax); } - + */ + // Channel Frequency Response - if (chest_f != NULL) { - ind = 0; + if (rxsig_f != NULL) { + if (rxsig_f[0] != NULL) { + for (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]))); + time[i] = (float) i; + } + + fl_set_xyplot_data(form->chest_t,time,rxsig_f_dB[0],frame_parms->samples_per_slot_wCP,"","",""); + } + } + + /* - for (atx=0; atx<nb_antennas_tx; atx++) { for (arx=0; arx<nb_antennas_rx; arx++) { if (chest_f[(atx<<1)+arx] != NULL) { for (k=0; k<nsymb_ce; k++) { @@ -371,11 +386,12 @@ void phy_scope_gNB(FD_phy_scope_gnb *form, // fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax); // fl_set_xyplot_ybounds(form->pusch_tput,0,ymax); + */ + fl_check_forms(); free(llr); free(bit); - free(chest_f_abs); } FD_phy_scope_nrue *create_phy_scope_nrue( void ) @@ -863,11 +879,10 @@ typedef struct { // 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[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; -static FD_phy_scope_gnb *form_gnb[NUMBER_OF_UE_MAX]; +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 = 2; +unsigned char scope_enb_num_ue = 1; //static pthread_t forms_thread; //xforms @@ -908,7 +923,7 @@ static void *scope_thread_gNB(void *arg) { for(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], RC.gNB[0], UE_id); + phy_scope_gNB(form_gnb[ue_cnt], RC.gNB[0], RC.ru[0], UE_id); ue_cnt++; } } @@ -954,11 +969,13 @@ 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_id<scope_enb_num_ue; UE_id++) { form_gnb[UE_id] = create_phy_scope_gnb(); sprintf (title, "LTE UL SCOPE eNB for UE %d",UE_id); diff --git a/openair1/PHY/TOOLS/nr_phy_scope.h b/openair1/PHY/TOOLS/nr_phy_scope.h index 770006d2344324b2e7715008d3c6849a586cc479..aaee08a554bf9fe27c8ce5742531f3d4c29e1bd6 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.h +++ b/openair1/PHY/TOOLS/nr_phy_scope.h @@ -78,6 +78,7 @@ FD_phy_scope_nrue * create_phy_scope_nrue( void ); void phy_scope_gNB(FD_phy_scope_gnb *form, PHY_VARS_gNB *phy_vars_gnb, + RU_t *phy_vars_ru, int UE_id);