diff options
author | ghostop14 <ghostop14@gmail.com> | 2020-01-08 10:00:22 -0800 |
---|---|---|
committer | mormj <34754695+mormj@users.noreply.github.com> | 2020-01-24 21:42:41 -0500 |
commit | ba18d52949436922fef73bb85b36b13d6d510ac4 (patch) | |
tree | ad6bf7e5a3f30b8f0cf64ac9906f4ed35eb812b8 | |
parent | 09c2cf363dd7b32456e27aee92f3ec7649c9d763 (diff) |
Added in/out selector msg ports
Input and output port selection can now be controlled by messages.
-rw-r--r-- | gr-blocks/grc/blocks_selector.block.yml | 8 | ||||
-rw-r--r-- | gr-blocks/lib/selector_impl.cc | 45 | ||||
-rw-r--r-- | gr-blocks/lib/selector_impl.h | 2 |
3 files changed, 54 insertions, 1 deletions
diff --git a/gr-blocks/grc/blocks_selector.block.yml b/gr-blocks/grc/blocks_selector.block.yml index 86a009e6e9..0b8e1ef696 100644 --- a/gr-blocks/grc/blocks_selector.block.yml +++ b/gr-blocks/grc/blocks_selector.block.yml @@ -55,6 +55,14 @@ inputs: id: en optional: true hide: ${ showports } +- domain: message + id: iindex + optional: true + hide: ${ showports } +- domain: message + id: oindex + optional: true + hide: ${ showports } outputs: - domain: stream diff --git a/gr-blocks/lib/selector_impl.cc b/gr-blocks/lib/selector_impl.cc index dafb5f9096..53a5a0992a 100644 --- a/gr-blocks/lib/selector_impl.cc +++ b/gr-blocks/lib/selector_impl.cc @@ -55,7 +55,12 @@ selector_impl::selector_impl(size_t itemsize, message_port_register_in(pmt::mp("en")); set_msg_handler(pmt::mp("en"), [this](pmt::pmt_t msg) { this->handle_enable(msg); }); - // TODO: add message ports for input_index and output_index + message_port_register_in(pmt::mp("iindex")); + set_msg_handler(pmt::mp("iindex"), + [this](pmt::pmt_t msg) { this->handle_msg_input_index(msg); }); + message_port_register_in(pmt::mp("oindex")); + set_msg_handler(pmt::mp("oindex"), + [this](pmt::pmt_t msg) { this->handle_msg_output_index(msg); }); } selector_impl::~selector_impl() {} @@ -78,6 +83,44 @@ void selector_impl::set_output_index(unsigned int output_index) throw std::out_of_range("output_index must be < noutputs"); } +void selector_impl::handle_msg_input_index(pmt::pmt_t msg) +{ + pmt::pmt_t data = pmt::cdr(msg); + + if (pmt::is_integer(data)) { + const unsigned int new_port = pmt::to_long(data); + + if (new_port < d_num_inputs) + set_input_index(new_port); + else + GR_LOG_WARN( + d_logger, + "handle_msg_input_index: port index greater than available ports."); + } else + GR_LOG_WARN( + d_logger, + "handle_msg_input_index: Non-PMT type received, expecting integer PMT"); +} + +void selector_impl::handle_msg_output_index(pmt::pmt_t msg) +{ + pmt::pmt_t data = pmt::cdr(msg); + + if (pmt::is_integer(data)) { + const unsigned int new_port = pmt::to_long(data); + if (new_port < d_num_outputs) + set_output_index(new_port); + else + GR_LOG_WARN( + d_logger, + "handle_msg_output_index: port index greater than available ports."); + } else + GR_LOG_WARN( + d_logger, + "handle_msg_output_index: Non-PMT type received, expecting integer PMT"); +} + + void selector_impl::handle_enable(pmt::pmt_t msg) { if (pmt::is_bool(msg)) { diff --git a/gr-blocks/lib/selector_impl.h b/gr-blocks/lib/selector_impl.h index e11068d805..fe4b36f9f1 100644 --- a/gr-blocks/lib/selector_impl.h +++ b/gr-blocks/lib/selector_impl.h @@ -47,6 +47,8 @@ public: void forecast(int noutput_items, gr_vector_int& ninput_items_required); bool check_topology(int ninputs, int noutputs); void setup_rpc(); + void handle_msg_input_index(pmt::pmt_t msg); + void handle_msg_output_index(pmt::pmt_t msg); void handle_enable(pmt::pmt_t msg); void set_enabled(bool enable) { |