USRP Hardware Driver and USRP Manual  Version: 004.000.000.HEAD-0-g8773fb2c
UHD and USRP Manual
node_ctrl_base.hpp
Go to the documentation of this file.
1 //
2 // Copyright 2014-2016 Ettus Research LLC
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 //
17 
18 #ifndef INCLUDED_LIBUHD_NODE_CTRL_BASE_HPP
19 #define INCLUDED_LIBUHD_NODE_CTRL_BASE_HPP
20 
22 #include <uhd/rfnoc/constants.hpp>
23 #include <boost/cstdint.hpp>
24 #include <boost/shared_ptr.hpp>
25 #include <boost/utility.hpp>
26 #include <boost/enable_shared_from_this.hpp>
27 #include <boost/function.hpp>
28 #include <map>
29 #include <set>
30 
31 namespace uhd {
32  namespace rfnoc {
33 
34 #define UHD_RFNOC_BLOCK_TRACE() UHD_MSG(status) << "[" << unique_id() << "] "
35 
40 class node_ctrl_base : boost::noncopyable, public boost::enable_shared_from_this<node_ctrl_base>
41 {
42 public:
43  /***********************************************************************
44  * Types
45  **********************************************************************/
46  typedef boost::shared_ptr<node_ctrl_base> sptr;
47  typedef boost::weak_ptr<node_ctrl_base> wptr;
48  typedef std::map< size_t, wptr > node_map_t;
49  typedef std::pair< size_t, wptr > node_map_pair_t;
50 
51  /***********************************************************************
52  * Node control
53  **********************************************************************/
55  virtual std::string unique_id() const;
56 
57  /***********************************************************************
58  * Connections
59  **********************************************************************/
62  virtual void clear();
63 
64  node_map_t list_downstream_nodes() { return _downstream_nodes; };
65  node_map_t list_upstream_nodes() { return _upstream_nodes; };
66 
67  // TODO we need a more atomic connect procedure, this is too error-prone.
68 
73  void set_downstream_port(const size_t this_port, const size_t remote_port);
74 
79  size_t get_downstream_port(const size_t this_port);
80 
85  void set_upstream_port(const size_t this_port, const size_t remote_port);
86 
91  size_t get_upstream_port(const size_t this_port);
92 
108  template <typename T>
109  UHD_INLINE std::vector< boost::shared_ptr<T> > find_downstream_node()
110  {
111  return _find_child_node<T, true>();
112  }
113 
116  template <typename T>
117  UHD_INLINE std::vector< boost::shared_ptr<T> > find_upstream_node()
118  {
119  return _find_child_node<T, false>();
120  }
121 
134  template <typename T, typename value_type>
136  boost::function<value_type(boost::shared_ptr<T> node, size_t port)> get_property,
137  value_type null_value,
138  const std::set< boost::shared_ptr<T> > &exclude_nodes=std::set< boost::shared_ptr<T> >()
139  ) {
140  return _find_unique_property<T, value_type, true>(get_property, null_value, exclude_nodes);
141  }
142 
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=std::set< boost::shared_ptr<T> >()
150  ) {
151  return _find_unique_property<T, value_type, false>(get_property, null_value, exclude_nodes);
152  }
153 
154 protected:
155  /***********************************************************************
156  * Structors
157  **********************************************************************/
158  node_ctrl_base(void) {};
159  virtual ~node_ctrl_base() {};
160 
161  /***********************************************************************
162  * Protected members
163  **********************************************************************/
164 
167 
168  // TODO make these private
169 
171  node_map_t _upstream_nodes;
172 
174  node_map_t _downstream_nodes;
175 
176  /***********************************************************************
177  * Connections
178  **********************************************************************/
185  virtual void _register_downstream_node(
186  node_ctrl_base::sptr downstream_node,
187  size_t port
188  );
189 
196  virtual void _register_upstream_node(
197  node_ctrl_base::sptr upstream_node,
198  size_t port
199  );
200 
201 private:
210  template <typename T, bool downstream>
211  std::vector< boost::shared_ptr<T> > _find_child_node();
212 
221  template <typename T, typename value_type, bool downstream>
222  value_type _find_unique_property(
223  boost::function<value_type(boost::shared_ptr<T>, size_t)> get_property,
224  value_type NULL_VALUE,
225  const std::set< boost::shared_ptr<T> > &exclude_nodes
226  );
227 
230  std::map<size_t, size_t> _upstream_ports;
231 
234  std::map<size_t, size_t> _downstream_ports;
235 
236 }; /* class node_ctrl_base */
237 
238 }} /* namespace uhd::rfnoc */
239 
241 
242 #endif /* INCLUDED_LIBUHD_NODE_CTRL_BASE_HPP */
243 // vim: sw=4 et:
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:146
node_map_t list_upstream_nodes()
Definition: node_ctrl_base.hpp:65
virtual void _register_upstream_node(node_ctrl_base::sptr upstream_node, size_t port)
std::map< size_t, wptr > node_map_t
Definition: node_ctrl_base.hpp:48
virtual ~node_ctrl_base()
Definition: node_ctrl_base.hpp:159
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:64
node_ctrl_base(void)
Definition: node_ctrl_base.hpp:158
std::pair< size_t, wptr > node_map_pair_t
Definition: node_ctrl_base.hpp:49
Definition: build_info.hpp:25
uhd::device_addr_t _args
Stores default arguments.
Definition: node_ctrl_base.hpp:159
boost::shared_ptr< node_ctrl_base > sptr
Definition: node_ctrl_base.hpp:46
#define UHD_RFNOC_API
Definition: config.hpp:103
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:63
node_map_t _downstream_nodes
List of downstream nodes.
Definition: node_ctrl_base.hpp:174
UHD_INLINE std::vector< boost::shared_ptr< T > > find_upstream_node()
Definition: node_ctrl_base.hpp:117
void set_upstream_port(const size_t this_port, const size_t remote_port)
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:135
UHD_INLINE std::vector< boost::shared_ptr< T > > find_downstream_node()
Definition: node_ctrl_base.hpp:109
boost::weak_ptr< node_ctrl_base > wptr
Definition: node_ctrl_base.hpp:47
node_map_t _upstream_nodes
List of upstream nodes.
Definition: node_ctrl_base.hpp:171
Definition: device_addr.hpp:47
Definition: node_ctrl_base.hpp:40