summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gr-blocks/lib/keep_m_in_n_impl.cc57
-rw-r--r--gr-blocks/lib/keep_m_in_n_impl.h6
2 files changed, 50 insertions, 13 deletions
diff --git a/gr-blocks/lib/keep_m_in_n_impl.cc b/gr-blocks/lib/keep_m_in_n_impl.cc
index e987b52265..b33eb7c1a8 100644
--- a/gr-blocks/lib/keep_m_in_n_impl.cc
+++ b/gr-blocks/lib/keep_m_in_n_impl.cc
@@ -30,27 +30,43 @@
namespace gr {
namespace blocks {
- keep_m_in_n::sptr keep_m_in_n::make(size_t itemsize, int m, int n, int offset)
+ keep_m_in_n::sptr
+ keep_m_in_n::make(size_t itemsize, int m, int n, int offset)
{
- return gnuradio::get_initial_sptr(new keep_m_in_n_impl(itemsize, m, n, offset));
+ return gnuradio::get_initial_sptr
+ (new keep_m_in_n_impl(itemsize, m, n, offset));
}
keep_m_in_n_impl::keep_m_in_n_impl(size_t itemsize, int m, int n, int offset)
: block("keep_m_in_n",
- io_signature::make (1, 1, itemsize),
- io_signature::make (1, 1, itemsize)),
+ io_signature::make (1, 1, itemsize),
+ io_signature::make (1, 1, itemsize)),
d_m(m),
d_n(n),
d_offset(offset),
d_itemsize(itemsize)
{
// sanity checking
- assert(d_m > 0);
- assert(d_n > 0);
- assert(d_m <= d_n);
- assert(d_offset <= (d_n-d_m));
+ if(d_m <= 0) {
+ std::string s = boost::str(boost::format("keep_m_in_n: m=%1% but must be > 0") % d_m);
+ throw std::runtime_error(s);
+ }
+ if(d_n <= 0) {
+ std::string s = boost::str(boost::format("keep_m_in_n: n=%1% but must be > 0") % d_n);
+ throw std::runtime_error(s);
+ }
+ if(d_m > d_n) {
+ std::string s = boost::str(boost::format("keep_m_in_n: m (%1%) <= n %2%") % d_m % d_n);
+ throw std::runtime_error(s);
+ }
+ if(d_offset > (d_n - d_m)) {
+ std::string s = boost::str(boost::format("keep_m_in_n: offset (%1%) <= n (%2%) - m (%3%)") \
+ % d_offset % d_n % d_m);
+ throw std::runtime_error(s);
+ }
set_output_multiple(m);
+ set_relative_rate(static_cast<double>(d_n)/static_cast<double>(d_m));
}
void
@@ -59,6 +75,27 @@ namespace gr {
ninput_items_required[0] = d_n*(noutput_items/d_m);
}
+ void
+ keep_m_in_n_impl::set_m(int m)
+ {
+ d_m = m;
+ set_output_multiple(m);
+ set_relative_rate(static_cast<double>(d_n)/static_cast<double>(d_m));
+ }
+
+ void
+ keep_m_in_n_impl::set_n(int n)
+ {
+ d_n = n;
+ set_relative_rate(static_cast<double>(d_n)/static_cast<double>(d_m));
+ }
+
+ void
+ keep_m_in_n_impl::set_offset(int offset)
+ {
+ d_offset = offset;
+ }
+
int
keep_m_in_n_impl::general_work(int noutput_items,
gr_vector_int &ninput_items,
@@ -79,8 +116,8 @@ namespace gr {
memcpy( optr, iptr, d_m*d_itemsize );
}
- consume_each(d_n);
- return d_m;
+ consume_each(blks*d_n);
+ return blks*d_m;
}
} /* namespace blocks */
diff --git a/gr-blocks/lib/keep_m_in_n_impl.h b/gr-blocks/lib/keep_m_in_n_impl.h
index 39c78d399e..4a54b4c336 100644
--- a/gr-blocks/lib/keep_m_in_n_impl.h
+++ b/gr-blocks/lib/keep_m_in_n_impl.h
@@ -45,9 +45,9 @@ namespace gr {
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
- void set_m(int m) { d_m = m; }
- void set_n(int n) { d_n = n; }
- void set_offset(int offset) { d_offset = offset; }
+ void set_m(int m);
+ void set_n(int n);
+ void set_offset(int offset);
};
} /* namespace blocks */