aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/multi_usrp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/multi_usrp.cpp')
-rw-r--r--host/lib/usrp/multi_usrp.cpp108
1 files changed, 64 insertions, 44 deletions
diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp
index ac0f52255..0910ad59d 100644
--- a/host/lib/usrp/multi_usrp.cpp
+++ b/host/lib/usrp/multi_usrp.cpp
@@ -17,7 +17,7 @@
#include <uhd/property_tree.hpp>
#include <uhd/usrp/multi_usrp.hpp>
-#include <uhd/utils/msg.hpp>
+
#include <uhd/exception.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/math.hpp>
@@ -30,7 +30,6 @@
#include "legacy_compat.hpp"
#include <boost/assign/list_of.hpp>
#include <boost/thread.hpp>
-#include <boost/foreach.hpp>
#include <boost/format.hpp>
#include <boost/algorithm/string.hpp>
#include <algorithm>
@@ -66,7 +65,7 @@ static void do_samp_rate_warning_message(
){
static const double max_allowed_error = 1.0; //Sps
if (std::abs(target_rate - actual_rate) > max_allowed_error){
- UHD_MSG(warning) << boost::format(
+ UHD_LOGGER_WARNING("MULTI_USRP") << boost::format(
"The hardware does not support the requested %s sample rate:\n"
"Target sample rate: %f MSps\n"
"Actual sample rate: %f MSps\n"
@@ -97,7 +96,7 @@ static void do_samp_rate_warning_message(
if(requested_freq_success and target_freq_success and rf_lo_tune_success
and dsp_tune_success) {
- UHD_MSG(status) << boost::format(
+ UHD_LOGGER_INFO("MULTI_USRP") << boost::format(
"Successfully tuned to %f MHz\n\n")
% (actual_freq / 1e6);
} else {
@@ -120,7 +119,7 @@ static void do_samp_rate_warning_message(
results_string += rf_lo_message.str();
- UHD_MSG(status) << results_string;
+ UHD_LOGGER_INFO("MULTI_USRP") << results_string;
return;
}
@@ -174,7 +173,7 @@ static void do_samp_rate_warning_message(
results_string += failure_message.str();
}
- UHD_MSG(warning) << results_string << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << results_string ;
}
}*/
@@ -190,7 +189,7 @@ static meta_range_t make_overall_tune_range(
const double bw
){
meta_range_t range;
- BOOST_FOREACH(const range_t &sub_range, fe_range){
+ for(const range_t &sub_range: fe_range){
range.push_back(range_t(
sub_range.start() + std::max(dsp_range.start(), -bw/2),
sub_range.stop() + std::min(dsp_range.stop(), bw/2),
@@ -262,7 +261,8 @@ static tune_result_t tune_xx_subdev_and_dsp(
* tune_request. This lo_offset is based on the requirements of the FE, and
* does not reflect a user-requested lo_offset, which is handled later. */
double lo_offset = 0.0;
- if (rf_fe_subtree->access<bool>("use_lo_offset").get()){
+ if (rf_fe_subtree->exists("use_lo_offset") and
+ rf_fe_subtree->access<bool>("use_lo_offset").get()){
// If the frontend has lo_offset value and range properties, trust it
// for lo_offset
if (rf_fe_subtree->exists("lo_offset/value")) {
@@ -459,7 +459,7 @@ public:
if (_tree->exists(mb_root(mboard) / "auto_tick_rate")
and _tree->access<bool>(mb_root(mboard) / "auto_tick_rate").get()) {
_tree->access<bool>(mb_root(mboard) / "auto_tick_rate").set(false);
- UHD_MSG(status) << "Setting master clock rate selection to 'manual'." << std::endl;
+ UHD_LOGGER_INFO("MULTI_USRP") << "Setting master clock rate selection to 'manual'.";
}
_tree->access<double>(mb_root(mboard) / "tick_rate").set(rate);
return;
@@ -557,7 +557,7 @@ public:
}
void set_time_unknown_pps(const time_spec_t &time_spec){
- UHD_MSG(status) << " 1) catch time transition at pps edge" << std::endl;
+ UHD_LOGGER_INFO("MULTI_USRP") << " 1) catch time transition at pps edge";
boost::system_time end_time = boost::get_system_time() + boost::posix_time::milliseconds(1100);
time_spec_t time_start_last_pps = get_time_last_pps();
while (time_start_last_pps == get_time_last_pps())
@@ -573,7 +573,7 @@ public:
boost::this_thread::sleep(boost::posix_time::milliseconds(1));
}
- UHD_MSG(status) << " 2) set times next pps (synchronously)" << std::endl;
+ UHD_LOGGER_INFO("MULTI_USRP") << " 2) set times next pps (synchronously)";
set_time_next_pps(time_spec, ALL_MBOARDS);
boost::this_thread::sleep(boost::posix_time::seconds(1));
@@ -582,7 +582,7 @@ public:
time_spec_t time_0 = this->get_time_now(0);
time_spec_t time_i = this->get_time_now(m);
if (time_i < time_0 or (time_i - time_0) > time_spec_t(0.01)){ //10 ms: greater than RTT but not too big
- UHD_MSG(warning) << boost::format(
+ UHD_LOGGER_WARNING("MULTI_USRP") << boost::format(
"Detected time deviation between board %d and board 0.\n"
"Board 0 time is %f seconds.\n"
"Board %d time is %f seconds.\n"
@@ -797,7 +797,7 @@ public:
{
throw uhd::index_error(str(boost::format("multi_usrp::get_rx_subdev_spec(%u) failed to make default spec - %s") % mboard % e.what()));
}
- UHD_MSG(status) << "Selecting default RX front end spec: " << spec.to_pp_string() << std::endl;
+ UHD_LOGGER_INFO("MULTI_USRP") << "Selecting default RX front end spec: " << spec.to_pp_string();
}
return spec;
}
@@ -873,7 +873,7 @@ public:
std::vector<std::string> get_rx_lo_names(size_t chan = 0){
std::vector<std::string> lo_names;
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- BOOST_FOREACH(const std::string &name, _tree->list(rx_rf_fe_root(chan) / "los")) {
+ for(const std::string &name: _tree->list(rx_rf_fe_root(chan) / "los")) {
lo_names.push_back(name);
}
}
@@ -887,7 +887,7 @@ public:
//Special value ALL_LOS support atomically sets the source for all LOs
_tree->access<std::string>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "value").set(src);
} else {
- BOOST_FOREACH(const std::string &n, _tree->list(rx_rf_fe_root(chan) / "los")) {
+ for(const std::string &n: _tree->list(rx_rf_fe_root(chan) / "los")) {
this->set_rx_lo_source(src, n, chan);
}
}
@@ -950,7 +950,7 @@ public:
//Special value ALL_LOS support atomically sets the source for all LOs
_tree->access<bool>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "export").set(enabled);
} else {
- BOOST_FOREACH(const std::string &n, _tree->list(rx_rf_fe_root(chan) / "los")) {
+ for(const std::string &n: _tree->list(rx_rf_fe_root(chan) / "los")) {
this->set_rx_lo_export_enabled(enabled, n, chan);
}
}
@@ -1041,7 +1041,7 @@ public:
if (_tree->exists(rx_rf_fe_root(chan) / "gain" / "agc")) {
bool agc = _tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable").get();
if(agc) {
- UHD_MSG(warning) << "AGC enabled for this channel. Setting will be ignored." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "AGC enabled for this channel. Setting will be ignored." ;
}
}
} else {
@@ -1049,7 +1049,7 @@ public:
if (_tree->exists(rx_rf_fe_root(c) / "gain" / "agc")) {
bool agc = _tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable").get();
if(agc) {
- UHD_MSG(warning) << "AGC enabled for this channel. Setting will be ignored." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "AGC enabled for this channel. Setting will be ignored." ;
}
}
}
@@ -1079,7 +1079,7 @@ public:
if (_tree->exists(rx_rf_fe_root(chan) / "gain" / "agc" / "enable")) {
_tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable").set(enable);
} else {
- UHD_MSG(warning) << "AGC is not available on this device." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "AGC is not available on this device." ;
}
return;
}
@@ -1157,7 +1157,11 @@ public:
}
std::vector<std::string> get_rx_sensor_names(size_t chan){
- return _tree->list(rx_rf_fe_root(chan) / "sensors");
+ std::vector<std::string> sensor_names;
+ if (_tree->exists(rx_rf_fe_root(chan) / "sensors")) {
+ sensor_names = _tree->list(rx_rf_fe_root(chan) / "sensors");
+ }
+ return sensor_names;
}
void set_rx_dc_offset(const bool enb, size_t chan){
@@ -1168,7 +1172,7 @@ public:
/*For B2xx devices the dc-offset correction is implemented in the rf front-end*/
_tree->access<bool>(rx_rf_fe_root(chan) / "dc_offset" / "enable").set(enb);
} else {
- UHD_MSG(warning) << "Setting DC offset compensation is not possible on this device." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "Setting DC offset compensation is not possible on this device." ;
}
return;
}
@@ -1182,7 +1186,7 @@ public:
if (_tree->exists(rx_fe_root(chan) / "dc_offset" / "value")) {
_tree->access<std::complex<double> >(rx_fe_root(chan) / "dc_offset" / "value").set(offset);
} else {
- UHD_MSG(warning) << "Setting DC offset is not possible on this device." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "Setting DC offset is not possible on this device." ;
}
return;
}
@@ -1196,7 +1200,7 @@ public:
if (_tree->exists(rx_rf_fe_root(chan) / "iq_balance" / "enable")) {
_tree->access<bool>(rx_rf_fe_root(chan) / "iq_balance" / "enable").set(enb);
} else {
- UHD_MSG(warning) << "Setting IQ imbalance compensation is not possible on this device." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "Setting IQ imbalance compensation is not possible on this device." ;
}
return;
}
@@ -1210,7 +1214,7 @@ public:
if (_tree->exists(rx_fe_root(chan) / "iq_balance" / "value")) {
_tree->access<std::complex<double> >(rx_fe_root(chan) / "iq_balance" / "value").set(offset);
} else {
- UHD_MSG(warning) << "Setting IQ balance is not possible on this device." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "Setting IQ balance is not possible on this device." ;
}
return;
}
@@ -1337,7 +1341,7 @@ public:
{
throw uhd::index_error(str(boost::format("multi_usrp::get_tx_subdev_spec(%u) failed to make default spec - %s") % mboard % e.what()));
}
- UHD_MSG(status) << "Selecting default TX front end spec: " << spec.to_pp_string() << std::endl;
+ UHD_LOGGER_INFO("MULTI_USRP") << "Selecting default TX front end spec: " << spec.to_pp_string();
}
return spec;
}
@@ -1497,7 +1501,11 @@ public:
}
std::vector<std::string> get_tx_sensor_names(size_t chan){
- return _tree->list(tx_rf_fe_root(chan) / "sensors");
+ std::vector<std::string> sensor_names;
+ if (_tree->exists(rx_rf_fe_root(chan) / "sensors")) {
+ sensor_names = _tree->list(tx_rf_fe_root(chan) / "sensors");
+ }
+ return sensor_names;
}
void set_tx_dc_offset(const std::complex<double> &offset, size_t chan){
@@ -1505,7 +1513,7 @@ public:
if (_tree->exists(tx_fe_root(chan) / "dc_offset" / "value")) {
_tree->access<std::complex<double> >(tx_fe_root(chan) / "dc_offset" / "value").set(offset);
} else {
- UHD_MSG(warning) << "Setting DC offset is not possible on this device." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "Setting DC offset is not possible on this device." ;
}
return;
}
@@ -1519,7 +1527,7 @@ public:
if (_tree->exists(tx_fe_root(chan) / "iq_balance" / "value")) {
_tree->access<std::complex<double> >(tx_fe_root(chan) / "iq_balance" / "value").set(offset);
} else {
- UHD_MSG(warning) << "Setting IQ balance is not possible on this device." << std::endl;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "Setting IQ balance is not possible on this device." ;
}
return;
}
@@ -1536,12 +1544,12 @@ public:
std::vector<std::string> banks;
if (_tree->exists(mb_root(mboard) / "gpio"))
{
- BOOST_FOREACH(const std::string &name, _tree->list(mb_root(mboard) / "gpio"))
+ for(const std::string &name: _tree->list(mb_root(mboard) / "gpio"))
{
banks.push_back(name);
}
}
- BOOST_FOREACH(const std::string &name, _tree->list(mb_root(mboard) / "dboards"))
+ for(const std::string &name: _tree->list(mb_root(mboard) / "dboards"))
{
banks.push_back("RX"+name);
banks.push_back("TX"+name);
@@ -1755,8 +1763,12 @@ private:
{
try
{
- const std::string name = _tree->list("/mboards").at(mboard);
- return "/mboards/" + name;
+ const std::string tree_path = "/mboards/" + boost::lexical_cast<std::string>(mboard);
+ if (_tree->exists(tree_path)) {
+ return tree_path;
+ } else {
+ throw uhd::index_error(str(boost::format("multi_usrp::mb_root(%u) - path not found") % mboard));
+ }
}
catch(const std::exception &e)
{
@@ -1779,8 +1791,12 @@ private:
try
{
- const std::string name = _tree->list(mb_root(mcp.mboard) / "rx_dsps").at(mcp.chan);
- return mb_root(mcp.mboard) / "rx_dsps" / name;
+ const std::string tree_path = mb_root(mcp.mboard) / "rx_dsps" / boost::lexical_cast<std::string>(mcp.chan);
+ if (_tree->exists(tree_path)) {
+ return tree_path;
+ } else {
+ throw uhd::index_error(str(boost::format("multi_usrp::rx_dsp_root(%u) - mcp(%u) - path not found") % chan % mcp.chan));
+ }
}
catch(const std::exception &e)
{
@@ -1802,8 +1818,12 @@ private:
}
try
{
- const std::string name = _tree->list(mb_root(mcp.mboard) / "tx_dsps").at(mcp.chan);
- return mb_root(mcp.mboard) / "tx_dsps" / name;
+ const std::string tree_path = mb_root(mcp.mboard) / "tx_dsps" / boost::lexical_cast<std::string>(mcp.chan);
+ if (_tree->exists(tree_path)) {
+ return tree_path;
+ } else {
+ throw uhd::index_error(str(boost::format("multi_usrp::tx_dsp_root(%u) - mcp(%u) - path not found") % chan % mcp.chan));
+ }
}
catch(const std::exception &e)
{
@@ -1877,10 +1897,10 @@ private:
mboard_chan_pair mcp = rx_chan_to_mcp(chan);
const subdev_spec_pair_t spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan);
gain_group::sptr gg = gain_group::make();
- BOOST_FOREACH(const std::string &name, _tree->list(mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains")){
+ for(const std::string &name: _tree->list(mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains")){
gg->register_fcns("ADC-"+name, make_gain_fcns_from_subtree(_tree->subtree(mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains" / name)), 0 /* low prio */);
}
- BOOST_FOREACH(const std::string &name, _tree->list(rx_rf_fe_root(chan) / "gains")){
+ for(const std::string &name: _tree->list(rx_rf_fe_root(chan) / "gains")){
gg->register_fcns(name, make_gain_fcns_from_subtree(_tree->subtree(rx_rf_fe_root(chan) / "gains" / name)), 1 /* high prio */);
}
return gg;
@@ -1890,10 +1910,10 @@ private:
mboard_chan_pair mcp = tx_chan_to_mcp(chan);
const subdev_spec_pair_t spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan);
gain_group::sptr gg = gain_group::make();
- BOOST_FOREACH(const std::string &name, _tree->list(mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains")){
+ for(const std::string &name: _tree->list(mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains")){
gg->register_fcns("DAC-"+name, make_gain_fcns_from_subtree(_tree->subtree(mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains" / name)), 1 /* high prio */);
}
- BOOST_FOREACH(const std::string &name, _tree->list(tx_rf_fe_root(chan) / "gains")){
+ for(const std::string &name: _tree->list(tx_rf_fe_root(chan) / "gains")){
gg->register_fcns(name, make_gain_fcns_from_subtree(_tree->subtree(tx_rf_fe_root(chan) / "gains" / name)), 0 /* low prio */);
}
return gg;
@@ -1907,7 +1927,7 @@ private:
size_t bytes_per_sample = convert::get_bytes_per_item(args.otw_format.empty() ? "sc16" : args.otw_format);
double max_link_rate = 0;
double sum_rate = 0;
- BOOST_FOREACH(const size_t chan, args.channels) {
+ for(const size_t chan: args.channels) {
mboard_chan_pair mcp = is_tx ? tx_chan_to_mcp(chan) : rx_chan_to_mcp(chan);
if (_tree->exists(mb_root(mcp.mboard) / "link_max_rate")) {
max_link_rate = std::max(
@@ -1919,10 +1939,10 @@ private:
}
sum_rate /= get_num_mboards();
if (max_link_rate > 0 and (max_link_rate / bytes_per_sample) < sum_rate) {
- UHD_MSG(warning) << boost::format(
+ UHD_LOGGER_WARNING("MULTI_USRP") << boost::format(
"The total sum of rates (%f MSps on %u channels) exceeds the maximum capacity of the connection.\n"
"This can cause %s."
- ) % (sum_rate/1e6) % args.channels.size() % (is_tx ? "underruns (U)" : "overflows (O)") << std::endl;
+ ) % (sum_rate/1e6) % args.channels.size() % (is_tx ? "underruns (U)" : "overflows (O)") ;
link_rate_is_ok = false;
}
@@ -1938,6 +1958,6 @@ multi_usrp::~multi_usrp(void){
* The Make Function
**********************************************************************/
multi_usrp::sptr multi_usrp::make(const device_addr_t &dev_addr){
- UHD_LOG << "multi_usrp::make with args " << dev_addr.to_pp_string() << std::endl;
+ UHD_LOGGER_TRACE("MULTI_USRP") << "multi_usrp::make with args " << dev_addr.to_pp_string() ;
return sptr(new multi_usrp_impl(dev_addr));
}