diff options
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 ) |