/******************************************************************************* * Main function ******************************************************************************/ int UHD_SAFE_MAIN(int argc, char *argv[]){ uhd::set_thread_priority_safe(); /** Constant Decalartions *************************************************/ const INT32U time = DURATION*(SAMPRATE/SPB); /** Variable Declarations *************************************************/ // (circular) receive buffers std::vector< CINT16 > ch0_rxbuff(time*SPB); // Ch 0 is RX2-A std::vector< CINT16 > ch1_rxbuff(time*SPB); // Ch 1 is RX2-B // Vector of pointers to sectons of rx_buff std::vector< std::vector< CINT16 *> > rxbuffs(time*2, std::vector< CINT16 *>(2)); // Holds the number of received samples returned by rx_stream->recv() INT16U num_rx_samps; // Counters INT16U i = 0,j = 0,k = 0; // Generic counters INT32U write_ctr = 0; // Counts loops through main while() /** Variable Initializations **********************************************/ // Initialise rxbuffs (Vector of pointers) for(i = 0; i < time; i++){ rxbuffs[i][0] = &ch0_rxbuff.front() + SPB * i; rxbuffs[i][1] = &ch1_rxbuff.front() + SPB * i; } /** Main code *************************************************************/ // set USRP Rx params uhd::usrp::multi_usrp::sptr usrp_rx = uhd::usrp::multi_usrp::make(std::string("")); // create a usrp device uhd::tune_request_t tune_request(CARRIERFREQ); // validate tune request usrp_rx->set_master_clock_rate(CLOCKRATE); // set clock rate usrp_rx->set_clock_source(std::string("internal")); // lock mboard clocks // usrp_rx->set_time_source("external"); // Use external reference clock usrp_rx->set_rx_subdev_spec(std::string("A:A A:B")); // select the subdevice usrp_rx->set_rx_rate(SAMPRATE,0); // set the sample rate (Ch 0) usrp_rx->set_rx_rate(SAMPRATE,1); // set the sample rate (Ch 1) usrp_rx->set_rx_freq(tune_request,0); // set the center frequency (Ch 0) usrp_rx->set_rx_freq(tune_request,1); // set the center frequency (Ch 1) usrp_rx->set_rx_gain(RXGAIN,0); // set the rf gain (Ch 0) usrp_rx->set_rx_gain(RXGAIN,1); // set the rf gain (Ch 1) usrp_rx->set_rx_antenna(std::string("TX/RX"),0); // set the antenna (Ch 0) usrp_rx->set_rx_antenna(std::string("TX/RX"),1); // set the antenna (Ch 1) boost::this_thread::sleep(boost::posix_time::seconds(1.0)); // allow for some setup time // check Ref and LO Lock detect for Rx check_locked_sensor(usrp_rx->get_rx_sensor_names(0), "lo_locked", boost::bind(&uhd::usrp::multi_usrp::get_rx_sensor, usrp_rx, _1, 0), 1.0); // create a receive streamer uhd::stream_args_t stream_args_rx("sc16", "sc16"); stream_args_rx.channels = boost::assign::list_of(0)(1); uhd::rx_streamer::sptr rx_stream = usrp_rx->get_rx_stream(stream_args_rx); uhd::rx_metadata_t md_rx; // report stuff to user (things which may differ from what was requested) std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp_rx->get_rx_rate()/1e6) << std::endl; // set sigint so user can terminate via Ctrl-C std::signal(SIGINT, &sig_int_handler); std::cout << boost::format("Recording RX CH 0 and CH 1 for %i seconds") % DURATION << std::endl << std::endl; std::cout << "Press Enter to start recording..." << std::endl << std::endl; // Wait for "ENTER" key to be pressed while(std::cin.get() != '\n'){} std::cout << "Press Ctrl + C to stop recording..." << std::endl; // setup receive streaming uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); stream_cmd.stream_now = false; stream_cmd.time_spec = uhd::time_spec_t(0.25)+usrp_rx->get_time_now(); // tell USRP to start streaming 0.25 seconds in the future rx_stream->issue_stream_cmd(stream_cmd); // grab initial block of received samples from USRP with nice long timeout (gets discarded) num_rx_samps = rx_stream->recv(rxbuffs[0], SPB, md_rx, 3.0); while(not stop_signal_called){ // grab block of received samples from USRP num_rx_samps = rx_stream->recv(rxbuffs[write_ctr], SPB, md_rx); // Increment counter write_ctr++; // Check if full time has passed if(write_ctr == time){ break; }else{} // Report progress to terminal std::cout << boost::format("\r\t%2i Percent Complete ") % (write_ctr*100/time) << std::flush; } /** while(not stop_signal_called) *************************************/ // Report progress to terminal std::cout << "\r\tdone! " << std::endl << std::endl; if(stop_signal_called){ std::cout << std::endl << "Writing partial buffers to file (this may take awhile)..." << std::endl; }else{ // Write buffers to file std::cout << "Writing buffers to file (this may take awhile)..." << std::endl; } std::cout << " Channel 0 (RX2-A)..." << std::flush; writebuff("./RX2-A.dat", &ch0_rxbuff.front(), write_ctr*SPB); std::cout << "done!" << std::endl; std::cout << " Channel 1 (RX2-B)..." << std::flush; writebuff("./RX2-B.dat", &ch1_rxbuff.front(), write_ctr*SPB); std::cout << "done!" << std::endl; return EXIT_SUCCESS; } /** main() ****************************************************************/
int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_cfg) { uhd::set_thread_priority_safe(1.0); usrp_state_t *s = (usrp_state_t*)malloc(sizeof(usrp_state_t)); memset(s, 0, sizeof(usrp_state_t)); // Initialize USRP device std::string args = "type=b200"; uhd::device_addrs_t device_adds = uhd::device::find(args); size_t i; printf("Checking for USRPs\n"); if(device_adds.size() == 0) { double usrp_master_clock = 184.32e6; std::string args = "type=x300"; // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); uhd::device_addrs_t device_adds = uhd::device::find(args); if(device_adds.size() == 0) { std::cerr<<"No USRP Device Found. " << std::endl; free(s); return -1; } printf("Found USRP X300\n"); s->usrp = uhd::usrp::multi_usrp::make(args); // s->usrp->set_rx_subdev_spec(rx_subdev); // s->usrp->set_tx_subdev_spec(tx_subdev); // lock mboard clocks s->usrp->set_clock_source("internal"); //Setting device type to USRP X300/X310 device->type=USRP_X300_IF; // this is not working yet, master clock has to be set via constructor // set master clock rate and sample rate for tx & rx for streaming //s->usrp->set_master_clock_rate(usrp_master_clock); openair0_cfg[0].rx_gain_calib_table = calib_table_x310; switch ((int)openair0_cfg[0].sample_rate) { case 30720000: // from usrp_time_offset openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 15; openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 15360000: openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 45; openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 7680000: openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 50; openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; openair0_cfg[0].tx_sample_advance = 50; openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); exit(-1); break; } } else { printf("Found USRP B200"); s->usrp = uhd::usrp::multi_usrp::make(args); // s->usrp->set_rx_subdev_spec(rx_subdev); // s->usrp->set_tx_subdev_spec(tx_subdev); // do not explicitly set the clock to "internal", because this will disable the gpsdo // // lock mboard clocks // s->usrp->set_clock_source("internal"); // set master clock rate and sample rate for tx & rx for streaming device->type = USRP_B200_IF; s->usrp->set_master_clock_rate(30.72e6); openair0_cfg[0].rx_gain_calib_table = calib_table_b210; switch ((int)openair0_cfg[0].sample_rate) { case 30720000: // from usrp_time_offset openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 115; openair0_cfg[0].tx_scheduling_advance = 11*openair0_cfg[0].samples_per_packet; break; case 15360000: openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 113; openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 7680000: openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 70;//103; openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; openair0_cfg[0].tx_sample_advance = 40; openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); exit(-1); break; } } for(i=0;i<s->usrp->get_rx_num_channels();i++) { if (i<openair0_cfg[0].rx_num_channels) { s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i); s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6); s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); set_rx_gain_offset(&openair0_cfg[0],i); ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); // limit to maximum gain if (openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] > gain_range.stop()) { printf("RX Gain %lu too high, lower by %f dB\n",i,openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); exit(-1); } s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); printf("RX Gain %lu %f (%f) => %f (max %f)\n",i, openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); } } for(i=0;i<s->usrp->get_tx_num_channels();i++) { if (i<openair0_cfg[0].tx_num_channels) { s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i); s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); printf("Setting tx freq/gain on channel %lu/%lu: BW %f (readback %f)\n",i,s->usrp->get_tx_num_channels(),openair0_cfg[0].tx_bw/1e6,s->usrp->get_tx_bandwidth(i)/1e6); s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[i],i); } } // display USRP settings std::cout << boost::format("Actual master clock: %fMHz...") % (s->usrp->get_master_clock_rate()/1e6) << std::endl; // create tx & rx streamer uhd::stream_args_t stream_args_rx("sc16", "sc16"); //stream_args_rx.args["spp"] = str(boost::format("%d") % 2048);//(openair0_cfg[0].rx_num_channels*openair0_cfg[0].samples_per_packet)); for (i = 0; i<openair0_cfg[0].rx_num_channels; i++) stream_args_rx.channels.push_back(i); s->rx_stream = s->usrp->get_rx_stream(stream_args_rx); std::cout << boost::format("rx_max_num_samps %u") % (s->rx_stream->get_max_num_samps()) << std::endl; //openair0_cfg[0].samples_per_packet = s->rx_stream->get_max_num_samps(); uhd::stream_args_t stream_args_tx("sc16", "sc16"); //stream_args_tx.args["spp"] = str(boost::format("%d") % 2048);//(openair0_cfg[0].tx_num_channels*openair0_cfg[0].samples_per_packet)); for (i = 0; i<openair0_cfg[0].tx_num_channels; i++) stream_args_tx.channels.push_back(i); s->tx_stream = s->usrp->get_tx_stream(stream_args_tx); std::cout << boost::format("tx_max_num_samps %u") % (s->tx_stream->get_max_num_samps()) << std::endl; s->usrp->set_time_now(uhd::time_spec_t(0.0)); for (i=0;i<openair0_cfg[0].rx_num_channels;i++) { if (i<openair0_cfg[0].rx_num_channels) { printf("RX Channel %lu\n",i); std::cout << boost::format("Actual RX sample rate: %fMSps...") % (s->usrp->get_rx_rate(i)/1e6) << std::endl; std::cout << boost::format("Actual RX frequency: %fGHz...") % (s->usrp->get_rx_freq(i)/1e9) << std::endl; std::cout << boost::format("Actual RX gain: %f...") % (s->usrp->get_rx_gain(i)) << std::endl; std::cout << boost::format("Actual RX bandwidth: %fM...") % (s->usrp->get_rx_bandwidth(i)/1e6) << std::endl; std::cout << boost::format("Actual RX antenna: %s...") % (s->usrp->get_rx_antenna(i)) << std::endl; } } for (i=0;i<openair0_cfg[0].tx_num_channels;i++) { if (i<openair0_cfg[0].tx_num_channels) { printf("TX Channel %lu\n",i); std::cout << std::endl<<boost::format("Actual TX sample rate: %fMSps...") % (s->usrp->get_tx_rate(i)/1e6) << std::endl; std::cout << boost::format("Actual TX frequency: %fGHz...") % (s->usrp->get_tx_freq(i)/1e9) << std::endl; std::cout << boost::format("Actual TX gain: %f...") % (s->usrp->get_tx_gain(i)) << std::endl; std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl; std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl; } } std::cout << boost::format("Device timestamp: %f...") % (s->usrp->get_time_now().get_real_secs()) << std::endl; device->priv = s; device->trx_start_func = trx_usrp_start; device->trx_write_func = trx_usrp_write; device->trx_read_func = trx_usrp_read; device->trx_get_stats_func = trx_usrp_get_stats; device->trx_reset_stats_func = trx_usrp_reset_stats; device->trx_end_func = trx_usrp_end; device->trx_stop_func = trx_usrp_stop; device->trx_set_freq_func = trx_usrp_set_freq; device->trx_set_gains_func = trx_usrp_set_gains; s->sample_rate = openair0_cfg[0].sample_rate; // TODO: // init tx_forward_nsamps based usrp_time_offset ex if(is_equal(s->sample_rate, (double)30.72e6)) s->tx_forward_nsamps = 176; if(is_equal(s->sample_rate, (double)15.36e6)) s->tx_forward_nsamps = 90; if(is_equal(s->sample_rate, (double)7.68e6)) s->tx_forward_nsamps = 50; return 0; }
int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg) { uhd::set_thread_priority_safe(1.0); usrp_state_t *s = (usrp_state_t*)malloc(sizeof(usrp_state_t)); memset(s, 0, sizeof(usrp_state_t)); // Initialize USRP device std::string args = "type=b200"; /* std::string rx_subdev = "A:A A:B"; std::string tx_subdev = "A:A A:B";*/ uhd::device_addrs_t device_adds = uhd::device::find(args); size_t i; if(device_adds.size() == 0) { std::cerr<<"No USRP Device Found. " << std::endl; free(s); return -1; } s->usrp = uhd::usrp::multi_usrp::make(args); // s->usrp->set_rx_subdev_spec(rx_subdev); // s->usrp->set_tx_subdev_spec(tx_subdev); // lock mboard clocks s->usrp->set_clock_source("internal"); // set master clock rate and sample rate for tx & rx for streaming s->usrp->set_master_clock_rate(30.72e6); for(i=0;i<s->usrp->get_rx_num_channels();i++) { if (i<openair0_cfg[0].rx_num_channels) { s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i); s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw); printf("Setting rx freq/gain on channel %d/%d\n",i,s->usrp->get_rx_num_channels()); s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i],i); } } for(i=0;i<s->usrp->get_tx_num_channels();i++) { if (i<openair0_cfg[0].tx_num_channels) { s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i); s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); printf("Setting tx freq/gain on channel %d/%d\n",i,s->usrp->get_tx_num_channels()); s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[i],i); } } // create tx & rx streamer uhd::stream_args_t stream_args_rx("sc16", "sc16"); stream_args_rx.args["spp"] = str(boost::format("%d") % openair0_cfg[0].samples_per_packet); uhd::stream_args_t stream_args_tx("sc16", "sc16"); stream_args_tx.args["spp"] = str(boost::format("%d") % openair0_cfg[0].samples_per_packet); for (i = 0; i<openair0_cfg[0].rx_num_channels; i++) stream_args_rx.channels.push_back(i); for (i = 0; i<openair0_cfg[0].tx_num_channels; i++) stream_args_tx.channels.push_back(i); s->tx_stream = s->usrp->get_tx_stream(stream_args_tx); s->rx_stream = s->usrp->get_rx_stream(stream_args_rx); s->usrp->set_time_now(uhd::time_spec_t(0.0)); // display USRP settings for (i=0;i<openair0_cfg[0].rx_num_channels;i++) { if (i<openair0_cfg[0].rx_num_channels) { printf("RX Channel %d\n",i); std::cout << boost::format("Actual RX sample rate: %fMSps...") % (s->usrp->get_rx_rate(i)/1e6) << std::endl; std::cout << boost::format("Actual RX frequency: %fGHz...") % (s->usrp->get_rx_freq(i)/1e9) << std::endl; std::cout << boost::format("Actual RX gain: %f...") % (s->usrp->get_rx_gain(i)) << std::endl; std::cout << boost::format("Actual RX bandwidth: %fM...") % (s->usrp->get_rx_bandwidth(i)/1e6) << std::endl; std::cout << boost::format("Actual RX antenna: %s...") % (s->usrp->get_rx_antenna(i)) << std::endl; } } for (i=0;i<openair0_cfg[0].tx_num_channels;i++) { if (i<openair0_cfg[0].tx_num_channels) { printf("TX Channel %d\n",i); std::cout << std::endl<<boost::format("Actual TX sample rate: %fMSps...") % (s->usrp->get_tx_rate(i)/1e6) << std::endl; std::cout << boost::format("Actual TX frequency: %fGHz...") % (s->usrp->get_tx_freq(i)/1e9) << std::endl; std::cout << boost::format("Actual TX gain: %f...") % (s->usrp->get_tx_gain(i)) << std::endl; std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl; std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl; } } std::cout << boost::format("Device timestamp: %f...") % (s->usrp->get_time_now().get_real_secs()) << std::endl; device->priv = s; device->trx_start_func = trx_usrp_start; device->trx_end_func = trx_usrp_end; device->trx_read_func = trx_usrp_read; device->trx_write_func = trx_usrp_write; s->sample_rate = openair0_cfg[0].sample_rate; // TODO: // init tx_forward_nsamps based usrp_time_offset ex if(is_equal(s->sample_rate, (double)30.72e6)) s->tx_forward_nsamps = 176; if(is_equal(s->sample_rate, (double)15.36e6)) s->tx_forward_nsamps = 90; if(is_equal(s->sample_rate, (double)7.68e6)) s->tx_forward_nsamps = 50; return 0; }