USRP Hardware Driver and USRP Manual  Version: 3.14.1.1-1
UHD and USRP Manual
node_ctrl_base.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_LIBUHD_NODE_CTRL_BASE_HPP
9 #define INCLUDED_LIBUHD_NODE_CTRL_BASE_HPP
10 
11 #include <uhd/rfnoc/constants.hpp>
13 #include <uhd/utils/log.hpp>
14 #include <stdint.h>
15 #include <boost/enable_shared_from_this.hpp>
16 #include <boost/function.hpp>
17 #include <boost/shared_ptr.hpp>
18 #include <boost/utility.hpp>
19 #include <map>
20 #include <set>
21 
22 namespace uhd { namespace rfnoc {
23 
24 #define UHD_RFNOC_BLOCK_TRACE() UHD_LOGGER_TRACE("RFNOC")
25 
30 class node_ctrl_base : boost::noncopyable,
31  public boost::enable_shared_from_this<node_ctrl_base>
32 {
33 public:
34  /***********************************************************************
35  * Types
36  **********************************************************************/
37  typedef boost::shared_ptr<node_ctrl_base> sptr;
38  typedef boost::weak_ptr<node_ctrl_base> wptr;
39  typedef std::map<size_t, wptr> node_map_t;
40  typedef std::pair<size_t, wptr> node_map_pair_t;
41 
42  /***********************************************************************
43  * Node control
44  **********************************************************************/
46  virtual std::string unique_id() const;
47 
48  /***********************************************************************
49  * Connections
50  **********************************************************************/
53  virtual void clear();
54 
55  node_map_t list_downstream_nodes()
56  {
57  return _downstream_nodes;
58  };
59  node_map_t list_upstream_nodes()
60  {
61  return _upstream_nodes;
62  };
63 
66  void disconnect();
67 
70  void disconnect_output_port(const size_t output_port);
71 
74  void disconnect_input_port(const size_t input_port);
75 
76  // TODO we need a more atomic connect procedure, this is too error-prone.
77 
82  void set_downstream_port(const size_t this_port, const size_t remote_port);
83 
88  size_t get_downstream_port(const size_t this_port);
89 
94  void set_upstream_port(const size_t this_port, const size_t remote_port);
95 
100  size_t get_upstream_port(const size_t this_port);
101 
117  template <typename T>
118  UHD_INLINE std::vector<boost::shared_ptr<T> > find_downstream_node(
119  bool active_only = false)
120  {
121  return _find_child_node<T, true>(active_only);
122  }
123 
126  template <typename T>
127  UHD_INLINE std::vector<boost::shared_ptr<T> > find_upstream_node(
128  bool active_only = false)
129  {
130  return _find_child_node<T, false>(active_only);
131  }
132 
145  template <typename T, typename value_type>
147  boost::function<value_type(boost::shared_ptr<T> node, size_t port)> get_property,
148  value_type null_value,
149  const std::set<boost::shared_ptr<T> >& exclude_nodes =
150  std::set<boost::shared_ptr<T> >())
151  {
152  return _find_unique_property<T, value_type, true>(
153  get_property, null_value, exclude_nodes);
154  }
155 
158  template <typename T, typename value_type>
160  boost::function<value_type(boost::shared_ptr<T> node, size_t port)> get_property,
161  value_type null_value,
162  const std::set<boost::shared_ptr<T> >& exclude_nodes =
163  std::set<boost::shared_ptr<T> >())
164  {
165  return _find_unique_property<T, value_type, false>(
166  get_property, null_value, exclude_nodes);
167  }
168 
169 protected:
170  /***********************************************************************
171  * Structors
172  **********************************************************************/
174  virtual ~node_ctrl_base()
175  {
176  disconnect();
177  }
178 
179  /***********************************************************************
180  * Protected members
181  **********************************************************************/
182 
185 
186  // TODO make these private
187 
189  node_map_t _upstream_nodes;
190 
192  node_map_t _downstream_nodes;
193 
197 
201 
209  std::map<size_t, bool> _rx_streamer_active;
210 
218  std::map<size_t, bool> _tx_streamer_active;
219 
220  /***********************************************************************
221  * Connections
222  **********************************************************************/
229  virtual void _register_downstream_node(
230  node_ctrl_base::sptr downstream_node, size_t port);
231 
238  virtual void _register_upstream_node(node_ctrl_base::sptr upstream_node, size_t port);
239 
240 private:
249  template <typename T, bool downstream>
250  std::vector<boost::shared_ptr<T> > _find_child_node(bool active_only = false);
251 
260  template <typename T, typename value_type, bool downstream>
261  value_type _find_unique_property(
262  boost::function<value_type(boost::shared_ptr<T>, size_t)> get_property,
263  value_type NULL_VALUE,
264  const std::set<boost::shared_ptr<T> >& exclude_nodes);
265 
268  std::map<size_t, size_t> _upstream_ports;
269 
272  std::map<size_t, size_t> _downstream_ports;
273 
274 }; /* class node_ctrl_base */
275 
276 }} /* namespace uhd::rfnoc */
277 
279 
280 #endif /* INCLUDED_LIBUHD_NODE_CTRL_BASE_HPP */
UHD_INLINE value_type find_upstream_unique_property(boost::function< value_type(boost::shared_ptr< T > node, size_t port)> get_property, value_type null_value, const std::set< boost::shared_ptr< T > > &exclude_nodes=std::set< boost::shared_ptr< T > >())
Definition: node_ctrl_base.hpp:159
node_map_t list_upstream_nodes()
Definition: node_ctrl_base.hpp:59
std::pair< size_t, wptr > node_map_pair_t
Definition: node_ctrl_base.hpp:40
virtual void _register_upstream_node(node_ctrl_base::sptr upstream_node, size_t port)
virtual ~node_ctrl_base()
Definition: node_ctrl_base.hpp:174
void set_downstream_port(const size_t this_port, const size_t remote_port)
virtual void _register_downstream_node(node_ctrl_base::sptr downstream_node, size_t port)
node_map_t list_downstream_nodes()
Definition: node_ctrl_base.hpp:55
std::map< size_t, wptr > node_map_t
Definition: node_ctrl_base.hpp:39
node_ctrl_base(void)
Definition: node_ctrl_base.hpp:173
Definition: build_info.hpp:13
uhd::device_addr_t _args
Stores default arguments.
Definition: node_ctrl_base.hpp:184
UHD_INLINE std::vector< boost::shared_ptr< T > > find_upstream_node(bool active_only=false)
Definition: node_ctrl_base.hpp:127
void disconnect_input_port(const size_t input_port)
boost::shared_ptr< node_ctrl_base > sptr
Definition: node_ctrl_base.hpp:37
#define UHD_RFNOC_API
Definition: config.hpp:104
size_t get_downstream_port(const size_t this_port)
size_t get_upstream_port(const size_t this_port)
#define UHD_INLINE
Definition: config.h:53
node_map_t _downstream_nodes
List of downstream nodes.
Definition: node_ctrl_base.hpp:192
size_t _num_input_ports
Definition: node_ctrl_base.hpp:196
void set_upstream_port(const size_t this_port, const size_t remote_port)
void disconnect_output_port(const size_t output_port)
std::map< size_t, bool > _rx_streamer_active
Definition: node_ctrl_base.hpp:209
virtual std::string unique_id() const
Returns a unique string that identifies this block.
UHD_INLINE value_type find_downstream_unique_property(boost::function< value_type(boost::shared_ptr< T > node, size_t port)> get_property, value_type null_value, const std::set< boost::shared_ptr< T > > &exclude_nodes=std::set< boost::shared_ptr< T > >())
Definition: node_ctrl_base.hpp:146
std::map< size_t, bool > _tx_streamer_active
Definition: node_ctrl_base.hpp:218
boost::weak_ptr< node_ctrl_base > wptr
Definition: node_ctrl_base.hpp:38
node_map_t _upstream_nodes
List of upstream nodes.
Definition: node_ctrl_base.hpp:189
size_t _num_output_ports
Definition: node_ctrl_base.hpp:200
Definition: device_addr.hpp:38
UHD_INLINE std::vector< boost::shared_ptr< T > > find_downstream_node(bool active_only=false)
Definition: node_ctrl_base.hpp:118
Definition: node_ctrl_base.hpp:30