summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorghostop14 <ghostop14@gmail.com>2020-01-08 10:00:22 -0800
committermormj <34754695+mormj@users.noreply.github.com>2020-01-24 21:42:41 -0500
commitba18d52949436922fef73bb85b36b13d6d510ac4 (patch)
treead6bf7e5a3f30b8f0cf64ac9906f4ed35eb812b8
parent09c2cf363dd7b32456e27aee92f3ec7649c9d763 (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.yml8
-rw-r--r--gr-blocks/lib/selector_impl.cc45
-rw-r--r--gr-blocks/lib/selector_impl.h2
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)
{