int uhd_device::set_rates(double tx_rate, double rx_rate) { double offset_limit = 1.0; double tx_offset, rx_offset; // B2XX is the only device where we set FPGA clocking if (dev_type == B2XX) { if (set_master_clk(B2XX_CLK_RT) < 0) return -1; } // Set sample rates try { usrp_dev->set_tx_rate(tx_rate); usrp_dev->set_rx_rate(rx_rate); } catch (const std::exception &ex) { LOG(ALERT) << "UHD rate setting failed"; LOG(ALERT) << ex.what(); return -1; } this->tx_rate = usrp_dev->get_tx_rate(); this->rx_rate = usrp_dev->get_rx_rate(); tx_offset = fabs(this->tx_rate - tx_rate); rx_offset = fabs(this->rx_rate - rx_rate); if ((tx_offset > offset_limit) || (rx_offset > offset_limit)) { LOG(ALERT) << "Actual sample rate differs from desired rate"; LOG(ALERT) << "Tx/Rx (" << this->tx_rate << "/" << this->rx_rate << ")"; return -1; } return 0; }
int setup_device(uhd::usrp::multi_usrp::sptr usrp, double rx_gain, double tx_gain, double freq, double rate){ //create a usrp device std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl; usrp->set_rx_rate(rate); usrp->set_rx_freq(freq); usrp->set_rx_gain(rx_gain); usrp->set_tx_rate(rate); usrp->set_tx_freq(freq); usrp->set_tx_gain(tx_gain); }
void init_usrp() { cout << "Initial USRP" << endl; usrp = uhd::usrp::multi_usrp::make(usrp_ip); usrp->set_rx_rate(rate); usrp->set_tx_rate(rate); usrp->set_rx_freq(freq); usrp->set_tx_freq(freq); usrp->set_rx_gain(gain); uhd::meta_range_t rx_range = usrp->get_rx_gain_range(); }
double uhd_device::set_rates(double rate) { double actual_rt, actual_clk_rt; #if !defined(MULTICHAN) & !defined(RESAMPLE) // Make sure we can set the master clock rate on this device actual_clk_rt = usrp_dev->get_master_clock_rate(); if (actual_clk_rt > U1_DEFAULT_CLK_RT) { LOG(ALERT) << "Cannot set clock rate on this device"; LOG(ALERT) << "Please compile with host resampling support"; return -1.0; } // Set master clock rate usrp_dev->set_master_clock_rate(master_clk_rt); actual_clk_rt = usrp_dev->get_master_clock_rate(); if (actual_clk_rt != master_clk_rt) { LOG(ALERT) << "Failed to set master clock rate"; LOG(ALERT) << "Actual clock rate " << actual_clk_rt; return -1.0; } #endif // Set sample rates usrp_dev->set_tx_rate(rate); usrp_dev->set_rx_rate(rate); actual_rt = usrp_dev->get_tx_rate(); if (actual_rt != rate) { LOG(ALERT) << "Actual sample rate differs from desired rate"; LOG(ALERT) << actual_rt << "Hz"; return -1.0; } if (usrp_dev->get_rx_rate() != actual_rt) { LOG(ALERT) << "Transmit and receive sample rates do not match"; return -1.0; } return actual_rt; }
int setupUSRP( uhd::usrp::multi_usrp::sptr& usrp, const float center_freq, const float sample_rate, const int rx_gain, const char* dev_addr) { //Initialize the USRP to the specified address usrp = uhd::usrp::multi_usrp::make(string(dev_addr)); //Define the clock reference usrp->set_clock_source(__USRP_CLK_SRC); //Output some useful information cout << "Using the following USRP device: " << endl << usrp->get_pp_string() << endl; //Try setting the sample rate. If the rate we get is not the same as the //requested rate, we will return with a warning to ensure the user is aware //of the actual sample rate usrp->set_rx_rate( sample_rate ); if( usrp->get_rx_rate() != sample_rate ) { ios_base::fmtflags originalFlags = cout.flags(); cout.setf(ios_base::left,ios_base::floatfield); cout.precision(15); cout << "WARNING! Requested rate = " << sample_rate << endl << "WARNING! Actual rate = " << usrp->get_rx_rate() << endl; cout.setf(originalFlags); } //Try setting the center frequency. Like above, if we get a different //frequency than the one we're requesting, we will spit out a warning for the //user usrp->set_rx_freq( center_freq ); if( usrp->get_rx_freq() != center_freq ) { ios_base::fmtflags originalFlags = cout.flags(); cout.setf(ios_base::left,ios_base::floatfield); cout.precision(15); cout << "WARNING! Requested frequency = " << center_freq << endl << "WARNING! Actual frequency = " << usrp->get_rx_freq() << endl; cout.setf(originalFlags); } //Set the RX gain. There really shouldn't be any problems here, but the user //might request something silly like 50dB of gain when the module can't //accomodate. So we'll perform a similar check here. usrp->set_rx_gain( rx_gain ); if( usrp->get_rx_gain() != rx_gain ) { cout << "WARNING! Requested gain = " << rx_gain << endl << "WARNING! Actual gain = " << usrp->get_rx_gain() << endl; } //Ensure the LO locked vector<string> sensor_names; sensor_names = usrp->get_rx_sensor_names(0); if( find(sensor_names.begin(), sensor_names.end(), "lo_locked") != sensor_names.end() ) { uhd::sensor_value_t lo_locked = usrp->get_rx_sensor("lo_locked",0); cout << "Checking RX: " << endl << lo_locked.to_pp_string() << endl; UHD_ASSERT_THROW(lo_locked.to_bool()); //We should probably catch this } return 1; }
/*********************************************************************** * Set standard defaults for devices **********************************************************************/ static inline void set_optimum_defaults(uhd::usrp::multi_usrp::sptr usrp){ uhd::property_tree::sptr tree = usrp->get_device()->get_tree(); // Will work on 1st subdev, top-level must make sure it's the right one uhd::usrp::subdev_spec_t subdev_spec = usrp->get_rx_subdev_spec(); const uhd::fs_path mb_path = "/mboards/0"; const std::string mb_name = tree->access<std::string>(mb_path / "name").get(); if (mb_name.find("USRP2") != std::string::npos or mb_name.find("N200") != std::string::npos or mb_name.find("N210") != std::string::npos or mb_name.find("X300") != std::string::npos or mb_name.find("X310") != std::string::npos){ usrp->set_tx_rate(12.5e6); usrp->set_rx_rate(12.5e6); } else if (mb_name.find("B100") != std::string::npos){ usrp->set_tx_rate(4e6); usrp->set_rx_rate(4e6); } else if (mb_name.find("E100") != std::string::npos or mb_name.find("E110") != std::string::npos){ usrp->set_tx_rate(4e6); usrp->set_rx_rate(8e6); } else{ throw std::runtime_error("self-calibration is not supported for this hardware"); } const uhd::fs_path tx_fe_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/tx_frontends/0"; const std::string tx_name = tree->access<std::string>(tx_fe_path / "name").get(); if (tx_name.find("WBX") != std::string::npos){ usrp->set_tx_gain(0); } else if (tx_name.find("SBX") != std::string::npos){ usrp->set_tx_gain(0); } else if (tx_name.find("CBX") != std::string::npos){ usrp->set_tx_gain(0); } else if (tx_name.find("RFX") != std::string::npos){ usrp->set_tx_gain(0); } else{ throw std::runtime_error("self-calibration is not supported for this hardware"); } const uhd::fs_path rx_fe_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/rx_frontends/0"; const std::string rx_name = tree->access<std::string>(rx_fe_path / "name").get(); if (rx_name.find("WBX") != std::string::npos){ usrp->set_rx_gain(25); } else if (rx_name.find("SBX") != std::string::npos){ usrp->set_rx_gain(25); } else if (rx_name.find("CBX") != std::string::npos){ usrp->set_rx_gain(25); } else if (rx_name.find("RFX") != std::string::npos){ usrp->set_rx_gain(25); } else{ throw std::runtime_error("self-calibration is not supported for this hardware"); } }