GNU Radio Manual and C++ API Reference  3.7.13.4
The Free & Open Software Radio Ecosystem
block_gateway.h
Go to the documentation of this file.
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2011-2013,2017 Free Software Foundation, Inc.
4  *
5  * This file is part of GNU Radio
6  *
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  *
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING. If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef INCLUDED_RUNTIME_BLOCK_GATEWAY_H
24 #define INCLUDED_RUNTIME_BLOCK_GATEWAY_H
25 
26 #include <gnuradio/api.h>
27 #include <gnuradio/block.h>
28 #include <gnuradio/feval.h>
29 
30 namespace gr {
31 
32  /*!
33  * The work type enum tells the gateway what kind of block to
34  * implement. The choices are familiar gnuradio block overloads
35  * (sync, decim, interp).
36  */
42  };
43 
44  //! Magic return values from general_work, \ref gr::block::WORK_CALLED_PRODUCE
47  WORK_DONE = -1
48  };
50  TPP_DONT = 0,
54  };
55 
56  /*!
57  * Shared message structure between python and gateway.
58  * Each action type represents a scheduler-called function.
59  */
61  enum action_type {
62  ACTION_GENERAL_WORK, //dispatch work
63  ACTION_WORK, //dispatch work
64  ACTION_FORECAST, //dispatch forecast
65  ACTION_START, //dispatch start
66  ACTION_STOP, //dispatch stop
67  };
68 
70 
73  std::vector<void *> general_work_args_input_items; //TODO this should be const void*, but swig can't int cast it right
74  std::vector<void *> general_work_args_output_items;
76 
79  std::vector<void *> work_args_input_items; //TODO this should be const void*, but swig can't int cast it right
80  std::vector<void *> work_args_output_items;
82 
85 
87 
89  };
90 
91  /*!
92  * The gateway block which performs all the magic.
93  *
94  * The gateway provides access to all the gr::block routines.
95  * The methods prefixed with gr::block__ are renamed
96  * to class methods without the prefix in python.
97  */
98  class GR_RUNTIME_API block_gateway : virtual public gr::block
99  {
100  public:
101  // gr::block_gateway::sptr
102  typedef boost::shared_ptr<block_gateway> sptr;
103 
104  /*!
105  * Make a new gateway block.
106  * \param handler the swig director object with callback
107  * \param name the name of the block (Ex: "Shirley")
108  * \param in_sig the input signature for this block
109  * \param out_sig the output signature for this block
110  * \param work_type the type of block overload to implement
111  * \param factor the decimation or interpolation factor
112  * \return a new gateway block
113  */
114  static sptr make(gr::feval_ll *handler,
115  const std::string &name,
116  gr::io_signature::sptr in_sig,
117  gr::io_signature::sptr out_sig,
118  const block_gw_work_type work_type,
119  const unsigned factor);
120 
121  //! Provide access to the shared message object
122  virtual block_gw_message_type &block_message(void) = 0;
123 
124  long block__unique_id(void) const {
125  return gr::block::unique_id();
126  }
127 
128  std::string block__name(void) const {
129  return gr::block::name();
130  }
131 
132  unsigned block__history(void) const {
133  return gr::block::history();
134  }
135 
136  void block__set_history(unsigned history) {
137  return gr::block::set_history(history);
138  }
139 
140  void block__set_fixed_rate(bool fixed_rate) {
141  return gr::block::set_fixed_rate(fixed_rate);
142  }
143 
144  bool block__fixed_rate(void) const {
145  return gr::block::fixed_rate();
146  }
147 
148  void block__set_output_multiple(int multiple) {
149  return gr::block::set_output_multiple(multiple);
150  }
151 
152  void block__set_min_output_buffer(int port, long size) {
153  return gr::block::set_min_output_buffer(port, size);
154  }
155 
158  }
159 
160  int block__output_multiple(void) const {
162  }
163 
164  void block__consume(int which_input, int how_many_items) {
165  return gr::block::consume(which_input, how_many_items);
166  }
167 
168  void block__consume_each(int how_many_items) {
169  return gr::block::consume_each(how_many_items);
170  }
171 
172  void block__produce(int which_output, int how_many_items) {
173  return gr::block::produce(which_output, how_many_items);
174  }
175 
176  void block__set_relative_rate(double relative_rate) {
177  return gr::block::set_relative_rate(relative_rate);
178  }
179 
180  double block__relative_rate(void) const {
181  return gr::block::relative_rate();
182  }
183 
184  uint64_t block__nitems_read(unsigned int which_input) {
185  return gr::block::nitems_read(which_input);
186  }
187 
188  uint64_t block__nitems_written(unsigned int which_output) {
189  return gr::block::nitems_written(which_output);
190  }
191 
194  }
195 
198  }
199 
200  void block__add_item_tag(unsigned int which_output,
201  const tag_t &tag)
202  {
203  return gr::block::add_item_tag(which_output, tag);
204  }
205 
206  void block__add_item_tag(unsigned int which_output,
207  uint64_t abs_offset,
208  const pmt::pmt_t &key,
209  const pmt::pmt_t &value,
210  const pmt::pmt_t &srcid=pmt::PMT_F)
211  {
212  return gr::block::add_item_tag(which_output, abs_offset,
213  key, value, srcid);
214  }
215 
216  std::vector<tag_t> block__get_tags_in_range(unsigned int which_input,
217  uint64_t abs_start,
218  uint64_t abs_end)
219  {
220  std::vector<gr::tag_t> tags;
221  gr::block::get_tags_in_range(tags, which_input, abs_start, abs_end);
222  return tags;
223  }
224 
225  std::vector<tag_t> block__get_tags_in_range(unsigned int which_input,
226  uint64_t abs_start,
227  uint64_t abs_end,
228  const pmt::pmt_t &key)
229  {
230  std::vector<gr::tag_t> tags;
231  gr::block::get_tags_in_range(tags, which_input, abs_start, abs_end, key);
232  return tags;
233  }
234 
235  std::vector<tag_t> block__get_tags_in_window(unsigned int which_input,
236  uint64_t rel_start,
237  uint64_t rel_end)
238  {
239  std::vector<gr::tag_t> tags;
240  gr::block::get_tags_in_window(tags, which_input, rel_start, rel_end);
241  return tags;
242  }
243 
244  std::vector<tag_t> block__get_tags_in_window(unsigned int which_input,
245  uint64_t rel_start,
246  uint64_t rel_end,
247  const pmt::pmt_t &key)
248  {
249  std::vector<gr::tag_t> tags;
250  gr::block::get_tags_in_window(tags, which_input, rel_start, rel_end, key);
251  return tags;
252  }
253 
254  /* Message passing interface */
257  }
258 
261  }
262 
264  gr::basic_block::message_port_pub(port_id, msg);
265  }
266 
268  gr::basic_block::message_port_sub(port_id, target);
269  }
270 
272  gr::basic_block::message_port_unsub(port_id, target);
273  }
274 
276  return gr::basic_block::message_subscribers(which_port);
277  }
278 
281  }
282 
285  }
286 
288  {
289  if(msg_queue.find(which_port) == msg_queue.end()) {
290  throw std::runtime_error("attempt to set_msg_handler_feval() on bad input message port!");
291  }
292  d_msg_handlers_feval[which_port] = msg_handler;
293  }
294 
295  protected:
296  typedef std::map<pmt::pmt_t, feval_p *, pmt::comparator> msg_handlers_feval_t;
297  msg_handlers_feval_t d_msg_handlers_feval;
298 
299  bool has_msg_handler(pmt::pmt_t which_port)
300  {
301  return (d_msg_handlers_feval.find(which_port) != d_msg_handlers_feval.end());
302  }
303 
304  void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg)
305  {
306  // Is there a handler?
307  if(d_msg_handlers_feval.find(which_port) != d_msg_handlers_feval.end()) {
308  d_msg_handlers_feval[which_port]->calleval(msg); // Yes, invoke it.
309  }
310  else {
311  // Pass to generic dispatcher if not found
312  gr::basic_block::dispatch_msg(which_port, msg);
313  }
314  }
315  };
316 
317 } /* namespace gr */
318 
319 #endif /* INCLUDED_RUNTIME_BLOCK_GATEWAY_H */
int general_work_args_return_value
Definition: block_gateway.h:75
boost::shared_ptr< io_signature > sptr
Definition: io_signature.h:45
void produce(int which_output, int how_many_items)
Tell the scheduler how_many_items were produced on output stream which_output.
Definition: tags.h:31
void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg)
Definition: block_gateway.h:304
void block__set_min_output_buffer(int port, long size)
Definition: block_gateway.h:152
bool stop_args_return_value
Definition: block_gateway.h:88
block::tag_propagation_policy_t block__tag_propagation_policy(void)
Definition: block_gateway.h:192
action_type action
Definition: block_gateway.h:69
Definition: block_gateway.h:66
Definition: block_gateway.h:41
pmt::pmt_t message_ports_out()
Get output message port names.
unsigned block__history(void) const
Definition: block_gateway.h:132
void block__set_tag_propagation_policy(block::tag_propagation_policy_t p)
Definition: block_gateway.h:196
void set_fixed_rate(bool fixed_rate)
Definition: block.h:693
void add_item_tag(unsigned int which_output, uint64_t abs_offset, const pmt::pmt_t &key, const pmt::pmt_t &value, const pmt::pmt_t &srcid=pmt::PMT_F)
Adds a new tag onto the given output buffer.
Definition: block.h:705
void set_min_output_buffer(long min_output_buffer)
Request limit on the minimum buffer size on all output ports.
Definition: block_gateway.h:65
bool block__fixed_rate(void) const
Definition: block_gateway.h:144
Definition: block_gateway.h:53
void set_relative_rate(double relative_rate)
Set the approximate output rate / input rate.
void set_history(unsigned history)
std::vector< tag_t > block__get_tags_in_window(unsigned int which_input, uint64_t rel_start, uint64_t rel_end, const pmt::pmt_t &key)
Definition: block_gateway.h:244
base class for evaluating a function: long -> longThis class is designed to be subclassed in Python o...
Definition: feval.h:104
tag_propagation_policy_t tag_propagation_policy()
Asks for the policy used by the scheduler to moved tags downstream.
#define PMT_F
Definition: pmt.h:105
long block__unique_id(void) const
Definition: block_gateway.h:124
block_gw_work_type
Definition: block_gateway.h:37
void message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg)
uint64_t block__nitems_read(unsigned int which_input)
Definition: block_gateway.h:184
Definition: block_gateway.h:38
std::vector< void * > work_args_input_items
Definition: block_gateway.h:79
std::vector< int > forecast_args_ninput_items_required
Definition: block_gateway.h:84
void block__set_output_multiple(int multiple)
Definition: block_gateway.h:148
std::vector< tag_t > block__get_tags_in_range(unsigned int which_input, uint64_t abs_start, uint64_t abs_end)
Definition: block_gateway.h:216
bool has_msg_handler(pmt::pmt_t which_port)
Tests if there is a handler attached to port which_port.
Definition: block_gateway.h:299
std::string name() const
Definition: basic_block.h:148
int general_work_args_noutput_items
Definition: block_gateway.h:71
void message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target)
#define GR_RUNTIME_API
Definition: gnuradio-runtime/include/gnuradio/api.h:30
void set_tag_propagation_policy(tag_propagation_policy_t p)
Set the policy by the scheduler to determine how tags are moved downstream.
boost::shared_ptr< block_gateway > sptr
Definition: block_gateway.h:102
Definition: block_gateway.h:39
uint64_t nitems_read(unsigned int which_input)
Return the number of items read on input stream which_input.
Definition: block_gateway.h:60
uint64_t block__nitems_written(unsigned int which_output)
Definition: block_gateway.h:188
void block__produce(int which_output, int how_many_items)
Definition: block_gateway.h:172
Definition: block_gateway.h:46
double block__relative_rate(void) const
Definition: block_gateway.h:180
Definition: block_gateway.h:47
msg_handlers_feval_t d_msg_handlers_feval
Definition: block_gateway.h:297
void message_port_register_in(pmt::pmt_t port_id)
long unique_id() const
Definition: basic_block.h:144
block_gw_work_return_type
Magic return values from general_work, gr::block::WORK_CALLED_PRODUCE.
Definition: block_gateway.h:45
pmt::pmt_t block__message_subscribers(pmt::pmt_t which_port)
Definition: block_gateway.h:275
uint64_t nitems_written(unsigned int which_output)
Return the number of items written on output stream which_output.
Definition: block_gateway.h:51
thread-safe message queue
Definition: msg_queue.h:36
void block__set_min_output_buffer(long size)
Definition: block_gateway.h:156
void block__consume_each(int how_many_items)
Definition: block_gateway.h:168
int work_args_return_value
Definition: block_gateway.h:81
void block__set_fixed_rate(bool fixed_rate)
Definition: block_gateway.h:140
Include this header to use the message passing features.
Definition: logger.h:695
void consume(int which_input, int how_many_items)
Tell the scheduler how_many_items of input stream which_input were consumed.
void block__add_item_tag(unsigned int which_output, uint64_t abs_offset, const pmt::pmt_t &key, const pmt::pmt_t &value, const pmt::pmt_t &srcid=pmt::PMT_F)
Definition: block_gateway.h:206
Definition: block_gateway.h:40
bool fixed_rate() const
Return true if this block has a fixed input to output rate.
Definition: block.h:141
void set_output_multiple(int multiple)
Constrain the noutput_items argument passed to forecast and general_work.
int forecast_args_noutput_items
Definition: block_gateway.h:83
int block__output_multiple(void) const
Definition: block_gateway.h:160
void block__consume(int which_input, int how_many_items)
Definition: block_gateway.h:164
std::map< pmt::pmt_t, feval_p *, pmt::comparator > msg_handlers_feval_t
Definition: block_gateway.h:296
void block__message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target)
Definition: block_gateway.h:271
std::vector< void * > general_work_args_output_items
Definition: block_gateway.h:74
Definition: block_gateway.h:64
tag_propagation_policy_t
enum to represent different tag propagation policies.
Definition: block.h:78
void message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target)
std::vector< void * > general_work_args_input_items
Definition: block_gateway.h:73
Definition: block_gateway.h:63
int work_args_ninput_items
Definition: block_gateway.h:77
void get_tags_in_window(std::vector< tag_t > &v, unsigned int which_input, uint64_t rel_start, uint64_t rel_end)
Gets all tags within the relative window of the current call to work.
std::vector< int > general_work_args_ninput_items
Definition: block_gateway.h:72
Definition: block_gateway.h:50
pmt::pmt_t block__message_ports_out()
Definition: block_gateway.h:283
pmt::pmt_t message_ports_in()
Get input message port names.
int work_args_noutput_items
Definition: block_gateway.h:78
unsigned history() const
base class for evaluating a function: pmt -> voidThis class is designed to be subclassed in Python or...
Definition: feval.h:162
void set_msg_handler_feval(pmt::pmt_t which_port, gr::feval_p *msg_handler)
Definition: block_gateway.h:287
pmt::pmt_t block__message_ports_in()
Definition: block_gateway.h:279
Definition: block_gateway.h:52
void block__message_port_register_out(pmt::pmt_t port_id)
Definition: block_gateway.h:259
void block__add_item_tag(unsigned int which_output, const tag_t &tag)
Definition: block_gateway.h:200
action_type
Definition: block_gateway.h:61
double relative_rate() const
return the approximate output rate / input rate
Definition: block.h:286
void get_tags_in_range(std::vector< tag_t > &v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end)
Given a [start,end), returns a vector of all tags in the range.
void block__set_history(unsigned history)
Definition: block_gateway.h:136
void block__message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg)
Definition: block_gateway.h:263
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:56
std::vector< void * > work_args_output_items
Definition: block_gateway.h:80
virtual void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg)
Definition: basic_block.h:130
The abstract base class for all &#39;terminal&#39; processing blocks.A signal processing flow is constructed ...
Definition: block.h:65
tag_propagation_policy_t
Definition: block_gateway.h:49
bool start_args_return_value
Definition: block_gateway.h:86
std::string block__name(void) const
Definition: block_gateway.h:128
std::vector< tag_t > block__get_tags_in_range(unsigned int which_input, uint64_t abs_start, uint64_t abs_end, const pmt::pmt_t &key)
Definition: block_gateway.h:225
std::vector< tag_t > block__get_tags_in_window(unsigned int which_input, uint64_t rel_start, uint64_t rel_end)
Definition: block_gateway.h:235
void block__message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target)
Definition: block_gateway.h:267
void message_port_register_out(pmt::pmt_t port_id)
pmt::pmt_t message_subscribers(pmt::pmt_t port)
Definition: block_gateway.h:98
void consume_each(int how_many_items)
Tell the scheduler how_many_items were consumed on each input stream.
void block__set_relative_rate(double relative_rate)
Definition: block_gateway.h:176
void block__message_port_register_in(pmt::pmt_t port_id)
Definition: block_gateway.h:255
int output_multiple() const
Definition: block.h:212
abstract class of message handlers
Definition: msg_handler.h:38