From: trondeau Date: Sun, 15 Jul 2007 18:05:55 +0000 (+0000) Subject: merged -r5947:5965 on trondeau/regen into trunk. Fixes ticket:154 on gr_regenerate_bb... X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=2e458356def8ef23944a2e578ce563bcb14dcab5;p=debian%2Fgnuradio merged -r5947:5965 on trondeau/regen into trunk. Fixes ticket:154 on gr_regenerate_bb block. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@5966 221aa14e-8319-0410-a670-987f0aec2ac5 --- diff --git a/gnuradio-core/src/lib/general/gr_regenerate_bb.cc b/gnuradio-core/src/lib/general/gr_regenerate_bb.cc index 6b0535e1..eb2220bf 100644 --- a/gnuradio-core/src/lib/general/gr_regenerate_bb.cc +++ b/gnuradio-core/src/lib/general/gr_regenerate_bb.cc @@ -38,11 +38,26 @@ gr_regenerate_bb::gr_regenerate_bb (int period, unsigned int max_regen) gr_make_io_signature (1, 1, sizeof (char)), gr_make_io_signature (1, 1, sizeof (char))), d_period(period), + d_countdown(0), d_max_regen(max_regen), - d_regen_count(0) + d_regen_count(max_regen) { } +void gr_regenerate_bb::set_max_regen(unsigned int regen) +{ + d_max_regen = regen; + d_countdown = 0; + d_regen_count = d_max_regen; +} + +void gr_regenerate_bb::set_period(int period) +{ + d_period = period; + d_countdown = 0; + d_regen_count = d_max_regen; +} + int gr_regenerate_bb::work (int noutput_items, gr_vector_const_void_star &input_items, @@ -53,14 +68,8 @@ gr_regenerate_bb::work (int noutput_items, for (int i = 0; i < noutput_items; i++){ optr[i] = 0; - - if(iptr[i] == 1) { - d_countdown = d_period; - optr[i] = 1; - d_regen_count = 0; - } - if(d_regen_count <= d_max_regen) { + if(d_regen_count < d_max_regen) { d_countdown--; if(d_countdown == 0) { @@ -69,6 +78,13 @@ gr_regenerate_bb::work (int noutput_items, d_regen_count++; } } + + if(iptr[i] == 1) { + d_countdown = d_period; + optr[i] = 1; + d_regen_count = 0; + } + } return noutput_items; } diff --git a/gnuradio-core/src/lib/general/gr_regenerate_bb.h b/gnuradio-core/src/lib/general/gr_regenerate_bb.h index 446e658a..f5b589fe 100644 --- a/gnuradio-core/src/lib/general/gr_regenerate_bb.h +++ b/gnuradio-core/src/lib/general/gr_regenerate_bb.h @@ -31,14 +31,23 @@ typedef boost::shared_ptr gr_regenerate_bb_sptr; gr_regenerate_bb_sptr gr_make_regenerate_bb (int period, unsigned int max_regen=500); /*! - * \brief Detect the peak of a signal + * \brief Detect the peak of a signal and repeat every period samples * \ingroup block * * If a peak is detected, this block outputs a 1 repeated every period samples - * until reset by detection of another 1 on the input + * until reset by detection of another 1 on the input or stopped after max_regen + * regenerations have occurred. + * + * Note that if max_regen=(-1)/ULONG_MAX then the regeneration will run forever. */ class gr_regenerate_bb : public gr_sync_block { + /*! + * \brief Make a regenerate block + * \param period The number of samples between regenerations + * \param max_regen The maximum number of regenerations to perform; if set to + * ULONG_MAX, it will regenerate continuously. + */ friend gr_regenerate_bb_sptr gr_make_regenerate_bb (int period, unsigned int max_regen); gr_regenerate_bb (int period, unsigned int max_regen); @@ -50,6 +59,13 @@ class gr_regenerate_bb : public gr_sync_block unsigned int d_regen_count; public: + /*! \brief Reset the maximum regeneration count; this will reset the current regen. + */ + void set_max_regen(unsigned int regen); + + /*! \brief Reset the period of regenerations; this will reset the current regen. + */ + void set_period(int period); int work (int noutput_items, gr_vector_const_void_star &input_items, diff --git a/gnuradio-core/src/lib/general/gr_regenerate_bb.i b/gnuradio-core/src/lib/general/gr_regenerate_bb.i index 6afd84d8..afdbe184 100644 --- a/gnuradio-core/src/lib/general/gr_regenerate_bb.i +++ b/gnuradio-core/src/lib/general/gr_regenerate_bb.i @@ -28,4 +28,11 @@ class gr_regenerate_bb : public gr_sync_block { private: gr_regenerate_bb (int period, unsigned int max_regen); + +public: + void set_max_regen(unsigned int regen); + + /*! \brief Reset the period of regenerations; this will reset the current regen. + */ + void set_period(int period); }; diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_regenerate.py b/gnuradio-core/src/python/gnuradio/gr/qa_regenerate.py new file mode 100755 index 00000000..b7a4cc26 --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/gr/qa_regenerate.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# +# Copyright 2007 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from gnuradio import gr, gr_unittest +import math + +class test_sig_source (gr_unittest.TestCase): + + def setUp (self): + self.fg = gr.flow_graph () + + def tearDown (self): + self.fg = None + + def test_regen1 (self): + fg = self.fg + + data = [0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + + expected_result = (0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + + + src = gr.vector_source_b(data, False) + regen = gr.regenerate_bb(5, 2) + dst = gr.vector_sink_b() + + fg.connect (src, regen) + fg.connect (regen, dst) + fg.run () + + dst_data = dst.data () + + self.assertEqual (expected_result, dst_data) + + def test_regen2 (self): + fg = self.fg + + data = 200*[0,] + data[9] = 1 + data[99] = 1 + + expected_result = 200*[0,] + expected_result[9] = 1 + expected_result[19] = 1 + expected_result[29] = 1 + expected_result[39] = 1 + + expected_result[99] = 1 + expected_result[109] = 1 + expected_result[119] = 1 + expected_result[129] = 1 + + src = gr.vector_source_b(data, False) + regen = gr.regenerate_bb(10, 3) + dst = gr.vector_sink_b() + + fg.connect (src, regen) + fg.connect (regen, dst) + fg.run () + + dst_data = dst.data () + + self.assertEqual (tuple(expected_result), dst_data) + + +if __name__ == '__main__': + gr_unittest.main ()