diff options
-rw-r--r-- | gr-blocks/lib/keep_m_in_n_impl.cc | 57 | ||||
-rw-r--r-- | gr-blocks/lib/keep_m_in_n_impl.h | 6 |
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 */ |