23#ifndef INCLUDED_GR_BASIC_BLOCK_H
24#define INCLUDED_GR_BASIC_BLOCK_H
32#include <boost/enable_shared_from_this.hpp>
33#include <boost/foreach.hpp>
34#include <boost/function.hpp>
35#include <boost/thread/condition_variable.hpp>
36#if (BOOST_VERSION >= 106000)
37#include <boost/bind/bind.hpp>
47#if (BOOST_VERSION >= 106000)
48using namespace boost::placeholders;
62 public boost::enable_shared_from_this<basic_block>
64 typedef boost::function<void(
pmt::pmt_t)> msg_handler_t;
67 typedef std::map<pmt::pmt_t, msg_handler_t, pmt::comparator> d_msg_handlers_t;
68 d_msg_handlers_t d_msg_handlers;
70 typedef std::deque<pmt::pmt_t> msg_queue_t;
71 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::comparator> msg_queue_map_t;
72 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::comparator>::iterator
74 std::map<pmt::pmt_t, boost::shared_ptr<boost::condition_variable>,
pmt::comparator>
81 friend class flat_flowgraph;
82 friend class tpb_thread_body;
112 d_output_signature = iosig;
126 return (d_msg_handlers.find(which_port) != d_msg_handlers.end());
138 if (has_msg_handler(which_port)) {
139 d_msg_handlers[which_port](msg);
153 std::string
name()
const {
return d_name; }
163 return this->name() +
"(" + std::to_string(this->unique_id()) +
")";
173 bool alias_set()
const {
return !d_symbol_alias.empty(); }
178 std::string
alias()
const {
return alias_set() ? d_symbol_alias : symbol_name(); }
240 throw std::runtime_error(
"port does not exist!");
246 BOOST_FOREACH (msg_queue_map_t::value_type& i,
msg_queue) {
255 return (empty_p(which_port) || !has_msg_handler(which_port));
260 BOOST_FOREACH (msg_queue_map_t::value_type& i,
msg_queue) {
261 rv &= empty_handled_p(i.first);
270 throw std::runtime_error(
"port does not exist!");
317 void add_rpc_variable(rpcbasic_sptr s) { d_rpc_vars.push_back(s); }
390 template <
typename T>
394 throw std::runtime_error(
395 "attempt to set_msg_handler() on bad input message port!");
397 d_msg_handlers[which_port] = msg_handler_t(
msg_handler);
411inline bool operator<(basic_block_sptr lhs, basic_block_sptr rhs)
413 return lhs->unique_id() < rhs->unique_id();
The abstract base class for all signal processing blocks.
Definition basic_block.h:63
gr::io_signature::sptr input_signature() const
Definition basic_block.h:166
bool empty_handled_p(pmt::pmt_t which_port)
are all msg ports with handlers empty?
Definition basic_block.h:253
bool is_rpc_set()
Ask if this block has been registered to the RPC.
Definition basic_block.h:336
pmt::pmt_t message_subscribers(pmt::pmt_t port)
virtual bool message_port_is_hier_out(pmt::pmt_t port_id)
Definition basic_block.h:209
void set_color(vcolor color)
Allow the flowgraph to set for sorting and partitioning.
Definition basic_block.h:118
std::string d_symbol_alias
Definition basic_block.h:92
long unique_id() const
Definition basic_block.h:149
const msg_queue_map_t & get_msg_map(void) const
Definition basic_block.h:302
msg_queue_t::iterator get_iterator(pmt::pmt_t which_port)
Definition basic_block.h:281
void message_port_register_in(pmt::pmt_t port_id)
void set_input_signature(gr::io_signature::sptr iosig)
may only be called during constructor
Definition basic_block.h:107
basic_block(const std::string &name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature)
Protected constructor prevents instantiation by non-derived classes.
void message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg)
size_t nmsgs(pmt::pmt_t which_port)
How many messages in the queue?
Definition basic_block.h:267
virtual void set_processor_affinity(const std::vector< int > &mask)=0
virtual bool message_port_is_hier_in(pmt::pmt_t port_id)
Definition basic_block.h:204
msg_queue_map_t msg_queue
Definition basic_block.h:96
basic_block(void)
Definition basic_block.h:99
long d_symbolic_id
Definition basic_block.h:90
virtual std::vector< int > processor_affinity()=0
bool empty_handled_p()
Definition basic_block.h:257
virtual std::string log_level()=0
void set_output_signature(gr::io_signature::sptr iosig)
may only be called during constructor
Definition basic_block.h:110
std::string identifier() const
Definition basic_block.h:161
long symbolic_id() const
Definition basic_block.h:150
pmt::pmt_t alias_pmt() const
Definition basic_block.h:183
virtual void setup_rpc()
Set up the RPC registered variables.
Definition basic_block.h:328
void set_msg_handler(pmt::pmt_t which_port, T msg_handler)
Set the callback that is fired when messages are available.
Definition basic_block.h:391
basic_block_sptr to_basic_block()
gr::io_signature::sptr d_output_signature
Definition basic_block.h:88
gr::io_signature::sptr d_input_signature
Definition basic_block.h:87
virtual bool message_port_is_hier(pmt::pmt_t port_id)
Definition basic_block.h:199
long d_unique_id
Definition basic_block.h:89
virtual bool has_msg_port(pmt::pmt_t which_port)
Definition basic_block.h:291
bool d_rpc_set
Definition basic_block.h:94
virtual void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg)
Definition basic_block.h:135
std::string symbol_name() const
Definition basic_block.h:160
std::string alias() const
Definition basic_block.h:178
void _post(pmt::pmt_t which_port, pmt::pmt_t msg)
bool alias_set() const
Definition basic_block.h:173
void message_port_register_out(pmt::pmt_t port_id)
void rpc_set()
When the block is registered with the RPC, set this.
Definition basic_block.h:341
virtual void unset_processor_affinity()=0
vcolor
Definition basic_block.h:84
virtual bool has_msg_handler(pmt::pmt_t which_port)
Tests if there is a handler attached to port which_port.
Definition basic_block.h:124
virtual bool check_topology(int ninputs, int noutputs)
Confirm that ninputs and noutputs is an acceptable combination.
Definition basic_block.h:356
void insert_tail(pmt::pmt_t which_port, pmt::pmt_t msg)
void erase_msg(pmt::pmt_t which_port, msg_queue_t::iterator it)
Definition basic_block.h:286
void set_block_alias(std::string name)
void message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target)
pmt::pmt_t message_ports_out()
Get output message port names.
std::string d_name
Definition basic_block.h:86
void message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target)
virtual void set_log_level(std::string level)=0
gr::io_signature::sptr output_signature() const
Definition basic_block.h:167
std::vector< rpcbasic_sptr > d_rpc_vars
Definition basic_block.h:97
vcolor color() const
Definition basic_block.h:119
pmt::pmt_t message_ports_in()
Get input message port names.
bool empty_p(pmt::pmt_t which_port)
is the queue empty?
Definition basic_block.h:237
bool empty_p()
Definition basic_block.h:243
pmt::pmt_t d_message_subscribers
Definition basic_block.h:144
std::string name() const
Definition basic_block.h:153
std::string d_symbol_name
Definition basic_block.h:91
pmt::pmt_t delete_head_nowait(pmt::pmt_t which_port)
vcolor d_color
Definition basic_block.h:93
Class representing a directed, acyclic graph of basic blocks.
Definition flowgraph.h:163
boost::shared_ptr< io_signature > sptr
Definition io_signature.h:46
Accepts messages and inserts them into a message queue, then notifies subclass gr::basic_block there ...
Definition msg_accepter.h:36
abstract class of message handlers
Definition msg_handler.h:39
thread-safe message queue
Definition msg_queue.h:37
Provide a comparator function object to allow pmt use in stl types.
Definition pmt.h:999
#define GR_RUNTIME_API
Definition gnuradio-runtime/include/gnuradio/api.h:30
boost::mutex mutex
Definition thread.h:48
GNU Radio logging wrapper for log4cpp library (C++ port of log4j)
Definition basic_block.h:46
std::vector< basic_block_sptr > basic_block_vector_t
Definition basic_block.h:416
std::ostream & operator<<(std::ostream &os, basic_block_sptr basic_block)
Definition basic_block.h:421
bool operator<(basic_block_sptr lhs, basic_block_sptr rhs)
Definition basic_block.h:411
std::vector< basic_block_sptr >::iterator basic_block_viter_t
Definition basic_block.h:417
GR_RUNTIME_API long basic_block_ncurrently_allocated()
PMT_API bool dict_has_key(const pmt_t &dict, const pmt_t &key)
Return true if key exists in dict.
PMT_API pmt_t intern(const std::string &s)
Alias for pmt_string_to_symbol.
boost::shared_ptr< pmt_base > pmt_t
typedef for shared pointer (transparent reference counting). See http://www.boost....
Definition pmt.h:96