summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--gnuradio-core/CMakeLists.txt43
-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
-rw-r--r--gr-channels/lib/CMakeLists.txt4
-rw-r--r--gr-channels/lib/channel_model_impl.cc66
-rw-r--r--gr-channels/lib/channel_model_impl.h2
-rw-r--r--gr-digital/lib/CMakeLists.txt9
-rw-r--r--gr-digital/lib/pfb_clock_sync_ccf_impl.cc68
-rw-r--r--gr-digital/lib/pfb_clock_sync_ccf_impl.h17
-rw-r--r--gr-digital/swig/CMakeLists.txt11
-rw-r--r--gr-filter/lib/CMakeLists.txt10
-rw-r--r--gr-wavelet/lib/CMakeLists.txt3
-rw-r--r--grc/blocks/CMakeLists.txt10
-rw-r--r--gruel/src/include/gruel/CMakeLists.txt1
-rw-r--r--gruel/src/lib/msg/CMakeLists.txt1
34 files changed, 513 insertions, 17 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e92ddb6a9e..b0bb0a5d73 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -249,6 +249,7 @@ add_subdirectory(grc)
add_subdirectory(gr-fec)
add_subdirectory(gr-fft)
add_subdirectory(gr-filter)
+#add_subdirectory(gr-ctrlport)
add_subdirectory(gr-analog)
add_subdirectory(gr-digital)
add_subdirectory(gr-atsc)
diff --git a/gnuradio-core/CMakeLists.txt b/gnuradio-core/CMakeLists.txt
index 78b246f4a9..5e08554f0b 100644
--- a/gnuradio-core/CMakeLists.txt
+++ b/gnuradio-core/CMakeLists.txt
@@ -69,6 +69,19 @@ GR_SET_GLOBAL(GNURADIO_CORE_SWIG_INCLUDE_DIRS
)
########################################################################
+# Register controlport component
+########################################################################
+
+FIND_PACKAGE(ICE)
+
+GR_REGISTER_COMPONENT("gr-ctrlport" ENABLE_GR_CTRLPORT
+ Boost_FOUND
+ ICE_FOUND
+ ENABLE_GRUEL
+ ENABLE_GR_CORE
+)
+
+########################################################################
# Begin conditional configuration
########################################################################
if(ENABLE_GR_CORE)
@@ -140,4 +153,34 @@ install(
COMPONENT "core_devel"
)
+
+########################################################################
+# Setup ControlPort preferences file and installation information
+########################################################################
+if(ENABLE_GR_CTRLPORT)
+
+GR_SET_GLOBAL(GR_CTRLPORT_INCLUDE_DIRS
+ ${GR_CTRLPORT_INCLUDE_DIRS}
+ ${ICE_INCLUDE_DIR}
+)
+
+SET(GR_PKG_CTRL_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/ctrlport)
+
+SET(GR_PKG_CTRL_SLICE_DIR ${GR_PKG_DATA_DIR}/ctrlport)
+file(TO_NATIVE_PATH ${CMAKE_INSTALL_PREFIX}/${GR_PKG_CTRL_SLICE_DIR} slicedir)
+
+configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/ctrlport.conf.in
+ ${CMAKE_CURRENT_BINARY_DIR}/ctrlport.conf
+@ONLY)
+
+install(
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/ctrlport.conf
+ DESTINATION ${GR_PREFSDIR}
+ COMPONENT "core_runtime"
+)
+
+endif(ENABLE_GR_CTRLPORT)
+
+
endif(ENABLE_GR_CORE)
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):
diff --git a/gr-channels/lib/CMakeLists.txt b/gr-channels/lib/CMakeLists.txt
index ec3a8b3572..e72d49842f 100644
--- a/gr-channels/lib/CMakeLists.txt
+++ b/gr-channels/lib/CMakeLists.txt
@@ -33,6 +33,10 @@ include_directories(
link_directories(${Boost_LIBRARY_DIRS})
+if(ENABLE_GR_CTRLPORT)
+ GR_ADD_COND_DEF(ENABLE_GR_CTRLPORT)
+endif(ENABLE_GR_CTRLPORT)
+
########################################################################
# Setup library
########################################################################
diff --git a/gr-channels/lib/channel_model_impl.cc b/gr-channels/lib/channel_model_impl.cc
index a9ed06eb53..56cf4f2e52 100644
--- a/gr-channels/lib/channel_model_impl.cc
+++ b/gr-channels/lib/channel_model_impl.cc
@@ -52,6 +52,8 @@ namespace gr {
gr_make_io_signature(1, 1, sizeof(gr_complex)),
gr_make_io_signature(1, 1, sizeof(gr_complex)))
{
+ setup_rpc();
+
d_taps = taps;
while(d_taps.size() < 2) {
d_taps.push_back(0);
@@ -133,5 +135,69 @@ namespace gr {
return d_timing_offset->interp_ratio();
}
+ void
+ channel_model_impl::setup_rpc()
+ {
+#ifdef ENABLE_GR_CTRLPORT
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<channel_model_impl, double>(
+ d_name, "noise", this, unique_id(),
+ &channel_model_impl::noise_voltage,
+ pmt::mp(-10.0f), pmt::mp(10.0f), pmt::mp(0.0f),
+ "", "Noise Voltage",
+ RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<channel_model_impl, double>(
+ d_name, "freq", this, unique_id(),
+ &channel_model_impl::frequency_offset,
+ pmt::mp(-1.0f), pmt::mp(1.0f), pmt::mp(0.0f),
+ "Hz", "Frequency Offset",
+ RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<channel_model_impl, double>(
+ d_name, "timing", this, unique_id(),
+ &channel_model_impl::timing_offset,
+ pmt::mp(0.0), pmt::mp(2.0), pmt::mp(0.0),
+ "", "Timing Offset",
+ RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<channel_model_impl, std::vector<gr_complex> >(
+ d_name, "taps", this, unique_id(),
+ &channel_model_impl::taps,
+ pmt::pmt_make_c32vector(0,-10),
+ pmt::pmt_make_c32vector(0,10),
+ pmt::pmt_make_c32vector(0,0),
+ "", "Multipath taps",
+ RPC_PRIVLVL_MIN, DISPTIMESERIESC)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_set<channel_model_impl, double>(
+ d_name, "noise", this, unique_id(),
+ &channel_model_impl::set_noise_voltage,
+ pmt::mp(-10.0), pmt::mp(10.0), pmt::mp(0.0),
+ "V", "Noise Voltage",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_set<channel_model_impl, double>(
+ d_name, "freq", this, unique_id(),
+ &channel_model_impl::set_frequency_offset,
+ pmt::mp(-1.0), pmt::mp(1.0), pmt::mp(0.0),
+ "Hz", "Frequency Offset",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_set<channel_model_impl, double>(
+ d_name, "timing", this, unique_id(),
+ &channel_model_impl::set_timing_offset,
+ pmt::mp(0.0f), pmt::mp(2.0f), pmt::mp(0.0f),
+ "", "Timing Offset",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+#endif /* ENABLE_GR_CTRLPORT */
+ }
+
} /* namespace channels */
} /* namespace gr */
diff --git a/gr-channels/lib/channel_model_impl.h b/gr-channels/lib/channel_model_impl.h
index 03408dad64..c03a09896b 100644
--- a/gr-channels/lib/channel_model_impl.h
+++ b/gr-channels/lib/channel_model_impl.h
@@ -49,6 +49,8 @@ namespace gr {
std::vector<gr_complex> d_taps;
+ void setup_rpc();
+
public:
channel_model_impl(double noise_voltage,
double frequency_offset,
diff --git a/gr-digital/lib/CMakeLists.txt b/gr-digital/lib/CMakeLists.txt
index 5951d9e004..b25d5754a2 100644
--- a/gr-digital/lib/CMakeLists.txt
+++ b/gr-digital/lib/CMakeLists.txt
@@ -33,6 +33,10 @@ include_directories(
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
+if(ENABLE_GR_CTRLPORT)
+ GR_ADD_COND_DEF(ENABLE_GR_CTRLPORT)
+endif(ENABLE_GR_CTRLPORT)
+
########################################################################
# generate helper scripts to expand templated files
########################################################################
@@ -156,9 +160,10 @@ list(APPEND digital_libs
${Boost_LIBRARIES}
)
+
add_library(gnuradio-digital SHARED ${digital_sources})
target_link_libraries(gnuradio-digital ${digital_libs})
GR_LIBRARY_FOO(gnuradio-digital RUNTIME_COMPONENT "digital_runtime" DEVEL_COMPONENT "digital_devel")
-add_dependencies(gnuradio-digital
+add_dependencies(gnuradio-digital
digital_generated_includes digital_generated_swigs
- gnuradio-filter gnuradio-analog)
+ gnuradio-core gnuradio-filter gnuradio-analog)
diff --git a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc
index 8749567fa2..815ef3cfdd 100644
--- a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc
+++ b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc
@@ -65,6 +65,8 @@ namespace gr {
d_max_dev(max_rate_deviation),
d_osps(osps), d_error(0), d_out_idx(0)
{
+ setup_rpc();
+
d_nfilters = filter_size;
d_sps = floor(sps);
@@ -193,6 +195,24 @@ namespace gr {
return d_rate_f;
}
+ float
+ pfb_clock_sync_ccf_impl::error() const
+ {
+ return d_error;
+ }
+
+ float
+ pfb_clock_sync_ccf_impl::rate() const
+ {
+ return d_rate_f;
+ }
+
+ float
+ pfb_clock_sync_ccf_impl::phase() const
+ {
+ return d_k;
+ }
+
/*******************************************************************
*******************************************************************/
@@ -435,5 +455,53 @@ namespace gr {
return i;
}
+ void
+ pfb_clock_sync_ccf_impl::setup_rpc()
+ {
+#ifdef ENABLE_GR_CTRLPORT
+ // Getters
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<pfb_clock_sync_ccf_impl, float>(
+ d_name, "error", this, unique_id(),
+ &pfb_clock_sync_ccf_impl::error,
+ pmt::mp(-2.0f), pmt::mp(2.0f), pmt::mp(0.0f),
+ "", "Error signal of loop",
+ RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<pfb_clock_sync_ccf_impl, float>(
+ d_name, "rate", this, unique_id(),
+ &pfb_clock_sync_ccf_impl::rate,
+ pmt::mp(-2.0f), pmt::mp(2.0f), pmt::mp(0.0f),
+ "", "Rate change of phase",
+ RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<pfb_clock_sync_ccf_impl, float>(
+ d_name, "phase", this, unique_id(),
+ &pfb_clock_sync_ccf_impl::phase,
+ pmt::mp(0), pmt::mp((int)d_nfilters), pmt::mp(0),
+ "", "Current filter phase arm",
+ RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<pfb_clock_sync_ccf_impl, float>(
+ d_name, "loop bw", this, unique_id(),
+ &pfb_clock_sync_ccf_impl::loop_bandwidth,
+ pmt::mp(0.0f), pmt::mp(1.0f), pmt::mp(0.0f),
+ "", "Loop bandwidth",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+
+ // Setters
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_set<pfb_clock_sync_ccf_impl, float>(
+ d_name, "loop bw", this, unique_id(),
+ &pfb_clock_sync_ccf_impl::set_loop_bandwidth,
+ pmt::mp(0.0f), pmt::mp(1.0f), pmt::mp(0.0f),
+ "", "Loop bandwidth",
+ RPC_PRIVLVL_MIN, DISPNULL)));
+#endif /* ENABLE_GR_CTRLPORT */
+ }
+
} /* namespace digital */
} /* namespace gr */
diff --git a/gr-digital/lib/pfb_clock_sync_ccf_impl.h b/gr-digital/lib/pfb_clock_sync_ccf_impl.h
index 16cf80f046..e5eef37645 100644
--- a/gr-digital/lib/pfb_clock_sync_ccf_impl.h
+++ b/gr-digital/lib/pfb_clock_sync_ccf_impl.h
@@ -58,6 +58,8 @@ namespace gr {
float d_error;
int d_out_idx;
+ void setup_rpc();
+
void create_diff_taps(const std::vector<float> &newtaps,
std::vector<float> &difftaps);
@@ -98,6 +100,21 @@ namespace gr {
float beta() const;
float clock_rate() const;
+ /*!
+ * \brief Returns the current error of the control loop.
+ */
+ float error() const;
+
+ /*!
+ * \brief Returns the current rate of the control loop.
+ */
+ float rate() const;
+
+ /*!
+ * \brief Returns the current phase arm of the control loop.
+ */
+ float phase() const;
+
/*******************************************************************
*******************************************************************/
diff --git a/gr-digital/swig/CMakeLists.txt b/gr-digital/swig/CMakeLists.txt
index 5ec34008aa..58b95fa69b 100644
--- a/gr-digital/swig/CMakeLists.txt
+++ b/gr-digital/swig/CMakeLists.txt
@@ -30,6 +30,17 @@ set(GR_SWIG_INCLUDE_DIRS
${GNURADIO_CORE_SWIG_INCLUDE_DIRS}
)
+set(GR_SWIG_LIBRARIES gnuradio-digital gnuradio-filter)
+
+if(ENABLE_GR_CTRLPORT)
+ set(GR_SWIG_INCLUDE_DIRS ${GR_SWIG_INCLUDE_DIRS}
+ ${GR_CTRLPORT_INCLUDE_DIRS}
+ )
+
+ set(GR_SWIG_LIBRARIES ${GR_SWIG_LIBRARIES} gnuradio-ctrlport)
+endif(ENABLE_GR_CTRLPORT)
+
+set(GR_SWIG_TARGET_DEPS digital_generated_includes core_swig)
set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/digital_swig_doc.i)
set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
diff --git a/gr-filter/lib/CMakeLists.txt b/gr-filter/lib/CMakeLists.txt
index bf505035d3..29cefb0415 100644
--- a/gr-filter/lib/CMakeLists.txt
+++ b/gr-filter/lib/CMakeLists.txt
@@ -101,6 +101,10 @@ include_directories(
link_directories(${Boost_LIBRARY_DIRS})
+if(ENABLE_GR_CTRLPORT)
+ GR_ADD_COND_DEF(ENABLE_GR_CTRLPORT)
+endif(ENABLE_GR_CTRLPORT)
+
########################################################################
# Setup library
########################################################################
@@ -143,11 +147,13 @@ list(APPEND filter_libs
${Boost_LIBRARIES}
)
+
add_library(gnuradio-filter SHARED ${filter_sources})
target_link_libraries(gnuradio-filter ${filter_libs})
GR_LIBRARY_FOO(gnuradio-filter RUNTIME_COMPONENT "filter_runtime" DEVEL_COMPONENT "filter_devel")
-add_dependencies(gnuradio-filter gnuradio-fft filter_generated_includes filter_generated_swigs)
-
+add_dependencies(gnuradio-filter
+ filter_generated_includes filter_generated_swigs
+ gnuradio-core gnuradio-fft)
########################################################################
# QA C++ Code for gr-filter
diff --git a/gr-wavelet/lib/CMakeLists.txt b/gr-wavelet/lib/CMakeLists.txt
index 2d4382b765..3a14dab5e2 100644
--- a/gr-wavelet/lib/CMakeLists.txt
+++ b/gr-wavelet/lib/CMakeLists.txt
@@ -53,3 +53,6 @@ list(APPEND wavelet_libs
add_library(gnuradio-wavelet SHARED ${gr_wavelet_sources})
target_link_libraries(gnuradio-wavelet ${wavelet_libs})
GR_LIBRARY_FOO(gnuradio-wavelet RUNTIME_COMPONENT "wavelet_runtime" DEVEL_COMPONENT "wavelet_devel")
+add_dependencies(gnuradio-wavelet
+ wavelet_generated_includes wavelet_generated_swigs
+ gnuradio-core)
diff --git a/grc/blocks/CMakeLists.txt b/grc/blocks/CMakeLists.txt
index fce4a19071..879c69a8ec 100644
--- a/grc/blocks/CMakeLists.txt
+++ b/grc/blocks/CMakeLists.txt
@@ -19,4 +19,14 @@
########################################################################
file(GLOB xml_files "*.xml")
+
+# Force out the controlport GRC blocks if we've disabled it.
+if(NOT ENABLE_GR_CTRLPORT)
+ list(REMOVE_ITEM xml_files
+ ${CMAKE_CURRENT_SOURCE_DIR}/gr_ctrlport_viewer.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/gr_ctrlport_probe_c.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/gr_ctrlport_probe2_c.xml
+ )
+endif(NOT ENABLE_GR_CTRLPORT)
+
install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "grc")
diff --git a/gruel/src/include/gruel/CMakeLists.txt b/gruel/src/include/gruel/CMakeLists.txt
index d4c36eddbb..f84c23bb50 100644
--- a/gruel/src/include/gruel/CMakeLists.txt
+++ b/gruel/src/include/gruel/CMakeLists.txt
@@ -26,6 +26,7 @@ install(FILES
high_res_timer.h
msg_accepter.h
msg_accepter_msgq.h
+ msg_producer.h
msg_queue.h
msg_passing.h
pmt.h
diff --git a/gruel/src/lib/msg/CMakeLists.txt b/gruel/src/lib/msg/CMakeLists.txt
index 74010af7e4..b8167fff34 100644
--- a/gruel/src/lib/msg/CMakeLists.txt
+++ b/gruel/src/lib/msg/CMakeLists.txt
@@ -24,5 +24,6 @@
list(APPEND gruel_sources
${CMAKE_CURRENT_SOURCE_DIR}/msg_accepter.cc
${CMAKE_CURRENT_SOURCE_DIR}/msg_accepter_msgq.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/msg_producer.cc
${CMAKE_CURRENT_SOURCE_DIR}/msg_queue.cc
)