summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/runtime
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2013-01-23 14:59:49 -0500
committerTom Rondeau <trondeau@vt.edu>2013-01-23 16:14:18 -0500
commit74c9034f5f645181cb449a1660deb97b918086e9 (patch)
treed48ec182d5d7b2196681e1519b9ef67b7a9cc214 /gnuradio-core/src/lib/runtime
parent40611315d2f26b18d7c34ef074aa03aeb9f29500 (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.cc1
-rw-r--r--gnuradio-core/src/lib/runtime/gr_basic_block.h14
-rw-r--r--gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc17
-rw-r--r--gnuradio-core/src/lib/runtime/gr_top_block.cc6
-rw-r--r--gnuradio-core/src/lib/runtime/pycallback_object.h23
-rw-r--r--gnuradio-core/src/lib/runtime/rpcregisterhelpers.h34
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;
};
/*