merged -r5947:5965 on trondeau/regen into trunk. Fixes ticket:154 on gr_regenerate_bb...
authortrondeau <trondeau@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 15 Jul 2007 18:05:55 +0000 (18:05 +0000)
committertrondeau <trondeau@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 15 Jul 2007 18:05:55 +0000 (18:05 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@5966 221aa14e-8319-0410-a670-987f0aec2ac5

gnuradio-core/src/lib/general/gr_regenerate_bb.cc
gnuradio-core/src/lib/general/gr_regenerate_bb.h
gnuradio-core/src/lib/general/gr_regenerate_bb.i
gnuradio-core/src/python/gnuradio/gr/qa_regenerate.py [new file with mode: 0755]

index 6b0535e189800ff9400fb6112bc1a5a04baa4ea4..eb2220bf1de45ee6e2a24d1abee8c23c695cf1e9 100644 (file)
@@ -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;
 }
index 446e658ae4b527ce91297c57721678e90ab15436..f5b589fe532a6b468439eae340d840565308df0d 100644 (file)
@@ -31,14 +31,23 @@ typedef boost::shared_ptr<gr_regenerate_bb> 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,
index 6afd84d8de50920908b00797960aae65762766b8..afdbe184dfe5110f5e7c2f9dac0ef7ac93ffeda1 100644 (file)
@@ -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 (executable)
index 0000000..b7a4cc2
--- /dev/null
@@ -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 ()