USRP Hardware Driver and USRP Manual  Version: 3.15.0.HEAD-0-gaea0e2de
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 // Copyright 2019 Ettus Research, a National Instruments Brand
5 //
6 // SPDX-License-Identifier: GPL-3.0-or-later
7 //
8 
9 #ifndef INCLUDED_UHD_DEVICE3_HPP
10 #define INCLUDED_UHD_DEVICE3_HPP
11 
12 #include <uhd/device.hpp>
14 #include <uhd/rfnoc/graph.hpp>
15 #include <boost/core/demangle.hpp>
16 #include <boost/thread/mutex.hpp>
17 #include <vector>
18 
19 namespace uhd {
20 
28 class UHD_API device3 : public uhd::device
29 {
30 public:
31  typedef boost::shared_ptr<device3> sptr;
32 
34  static sptr make(const device_addr_t& hint, const size_t which = 0);
35 
36  virtual rfnoc::graph::sptr create_graph(const std::string& name = "") = 0;
37 
42  void clear();
43 
50  bool has_block(const rfnoc::block_id_t& block_id) const;
51 
57  template <typename T> bool has_block(const rfnoc::block_id_t& block_id) const
58  {
59  if (has_block(block_id)) {
60  return bool(boost::dynamic_pointer_cast<T>(get_block_ctrl(block_id)));
61  } else {
62  return false;
63  }
64  }
65 
74  rfnoc::block_ctrl_base::sptr get_block_ctrl(const rfnoc::block_id_t& block_id) const;
75 
91  template <typename T>
92  boost::shared_ptr<T> get_block_ctrl(const rfnoc::block_id_t& block_id) const
93  {
94  boost::shared_ptr<T> blk =
95  boost::dynamic_pointer_cast<T>(get_block_ctrl(block_id));
96  if (blk) {
97  return blk;
98  } else {
99  throw uhd::lookup_error(str(
100  boost::format("This device does not have a block of type %s with ID: %s")
101  % boost::core::demangle(typeid(T).name()) % block_id.to_string()));
102  }
103  }
104 
128  std::vector<rfnoc::block_id_t> find_blocks(const std::string& block_id_hint) const;
129 
132  template <typename T>
133  std::vector<rfnoc::block_id_t> find_blocks(const std::string& block_id_hint) const
134  {
135  std::vector<rfnoc::block_id_t> all_block_ids = find_blocks(block_id_hint);
136  std::vector<rfnoc::block_id_t> filt_block_ids;
137  for (size_t i = 0; i < all_block_ids.size(); i++) {
138  if (has_block<T>(all_block_ids[i])) {
139  filt_block_ids.push_back(all_block_ids[i]);
140  }
141  }
142  return filt_block_ids;
143  }
144 
145 protected:
147  // It is the responsibility of the deriving class to make
148  // sure this gets correctly populated.
149  std::vector<rfnoc::block_ctrl_base::sptr> _rfnoc_block_ctrl;
151  boost::mutex _block_ctrl_mutex;
152 };
153 
154 } // namespace uhd
155 
156 #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:133
Extends uhd::device for third-generation USRP devices.
Definition: device3.hpp:28
Definition: block_id.hpp:39
Definition: build_info.hpp:13
boost::mutex _block_ctrl_mutex
Mutex to protect access to members.
Definition: device3.hpp:151
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:149
#define UHD_API
Definition: config.h:68
bool has_block(const rfnoc::block_id_t &block_id) const
Definition: device3.hpp:57
boost::shared_ptr< T > get_block_ctrl(const rfnoc::block_id_t &block_id) const
Definition: device3.hpp:92
Definition: device.hpp:28
boost::shared_ptr< device3 > sptr
Definition: device3.hpp:31
Definition: device_addr.hpp:38