diff options
-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) { |