diff options
author | Lane Kolbly <lane.kolbly@ni.com> | 2021-12-21 16:22:34 -0600 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2022-01-10 08:02:18 -0600 |
commit | 716ed77f7f65d83635a95815c8508ac49f013ad6 (patch) | |
tree | bcb7775c93d619d44971622e534e8d1223f9f314 /host/lib | |
parent | 5160c3778e92ee9324fe4e1f81edb86383608d14 (diff) | |
download | uhd-716ed77f7f65d83635a95815c8508ac49f013ad6.tar.gz uhd-716ed77f7f65d83635a95815c8508ac49f013ad6.tar.bz2 uhd-716ed77f7f65d83635a95815c8508ac49f013ad6.zip |
host: multi_usrp: Merge set_tx_subdev_spec and set_rx_subdev_spec
This change simply refactors these methods so that the core of the algorithm
is no longer duplicated between them.
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/usrp/multi_usrp_rfnoc.cpp | 166 |
1 files changed, 67 insertions, 99 deletions
diff --git a/host/lib/usrp/multi_usrp_rfnoc.cpp b/host/lib/usrp/multi_usrp_rfnoc.cpp index f09c79547..4ab6abcbd 100644 --- a/host/lib/usrp/multi_usrp_rfnoc.cpp +++ b/host/lib/usrp/multi_usrp_rfnoc.cpp @@ -1061,54 +1061,11 @@ public: void set_rx_subdev_spec( const uhd::usrp::subdev_spec_t& spec, size_t mboard = ALL_MBOARDS) override { - // First, generate a vector of the RX channels that we need to register - auto new_rx_chans = [this, spec, mboard]() { - /* When setting the subdev spec in multiple mboard scenarios, there are two - * cases we need to handle: - * 1. Setting all mboard to the same subdev spec. This is the easy case. - * 2. Setting a single mboard's subdev spec. In this case, we need to update - * the requested mboard's subdev spec, and keep the old subdev spec for the - * other mboards. - */ - std::vector<rx_chan_t> new_rx_chans; - for (size_t current_mboard = 0; current_mboard < get_num_mboards(); - ++current_mboard) { - auto current_spec = [this, spec, mboard, current_mboard]() { - if (mboard == ALL_MBOARDS || mboard == current_mboard) { - // Update all mboards to the same subdev spec OR - // only update this mboard to the new subdev spec - return spec; - } else { - // Keep the old subdev spec for this mboard - return get_rx_subdev_spec(current_mboard); - } - }(); - auto new_mboard_chans = - _generate_mboard_rx_chans(current_spec, current_mboard); - new_rx_chans.insert( - new_rx_chans.end(), new_mboard_chans.begin(), new_mboard_chans.end()); - } - return new_rx_chans; - }(); - - // Disconnect and clear the existing chains - UHD_LOG_TRACE("MULTI_USRP", "Disconnecting RX chains"); - for (auto entry : _rx_chans) { - for (auto edge : entry.second.edge_list) { - if (block_id_t(edge.dst_blockid).match(NODE_ID_SEP)) { - break; - } - _graph->disconnect( - edge.src_blockid, edge.src_port, edge.dst_blockid, edge.dst_port); - } - } - _rx_chans.clear(); - - // Register the new chains - size_t musrp_rx_channel = 0; - for (auto rx_chan : new_rx_chans) { - _rx_chans.emplace(musrp_rx_channel++, rx_chan); - } + _set_subdev_spec(_rx_chans, [this](size_t current_mboard) { + return this->get_rx_subdev_spec(current_mboard); + }, [this](uhd::usrp::subdev_spec_t current_spec, size_t current_mboard) { + return this->_generate_mboard_rx_chans(current_spec, current_mboard); + }, spec, mboard); } uhd::usrp::subdev_spec_t get_rx_subdev_spec(size_t mboard = 0) override @@ -1701,57 +1658,11 @@ public: void set_tx_subdev_spec( const uhd::usrp::subdev_spec_t& spec, size_t mboard = ALL_MBOARDS) override { - /* TODO: Refactor with get_rx_subdev_spec- the algorithms are the same, just the - * types are different - */ - // First, generate a vector of the tx channels that we need to register - auto new_tx_chans = [this, spec, mboard]() { - /* When setting the subdev spec in multiple mboard scenarios, there are two - * cases we need to handle: - * 1. Setting all mboard to the same subdev spec. This is the easy case. - * 2. Setting a single mboard's subdev spec. In this case, we need to update - * the requested mboard's subdev spec, and keep the old subdev spec for the - * other mboards. - */ - std::vector<tx_chan_t> new_tx_chans; - for (size_t current_mboard = 0; current_mboard < get_num_mboards(); - ++current_mboard) { - auto current_spec = [this, spec, mboard, current_mboard]() { - if (mboard == ALL_MBOARDS || mboard == current_mboard) { - // Update all mboards to the same subdev spec OR - // only update this mboard to the new subdev spec - return spec; - } else { - // Keep the old subdev spec for this mboard - return get_tx_subdev_spec(current_mboard); - } - }(); - auto new_mboard_chans = - _generate_mboard_tx_chans(current_spec, current_mboard); - new_tx_chans.insert( - new_tx_chans.end(), new_mboard_chans.begin(), new_mboard_chans.end()); - } - return new_tx_chans; - }(); - - // Disconnect and clear existing chains - UHD_LOG_TRACE("MULTI_USRP", "Disconnecting TX chains"); - for (auto entry : _tx_chans) { - for (auto edge : entry.second.edge_list) { - if (block_id_t(edge.src_blockid).match(NODE_ID_SEP)) { - break; - } - _graph->disconnect( - edge.src_blockid, edge.src_port, edge.dst_blockid, edge.dst_port); - } - } - _tx_chans.clear(); - - // Register new chains - size_t musrp_tx_channel = 0; - for (auto tx_chan : new_tx_chans) { - _tx_chans.emplace(musrp_tx_channel++, tx_chan); - } + _set_subdev_spec(_tx_chans, [this](size_t current_mboard) { + return this->get_tx_subdev_spec(current_mboard); + }, [this](uhd::usrp::subdev_spec_t current_spec, size_t current_mboard) { + return this->_generate_mboard_tx_chans(current_spec, current_mboard); + }, spec, mboard); } uhd::usrp::subdev_spec_t get_tx_subdev_spec(size_t mboard = 0) override @@ -2509,6 +2420,63 @@ private: return edges; } + template<typename ChanType, typename GetSubdevSpecFn, typename GenChansFn> + void _set_subdev_spec( + std::unordered_map<size_t, ChanType> chans, + GetSubdevSpecFn&& get_subdev_spec, + GenChansFn&& generate_chans, + const uhd::usrp::subdev_spec_t& spec, + size_t mboard) + { + // First, generate a vector of the channels that we need to register + auto new_chans = [&]() { + /* When setting the subdev spec in multiple mboard scenarios, there are two + * cases we need to handle: + * 1. Setting all mboard to the same subdev spec. This is the easy case. + * 2. Setting a single mboard's subdev spec. In this case, we need to update + * the requested mboard's subdev spec, and keep the old subdev spec for the + * other mboards. + */ + std::vector<ChanType> new_chans; + for (size_t current_mboard = 0; current_mboard < get_num_mboards(); + ++current_mboard) { + auto current_spec = [&]() { + if (mboard == ALL_MBOARDS || mboard == current_mboard) { + // Update all mboards to the same subdev spec OR + // only update this mboard to the new subdev spec + return spec; + } else { + // Keep the old subdev spec for this mboard + return get_subdev_spec(current_mboard); + } + }(); + auto new_mboard_chans = generate_chans(current_spec, current_mboard); + new_chans.insert( + new_chans.end(), new_mboard_chans.begin(), new_mboard_chans.end()); + } + return new_chans; + }(); + + // Disconnect and clear existing chains + UHD_LOG_TRACE("MULTI_USRP", "Disconnecting chains"); + for (auto entry : chans) { + for (auto edge : entry.second.edge_list) { + if (block_id_t(edge.src_blockid).match(NODE_ID_SEP)) { + break; + } + _graph->disconnect( + edge.src_blockid, edge.src_port, edge.dst_blockid, edge.dst_port); + } + } + chans.clear(); + + // Register new chains + size_t musrp_channel = 0; + for (auto chan : new_chans) { + chans.emplace(musrp_channel++, chan); + } + } + /************************************************************************** * Private Attributes *************************************************************************/ |