23 #ifndef INCLUDED_GR_BASIC_BLOCK_H
24 #define INCLUDED_GR_BASIC_BLOCK_H
29 #include <boost/enable_shared_from_this.hpp>
30 #include <boost/function.hpp>
37 #include <boost/foreach.hpp>
38 #include <boost/thread/condition_variable.hpp>
54 typedef boost::function<void(pmt::pmt_t)> msg_handler_t;
59 typedef std::map<pmt::pmt_t , msg_handler_t, pmt::pmt_comperator> d_msg_handlers_t;
60 d_msg_handlers_t d_msg_handlers;
62 typedef std::deque<pmt::pmt_t> msg_queue_t;
63 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::pmt_comperator> msg_queue_map_t;
64 typedef std::map<pmt::pmt_t, msg_queue_t, pmt::pmt_comperator>::iterator msg_queue_map_itr;
65 std::map<pmt::pmt_t, boost::shared_ptr<boost::condition_variable>,
pmt::pmt_comperator> msg_queue_ready;
95 d_input_signature = iosig;
100 d_output_signature = iosig;
113 return (d_msg_handlers.find(which_port) != d_msg_handlers.end());
125 if(has_msg_handler(which_port)) {
126 d_msg_handlers[which_port](msg);
137 std::string
name()
const {
return d_name; }
143 std::string
alias(){
return alias_set()?d_symbol_alias:symbol_name(); }
145 void set_block_alias(std::string
name);
148 void message_port_register_in(
pmt::pmt_t port_id);
149 void message_port_register_out(
pmt::pmt_t port_id);
182 if(msg_queue.find(which_port) == msg_queue.end())
183 throw std::runtime_error(
"port does not exist!");
184 return msg_queue[which_port].empty();
188 BOOST_FOREACH(msg_queue_map_t::value_type &i, msg_queue) {
189 rv &= msg_queue[i.first].empty();
196 if(msg_queue.find(which_port) == msg_queue.end())
197 throw std::runtime_error(
"port does not exist!");
198 return msg_queue[which_port].size();
214 return msg_queue[which_port].begin();
218 msg_queue[which_port].erase(it);
222 if(msg_queue.find(which_port) != msg_queue.end()){
277 if(msg_queue.find(which_port) == msg_queue.end()){
278 throw std::runtime_error(
"attempt to set_msg_handler() on bad input message port!"); }
279 d_msg_handlers[which_port] = msg_handler_t(msg_handler);
285 return lhs->unique_id() < rhs->unique_id();
295 os << basic_block->name() <<
"(" << basic_block->unique_id() <<
")";
GRUEL_API pmt_t pmt_intern(const std::string &s)
Alias for pmt_string_to_symbol.
std::string d_name
Definition: gr_basic_block.h:76
Provide a comparator function object to allow pmt use in stl types.
Definition: pmt.h:854
msg_queue_t::iterator get_iterator(pmt::pmt_t which_port)
Definition: gr_basic_block.h:213
std::string symbol_name() const
Definition: gr_basic_block.h:138
gr_io_signature_sptr input_signature() const
Definition: gr_basic_block.h:139
long d_symbolic_id
Definition: gr_basic_block.h:80
std::vector< gr_basic_block_sptr > gr_basic_block_vector_t
Definition: gr_basic_block.h:288
boost::mutex mutex
Definition: thread.h:44
virtual bool message_port_is_hier_out(pmt::pmt_t port_id)
Definition: gr_basic_block.h:156
void erase_msg(pmt::pmt_t which_port, msg_queue_t::iterator it)
Definition: gr_basic_block.h:217
bool alias_set()
Definition: gr_basic_block.h:142
virtual void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg)
Definition: gr_basic_block.h:122
virtual bool check_topology(int ninputs, int noutputs)
Confirm that ninputs and noutputs is an acceptable combination.
Definition: gr_basic_block.h:245
vcolor d_color
Definition: gr_basic_block.h:83
bool empty_p(pmt::pmt_t which_port)
is the queue empty?
Definition: gr_basic_block.h:181
bool has_msg_handler(pmt::pmt_t which_port)
Tests if there is a handler attached to port which_port.
Definition: gr_basic_block.h:112
Class specializing gr_flat_flowgraph that has all nodes as gr_blocks, with no hierarchy.
Definition: gr_flat_flowgraph.h:39
vcolor
Definition: gr_basic_block.h:74
long unique_id() const
Definition: gr_basic_block.h:135
std::string d_symbol_alias
Definition: gr_basic_block.h:82
#define GR_CORE_API
Definition: gr_core_api.h:30
void set_color(vcolor color)
Allow the flowgraph to set for sorting and partitioning.
Definition: gr_basic_block.h:106
virtual bool message_port_is_hier(pmt::pmt_t port_id)
Definition: gr_basic_block.h:154
std::string d_symbol_name
Definition: gr_basic_block.h:81
std::string name() const
Definition: gr_basic_block.h:137
GR_CORE_API long gr_basic_block_ncurrently_allocated()
std::vector< gr_basic_block_sptr >::iterator gr_basic_block_viter_t
Definition: gr_basic_block.h:289
Definition: gr_basic_block.h:74
std::string alias()
Definition: gr_basic_block.h:143
The body of each thread-per-block thread.
Definition: gr_tpb_thread_body.h:37
GRUEL_API bool pmt_dict_has_key(const pmt_t &dict, const pmt_t &key)
Return true if key exists in dict.
msg_queue_map_t msg_queue
Definition: gr_basic_block.h:84
gr_io_signature_sptr d_input_signature
Definition: gr_basic_block.h:77
void set_output_signature(gr_io_signature_sptr iosig)
may only be called during constructor
Definition: gr_basic_block.h:99
vcolor color() const
Definition: gr_basic_block.h:107
pmt::pmt_t alias_pmt()
Definition: gr_basic_block.h:144
void set_input_signature(gr_io_signature_sptr iosig)
may only be called during constructor
Definition: gr_basic_block.h:94
virtual bool message_port_is_hier_in(pmt::pmt_t port_id)
Definition: gr_basic_block.h:155
The abstract base class for all signal processing blocks.Basic blocks are the bare abstraction of an ...
Definition: gr_basic_block.h:52
VOLK_API void(kern.name) _manual($kern.arglist_full
Call into a specific implementation given by name.
void set_msg_handler(pmt::pmt_t which_port, T msg_handler)
Set the callback that is fired when messages are available.
Definition: gr_basic_block.h:276
bool empty_p()
Definition: gr_basic_block.h:186
long d_unique_id
Definition: gr_basic_block.h:79
gr_io_signature_sptr output_signature() const
Definition: gr_basic_block.h:140
gr_io_signature_sptr d_output_signature
Definition: gr_basic_block.h:78
Accepts messages and inserts them into a message queue, then notifies subclass gr_basic_block there i...
Definition: gr_msg_accepter.h:33
VOLK_API $kern pname $kern name
A function pointer to the dispatcher implementation.
Class representing a directed, acyclic graph of basic blocks.
Definition: gr_flowgraph.h:140
boost::intrusive_ptr< pmt_base > pmt_t
typedef for shared pointer (transparent reference counting). See http://www.boost.org/libs/smart_ptr/smart_ptr.htm
Definition: pmt.h:54
size_t nmsgs(pmt::pmt_t which_port)
How many messages in the queue?
Definition: gr_basic_block.h:195
std::ostream & operator<<(std::ostream &os, gr_basic_block_sptr basic_block)
Definition: gr_basic_block.h:293
bool operator<(gr_basic_block_sptr lhs, gr_basic_block_sptr rhs)
Definition: gr_basic_block.h:283
long symbolic_id() const
Definition: gr_basic_block.h:136
gr_basic_block(void)
Definition: gr_basic_block.h:86
pmt::pmt_t message_subscribers
Definition: gr_basic_block.h:131
virtual bool has_msg_port(pmt::pmt_t which_port)
Definition: gr_basic_block.h:221