diff options
author | Tim O'Shea <tim.oshea753@gmail.com> | 2013-11-26 14:18:59 -0500 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2013-11-27 17:28:45 -0500 |
commit | 04cfc9f425bf65fb8da21c95709c4846114f627a (patch) | |
tree | be8dcb44759bd21b81d92733435244378c58fb99 | |
parent | f863f08c747d10feb2cee0ab4088da851d2e51b7 (diff) |
blocks: throttle block now looks for rx_rate tag and updates the throttle rate accordingly. A new block parameter can tell the block to ignore these tags; set to True by default.
-rw-r--r-- | gr-blocks/grc/blocks_throttle.xml | 8 | ||||
-rw-r--r-- | gr-blocks/include/gnuradio/blocks/throttle.h | 2 | ||||
-rw-r--r-- | gr-blocks/lib/throttle_impl.cc | 26 | ||||
-rw-r--r-- | gr-blocks/lib/throttle_impl.h | 3 |
4 files changed, 32 insertions, 7 deletions
diff --git a/gr-blocks/grc/blocks_throttle.xml b/gr-blocks/grc/blocks_throttle.xml index 8293cbde9c..06f96b15cc 100644 --- a/gr-blocks/grc/blocks_throttle.xml +++ b/gr-blocks/grc/blocks_throttle.xml @@ -9,7 +9,7 @@ <key>blocks_throttle</key> <throttle>1</throttle> <import>from gnuradio import blocks</import> - <make>blocks.throttle($type.size*$vlen, $samples_per_second)</make> + <make>blocks.throttle($type.size*$vlen, $samples_per_second,$ignoretag)</make> <callback>set_sample_rate($samples_per_second)</callback> <param> <name>Type</name> @@ -53,6 +53,12 @@ <value>1</value> <type>int</type> </param> + <param> + <name>Ignore rx_rate tag</name> + <key>ignoretag</key> + <value>True</value> + <type>bool</type> + </param> <check>$vlen > 0</check> <sink> <name>in</name> diff --git a/gr-blocks/include/gnuradio/blocks/throttle.h b/gr-blocks/include/gnuradio/blocks/throttle.h index 662582e0ba..fa38eae09c 100644 --- a/gr-blocks/include/gnuradio/blocks/throttle.h +++ b/gr-blocks/include/gnuradio/blocks/throttle.h @@ -48,7 +48,7 @@ namespace gr { public: typedef boost::shared_ptr<throttle> sptr; - static sptr make(size_t itemsize, double samples_per_sec); + static sptr make(size_t itemsize, double samples_per_sec, bool ignore_tags=true); //! Sets the sample rate in samples per second. virtual void set_sample_rate(double rate) = 0; diff --git a/gr-blocks/lib/throttle_impl.cc b/gr-blocks/lib/throttle_impl.cc index 42f3665c86..f46decee11 100644 --- a/gr-blocks/lib/throttle_impl.cc +++ b/gr-blocks/lib/throttle_impl.cc @@ -29,22 +29,26 @@ #include <cstring> #include <boost/thread/thread.hpp> +pmt::pmt_t throttle_rx_rate_pmt(pmt::intern("rx_rate")); + namespace gr { namespace blocks { throttle::sptr - throttle::make(size_t itemsize, double samples_per_sec) + throttle::make(size_t itemsize, double samples_per_sec, bool ignore_tags) { return gnuradio::get_initial_sptr - (new throttle_impl(itemsize, samples_per_sec)); + (new throttle_impl(itemsize, samples_per_sec, ignore_tags)); } throttle_impl::throttle_impl(size_t itemsize, - double samples_per_second) + double samples_per_second, + bool ignore_tags) : sync_block("throttle", io_signature::make(1, 1, itemsize), io_signature::make(1, 1, itemsize)), - d_itemsize(itemsize) + d_itemsize(itemsize), + d_ignore_tags(ignore_tags) { set_sample_rate(samples_per_second); } @@ -74,6 +78,20 @@ namespace gr { gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { + // check for updated rx_rate tag + if(!d_ignore_tags){ + uint64_t abs_N = nitems_read(0); + std::vector<tag_t> all_tags; + get_tags_in_range(all_tags, 0, abs_N, abs_N + noutput_items); + std::vector<tag_t>::iterator itr; + for(itr = all_tags.begin(); itr != all_tags.end(); itr++) { + if(pmt::eq( (*itr).key, throttle_rx_rate_pmt)){ + double new_rate = pmt::to_double( (*itr).value ); + set_sample_rate(new_rate); + } + } + } + //calculate the expected number of samples to have passed through boost::system_time now = boost::get_system_time(); boost::int64_t ticks = (now - d_start).ticks(); diff --git a/gr-blocks/lib/throttle_impl.h b/gr-blocks/lib/throttle_impl.h index 797cb7d942..c5e43d7564 100644 --- a/gr-blocks/lib/throttle_impl.h +++ b/gr-blocks/lib/throttle_impl.h @@ -35,9 +35,10 @@ namespace gr { size_t d_itemsize; uint64_t d_total_samples; double d_samps_per_tick, d_samps_per_us; + bool d_ignore_tags; public: - throttle_impl(size_t itemsize, double samples_per_sec); + throttle_impl(size_t itemsize, double samples_per_sec, bool ignore_tags=true); ~throttle_impl(); void setup_rpc(); |