diff options
author | Martin Braun <martin.braun@ettus.com> | 2020-03-06 15:06:06 -0800 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2020-03-12 07:35:15 -0500 |
commit | 32c0b067e81ce8b8423ca517a85b5d44012853e9 (patch) | |
tree | c106e0f710683429e3e270405307a487f43d6af7 /host/utils | |
parent | 910d95af2f7df9f52bcfed3fc08c5db6b3b39fd0 (diff) | |
download | uhd-32c0b067e81ce8b8423ca517a85b5d44012853e9.tar.gz uhd-32c0b067e81ce8b8423ca517a85b5d44012853e9.tar.bz2 uhd-32c0b067e81ce8b8423ca517a85b5d44012853e9.zip |
utils: cal: Replace property tree accesses with other API calls
The cal utils read the property tree to identify the daughterboard
information (serial, type, etc.). The paths for properties have changed
in UHD 4.0, causing these utilities to fail.
Instead of conditionally parsing the property tree, this commit changes
the utilities such that dictionaries are pulled out of the multi_usrp
object, which work regardless of the device type.
Diffstat (limited to 'host/utils')
-rw-r--r-- | host/utils/usrp_cal_utils.hpp | 78 |
1 files changed, 35 insertions, 43 deletions
diff --git a/host/utils/usrp_cal_utils.hpp b/host/utils/usrp_cal_utils.hpp index fee45ccdc..61dd0fbdd 100644 --- a/host/utils/usrp_cal_utils.hpp +++ b/host/utils/usrp_cal_utils.hpp @@ -46,12 +46,11 @@ static constexpr size_t MAX_NUM_TX_ERRORS = 10; **********************************************************************/ static inline void set_optimum_defaults(uhd::usrp::multi_usrp::sptr usrp) { - auto tree = usrp->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(); + constexpr size_t chan = 0; + const auto rx_info = usrp->get_usrp_rx_info(chan); + const auto tx_info = usrp->get_usrp_tx_info(chan); - const uhd::fs_path mb_path = "/mboards/0"; - const std::string mb_name = tree->access<std::string>(mb_path / "name").get(); + const std::string mb_name = rx_info["mboard_id"]; if (mb_name.find("USRP2") != std::string::npos or mb_name.find("N200") != std::string::npos or mb_name.find("N210") != std::string::npos @@ -64,56 +63,64 @@ static inline void set_optimum_defaults(uhd::usrp::multi_usrp::sptr usrp) usrp->set_tx_rate(4e6); usrp->set_rx_rate(4e6); } else { - throw std::runtime_error("self-calibration is not supported for this device"); + throw std::runtime_error( + std::string("self-calibration is not supported for this device: ") + mb_name); } - 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(); + const std::string tx_name = tx_info["tx_subdev_name"]; if (tx_name.find("WBX") == std::string::npos and tx_name.find("SBX") == std::string::npos and tx_name.find("CBX") == std::string::npos and tx_name.find("RFX") == std::string::npos and tx_name.find("UBX") == std::string::npos and tx_name.find("Rhodium") == std::string::npos) { - throw std::runtime_error("self-calibration is not supported for this TX dboard"); + throw std::runtime_error( + std::string("self-calibration is not supported for this TX dboard :") + + tx_name); } usrp->set_tx_gain(0); - 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(); + const std::string rx_name = rx_info["rx_subdev_name"]; if (rx_name.find("WBX") == std::string::npos and rx_name.find("SBX") == std::string::npos and rx_name.find("CBX") == std::string::npos and rx_name.find("RFX") == std::string::npos and rx_name.find("UBX") == std::string::npos and rx_name.find("Rhodium") == std::string::npos) { - throw std::runtime_error("self-calibration is not supported for this RX dboard"); + throw std::runtime_error( + std::string("self-calibration is not supported for this RX dboard :") + + rx_name); } usrp->set_rx_gain(0); } /*********************************************************************** + * Retrieve d'board serial + **********************************************************************/ +static std::string get_serial(uhd::usrp::multi_usrp::sptr usrp, const std::string& tx_rx) +{ + const size_t chan = 0; + auto usrp_info = (tx_rx == "tx") ? usrp->get_usrp_tx_info(chan) + : usrp->get_usrp_rx_info(chan); + const std::string serial_key = tx_rx + "_serial"; + if (!usrp_info.has_key(serial_key)) { + throw uhd::runtime_error("Cannot determine daughterboard serial!"); + } + + return usrp_info[serial_key]; +} + +/*********************************************************************** * 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_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()) + if (get_serial(usrp, "rx").empty()) { + std::string error_string = + "This dboard has no serial!\n\nPlease see the Calibration " + "documentation for details on how to fix this."; throw std::runtime_error(error_string); + } } /*********************************************************************** @@ -166,21 +173,6 @@ static inline void write_samples_to_file( /*********************************************************************** - * 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_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; -} - -/*********************************************************************** * Store data to file **********************************************************************/ static void store_results(const std::vector<result_t>& results, |