USRP Hardware Driver and USRP Manual  Version: 3.15.0.HEAD-0-g6563c537
UHD and USRP Manual
device3.hpp
Go to the documentation of this file.
1 //
2 // Copyright 2014-2016 Ettus Research LLC
3 // Copyright 2018 Ettus Research, a National Instruments Company
4 //
5 // SPDX-License-Identifier: GPL-3.0-or-later
6 //
7 
8 #ifndef INCLUDED_UHD_DEVICE3_HPP
9 #define INCLUDED_UHD_DEVICE3_HPP
10 
11 #include <uhd/device.hpp>
13 #include <uhd/rfnoc/graph.hpp>
14 #include <boost/thread/mutex.hpp>
15 #include <boost/units/detail/utility.hpp>
16 #include <vector>
17 
18 namespace uhd {
19 
27 class UHD_API device3 : public uhd::device
28 {
29 public:
30  typedef boost::shared_ptr<device3> sptr;
31 
33  static sptr make(const device_addr_t& hint, const size_t which = 0);
34 
35  virtual rfnoc::graph::sptr create_graph(const std::string& name = "") = 0;
36 
41  void clear();
42 
49  bool has_block(const rfnoc::block_id_t& block_id) const;
50 
56  template <typename T> bool has_block(const rfnoc::block_id_t& block_id) const
57  {
58  if (has_block(block_id)) {
59  return bool(boost::dynamic_pointer_cast<T>(get_block_ctrl(block_id)));
60  } else {
61  return false;
62  }
63  }
64 
73  rfnoc::block_ctrl_base::sptr get_block_ctrl(const rfnoc::block_id_t& block_id) const;
74 
90  template <typename T>
91  boost::shared_ptr<T> get_block_ctrl(const rfnoc::block_id_t& block_id) const
92  {
93  boost::shared_ptr<T> blk =
94  boost::dynamic_pointer_cast<T>(get_block_ctrl(block_id));
95  if (blk) {
96  return blk;
97  } else {
98  throw uhd::lookup_error(str(
99  boost::format("This device does not have a block of type %s with ID: %s")
100  % boost::units::detail::demangle(typeid(T).name())
101  % block_id.to_string()));
102  }
103  }
104 
117  std::vector<rfnoc::block_id_t> find_blocks(const std::string& block_id_hint) const;
118 
121  template <typename T>
122  std::vector<rfnoc::block_id_t> find_blocks(const std::string& block_id_hint) const
123  {
124  std::vector<rfnoc::block_id_t> all_block_ids = find_blocks(block_id_hint);
125  std::vector<rfnoc::block_id_t> filt_block_ids;
126  for (size_t i = 0; i < all_block_ids.size(); i++) {
127  if (has_block<T>(all_block_ids[i])) {
128  filt_block_ids.push_back(all_block_ids[i]);
129  }
130  }
131  return filt_block_ids;
132  }
133 
134 protected:
136  // It is the responsibility of the deriving class to make
137  // sure this gets correctly populated.
138  std::vector<rfnoc::block_ctrl_base::sptr> _rfnoc_block_ctrl;
140  boost::mutex _block_ctrl_mutex;
141 };
142 
143 } // namespace uhd
144 
145 #endif /* INCLUDED_UHD_DEVICE3_HPP */
std::string to_string() const
Return a string like this: "0/FFT_1" (includes all components, if set)
Definition: exception.hpp:60
boost::shared_ptr< uhd::rfnoc::graph > sptr
Definition: graph.hpp:20
std::vector< rfnoc::block_id_t > find_blocks(const std::string &block_id_hint) const
Definition: device3.hpp:122
Extends uhd::device for third-generation USRP devices.
Definition: device3.hpp:27
Definition: block_id.hpp:39
Definition: build_info.hpp:13
boost::mutex _block_ctrl_mutex
Mutex to protect access to members.
Definition: device3.hpp:140
boost::shared_ptr< block_ctrl_base > sptr
Definition: block_ctrl_base.hpp:93
std::vector< rfnoc::block_ctrl_base::sptr > _rfnoc_block_ctrl
List of all RFNoC blocks available on this device.
Definition: device3.hpp:138
#define UHD_API
Definition: config.h:68
bool has_block(const rfnoc::block_id_t &block_id) const
Definition: device3.hpp:56
boost::shared_ptr< T > get_block_ctrl(const rfnoc::block_id_t &block_id) const
Definition: device3.hpp:91
Definition: device.hpp:28
boost::shared_ptr< device3 > sptr
Definition: device3.hpp:30
Definition: device_addr.hpp:38