diff options
-rw-r--r-- | gr-blocks/grc/blocks_delay.block.yml | 3 | ||||
-rw-r--r-- | gr-blocks/lib/delay_impl.cc | 26 | ||||
-rw-r--r-- | gr-blocks/lib/delay_impl.h | 2 |
3 files changed, 28 insertions, 3 deletions
diff --git a/gr-blocks/grc/blocks_delay.block.yml b/gr-blocks/grc/blocks_delay.block.yml index ac9cb182b7..d5b43704c6 100644 --- a/gr-blocks/grc/blocks_delay.block.yml +++ b/gr-blocks/grc/blocks_delay.block.yml @@ -31,6 +31,9 @@ inputs: dtype: ${ type } vlen: ${ vlen } multiplicity: ${ num_ports } +- domain: message + id: dly + optional: true outputs: - domain: stream diff --git a/gr-blocks/lib/delay_impl.cc b/gr-blocks/lib/delay_impl.cc index 6162c7b87a..97e3ecf92f 100644 --- a/gr-blocks/lib/delay_impl.cc +++ b/gr-blocks/lib/delay_impl.cc @@ -35,6 +35,9 @@ delay_impl::delay_impl(size_t itemsize, int delay) } set_dly(delay); d_delta = 0; + + message_port_register_in(pmt::mp("dly")); + set_msg_handler(pmt::mp("dly"), [this](pmt::pmt_t msg) { this->handle_msg(msg); }); } delay_impl::~delay_impl() {} @@ -53,7 +56,7 @@ void delay_impl::set_dly(int d) // protects from quickly-repeated calls to this function that // would end with d_delta=0. if (d != dly()) { - gr::thread::scoped_lock l(d_mutex_delay); + gr::thread::scoped_lock l(d_setlock); int old = dly(); set_history(d + 1); declare_sample_delay(history() - 1); @@ -61,12 +64,31 @@ void delay_impl::set_dly(int d) } } +void delay_impl::handle_msg(pmt::pmt_t msg) +{ + if (pmt::is_number(msg)) { + int value = pmt::to_long(msg); + set_dly(value); + } else { + if (pmt::is_pair(msg)) { + pmt::pmt_t data = pmt::cdr(msg); + if (pmt::is_number(data)) { + int value = pmt::to_long(data); + set_dly(value); + } else + GR_LOG_WARN( + d_logger, + "Delay message must be a number or a number pair. Ignoring value."); + } + } +} + int delay_impl::general_work(int noutput_items, gr_vector_int& ninput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) { - gr::thread::scoped_lock l(d_mutex_delay); + gr::thread::scoped_lock l(d_setlock); assert(input_items.size() == output_items.size()); const char* iptr; diff --git a/gr-blocks/lib/delay_impl.h b/gr-blocks/lib/delay_impl.h index c58de83668..2b39e64ce5 100644 --- a/gr-blocks/lib/delay_impl.h +++ b/gr-blocks/lib/delay_impl.h @@ -24,7 +24,7 @@ private: const size_t d_itemsize; int d_delta; - gr::thread::mutex d_mutex_delay; + void handle_msg(pmt::pmt_t msg); public: delay_impl(size_t itemsize, int delay); |