diff options
Diffstat (limited to 'gr-blocks/lib/selector_impl.cc')
-rw-r--r-- | gr-blocks/lib/selector_impl.cc | 45 |
1 files changed, 44 insertions, 1 deletions
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)) { |