int main(int argc, char *argv[]){ FL_FORM *form; FL_OBJECT *obj; fl_initialize(&argc, argv, "FormDemo", 0, 0); form = fl_bgn_form(FL_UP_BOX,320,120); fl_add_box(FL_NO_BOX,160,40,0,0,"Welcome to LanAdmin"); obj = fl_add_button(FL_NORMAL_BUTTON,40,70,80,30,"Connect"); fl_set_object_callback(obj, connect_cback,0); obj = fl_add_button(FL_NORMAL_BUTTON,200,70,80,30,"Leave"); fl_set_object_callback(obj, leave_cback,0); fl_end_form(); fl_show_form(form,FL_PLACE_MOUSE,FL_TRANSIENT,"LanAdmin"); fl_do_forms(); return 0; }
int main( int argc, char * argv[ ] ) { int old_col = 1, new_col = 0; fl_initialize( &argc, argv, "FormDemo", 0, 0 ); while ( old_col != new_col ) { old_col = new_col; new_col = fl_show_colormap( old_col ); } fl_finish( ); return 0; }
int main(int argc, char *argv[]) { Int4 entries; FL_IOPT opt; CheckHost(); /* There is a conflict between forms and xew about the meaning of the arguments: The "-p" option is taken as "-privat" by fl_initialize(), forcing a private colourmap. This is what we want anyway, so ok... :-). We just call GetArgs() first, because fl_initialize() removes the "-p" from argv[] .... */ GetArgs(argc, argv); /* Force private colourmap (why do I need opt?) */ fl_set_defaults( FL_PDPrivateMap, &opt ); fl_initialize(&argc, argv, "XEw", NULL, 0); /* Set up our signal handlers */ signal(SIGINT, SigHandler); signal(SIGTERM, SigHandler); create_the_forms(); set_object_defaults(); /* load logo */ fl_set_pixmap_data(img_pxm, xew_logo_xpm); fl_show_form(xew_mainf,FL_PLACE_MOUSE, FL_FULLBORDER, "xew"); entries = ReadFiles(); FillBrowser( entries ); fl_do_forms(); return EXIT_FAILURE ; /* shouldn't be reached */ }
int main(int argc, char * argv[]) { //DEFININDO SEMENTE DO RAND srand(time(NULL)); cria_processos_chamada=0; primeira_vez=1; XInitThreads(); //DEFINICOES DO FORMULARIO FD_projeto *fd_projeto; fl_initialize( &argc, argv, 0, 0, 0 ); fd_projeto = create_form_projeto(); fl_show_form( fd_projeto->projeto, FL_PLACE_CENTERFREE, FL_FULLBORDER, "Núcleo Gerenciador de Processos" ); // THREAD DO NÚCLEO pthread_attr_setscope(&T_NUCLEO_ATTR, PTHREAD_SCOPE_SYSTEM); pthread_attr_init(&T_NUCLEO_ATTR); pthread_create(&T_NUCLEO, &T_NUCLEO_ATTR, (void *) &nucleo, NULL); //LOOP DO FORMULARIO while(1) { //printf("passei antees do_forms\n"); //fflush(stdout); fl_do_forms(); sleep(1); } //pthread_join(T_ESCALONADOR, NULL); //FINALIZANDO FORMULARIO if ( fl_form_is_visible( fd_projeto->projeto ) ) fl_hide_form( fd_projeto->projeto ); fl_free( fd_projeto ); fl_finish(); return 0; }
int main( int argc, char * argv[ ] ) { fl_initialize( &argc, argv, "FormDemo", 0, 0 ); create_form_form( ); fill_in( barchart ); fill_in( horbarchart ); fill_in( linechart ); fl_set_object_helper( linechart, "A LineChart" ); fill_in( filledchart ); fill_in( spikechart ); fill_in( piechart ); fill_in( specialpiechart ); fl_show_form( form, FL_PLACE_CENTER, FL_TRANSIENT, "Charts" ); fl_do_forms( ); fl_finish( ); return 0; }
int main(int argc, char *argv[]) { void lmst_update (FL_OBJECT *, long); int i; void dismiss_psr(); void spectrum_hide(); void tp_hide (); void hide_waterfall(); void hide_interferometer(); void hide_info(); void receiver_leave(); int close_sub (); int close_main (); char *p; char fntstr[128]; char d[128]; int binwidth; /* * Init xforms library */ fl_initialize(&argc, argv, "Ira", 0, 0); fl_get_app_resources (NULL, 0); time (&started_at); /* * Create various windows, including the main one */ fd_receiver_main = create_form_receiver_main(); fl_set_form_atclose(fd_receiver_main->receiver_main, close_main, 0); fd_receiver_pulsar = create_form_receiver_pulsar(); fl_set_form_atclose (fd_receiver_pulsar->receiver_pulsar, close_sub, dismiss_psr); fd_receiver_spectrum = create_form_receiver_spectrum(); fl_set_form_atclose (fd_receiver_spectrum->receiver_spectrum, close_sub, spectrum_hide); fd_receiver_continuum = create_form_receiver_continuum(); fl_set_form_atclose (fd_receiver_continuum->receiver_continuum, close_sub, tp_hide); fd_receiver_waterfall = create_form_receiver_waterfall(); fl_set_form_atclose (fd_receiver_waterfall->receiver_waterfall, close_sub, hide_waterfall); fd_receiver_info = create_form_receiver_info(); fl_set_form_atclose (fd_receiver_info->receiver_info, close_sub, hide_info); fd_receiver_lproblem = create_form_receiver_lproblem (); fd_receiver_error = create_form_receiver_error (); fd_receiver_shutdown = create_form_receiver_shutdown (); flps_init(); fl_free_pixmap_pixmap(fd_receiver_main->ira_xpm_button); fl_set_pixmap_data(fd_receiver_main->ira_xpm_button, Ira_xpm); sprintf (version_info, "Ver: %s (BETA)", VERSION); /* * Stuff lines in info window */ for (i = 0; ; i++) { if (ira_info[i] == NULL) { break; } fl_add_browser_line (fd_receiver_info->info_browser, ira_info[i]); } fl_set_browser_fontsize(fd_receiver_info->info_browser, 14); /* fill-in form initialization code */ fl_set_object_label (fd_receiver_main->startup_text, "PLEASE WAIT........."); /* show the first form */ fl_show_form(fd_receiver_main->receiver_main,FL_PLACE_CENTER,FL_FULLBORDER,"IRA Control Panel"); fl_check_forms(); /* * Now we check a raft of environment variables, and use those to initialize * various settable values */ refmult = 1.0; if ((p = getenv ("RCVR_REF_MULT")) != NULL) { refmult = atof(p); } fl_set_slider_value (fd_receiver_main->refmult_slider, refmult); seti_integ = 15; if ((p = getenv ("RCVR_SETI_INTEG")) != NULL) { seti_integ = (int)atof(p); } fl_set_slider_value (fd_receiver_main->seti_integ_slider, (float)seti_integ); strcpy (datadir, "."); if ((p = getenv ("RCVR_DATA_DIR")) != NULL) { strcpy (datadir, p); } /* * Set the input field for freq, as well as the actual frequency */ if ((p = getenv ("RCVR_INITIAL_FREQ")) != NULL) { fl_set_input (fd_receiver_main->frequency_input, p); frequency = atof(p); sky_freq = frequency; sky_locked = 1; } /* * Start out with sky_freq unavailable for input */ fl_deactivate_object (fd_receiver_main->sky_freq_input); fl_set_input (fd_receiver_main->sky_freq_input, "--------"); /* If there's a sky_freq parameter, use it, and re-activate the * sky_freq_input control */ if ((p = getenv ("RCVR_SKY_FREQ")) != NULL) { if (abs(atof(p) - frequency) > 100.0) { sky_locked = 0; fl_set_input (fd_receiver_main->sky_freq_input, p); sky_freq = atof(p); fl_activate_object (fd_receiver_main->sky_freq_input); fl_set_button (fd_receiver_main->sky_lock_button, 0); } else { sky_freq = atof(p); fl_set_button (fd_receiver_main->sky_lock_button, 1); sky_locked = 1; } } PUSHVAR("ifreq", frequency); PUSHVAR("skyfreq", sky_freq); /* * * And again for RF gain */ if ((p = getenv ("RCVR_RF_GAIN")) != NULL) { rf_gain = atoi(p); } fl_set_slider_value (fd_receiver_main->rf_gain_slider, rf_gain); PUSHVAR("igain", rf_gain); /* * Gain correction values for A and B sides */ if ((p = getenv ("RCVR_COR_A")) != NULL) { gc_a = atof(p); } sprintf (d, "%f", gc_a); fl_set_input (fd_receiver_main->gc_a, d); if ((p = getenv ("RCVR_COR_B")) != NULL) { gc_b = atof(p); } sprintf (d, "%f", gc_b); fl_set_input (fd_receiver_main->gc_b, d); /* * Set bounds/values for DC gain */ if ((p = getenv ("RCVR_DC_GAIN")) != NULL) { dc_gain = atof(p); } fl_set_slider_value (fd_receiver_main->dc_gain_control, dc_gain); /* * And again for DC offset */ if ((p = getenv ("RCVR_DC_OFFSET")) != NULL) { dc_offset = atof(p); } fl_set_slider_value (fd_receiver_main->dc_offset_control, dc_offset); /* * Receiver DC Gain multiplier */ if ((p = getenv ("RCVR_DC_MULT")) != NULL) { int which; dc_mult = (double)atoi(p); which = 1; /* * It's a choice widget, so we need to set 'which' appropriately */ switch ((int)dc_mult) { case 1: which = 1; break; case 5: which = 2; break; case 10: which = 3; break; case 15: which = 4; break; case 20: which = 5; break; case 25: which = 6; break; case 30: which=7; break; case 35: which = 8; break; case 40: which = 9; break; } fl_set_choice (fd_receiver_main->mult_choice, which); } /* * Total power integration value */ tp_integration = 5; if ((p = getenv ("RCVR_TP_INTEG")) != NULL) { tp_integration = atoi(p); } fl_set_slider_value (fd_receiver_main->continuum_int, (double)atof(getenv("RCVR_TP_INTEG")) ); /* * Spectral integration */ spec_integration = 15; if ((p = getenv ("RCVR_SPEC_INTEG")) != NULL) { spec_integration = atoi(p); } fl_set_slider_value (fd_receiver_main->spec_int_slider, (double)atof(getenv("RCVR_SPEC_INTEG")) ); /* * Sigma_K for SETI analysis */ sigma_k = 2.5; if ((p = getenv ("RCVR_SIGMA_K")) != NULL) { sigma_k = atof(p); } fl_set_slider_value (fd_receiver_main->sigma_k_slider, sigma_k); /* * Check desired receiver mode */ if (getenv("RCVR_MODE") != NULL) { strcpy (rcvr_mode, getenv("RCVR_MODE")); } else { strcpy (rcvr_mode, "unknown"); } /* * Interferometer? Create the interferometer window */ if (strcmp (rcvr_mode, "interferometer") == 0) { fd_receiver_interferometer = create_form_receiver_interferometer(); fl_set_form_atclose (fd_receiver_interferometer->receiver_interferometer, close_sub, hide_interferometer); } /* * Otherwise, delete the "show interferograms" control */ else { fl_delete_object (fd_receiver_main->interferometer_button); } /* * Various values */ declination = -28.3; if ((p = getenv ("RCVR_DECLINATION")) != NULL) { declination = atof(p); } fl_set_input (fd_receiver_main->declination_input, getenv("RCVR_DECLINATION")); longitude = 0.0; if ((p = getenv ("RCVR_LONGITUDE")) != NULL) { longitude = atof(p); } seti_size = 500000; if ((p = getenv ("RCVR_SETI_SIZE")) != NULL) { seti_size = atoi (p); } bandwidth = 5000000; if ((p = getenv ("RCVR_BANDWIDTH")) != NULL) { bandwidth = atoi (p); } psr_rate = 10000; if ((p = getenv ("RCVR_PSR_RATE")) != NULL) { psr_rate = atoi (getenv ("RCVR_PSR_RATE")); } for (i = 0; i < NNOTCHES; i++) { notches[i] = -1.0; } if ((p = getenv ("RCVR_NOTCHES")) != NULL) { char *tp; char pcopy[128]; FILE *fp; strcpy (pcopy, p); tp = strtok (pcopy, ","); notches[0] = atof(tp); for (i = 1; i < NNOTCHES; i++) { tp = strtok (NULL, ","); if (tp == NULL) { break; } notches[i] = atof(tp); } } if ((p = getenv ("RCVR_NOTCH_SIZE")) != NULL) { notch_length = atoi(p); fl_set_slider_value (fd_receiver_spectrum->notch_slider, (double)notch_length); } if ((p = getenv ("RCVR_DM")) != NULL) { pulsar_dm = atof(p); fl_set_slider_value (fd_receiver_main->dm_input, (double)pulsar_dm); } PUSHVAR("idm", pulsar_dm); if ((p = getenv ("PULSAR_RATE")) != NULL) { pulsar_rate = atof(p); fl_set_input (fd_receiver_main->pulsar_rate_input, p); } if ((p = getenv ("PULSAR_FOLDING")) != NULL) { pulsar_folding = atoi(p); fl_set_choice (fd_receiver_main->pulsar_choice, pulsar_folding/5); } /* * Set spec_fft_size based on width of spectral plot display */ { FL_Coord x, y, w, h; fl_get_object_bbox (fd_receiver_spectrum->spectral_plot, &x, &y, &w, &h); spec_fft_size = w-130; } tp_maxval = 100000; tp_span = 20000; /* * Establish parameters for TP plot */ if ((p = getenv("RCVR_TP_MAXVAL")) != NULL) { tp_maxval = (double)atoi(p); } if ((p = getenv ("RCVR_TP_SPAN")) != NULL) { tp_span = (double)atoi(p); } tp_minval = tp_maxval - tp_span; fl_set_slider_value (fd_receiver_continuum->tp_max_slider, (double)tp_maxval); fl_set_slider_value (fd_receiver_continuum->tp_span_slider, (double)tp_span); fl_set_xyplot_ybounds(fd_receiver_continuum->tp_chart, (double)tp_minval, (double)tp_maxval); fl_set_xyplot_ytics(fd_receiver_continuum->tp_chart, 10, 1); fl_set_xyplot_xgrid (fd_receiver_continuum->tp_chart, FL_GRID_MINOR); fl_set_xyplot_ygrid (fd_receiver_continuum->tp_chart, FL_GRID_MINOR); fl_set_object_posthandler(fd_receiver_continuum->tp_chart, continuum_plot_post); /* * Set a post handler for inteferometer display */ if (strcmp (rcvr_mode, "interferometer") == 0) { fl_set_object_posthandler(fd_receiver_interferometer->interferometer_chart, continuum_plot_post); if ((p = getenv ("RCVR_INT_GAIN")) != NULL) { interferometer_gain = atof(p); } if ((p = getenv ("RCVR_INT_SPAN")) != NULL) { interferometer_span = atof(p); } if ((p = getenv ("RCVR_PHCORR")) != NULL) { interferometer_phase = atof(p); } if ((p = getenv ("RCVR_DELAY")) != NULL) { interferometer_delay = atof(p); } fl_set_xyplot_ytics (fd_receiver_interferometer->interferometer_chart, 10, 1); fl_set_xyplot_xgrid (fd_receiver_interferometer->interferometer_chart, FL_GRID_MINOR); fl_set_xyplot_ygrid (fd_receiver_interferometer->interferometer_chart, FL_GRID_MINOR); fl_set_slider_value (fd_receiver_interferometer->int_gain_slider, interferometer_gain); fl_set_slider_value (fd_receiver_interferometer->int_span_slider, interferometer_span); fl_set_slider_value (fd_receiver_interferometer->phase_adjust, interferometer_phase); fl_set_slider_value (fd_receiver_interferometer->delay_adjust, interferometer_delay); fl_set_xyplot_ybounds (fd_receiver_interferometer->interferometer_chart, -1*interferometer_span, interferometer_span); } fl_add_timeout (1000.0, (FL_TIMEOUT_CALLBACK)lmst_update, 0); /* * Setup parameters for spectral plot */ if ((p = getenv ("RCVR_SPEC_MAX")) != NULL) { current_smax = atoi(p); } if ((p = getenv ("RCVR_SPEC_SPAN")) != NULL) { current_span = atoi(p); } if ((p = getenv ("RCVR_SPEC_FLAT")) != NULL) { spec_flat_on = atoi(p); fl_set_button (fd_receiver_spectrum->flaten_button, spec_flat_on); } if ((p = getenv ("RCVR_SPEC_METHOD")) != NULL) { spec_method = atoi (p); } fl_set_xyplot_xgrid(fd_receiver_spectrum->spectral_plot, FL_GRID_MINOR); fl_set_xyplot_ygrid(fd_receiver_spectrum->spectral_plot, FL_GRID_MINOR); fl_set_xyplot_ybounds(fd_receiver_spectrum->spectral_plot, (double)(current_smax-current_span), (double) current_smax); fl_set_xyplot_ytics(fd_receiver_spectrum->spectral_plot, 10, 1); fl_set_xyplot_xtics(fd_receiver_spectrum->spectral_plot, 10, 1); fl_set_object_posthandler(fd_receiver_spectrum->spectral_plot, spectral_plot_post); fl_set_choice (fd_receiver_spectrum->spec_method_choice, spec_method); fl_set_choice_fontsize (fd_receiver_spectrum->spec_method_choice, 14); fl_set_slider_value (fd_receiver_spectrum->spec_max_slider, (double)current_smax); fl_set_slider_value (fd_receiver_spectrum->spec_span_slider, (double)current_span); /* * Set post handler for pulsar display */ fl_set_object_posthandler(fd_receiver_pulsar->pulsar_plot, pulsar_plot_post); /* * Set parameters for waterfall (SETI) display */ { FL_Coord x, y; FL_Coord w, h; fl_get_object_bbox(fd_receiver_waterfall->waterfall_display, &x, &y, &w, &h); fl_set_slider_bounds (fd_receiver_waterfall->wfall_seg_slider, 1.0, (float)seti_size/w); fl_set_object_dblbuffer(fd_receiver_waterfall->waterfall_display, 1); if ((p = getenv ("RCVR_WFALL_SEGMENT")) != NULL) { waterfall_segment = atoi(p); fl_set_slider_value (fd_receiver_waterfall->wfall_seg_slider, (double)waterfall_segment); } if ((p = getenv ("RCVR_WFALL_FINE")) != NULL) { waterfall_fine = atoi(p); fl_set_slider_value (fd_receiver_waterfall->fine_segment, waterfall_fine); } if ((p = getenv ("RCVR_WFALL_BRIGHTNESS")) != NULL) { double w; w = atof(p); if (fabsf(w-1.0) < 0.1) { fl_set_choice (fd_receiver_waterfall->wfall_brightness, 1); w = 1.0; } if (fabsf(w-0.75) < 0.1) { fl_set_choice (fd_receiver_waterfall->wfall_brightness, 2); w = 0.75; } if (fabsf(w-0.66) < 0.1) { fl_set_choice (fd_receiver_waterfall->wfall_brightness, 3); w = 0.66; } if (fabsf(w-0.50) < 0.1) { fl_set_choice (fd_receiver_waterfall->wfall_brightness, 4); w = 0.50; } waterfall_brightness = (float)w; } } if ((p = getenv ("RCVR_TRANS_THRESH")) != NULL) { transient_threshold = atof(p); fl_set_slider_value (fd_receiver_main->trans_thr_slider, transient_threshold); } if ((p = getenv ("RCVR_TRANS_DUR")) != NULL) { transient_duration = atof(p); fl_set_slider_value (fd_receiver_main->trans_dur_slider, transient_duration); } /* * Open various FIFOs--that's where we get our data from */ if ((seti_fd = open ("ra_seti_fifo", O_RDONLY|O_NONBLOCK)) > 0) { fcntl (seti_fd, F_SETFL, 0); fl_add_io_callback (seti_fd, FL_READ, (FL_IO_CALLBACK)handle_seti_io, fd_receiver_main); } if ((pulsar_fd = open ("ra_psr_fifo", O_RDONLY|O_NONBLOCK)) > 0) { fcntl (pulsar_fd, F_SETFL, 0); fl_add_io_callback (pulsar_fd, FL_READ, (FL_IO_CALLBACK)handle_pulsar_io, fd_receiver_main); } if ((dicke_fd = open ("ra_switching_fifo", O_RDONLY|O_NONBLOCK)) > 0) { fcntl (dicke_fd, F_SETFL, 0); fl_set_object_label (fd_receiver_main->dicke_mode, "DICKE: ON"); fl_add_io_callback (dicke_fd, FL_READ, (FL_IO_CALLBACK)handle_dicke_io, fd_receiver_main); } if (strcmp (rcvr_mode, "interferometer") == 0) { if ((inter_fd = open ("ra_inter_fifo", O_RDONLY|O_NONBLOCK)) > 0) { fcntl (inter_fd, F_SETFL, 0); fl_add_io_callback (inter_fd, FL_READ, (FL_IO_CALLBACK)handle_inter_io, fd_receiver_main); } } if (strcmp (rcvr_mode, "split") == 0) { if ((validation_fd = open ("ra_validation_fifo", O_RDONLY|O_NONBLOCK)) > 0) { fcntl (validation_fd, F_SETFL, 0); split_mode = 1; fl_add_io_callback (validation_fd, FL_READ, (FL_IO_CALLBACK)handle_validation_io, fd_receiver_main); } } fl_set_oneliner_font (FL_FIXEDBOLDITALIC_STYLE, FL_MEDIUM_FONT); fl_set_oneliner_color (FL_GREEN, FL_BLACK); while(fl_do_forms()) ; return 0; }
int main(int argc, char **argv) { // initialize the world with particle2 file? if (argc>1) { char *file = argv[1]; if (!strcmp(file, ".")) particle2_read_stream(stdin, "stdin"); else { FILE *fp; fp = fopen(file, "r"); if (fp==NULL) { fprintf(stderr, "Can't open particle file %s\n", file); exit(1); } particle2_read_stream(fp, file); fclose(fp); } } /* initialize Xforms */ fl_initialize(&argc, argv, "n-body", 0, 0); ui = create_form_nbody(); // draw the UI window fl_show_form(ui->nbody, /* form */ FL_PLACE_SIZE, /* pos & size flags */ FL_FULLBORDER, /* border flags */ argv[0] /* window name */ ); // set up so we can draw in the big window of "ui" using OpenGL // set bits-per-pixel and other attributes of window // attributes for RGBA, without z-buffer, single-buffered // int single_attrs[] = // {GLX_RGBA, GLX_DEPTH_SIZE, 0, GLX_RED_SIZE, 4, None}; // attributes for RGBA, without z-buffer, double-buffered int double_attrs[] = {GLX_RGBA, GLX_DEPTH_SIZE, 0, GLX_RED_SIZE, 4, GLX_DOUBLEBUFFER, None}; glxf_bind_pane(&pane, ui->pane, // window double_attrs, // requested attributes for window handle_event // event_handler for window ); // set viewport for OpenGL glMatrixMode(GL_PROJECTION); gluOrtho2D(0, 1, 0, 1); glMatrixMode(GL_MODELVIEW); // leave matrix mode at MODELVIEW so that later transformations // (glScale, glTranslate) go into that matrix // save info about current transformations view.update(); // disable z-buffer and lighting glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); dt_proc(ui->dt_slider, 0); // initialize world.timestep world.draw(); // draw the world (clear the screen) // Xforms handles events until exit button is pushed // the following loop repeats continuously when the world is "running", // otherwise it sleeps in fl_do_forms() waiting for mouse motion or other // Xwindows events, so as to not eat up unneeded CPU time // We have callback procedures set up for the sliders, but not for // the run and exit buttons. // fl_check_forms() and fl_do_forms() return only when an event occurs // (button, slider, mouse motion...) for which no callback procedure has // been set. // Therefore, control returns here when the run or exit buttons is hit. FL_OBJECT *obj; do { if (world.running) { // if running: world.step(world.timestep); // take a time step world.draw(); // redraw obj = fl_check_forms(); // do a (non-blocking) check for events } else // if not running: obj = fl_do_forms(); // sleep until next event comes if (obj == ui->run_button) { // user just hit the run button; toggle it world.running = !world.running; } } while (obj != ui->exit_button); // keep going until exit button is hit return 0; }
int mainMhp(int argc, char ** argv) { #else int main(int argc, char ** argv) { #endif // modif Pepijn apropos dmax and tol int user_dmax_to_be_set = FALSE; /* Modif. Pepijn on dmax */ double user_dmax = 0.0; /* Modif. Pepijn on dmax */ int user_obj_tol_to_be_set = FALSE; /* Modif. Carl on tolerance */ double user_obj_tol = 0.0; // end modif Pepijn double user_volume, user_size; /* Modif. Carl on volume */ #ifndef BIO const char *file; #endif char file_directory[200]; char filename[200]; char scenario[200]; char dlrReadFile[200]; char dlrSaveFile[200]; int i = 0; /* carl: */ int seed_set = FALSE; int dir_set = FALSE; int file_set = FALSE; int scenario_set = FALSE; int col_det_set = FALSE; int col_mode_to_be_set = p3d_col_mode_kcd; /* Nic p3d_col_mode_v_collide;*/ int ccntrt_active = TRUE; // Tests int manip_test_run = FALSE; int manip_test_id = 0; // init English C if (! setlocale(LC_ALL, "C")) fprintf(stderr, "There was an error while setting the locale to \"C\"\n"); int grid_set = FALSE; std::string grid_path; // modif Brice SALVA #ifdef BIO int usrAnswer = FALSE; file_name_list* file_list = NULL; char name[PSF_MAX_NAME_LENGTH]; int is_p3d = FALSE; #endif if (! setlocale(LC_ALL, "C")) fprintf(stderr, "There was an error while setting the locale to \"C\"\n"); // End modif Brice SALVA /* lecture des arguments */ /* carl: */ i = 1; while (i < argc) { if (strcmp(argv[i], "-debug") == 0) { basic_alloc_debugon(); i++; } else if (strcmp(argv[i], "-d") == 0) { ++i; if ((i < argc)) { strcpy(file_directory, argv[i]); dir_set = TRUE; ++i; } else { use(); return 0; } } else if (strcmp(argv[i], "-f") == 0) { ++i; if ((i < argc)) { strcpy(filename, argv[i]); file_set = TRUE; ++i; } else { use(); return 0; } } else if (strcmp(argv[i], "-sc") == 0) { ++i; if ((i < argc)) { strcpy(scenario, argv[i]); scenario_set = TRUE; ++i; } else { use(); return 0; } } #ifdef P3D_COLLISION_CHECKING else if (strcmp(argv[i], "-o") == 0) { set_collision_by_object(FALSE); ++i; } else if (strcmp(argv[i], "-x") == 0) { FILTER_TO_BE_SET_ACTIVE = TRUE; ++i; } else if (strcmp(argv[i], "-nkcdd") == 0) { set_return_kcd_distance_estimate(FALSE); ++i; } #endif else if (strcmp(argv[i], "-s") == 0) { ++i; if ((i < argc)) { p3d_init_random_seed(atoi(argv[i])); seed_set = TRUE; ++i; } else { use(); return 0; } } else if (strcmp(argv[i], "-v") == 0) { ++i; if (i < argc) { user_size = atof(argv[i]); user_volume = user_size * user_size * user_size; #ifdef P3D_COLLISION_CHECKING kcd_set_user_defined_small_volume(user_volume); #endif ++i; } else { use(); return 0; } } else if (strcmp(argv[i], "-vol") == 0) { ++i; if (i < argc) { #ifdef P3D_COLLISION_CHECKING kcd_set_user_defined_small_volume(atof(argv[i])); #endif ++i; } else { use(); return 0; } } else if (strcmp(argv[i], "-tol") == 0) { ++i; if (i < argc) { user_obj_tol = atof(argv[i]) ; user_obj_tol_to_be_set = TRUE; ++i; } else { use(); return 0; } } else if (strcmp(argv[i], "-dmax") == 0) { ++i; if (i < argc) { user_dmax = atof(argv[i]) ; user_dmax_to_be_set = TRUE; ++i; } else { use(); return 0; } } else if (strcmp(argv[i], "-stat") == 0) { ++i; #ifdef P3D_PLANNER enableStats(); #endif } #if defined(HRI_COSTSPACE)// && defined(QT_GL) // else if (strcmp(argv[i], "-grid") == 0) { // ++i; // if ((i < argc)) { // grid_path = argv[i]; // //printf("Grid is at : %s\n",gridPath.c_str()); // grid_set = TRUE; // ++i; // } else { // use(); // return 0; // } // } #endif else if (strcmp(argv[i], "-udp") == 0) { } #ifdef LIGHT_PLANNER else if (strcmp(argv[i], "-no-ccntrt") == 0) { printf("Deactivate ccntrt at startup\n"); ccntrt_active = FALSE; ++i; } #if defined( MULTILOCALPATH ) && defined( GRASP_PLANNING ) else if (strcmp(argv[i], "-test") == 0) { ++i; manip_test_run = TRUE; if (i < argc) { manip_test_id = atoi(argv[i]) ; ++i; } else { manip_test_run = FALSE; use(); return 0; } } #endif #endif else if (strcmp(argv[i], "-udp") == 0) { std::string serverIp(argv[i+1]); int port = 0; sscanf(argv[i+2], "%d", &port); globalUdpClient = new UdpClient(serverIp, port); i += 3; } else if (strcmp(argv[i], "-dlr") == 0) { strcpy(dlrReadFile, argv[i + 1]); strcpy(dlrSaveFile, argv[i + 2]); i += 3; } else if (strcmp(argv[i], "-c") == 0) { ++i; if (strcmp(argv[i], "vcollide") == 0) { col_mode_to_be_set = p3d_col_mode_v_collide; col_det_set = TRUE; ++i; } #ifdef P3D_COLLISION_CHECKING else if (strcmp(argv[i], "kcd") == 0) { col_mode_to_be_set = p3d_col_mode_kcd; set_DO_KCD_GJK(TRUE); col_det_set = TRUE; ++i; } else if (strcmp(argv[i], "pqp") == 0) { printf("Colmod pqp"); col_mode_to_be_set= p3d_col_mode_pqp; col_det_set = TRUE; ++i; } #endif else if (strcmp(argv[i], "bio") == 0) { col_mode_to_be_set = p3d_col_mode_bio; col_det_set = TRUE; ++i; } else if (strcmp(argv[i], "kng") == 0) { col_mode_to_be_set = p3d_col_mode_kcd; #ifdef P3D_COLLISION_CHECKING set_DO_KCD_GJK(FALSE); #endif col_det_set = TRUE; ++i; } else if (strcmp(argv[i], "gjk") == 0) { col_mode_to_be_set = p3d_col_mode_gjk; col_det_set = TRUE; ++i; } else if (strcmp(argv[i], "none") == 0) { col_mode_to_be_set = p3d_col_mode_none; col_det_set = TRUE; ++i; } else { use(); return 0; } } else { use(); return 0; } } if (!dir_set) strcpy(file_directory, "../../demo"); if (!seed_set) p3d_init_random(); if (!col_det_set){ // modif Juan //check that the HOME_MOVE3D environment variable exists: if(getenv("HOME_MOVE3D")==NULL) { printf("%s: %d: main(): The environment variable \"HOME_MOVE3D\" is not defined. This might cause some problems or crashes (e.g. with video capture).\n", __FILE__,__LINE__); } #ifdef GRASP_PLANNING col_mode_to_be_set= p3d_col_mode_pqp; #else col_mode_to_be_set = p3d_col_mode_kcd; #endif } #ifdef P3D_COLLISION_CHECKING if (col_mode_to_be_set != p3d_col_mode_v_collide) set_collision_by_object(FALSE); /* : carl */ if (col_mode_to_be_set == p3d_col_mode_v_collide) { p3d_filter_switch_filter_mechanism(FILTER_TO_BE_SET_ACTIVE); } /* begin added KCD FILTER */ else if (col_mode_to_be_set == p3d_col_mode_kcd) { p3d_filter_switch_filter_mechanism(FILTER_TO_BE_SET_ACTIVE); } #endif /* end added KCD FILTER */ /* lecture du fichier environnement */ p3d_set_directory(file_directory); int fontsize = 8; FL_IOPT fl_cntl; fl_cntl.buttonFontSize = fontsize; fl_set_defaults(FL_PDButtonFontSize, &fl_cntl); fl_cntl.menuFontSize = fontsize; fl_set_defaults(FL_PDMenuFontSize, &fl_cntl); fl_cntl.choiceFontSize = fontsize; fl_set_defaults(FL_PDChoiceFontSize, &fl_cntl); fl_cntl.browserFontSize = fontsize; fl_set_defaults(FL_PDBrowserFontSize, &fl_cntl); fl_cntl.inputFontSize = fontsize; fl_set_defaults(FL_PDInputFontSize, &fl_cntl); fl_cntl.labelFontSize = fontsize; fl_set_defaults(FL_PDLabelFontSize, &fl_cntl); fl_initialize(&argc, argv, "FormDemo", 0, 0); fl_set_border_width(1); #if defined( USE_GLUT ) && !defined( QT_GL_WIDGET ) GlutWindowDisplay glut_win(argc,argv); #endif // init English C if (! setlocale(LC_ALL, "C")) fprintf(stderr, "There was an error while setting the locale to \"C\"\n"); while (!p3d_get_desc_number(P3D_ENV)) { #ifdef BIO if (file_set == TRUE) { // if (!filename) { // exit(0); // } p3d_col_set_mode(col_mode_to_be_set); p3d_BB_set_mode_close(); if (!p3d_read_desc(filename)) { #ifdef MOVE3D_XFORMS if (fl_show_question("ENV file not found! Exit?\n", 1)) { exit(0); } else { file_set = FALSE; } #else file_set = FALSE; #endif } } if (file_set == FALSE) { #ifdef MOVE3D_XFORMS // Modif Brice SALVA file_list = init_file_name_list(); create_file_selector_Form(); usrAnswer = do_file_selector_Form(file_directory, file_list, name, PSF_MAX_NAME_LENGTH - 1, &is_p3d); if (usrAnswer) { if (is_p3d) { // only one file p3d_read_desc((char*)file_list->name_list[0]); } else { if (!psf_make_p3d_from_multiple_pdb(file_list, name)) { fl_show_alert("Can't perform PDB to P3D traduction", "", "", 1); free_file_name_list(file_list); file_list = NULL; exit(0); } } } else { free_file_name_list(file_list); file_list = NULL; exit(0); } free_file_name_list(file_list); file_list = NULL; #else printf("Error : give a p3d filename as argument, or use the XFORMS module.\n"); exit(0); #endif } #else if (file_set == TRUE) { file = filename; } else { #ifdef MOVE3D_XFORMS file = fl_show_fselector("P3D_ENV filename", file_directory, "*.p3d", ""); #endif } if (!file) { exit(0); } #ifdef P3D_COLLISION_CHECKING p3d_col_set_mode(p3d_col_mode_none); p3d_BB_set_mode_close(); #endif printf("\n"); printf(" ----------------------------\n"); printf(" -- p3d file parsing start --\n"); printf(" ----------------------------\n"); printf("\n"); p3d_read_desc((char *) file); #endif if (!p3d_get_desc_number(P3D_ENV)) { printf("loading done...\n"); #ifdef MOVE3D_XFORMS if (fl_show_question("Can't read a P3D_ENV from this file! Exit?\n", 1)) { exit(0); } #endif } } printf("\n"); printf(" ----------------------------\n"); printf(" -- p3d file parsing done --\n"); printf(" ----------------------------\n"); printf("\n"); MY_ALLOC_INFO("After p3d_read_desc"); printf("Nb poly : %d\n", p3d_poly_get_nb()); /* for start-up with currently chosen collision detector: */ /* MY_ALLOC_INFO("Before initialization of a collision detector"); */ #ifdef P3D_COLLISION_CHECKING p3d_col_set_mode(col_mode_to_be_set); p3d_col_start(col_mode_to_be_set); #endif /* modif Pepijn april 2001 * this changes have to be made after the initialistion of the collision checker * because in p3d_col_start KCD migth be initialised, and during this initialisation * there is automaticly calculated a dmax * So if the user wants to set his own dmax this most be done after this initialisation * INTERNAL NOTE: in this case the users are the developpers of MOVE3D, normally the clients * who purchase Move3d don't know that this option exists */ if (user_dmax_to_be_set) { if (user_dmax < EPS4) { printf("WARNING: User chose dmax too small --> new value set to 0.0001 (EPS4)\n"); user_dmax = EPS4; } p3d_set_env_dmax(user_dmax); } if (user_obj_tol_to_be_set) { if (user_obj_tol < 0.0) { printf("WARNING: Negative tolerance, tolerance is set to 0.0\n"); user_obj_tol = 0.0; } p3d_set_env_object_tolerance(user_obj_tol); } printf("Env dmax = %f\n",p3d_get_env_dmax()); printf("Env Object tol = %f\n",p3d_get_env_object_tolerance()); /* always set tolerance even if the user didn't specify any options * it's possible that Kcd has calculated automaticly a dmax */ /* Normally p3d_col_set_tolerance(); is called when initialising * the sliders, in case the sliders are not used we have to use * p3d_col_set_tolerance() */ printf("MAX_DDLS %d\n", MAX_DDLS); // modif Juan #ifdef BIO if (col_mode_to_be_set == p3d_col_mode_bio) { bio_set_num_subrobot_AA(); bio_set_num_subrobot_ligand(); bio_set_bio_jnt_types(); bio_set_bio_jnt_AAnumbers(); bio_set_list_AA_first_jnt(); bio_set_AAtotal_number(); bio_set_nb_flexible_sc(); bio_set_list_firstjnts_flexible_sc(); if (XYZ_ROBOT->num_subrobot_ligand != -1) bio_set_nb_dof_ligand(); } #endif // fmodif Juan #ifdef P3D_CONSTRAINTS // Modif Mokhtar Initialisation For Multisolutions constraints p3d_init_iksol(XYZ_ROBOT->cntrt_manager); #endif /* creation du FORM main */ #ifdef MOVE3D_XFORMS g3d_create_main_form(); #endif /* * needs to be run after main form has been created */ if (scenario_set == TRUE) { #ifdef MOVE3D_XFORMS read_scenario_by_name(scenario); #else p3d_rw_scenario_init_name(); p3d_read_scenario(scenario); #endif } //Set the robots to initial Pos if defined for(i = 0; i < XYZ_ENV->nr; i++){ if(!p3d_isNullConfig(XYZ_ENV->robot[i], XYZ_ENV->robot[i]->ROBOT_POS)){ p3d_set_and_update_this_robot_conf(XYZ_ENV->robot[i], XYZ_ENV->robot[i]->ROBOT_POS); } } //Exection Of Dlr Planner // do{ // DlrPlanner* planner = new DlrPlanner(dlrSaveFile); // DlrParser parser(dlrReadFile, planner); // if(parser.parse()){ // planner->process(); // }else{ // sleep(2); // } // free(planner); // }while(1); /* go into loop */ #ifdef CXX_PLANNER global_Project = new Project(new Scene(XYZ_ENV)); #endif // double c, color[4]; // srand(time(NULL)); // c= rand()/((double)RAND_MAX+1); // g3d_rgb_from_hue(c, color); // g3d_set_win_floor_color(g3d_get_cur_win(), color[0], color[1], color[2]); #ifdef MOVE3D_XFORMS g3d_set_win_floor_color(g3d_get_cur_states(), 0.5, 1.0, 1.0); // g3d_set_win_bgcolor(g3d_get_cur_win(), 0.5, 0.6, 1.0); g3d_set_win_wall_color(g3d_get_cur_states(), 0.4, 0.45, 0.5); g3d_set_win_bgcolor(g3d_get_cur_states(), XYZ_ENV->background_color[0], XYZ_ENV->background_color[1], XYZ_ENV->background_color[2]); //p3d_print_env_info(); g3d_loop(); #endif #if defined( USE_GLUT ) glut_win.initDisplay(); glutMainLoop (); #endif #if defined( LIGHT_PLANNER ) && defined( MULTILOCALPATH ) && defined( GRASP_PLANNING ) && !defined( MOVE3D_XFORMS ) printf("Test functions : ManipulationTestFunctions\n"); if (manip_test_run) { new qtG3DWindow(); ManipulationTestFunctions tests; if(!tests.runTest(manip_test_id)) { std::cout << "ManipulationTestFunctions::Fail" << std::endl; } } #endif printf("End Move3d\n"); return 0; }
int main(int argc, char **argv) { char c; int i,l,aa; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; int **txdata; double s_re[2][30720*2],s_im[2][30720*2],r_re[2][30720*2],r_im[2][30720*2]; double iqim=0.0; // int subframe_offset; uint8_t subframe=0; #ifdef XFORMS FD_lte_phy_scope_ue *form_ue; char title[255]; #endif int trial, n_errors_common=0,n_errors_ul=0,n_errors_dl=0,n_errors_cfi=0,n_errors_hi=0; unsigned char eNb_id = 0; uint8_t awgn_flag=0; int n_frames=1; channel_desc_t *eNB2UE; uint32_t nsymb,tx_lev,tx_lev_dB=0,num_pdcch_symbols=3; uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx=1,n_rx=1; uint16_t Nid_cell=0; // int8_t interf1=-128,interf2=-128; uint8_t dci_cnt=0; LTE_DL_FRAME_PARMS *frame_parms; uint8_t log2L=2, log2Lcommon=2; DCI_format_t format_selector[MAX_NUM_DCI]; uint8_t num_dci=0; uint8_t numCCE,common_active=0,ul_active=0,dl_active=0; uint32_t n_trials_common=0,n_trials_ul=0,n_trials_dl=0,false_detection_cnt=0; uint8_t common_rx,ul_rx,dl_rx; uint8_t tdd_config=3; FILE *input_fd=NULL; char input_val_str[50],input_val_str2[50]; uint16_t n_rnti=0x1234; uint8_t osf=1,N_RB_DL=25; SCM_t channel_model=Rayleigh1_anticorr; DCI_ALLOC_t dci_alloc_rx[8]; int ret; uint8_t harq_pid; uint8_t phich_ACK; uint8_t num_phich_interf = 0; lte_frame_type_t frame_type=TDD; // int re_offset; // uint32_t *txptr; int aarx; int k; uint32_t perfect_ce = 0; int CCE_table[800]; number_of_cards = 1; cpuf = get_cpu_freq_GHz(); logInit(); while ((c = getopt (argc, argv, "hapFg:R:c:n:s:x:y:z:L:M:N:I:f:i:S:P:Y")) != -1) { switch (c) { case 'a': printf("Running AWGN simulation\n"); awgn_flag = 1; break; case 'R': N_RB_DL = atoi(optarg); break; case 'F': frame_type = FDD; break; case 'c': tdd_config=atoi(optarg); if (tdd_config>6) { printf("Illegal tdd_config %d (should be 0-6)\n",tdd_config); exit(-1); } break; case 'g': switch((char)*optarg) { case 'A': channel_model=SCM_A; break; case 'B': channel_model=SCM_B; break; case 'C': channel_model=SCM_C; break; case 'D': channel_model=SCM_D; break; case 'E': channel_model=EPA; break; case 'F': channel_model=EVA; break; case 'G': channel_model=ETU; break; default: printf("Unsupported channel model!\n"); exit(-1); } break; /* case 'i': interf1=atoi(optarg); break; case 'j': interf2=atoi(optarg); break; */ case 'n': n_frames = atoi(optarg); break; case 's': snr0 = atoi(optarg); break; case 'p': extended_prefix_flag=1; break; case 'x': transmission_mode=atoi(optarg); if ((transmission_mode!=1) && (transmission_mode!=2) && (transmission_mode!=6)) { printf("Unsupported transmission mode %d\n",transmission_mode); exit(-1); } break; case 'y': n_tx=atoi(optarg); if ((n_tx==0) || (n_tx>2)) { printf("Unsupported number of tx antennas %d\n",n_tx); exit(-1); } break; case 'z': n_rx=atoi(optarg); if ((n_rx==0) || (n_rx>2)) { printf("Unsupported number of rx antennas %d\n",n_rx); exit(-1); } break; case 'S': subframe=atoi(optarg); break; case 'L': log2L=atoi(optarg); if ((log2L!=0)&& (log2L!=1)&& (log2L!=2)&& (log2L!=3)) { printf("Unsupported DCI aggregation level %d (should be 0,1,2,3)\n",log2L); exit(-1); } break; case 'M': log2Lcommon=atoi(optarg); if ((log2Lcommon!=2)&& (log2Lcommon!=3)) { printf("Unsupported Common DCI aggregation level %d (should be 2 or 3)\n",log2Lcommon); exit(-1); } break; case 'N': format_selector[num_dci] = (DCI_format_t) atoi(optarg); if ((format_selector[num_dci]<format0) || (format_selector[num_dci] > format1A)) { printf("only formats 0, 1, and 1A supported for the moment\n"); exit(-1); } if (format_selector[num_dci]==format0) ul_active=1; if (format_selector[num_dci]==format1A) common_active=1; if (format_selector[num_dci]==format1) dl_active=1; num_dci++; break; case 'O': osf = atoi(optarg); break; case 'I': Nid_cell = atoi(optarg); break; case 'f': input_fd = fopen(optarg,"r"); if (input_fd==NULL) { printf("Problem with filename %s\n",optarg); exit(-1); } break; case 'i': n_rnti=atoi(optarg); break; case 'P': num_phich_interf=atoi(optarg); break; case 'Y': perfect_ce = 1; break; case 'h': printf("%s -h(elp) -a(wgn on) -c tdd_config -n n_frames -r RiceanFactor -s snr0 -t Delayspread -x transmission mode (1,2,6) -y TXant -z RXant -L AggregLevelUEspec -M AggregLevelCommonDCI -N DCIFormat\n\n", argv[0]); printf("-h This message\n"); printf("-a Use AWGN channel and not multipath\n"); printf("-c TDD config\n"); printf("-S Subframe number (0..9)\n"); printf("-R N_RB_DL\n"); printf("-F use FDD frame\n"); printf("-p Use extended prefix mode\n"); printf("-n Number of frames to simulate\n"); printf("-r Ricean factor (dB, 0 means Rayleigh, 100 is almost AWGN\n"); printf("-s Starting SNR, runs from SNR to SNR + 5 dB. If n_frames is 1 then just SNR is simulated\n"); printf("-t Delay spread for multipath channel\n"); printf("-x Transmission mode (1,2,6 for the moment)\n"); printf("-y Number of TX antennas used in eNB\n"); printf("-z Number of RX antennas used in UE\n"); printf("-P Number of interfering PHICH\n"); printf("-L log2 of Aggregation level for UE Specific DCI (0,1,2,3)\n"); printf("-M log2 Aggregation level for Common DCI (4,8)\n"); printf("-N Format for UE Spec DCI (0 - format0,\n"); printf(" 1 - format1,\n"); printf(" 2 - format1A,\n"); printf(" 3 - format1B_2A,\n"); printf(" 4 - format1B_4A,\n"); printf(" 5 - format1C,\n"); printf(" 6 - format1D_2A,\n"); printf(" 7 - format1D_4A,\n"); printf(" 8 - format2A_2A_L10PRB,\n"); printf(" 9 - format2A_2A_M10PRB,\n"); printf(" 10 - format2A_4A_L10PRB,\n"); printf(" 11 - format2A_4A_M10PRB,\n"); printf(" 12 - format2_2A_L10PRB,\n"); printf(" 13 - format2_2A_M10PRB,\n"); printf(" 14 - format2_4A_L10PRB,\n"); printf(" 15 - format2_4A_M10PRB\n"); printf(" 16 - format2_2D_M10PRB\n"); printf(" 17 - format2_2D_L10PRB\n"); printf(" can be called multiple times to add more than one DCI\n"); printf("-O Oversampling factor\n"); printf("-I Cell Id\n"); printf("-F Input sample stream\n"); exit(1); break; } } if ((transmission_mode>1) && (n_tx==1)) n_tx=2; lte_param_init(n_tx, n_tx, n_rx, transmission_mode, extended_prefix_flag, frame_type, Nid_cell, tdd_config, N_RB_DL, 0, osf, perfect_ce); #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); form_ue = create_lte_phy_scope_ue(); sprintf (title, "LTE PHY SCOPE UE"); fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); #endif mac_xface->computeRIV = computeRIV; mac_xface->frame_parms = &eNB->frame_parms; // init_transport_channels(transmission_mode); if (n_frames==1) snr1 = snr0+.1; else snr1 = snr0+8.0; printf("SNR0 %f, SNR1 %f\n",snr0,snr1); frame_parms = &eNB->frame_parms; printf("Getting %d dcis\n",num_dci); get_dci(frame_parms, log2L, log2Lcommon, format_selector, num_dci, n_rnti); txdata = eNB->common_vars.txdata[eNb_id]; nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; printf("Subframe %d, FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n", subframe,NUMBER_OF_OFDM_CARRIERS, eNB->frame_parms.Ncp,eNB->frame_parms.samples_per_tti,nsymb); eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, UE->frame_parms.nb_antennas_rx, channel_model, N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, 0); eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1]; eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); proc_rxtx->frame_tx = 0; proc_rxtx->subframe_tx = subframe; if (input_fd==NULL) { printf("No input file, so starting TX\n"); } else { i=0; while (!feof(input_fd)) { ret=fscanf(input_fd,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2); if (ret != 2) { printf("%s:%d:%s: fscanf error, exiting\n", __FILE__, __LINE__, __FUNCTION__); exit(1); } if ((i%4)==0) { ((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL)); ((short*)txdata[0])[(i/2)+1] = (short)((1<<15)*strtod(input_val_str2,NULL)); if ((i/4)<100) printf("sample %d => %e + j%e (%d +j%d)\n",i/4,strtod(input_val_str,NULL),strtod(input_val_str2,NULL),((short*)txdata[0])[i/4],((short*)txdata[0])[(i/4)+1]);//1,input_val2,); } i++; if (i>(4*FRAME_LENGTH_SAMPLES)) break; } printf("Read in %d samples\n",i/4); write_output("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); // write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); tx_lev = signal_energy(&txdata[0][0], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); tx_lev_dB = (unsigned int) dB_fixed(tx_lev); } UE->UE_mode[0] = PUSCH; // nCCE_max = get_nCCE(3,&eNB->frame_parms,get_mi(&eNB->frame_parms,0)); //printf("nCCE_max %d\n",nCCE_max); //printf("num_phich interferers %d\n",num_phich_interf); for (SNR=snr0; SNR<snr1; SNR+=0.2) { n_errors_common = 0; n_errors_ul = 0; n_errors_dl = 0; n_errors_cfi = 0; n_errors_hi = 0; n_trials_common=0; n_trials_ul=0; n_trials_dl=0; for (trial=0; trial<n_frames; trial++) { // printf("DCI (SF %d): txdataF %p (0 %p)\n",subframe,&eNB->common_vars.txdataF[eNb_id][aa][512*14*subframe],&eNB->common_vars.txdataF[eNb_id][aa][0]); for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) { memset(&eNB->common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); } generate_pilots_slot(eNB, eNB->common_vars.txdataF[eNb_id], AMP, //1024, (subframe*2), 0); generate_pilots_slot(eNB, eNB->common_vars.txdataF[eNb_id], AMP, //1024, (subframe*2)+1, 0); if (input_fd == NULL) { numCCE=0; n_trials_common++; common_active = 1; if (eNB->frame_parms.N_RB_DL >= 50) { if (ul_active==1) { n_trials_ul++; } } if (eNB->frame_parms.N_RB_DL >= 25) { if (dl_active==1) { n_trials_dl++; } } num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu.Num_dci, DCI_pdu.dci_alloc, frame_parms, subframe); numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe)); if (n_frames==1) { printf("num_dci %d, num_pddch_symbols %d, nCCE %d\n", DCI_pdu.Num_dci, num_pdcch_symbols,numCCE); } // apply RNTI-based nCCE allocation memset(CCE_table,0,800*sizeof(int)); for (i = 0; i < DCI_pdu.Num_dci; i++) { // SI RNTI if (DCI_pdu.dci_alloc[i].rnti == SI_RNTI) { DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table, 1<<DCI_pdu.dci_alloc[i].L, numCCE, 1, SI_RNTI, subframe); } // RA RNTI else if (DCI_pdu.dci_alloc[i].ra_flag == 1) { DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table, 1<<DCI_pdu.dci_alloc[i].L, numCCE, 1, DCI_pdu.dci_alloc[i].rnti, subframe); } // C RNTI else { DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table, 1<<DCI_pdu.dci_alloc[i].L, numCCE, 0, DCI_pdu.dci_alloc[i].rnti, subframe); } if (n_frames==1) printf("dci %d: rnti 0x%x, format %d, L %d (aggreg %d), nCCE %d/%d dci_length %d\n",i,DCI_pdu.dci_alloc[i].rnti, DCI_pdu.dci_alloc[i].format, DCI_pdu.dci_alloc[i].L, 1<<DCI_pdu.dci_alloc[i].L, DCI_pdu.dci_alloc[i].firstCCE, numCCE, DCI_pdu.dci_alloc[i].dci_length); if (DCI_pdu.dci_alloc[i].firstCCE==-1) exit(-1); } num_pdcch_symbols = generate_dci_top(DCI_pdu.Num_dci, DCI_pdu.dci_alloc, 0, AMP, &eNB->frame_parms, eNB->common_vars.txdataF[eNb_id], subframe); if (n_frames==1) printf("num_pdcch_symbols at TX %d\n",num_pdcch_symbols); if (is_phich_subframe(&eNB->frame_parms,subframe)) { if (n_frames==1) printf("generating PHICH\n"); harq_pid = phich_subframe_to_harq_pid(&eNB->frame_parms, proc_rxtx->frame_tx, subframe); phich_ACK = taus()&1; eNB->ulsch[0]->harq_processes[harq_pid]->phich_active = 1; eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 0; eNB->ulsch[0]->harq_processes[harq_pid]->phich_ACK = phich_ACK; eNB->ulsch[0]->harq_processes[harq_pid]->dci_alloc = 1; UE->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; UE->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 0; generate_phich_top(eNB,proc_rxtx,AMP,0); // generate 3 interfering PHICH if (num_phich_interf>0) { eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 4; generate_phich_top(eNB,proc_rxtx,1024,0); } if (num_phich_interf>1) { eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 8; eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; generate_phich_top(eNB,proc_rxtx,1024,0); } if (num_phich_interf>2) { eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 12; eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; generate_phich_top(eNB,proc_rxtx,1024,0); } eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; } // write_output("pilotsF.m","rsF",txdataF[0],lte_eNB->frame_parms.ofdm_symbol_size,1,1); if (n_frames==1) { write_output("txsigF0.m","txsF0", eNB->common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); if (eNB->frame_parms.nb_antenna_ports_eNB > 1) write_output("txsigF1.m","txsF1", eNB->common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); } tx_lev = 0; for (aa=0; aa<eNB->frame_parms.nb_antenna_ports_eNB; aa++) { if (eNB->frame_parms.Ncp == 1) PHY_ofdm_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], // input, &txdata[aa][subframe*eNB->frame_parms.samples_per_tti], // output eNB->frame_parms.ofdm_symbol_size, 2*nsymb, // number of symbols eNB->frame_parms.nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { normal_prefix_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], &txdata[aa][subframe*eNB->frame_parms.samples_per_tti], 2*nsymb, frame_parms); } tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti], eNB->frame_parms.ofdm_symbol_size); } tx_lev_dB = (unsigned int) dB_fixed(tx_lev); } for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (aa=0; aa<eNB->frame_parms.nb_antenna_ports_eNB; aa++) { if (awgn_flag == 0) { s_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } else { for (aarx=0; aarx<UE->frame_parms.nb_antennas_rx; aarx++) { if (aa==0) { r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } else { r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } } } } } if (awgn_flag == 0) { multipath_channel(eNB2UE,s_re,s_im,r_re,r_im, 2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0); } //write_output("channel0.m","chan0",ch[0],channel_length,1,8); // scale by path_loss = NOW - P_noise //sigma2 = pow(10,sigma2_dB/10); //N0W = -95.87; sigma2_dB = (double)tx_lev_dB +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(12*eNB->frame_parms.N_RB_DL)) - SNR; if (n_frames==1) printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %d\n",sigma2_dB,SNR,tx_lev_dB); //AWGN sigma2 = pow(10,sigma2_dB/10); // printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (aa=0; aa<UE->frame_parms.nb_antennas_rx; aa++) { ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble( 0.0,1.0))); /* ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] = ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i]; ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] = ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1]; */ } } // UE receiver for (l=0; l<eNB->frame_parms.symbols_per_tti; l++) { // subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti; // printf("subframe_offset = %d\n",subframe_offset); slot_fep(UE, l%(eNB->frame_parms.symbols_per_tti/2), (2*subframe)+(l/(eNB->frame_parms.symbols_per_tti/2)), 0, 0, 0); if (UE->perfect_ce == 1) { if (awgn_flag==0) { // fill in perfect channel estimates freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8); //write_output("channelF.m","chF",desc1->chF[0],nb_samples,1,8); for(k=0; k<NUMBER_OF_eNB_MAX; k++) { for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) { ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } } } } else { for(aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) { ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; } } } } } if (l==((eNB->frame_parms.Ncp==0)?4:3)) { // write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); // do PDCCH procedures here UE->pdcch_vars[0][0]->crnti = n_rnti; // printf("Doing RX : num_pdcch_symbols at TX %d\n",num_pdcch_symbols); rx_pdcch(UE, trial, subframe, 0, (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, UE->high_speed_flag, UE->is_secondary_ue); if (is_phich_subframe(&UE->frame_parms,subframe)) { UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->status = ACTIVE; //UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->Ndi = 1; rx_phich(UE, &UE->proc.proc_rxtx[subframe&1], subframe, 0); } // if (UE->pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) // break; dci_cnt = dci_decoding_procedure(UE, dci_alloc_rx,1, 0,subframe); common_rx=0; ul_rx=0; dl_rx=0; if (n_frames==1) { numCCE = get_nCCE(UE->pdcch_vars[0][0]->num_pdcch_symbols, &UE->frame_parms, get_mi(&UE->frame_parms,subframe)); for (i = 0; i < dci_cnt; i++) printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i, dci_alloc_rx[i].rnti, dci_alloc_rx[i].format, dci_alloc_rx[i].L, dci_alloc_rx[i].firstCCE, numCCE, dci_alloc_rx[i].dci_length); } for (i=0; i<dci_cnt; i++) { if (dci_alloc_rx[i].rnti == SI_RNTI) { if (n_frames==1) dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); common_rx=1; } if ((dci_alloc_rx[i].rnti == n_rnti) && (dci_alloc_rx[i].format == format0)) { if (n_frames==1) dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); ul_rx=1; } if ((dci_alloc_rx[i].rnti == n_rnti) && ((dci_alloc_rx[i].format == format1))) { if (n_frames==1) dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); dl_rx=1; } if ((dci_alloc_rx[i].rnti != n_rnti) && (dci_alloc_rx[i].rnti != SI_RNTI)) false_detection_cnt++; } if (n_frames==1) printf("RX DCI Num %d (Common DCI %d, DL DCI %d, UL DCI %d)\n", dci_cnt, common_rx, dl_rx, ul_rx); if ((common_rx==0)&&(common_active==1)) n_errors_common++; if ((ul_rx==0)&&(ul_active==1)) { n_errors_ul++; // exit(-1); } if ((dl_rx==0)&&(dl_active==1)) { n_errors_dl++; // exit(-1); } if (UE->pdcch_vars[0][0]->num_pdcch_symbols != num_pdcch_symbols) n_errors_cfi++; /* if (is_phich_subframe(&UE->frame_parms,subframe)) if (UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms, UE->frame, subframe)]->Ndi != phich_ACK) n_errors_hi++; */ if (n_errors_cfi > 10) break; } } // symbol loop if (n_errors_cfi > 100) break; if ((n_errors_ul>1000) && (n_errors_dl>1000) && (n_errors_common>1000)) break; #ifdef XFORMS phy_scope_UE(form_ue, UE, eNb_id,0,subframe); #endif } //trials if (common_active) printf("SNR %f : n_errors_common = %d/%d (%e)\n", SNR,n_errors_common,n_trials_common,(double)n_errors_common/n_trials_common); if (ul_active==1) printf("SNR %f : n_errors_ul = %d/%d (%e)\n", SNR,n_errors_ul,n_trials_ul,(double)n_errors_ul/n_trials_ul); if (dl_active==1) printf("SNR %f : n_errors_dl = %d/%d (%e)\n", SNR,n_errors_dl,n_trials_dl,(double)n_errors_dl/n_trials_dl); printf("SNR %f : n_errors_cfi = %d/%d (%e)\n", SNR,n_errors_cfi,trial,(double)n_errors_cfi/trial); printf("SNR %f : n_errors_hi = %d/%d (%e)\n", SNR,n_errors_hi,trial,(double)n_errors_hi/trial); } // SNR if (n_frames==1) { write_output("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); if (n_tx>1) write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); write_output("rxsigF0.m","rxsF0", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); if (n_rx>1) { write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1); write_output("rxsigF1.m","rxsF1", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); } write_output("H00.m","h00",&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) write_output("H10.m","h10",&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",UE->pdcch_vars[0][eNb_id]->rxdataF_ext[0],3*12*UE->frame_parms.N_RB_DL,1,1); write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[0][eNb_id]->rxdataF_comp[0],4*12*UE->frame_parms.N_RB_DL,1,1); write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[0][eNb_id]->llr,2400,1,4); } lte_sync_time_free(); return(n_errors_ul); }
int main (int argc, char **argv) { Interface_init(); s_t* st2=(s_t*)(Instance[1].gm->mem_ref.pointer); st2->port=38800; char c; s32 i, j; int new_omg_model; // goto ocg in oai_emulation.info. // pointers signal buffers (s = transmit, r,r0 = receive) double **s_re[NINST], **s_im[NINST], **r_re[NINST], **r_im[NINST], **r_re0, **r_im0; double **r_re0_d[8][3], **r_im0_d[8][3], **r_re0_u[3][8],**r_im0_u[3][8]; // double **s_re, **s_im, **r_re, **r_im, **r_re0, **r_im0; double forgetting_factor=0; int map1,map2; double **ShaF= NULL; // Framing variables s32 slot, last_slot, next_slot; // variables/flags which are set by user on command-line double snr_dB, sinr_dB; u8 set_snr=0,set_sinr=0; u8 cooperation_flag; // for cooperative communication u8 target_dl_mcs = 4; u8 target_ul_mcs = 2; u8 rate_adaptation_flag; u8 abstraction_flag = 0, ethernet_flag = 0; u16 Nid_cell = 0; s32 UE_id, eNB_id, ret; // time calibration for soft realtime mode struct timespec time_spec; unsigned long time_last, time_now; int td, td_avg, sleep_time_us; char *g_log_level = "trace"; // by default global log level is set to trace lte_subframe_t direction; #ifdef XFORMS FD_phy_procedures_sim *form[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX]; char title[255]; #endif LTE_DL_FRAME_PARMS *frame_parms; FILE *UE_stats[NUMBER_OF_UE_MAX], *eNB_stats; char UE_stats_filename[255]; int len; #ifdef ICIC remove ("dci.txt"); #endif //time_t t0,t1; clock_t start, stop; // Added for PHY abstraction Node_list ue_node_list = NULL; Node_list enb_node_list = NULL; //default parameters target_dl_mcs = 0; rate_adaptation_flag = 0; oai_emulation.info.n_frames = 0xffff;//1024; //100; oai_emulation.info.n_frames_flag = 0;//fixme snr_dB = 30; cooperation_flag = 0; // default value 0 for no cooperation, 1 for Delay diversity, 2 for Distributed Alamouti init_oai_emulation(); // to initialize everything !!! // get command-line options while ((c = getopt (argc, argv, "haePToFt:C:N:k:x:m:rn:s:S:f:z:u:b:c:M:p:g:l:d:U:B:R:E:")) != -1) { switch (c) { case 'F': // set FDD oai_emulation.info.frame_type = 0; break; case 'C': oai_emulation.info.tdd_config = atoi (optarg); if (oai_emulation.info.tdd_config > 6) { msg ("Illegal tdd_config %d (should be 0-6)\n", oai_emulation.info.tdd_config); exit (-1); } break; case 'R': oai_emulation.info.N_RB_DL = atoi (optarg); if ((oai_emulation.info.N_RB_DL != 6) && (oai_emulation.info.N_RB_DL != 15) && (oai_emulation.info.N_RB_DL != 25) && (oai_emulation.info.N_RB_DL != 50) && (oai_emulation.info.N_RB_DL != 75) && (oai_emulation.info.N_RB_DL != 100)) { msg ("Illegal N_RB_DL %d (should be one of 6,15,25,50,75,100)\n", oai_emulation.info.N_RB_DL); exit (-1); } case 'N': Nid_cell = atoi (optarg); if (Nid_cell > 503) { msg ("Illegal Nid_cell %d (should be 0 ... 503)\n", Nid_cell); exit(-1); } break; case 'h': help (); exit (1); case 'x': oai_emulation.info.transmission_mode = atoi (optarg); if ((oai_emulation.info.transmission_mode != 1) && (oai_emulation.info.transmission_mode != 2) && (oai_emulation.info.transmission_mode != 5) && (oai_emulation.info.transmission_mode != 6)) { msg("Unsupported transmission mode %d\n",oai_emulation.info.transmission_mode); exit(-1); } break; case 'm': target_dl_mcs = atoi (optarg); break; case 'r': rate_adaptation_flag = 1; break; case 'n': oai_emulation.info.n_frames = atoi (optarg); //n_frames = (n_frames >1024) ? 1024: n_frames; // adjust the n_frames if higher that 1024 oai_emulation.info.n_frames_flag = 1; break; case 's': snr_dB = atoi (optarg); set_snr = 1; oai_emulation.info.ocm_enabled=0; break; case 'S': sinr_dB = atoi (optarg); set_sinr = 1; oai_emulation.info.ocm_enabled=0; break; case 'k': //ricean_factor = atof (optarg); printf("[SIM] Option k is no longer supported on the command line. Please specify your channel model in the xml template\n"); exit(-1); break; case 't': //Td = atof (optarg); printf("[SIM] Option t is no longer supported on the command line. Please specify your channel model in the xml template\n"); exit(-1); break; case 'f': forgetting_factor = atof (optarg); break; case 'z': cooperation_flag = atoi (optarg); break; case 'u': oai_emulation.info.nb_ue_local = atoi (optarg); break; case 'b': oai_emulation.info.nb_enb_local = atoi (optarg); break; case 'a': abstraction_flag = 1; break; case 'p': oai_emulation.info.nb_master = atoi (optarg); break; case 'M': abstraction_flag = 1; ethernet_flag = 1; oai_emulation.info.ethernet_id = atoi (optarg); oai_emulation.info.master_id = oai_emulation.info.ethernet_id; oai_emulation.info.ethernet_flag = 1; break; case 'e': oai_emulation.info.extended_prefix_flag = 1; break; case 'l': g_log_level = optarg; break; case 'c': strcpy(oai_emulation.info.local_server, optarg); oai_emulation.info.ocg_enabled=1; break; case 'g': oai_emulation.info.multicast_group = atoi (optarg); break; case 'B': oai_emulation.info.omg_model_enb = atoi (optarg); break; case 'U': oai_emulation.info.omg_model_ue = atoi (optarg); break; case 'T': oai_emulation.info.otg_enabled = 1; break; case 'P': oai_emulation.info.opt_enabled = 1; break; case 'E': oai_emulation.info.seed = atoi (optarg); break; default: help (); exit (-1); break; } } // configure oaisim with OCG oaisim_config(g_log_level); // config OMG and OCG, OPT, OTG, OLG if (oai_emulation.info.nb_ue_local > NUMBER_OF_UE_MAX ) { printf ("Enter fewer than %d UEs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_UE_MAX); exit (-1); } if (oai_emulation.info.nb_enb_local > NUMBER_OF_eNB_MAX) { printf ("Enter fewer than %d eNBs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_eNB_MAX); exit (-1); } // fix ethernet and abstraction with RRC_CELLULAR Flag #ifdef RRC_CELLULAR abstraction_flag = 1; ethernet_flag = 0; #endif if (set_sinr == 0) sinr_dB = snr_dB - 20; // setup ntedevice interface (netlink socket) #ifndef CYGWIN ret = netlink_init (); #endif if (ethernet_flag == 1) { oai_emulation.info.master[oai_emulation.info.master_id].nb_ue = oai_emulation.info.nb_ue_local; oai_emulation.info.master[oai_emulation.info.master_id].nb_enb = oai_emulation.info.nb_enb_local; if (!oai_emulation.info.master_id) oai_emulation.info.is_primary_master = 1; j = 1; for (i = 0; i < oai_emulation.info.nb_master; i++) { if (i != oai_emulation.info.master_id) oai_emulation.info.master_list = oai_emulation.info.master_list + j; LOG_I (EMU, "Index of master id i=%d MASTER_LIST %d\n", i, oai_emulation.info.master_list); j *= 2; } LOG_I (EMU, " Total number of master %d my master id %d\n", oai_emulation.info.nb_master, oai_emulation.info.master_id); #ifdef LINUX init_bypass (); #endif while (emu_tx_status != SYNCED_TRANSPORT) { LOG_I (EMU, " Waiting for EMU Transport to be synced\n"); emu_transport_sync (); //emulation_tx_rx(); } } // ethernet flag NB_UE_INST = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_ue_remote; NB_eNB_INST = oai_emulation.info.nb_enb_local + oai_emulation.info.nb_enb_remote; #ifndef NAS_NETLINK for (UE_id=0;UE_id<NB_UE_INST;UE_id++) { sprintf(UE_stats_filename,"UE_stats%d.txt",UE_id); UE_stats[UE_id] = fopen (UE_stats_filename, "w"); } eNB_stats = fopen ("eNB_stats.txt", "w"); printf ("UE_stats=%p, eNB_stats=%p\n", UE_stats, eNB_stats); #endif LOG_I(EMU, "total number of UE %d (local %d, remote %d) \n", NB_UE_INST,oai_emulation.info.nb_ue_local,oai_emulation.info.nb_ue_remote); LOG_I(EMU, "Total number of eNB %d (local %d, remote %d) \n", NB_eNB_INST,oai_emulation.info.nb_enb_local,oai_emulation.info.nb_enb_remote); printf("Running with frame_type %d, Nid_cell %d, N_RB_DL %d, EP %d, mode %d, target dl_mcs %d, rate adaptation %d, nframes %d, abstraction %d\n", 1+oai_emulation.info.frame_type, Nid_cell, oai_emulation.info.N_RB_DL, oai_emulation.info.extended_prefix_flag, oai_emulation.info.transmission_mode,target_dl_mcs,rate_adaptation_flag,oai_emulation.info.n_frames,abstraction_flag); // init_lte_vars (&frame_parms, oai_emulation.info.frame_type, oai_emulation.info.tdd_config, oai_emulation.info.extended_prefix_flag,oai_emulation.info.N_RB_DL, Nid_cell, cooperation_flag, oai_emulation.info.transmission_mode, abstraction_flag); init_frame_params (&frame_parms, oai_emulation.info.frame_type, oai_emulation.info.tdd_config, oai_emulation.info.extended_prefix_flag,oai_emulation.info.N_RB_DL, Nid_cell, cooperation_flag, oai_emulation.info.transmission_mode, abstraction_flag); printf ("Nid_cell %d\n", frame_parms->Nid_cell); /* Added for PHY abstraction */ if (abstraction_flag) get_beta_map(); for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { enb_data[eNB_id] = (node_desc_t *)malloc(sizeof(node_desc_t)); init_enb(enb_data[eNB_id],oai_emulation.environment_system_config.antenna.eNB_antenna); } for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { ue_data[UE_id] = (node_desc_t *)malloc(sizeof(node_desc_t)); init_ue(ue_data[UE_id],oai_emulation.environment_system_config.antenna.UE_antenna); } // init SF map here!!! map1 =(int)oai_emulation.topology_config.area.x_km; map2 =(int)oai_emulation.topology_config.area.y_km; //ShaF = createMat(map1,map2); -> memory is allocated within init_SF ShaF = init_SF(map1,map2,DECOR_DIST,SF_VAR); // size of area to generate shadow fading map printf("Simulation area x=%f, y=%f\n", oai_emulation.topology_config.area.x_km, oai_emulation.topology_config.area.y_km); if (abstraction_flag == 0){ int ci; int ji=0; for(ci=0;ci<NB_eNB_INST;ci++) { init_channel_mmap_channel(10+ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0)); ji++; //printf("ci %d\n",ci); } ji=0; for(ci=NB_eNB_INST;ci<(NB_eNB_INST+NB_UE_INST);ci++) { init_channel_mmap_channel(20+ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0)); ji++; //printf("ci %d\n",ci); } } for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { init_rre(frame_parms,&(r_re0_u[eNB_id][UE_id]),&(r_im0_u[eNB_id][UE_id])); init_rre(frame_parms,&(r_re0_d[UE_id][eNB_id]),&(r_im0_d[UE_id][eNB_id])); } } // printf("r_re0 %lf , r_im0 %lf\n",r_re0_u[0][0][0][0],r_im0_u[0][0][0][0]); // // r_im0_u[0][0][0][0]=100; // // printf("r_re0 %lf , r_im0 %lf\n",r_re0_u[0][0][0][0],r_im0_u[0][0][0][0]); // // // clean_param((r_re0_u[0][0]),(r_im0_u[0][0]),frame_parms); // // printf("r_re0 %lf , r_im0 %lf\n",r_re0_u[0][0][0][0],r_im0_u[0][0][0][0]); for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { #ifdef DEBUG_SIM printf ("[SIM] Initializing channel from eNB %d to UE %d\n", eNB_id, UE_id); #endif eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(2, 2, map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option), oai_emulation.environment_system_config.system_bandwidth_MB, forgetting_factor, 0, 0); UE2eNB[UE_id][eNB_id] = new_channel_desc_scm(2, 2, map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option), oai_emulation.environment_system_config.system_bandwidth_MB, forgetting_factor, 0, 0); } } randominit (0); set_taus_seed (0); number_of_cards = 1; openair_daq_vars.rx_rf_mode = 1; openair_daq_vars.tdd = 1; openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode; openair_daq_vars.target_ue_dl_mcs = target_dl_mcs; openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag; openair_daq_vars.ue_ul_nb_rb = 2; #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { form[eNB_id][UE_id] = create_form_phy_procedures_sim (); sprintf (title, "LTE SIM UE %d eNB %d", UE_id, eNB_id); fl_show_form (form[eNB_id][UE_id]->phy_procedures_sim, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); } #endif // time calibration for OAI clock_gettime (CLOCK_REALTIME, &time_spec); time_now = (unsigned long) time_spec.tv_nsec; td_avg = 0; sleep_time_us = SLEEP_STEP_US; td_avg = TARGET_SF_TIME_NS; // s_t* st2=(s_t*)(Instance[1].gm->mem_ref.pointer); st2->Exec_FLAG=0; int count; IntInitAll(); Soc_t* this = (Soc_t*)(obj_inst[0].ptr->mem_ref.pointer); fd_set read_ibits; fd_set write_ibits; int n; struct timeval tvp ; tvp.tv_sec=10; tvp.tv_usec=0; FD_ZERO(&read_ibits); FD_SET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); ch_thread *e2u_t[NB_eNB_INST][NB_UE_INST]; ch_thread *u2e_t[NB_UE_INST][NB_eNB_INST]; for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){ for(UE_id=0;UE_id<NB_UE_INST;UE_id++){ e2u_t[eNB_id][UE_id]=(ch_thread*)calloc(1,sizeof(ch_thread)); }} for(UE_id=0;UE_id<NB_UE_INST;UE_id++){ for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){ u2e_t[UE_id][eNB_id]=(ch_thread*)calloc(1,sizeof(ch_thread)); }} pthread_t thread,thread2; pthread_t cthr_u[NB_eNB_INST][NB_UE_INST]; pthread_t cthr_d[NB_UE_INST][NB_eNB_INST]; for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { u2e_t[UE_id][eNB_id]->eNB_id=eNB_id; u2e_t[UE_id][eNB_id]->UE_id=UE_id; u2e_t[UE_id][eNB_id]->r_re0=r_re0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_im0=r_im0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_re=r_re[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->r_im=r_im[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->s_im=s_im[eNB_id]; u2e_t[UE_id][eNB_id]->s_re=s_re[eNB_id]; u2e_t[UE_id][eNB_id]->eNB2UE=eNB2UE[eNB_id][UE_id]; u2e_t[UE_id][eNB_id]->UE2eNB=UE2eNB[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->enb_data=enb_data[eNB_id]; u2e_t[UE_id][eNB_id]->ue_data=ue_data[UE_id]; u2e_t[UE_id][eNB_id]->next_slot=&next_slot; u2e_t[UE_id][eNB_id]->abstraction_flag=&abstraction_flag; u2e_t[UE_id][eNB_id]->frame_parms=frame_parms; pthread_create (&cthr_d[UE_id][eNB_id], NULL, do_DL_sig_channel_T,(void*)(u2e_t[UE_id][eNB_id])); } } int sock; int port=(35000+(10+eNB_id)+(20+UE_id)); port=35010; sock = openairInetCreateSocket(SOCK_DGRAM,IPPROTO_UDP,"127.0.0.1",port); // int n; // fd_set read_ibits; // fd_set write_ibits; // struct timeval tvp = { 0, 0 }; FD_ZERO(&read_ibits); FD_SET(sock,&read_ibits); n = openairSelect(sock+1, &read_ibits, NULL, NULL, NULL); printf("Waiting is over\n"); FD_ISSET(sock, &read_ibits); for (mac_xface->frame=0; mac_xface->frame<oai_emulation.info.n_frames; mac_xface->frame++) { int dir_flag=0; printf("=============== Frame Number %d ============= \n ",mac_xface->frame); /* // Handling the cooperation Flag if (cooperation_flag == 2) { if ((PHY_vars_eNB_g[0]->eNB_UE_stats[0].mode == PUSCH) && (PHY_vars_eNB_g[0]->eNB_UE_stats[1].mode == PUSCH)) PHY_vars_eNB_g[0]->cooperation_flag = 2; } */ // for dubugging the frame counter update_nodes(oai_emulation.info.time); enb_node_list = get_current_positions(oai_emulation.info.omg_model_enb, eNB, oai_emulation.info.time); ue_node_list = get_current_positions(oai_emulation.info.omg_model_ue, UE, oai_emulation.info.time); // update the position of all the nodes (eNB/CH, and UE/MR) every frame if (((int)oai_emulation.info.time % 10) == 0 ) { display_node_list(enb_node_list); display_node_list(ue_node_list); if (oai_emulation.info.omg_model_ue >= MAX_NUM_MOB_TYPES){ // mix mobility model for(UE_id=oai_emulation.info.first_ue_local; UE_id<(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local);UE_id++){ new_omg_model = randomGen(STATIC, MAX_NUM_MOB_TYPES); LOG_D(OMG, "[UE] Node of ID %d is changing mobility generator ->%d \n", UE_id, new_omg_model); // reset the mobility model for a specific node set_new_mob_type (UE_id, UE, new_omg_model, oai_emulation.info.time); } } if (oai_emulation.info.omg_model_enb >= MAX_NUM_MOB_TYPES) { // mix mobility model for (eNB_id = oai_emulation.info.first_enb_local; eNB_id < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local); eNB_id++) { new_omg_model = randomGen (STATIC, MAX_NUM_MOB_TYPES); LOG_D (OMG, "[eNB] Node of ID %d is changing mobility generator ->%d \n", UE_id, new_omg_model); // reset the mobility model for a specific node set_new_mob_type (eNB_id, eNB, new_omg_model, oai_emulation.info.time); } } } #ifdef DEBUG_OMG if ((((int) oai_emulation.info.time) % 100) == 0) { for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++) { get_node_position (UE, UE_id); } } #endif if (oai_emulation.info.n_frames_flag == 0){ // if n_frames not set by the user then let the emulation run to infinity mac_xface->frame %=(oai_emulation.info.n_frames-1); // set the emulation time based on 1ms subframe number oai_emulation.info.time += 0.01; // emu time in s } else { // user set the number of frames for the emulation // let the time go faster to see the effect of mobility oai_emulation.info.time += 0.1; } /* check if the openair channel model is activated used for PHY abstraction */ /* if ((oai_emulation.info.ocm_enabled == 1)&& (ethernet_flag == 0 )) { extract_position(enb_node_list, enb_data, NB_eNB_INST); extract_position(ue_node_list, ue_data, NB_UE_INST); for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id], oai_emulation.environment_system_config,ShaF[(int)ue_data[UE_id]->x][(int)ue_data[UE_id]->y]); UE2eNB[UE_id][eNB_id]->path_loss_dB = eNB2UE[eNB_id][UE_id]->path_loss_dB; printf("[CHANNEL_SIM] Pathloss bw enB %d at (%f,%f) and UE%d at (%f,%f) is %f (ShaF %f)\n", eNB_id,enb_data[eNB_id]->x,enb_data[eNB_id]->y,UE_id,ue_data[UE_id]->x,ue_data[UE_id]->y, eNB2UE[eNB_id][UE_id]->path_loss_dB, ShaF[(int)ue_data[UE_id]->x][(int)ue_data[UE_id]->y]); } } } */ // else { for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { eNB2UE[eNB_id][UE_id]->path_loss_dB = -105 + snr_dB; //UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB; if (eNB_id == (UE_id % NB_eNB_INST)) UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB - 10; else UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + sinr_dB - 10; #ifdef DEBUG_SIM printf("[SIM] Path loss from eNB %d to UE %d => %f dB\n",eNB_id,UE_id,eNB2UE[eNB_id][UE_id]->path_loss_dB); printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB); #endif } } // } else st2->EResp_FLAG=0; for (slot=0 ; slot<20 ; slot++) { printf("=============== Frame Number %d , Slot %d ============= \n ",mac_xface->frame,slot); last_slot = (slot - 1)%20; if (last_slot <0) last_slot+=20; next_slot = (slot + 1)%20; direction = subframe_select(frame_parms,next_slot>>1); if (direction == SF_DL) { dir_flag=1; } else if (direction == SF_UL) { dir_flag=2; } else {//it must be a special subframe if (next_slot%2==0) {//DL part dir_flag=1; } else {// UL part dir_flag=2; } } int count=0; if(dir_flag==1) { st2->EResp_FLAG=0; count=0; for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38810+eNB_id); printf("Waiting for Exec Msg Complete \n"); // n = openairIoSyncCreateThread_2(&this->m_io_sync); } // for loop while(count<NB_eNB_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { //trigger message send_exec_msg(0,0,0,0,0,0,(35000+(10+eNB_id)+(20+UE_id))); } } usleep(5); // while(st2->EResp_FLAG<NB_eNB_INST) // { /* for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { u2e_t[UE_id][eNB_id]->eNB_id=eNB_id; u2e_t[UE_id][eNB_id]->UE_id=UE_id; u2e_t[UE_id][eNB_id]->r_re0=r_re0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_im0=r_im0_d[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->r_re=r_re[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->r_im=r_im[NB_eNB_INST+UE_id]; u2e_t[UE_id][eNB_id]->s_im=s_im[eNB_id]; u2e_t[UE_id][eNB_id]->s_re=s_re[eNB_id]; u2e_t[UE_id][eNB_id]->eNB2UE=eNB2UE[eNB_id][UE_id]; u2e_t[UE_id][eNB_id]->UE2eNB=UE2eNB[UE_id][eNB_id]; u2e_t[UE_id][eNB_id]->enb_data=enb_data[eNB_id]; u2e_t[UE_id][eNB_id]->ue_data=ue_data[UE_id]; u2e_t[UE_id][eNB_id]->next_slot=&next_slot; u2e_t[UE_id][eNB_id]->abstraction_flag=&abstraction_flag; u2e_t[UE_id][eNB_id]->frame_parms=frame_parms; // pthread_create (&thread[eNB_id][UE_id], NULL, do_DL_sig_channel_T,(void*)cthread); pthread_create (&cthr_d[UE_id][eNB_id], NULL, do_DL_sig_channel_T,(void*)(u2e_t[UE_id][eNB_id])); // pthread_join(cthr_d[UE_id][eNB_id], NULL); // pthread_join(cthr_d[UE_id][eNB_id], NULL); // pthread_join(thread[eNB_id][UE_id], NULL); // do_DL_sig_channel(eNB_id,UE_id,r_re0,r_im0,r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],s_re[eNB_id],s_im[eNB_id],eNB2UE,enb_data, ue_data,next_slot,abstraction_flag,frame_parms); // do_DL_sig_channel(eNB_id,UE_id,r_re0_d[UE_id][eNB_id],r_im0_d[UE_id][eNB_id],r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],s_re[eNB_id],s_im[eNB_id],eNB2UE,enb_data, ue_data,next_slot,abstraction_flag,frame_parms); } } */ // //for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ //for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { //pthread_join(cthr_d[UE_id][eNB_id], NULL); //} //} for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ clean_param(r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],frame_parms); for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { channel_add(r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],r_re0_d[UE_id][eNB_id],r_im0_d[UE_id][eNB_id],frame_parms); } } // if(UE_id==NB_UE_INST) // pthread_join(thread, NULL); //} for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { // pthread_join(thread, NULL); //pthread_join(thread[eNB_id][UE_id], NULL); } } // } st2->EResp_FLAG=0; count=0; for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++) if (mac_xface->frame >= (UE_id * 10)) { // activate UE only after 10*UE_id frames so that different UEs turn on separately send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38820+UE_id); printf("Waiting for Exec Msg Complete \n"); //n = openairIoSyncCreateThread_2(&this->m_io_sync); // n=trig_wait((void*)&this->m_io_sync); } else{ st2->EResp_FLAG=st2->EResp_FLAG+1; count++; } while(count<NB_UE_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } //while(st2->EResp_FLAG<NB_UE_INST) // { // n = select(this->m_io_sync.hfd, &read_ibits, NULL, NULL,NULL); // FD_ISSET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); // printf(".."); // } } else if(dir_flag==2) { st2->EResp_FLAG=0; count=0; for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++) if (mac_xface->frame >= (UE_id * 10)) { // activate UE only after 10*UE_id frames so that different UEs turn on separately send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38820+UE_id); // printf("Waiting for Exec Msg Complete \n"); // n = openairIoSyncCreateThread_2(&this->m_io_sync); // n=trig_wait((void*)&this->m_io_sync); } else{ st2->EResp_FLAG=st2->EResp_FLAG+1; count++; } while(count<NB_UE_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } //while(st2->EResp_FLAG<NB_UE_INST) // { // n = select(this->m_io_sync.hfd, &read_ibits, NULL, NULL,NULL); // FD_ISSET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); // printf(".."); // } // do_UL_sig_channel2(1,0,r_re0,r_im0,r_re,r_im,s_re,s_im,UE2eNB,next_slot,abstraction_flag,frame_parms); // do_UL_sig_channel(r_re0,r_im0,r_re,r_im,s_re,s_im,UE2eNB,next_slot,abstraction_flag,frame_parms); for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ e2u_t[eNB_id][UE_id]->eNB_id=eNB_id; e2u_t[eNB_id][UE_id]->UE_id=UE_id; e2u_t[eNB_id][UE_id]->r_re=r_re[eNB_id]; e2u_t[eNB_id][UE_id]->r_im=r_im[eNB_id]; e2u_t[eNB_id][UE_id]->r_re0=r_re0_u[eNB_id][UE_id]; e2u_t[eNB_id][UE_id]->r_im0=r_im0_u[eNB_id][UE_id]; e2u_t[eNB_id][UE_id]->s_im=s_im[NB_eNB_INST+UE_id]; e2u_t[eNB_id][UE_id]->s_re=s_re[NB_eNB_INST+UE_id]; e2u_t[eNB_id][UE_id]->eNB2UE=eNB2UE[eNB_id][UE_id]; e2u_t[eNB_id][UE_id]->UE2eNB=UE2eNB[UE_id][eNB_id]; e2u_t[eNB_id][UE_id]->enb_data=enb_data[eNB_id]; e2u_t[eNB_id][UE_id]->ue_data=ue_data[UE_id]; e2u_t[eNB_id][UE_id]->next_slot=&next_slot; e2u_t[eNB_id][UE_id]->abstraction_flag=&abstraction_flag; e2u_t[eNB_id][UE_id]->frame_parms=frame_parms; pthread_create (&cthr_u[eNB_id][UE_id], NULL, do_UL_sig_channel_T,(void*)e2u_t[eNB_id][UE_id]); // pthread_create (&thread[eNB_id][UE_id], NULL, do_UL_sig_channel_T,(void*)cthread); // do_UL_sig_channel(eNB_id,UE_id,r_re0,r_im0,r_re[eNB_id],r_im[eNB_id],s_re[NB_eNB_INST+UE_id],s_im[NB_eNB_INST+UE_id],UE2eNB,next_slot,abstraction_flag,frame_parms); // do_UL_sig_channel(eNB_id,UE_id,r_re0_u[eNB_id][UE_id],r_im0_u[eNB_id][UE_id],r_re[eNB_id],r_im[eNB_id],s_re[NB_eNB_INST+UE_id],s_im[NB_eNB_INST+UE_id],UE2eNB,next_slot,abstraction_flag,frame_parms); } } for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ // pthread_join(thread[eNB_id][UE_id], NULL); pthread_join(cthr_u[eNB_id][UE_id], NULL); } } for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { clean_param(r_re[eNB_id],r_im[eNB_id],frame_parms); for (UE_id = oai_emulation.info.first_ue_local; UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_id++){ channel_add(r_re[eNB_id],r_im[eNB_id],r_re0_u[eNB_id][UE_id],r_im0_u[eNB_id][UE_id],frame_parms); } } // } st2->EResp_FLAG=0; count=0; for (eNB_id=oai_emulation.info.first_enb_local;eNB_id<(oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local);eNB_id++) { send_exec_msg(next_slot,last_slot,mac_xface->frame,mac_xface->frame,slot,0,38810+eNB_id); // n = openairIoSyncCreateThread_2(&this->m_io_sync); // n=trig_wait((void*)&this->m_io_sync); // printf("Waiting for Exec Msg Complete \n"); } // for loop while(count<NB_eNB_INST){ n=trig_wait((void*)&this->m_io_sync); count++; } // while(st2->EResp_FLAG<NB_eNB_INST) // { // n = select(this->m_io_sync.hfd, &read_ibits, NULL, NULL,NULL); // FD_ISSET(this->m_io_sync.io_sync_entries->fd_read, &read_ibits); // // printf(".."); // } } if ((last_slot == 1) && (mac_xface->frame == 0) && (abstraction_flag == 0) && (oai_emulation.info.n_frames == 1)) { // write_output ("dlchan0.m", "dlch0", // &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]), // (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); // write_output ("dlchan1.m", "dlch1", // &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]), // (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); // write_output ("dlchan2.m", "dlch2", // &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]), // (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); // write_output ("pbch_rxF_comp0.m", "pbch_comp0", // PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0], 6 * 12 * 4, 1, 1); // write_output ("pbch_rxF_llr.m", "pbch_llr", // PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr, (frame_parms->Ncp == 0) ? 1920 : 1728, 1, 4); } /* if ((last_slot==1) && (mac_xface->frame==1)) { write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0",PHY_vars_UE->lte_ue_dlsch_vars[eNB_id]->rxdataF_comp[0],300*(-(PHY_vars_UE->lte_frame_parms.Ncp*2)+14),1,1); write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); } */ if (next_slot %2 == 0){ clock_gettime (CLOCK_REALTIME, &time_spec); time_last = time_now; time_now = (unsigned long) time_spec.tv_nsec; td = (int) (time_now - time_last); if (td>0) { td_avg = (int)(((K*(long)td) + (((1<<3)-K)*((long)td_avg)))>>3); // in us LOG_I(EMU,"sleep frame %d, average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n", mac_xface->frame, td_avg, td/1000,(td_avg-TARGET_SF_TIME_NS)/1000); } if (td_avg<(TARGET_SF_TIME_NS - SF_DEVIATION_OFFSET_NS)){ sleep_time_us += SLEEP_STEP_US; } else if (td_avg > (TARGET_SF_TIME_NS + SF_DEVIATION_OFFSET_NS)) { sleep_time_us-= SLEEP_STEP_US; } }// end if next_slot%2 } //end of slot
int main(int argc, char **argv) { #ifdef RTAI RT_TASK *task; RTIME period; #endif int i,j,aa; void *status; /* uint32_t rf_mode_max[4] = {55759,55759,55759,55759}; uint32_t rf_mode_med[4] = {39375,39375,39375,39375}; uint32_t rf_mode_byp[4] = {22991,22991,22991,22991}; */ uint32_t my_rf_mode = RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX; uint32_t rf_mode_base = TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM; uint32_t rf_mode[4] = {my_rf_mode,0,0,0}; uint32_t rf_local[4] = {8255000,8255000,8255000,8255000}; // UE zepto //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa //{8255067,8254810,8257340,8257340}; // eNB PETRONAS uint32_t rf_vcocal[4] = {910,910,910,910}; uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015}; uint32_t rf_rxdc[4] = {32896,32896,32896,32896}; uint32_t rxgain[4] = {20,20,20,20}; uint32_t txgain[4] = {20,20,20,20}; uint16_t Nid_cell = 0; uint8_t cooperation_flag=0, transmission_mode=1, abstraction_flag=0; uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; int c; char do_forms=0; unsigned int fd; unsigned int tcxo = 114; int amp; uint8_t prach_fmt; int N_ZC; char rxg_fname[100]; char txg_fname[100]; char rflo_fname[100]; char rfdc_fname[100]; FILE *rxg_fd=NULL; FILE *txg_fd=NULL; FILE *rflo_fd=NULL; FILE *rfdc_fd=NULL; unsigned int rxg_max[4]={133,133,133,133}, rxg_med[4]={127,127,127,127}, rxg_byp[4]={120,120,120,120}; int tx_max_power=0; char line[1000]; int l; int ret, ant; int ant_offset=0; int error_code; char *itti_dump_file = NULL; const struct option long_options[] = { {"calib-ue-rx", required_argument, NULL, 256}, {"calib-ue-rx-med", required_argument, NULL, 257}, {"calib-ue-rx-byp", required_argument, NULL, 258}, {"debug-ue-prach", no_argument, NULL, 259}, {"no-L2-connect", no_argument, NULL, 260}, {NULL, 0, NULL, 0}}; //mode = normal_txrx; while ((c = getopt_long (argc, argv, "C:K:O:ST:UdF:V",long_options,NULL)) != -1) { switch (c) { case 'V': ouput_vcd = 1; break; case 'd': do_forms=1; break; case 'U': UE_flag = 1; break; case 'C': carrier_freq[0] = atoi(optarg); carrier_freq[1] = atoi(optarg); carrier_freq[2] = atoi(optarg); carrier_freq[3] = atoi(optarg); break; case 'S': fs4_test=1; break; case 'T': tcxo=atoi(optarg); break; case 'K': #if defined(ENABLE_ITTI) itti_dump_file = strdup(optarg); #else printf("-K option is disabled when ENABLE_ITTI is not defined\n"); #endif break; case 'O': #if defined(ENABLE_USE_MME) EPC_MODE_ENABLED = 1; if (optarg == NULL) /* No IP address provided: use localhost */ { memcpy(&EPC_MODE_MME_ADDRESS[0], "127.0.0.1", 10); } else { uint8_t ip_length = strlen(optarg) + 1; memcpy(&EPC_MODE_MME_ADDRESS[0], optarg, ip_length > 16 ? 16 : ip_length); } #else printf("You enabled mme mode without s1ap compiled...\n"); #endif break; case 'F': sprintf(rxg_fname,"%srxg.lime",optarg); rxg_fd = fopen(rxg_fname,"r"); if (rxg_fd) { printf("Loading RX Gain parameters from %s\n",rxg_fname); l=0; while (fgets(line, sizeof(line), rxg_fd)) { if ((strlen(line)==0) || (*line == '#')) continue; //ignore empty or comment lines else { if (l==0) sscanf(line,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]); if (l==1) sscanf(line,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]); if (l==2) sscanf(line,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]); l++; } } } else printf("%s not found, running with defaults\n",rxg_fname); sprintf(txg_fname,"%stxg.lime",optarg); txg_fd = fopen(txg_fname,"r"); if (txg_fd) { printf("Loading TX Gain parameters from %s\n",txg_fname); l=0; while (fgets(line, sizeof(line), txg_fd)) { if ((strlen(line)==0) || (*line == '#')) { continue; //ignore empty or comment lines } else { if (l==0) sscanf(line,"%d %d %d %d",&txgain[0],&txgain[1],&txgain[2],&txgain[3]); if (l==1) sscanf(line,"%d",&tx_max_power); l++; } } } else printf("%s not found, running with defaults\n",txg_fname); sprintf(rflo_fname,"%srflo.lime",optarg); rflo_fd = fopen(rflo_fname,"r"); if (rflo_fd) { printf("Loading RF LO parameters from %s\n",rflo_fname); fscanf(rflo_fd,"%d %d %d %d",&rf_local[0],&rf_local[1],&rf_local[2],&rf_local[3]); } else printf("%s not found, running with defaults\n",rflo_fname); sprintf(rfdc_fname,"%srfdc.lime",optarg); rfdc_fd = fopen(rfdc_fname,"r"); if (rfdc_fd) { printf("Loading RF DC parameters from %s\n",rfdc_fname); fscanf(rfdc_fd,"%d %d %d %d",&rf_rxdc[0],&rf_rxdc[1],&rf_rxdc[2],&rf_rxdc[3]); } else printf("%s not found, running with defaults\n",rfdc_fname); break; /* case 256: mode = rx_calib_ue; rx_input_level_dBm = atoi(optarg); printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm); break; case 257: mode = rx_calib_ue_med; rx_input_level_dBm = atoi(optarg); printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm); break; case 258: mode = rx_calib_ue_byp; rx_input_level_dBm = atoi(optarg); printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm); break; case 259: mode = debug_prach; break; case 260: mode = no_L2_connect; break; */ default: break; } } if (UE_flag==1) printf("configuring for UE\n"); else printf("configuring for eNB\n"); //randominit (0); //set_taus_seed (0); // initialize the log (see log.h for details) logInit(); #if defined(ENABLE_ITTI) itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file); # if defined(ENABLE_USE_MME) if (itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0) { LOG_E(EMU, "Create task failed"); LOG_D(EMU, "Initializing SCTP task interface: FAILED\n"); return -1; } if (itti_create_task(TASK_S1AP, s1ap_eNB_task, NULL) < 0) { LOG_E(EMU, "Create task failed"); LOG_D(EMU, "Initializing S1AP task interface: FAILED\n"); return -1; } # endif if (itti_create_task(TASK_L2L1, l2l1_task, NULL) < 0) { LOG_E(EMU, "Create task failed"); LOG_D(EMU, "Initializing L2L1 task interface: FAILED\n"); return -1; } // Handle signals until all tasks are terminated // itti_wait_tasks_end(); #endif if (ouput_vcd) { if (UE_flag==1) vcd_signal_dumper_init("/tmp/openair_dump_UE.vcd"); else vcd_signal_dumper_init("/tmp/openair_dump_eNB.vcd"); } #ifdef NAS_NETLINK netlink_init(); #endif // to make a graceful exit when ctrl-c is pressed signal(SIGSEGV, signal_handler); signal(SIGINT, signal_handler); #ifndef RTAI check_clock(); #endif g_log->log_component[HW].level = LOG_DEBUG; g_log->log_component[HW].flag = LOG_HIGH; #ifdef OPENAIR2 g_log->log_component[PHY].level = LOG_INFO; #else g_log->log_component[PHY].level = LOG_INFO; #endif g_log->log_component[PHY].flag = LOG_HIGH; g_log->log_component[MAC].level = LOG_INFO; g_log->log_component[MAC].flag = LOG_HIGH; g_log->log_component[RLC].level = LOG_INFO; g_log->log_component[RLC].flag = LOG_HIGH; g_log->log_component[PDCP].level = LOG_INFO; g_log->log_component[PDCP].flag = LOG_HIGH; g_log->log_component[OTG].level = LOG_INFO; g_log->log_component[OTG].flag = LOG_HIGH; g_log->log_component[RRC].level = LOG_INFO; g_log->log_component[RRC].flag = LOG_HIGH; // Initialize card ret = openair0_open(); if ( ret != 0 ) { if (ret == -1) printf("Error opening /dev/openair0"); if (ret == -2) printf("Error mapping bigshm"); if (ret == -3) printf("Error mapping RX or TX buffer"); return(ret); } printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[card]); p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr; p_exmimo_id = openair0_exmimo_pci[card].exmimo_id_ptr; printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev); if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2) p_exmimo_config->framing.eNB_flag = 0; else p_exmimo_config->framing.eNB_flag = !UE_flag; p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB; for (ant=0; ant<4; ant++) p_exmimo_config->framing.resampling_factor[ant] = RESAMPLING_FACTOR; /* for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++) p_exmimo_config->rf.rf_mode[ant] = rf_mode_base; for (ant=0;ant<frame_parms->nb_antennas_tx;ant++) p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX); for (ant=0;ant<frame_parms->nb_antennas_rx;ant++) p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX); for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) { p_exmimo_config->rf.rf_mode[ant] = 0; carrier_freq[ant] = 0; //this turns off all other LIMEs } */ ant_offset = 0; for (ant=0; ant<4; ant++) { if (ant==ant_offset) { //if (1) { p_exmimo_config->rf.rf_mode[ant] = rf_mode_base; //p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX); p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX); } else { p_exmimo_config->rf.rf_mode[ant] = 0; carrier_freq[ant] = 0; //this turns off all other LIMEs } } for (ant = 0; ant<4; ant++) { p_exmimo_config->rf.do_autocal[ant] = 1; p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant]; p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant]; p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant]; p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant]; p_exmimo_config->rf.rf_local[ant] = rf_local[ant]; p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant]; if ((carrier_freq[ant] >= 850000000) && (carrier_freq[ant] <= 865000000)) { p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal_850[ant]; p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD; } else if ((carrier_freq[ant] >= 1900000000) && (carrier_freq[ant] <= 2000000000)) { p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD; } else { p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; p_exmimo_config->rf.rffe_band_mode[ant] = 0; } p_exmimo_config->rf.rffe_gain_txlow[ant] = 31; p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31; p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52; p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31; } number_of_cards = openair0_num_detected_cards; /* if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1 openair_daq_vars.timing_advance = 138; else //ExpressMIMO2 openair_daq_vars.timing_advance = 0; */ openair0_dump_config(card); printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n", p_exmimo_config->rf.rf_mode[0], p_exmimo_config->rf.rf_mode[1], p_exmimo_config->rf.rf_mode[2], p_exmimo_config->rf.rf_mode[3], (p_exmimo_config->rf.rf_mode[0]&3), // RXen+TXen (p_exmimo_config->rf.rf_mode[0]&4)>>2, //TXLPFen (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF (p_exmimo_config->rf.rf_mode[0]&128)>>7, //RXLPFen (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode p_exmimo_config->rf.rf_rxdc[0], p_exmimo_config->rf.rf_local[0], p_exmimo_config->rf.rf_vcocal[0]); for (ant=0;ant<4;ant++) p_exmimo_config->rf.do_autocal[ant] = 0; #ifdef EMOS error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE); if (error_code==0) printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); else if (error_code==ENODEV) printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR); else if (error_code==ENOMEM) printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); else printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code); #endif mlockall(MCL_CURRENT | MCL_FUTURE); #ifdef RTAI // make main thread LXRT soft realtime task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); // start realtime timer and scheduler #ifdef TIMER_ONESHOT_MODE rt_set_oneshot_mode(); start_rt_timer(0); printf("started RTAI timer inoneshot mode\n"); #else rt_set_periodic_mode(); period = start_rt_timer(nano2count(500000)); printf("started RTAI timer with period %llu ns\n",count2nano(period)); #endif printf("Init mutex\n"); //mutex = rt_get_adr(nam2num("MUTEX")); mutex = rt_sem_init(nam2num("MUTEX"), 1); if (mutex==0) { printf("Error init mutex\n"); exit(-1); } else printf("mutex=%p\n",mutex); #endif DAQ_MBOX = (volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]; // this starts the DMA transfers if (UE_flag!=1) openair0_start_rt_acquisition(card); #ifdef XFORMS if (do_forms==1) { fl_initialize (&argc, argv, NULL, 0, 0); form_stats = create_form_stats_form(); if (UE_flag==1) { form_ue[UE_id] = create_lte_phy_scope_ue(); sprintf (title, "LTE DL SCOPE UE"); fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); } else { for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) { form_enb[UE_id] = create_lte_phy_scope_enb(); sprintf (title, "UE%d LTE UL SCOPE eNB",UE_id+1); fl_show_form (form_enb[UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); } } fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats"); if (UE_flag==0) { for (UE_id=0;UE_id<scope_enb_num_ue;UE_id++) { if (otg_enabled) { fl_set_button(form_enb[UE_id]->button_0,1); fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON"); } else { fl_set_button(form_enb[UE_id]->button_0,0); fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF"); } } } else { if (openair_daq_vars.use_ia_receiver) { fl_set_button(form_ue[UE_id]->button_0,1); fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON"); } else { fl_set_button(form_ue[UE_id]->button_0,0); fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); } } ret = pthread_create(&thread2, NULL, scope_thread, NULL); printf("Scope thread created, ret=%d\n",ret); } #endif #ifdef EMOS ret = pthread_create(&thread3, NULL, emos_thread, NULL); printf("EMOS thread created, ret=%d\n",ret); #endif rt_sleep_ns(10*FRAME_PERIOD); #ifndef RTAI pthread_attr_init (&attr_dlsch_threads); pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE); //attr_dlsch_threads.priority = 1; sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch); pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); #endif // start the main thread if (UE_flag == 1) { /* #ifdef RTAI thread1 = rt_thread_create(UE_thread, NULL, 100000000); #else error_code = pthread_create(&thread1, &attr_dlsch_threads, UE_thread, NULL); if (error_code!= 0) { LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); return(error_code); } else { LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n"); } #endif #ifdef DLSCH_THREAD init_rx_pdsch_thread(); rt_sleep_ns(FRAME_PERIOD/10); init_dlsch_threads(); #endif printf("UE threads created\n"); */ } else { #ifdef RTAI thread0 = rt_thread_create(eNB_thread, NULL, 100000000); #else error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL); if (error_code!= 0) { LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); return(error_code); } else { LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n"); } #endif #ifdef ULSCH_THREAD init_ulsch_threads(); #endif printf("eNB threads created\n"); } // wait for end of program printf("TYPE <CTRL-C> TO TERMINATE\n"); //getchar(); while (oai_exit==0) rt_sleep_ns(FRAME_PERIOD); // stop threads #ifdef XFORMS printf("waiting for XFORMS thread\n"); if (do_forms==1) { pthread_join(thread2,&status); fl_hide_form(form_stats->stats_form); fl_free_form(form_stats->stats_form); if (UE_flag==1) { fl_hide_form(form_ue[UE_id]->lte_phy_scope_ue); fl_free_form(form_ue[UE_id]->lte_phy_scope_ue); } else { for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) { fl_hide_form(form_enb[UE_id]->lte_phy_scope_enb); fl_free_form(form_enb[UE_id]->lte_phy_scope_enb); } } } #endif printf("stopping MODEM threads\n"); // cleanup if (UE_flag == 1) { /* #ifdef RTAI rt_thread_join(thread1); #else pthread_join(thread1,&status); #endif #ifdef DLSCH_THREAD cleanup_dlsch_threads(); cleanup_rx_pdsch_thread(); #endif */ } else { #ifdef RTAI rt_thread_join(thread0); #else pthread_join(thread0,&status); #endif #ifdef ULSCH_THREAD cleanup_ulsch_threads(); #endif } #ifdef OPENAIR2 //cleanup_pdcp_thread(); #endif #ifdef RTAI stop_rt_timer(); #endif printf("stopping card\n"); openair0_stop(card); printf("closing openair0_lib\n"); openair0_close(); #ifdef EMOS printf("waiting for EMOS thread\n"); pthread_cancel(thread3); pthread_join(thread3,&status); #endif #ifdef EMOS error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR); printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code); #endif if (ouput_vcd) vcd_signal_dumper_close(); logClean(); return 0; }
int main(int argc, char **argv) { char c; int i,l,aa; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; uint8_t snr1set=0; //mod_sym_t **txdataF; int **txdata,**txdata1,**txdata2; double **s_re,**s_im,**s_re1,**s_im1,**s_re2,**s_im2,**r_re,**r_im,**r_re1,**r_im1,**r_re2,**r_im2; double iqim = 0.0; unsigned char pbch_pdu[6]; // int sync_pos, sync_pos_slot; // FILE *rx_frame_file; FILE *output_fd; uint8_t write_output_file=0; int result; int freq_offset; // int subframe_offset; // char fname[40], vname[40]; int trial, n_trials, ntrials=1, n_errors,n_errors2,n_alamouti; uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint16_t Nid_cell=0; int n_frames=1; channel_desc_t *eNB2UE,*eNB2UE1,*eNB2UE2; uint32_t nsymb,tx_lev,tx_lev1,tx_lev2; uint8_t extended_prefix_flag=0; LTE_DL_FRAME_PARMS *frame_parms; #ifdef EMOS fifo_dump_emos emos_dump; #endif FILE *input_fd=NULL,*pbch_file_fd=NULL; char input_val_str[50],input_val_str2[50]; // double input_val1,input_val2; // uint16_t amask=0; uint8_t frame_mod4,num_pdcch_symbols; uint16_t NB_RB=25; SCM_t channel_model=AWGN;//Rayleigh1_anticorr; DCI_ALLOC_t dci_alloc[8]; uint8_t abstraction_flag=0;//,calibration_flag=0; int pbch_tx_ant; uint8_t N_RB_DL=100,osf=1; unsigned char frame_type = FDD; unsigned char pbch_phase = 0; #ifdef XFORMS FD_lte_phy_scope_ue *form_ue; char title[255]; #endif logInit(); number_of_cards = 1; openair_daq_vars.rx_rf_mode = 1; /* rxdataF = (int **)malloc16(2*sizeof(int*)); rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); rxdata = (int **)malloc16(2*sizeof(int*)); rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); */ while ((c = getopt (argc, argv, "f:hpf:g:n:s:S:t:x:y:z:N:F:GdP:")) != -1) { switch (c) { case 'f': write_output_file=1; output_fd = fopen(optarg,"w"); if (output_fd==NULL) { printf("Error opening %s\n",optarg); exit(-1); } break; case 'd': frame_type = TDD; break; case 'g': switch((char)*optarg) { case 'A': channel_model=SCM_A; break; case 'B': channel_model=SCM_B; break; case 'C': channel_model=SCM_C; break; case 'D': channel_model=SCM_D; break; case 'E': channel_model=EPA; break; case 'F': channel_model=EVA; break; case 'G': channel_model=ETU; break; default: msg("Unsupported channel model!\n"); exit(-1); } break; case 'n': n_frames = atoi(optarg); break; case 's': snr0 = atof(optarg); msg("Setting SNR0 to %f\n",snr0); break; case 'S': snr1 = atof(optarg); snr1set=1; msg("Setting SNR1 to %f\n",snr1); break; /* case 't': Td= atof(optarg); break; */ case 'p': extended_prefix_flag=1; break; /* case 'r': ricean_factor = pow(10,-.1*atof(optarg)); if (ricean_factor>1) { printf("Ricean factor must be between 0 and 1\n"); exit(-1); } break; */ case 'x': transmission_mode=atoi(optarg); if ((transmission_mode!=1) && (transmission_mode!=2) && (transmission_mode!=6)) { msg("Unsupported transmission mode %d\n",transmission_mode); exit(-1); } break; case 'y': n_tx=atoi(optarg); if ((n_tx==0) || (n_tx>2)) { msg("Unsupported number of tx antennas %d\n",n_tx); exit(-1); } break; case 'z': n_rx=atoi(optarg); if ((n_rx==0) || (n_rx>2)) { msg("Unsupported number of rx antennas %d\n",n_rx); exit(-1); } break; case 'A': abstraction_flag=1; ntrials=10000; msg("Running Abstraction test\n"); pbch_file_fd=fopen(optarg,"r"); if (pbch_file_fd==NULL) { printf("Problem with filename %s\n",optarg); exit(-1); } break; // case 'C': // calibration_flag=1; // msg("Running Abstraction calibration for Bias removal\n"); // break; case 'N': Nid_cell = atoi(optarg); break; case 'F': input_fd = fopen(optarg,"r"); if (input_fd==NULL) { printf("Problem with filename %s\n",optarg); exit(-1); } break; case 'P': pbch_phase = atoi(optarg); if (pbch_phase>3) printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase); break; default: case 'h': printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -N CellId\n", argv[0]); printf("-h This message\n"); printf("-p Use extended prefix mode\n"); printf("-d Use TDD\n"); printf("-n Number of frames to simulate\n"); printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-t Delay spread for multipath channel\n"); printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); printf("-x Transmission mode (1,2,6 for the moment)\n"); printf("-y Number of TX antennas used in eNB\n"); printf("-z Number of RX antennas used in UE\n"); printf("-N Nid_cell\n"); printf("-f Output filename (.txt format) for Pe/SNR results\n"); printf("-F Input filename (.txt format) for RX conformance testing\n"); exit (-1); break; } } if (transmission_mode>=2) n_tx=2; lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,N_RB_DL,osf); #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); form_ue = create_lte_phy_scope_ue(); sprintf (title, "LTE PHY SCOPE UE"); fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); #endif if (snr1set==0) { if (n_frames==1) snr1 = snr0+.1; else snr1 = snr0+5.0; } printf("SNR0 %f, SNR1 %f\n",snr0,snr1); frame_parms = &PHY_vars_eNb->lte_frame_parms; txdata = PHY_vars_eNb->lte_eNB_common_vars.txdata[0]; txdata1 = PHY_vars_eNb1->lte_eNB_common_vars.txdata[0]; txdata2 = PHY_vars_eNb2->lte_eNB_common_vars.txdata[0]; s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double*)); s_re1 = malloc(2*sizeof(double*)); s_im1 = malloc(2*sizeof(double*)); s_re2 = malloc(2*sizeof(double*)); s_im2 = malloc(2*sizeof(double*)); r_re = malloc(2*sizeof(double*)); r_im = malloc(2*sizeof(double*)); r_re1 = malloc(2*sizeof(double*)); r_im1 = malloc(2*sizeof(double*)); r_re2 = malloc(2*sizeof(double*)); r_im2 = malloc(2*sizeof(double*)); nsymb = (frame_parms->Ncp == 0) ? 14 : 12; printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS, frame_parms->Ncp,frame_parms->samples_per_tti,nsymb); printf("PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0] = %p\n", PHY_vars_eNb1->lte_eNB_common_vars.txdataF[0][0]); DLSCH_alloc_pdu2.rah = 0; DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC; DLSCH_alloc_pdu2.TPC = 0; DLSCH_alloc_pdu2.dai = 0; DLSCH_alloc_pdu2.harq_pid = 0; DLSCH_alloc_pdu2.tb_swap = 0; DLSCH_alloc_pdu2.mcs1 = 0; DLSCH_alloc_pdu2.ndi1 = 1; DLSCH_alloc_pdu2.rv1 = 0; // Forget second codeword DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding eNB2UE = new_channel_desc_scm(PHY_vars_eNb->lte_frame_parms.nb_antennas_tx, PHY_vars_UE->lte_frame_parms.nb_antennas_rx, channel_model, BW, 0, 0, 0); if (eNB2UE==NULL) { msg("Problem generating channel model. Exiting.\n"); exit(-1); } for (i=0; i<2; i++) { s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_re1[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re1[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im1[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_im1[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_re2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_im2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_re1[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_re1[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_im1[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_im1[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_re2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_re2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_im2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_im2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); } pbch_pdu[0]=100; pbch_pdu[1]=1; pbch_pdu[2]=0; if (PHY_vars_eNb->lte_frame_parms.frame_type == FDD) { generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, (PHY_vars_eNb->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, 0); /* generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, (PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4, 0);*/ generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, (PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5, 10); /* generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, (PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 5 : 4, 10); */ } else { generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, (PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5, 1); generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, 2, 2); generate_sss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, (PHY_vars_eNb->lte_frame_parms.Ncp==0) ? 6 : 5, 11); generate_pss(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, 2, 12); } /* generate_pilots(PHY_vars_eNb, PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); num_pdcch_symbols = generate_dci_top(1, 0, dci_alloc, 0, 1024, &PHY_vars_eNb->lte_frame_parms, PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], 0); */ /* if (num_pdcch_symbols<3) { printf("Less than 3 pdcch symbols\n"); // exit(-1); } if (pbch_phase>0) { dummybuf[0] = dummy0; dummybuf[1] = dummy1; dummybuf[2] = dummy2; dummybuf[3] = dummy3; generate_pbch(&PHY_vars_eNb->lte_eNB_pbch, (mod_sym_t**)dummybuf, AMP, &PHY_vars_eNb->lte_frame_parms, pbch_pdu, 0); } generate_pbch(&PHY_vars_eNb->lte_eNB_pbch, PHY_vars_eNb->lte_eNB_common_vars.txdataF[0], AMP, &PHY_vars_eNb->lte_frame_parms, pbch_pdu, pbch_phase); */ write_output("txsigF0.m","txsF0", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); if (PHY_vars_eNb->lte_frame_parms.nb_antennas_tx>1) write_output("txsigF1.m","txsF1", PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); tx_lev = 0; tx_lev1 = 0; tx_lev2 = 0; for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) PHY_ofdm_mod(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][aa], // input, txdata[aa], // output frame_parms->log2_symbol_size, // log2_fft_size LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { normal_prefix_mod(PHY_vars_eNb->lte_eNB_common_vars.txdataF[0][aa], txdata[aa], LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, frame_parms); } tx_lev += signal_energy(&txdata[aa][frame_parms->samples_per_tti/2], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); } write_output("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); if (frame_parms->nb_antennas_tx>1) write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); // multipath channel for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_tx; aa++) { s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); } } for (SNR=snr0; SNR<snr1; SNR+=.2) { n_errors = 0; n_errors2 = 0; n_alamouti = 0; for (trial=0; trial<n_frames; trial++) { multipath_channel(eNB2UE,s_re,s_im,r_re,r_im, 2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0); sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNb->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR; if (n_frames==1) printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,%f,%f\n",sigma2_dB,SNR, 10*log10((double)tx_lev), 10*log10((double)tx_lev1), 10*log10((double)tx_lev2)); //AWGN sigma2 = pow(10,sigma2_dB/10); /* if (n_frames==1) { printf("rx_level data symbol %f, tx_lev %f\n", 10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0)), 10*log10(tx_lev)); } */ for (n_trials=0; n_trials<ntrials; n_trials++) { //printf("n_trial %d\n",n_trials); for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (aa=0; aa<PHY_vars_eNb->lte_frame_parms.nb_antennas_rx; aa++) { ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } lte_sync_timefreq(PHY_vars_UE,0,2680000000); if (n_frames==1) { printf("rx_level data symbol %f\n", 10*log10(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))); } } //noise trials } // trials if (abstraction_flag==0) { printf("SNR %f : n_errors2 = %d/%d (BLER %e,40ms BLER %e,%d,%d), n_alamouti %d\n", SNR,n_errors2,ntrials*(1+trial),(double)n_errors2/(ntrials*(1+trial)),pow((double)n_errors2/(ntrials*(1+trial)),4), ntrials,trial,n_alamouti); if (write_output_file==1) fprintf(output_fd,"%f %e\n",SNR,(double)n_errors2/(ntrials*(1+trial))); } } // NSR if (n_frames==1) { } for (i=0; i<2; i++) { free(s_re[i]); free(s_im[i]); free(r_re[i]); free(r_im[i]); } free(s_re); free(s_im); free(r_re); free(r_im); lte_sync_time_free(); if (write_output_file) fclose(output_fd); return(n_errors); }