diff options
author | Tom Rondeau <trondeau@vt.edu> | 2013-01-23 14:59:49 -0500 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2013-01-23 16:14:18 -0500 |
commit | 74c9034f5f645181cb449a1660deb97b918086e9 (patch) | |
tree | d48ec182d5d7b2196681e1519b9ef67b7a9cc214 /gnuradio-core/src/lib/runtime | |
parent | 40611315d2f26b18d7c34ef074aa03aeb9f29500 (diff) |
ctrlport: Changed RPC setup call to only require block's alias and not all of the other info we used to require. gr_top_block shows the new interface.
The flowgraph now automatically calls setup_rpc on every block when the flowgraph is run. No need to have setup_rpc() in the block's constructor.
Diffstat (limited to 'gnuradio-core/src/lib/runtime')
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_basic_block.cc | 1 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_basic_block.h | 14 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc | 17 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_top_block.cc | 6 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/pycallback_object.h | 23 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/rpcregisterhelpers.h | 34 |
6 files changed, 70 insertions, 25 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_basic_block.cc b/gnuradio-core/src/lib/runtime/gr_basic_block.cc index 2530391532..35ea797167 100644 --- a/gnuradio-core/src/lib/runtime/gr_basic_block.cc +++ b/gnuradio-core/src/lib/runtime/gr_basic_block.cc @@ -49,6 +49,7 @@ gr_basic_block::gr_basic_block(const std::string &name, d_symbolic_id(global_block_registry.block_register(this)), d_symbol_name(global_block_registry.register_symbolic_name(this)), d_color(WHITE), + d_rpc_set(false), message_subscribers(pmt::make_dict()) { s_ncurrently_allocated++; diff --git a/gnuradio-core/src/lib/runtime/gr_basic_block.h b/gnuradio-core/src/lib/runtime/gr_basic_block.h index 55940e3c7f..d4f5cb5941 100644 --- a/gnuradio-core/src/lib/runtime/gr_basic_block.h +++ b/gnuradio-core/src/lib/runtime/gr_basic_block.h @@ -97,6 +97,7 @@ class GR_CORE_API gr_basic_block : public gr_msg_accepter, public boost::enable_ std::string d_symbol_name; std::string d_symbol_alias; vcolor d_color; + bool d_rpc_set; msg_queue_map_t msg_queue; std::vector<boost::any> d_rpc_vars; // container for all RPC variables @@ -244,6 +245,19 @@ class GR_CORE_API gr_basic_block : public gr_msg_accepter, public boost::enable_ * (rpcbasic_sptr(...)) and stored using add_rpc_variable. */ virtual void setup_rpc() {}; + + /*! + * \brief Ask if this block has been registered to the RPC. + * + * We can only register a block once, so we use this to protect us + * from calling it multiple times. + */ + bool is_rpc_set() { return d_rpc_set; } + + /*! + * \brief When the block is registered with the RPC, set this. + */ + void rpc_set() { d_rpc_set = true; } /*! * \brief Confirm that ninputs and noutputs is an acceptable combination. diff --git a/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc b/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc index 44475d2ae0..6850afa845 100644 --- a/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc +++ b/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc @@ -474,6 +474,23 @@ gr_hier_block2_detail::flatten_aux(gr_flat_flowgraph_sptr sfg) const gr_edge_viter_t p; gr_msg_edge_viter_t q,u; + // For every block (gr_block and gr_hier_block2), set up the RPC + // interface. + for(p = edges.begin(); p != edges.end(); p++) { + gr_basic_block_sptr b; + b = p->src().block(); + if(!b->is_rpc_set()) { + b->setup_rpc(); + b->rpc_set(); + } + + b = p->dst().block(); + if(!b->is_rpc_set()) { + b->setup_rpc(); + b->rpc_set(); + } + } + if (GR_HIER_BLOCK2_DETAIL_DEBUG) std::cout << "Flattening stream connections: " << std::endl; diff --git a/gnuradio-core/src/lib/runtime/gr_top_block.cc b/gnuradio-core/src/lib/runtime/gr_top_block.cc index 05cebe7d7f..f41fb4ebd8 100644 --- a/gnuradio-core/src/lib/runtime/gr_top_block.cc +++ b/gnuradio-core/src/lib/runtime/gr_top_block.cc @@ -42,8 +42,6 @@ gr_top_block::gr_top_block(const std::string &name) gr_make_io_signature(0,0,0)) { - setup_rpc(); - d_impl = new gr_top_block_impl(this); } @@ -123,7 +121,7 @@ gr_top_block::setup_rpc() // Getters add_rpc_variable( rpcbasic_sptr(new rpcbasic_register_get<gr_top_block, int>( - d_name, "max nouptut_items", this, unique_id(), + alias(), "max nouptut_items", &gr_top_block::max_noutput_items, pmt::mp(0), pmt::mp(8192), pmt::mp(8192), "items", "Max number of output items", @@ -132,7 +130,7 @@ gr_top_block::setup_rpc() // Setters add_rpc_variable( rpcbasic_sptr(new rpcbasic_register_set<gr_top_block, int>( - d_name, "max noutput_items", this, unique_id(), + alias(), "max noutput_items", &gr_top_block::set_max_noutput_items, pmt::mp(0), pmt::mp(8192), pmt::mp(8192), "items", "Max number of output items", diff --git a/gnuradio-core/src/lib/runtime/pycallback_object.h b/gnuradio-core/src/lib/runtime/pycallback_object.h index 389a975bd4..f6247c0c6d 100644 --- a/gnuradio-core/src/lib/runtime/pycallback_object.h +++ b/gnuradio-core/src/lib/runtime/pycallback_object.h @@ -77,11 +77,8 @@ public: myType min, myType max, myType deflt, DisplayType dtype) : d_callback(NULL), - d_rpc(name, functionbase.c_str(), this, pycallback_object_count++, - &pycallback_object::get, pmt_assist<myType>::make(min), - pmt_assist<myType>::make(max), pmt_assist<myType>::make(deflt), - units.c_str(), desc.c_str(), RPC_PRIVLVL_MIN, dtype) - //pmt::mp(min), pmt::mp(max), pmt::mp(deflt), units.c_str(), desc.c_str(), RPC_PRIVLVL_MIN, dtype) + d_functionbase(functionbase), d_units(units), d_desc(desc), + d_min(min), d_max(max), d_deflt(deflt), d_dtype(dtype) { d_callback = NULL; } @@ -121,9 +118,23 @@ public: d_callback = cb; } + void setup_rpc() + { +#ifdef GR_CTRLPORT + add_rpc_variable( + rpcbasic_sptr(new rpcbasic_register_get<pycallback_object, myType>( + alias(), d_functionbase.c_str(), + &pycallback_object::get, pmt_assist<myType>::make(d_min), + pmt_assist<myType>::make(d_max), pmt_assist<myType>::make(d_deflt), + d_units.c_str(), d_desc.c_str(), RPC_PRIVLVL_MIN, d_dtype))); +#endif /* GR_CTRLPORT */ + } + private: PyObject* d_callback; - rpcbasic_register_get<pycallback_object, myType> d_rpc; + std::string d_functionbase, d_units, d_desc; + myType d_min, d_max, d_deflt; + DisplayType d_dtype; myType pyCast(PyObject* obj) { printf("TYPE NOT IMPLEMENTED!\n"); diff --git a/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h b/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h index 6d5f878d3b..2e3ac2d85c 100644 --- a/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h +++ b/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h @@ -30,6 +30,7 @@ #include <rpcmanager.h> #include <rpcserver_selector.h> #include <rpcserver_base.h> +#include <gr_block_registry.h> // Base classes template<typename T, typename Tto> class rpcextractor_base @@ -282,9 +283,8 @@ typedef boost::shared_ptr<rpcbasic_base> rpcbasic_sptr; template<typename T, typename Tto> struct rpcbasic_register_set : public rpcbasic_base { - rpcbasic_register_set(const std::string& namebase, - const char* functionbase, T* obj, - const unsigned int serial, + rpcbasic_register_set(const std::string& block_alias, + const char* functionbase, void (T::*function)(Tto), const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, const char* units_ = "", @@ -299,13 +299,15 @@ struct rpcbasic_register_set : public rpcbasic_base d_desc = desc_; d_minpriv = minpriv_; d_display = display_; + d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef RPCSERVER_ENABLED callbackregister_base::configureCallback_t - extractor(new rpcbasic_extractor<T,Tto>(obj, function), + extractor(new rpcbasic_extractor<T,Tto>(d_object, function), minpriv_, std::string(units_), display_, std::string(desc_), min, max, def); std::ostringstream oss(std::ostringstream::out); - oss << namebase << serial << "::" << functionbase; d_id = oss.str(); + oss << block_alias << "::" << functionbase; + d_id = oss.str(); //std::cerr << "REGISTERING SET: " << d_id << " " << desc_ << std::endl; rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); #endif @@ -341,6 +343,7 @@ private: std::string d_units, d_desc; priv_lvl_t d_minpriv; DisplayType d_display; + T *d_object; }; @@ -349,9 +352,8 @@ class rpcbasic_register_get : public rpcbasic_base { public: // primary constructor to allow for T get() functions - rpcbasic_register_get(const std::string& namebase, - const char* functionbase, T* obj, - const int serial, + rpcbasic_register_get(const std::string& block_alias, + const char* functionbase, Tfrom (T::*function)(), const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, const char* units_ = "", @@ -366,12 +368,13 @@ public: d_desc = desc_; d_minpriv = minpriv_; d_display = display_; + d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef RPCSERVER_ENABLED callbackregister_base::queryCallback_t - inserter(new rpcbasic_inserter<T,Tfrom>(obj, function), + inserter(new rpcbasic_inserter<T,Tfrom>(d_object, function), minpriv_, std::string(units_), display_, std::string(desc_), min, max, def); std::ostringstream oss(std::ostringstream::out); - oss << namebase << serial << "::" << functionbase; + oss << block_alias << "::" << functionbase; d_id = oss.str(); //std::cerr << "REGISTERING GET: " << d_id << " " << desc_ << std::endl; rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); @@ -379,9 +382,8 @@ public: } // alternate constructor to allow for T get() const functions - rpcbasic_register_get(const std::string& namebase, - const char* functionbase, T* obj, - const int serial, + rpcbasic_register_get(const std::string& block_alias, + const char* functionbase, Tfrom (T::*function)() const, const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, const char* units_ = "", @@ -396,12 +398,13 @@ public: d_desc = desc_; d_minpriv = minpriv_; d_display = display_; + d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef RPCSERVER_ENABLED callbackregister_base::queryCallback_t - inserter(new rpcbasic_inserter<T,Tfrom>(obj, (Tfrom (T::*)())function), + inserter(new rpcbasic_inserter<T,Tfrom>(d_object, (Tfrom (T::*)())function), minpriv_, std::string(units_), display_, std::string(desc_), min, max, def); std::ostringstream oss(std::ostringstream::out); - oss << namebase << serial << "::" << functionbase; + oss << block_alias << "::" << functionbase; d_id = oss.str(); //std::cerr << "REGISTERING GET CONST: " << d_id << " " << desc_ << " " << display_ << std::endl; rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); @@ -437,6 +440,7 @@ private: std::string d_units, d_desc; priv_lvl_t d_minpriv; DisplayType d_display; + T *d_object; }; /* |