void get_rx_parameters(uhd::usrp::multi_usrp::sptr usrp, size_t mboard , std::ostream & os) { using namespace std; namespace radio = uhd::usrp; size_t nchan = 0; // Get sub device specification os << std::endl << "********** RX Sub Device ***********" << std::endl; os << std::endl << "-----> Get Rx Subdevice" << std::endl; radio::subdev_spec_t rx_subdev = usrp->get_rx_subdev_spec(mboard); os << "RX Subdevice Specification:" << endl; os << rx_subdev.to_pp_string() << endl; os << std::endl << "-----> Get number of RX channels" << std::endl; size_t num_rx = usrp->get_rx_num_channels(); os << "Number of RX channels:" << endl; os << num_rx << endl; os << std::endl << "-----> Get RX Subdevice Name" << std::endl; string rx_name = usrp->get_rx_subdev_name(nchan); os << "RX Subdevice Name:" << endl; os << rx_name << endl; os << std::endl << "********** RX Sample Rate ***********" << std::endl; os << std::endl << "-----> Get RX Rate" << std::endl; double rx_rate = usrp->get_rx_rate(nchan); os << "RX Rate:" << endl; os << rx_rate << endl; os << std::endl << "-----> Get RX Rate List" << std::endl; uhd::meta_range_t rx_rates = usrp->get_rx_rates(nchan); os << "RX Rate List:" << endl; os << "Start: " << rx_rates.start() << " Stop: " << rx_rates.stop() << " Step: " << rx_rates.step() << endl; os << rx_rates.to_pp_string() << endl; // RX FREQUENCIES os << std::endl << "********** RX Frequencies ***********" << std::endl; os << std::endl << "-----> Get RX Center Frequency" << std::endl; double rx_freq = usrp->get_rx_freq(nchan); os << "RX Freq:" << endl; os << rx_freq << endl; os << std::endl << "-----> Get RX Center Frequency Range" << std::endl; uhd::freq_range_t rx_freq_range = usrp->get_rx_freq_range(nchan); os << "RX Frequency Range:" << endl; os << "Start: " << rx_freq_range.start() << " Stop: " << rx_freq_range.stop() << " Step: " << rx_freq_range.step() << endl; os << rx_freq_range.to_pp_string() << endl; // RX Front end frequencies os << std::endl << "-----> Get RX RF Front End Center Frequency Range" << std::endl; try { os << "RX Front End Frequency Range:" << endl; uhd::freq_range_t rx_fe_freq_range = usrp->get_fe_rx_freq_range(nchan); os << "Start: " << rx_fe_freq_range.start() << " Stop: " << rx_fe_freq_range.stop() << " Step: " << rx_fe_freq_range.step() << endl; os << rx_fe_freq_range.to_pp_string() << endl; } catch (uhd::runtime_error &e) { os << " Exception occurred : " << e.code() << endl; } // RX GAIN os << std::endl << "********** RX Gain ***********" << std::endl; // Total combined gain os << endl << "-----> Get RX Total Gain" << endl; os << "RX Total Gain: " ; try { double rx_total_gain = usrp->get_rx_gain(nchan); os << rx_total_gain << endl; } catch(uhd::runtime_error &e) { os << "Exception code: " << e.code() << endl; } // List of all gain elements os << std::endl << "-----> Get RX gain names" << std::endl; std::vector<std::string> rx_gain_names = usrp->get_rx_gain_names(nchan); os << "Rx Gain Names: " << std::endl; for (int index =0; index < rx_gain_names.size(); index++) { // Name os << "\t" << rx_gain_names[index] << endl; } for (int index =0; index < rx_gain_names.size(); index++) { // Name os << "\t" << "Name: " << rx_gain_names[index] << " Value: "; // Value try { double element_gain = usrp->get_rx_gain(rx_gain_names[index], nchan); os << element_gain << endl; } catch(uhd::runtime_error &e) { os << "Exception code while getting value: " << e.code() << endl; } } // Gain ranges for each of the gain elements os << std::endl << "-----> Get RX element gain ranges" << std::endl; for (int index =0; index < rx_gain_names.size(); index++) { // Name os << "\t" << "Name: " << rx_gain_names[index] << " Value: "; // Value try { uhd::gain_range_t element_gain_range = usrp->get_rx_gain_range(rx_gain_names[index], nchan); os << "Start: " << element_gain_range.start() << " End: " << element_gain_range.stop() << " Step: " << element_gain_range.step() << endl; } catch(uhd::runtime_error &e) { os << "Exception code while getting value: " << e.code() << endl; } } // Total Gain range try { os << endl << "-----> Get RX Total Gain Range" << endl; uhd::gain_range_t rx_total_gain_range = usrp->get_rx_gain_range(nchan); os << "RX Total Gain Range: " ; os << "Start: " << rx_total_gain_range.start() << " End: " << rx_total_gain_range.stop() << " Step: " << rx_total_gain_range.step() << endl; } catch(uhd::runtime_error &e) { os << "Exception code: " << e.code() <<endl; } // ANTENNA FUNCTIONS os << std::endl << "********** RX ANTENNA ***********" << std::endl; // Current Rx Antenna os << std::endl << "-----> Get RX Antenna" << std::endl; string rx_antenna = usrp->get_rx_antenna(nchan); os << "RX Antenna: " ; os << rx_antenna << endl; // RX Antenna choices os << std::endl << "-----> Get Rx Antenna List" << std::endl; std::vector<std::string> rx_antennas = usrp->get_rx_antennas(nchan); os << "RX Antennas : " << std::endl; for (int index =0; index < rx_antennas.size(); index++) os << "\t" << rx_antennas[index] << std::endl; // RX BANDWIDTH FUNCTIONS os << std::endl << "********** RX BANDWIDTH ***********" << std::endl; // Current RX Bandwidth os << endl << "-----> Get RX Bandwidth" << endl; try { os << "RX Bandwidth " ; double rx_bandwidth = usrp->get_rx_bandwidth(nchan); os << rx_bandwidth << endl; } catch (uhd::runtime_error &e) { os << "Exception occured " << e.code() << endl; } // RX Bandwidth Range os << endl << "-----> Get RX Bandwidth Range" << endl; try { os << "RX Bandwidth Range: " ; uhd::gain_range_t rx_bandwidth_range = usrp->get_rx_bandwidth_range(nchan); os << "Start: " << rx_bandwidth_range .start() << " End: " << rx_bandwidth_range .stop() << " Step: " << rx_bandwidth_range .step() << endl; } catch(uhd::runtime_error &e) { os << "Exception code: " << e.code() <<endl; } // RX DBOARD INTERFACE OBJECT os << std::endl << "********** RX DBOARD INTERFACE ***********" << std::endl; // RX Dboard Interface os << endl << "-----> Get rx_dboard_iface()" << endl; try { os << "RX Dboard Interface " ; uhd::usrp::dboard_iface::sptr rx_dboard_iface = usrp->get_rx_dboard_iface(nchan); os << rx_dboard_iface << endl; } catch (uhd::runtime_error &e) { os << "Exception occured " << e.code() << endl; } // RX _SENSORS os << std::endl << "********** RX Sensors ***********" << std::endl; // List of all available sensors os << std::endl << "-----> Get RX Sensors Name" << std::endl; std::vector<std::string> rx_sensor_names = usrp->get_rx_sensor_names(nchan); os << "Sensor Names: " << std::endl; for (int index =0; index < rx_sensor_names.size(); index++) { // Name os << "\t" << rx_sensor_names[index] << ": "; // Value try { uhd::sensor_value_t rx_sensor_value = usrp->get_rx_sensor(rx_sensor_names[index], nchan); os << rx_sensor_value.to_pp_string()<< std::endl; } catch(uhd::runtime_error &e) { os << "Exception occured " << e.code() << endl; } } }
/*********************************************************************** * Retrieve d'board serial **********************************************************************/ static std::string get_serial( uhd::usrp::multi_usrp::sptr usrp, const std::string &tx_rx) { 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 db_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/" + tx_rx + "_eeprom"; const uhd::usrp::dboard_eeprom_t db_eeprom = tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get(); return db_eeprom.serial; }
/*********************************************************************** * Check for empty serial **********************************************************************/ void check_for_empty_serial(uhd::usrp::multi_usrp::sptr usrp) { // 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(); //extract eeprom uhd::property_tree::sptr tree = usrp->get_device()->get_tree(); // This only works with transceiver boards, so we can always check rx side const uhd::fs_path db_path = "/mboards/0/dboards/" + subdev_spec[0].db_name + "/rx_eeprom"; const uhd::usrp::dboard_eeprom_t db_eeprom = tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get(); std::string error_string = "This dboard has no serial!\n\nPlease see the Calibration documentation for details on how to fix this."; if (db_eeprom.serial.empty()) throw std::runtime_error(error_string); }
/*********************************************************************** * 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"); } }