summaryrefslogtreecommitdiff
path: root/gnuradio-core/src
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src')
-rw-r--r--gnuradio-core/src/examples/CMakeLists.txt7
-rw-r--r--gnuradio-core/src/lib/CMakeLists.txt40
-rw-r--r--gnuradio-core/src/lib/general/CMakeLists.txt11
-rw-r--r--gnuradio-core/src/lib/general/general.i13
-rw-r--r--gnuradio-core/src/lib/general/gr_nop.cc24
-rw-r--r--gnuradio-core/src/lib/general/gr_nop.h10
-rw-r--r--gnuradio-core/src/lib/general/gr_nop.i3
-rw-r--r--gnuradio-core/src/lib/runtime/CMakeLists.txt36
-rw-r--r--gnuradio-core/src/lib/runtime/gr_basic_block.h35
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block.h4
-rw-r--r--gnuradio-core/src/lib/runtime/gr_top_block.cc26
-rw-r--r--gnuradio-core/src/lib/runtime/gr_top_block.h2
-rw-r--r--gnuradio-core/src/lib/runtime/rpcregisterhelpers.h16
-rw-r--r--gnuradio-core/src/lib/runtime/rpcserver_ice.h2
-rw-r--r--gnuradio-core/src/lib/runtime/runtime.i39
-rw-r--r--gnuradio-core/src/lib/swig/CMakeLists.txt10
-rw-r--r--gnuradio-core/src/python/gnuradio/CMakeLists.txt1
-rwxr-xr-xgnuradio-core/src/python/gnuradio/ctrlport/qa_cpp_py_binding.py3
-rw-r--r--gnuradio-core/src/python/gnuradio/gr/CMakeLists.txt1
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_nlog10.py1
20 files changed, 271 insertions, 13 deletions
diff --git a/gnuradio-core/src/examples/CMakeLists.txt b/gnuradio-core/src/examples/CMakeLists.txt
index fc06c23476..7e27b123ee 100644
--- a/gnuradio-core/src/examples/CMakeLists.txt
+++ b/gnuradio-core/src/examples/CMakeLists.txt
@@ -20,4 +20,9 @@
add_subdirectory(mp-sched)
add_subdirectory(network)
add_subdirectory(tags)
-add_subdirectory(volk_benchmark) \ No newline at end of file
+add_subdirectory(volk_benchmark)
+
+if(ENABLE_GR_CTRLPORT)
+add_subdirectory(ctrlport)
+endif(ENABLE_GR_CTRLPORT)
+ \ No newline at end of file
diff --git a/gnuradio-core/src/lib/CMakeLists.txt b/gnuradio-core/src/lib/CMakeLists.txt
index dcb81c36a2..64c130d695 100644
--- a/gnuradio-core/src/lib/CMakeLists.txt
+++ b/gnuradio-core/src/lib/CMakeLists.txt
@@ -69,10 +69,48 @@ endif()
# Link against libvolk
list(APPEND gnuradio_core_libs volk)
-add_library(gnuradio-core SHARED ${gnuradio_core_sources})
+if(ENABLE_GR_CTRLPORT)
+
+########################################################################
+# Run ICE To compile Slice files
+########################################################################
+EXECUTE_PROCESS(
+ COMMAND "${ICE_SLICE2CPP}" "-I${CMAKE_CURRENT_SOURCE_DIR}/runtime"
+ "--output-dir=${CMAKE_CURRENT_BINARY_DIR}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/runtime/gnuradio.ice"
+ )
+
+# Append generated file in build directory
+list(APPEND gnuradio_core_generated_sources
+ ${CMAKE_CURRENT_BINARY_DIR}/gnuradio.cpp
+)
+
+list(APPEND gnuradio_core_generated_includes
+ ${CMAKE_CURRENT_BINARY_DIR}/gnuradio.h
+)
+
+########################################################################
+# Add controlport stuff to gnuradio-core
+########################################################################
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+list(APPEND gnuradio_core_libs
+ ${ICE_LIBRARIES}
+)
+
+GR_ADD_COND_DEF(ENABLE_GR_CTRLPORT)
+
+endif(ENABLE_GR_CTRLPORT)
+
+add_library(gnuradio-core SHARED ${gnuradio_core_sources} ${gnuradio_core_generated_sources})
target_link_libraries(gnuradio-core ${gnuradio_core_libs})
GR_LIBRARY_FOO(gnuradio-core RUNTIME_COMPONENT "core_runtime" DEVEL_COMPONENT "core_devel")
set_target_properties(gnuradio-core PROPERTIES LINK_INTERFACE_LIBRARIES "gruel")
+ADD_DEPENDENCIES(gnuradio-core
+ gnuradio_core_generated_sources
+ gnuradio_core_generated_includes
+ gnuradio_core_generated_swigs)
########################################################################
# Setup executables
diff --git a/gnuradio-core/src/lib/general/CMakeLists.txt b/gnuradio-core/src/lib/general/CMakeLists.txt
index 80097c9db4..44ee54c1ca 100644
--- a/gnuradio-core/src/lib/general/CMakeLists.txt
+++ b/gnuradio-core/src/lib/general/CMakeLists.txt
@@ -242,6 +242,17 @@ set(gr_core_general_triple_threats
gr_message_strobe
)
+if(ENABLE_GR_CTRLPORT)
+
+add_definitions(-DENABLE_GR_CTRLPORT=1)
+
+list(APPEND gr_core_general_triple_threats
+ gr_ctrlport_probe_c
+ gr_ctrlport_probe2_c
+)
+endif(ENABLE_GR_CTRLPORT)
+
+
foreach(file_tt ${gr_core_general_triple_threats})
list(APPEND gnuradio_core_sources ${CMAKE_CURRENT_SOURCE_DIR}/${file_tt}.cc)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${file_tt}.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio COMPONENT "core_devel")
diff --git a/gnuradio-core/src/lib/general/general.i b/gnuradio-core/src/lib/general/general.i
index af275686f0..7d03c20640 100644
--- a/gnuradio-core/src/lib/general/general.i
+++ b/gnuradio-core/src/lib/general/general.i
@@ -183,3 +183,16 @@
%include "gr_tag_debug.i"
%include "gr_block_gateway.i"
%include "gr_message_strobe.i"
+
+
+#ifdef ENABLE_GR_CTRLPORT
+
+%{
+#include <gr_ctrlport_probe_c.h>
+#include <gr_ctrlport_probe2_c.h>
+%}
+
+%include "gr_ctrlport_probe_c.i"
+%include "gr_ctrlport_probe2_c.i"
+
+#endif /* ENABLE_GR_CTRLPORT */
diff --git a/gnuradio-core/src/lib/general/gr_nop.cc b/gnuradio-core/src/lib/general/gr_nop.cc
index edfe1d76d9..d6c7bf4f2d 100644
--- a/gnuradio-core/src/lib/general/gr_nop.cc
+++ b/gnuradio-core/src/lib/general/gr_nop.cc
@@ -39,6 +39,8 @@ gr_nop::gr_nop (size_t sizeof_stream_item)
gr_make_io_signature (0, -1, sizeof_stream_item)),
d_nmsgs_recvd(0)
{
+ set_rpc();
+
// Arrange to have count_received_msgs called when messages are received.
message_port_register_in(pmt::mp("port"));
set_msg_handler(pmt::mp("port"), boost::bind(&gr_nop::count_received_msgs, this, _1));
@@ -64,3 +66,25 @@ gr_nop::general_work (int noutput_items,
return noutput_items;
}
+
+void
+gr_nop::set_rpc()
+{
+#ifdef ENABLE_GR_CTRLPORT
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_nop, int>(
+ d_name, "test", this, unique_id(),
+ &gr_nop::ctrlport_test,
+ pmt::mp(-256), pmt::mp(255), pmt::mp(0),
+ "", "Simple testing variable",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+
+ d_rpc_vars.push_back(
+ rpcbasic_sptr(new rpcbasic_register_set<gr_nop, int>(
+ d_name, "test", this, unique_id(),
+ &gr_nop::set_ctrlport_test,
+ pmt::mp(-256), pmt::mp(255), pmt::mp(0),
+ "", "Simple testing variable",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+#endif /* ENABLE_GR_CTRLPORT */
+}
diff --git a/gnuradio-core/src/lib/general/gr_nop.h b/gnuradio-core/src/lib/general/gr_nop.h
index e0d59280f9..51921ac4ec 100644
--- a/gnuradio-core/src/lib/general/gr_nop.h
+++ b/gnuradio-core/src/lib/general/gr_nop.h
@@ -27,6 +27,10 @@
#include <gr_block.h>
#include <stddef.h> // size_t
+#ifdef ENABLE_GR_CTRLPORT
+#include <rpcregisterhelpers.h>
+#endif
+
class gr_nop;
typedef boost::shared_ptr<gr_nop> gr_nop_sptr;
@@ -42,8 +46,12 @@ class GR_CORE_API gr_nop : public gr_block
friend GR_CORE_API gr_nop_sptr gr_make_nop (size_t sizeof_stream_item);
gr_nop (size_t sizeof_stream_item);
+ std::vector<boost::any> d_rpc_vars;
+ void set_rpc();
+
protected:
int d_nmsgs_recvd;
+ int d_ctrlport_test;
// Method that just counts any received messages.
void count_received_msgs(pmt::pmt_t msg);
@@ -56,6 +64,8 @@ protected:
int nmsgs_received() const { return d_nmsgs_recvd; }
+ int ctrlport_test() { return d_ctrlport_test; }
+ void set_ctrlport_test(int x) { d_ctrlport_test = x; }
};
#endif /* INCLUDED_GR_NOP_H */
diff --git a/gnuradio-core/src/lib/general/gr_nop.i b/gnuradio-core/src/lib/general/gr_nop.i
index 977a15d186..73ffa93630 100644
--- a/gnuradio-core/src/lib/general/gr_nop.i
+++ b/gnuradio-core/src/lib/general/gr_nop.i
@@ -25,6 +25,9 @@ GR_SWIG_BLOCK_MAGIC(gr,nop)
gr_nop_sptr gr_make_nop (size_t sizeof_stream_item);
class gr_nop : public gr_block {
+public:
+ int ctrlport_test();
+ void set_ctrlport_test(int x);
private:
gr_nop (size_t sizeof_stream_item);
};
diff --git a/gnuradio-core/src/lib/runtime/CMakeLists.txt b/gnuradio-core/src/lib/runtime/CMakeLists.txt
index 70938a0f17..606759dde2 100644
--- a/gnuradio-core/src/lib/runtime/CMakeLists.txt
+++ b/gnuradio-core/src/lib/runtime/CMakeLists.txt
@@ -90,6 +90,20 @@ list(APPEND gnuradio_core_sources
${CMAKE_CURRENT_SOURCE_DIR}/gr_select_handler.cc
)
+if(ENABLE_GR_CTRLPORT)
+list(APPEND gnuradio_core_sources
+ ${CMAKE_CURRENT_SOURCE_DIR}/ice_application_base.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_ice.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_booter_ice.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_booter_aggregator.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_aggregator.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_selector.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcpmtconverters_ice.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcmanager.cc
+)
+endif(ENABLE_GR_CTRLPORT)
+
+
########################################################################
# Append gnuradio-core test sources
########################################################################
@@ -157,6 +171,28 @@ install(FILES
COMPONENT "core_devel"
)
+
+if(ENABLE_GR_CTRLPORT)
+add_definitions(-DENABLE_GR_CTRLPORT=1)
+INSTALL(FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/ice_application_base.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/ice_server_template.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpccallbackregister_base.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcmanager_base.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcmanager.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcpmtconverters_ice.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcregisterhelpers.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_aggregator.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_base.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_booter_aggregator.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_booter_base.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_booter_ice.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/rpcserver_selector.h
+ DESTINATION ${GR_INCLUDE_DIR}/gnuradio
+ COMPONENT "core_devel"
+)
+endif(ENABLE_GR_CTRLPORT)
+
########################################################################
# Install swig headers
########################################################################
diff --git a/gnuradio-core/src/lib/runtime/gr_basic_block.h b/gnuradio-core/src/lib/runtime/gr_basic_block.h
index e0fd5d2afd..b0930e2318 100644
--- a/gnuradio-core/src/lib/runtime/gr_basic_block.h
+++ b/gnuradio-core/src/lib/runtime/gr_basic_block.h
@@ -37,6 +37,10 @@
#include <boost/foreach.hpp>
#include <boost/thread/condition_variable.hpp>
+#ifdef ENABLE_GR_CTRLPORT
+#include <rpcregisterhelpers.h>
+#endif
+
/*!
* \brief The abstract base class for all signal processing blocks.
* \ingroup internal
@@ -95,6 +99,8 @@ protected:
std::string d_symbol_alias;
vcolor d_color;
+ std::vector<boost::any> d_rpc_vars; // container for all RPC variables
+
gr_basic_block(void){} //allows pure virtual interface sub-classes
//! Protected constructor prevents instantiation by non-derived classes
@@ -229,6 +235,35 @@ public:
throw std::runtime_error("attempt to set_msg_handler() on bad input message port!"); }
d_msg_handlers[which_port] = msg_handler_t(msg_handler);
}
+
+#ifdef ENABLE_GR_CTRLPORT
+ /*!
+ * \brief Add an RPC variable (get or set).
+ *
+ * Using controlport, we create new getters/setters and need to
+ * store them. Each block has a vector to do this, and these never
+ * need to be accessed again once they are registered with the RPC
+ * backend. This function takes a
+ * boost::shared_sptr<rpcbasic_base> so that when the block is
+ * deleted, all RPC registered variables are cleaned up.
+ *
+ * \param s an rpcbasic_sptr of the new RPC variable register to store.
+ */
+ void add_rpc_variable(rpcbasic_sptr s)
+ {
+ d_rpc_vars.push_back(s);
+ }
+#endif /* ENABLE_GR_CTRLPORT */
+
+ /*!
+ * \brief Set up the RPC registered variables.
+ *
+ * This must be overloaded by a block that wants to use
+ * controlport. This is where rpcbasic_register_{get,set} pointers
+ * are created, which then get wrapped as shared pointers
+ * (rpcbasic_sptr(...)) and stored using add_rpc_variable.
+ */
+ virtual void setup_rpc() {};
};
inline bool operator<(gr_basic_block_sptr lhs, gr_basic_block_sptr rhs)
diff --git a/gnuradio-core/src/lib/runtime/gr_block.h b/gnuradio-core/src/lib/runtime/gr_block.h
index 57e3fda90a..22e6c07592 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.h
+++ b/gnuradio-core/src/lib/runtime/gr_block.h
@@ -27,6 +27,10 @@
#include <gr_basic_block.h>
#include <gr_tags.h>
+#ifdef ENABLE_GR_CTRLPORT
+#include <rpcregisterhelpers.h>
+#endif
+
/*!
* \brief The abstract base class for all 'terminal' processing blocks.
* \ingroup base_blk
diff --git a/gnuradio-core/src/lib/runtime/gr_top_block.cc b/gnuradio-core/src/lib/runtime/gr_top_block.cc
index e47473edd8..271884c334 100644
--- a/gnuradio-core/src/lib/runtime/gr_top_block.cc
+++ b/gnuradio-core/src/lib/runtime/gr_top_block.cc
@@ -42,6 +42,8 @@ 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);
}
@@ -113,3 +115,27 @@ gr_top_block::to_top_block()
{
return cast_to_top_block_sptr(shared_from_this());
}
+
+void
+gr_top_block::setup_rpc()
+{
+#ifdef ENABLE_GR_CTRLPORT
+ // Getters
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<gr_top_block, int>(
+ d_name, "max nouptut_items", this, unique_id(),
+ &gr_top_block::max_noutput_items,
+ pmt::mp(0), pmt::mp(8192), pmt::mp(8192),
+ "items", "Max number of output items",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+
+ // Setters
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_set<gr_top_block, int>(
+ d_name, "max noutput_items", this, unique_id(),
+ &gr_top_block::set_max_noutput_items,
+ pmt::mp(0), pmt::mp(8192), pmt::mp(8192),
+ "items", "Max number of output items",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+#endif /* ENABLE_GR_CTRLPORT */
+}
diff --git a/gnuradio-core/src/lib/runtime/gr_top_block.h b/gnuradio-core/src/lib/runtime/gr_top_block.h
index 482a2beb1e..10a21a6434 100644
--- a/gnuradio-core/src/lib/runtime/gr_top_block.h
+++ b/gnuradio-core/src/lib/runtime/gr_top_block.h
@@ -123,6 +123,8 @@ public:
void set_max_noutput_items(int nmax);
gr_top_block_sptr to_top_block(); // Needed for Python type coercion
+
+ void setup_rpc();
};
inline gr_top_block_sptr cast_to_top_block_sptr(gr_basic_block_sptr block) {
diff --git a/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h b/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h
index d7772573ce..bbe4f6c7d3 100644
--- a/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h
+++ b/gnuradio-core/src/lib/runtime/rpcregisterhelpers.h
@@ -40,7 +40,7 @@ public:
_source(source), _func(func) {;}
~rpcextractor_base() {;}
- void post(pmt::pmt_t msg) {
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg) {
throw std::runtime_error("rpcextractor_base: no post defined for this data type.\n");
}
@@ -101,7 +101,7 @@ public:
: rpcextractor_base<T,double>(source, func)
{;}
- void post(pmt::pmt_t msg)
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg)
{
(rpcextractor_base<T,double>::_source->*rpcextractor_base<T,double>::_func)
(pmt::pmt_to_double(msg));
@@ -116,7 +116,7 @@ public:
: rpcextractor_base<T,float>(source, func)
{;}
- void post(pmt::pmt_t msg)
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg)
{
(rpcextractor_base<T,float>::_source->*rpcextractor_base<T,float>::_func)
(pmt::pmt_to_double(msg));
@@ -131,7 +131,7 @@ public:
: rpcextractor_base<T,long>(source, func)
{;}
- void post(pmt::pmt_t msg)
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg)
{
(rpcextractor_base<T,long>::_source->*rpcextractor_base<T,long>::_func)
(pmt::pmt_to_long(msg));
@@ -146,7 +146,7 @@ public:
: rpcextractor_base<T,int>(source, func)
{;}
- void post(pmt::pmt_t msg)
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg)
{
(rpcextractor_base<T,int>::_source->*rpcextractor_base<T,int>::_func)
(pmt::pmt_to_long(msg));
@@ -161,7 +161,7 @@ public:
: rpcextractor_base<T,bool>(source, func)
{;}
- void post(pmt::pmt_t msg)
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg)
{
(rpcextractor_base<T,bool>::_source->*rpcextractor_base<T,bool>::_func)
(pmt::pmt_to_bool(msg));
@@ -177,7 +177,7 @@ public:
: rpcextractor_base<T,std::complex<double> >(source, func)
{;}
- void post(pmt::pmt_t msg)
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg)
{
(rpcextractor_base<T,std::complex<double> >::
_source->*rpcextractor_base<T,std::complex<double> >::_func)(pmt::pmt_to_complex(msg));
@@ -193,7 +193,7 @@ public:
: rpcextractor_base<T,std::string>(source, func)
{;}
- void post(pmt::pmt_t msg)
+ void post(pmt::pmt_t which_port, pmt::pmt_t msg)
{
(rpcextractor_base<T,std::string>::
_source->*rpcextractor_base<T,std::string>::_func)(pmt::pmt_symbol_to_string(msg));
diff --git a/gnuradio-core/src/lib/runtime/rpcserver_ice.h b/gnuradio-core/src/lib/runtime/rpcserver_ice.h
index 9eff4b4dbc..98847bbe05 100644
--- a/gnuradio-core/src/lib/runtime/rpcserver_ice.h
+++ b/gnuradio-core/src/lib/runtime/rpcserver_ice.h
@@ -69,7 +69,7 @@ private:
ConfigureCallbackMap_t::const_iterator iter(d_setcallbackmap.find(p.first));
if(iter != d_setcallbackmap.end()) {
if(cur_priv <= iter->second.priv) {
- (*iter->second.callback).post(rpcpmtconverter::to_pmt(p.second,c));
+ (*iter->second.callback).post(pmt::PMT_NIL, rpcpmtconverter::to_pmt(p.second,c));
}
else {
std::cout << "Key " << p.first << " requires PRIVLVL <= "
diff --git a/gnuradio-core/src/lib/runtime/runtime.i b/gnuradio-core/src/lib/runtime/runtime.i
index 8e35df8342..933ea2feae 100644
--- a/gnuradio-core/src/lib/runtime/runtime.i
+++ b/gnuradio-core/src/lib/runtime/runtime.i
@@ -67,3 +67,42 @@
%include <gr_sync_decimator.i>
%include <gr_sync_interpolator.i>
%include <gr_top_block.i>
+
+
+#ifdef ENABLE_GR_CTRLPORT
+
+%template(StrVector) std::vector<std::string>;
+
+%{
+#include <rpcmanager.h>
+#include <rpcserver_booter_base.h>
+#include <rpcserver_booter_aggregator.h>
+#include <pycallback_object.h>
+#include <rpccallbackregister_base.h>
+%}
+
+%include <rpcmanager.h>
+%include <rpcserver_booter_base.h>
+%include <rpcserver_booter_aggregator.h>
+%include <pycallback_object.h>
+%include <rpccallbackregister_base.h>
+
+// Attach a new python callback method to Python function
+%extend pycallback_object {
+ // Set a Python function object as a callback function
+ // Note : PyObject *pyfunc is remapped with a typempap
+ void activate(PyObject *pyfunc)
+ {
+ self->set_callback(pyfunc);
+ Py_INCREF(pyfunc);
+ }
+}
+
+%template(RPC_get_string) pycallback_object<std::string>;
+%template(RPC_get_int) pycallback_object<int>;
+%template(RPC_get_float) pycallback_object<float>;
+%template(RPC_get_double) pycallback_object<double>;
+%template(RPC_get_vector_float) pycallback_object<std::vector<float> >;
+%template(RPC_get_vector_gr_complex) pycallback_object<std::vector<gr_complex> >;
+
+#endif /* ENABLE_GR_CTRLPORT */
diff --git a/gnuradio-core/src/lib/swig/CMakeLists.txt b/gnuradio-core/src/lib/swig/CMakeLists.txt
index cf07cd3848..f506bc2033 100644
--- a/gnuradio-core/src/lib/swig/CMakeLists.txt
+++ b/gnuradio-core/src/lib/swig/CMakeLists.txt
@@ -32,6 +32,13 @@ set(GR_SWIG_INCLUDE_DIRS
)
set(GR_SWIG_LIBRARIES gnuradio-core)
+if(ENABLE_GR_CTRLPORT)
+ list(APPEND GR_SWIG_FLAGS -DENABLE_GR_CTRLPORT)
+ list(APPEND GR_SWIG_LIBRARIES
+ ${ICE_LIBRARIES}
+ )
+endif(ENABLE_GR_CTRLPORT)
+
########################################################################
# Build and install the swig targets
########################################################################
@@ -42,7 +49,8 @@ set(GR_SWIG_LIBRARIES gnuradio-core)
# X86_64, g++'s resident set size was 650MB!
# ----------------------------------------------------------------
-set(GR_SWIG_TARGET_DEPS general_generated gengen_generated filter_generated pmt_swig)
+set(GR_SWIG_TARGET_DEPS gnuradio_core_generated_sources
+ general_generated gengen_generated filter_generated pmt_swig)
foreach(what runtime general gengen io)
SET(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/${what}_swig_doc.i)
diff --git a/gnuradio-core/src/python/gnuradio/CMakeLists.txt b/gnuradio-core/src/python/gnuradio/CMakeLists.txt
index bf696e0d34..ab46dbb92a 100644
--- a/gnuradio-core/src/python/gnuradio/CMakeLists.txt
+++ b/gnuradio-core/src/python/gnuradio/CMakeLists.txt
@@ -24,6 +24,7 @@ add_subdirectory(gru)
add_subdirectory(gruimpl)
add_subdirectory(blks2)
add_subdirectory(blks2impl)
+add_subdirectory(ctrlport)
GR_PYTHON_INSTALL(FILES
__init__.py
diff --git a/gnuradio-core/src/python/gnuradio/ctrlport/qa_cpp_py_binding.py b/gnuradio-core/src/python/gnuradio/ctrlport/qa_cpp_py_binding.py
index d4db8e76da..760252b4df 100755
--- a/gnuradio-core/src/python/gnuradio/ctrlport/qa_cpp_py_binding.py
+++ b/gnuradio-core/src/python/gnuradio/ctrlport/qa_cpp_py_binding.py
@@ -135,6 +135,7 @@ class test_cpp_py_binding(gr_unittest.TestCase):
self.src = gr.vector_source_c(data)
self.p1 = gr.ctrlport_probe_c("aaa","C++ exported variable")
self.p2 = gr.ctrlport_probe_c("bbb","C++ exported variable")
+ probe_name = self.p2.name() + str(self.p2.unique_id())
self.tb.connect(self.src, self.p1)
self.tb.connect(self.src, self.p2)
@@ -157,7 +158,7 @@ class test_cpp_py_binding(gr_unittest.TestCase):
radio = GNURadio.ControlPortPrx.checkedCast(base)
# Get all exported knobs
- ret = radio.get([])
+ ret = radio.get([probe_name + "::bbb"])
for name in ret.keys():
result = ret[name].value
self.assertEqual(result, expected_result)
diff --git a/gnuradio-core/src/python/gnuradio/gr/CMakeLists.txt b/gnuradio-core/src/python/gnuradio/gr/CMakeLists.txt
index 62f3d7e46d..c5ff2a0c14 100644
--- a/gnuradio-core/src/python/gnuradio/gr/CMakeLists.txt
+++ b/gnuradio-core/src/python/gnuradio/gr/CMakeLists.txt
@@ -47,6 +47,7 @@ foreach(py_qa_test_file ${py_qa_test_files})
${CMAKE_SOURCE_DIR}/gruel/src/python
${CMAKE_BINARY_DIR}/gruel/src/swig
${CMAKE_BINARY_DIR}/gnuradio-core/src/python
+ ${CMAKE_BINARY_DIR}/gnuradio-core/src/python/ctrlport
${CMAKE_BINARY_DIR}/gnuradio-core/src/lib/swig
)
set(GR_TEST_TARGET_DEPS volk gruel gnuradio-core)
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_nlog10.py b/gnuradio-core/src/python/gnuradio/gr/qa_nlog10.py
index a87ed87eef..239911851c 100755
--- a/gnuradio-core/src/python/gnuradio/gr/qa_nlog10.py
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_nlog10.py
@@ -20,6 +20,7 @@
# Boston, MA 02110-1301, USA.
#
+import sys, time, random, numpy
from gnuradio import gr, gr_unittest
class test_nlog10(gr_unittest.TestCase):