summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/block_gateway_impl.h
diff options
context:
space:
mode:
authorJosh Morman <mormjb@gmail.com>2020-04-23 09:58:59 -0400
committerJosh Morman <mormjb@gmail.com>2020-06-04 10:05:47 -0400
commit0249f7ce0cf5173b946b936c5cd66380afc8bf92 (patch)
tree587f3da2a664c9589fdc7a1d0533a8b76af0c3ec /gnuradio-runtime/lib/block_gateway_impl.h
parent5322a1ff0066bee025b2ea9af550aad4b461d5e0 (diff)
runtime: replace py gateway with pybind11 support, remove feval
Diffstat (limited to 'gnuradio-runtime/lib/block_gateway_impl.h')
-rw-r--r--gnuradio-runtime/lib/block_gateway_impl.h56
1 files changed, 39 insertions, 17 deletions
diff --git a/gnuradio-runtime/lib/block_gateway_impl.h b/gnuradio-runtime/lib/block_gateway_impl.h
index a87f0ec1e5..168a78650e 100644
--- a/gnuradio-runtime/lib/block_gateway_impl.h
+++ b/gnuradio-runtime/lib/block_gateway_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2013 Free Software Foundation, Inc.
+ * Copyright 2013,2020 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -21,12 +21,10 @@ namespace gr {
class block_gateway_impl : public block_gateway
{
public:
- block_gateway_impl(feval_ll* handler,
+ block_gateway_impl(const py::handle& p,
const std::string& name,
gr::io_signature::sptr in_sig,
- gr::io_signature::sptr out_sig,
- const block_gw_work_type work_type,
- const unsigned factor);
+ gr::io_signature::sptr out_sig);
/*******************************************************************
* Overloads for various scheduler-called functions
@@ -38,23 +36,47 @@ public:
gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items);
- int work(int noutput_items,
- gr_vector_const_void_star& input_items,
- gr_vector_void_star& output_items);
-
- int fixed_rate_noutput_to_ninput(int noutput_items);
- int fixed_rate_ninput_to_noutput(int ninput_items);
-
bool start(void);
bool stop(void);
+ void set_msg_handler_pybind(pmt::pmt_t which_port, std::string& handler_name)
+ {
+ if (msg_queue.find(which_port) == msg_queue.end()) {
+ throw std::runtime_error(
+ "attempt to set_msg_handler_pybind() on invalid input message port!");
+ }
+ d_msg_handlers_pybind[which_port] = handler_name;
+ }
+
+protected:
+ // Message handlers back into python using pybind API
+ typedef std::map<pmt::pmt_t, std::string, pmt::comparator> msg_handlers_pybind_t;
+ msg_handlers_pybind_t d_msg_handlers_pybind;
+
+ bool has_msg_handler(pmt::pmt_t which_port)
+ {
+ if (d_msg_handlers_pybind.find(which_port) != d_msg_handlers_pybind.end()) {
+ return true;
+ } else {
+ return gr::basic_block::has_msg_handler(which_port);
+ }
+ }
- block_gw_message_type& block_message(void);
+ void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg)
+ {
+ // Is there a handler?
+ if (d_msg_handlers_pybind.find(which_port) != d_msg_handlers_pybind.end()) {
+ // d_msg_handlers_pybind[which_port]->calleval(msg); // Yes, invoke it.
+ py::gil_scoped_acquire acquire;
+ // std::string handler_name(d_msg_handlers_pybind[which_port]);
+ py::object ret = _py_handle.attr(d_msg_handlers_pybind[which_port].c_str())(msg);
+ } else {
+ // Pass to generic dispatcher if not found
+ gr::basic_block::dispatch_msg(which_port, msg);
+ }
+ }
private:
- feval_ll* _handler;
- block_gw_message_type _message;
- const block_gw_work_type _work_type;
- unsigned _decim, _interp;
+ py::handle _py_handle;
};
} /* namespace gr */