summaryrefslogtreecommitdiff
path: root/gr-blocks/lib/throttle_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-blocks/lib/throttle_impl.cc')
-rw-r--r--gr-blocks/lib/throttle_impl.cc193
1 files changed, 95 insertions, 98 deletions
diff --git a/gr-blocks/lib/throttle_impl.cc b/gr-blocks/lib/throttle_impl.cc
index d818ce192b..d5614c5676 100644
--- a/gr-blocks/lib/throttle_impl.cc
+++ b/gr-blocks/lib/throttle_impl.cc
@@ -33,117 +33,114 @@
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, bool ignore_tags)
- {
- return gnuradio::get_initial_sptr
- (new throttle_impl(itemsize, samples_per_sec, ignore_tags));
- }
-
- throttle_impl::throttle_impl(size_t itemsize,
- 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_ignore_tags(ignore_tags)
- {
- set_sample_rate(samples_per_second);
- }
-
- throttle_impl::~throttle_impl()
- {
- }
-
- bool
- throttle_impl::start()
- {
- d_start = boost::get_system_time();
- d_total_samples = 0;
- return block::start();
- }
-
- void
- throttle_impl::set_sample_rate(double rate)
- {
- //changing the sample rate performs a reset of state params
- d_start = boost::get_system_time();
- d_total_samples = 0;
- d_samps_per_tick = rate/boost::posix_time::time_duration::ticks_per_second();
- d_samps_per_us = rate/1e6;
- }
-
- double
- throttle_impl::sample_rate() const
- {
- return d_samps_per_us * 1e6;
- }
-
- int
- throttle_impl::work(int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
- {
- // check for updated rx_rate tag
- if(!d_ignore_tags){
+namespace blocks {
+
+throttle::sptr throttle::make(size_t itemsize, double samples_per_sec, bool ignore_tags)
+{
+ return gnuradio::get_initial_sptr(
+ new throttle_impl(itemsize, samples_per_sec, ignore_tags));
+}
+
+throttle_impl::throttle_impl(size_t itemsize, 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_ignore_tags(ignore_tags)
+{
+ set_sample_rate(samples_per_second);
+}
+
+throttle_impl::~throttle_impl() {}
+
+bool throttle_impl::start()
+{
+ d_start = boost::get_system_time();
+ d_total_samples = 0;
+ return block::start();
+}
+
+void throttle_impl::set_sample_rate(double rate)
+{
+ // changing the sample rate performs a reset of state params
+ d_start = boost::get_system_time();
+ d_total_samples = 0;
+ d_samps_per_tick = rate / boost::posix_time::time_duration::ticks_per_second();
+ d_samps_per_us = rate / 1e6;
+}
+
+double throttle_impl::sample_rate() const { return d_samps_per_us * 1e6; }
+
+int throttle_impl::work(int noutput_items,
+ 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);
+ 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();
- uint64_t expected_samps = uint64_t(d_samps_per_tick*ticks);
+ // 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();
+ uint64_t expected_samps = uint64_t(d_samps_per_tick * ticks);
- //if the expected samples was less, we need to throttle back
- if(d_total_samples > expected_samps) {
- double sleep_time = (d_total_samples - expected_samps)/d_samps_per_us;
+ // if the expected samples was less, we need to throttle back
+ if (d_total_samples > expected_samps) {
+ double sleep_time = (d_total_samples - expected_samps) / d_samps_per_us;
if (std::numeric_limits<long>::max() < sleep_time) {
- GR_LOG_ALERT(d_logger, "WARNING: Throttle sleep time overflow! You "
- "are probably using a very low sample rate.");
+ GR_LOG_ALERT(d_logger,
+ "WARNING: Throttle sleep time overflow! You "
+ "are probably using a very low sample rate.");
}
- boost::this_thread::sleep(boost::posix_time::microseconds
- (long(sleep_time)));
- }
-
- //copy all samples output[i] <= input[i]
- const char *in = (const char *)input_items[0];
- char *out = (char *)output_items[0];
- std::memcpy(out, in, noutput_items * d_itemsize);
- d_total_samples += noutput_items;
- return noutput_items;
+ boost::this_thread::sleep(boost::posix_time::microseconds(long(sleep_time)));
}
- void
- throttle_impl::setup_rpc()
- {
+ // copy all samples output[i] <= input[i]
+ const char* in = (const char*)input_items[0];
+ char* out = (char*)output_items[0];
+ std::memcpy(out, in, noutput_items * d_itemsize);
+ d_total_samples += noutput_items;
+ return noutput_items;
+}
+
+void throttle_impl::setup_rpc()
+{
#ifdef GR_CTRLPORT
- d_rpc_vars.push_back(
- rpcbasic_sptr(new rpcbasic_register_get<throttle, double>(
- alias(), "sample_rate", &throttle::sample_rate,
- pmt::mp(0.0), pmt::mp(100.0e6), pmt::mp(0.0),
- "Hz", "Sample Rate", RPC_PRIVLVL_MIN,
- DISPTIME | DISPOPTSTRIP)));
-
- d_rpc_vars.push_back(
- rpcbasic_sptr(new rpcbasic_register_set<throttle, double>(
- alias(), "sample_rate", &throttle::set_sample_rate,
- pmt::mp(0.0), pmt::mp(100.0e6), pmt::mp(0.0),
- "Hz", "Sample Rate", RPC_PRIVLVL_MIN,
- DISPTIME | DISPOPTSTRIP)));
+ d_rpc_vars.push_back(rpcbasic_sptr(
+ new rpcbasic_register_get<throttle, double>(alias(),
+ "sample_rate",
+ &throttle::sample_rate,
+ pmt::mp(0.0),
+ pmt::mp(100.0e6),
+ pmt::mp(0.0),
+ "Hz",
+ "Sample Rate",
+ RPC_PRIVLVL_MIN,
+ DISPTIME | DISPOPTSTRIP)));
+
+ d_rpc_vars.push_back(rpcbasic_sptr(
+ new rpcbasic_register_set<throttle, double>(alias(),
+ "sample_rate",
+ &throttle::set_sample_rate,
+ pmt::mp(0.0),
+ pmt::mp(100.0e6),
+ pmt::mp(0.0),
+ "Hz",
+ "Sample Rate",
+ RPC_PRIVLVL_MIN,
+ DISPTIME | DISPOPTSTRIP)));
#endif /* GR_CTRLPORT */
- }
+}
- } /* namespace blocks */
+} /* namespace blocks */
} /* namespace gr */