aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/lib/usrp/multi_usrp_rfnoc.cpp292
1 files changed, 158 insertions, 134 deletions
diff --git a/host/lib/usrp/multi_usrp_rfnoc.cpp b/host/lib/usrp/multi_usrp_rfnoc.cpp
index 823f3547a..e535f7bc7 100644
--- a/host/lib/usrp/multi_usrp_rfnoc.cpp
+++ b/host/lib/usrp/multi_usrp_rfnoc.cpp
@@ -449,9 +449,11 @@ public:
const auto db_eeprom = rx_chain.radio->get_db_eeprom();
usrp_info["rx_serial"] =
- db_eeprom.count("rx_serial") ? bytes_to_str(db_eeprom.at("rx_serial")) : "";
+ db_eeprom.count("rx_serial") ? bytes_to_str(db_eeprom.at("rx_serial")) :
+ db_eeprom.count("serial") ? bytes_to_str(db_eeprom.at("serial")) :"";
usrp_info["rx_id"] =
- db_eeprom.count("rx_id") ? bytes_to_str(db_eeprom.at("rx_id")) : "";
+ db_eeprom.count("rx_id") ? bytes_to_str(db_eeprom.at("rx_id")) :
+ db_eeprom.count("pid") ? bytes_to_str(db_eeprom.at("pid")) : "";
const auto rx_power_ref_keys = rx_chain.radio->get_rx_power_ref_keys();
if (!rx_power_ref_keys.empty() && rx_power_ref_keys.size() == 2) {
@@ -479,9 +481,11 @@ public:
const auto db_eeprom = tx_chain.radio->get_db_eeprom();
usrp_info["tx_serial"] =
- db_eeprom.count("tx_serial") ? bytes_to_str(db_eeprom.at("tx_serial")) : "";
+ db_eeprom.count("tx_serial") ? bytes_to_str(db_eeprom.at("tx_serial")) :
+ db_eeprom.count("serial") ? bytes_to_str(db_eeprom.at("serial")) : "";
usrp_info["tx_id"] =
- db_eeprom.count("tx_id") ? bytes_to_str(db_eeprom.at("tx_id")) : "";
+ db_eeprom.count("tx_id") ? bytes_to_str(db_eeprom.at("tx_id")) :
+ db_eeprom.count("pid") ? bytes_to_str(db_eeprom.at("pid")) : "";
const auto tx_power_ref_keys = tx_chain.radio->get_tx_power_ref_keys();
if (!tx_power_ref_keys.empty() && tx_power_ref_keys.size() == 2) {
@@ -634,7 +638,7 @@ public:
throw uhd::key_error("Invalid mboard index!");
}
- meta_range_t get_master_clock_rate_range(const size_t mboard = 0)
+ meta_range_t get_master_clock_rate_range(const size_t mboard)
{
// We pick the first radio we can find on this mboard, and hope that all
// radios have the same range.
@@ -707,13 +711,13 @@ public:
return get_mbc(mboard)->get_timekeeper(0)->get_time_last_pps();
}
- void set_time_now(const time_spec_t& time_spec, size_t mboard)
+ void set_time_now(const time_spec_t& time_spec, size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_time_now, time_spec);
get_mbc(mboard)->get_timekeeper(0)->set_time_now(time_spec);
}
- void set_time_next_pps(const time_spec_t& time_spec, size_t mboard)
+ void set_time_next_pps(const time_spec_t& time_spec, size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_time_next_pps, time_spec);
get_mbc(mboard)->get_timekeeper(0)->set_time_next_pps(time_spec);
@@ -765,18 +769,24 @@ public:
return true;
}
- void set_command_time(const uhd::time_spec_t& time_spec, size_t mboard)
+ void set_command_time(const uhd::time_spec_t& time_spec, size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_command_time, time_spec);
// Set command time on all the blocks that are connected
for (auto& chain : _rx_chans) {
+ if (chain.second.radio->get_block_id().get_device_no() != mboard) {
+ continue;
+ }
chain.second.radio->set_command_time(time_spec, chain.second.block_chan);
if (chain.second.ddc) {
chain.second.ddc->set_command_time(time_spec, chain.second.block_chan);
}
}
for (auto& chain : _tx_chans) {
+ if (chain.second.radio->get_block_id().get_device_no() != mboard) {
+ continue;
+ }
chain.second.radio->set_command_time(time_spec, chain.second.block_chan);
if (chain.second.duc) {
chain.second.duc->set_command_time(time_spec, chain.second.block_chan);
@@ -784,7 +794,7 @@ public:
}
}
- void clear_command_time(size_t mboard)
+ void clear_command_time(size_t mboard = ALL_MBOARDS)
{
if (mboard == ALL_MBOARDS) {
for (size_t i = 0; i < get_num_mboards(); ++i) {
@@ -793,14 +803,20 @@ public:
return;
}
- // Set command time on all the blocks that are connected
+ // Clear command time on all the blocks that are connected
for (auto& chain : _rx_chans) {
+ if (chain.second.radio->get_block_id().get_device_no() != mboard) {
+ continue;
+ }
chain.second.radio->clear_command_time(chain.second.block_chan);
if (chain.second.ddc) {
chain.second.ddc->clear_command_time(chain.second.block_chan);
}
}
for (auto& chain : _tx_chans) {
+ if (chain.second.radio->get_block_id().get_device_no() != mboard) {
+ continue;
+ }
chain.second.radio->clear_command_time(chain.second.block_chan);
if (chain.second.duc) {
chain.second.duc->clear_command_time(chain.second.block_chan);
@@ -810,21 +826,16 @@ public:
void issue_stream_cmd(const stream_cmd_t& stream_cmd, size_t chan = ALL_CHANS)
{
- if (chan != ALL_CHANS) {
- auto& rx_chain = _get_rx_chan(chan);
- if (rx_chain.ddc) {
- rx_chain.ddc->issue_stream_cmd(stream_cmd, rx_chain.block_chan);
- } else {
- rx_chain.radio->issue_stream_cmd(stream_cmd, rx_chain.block_chan);
- }
- return;
- }
- for (size_t c = 0; c < get_rx_num_channels(); c++) {
- issue_stream_cmd(stream_cmd, c);
+ MUX_RX_API_CALL(issue_stream_cmd, stream_cmd);
+ auto& rx_chain = _get_rx_chan(chan);
+ if (rx_chain.ddc) {
+ rx_chain.ddc->issue_stream_cmd(stream_cmd, rx_chain.block_chan);
+ } else {
+ rx_chain.radio->issue_stream_cmd(stream_cmd, rx_chain.block_chan);
}
}
- void set_time_source(const std::string& source, const size_t mboard)
+ void set_time_source(const std::string& source, const size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_time_source, source);
get_mbc(mboard)->set_time_source(source);
@@ -840,7 +851,7 @@ public:
return get_mbc(mboard)->get_time_sources();
}
- void set_clock_source(const std::string& source, const size_t mboard)
+ void set_clock_source(const std::string& source, const size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_clock_source, source);
get_mbc(mboard)->set_clock_source(source);
@@ -858,13 +869,13 @@ public:
void set_sync_source(const std::string& clock_source,
const std::string& time_source,
- const size_t mboard)
+ const size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_sync_source, clock_source, time_source);
get_mbc(mboard)->set_sync_source(clock_source, time_source);
}
- void set_sync_source(const device_addr_t& sync_source, const size_t mboard)
+ void set_sync_source(const device_addr_t& sync_source, const size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_sync_source, sync_source);
get_mbc(mboard)->set_sync_source(sync_source);
@@ -880,13 +891,13 @@ public:
return get_mbc(mboard)->get_sync_sources();
}
- void set_clock_source_out(const bool enb, const size_t mboard)
+ void set_clock_source_out(const bool enb, const size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_clock_source_out, enb);
get_mbc(mboard)->set_clock_source_out(enb);
}
- void set_time_source_out(const bool enb, const size_t mboard)
+ void set_time_source_out(const bool enb, const size_t mboard = ALL_MBOARDS)
{
MUX_MB_API_CALL(set_time_source_out, enb);
get_mbc(mboard)->set_time_source_out(enb);
@@ -1019,7 +1030,7 @@ public:
}
void set_rx_subdev_spec(
- const uhd::usrp::subdev_spec_t& spec, size_t mboard)
+ const uhd::usrp::subdev_spec_t& spec, size_t mboard = ALL_MBOARDS)
{
// First, generate a vector of the RX channels that we need to register
auto new_rx_chans = [this, spec, mboard]() {
@@ -1058,7 +1069,7 @@ public:
}
}
- uhd::usrp::subdev_spec_t get_rx_subdev_spec(size_t mboard)
+ uhd::usrp::subdev_spec_t get_rx_subdev_spec(size_t mboard = 0)
{
uhd::usrp::subdev_spec_t result;
for (size_t rx_chan = 0; rx_chan < get_rx_num_channels(); rx_chan++) {
@@ -1079,13 +1090,13 @@ public:
return _rx_chans.size();
}
- std::string get_rx_subdev_name(size_t chan)
+ std::string get_rx_subdev_name(size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_fe_name(rx_chain.block_chan, uhd::RX_DIRECTION);
}
- void set_rx_rate(double rate, size_t chan)
+ void set_rx_rate(double rate, size_t chan = ALL_CHANS)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
MUX_RX_API_CALL(set_rx_rate, rate);
@@ -1115,7 +1126,7 @@ public:
"spp", narrow_cast<int>(spp), rx_chain.block_chan);
}
- double get_rx_rate(size_t chan)
+ double get_rx_rate(size_t chan = 0)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
auto& rx_chain = _get_rx_chan(chan);
@@ -1125,7 +1136,7 @@ public:
return rx_chain.radio->get_rate();
}
- meta_range_t get_rx_rates(size_t chan)
+ meta_range_t get_rx_rates(size_t chan = 0)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
auto rx_chain = _get_rx_chan(chan);
@@ -1135,7 +1146,7 @@ public:
return rx_chain.radio->get_rate_range();
}
- tune_result_t set_rx_freq(const tune_request_t& tune_request, size_t chan)
+ tune_result_t set_rx_freq(const tune_request_t& tune_request, size_t chan = 0)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
@@ -1185,7 +1196,7 @@ public:
tune_request);
}
- double get_rx_freq(size_t chan)
+ double get_rx_freq(size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
@@ -1195,11 +1206,10 @@ public:
const double actual_dsp_freq =
(rx_chain.ddc) ? rx_chain.ddc->get_freq(rx_chain.block_chan) : 0.0;
- // invert the sign on the dsp freq for transmit
return actual_rf_freq - actual_dsp_freq * RX_SIGN;
}
- freq_range_t get_rx_freq_range(size_t chan)
+ freq_range_t get_rx_freq_range(size_t chan = 0)
{
auto fe_freq_range = get_fe_rx_freq_range(chan);
@@ -1212,7 +1222,7 @@ public:
return dsp_freq_range;
}
- freq_range_t get_fe_rx_freq_range(size_t chan)
+ freq_range_t get_fe_rx_freq_range(size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_frequency_range(rx_chain.block_chan);
@@ -1221,113 +1231,117 @@ public:
/**************************************************************************
* LO controls
*************************************************************************/
- std::vector<std::string> get_rx_lo_names(size_t chan)
+ std::vector<std::string> get_rx_lo_names(size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_lo_names(rx_chain.block_chan);
}
- void set_rx_lo_source(const std::string& src, const std::string& name, size_t chan)
+ void set_rx_lo_source(const std::string& src, const std::string& name = ALL_LOS, size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_lo_source, src, name);
auto rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_lo_source(src, name, rx_chain.block_chan);
}
- const std::string get_rx_lo_source(const std::string& name, size_t chan)
+ const std::string get_rx_lo_source(const std::string& name = ALL_LOS, size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_lo_source(name, rx_chain.block_chan);
}
- std::vector<std::string> get_rx_lo_sources(const std::string& name, size_t chan)
+ std::vector<std::string> get_rx_lo_sources(const std::string& name = ALL_LOS, size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
- return rx_chain.radio->get_rx_lo_sources(name, chan);
+ return rx_chain.radio->get_rx_lo_sources(name, rx_chain.block_chan);
}
- void set_rx_lo_export_enabled(bool enabled, const std::string& name, size_t chan)
+ void set_rx_lo_export_enabled(bool enabled, const std::string& name = ALL_LOS, size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_lo_export_enabled, enabled, name);
auto rx_chain = _get_rx_chan(chan);
- return rx_chain.radio->set_rx_lo_export_enabled(
+ rx_chain.radio->set_rx_lo_export_enabled(
enabled, name, rx_chain.block_chan);
}
- bool get_rx_lo_export_enabled(const std::string& name, size_t chan)
+ bool get_rx_lo_export_enabled(const std::string& name = ALL_LOS, size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_lo_export_enabled(name, rx_chain.block_chan);
}
- double set_rx_lo_freq(double freq, const std::string& name, size_t chan)
+ double set_rx_lo_freq(double freq, const std::string& name, size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->set_rx_lo_freq(freq, name, rx_chain.block_chan);
}
- double get_rx_lo_freq(const std::string& name, size_t chan)
+ double get_rx_lo_freq(const std::string& name, size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_lo_freq(name, rx_chain.block_chan);
}
- freq_range_t get_rx_lo_freq_range(const std::string& name, size_t chan)
+ freq_range_t get_rx_lo_freq_range(const std::string& name, size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_lo_freq_range(name, rx_chain.block_chan);
}
/*** TX LO API ***/
- std::vector<std::string> get_tx_lo_names(size_t chan)
+ std::vector<std::string> get_tx_lo_names(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_lo_names(tx_chain.block_chan);
}
void set_tx_lo_source(
- const std::string& src, const std::string& name, const size_t chan)
+ const std::string& src, const std::string& name = ALL_LOS, const size_t chan = 0)
{
+ MUX_TX_API_CALL(set_tx_lo_source, src, name);
auto tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_lo_source(src, name, tx_chain.block_chan);
}
- const std::string get_tx_lo_source(const std::string& name, const size_t chan)
+ const std::string get_tx_lo_source(const std::string& name = ALL_LOS, const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_lo_source(name, tx_chain.block_chan);
}
- std::vector<std::string> get_tx_lo_sources(const std::string& name, const size_t chan)
+ std::vector<std::string> get_tx_lo_sources(const std::string& name = ALL_LOS, const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_lo_sources(name, tx_chain.block_chan);
}
void set_tx_lo_export_enabled(
- const bool enabled, const std::string& name, const size_t chan)
+ const bool enabled, const std::string& name = ALL_LOS, const size_t chan = 0)
{
+ MUX_TX_API_CALL(set_tx_lo_export_enabled, enabled, name);
auto tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_lo_export_enabled(enabled, name, tx_chain.block_chan);
}
- bool get_tx_lo_export_enabled(const std::string& name, const size_t chan)
+ bool get_tx_lo_export_enabled(const std::string& name = ALL_LOS, const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_lo_export_enabled(name, tx_chain.block_chan);
}
- double set_tx_lo_freq(const double freq, const std::string& name, const size_t chan)
+ double set_tx_lo_freq(const double freq, const std::string& name, const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->set_tx_lo_freq(freq, name, tx_chain.block_chan);
}
- double get_tx_lo_freq(const std::string& name, const size_t chan)
+ double get_tx_lo_freq(const std::string& name, const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_lo_freq(name, tx_chain.block_chan);
}
- freq_range_t get_tx_lo_freq_range(const std::string& name, const size_t chan)
+ freq_range_t get_tx_lo_freq_range(const std::string& name, const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_lo_freq_range(name, tx_chain.block_chan);
@@ -1336,25 +1350,27 @@ public:
/**************************************************************************
* Gain controls
*************************************************************************/
- void set_rx_gain(double gain, const std::string& name, size_t chan)
+ void set_rx_gain(double gain, const std::string& name, size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_gain, gain, name);
auto rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_gain(gain, name, rx_chain.block_chan);
}
- std::vector<std::string> get_rx_gain_profile_names(const size_t chan)
+ std::vector<std::string> get_rx_gain_profile_names(const size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_gain_profile_names(rx_chain.block_chan);
}
- void set_rx_gain_profile(const std::string& profile, const size_t chan)
+ void set_rx_gain_profile(const std::string& profile, const size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_gain_profile, profile);
auto rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_gain_profile(profile, rx_chain.block_chan);
}
- std::string get_rx_gain_profile(const size_t chan)
+ std::string get_rx_gain_profile(const size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_gain_profile(rx_chain.block_chan);
@@ -1365,25 +1381,27 @@ public:
if (gain > 1.0 || gain < 0.0) {
throw uhd::runtime_error("Normalized gain out of range, must be in [0, 1].");
}
+ MUX_RX_API_CALL(set_normalized_rx_gain, gain);
gain_range_t gain_range = get_rx_gain_range(ALL_GAINS, chan);
double abs_gain =
(gain * (gain_range.stop() - gain_range.start())) + gain_range.start();
set_rx_gain(abs_gain, ALL_GAINS, chan);
}
- void set_rx_agc(bool enable, size_t chan)
+ void set_rx_agc(bool enable, size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_agc, enable);
auto& rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_agc(enable, rx_chain.block_chan);
}
- double get_rx_gain(const std::string& name, size_t chan)
+ double get_rx_gain(const std::string& name, size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_gain(name, rx_chain.block_chan);
}
- double get_normalized_rx_gain(size_t chan)
+ double get_normalized_rx_gain(size_t chan = 0)
{
gain_range_t gain_range = get_rx_gain_range(ALL_GAINS, chan);
const double gain_range_width = gain_range.stop() - gain_range.start();
@@ -1397,105 +1415,108 @@ public:
return std::max(std::min(norm_gain, 1.0), 0.0);
}
- gain_range_t get_rx_gain_range(const std::string& name, size_t chan)
+ gain_range_t get_rx_gain_range(const std::string& name, size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_gain_range(name, rx_chain.block_chan);
}
- std::vector<std::string> get_rx_gain_names(size_t chan)
+ std::vector<std::string> get_rx_gain_names(size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_gain_names(rx_chain.block_chan);
}
- bool has_rx_power_reference(const size_t chan)
+ bool has_rx_power_reference(const size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->has_rx_power_reference(rx_chain.block_chan);
}
- void set_rx_power_reference(const double power_dbm, const size_t chan)
+ void set_rx_power_reference(const double power_dbm, const size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_power_reference, power_dbm);
auto& rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_power_reference(power_dbm, rx_chain.block_chan);
}
- double get_rx_power_reference(const size_t chan)
+ double get_rx_power_reference(const size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_power_reference(rx_chain.block_chan);
}
- void set_rx_antenna(const std::string& ant, size_t chan)
+ void set_rx_antenna(const std::string& ant, size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_antenna, ant);
auto& rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_antenna(ant, rx_chain.block_chan);
}
- std::string get_rx_antenna(size_t chan)
+ std::string get_rx_antenna(size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_antenna(rx_chain.block_chan);
}
- std::vector<std::string> get_rx_antennas(size_t chan)
+ std::vector<std::string> get_rx_antennas(size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_antennas(rx_chain.block_chan);
}
- void set_rx_bandwidth(double bandwidth, size_t chan)
+ void set_rx_bandwidth(double bandwidth, size_t chan = 0)
{
+ MUX_RX_API_CALL(set_rx_bandwidth, bandwidth);
auto& rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_bandwidth(bandwidth, rx_chain.block_chan);
}
- double get_rx_bandwidth(size_t chan)
+ double get_rx_bandwidth(size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_bandwidth(rx_chain.block_chan);
}
- meta_range_t get_rx_bandwidth_range(size_t chan)
+ meta_range_t get_rx_bandwidth_range(size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_bandwidth_range(rx_chain.block_chan);
}
- dboard_iface::sptr get_rx_dboard_iface(size_t chan)
+ dboard_iface::sptr get_rx_dboard_iface(size_t chan = 0)
{
auto& rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_tree()->access<dboard_iface::sptr>("iface").get();
}
- sensor_value_t get_rx_sensor(const std::string& name, size_t chan)
+ sensor_value_t get_rx_sensor(const std::string& name, size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_sensor(name, rx_chain.block_chan);
}
- std::vector<std::string> get_rx_sensor_names(size_t chan)
+ std::vector<std::string> get_rx_sensor_names(size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_sensor_names(rx_chain.block_chan);
}
- void set_rx_dc_offset(const bool enb, size_t chan)
+ void set_rx_dc_offset(const bool enb, size_t chan = ALL_CHANS)
{
MUX_RX_API_CALL(set_rx_dc_offset, enb);
const auto rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_dc_offset(enb, rx_chain.block_chan);
}
- void set_rx_dc_offset(const std::complex<double>& offset, size_t chan)
+ void set_rx_dc_offset(const std::complex<double>& offset, size_t chan = ALL_CHANS)
{
MUX_RX_API_CALL(set_rx_dc_offset, offset);
const auto rx_chain = _get_rx_chan(chan);
rx_chain.radio->set_rx_dc_offset(offset, rx_chain.block_chan);
}
- meta_range_t get_rx_dc_offset_range(size_t chan)
+ meta_range_t get_rx_dc_offset_range(size_t chan = 0)
{
auto rx_chain = _get_rx_chan(chan);
return rx_chain.radio->get_rx_dc_offset_range(rx_chain.block_chan);
@@ -1503,18 +1524,13 @@ public:
void set_rx_iq_balance(const bool enb, size_t chan)
{
- if (chan != ALL_CHANS) {
- auto rx_chain = _get_rx_chan(chan);
- rx_chain.radio->set_rx_iq_balance(enb, rx_chain.block_chan);
- return;
- }
- for (size_t ch = 0; ch < get_rx_num_channels(); ++ch) {
- set_rx_iq_balance(enb, ch);
- }
+ MUX_RX_API_CALL(set_rx_iq_balance, enb);
+ auto rx_chain = _get_rx_chan(chan);
+ rx_chain.radio->set_rx_iq_balance(enb, rx_chain.block_chan);
}
void set_rx_iq_balance(
- const std::complex<double>& correction, size_t chan)
+ const std::complex<double>& correction, size_t chan = ALL_CHANS)
{
MUX_RX_API_CALL(set_rx_iq_balance, correction);
const auto rx_chain = _get_rx_chan(chan);
@@ -1621,7 +1637,7 @@ public:
}
void set_tx_subdev_spec(
- const uhd::usrp::subdev_spec_t& spec, size_t mboard)
+ const uhd::usrp::subdev_spec_t& spec, size_t mboard = ALL_MBOARDS)
{
/* TODO: Refactor with get_rx_subdev_spec- the algorithms are the same, just the
* types are different
@@ -1663,7 +1679,7 @@ public:
}
}
- uhd::usrp::subdev_spec_t get_tx_subdev_spec(size_t mboard)
+ uhd::usrp::subdev_spec_t get_tx_subdev_spec(size_t mboard = 0)
{
uhd::usrp::subdev_spec_t result;
for (size_t tx_chan = 0; tx_chan < get_tx_num_channels(); tx_chan++) {
@@ -1684,13 +1700,13 @@ public:
return _tx_chans.size();
}
- std::string get_tx_subdev_name(size_t chan)
+ std::string get_tx_subdev_name(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_fe_name(tx_chain.block_chan, uhd::TX_DIRECTION);
}
- void set_tx_rate(double rate, size_t chan)
+ void set_tx_rate(double rate, size_t chan = ALL_CHANS)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
MUX_TX_API_CALL(set_tx_rate, rate);
@@ -1711,7 +1727,7 @@ public:
_tx_rates[chan] = actual_rate;
}
- double get_tx_rate(size_t chan)
+ double get_tx_rate(size_t chan = 0)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
auto& tx_chain = _get_tx_chan(chan);
@@ -1721,7 +1737,7 @@ public:
return tx_chain.radio->get_rate();
}
- meta_range_t get_tx_rates(size_t chan)
+ meta_range_t get_tx_rates(size_t chan = 0)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
auto tx_chain = _get_tx_chan(chan);
@@ -1731,7 +1747,7 @@ public:
return tx_chain.radio->get_rate_range();
}
- tune_result_t set_tx_freq(const tune_request_t& tune_request, size_t chan)
+ tune_result_t set_tx_freq(const tune_request_t& tune_request, size_t chan = 0)
{
std::lock_guard<std::recursive_mutex> l(_graph_mutex);
auto tx_chain = _get_tx_chan(chan);
@@ -1778,7 +1794,7 @@ public:
tune_request);
}
- double get_tx_freq(size_t chan)
+ double get_tx_freq(size_t chan = 0)
{
auto& tx_chain = _get_tx_chan(chan);
// extract actual dsp and IF frequencies
@@ -1786,45 +1802,47 @@ public:
tx_chain.radio->get_tx_frequency(tx_chain.block_chan);
const double actual_dsp_freq =
(tx_chain.duc) ? tx_chain.duc->get_freq(tx_chain.block_chan) : 0.0;
- // invert the sign on the dsp freq for transmit
+
return actual_rf_freq - actual_dsp_freq * TX_SIGN;
}
- freq_range_t get_tx_freq_range(size_t chan)
+ freq_range_t get_tx_freq_range(size_t chan = 0)
{
- auto tx_chain = _tx_chans.at(chan);
+ auto tx_chain = _get_tx_chan(chan);
return (tx_chain.duc)
- ? make_overall_tune_range(get_fe_rx_freq_range(chan),
+ ? make_overall_tune_range(get_fe_tx_freq_range(chan),
tx_chain.duc->get_frequency_range(tx_chain.block_chan),
- tx_chain.radio->get_rx_bandwidth(tx_chain.block_chan))
- : get_fe_rx_freq_range(chan);
+ tx_chain.radio->get_tx_bandwidth(tx_chain.block_chan))
+ : get_fe_tx_freq_range(chan);
}
- freq_range_t get_fe_tx_freq_range(size_t chan)
+ freq_range_t get_fe_tx_freq_range(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_frequency_range(tx_chain.block_chan);
}
- void set_tx_gain(double gain, const std::string& name, size_t chan)
+ void set_tx_gain(double gain, const std::string& name, size_t chan = 0)
{
+ MUX_TX_API_CALL(set_tx_gain, gain, name);
auto tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_gain(gain, name, tx_chain.block_chan);
}
- std::vector<std::string> get_tx_gain_profile_names(const size_t chan)
+ std::vector<std::string> get_tx_gain_profile_names(const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_gain_profile_names(tx_chain.block_chan);
}
- void set_tx_gain_profile(const std::string& profile, const size_t chan)
+ void set_tx_gain_profile(const std::string& profile, const size_t chan = 0)
{
+ MUX_TX_API_CALL(set_tx_gain_profile, profile);
auto tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_gain_profile(profile, tx_chain.block_chan);
}
- std::string get_tx_gain_profile(const size_t chan)
+ std::string get_tx_gain_profile(const size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_gain_profile(tx_chain.block_chan);
@@ -1835,19 +1853,20 @@ public:
if (gain > 1.0 || gain < 0.0) {
throw uhd::runtime_error("Normalized gain out of range, must be in [0, 1].");
}
+ MUX_TX_API_CALL(set_normalized_tx_gain, gain);
gain_range_t gain_range = get_tx_gain_range(ALL_GAINS, chan);
double abs_gain =
(gain * (gain_range.stop() - gain_range.start())) + gain_range.start();
set_tx_gain(abs_gain, ALL_GAINS, chan);
}
- double get_tx_gain(const std::string& name, size_t chan)
+ double get_tx_gain(const std::string& name, size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_gain(name, tx_chain.block_chan);
}
- double get_normalized_tx_gain(size_t chan)
+ double get_normalized_tx_gain(size_t chan = 0)
{
gain_range_t gain_range = get_tx_gain_range(ALL_GAINS, chan);
const double gain_range_width = gain_range.stop() - gain_range.start();
@@ -1861,104 +1880,107 @@ public:
return std::max(std::min(norm_gain, 1.0), 0.0);
}
- gain_range_t get_tx_gain_range(const std::string& name, size_t chan)
+ gain_range_t get_tx_gain_range(const std::string& name, size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_gain_range(name, tx_chain.block_chan);
}
- std::vector<std::string> get_tx_gain_names(size_t chan)
+ std::vector<std::string> get_tx_gain_names(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_gain_names(tx_chain.block_chan);
}
- bool has_tx_power_reference(const size_t chan)
+ bool has_tx_power_reference(const size_t chan = 0)
{
auto& tx_chain = _get_tx_chan(chan);
return tx_chain.radio->has_rx_power_reference(tx_chain.block_chan);
}
- void set_tx_power_reference(const double power_dbm, const size_t chan)
+ void set_tx_power_reference(const double power_dbm, const size_t chan = 0)
{
+ MUX_TX_API_CALL(set_tx_power_reference, power_dbm);
auto& tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_power_reference(power_dbm, tx_chain.block_chan);
}
- double get_tx_power_reference(const size_t chan)
+ double get_tx_power_reference(const size_t chan = 0)
{
auto& tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_power_reference(tx_chain.block_chan);
}
- void set_tx_antenna(const std::string& ant, size_t chan)
+ void set_tx_antenna(const std::string& ant, size_t chan = 0)
{
+ MUX_TX_API_CALL(set_tx_antenna, ant);
auto tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_antenna(ant, tx_chain.block_chan);
}
- std::string get_tx_antenna(size_t chan)
+ std::string get_tx_antenna(size_t chan = 0)
{
auto& tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_antenna(tx_chain.block_chan);
}
- std::vector<std::string> get_tx_antennas(size_t chan)
+ std::vector<std::string> get_tx_antennas(size_t chan = 0)
{
auto& tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_antennas(tx_chain.block_chan);
}
- void set_tx_bandwidth(double bandwidth, size_t chan)
+ void set_tx_bandwidth(double bandwidth, size_t chan = 0)
{
+ MUX_TX_API_CALL(set_tx_bandwidth, bandwidth);
auto tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_bandwidth(bandwidth, tx_chain.block_chan);
}
- double get_tx_bandwidth(size_t chan)
+ double get_tx_bandwidth(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_bandwidth(tx_chain.block_chan);
}
- meta_range_t get_tx_bandwidth_range(size_t chan)
+ meta_range_t get_tx_bandwidth_range(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_bandwidth_range(tx_chain.block_chan);
}
- dboard_iface::sptr get_tx_dboard_iface(size_t chan)
+ dboard_iface::sptr get_tx_dboard_iface(size_t chan = 0)
{
auto& tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tree()->access<dboard_iface::sptr>("iface").get();
}
- sensor_value_t get_tx_sensor(const std::string& name, size_t chan)
+ sensor_value_t get_tx_sensor(const std::string& name, size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_sensor(name, tx_chain.block_chan);
}
- std::vector<std::string> get_tx_sensor_names(size_t chan)
+ std::vector<std::string> get_tx_sensor_names(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_sensor_names(tx_chain.block_chan);
}
- void set_tx_dc_offset(const std::complex<double>& offset, size_t chan)
+ void set_tx_dc_offset(const std::complex<double>& offset, size_t chan = ALL_CHANS)
{
MUX_TX_API_CALL(set_tx_dc_offset, offset);
const auto tx_chain = _get_tx_chan(chan);
tx_chain.radio->set_tx_dc_offset(offset, tx_chain.block_chan);
}
- meta_range_t get_tx_dc_offset_range(size_t chan)
+ meta_range_t get_tx_dc_offset_range(size_t chan = 0)
{
auto tx_chain = _get_tx_chan(chan);
return tx_chain.radio->get_tx_dc_offset_range(tx_chain.block_chan);
}
- void set_tx_iq_balance(const std::complex<double>& correction, size_t chan)
+ void set_tx_iq_balance(const std::complex<double>& correction, size_t chan = ALL_CHANS)
{
MUX_TX_API_CALL(set_tx_iq_balance, correction);
const auto tx_chain = _get_tx_chan(chan);
@@ -2051,29 +2073,29 @@ public:
}
uint32_t get_gpio_attr(
- const std::string& bank, const std::string& attr, const size_t mboard)
+ const std::string& bank, const std::string& attr, const size_t mboard = 0)
{
auto radio_bank_pair = _get_gpio_radio_bank(bank, mboard);
return radio_bank_pair.first->get_gpio_attr(radio_bank_pair.second, attr);
}
- std::vector<std::string> get_gpio_src_banks(const size_t mboard)
+ std::vector<std::string> get_gpio_src_banks(const size_t mboard = 0)
{
return get_mbc(mboard)->get_gpio_banks();
}
- std::vector<std::string> get_gpio_srcs(const std::string& bank, const size_t mboard)
+ std::vector<std::string> get_gpio_srcs(const std::string& bank, const size_t mboard = 0)
{
return get_mbc(mboard)->get_gpio_srcs(bank);
}
- std::vector<std::string> get_gpio_src(const std::string& bank, const size_t mboard)
+ std::vector<std::string> get_gpio_src(const std::string& bank, const size_t mboard = 0)
{
return get_mbc(mboard)->get_gpio_src(bank);
}
void set_gpio_src(
- const std::string& bank, const std::vector<std::string>& src, const size_t mboard)
+ const std::string& bank, const std::vector<std::string>& src, const size_t mboard = 0)
{
get_mbc(mboard)->set_gpio_src(bank, src);
}
@@ -2164,6 +2186,7 @@ public:
void set_rx_filter(
const std::string& name, uhd::filter_info_base::sptr filter, const size_t chan)
{
+ MUX_RX_API_CALL(set_rx_filter, name, filter);
try {
// The block_id_t constructor is pretty smart; let it handle the parsing.
block_id_t block_id(name);
@@ -2284,6 +2307,7 @@ public:
void set_tx_filter(
const std::string& name, uhd::filter_info_base::sptr filter, const size_t chan)
{
+ MUX_TX_API_CALL(set_tx_filter, name, filter);
try {
// The block_id_t constructor is pretty smart; let it handle the parsing.
block_id_t block_id(name);