Added gr.copy(itemsize) block
authorJohnathan Corgan <jcorgan@corganenterprises.com>
Fri, 9 Oct 2009 03:53:16 +0000 (20:53 -0700)
committerJohnathan Corgan <jcorgan@corganenterprises.com>
Fri, 9 Oct 2009 03:53:16 +0000 (20:53 -0700)
set_enabled(bool) will either copy from input to output (True)
or drop the input on the floor (False).

gnuradio-core/src/lib/general/Makefile.am
gnuradio-core/src/lib/general/general.i
gnuradio-core/src/lib/general/gr_copy.cc [new file with mode: 0644]
gnuradio-core/src/lib/general/gr_copy.h [new file with mode: 0644]
gnuradio-core/src/lib/general/gr_copy.i [new file with mode: 0644]
gnuradio-core/src/python/gnuradio/gr/Makefile.am
gnuradio-core/src/python/gnuradio/gr/qa_copy.py [new file with mode: 0755]

index 9b070b8651487d85be89d015e2facf39662821e4..cf6ff1e651ad89baf5ea3544e0bebfc57bf72ab2 100644 (file)
@@ -51,6 +51,7 @@ libgeneral_la_SOURCES =               \
        gr_complex_to_interleaved_short.cc \
        gr_complex_to_xxx.cc            \
        gr_conjugate_cc.cc              \
+       gr_copy.cc                      \
        gr_constellation_decoder_cb.cc  \
        gr_correlate_access_code_bb.cc  \
        gr_costas_loop_cc.cc            \
@@ -204,6 +205,7 @@ grinclude_HEADERS =                         \
        gr_complex_to_xxx.h             \
        gr_conjugate_cc.h               \
        gr_constellation_decoder_cb.h   \
+       gr_copy.h                       \
        gr_correlate_access_code_bb.h   \
        gr_costas_loop_cc.h             \
        gr_count_bits.h                 \
@@ -373,6 +375,7 @@ swiginclude_HEADERS =                       \
        gr_complex_to_xxx.i             \
        gr_conjugate_cc.i               \
        gr_constellation_decoder_cb.i   \
+       gr_copy.i                       \
        gr_correlate_access_code_bb.i   \
        gr_costas_loop_cc.i             \
        gr_cpfsk_bc.i                   \
index 0684e63a55f7ae56d05a04d13a5d5b8f00a3915f..e1161c8eb7e94f74337831fac9f306980f55fd4b 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2004,2005,2006,2007,2008 Free Software Foundation, Inc.
+ * Copyright 2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
  * 
  * This file is part of GNU Radio
  * 
 #include <gr_stretch_ff.h>
 #include <gr_wavelet_ff.h>
 #include <gr_wvps_ff.h>
-
+#include <gr_copy.h>
 %}
 
 %include "gr_nop.i"
 %include "gr_stretch_ff.i"
 %include "gr_wavelet_ff.i"
 %include "gr_wvps_ff.i"
+%include "gr_copy.i"
diff --git a/gnuradio-core/src/lib/general/gr_copy.cc b/gnuradio-core/src/lib/general/gr_copy.cc
new file mode 100644 (file)
index 0000000..c6564c2
--- /dev/null
@@ -0,0 +1,71 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,2009 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 3, 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gr_copy.h>
+#include <gr_io_signature.h>
+#include <string.h>
+
+gr_copy_sptr
+gr_make_copy(size_t itemsize)
+{
+  return gnuradio::get_initial_sptr(new gr_copy(itemsize));
+}
+
+gr_copy::gr_copy(size_t itemsize)
+  : gr_block ("copy",
+             gr_make_io_signature (1, 1, itemsize),
+             gr_make_io_signature (1, 1, itemsize)),
+    d_itemsize(itemsize),
+    d_enabled(true)
+{
+}
+
+bool
+gr_copy::check_topology(int ninputs, int noutputs)
+{
+  return ninputs == noutputs;
+}
+
+int
+gr_copy::general_work(int noutput_items,
+                     gr_vector_int &ninput_items,
+                     gr_vector_const_void_star &input_items,
+                     gr_vector_void_star &output_items)
+{
+  const uint8_t *in = (const uint8_t *) input_items[0];
+  uint8_t *out = (uint8_t *) output_items[0];
+
+  int n = std::min<int>(ninput_items[0], noutput_items);
+  int j = 0;
+
+  if (d_enabled) {
+    memcpy(out, in, n*d_itemsize);
+    j = n;
+  }
+
+  consume_each(n);
+  return j;
+}
diff --git a/gnuradio-core/src/lib/general/gr_copy.h b/gnuradio-core/src/lib/general/gr_copy.h
new file mode 100644 (file)
index 0000000..d99aef8
--- /dev/null
@@ -0,0 +1,62 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,2009 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 3, 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.
+ */
+
+#ifndef INCLUDED_GR_COPY_H
+#define INCLUDED_GR_COPY_H
+
+#include <gr_block.h>
+
+class gr_copy;
+typedef boost::shared_ptr<gr_copy> gr_copy_sptr;
+
+gr_copy_sptr gr_make_copy(size_t itemsize);
+
+/*!
+ * \brief output[i] = input[i]
+ * \ingroup misc_blk
+ *
+ * When enabled (default), this block copies its input to its output.
+ * When disabled, this block drops its input on the floor.
+ *
+ */
+class gr_copy : public gr_block
+{
+  size_t               d_itemsize;
+  bool                 d_enabled;
+
+  friend gr_copy_sptr gr_make_copy(size_t itemsize);
+  gr_copy(size_t itemsize);
+
+ public:
+
+  bool check_topology(int ninputs, int noutputs);
+
+  void set_enabled(bool enable) { d_enabled = enable; }
+  bool enabled() const { return d_enabled;}
+
+  int general_work(int noutput_items,
+                  gr_vector_int &ninput_items,
+                  gr_vector_const_void_star &input_items,
+                  gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gnuradio-core/src/lib/general/gr_copy.i b/gnuradio-core/src/lib/general/gr_copy.i
new file mode 100644 (file)
index 0000000..e260d8e
--- /dev/null
@@ -0,0 +1,36 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,2009 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 3, 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.
+ */
+
+GR_SWIG_BLOCK_MAGIC(gr,copy)
+
+gr_copy_sptr gr_make_copy(size_t itemsize);
+
+class gr_copy : public gr_block
+{
+ private:
+  gr_copy(size_t itemsize);
+
+public:
+
+  void set_enabled(bool enabled);
+  bool enabled();
+};
index 41ef52240968013c2ad75d16df6896977e4b696d..3aff89ee7852d60bbb695132f9ba2ac9f82e37bf 100644 (file)
@@ -54,6 +54,7 @@ noinst_PYTHON =                       \
        qa_cma_equalizer.py             \
        qa_complex_to_xxx.py            \
        qa_constellation_decoder_cb.py  \
+       qa_copy.py                      \
        qa_correlate_access_code.py     \
        qa_delay.py                     \
        qa_diff_encoder.py              \
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_copy.py b/gnuradio-core/src/python/gnuradio/gr/qa_copy.py
new file mode 100755 (executable)
index 0000000..7f9f72a
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+#
+# Copyright 2009 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 3, 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
+
+class test_copy(gr_unittest.TestCase):
+
+    def setUp (self):
+        self.tb = gr.top_block ()
+
+    def tearDown (self):
+        self.tb = None
+
+    def test_copy (self):
+        src_data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+        expected_result = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+        src = gr.vector_source_b(src_data)
+        op = gr.copy(gr.sizeof_char)
+        dst = gr.vector_sink_b()
+        self.tb.connect(src, op, dst)
+        self.tb.run()
+        dst_data = dst.data()
+        self.assertEqual(expected_result, dst_data)
+    
+    def test_copy_drop (self):
+        src_data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+        expected_result = ()
+        src = gr.vector_source_b(src_data)
+        op = gr.copy(gr.sizeof_char)
+       op.set_enabled(False)
+        dst = gr.vector_sink_b()
+        self.tb.connect(src, op, dst)
+        self.tb.run()
+        dst_data = dst.data()
+        self.assertEqual(expected_result, dst_data)
+    
+
+if __name__ == '__main__':
+    gr_unittest.main ()