summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim O'Shea <tim.oshea753@gmail.com>2013-11-26 14:18:59 -0500
committerTom Rondeau <tom@trondeau.com>2013-11-27 17:28:45 -0500
commit04cfc9f425bf65fb8da21c95709c4846114f627a (patch)
treebe8dcb44759bd21b81d92733435244378c58fb99
parentf863f08c747d10feb2cee0ab4088da851d2e51b7 (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.xml8
-rw-r--r--gr-blocks/include/gnuradio/blocks/throttle.h2
-rw-r--r--gr-blocks/lib/throttle_impl.cc26
-rw-r--r--gr-blocks/lib/throttle_impl.h3
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 &gt; 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();