From 06f92ca4200bbebd2ecb77f88b4524711f9292c4 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 27 Apr 2010 22:05:15 -0400
Subject: Adding the synthesis filterbank (the opposite of the channelizer).
 It's ugly right now and uses a lot of memory to handle the buffers for each
 filter/input stream.

---
 gnuradio-core/src/lib/filter/Makefile.am           |   3 +
 gnuradio-core/src/lib/filter/filter.i              |   2 +
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.cc  | 164 +++++++++++++++++++++
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.h   |  93 ++++++++++++
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.i   |  38 +++++
 5 files changed, 300 insertions(+)
 create mode 100644 gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
 create mode 100644 gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
 create mode 100644 gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.i

diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index 23c1dadc36..6a6532eb0a 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -205,6 +205,7 @@ libfilter_la_common_SOURCES = 		\
 	float_dotprod_generic.c		\
 	short_dotprod_generic.c		\
 	gr_pfb_channelizer_ccf.cc	\
+	gr_pfb_synthesis_filterbank_ccf.cc\
 	gr_pfb_decimator_ccf.cc		\
 	gr_pfb_interpolator_ccf.cc	\
 	gr_pfb_arb_resampler_ccf.cc	\
@@ -288,6 +289,7 @@ grinclude_HEADERS = 			\
 	short_dotprod_x86.h		\
 	sse_debug.h			\
 	gr_pfb_channelizer_ccf.h	\
+	gr_pfb_synthesis_filterbank_ccf.h\
 	gr_pfb_decimator_ccf.h		\
 	gr_pfb_interpolator_ccf.h	\
 	gr_pfb_arb_resampler_ccf.h	\
@@ -344,6 +346,7 @@ swiginclude_HEADERS =			\
 	gr_single_pole_iir_filter_ff.i	\
 	gr_single_pole_iir_filter_cc.i	\
 	gr_pfb_channelizer_ccf.i	\
+	gr_pfb_synthesis_filterbank_ccf.i\
 	gr_pfb_decimator_ccf.i		\
 	gr_pfb_interpolator_ccf.i	\
 	gr_pfb_arb_resampler_ccf.i	\
diff --git a/gnuradio-core/src/lib/filter/filter.i b/gnuradio-core/src/lib/filter/filter.i
index bdfb8fa8d2..645607cbad 100644
--- a/gnuradio-core/src/lib/filter/filter.i
+++ b/gnuradio-core/src/lib/filter/filter.i
@@ -33,6 +33,7 @@
 #include <gr_goertzel_fc.h>
 #include <gr_cma_equalizer_cc.h>
 #include <gr_pfb_channelizer_ccf.h>
+#include <gr_pfb_synthesis_filterbank_ccf.h>
 #include <gr_pfb_decimator_ccf.h>
 #include <gr_pfb_interpolator_ccf.h>
 #include <gr_pfb_arb_resampler_ccf.h>
@@ -52,6 +53,7 @@
 %include "gr_goertzel_fc.i"
 %include "gr_cma_equalizer_cc.i"
 %include "gr_pfb_channelizer_ccf.i"
+%include "gr_pfb_synthesis_filterbank_ccf.i"
 %include "gr_pfb_decimator_ccf.i"
 %include "gr_pfb_interpolator_ccf.i"
 %include "gr_pfb_arb_resampler_ccf.i"
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
new file mode 100644
index 0000000000..f8b0eae260
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
@@ -0,0 +1,164 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_pfb_synthesis_filterbank_ccf.h>
+#include <gr_fir_ccf.h>
+#include <gr_fir_util.h>
+#include <gri_fft.h>
+#include <gr_io_signature.h>
+#include <cstdio>
+#include <cstring>
+
+gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf 
+    (unsigned int numchans, const std::vector<float> &taps)
+{
+  return gr_pfb_synthesis_filterbank_ccf_sptr 
+    (new gr_pfb_synthesis_filterbank_ccf (numchans, taps));
+}
+
+
+gr_pfb_synthesis_filterbank_ccf::gr_pfb_synthesis_filterbank_ccf
+    (unsigned int numchans, const std::vector<float> &taps)
+  : gr_sync_interpolator ("pfb_synthesis_filterbank_ccf",
+			  gr_make_io_signature (numchans, numchans, sizeof(gr_complex)),
+			  gr_make_io_signature (1, 1, sizeof(gr_complex)),
+			  numchans),
+    d_updated (false), d_numchans(numchans)
+{
+  d_filters = std::vector<gr_fir_ccf*>(d_numchans);
+
+  d_buffer = new gr_complex*[d_numchans];
+
+  // Create an FIR filter for each channel and zero out the taps
+  std::vector<float> vtaps(0, d_numchans);
+  for(unsigned int i = 0; i < d_numchans; i++) {
+    d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
+    d_buffer[i] = new gr_complex[65535];
+    memset(d_buffer[i], 0, 65535*sizeof(gr_complex));
+  }
+
+  // Now, actually set the filters' taps
+  set_taps(taps);
+
+  // Create the IFFT to handle the input channel rotations
+  d_fft = new gri_fft_complex (d_numchans, true);
+}
+
+gr_pfb_synthesis_filterbank_ccf::~gr_pfb_synthesis_filterbank_ccf ()
+{
+  for(unsigned int i = 0; i < d_numchans; i++) {
+    delete d_filters[i];
+  }
+}
+
+void
+gr_pfb_synthesis_filterbank_ccf::set_taps (const std::vector<float> &taps)
+{
+  unsigned int i,j;
+
+  unsigned int ntaps = taps.size();
+  d_taps_per_filter = (unsigned int)ceil((double)ntaps/(double)d_numchans);
+
+  // Create d_numchan vectors to store each channel's taps
+  d_taps.resize(d_numchans);
+
+  // Make a vector of the taps plus fill it out with 0's to fill
+  // each polyphase filter with exactly d_taps_per_filter
+  std::vector<float> tmp_taps;
+  tmp_taps = taps;
+  while((float)(tmp_taps.size()) < d_numchans*d_taps_per_filter) {
+    tmp_taps.push_back(0.0);
+  }
+ 
+  // Partition the filter
+  for(i = 0; i < d_numchans; i++) {
+    // Each channel uses all d_taps_per_filter with 0's if not enough taps to fill out
+    d_taps[i] = std::vector<float>(d_taps_per_filter, 0);
+    for(j = 0; j < d_taps_per_filter; j++) {
+      d_taps[i][j] = tmp_taps[i + j*d_numchans];  // add taps to channels in reverse order
+    }
+    
+    // Build a filter for each channel and add it's taps to it
+    d_filters[i]->set_taps(d_taps[i]);
+  }
+
+  // Set the history to ensure enough input items for each filter
+  set_history (d_taps_per_filter+1);
+
+  d_updated = true;
+}
+
+void
+gr_pfb_synthesis_filterbank_ccf::print_taps()
+{
+  unsigned int i, j;
+  for(i = 0; i < d_numchans; i++) {
+    printf("filter[%d]: [", i);
+    for(j = 0; j < d_taps_per_filter; j++) {
+      printf(" %.4e", d_taps[i][j]);
+    }
+    printf("]\n\n");
+  }
+}
+
+
+int
+gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
+				       gr_vector_const_void_star &input_items,
+				       gr_vector_void_star &output_items)
+{
+  gr_complex *in = (gr_complex*) input_items[0];
+  gr_complex *out = (gr_complex *) output_items[0];
+
+  if (d_updated) {
+    d_updated = false;
+    return 0;		     // history requirements may have changed.
+  }
+
+  unsigned int n, i;
+  for(n = 0; n < noutput_items/d_numchans; n++) {
+    for(i = 0; i < d_numchans; i++) {
+      in = (gr_complex*)input_items[i];
+      d_fft->get_inbuf()[i] = (in+i)[n];
+    }
+
+    // spin through IFFT
+    d_fft->execute();
+
+    for(i = 0; i < d_numchans; i++) {
+      d_buffer[i][n+d_taps_per_filter-1] = d_fft->get_outbuf()[i];
+      out[i] = d_filters[i]->filter(&d_buffer[i][n]);
+    }
+    out += d_numchans;
+  }
+
+  for(i = 0; i < d_numchans; i++) {
+    memcpy(d_buffer[i], &d_buffer[i][n],
+	   (d_taps_per_filter)*sizeof(gr_complex));
+  }
+
+  return noutput_items;
+}
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
new file mode 100644
index 0000000000..4b6235a8b5
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
@@ -0,0 +1,93 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_PFB_SYNTHESIS_FILTERBANK_CCF_H
+#define	INCLUDED_GR_PFB_SYNTHESIS_FILTERBANK_CCF_H
+
+#include <gr_sync_interpolator.h>
+
+class gr_pfb_synthesis_filterbank_ccf;
+typedef boost::shared_ptr<gr_pfb_synthesis_filterbank_ccf> gr_pfb_synthesis_filterbank_ccf_sptr;
+gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf 
+    (unsigned int numchans, const std::vector<float> &taps);
+
+class gr_fir_ccf;
+class gri_fft_complex;
+
+
+/*!
+ * \class gr_pfb_synthesis_filterbank_ccf
+ *
+ * \brief Polyphase synthesis filterbank with 
+ *        gr_complex input, gr_complex output and float taps
+ *
+ * \ingroup filter_blk
+ */
+
+class gr_pfb_synthesis_filterbank_ccf : public gr_sync_interpolator
+{
+ private:
+  /*!
+   * Build the polyphase synthesis filterbank.
+   * \param numchans (unsigned integer) Specifies the number of channels <EM>M</EM>
+   * \param taps    (vector/list of floats) The prototype filter to populate the filterbank.
+   */
+  friend gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf 
+      (unsigned int numchans, const std::vector<float> &taps);
+
+  bool			   d_updated;
+  unsigned int             d_numchans;
+  std::vector<gr_fir_ccf*> d_filters;
+  std::vector< std::vector<float> > d_taps;
+  unsigned int             d_taps_per_filter;
+  gri_fft_complex         *d_fft;
+  gr_complex             **d_buffer;
+
+  /*!
+   * Build the polyphase synthesis filterbank.
+   * \param numchans (unsigned integer) Specifies the number of channels <EM>M</EM>
+   * \param taps    (vector/list of floats) The prototype filter to populate the filterbank.
+   */
+  gr_pfb_synthesis_filterbank_ccf (unsigned int numchans, 
+				   const std::vector<float> &taps);
+  
+public:
+  ~gr_pfb_synthesis_filterbank_ccf ();
+  
+  /*!
+   * Resets the filterbank's filter taps with the new prototype filter
+   * \param taps    (vector/list of floats) The prototype filter to populate the filterbank.
+   */
+  void set_taps (const std::vector<float> &taps);
+
+  /*!
+   * Print all of the filterbank taps to screen.
+   */
+  void print_taps();
+  
+  int work (int noutput_items,
+	    gr_vector_const_void_star &input_items,
+	    gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.i
new file mode 100644
index 0000000000..02a9f02556
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.i
@@ -0,0 +1,38 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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,pfb_synthesis_filterbank_ccf);
+
+gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf 
+    (unsigned int numchans, const std::vector<float> &taps);
+
+class gr_pfb_synthesis_filterbank_ccf : public gr_sync_interpolator
+{
+ private:
+  gr_pfb_synthesis_filterbank_ccf (unsigned int numchans,
+				   const std::vector<float> &taps);
+
+ public:
+  ~gr_pfb_synthesis_filterbank_ccf ();
+
+  void set_taps (const std::vector<float> &taps);
+};
-- 
cgit v1.2.3


From 0c6abf713755e4c7f705bad2e9f982d431b4286d Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 27 Apr 2010 22:17:44 -0400
Subject: Fixing ordering so that the input channels line up in the output
 signal properly.

---
 gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
index f8b0eae260..15ba1ae2e7 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
@@ -150,11 +150,13 @@ gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
 
     for(i = 0; i < d_numchans; i++) {
       d_buffer[i][n+d_taps_per_filter-1] = d_fft->get_outbuf()[i];
-      out[i] = d_filters[i]->filter(&d_buffer[i][n]);
+      out[d_numchans-i-1] = d_filters[d_numchans-i-1]->filter(&d_buffer[i][n]);
     }
     out += d_numchans;
   }
 
+  // Move the last chunk of memory to the front for the next entry
+  // this make sure that the first taps_per_filter values are correct
   for(i = 0; i < d_numchans; i++) {
     memcpy(d_buffer[i], &d_buffer[i][n],
 	   (d_taps_per_filter)*sizeof(gr_complex));
-- 
cgit v1.2.3


From 2ee1a94ff42a3d1858805bcce50b6aadb1773f47 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sun, 16 May 2010 14:39:53 -0400
Subject: Can now set more channels than input signals. Empty channels are
 established as the outtermost channels (around fs/2 and -fs/2).

---
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.cc    | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
index 15ba1ae2e7..b1365bcf90 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
@@ -43,7 +43,7 @@ gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf
 gr_pfb_synthesis_filterbank_ccf::gr_pfb_synthesis_filterbank_ccf
     (unsigned int numchans, const std::vector<float> &taps)
   : gr_sync_interpolator ("pfb_synthesis_filterbank_ccf",
-			  gr_make_io_signature (numchans, numchans, sizeof(gr_complex)),
+			  gr_make_io_signature (1, numchans, sizeof(gr_complex)),
 			  gr_make_io_signature (1, 1, sizeof(gr_complex)),
 			  numchans),
     d_updated (false), d_numchans(numchans)
@@ -132,6 +132,9 @@ gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
 {
   gr_complex *in = (gr_complex*) input_items[0];
   gr_complex *out = (gr_complex *) output_items[0];
+  int numsigs = input_items.size();
+  int ndiff   = d_numchans - numsigs;
+  int nhalf = (int)ceil((float)numsigs/2.0f);
 
   if (d_updated) {
     d_updated = false;
@@ -140,11 +143,24 @@ gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
 
   unsigned int n, i;
   for(n = 0; n < noutput_items/d_numchans; n++) {
-    for(i = 0; i < d_numchans; i++) {
+    // fill up the populated channels based on the 
+    // number of real input streams
+    for(i = 0; i < nhalf; i++) {
       in = (gr_complex*)input_items[i];
       d_fft->get_inbuf()[i] = (in+i)[n];
     }
 
+    // Make the ndiff channels around N/2 0
+    for(; i < nhalf+ndiff; i++) {
+      d_fft->get_inbuf()[i] = gr_complex(0,0);
+    }
+
+    // Finish off channels with data
+    for(; i < d_numchans; i++) {
+      in = (gr_complex*)input_items[i-ndiff];
+      d_fft->get_inbuf()[i] = (in+i)[n];
+    }
+
     // spin through IFFT
     d_fft->execute();
 
-- 
cgit v1.2.3


From 37f8cc6c26709dc04cc787d631543972805edb4c Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Sun, 26 Sep 2010 22:53:39 -0700
Subject: possible prefix = NONE fix

---
 configure.ac | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/configure.ac b/configure.ac
index 4ec2644ee3..0bf807287b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,6 +19,13 @@ dnl Boston, MA 02110-1301, USA.
 
 AC_INIT
 AC_PREREQ(2.57)
+
+dnl Set the prefix to the default when --prefix is not specified.
+dnl This is critical for variable substitutions in the configure.
+if test "${prefix}" = "NONE"; then
+    prefix=${ac_default_prefix}
+fi
+
 AM_CONFIG_HEADER(config.h)
 AC_CONFIG_SRCDIR([gnuradio-core/src/lib/runtime/gr_vmcircbuf.cc])
 
-- 
cgit v1.2.3


From cb2fa9a58c9a52f3501881964ee4f59992c5d84d Mon Sep 17 00:00:00 2001
From: Michael Dickens <mdickens@nd.edu>
Date: Sat, 9 Oct 2010 16:11:03 -0400
Subject: rearrange includes to always be: internal GR, external, with GR.

---
 Makefile.common                             |  4 ++--
 gcell/lib/runtime/Makefile.am               |  4 ++--
 gnuradio-core/src/lib/runtime/Makefile.am   |  4 ++--
 gnuradio-core/src/lib/swig/Makefile.am      |  4 ++--
 gnuradio-examples/c++/dial_tone/Makefile.am |  9 +++++----
 gr-gcell/src/Makefile.am                    |  4 ++--
 gr-noaa/swig/Makefile.am                    |  6 +++---
 gr-pager/swig/Makefile.am                   |  6 +++---
 gr-qtgui/src/lib/Makefile.am                |  4 ++--
 gr-usrp/apps/Makefile.am                    | 15 ++++++++-------
 gr-usrp/src/Makefile.am                     |  4 ++--
 gr-usrp2/src/Makefile.am                    |  6 +++---
 gruel/src/lib/Makefile.am                   |  4 ++--
 gruel/src/lib/msg/Makefile.am               |  5 +++--
 gruel/src/lib/pmt/Makefile.am               |  6 +++---
 usrp/host/lib/Makefile.am                   |  2 +-
 usrp/host/swig/Makefile.am                  |  4 ++--
 usrp2/host/apps/Makefile.am                 |  6 +++---
 usrp2/host/lib/Makefile.am                  |  6 +++---
 19 files changed, 53 insertions(+), 50 deletions(-)

diff --git a/Makefile.common b/Makefile.common
index fb83b9470d..95dacf987e 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -57,8 +57,8 @@ libspudir = $(libdir)spu
 
 # This used to be set in configure.ac but is now defined here for all 
 # Makefiles when this fragment is included.
-STD_DEFINES_AND_INCLUDES = $(DEFINES) $(BOOST_CPPFLAGS) \
-	$(GNURADIO_INCLUDES) $(GRUEL_INCLUDES)
+STD_DEFINES_AND_INCLUDES = $(DEFINES) $(GNURADIO_INCLUDES) \
+	$(GRUEL_INCLUDES) $(BOOST_CPPFLAGS)
 
 # when including for compilation from pre-installed libraries and such,
 # need to make sure those are put last on the compile command
diff --git a/gcell/lib/runtime/Makefile.am b/gcell/lib/runtime/Makefile.am
index 4d13790cd2..3ce6376362 100644
--- a/gcell/lib/runtime/Makefile.am
+++ b/gcell/lib/runtime/Makefile.am
@@ -23,8 +23,8 @@ include $(top_srcdir)/Makefile.common
 IBM_PPU_SYNC_INCLUDES = -I$(top_srcdir)/gcell/ibm/sync/ppu_source
 
 
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) \
-	$(GCELL_INCLUDES) $(IBM_PPU_SYNC_INCLUDES) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(DEFINES) $(GCELL_INCLUDES) $(IBM_PPU_SYNC_INCLUDES) \
+	$(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
 
 
 dist_bin_SCRIPTS = gcell-embedspu-libtool
diff --git a/gnuradio-core/src/lib/runtime/Makefile.am b/gnuradio-core/src/lib/runtime/Makefile.am
index abd789a1d0..f67e8843d1 100644
--- a/gnuradio-core/src/lib/runtime/Makefile.am
+++ b/gnuradio-core/src/lib/runtime/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2003,2004,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2003,2004,2007,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -21,7 +21,7 @@
 
 include $(top_srcdir)/Makefile.common
 
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(GRUEL_INCLUDES) $(STD_DEFINES_AND_INCLUDES) $(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
 
 noinst_LTLIBRARIES = libruntime.la libruntime-qa.la
 
diff --git a/gnuradio-core/src/lib/swig/Makefile.am b/gnuradio-core/src/lib/swig/Makefile.am
index 242f27d9c0..1a50b8c8e9 100644
--- a/gnuradio-core/src/lib/swig/Makefile.am
+++ b/gnuradio-core/src/lib/swig/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2001,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2001,2003,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -22,7 +22,7 @@
 include $(top_srcdir)/Makefile.common
 
 if PYTHON
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) -I$(srcdir) \
+AM_CPPFLAGS = -I$(srcdir) $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) \
 	 $(WITH_INCLUDES)
 
 EXTRA_DIST = gen-swig-bug-fix
diff --git a/gnuradio-examples/c++/dial_tone/Makefile.am b/gnuradio-examples/c++/dial_tone/Makefile.am
index ea34beee86..188275fcaf 100644
--- a/gnuradio-examples/c++/dial_tone/Makefile.am
+++ b/gnuradio-examples/c++/dial_tone/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2006,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -22,9 +22,10 @@
 include $(top_srcdir)/Makefile.common
 
 # For compiling within the GNU Radio build tree
-AM_CPPFLAGS=$(STD_DEFINES_AND_INCLUDES) \
-         -I$(top_srcdir)/gr-audio-alsa/src \
-	 $(WITH_INCLUDES)
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/gr-audio-alsa/src \
+	$(STD_DEFINES_AND_INCLUDES) \
+	$(WITH_INCLUDES)
 
 GR_AUDIO_ALSA_LA=$(top_builddir)/gr-audio-alsa/src/libgnuradio-audio-alsa.la
 
diff --git a/gr-gcell/src/Makefile.am b/gr-gcell/src/Makefile.am
index 63dc156b11..60ec6cc731 100644
--- a/gr-gcell/src/Makefile.am
+++ b/gr-gcell/src/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2008,2009 Free Software Foundation, Inc.
+# Copyright 2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -22,7 +22,7 @@ include $(top_srcdir)/Makefile.common
 
 SUBDIRS = . examples
 
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(GCELL_INCLUDES) \
+AM_CPPFLAGS = $(GCELL_INCLUDES) $(STD_DEFINES_AND_INCLUDES) \
 	$(PYTHON_CPPFLAGS) $(WITH_INCLUDES)
 
 # ----------------------------------------------------------------
diff --git a/gr-noaa/swig/Makefile.am b/gr-noaa/swig/Makefile.am
index 73645e92bf..410b23fe60 100644
--- a/gr-noaa/swig/Makefile.am
+++ b/gr-noaa/swig/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -22,10 +22,10 @@
 include $(top_srcdir)/Makefile.common
 
 AM_CPPFLAGS = \
+	-I$(top_srcdir)/gr-noaa/lib \
 	$(STD_DEFINES_AND_INCLUDES) \
 	$(PYTHON_CPPFLAGS) \
-	$(WITH_INCLUDES) \
-	-I$(top_srcdir)/gr-noaa/lib
+	$(WITH_INCLUDES)
 
 if PYTHON
 # ----------------------------------------------------------------
diff --git a/gr-pager/swig/Makefile.am b/gr-pager/swig/Makefile.am
index 9e1a452193..c59bdb0f2c 100644
--- a/gr-pager/swig/Makefile.am
+++ b/gr-pager/swig/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -22,10 +22,10 @@
 include $(top_srcdir)/Makefile.common
 
 AM_CPPFLAGS = \
+	-I$(top_srcdir)/gr-pager/lib \
 	$(STD_DEFINES_AND_INCLUDES) \
 	$(PYTHON_CPPFLAGS) \
-	$(WITH_INCLUDES) \
-	-I$(top_srcdir)/gr-pager/lib
+	$(WITH_INCLUDES)
 
 ##############################
 # SWIG interface and library
diff --git a/gr-qtgui/src/lib/Makefile.am b/gr-qtgui/src/lib/Makefile.am
index 4ba637ad64..1ee3c8e3d2 100644
--- a/gr-qtgui/src/lib/Makefile.am
+++ b/gr-qtgui/src/lib/Makefile.am
@@ -21,8 +21,8 @@
 
 include $(top_srcdir)/Makefile.common
 
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) \
-              $(QT_INCLUDES) -I. $(WITH_INCLUDES)
+AM_CPPFLAGS = -I. $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) \
+              $(QT_INCLUDES) $(WITH_INCLUDES)
 
 # Only include these files in the build if qtgui passes configure checks
 # This is mostly to help make distcheck pass
diff --git a/gr-usrp/apps/Makefile.am b/gr-usrp/apps/Makefile.am
index 92938061f6..0f3a21bb4e 100644
--- a/gr-usrp/apps/Makefile.am
+++ b/gr-usrp/apps/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2008,2009 Free Software Foundation, Inc.
+# Copyright 2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -22,19 +22,20 @@
 include $(top_srcdir)/Makefile.common
 
 # For compiling within the GNU Radio build tree
-AM_CPPFLAGS=$(STD_DEFINES_AND_INCLUDES) \
-	 -I$(top_srcdir)/gr-usrp/src \
-	 $(USRP_INCLUDES) \
-	 $(WITH_INCLUDES)
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/gr-usrp/src \
+	$(USRP_INCLUDES) \
+	$(STD_DEFINES_AND_INCLUDES) \
+	$(WITH_INCLUDES)
 
 GR_USRP_LA=$(top_builddir)/gr-usrp/src/libgnuradio-usrp.la
 
 # For compiling outside the tree, these will get fished out by pkgconfig
 
 LDADD = \
+	$(GR_USRP_LA) \
 	$(BOOST_LDFLAGS) \
-	$(BOOST_PROGRAM_OPTIONS_LIB) \
-	$(GR_USRP_LA)
+	$(BOOST_PROGRAM_OPTIONS_LIB)
 
 noinst_PROGRAMS = \
 	usrp_rx_cfile \
diff --git a/gr-usrp/src/Makefile.am b/gr-usrp/src/Makefile.am
index 572a22485b..db5be4aded 100644
--- a/gr-usrp/src/Makefile.am
+++ b/gr-usrp/src/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -34,9 +34,9 @@ noinst_PYTHON =	qa_usrp.py
 # The straight C++ library
 
 AM_CPPFLAGS = \
+	$(USRP_INCLUDES) \
 	$(STD_DEFINES_AND_INCLUDES) \
 	$(PYTHON_CPPFLAGS) \
-	$(USRP_INCLUDES) \
 	$(USB_INCLUDES) \
 	$(WITH_INCLUDES)
 
diff --git a/gr-usrp2/src/Makefile.am b/gr-usrp2/src/Makefile.am
index 03b6d0dd9d..0d55d73ba6 100644
--- a/gr-usrp2/src/Makefile.am
+++ b/gr-usrp2/src/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -42,10 +42,10 @@ DISTCLEANFILES = run_tests
 # libgr-usrp.so
 # ----------------------------------------------------------------------
 AM_CPPFLAGS = \
-	$(STD_DEFINES_AND_INCLUDES)  \
 	$(GRUEL_INCLUDES) \
-	$(PYTHON_CPPFLAGS) \
 	$(USRP2_INCLUDES) \
+	$(STD_DEFINES_AND_INCLUDES)  \
+	$(PYTHON_CPPFLAGS) \
 	$(WITH_INCLUDES)
 
 lib_LTLIBRARIES = libgnuradio-usrp2.la
diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am
index 1bcd26e907..5c3302f199 100644
--- a/gruel/src/lib/Makefile.am
+++ b/gruel/src/lib/Makefile.am
@@ -23,8 +23,8 @@ include $(top_srcdir)/Makefile.common
 
 SUBDIRS = pmt msg
 
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
-
+AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \
+	$(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
 
 TESTS = test_gruel
 
diff --git a/gruel/src/lib/msg/Makefile.am b/gruel/src/lib/msg/Makefile.am
index 13a6570674..9dbaf10f53 100644
--- a/gruel/src/lib/msg/Makefile.am
+++ b/gruel/src/lib/msg/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2009 Free Software Foundation, Inc.
+# Copyright 2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -21,7 +21,8 @@
 
 include $(top_srcdir)/Makefile.common
 
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) \
+	$(BOOST_CPPFLAGS) $(WITH_INCLUDES)
 
 noinst_LTLIBRARIES = libmsg.la
 
diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am
index 8750cbdf83..d3efc1afa3 100644
--- a/gruel/src/lib/pmt/Makefile.am
+++ b/gruel/src/lib/pmt/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2008,2009 Free Software Foundation, Inc.
+# Copyright 2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -21,8 +21,8 @@
 
 include $(top_srcdir)/Makefile.common
 
-AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES)
-
+AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \
+	$(CPPUNIT_INCLUDES) $(WITH_INCLUDES)
 
 noinst_LTLIBRARIES = libpmt.la
 
diff --git a/usrp/host/lib/Makefile.am b/usrp/host/lib/Makefile.am
index 23889fc85a..b8b60fa984 100644
--- a/usrp/host/lib/Makefile.am
+++ b/usrp/host/lib/Makefile.am
@@ -33,7 +33,7 @@ libusrp_la_common_LIBADD = 		\
 
 # darwin fusb requires gruel (for threading)
 if FUSB_TECH_darwin
-AM_CPPFLAGS = $(common_INCLUDES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) $(WITH_INCLUDES)
+AM_CPPFLAGS = $(GRUEL_INCLUDES) $(common_INCLUDES) $(BOOST_CPPFLAGS) $(WITH_INCLUDES)
 libusrp_la_LIBADD = $(libusrp_la_common_LIBADD) $(GRUEL_LA)
 libusrp_la_LDFLAGS = $(libusrp_la_common_LDFLAGS) -framework CoreFoundation
 else
diff --git a/usrp/host/swig/Makefile.am b/usrp/host/swig/Makefile.am
index d2e6b8bc10..c846f267bd 100644
--- a/usrp/host/swig/Makefile.am
+++ b/usrp/host/swig/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2001,2003,2004,2006,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2001,2003,2004,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -23,8 +23,8 @@ include $(top_srcdir)/Makefile.common
 
 AM_CPPFLAGS =			\
 	$(USRP_INCLUDES)	\
-	$(PYTHON_CPPFLAGS)	\
 	-I$(srcdir)		\
+	$(PYTHON_CPPFLAGS)	\
 	$(USB_INCLUDES)		\
 	$(WITH_INCLUDES)
 
diff --git a/usrp2/host/apps/Makefile.am b/usrp2/host/apps/Makefile.am
index 4a26898fa7..087ab9e311 100644
--- a/usrp2/host/apps/Makefile.am
+++ b/usrp2/host/apps/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2007, 2008 Free Software Foundation, Inc.
+# Copyright 2007,2008,2010 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,9 +19,9 @@ include $(top_srcdir)/Makefile.common
 
 AM_CPPFLAGS = \
     $(USRP2_INCLUDES) \
+    $(GRUEL_INCLUDES) \
     $(STD_DEFINES_AND_INCLUDES) \
-    $(CPPUNIT_INCLUDES) \
-    $(GRUEL_INCLUDES)
+    $(CPPUNIT_INCLUDES)
 
 LDADD = \
     $(USRP2_LA) \
diff --git a/usrp2/host/lib/Makefile.am b/usrp2/host/lib/Makefile.am
index 209cb70953..85bec46736 100644
--- a/usrp2/host/lib/Makefile.am
+++ b/usrp2/host/lib/Makefile.am
@@ -19,10 +19,10 @@ include $(top_srcdir)/Makefile.common
 
 AM_CPPFLAGS = \
     $(USRP2_INCLUDES) \
-    $(BOOST_CPPFLAGS) \
+    $(GRUEL_INCLUDES) \
     $(STD_DEFINES_AND_INCLUDES) \
-    $(CPPUNIT_INCLUDES) \
-    $(GRUEL_INCLUDES) 
+    $(BOOST_CPPFLAGS) \
+    $(CPPUNIT_INCLUDES)
 
 bin_PROGRAMS = usrp2_socket_opener
 usrp2_socket_opener_SOURCES = usrp2_socket_opener.cc
-- 
cgit v1.2.3


From 2e633fc33dcbc3e1b5c35323ebe24373d57ea459 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 11:13:53 -0400
Subject: Adding a FIR filter implemented with its own internal buffer. This
 one keeps its own delay line and just takes in input samples instead of a
 pointer to an external buffer.

The synthesis filter is being updated to use the new FIR implementation.
---
 gnuradio-core/src/lib/filter/Makefile.am           |   4 +-
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.cc  |  22 ++--
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.h   |  23 ++--
 .../lib/filter/gri_fir_filter_with_buffer_ccf.cc   |  81 +++++++++++++
 .../lib/filter/gri_fir_filter_with_buffer_ccf.h    | 130 +++++++++++++++++++++
 5 files changed, 243 insertions(+), 17 deletions(-)
 create mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
 create mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h

diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index 6a6532eb0a..5c7473d06f 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -1,5 +1,5 @@
 #
-# Copyright 2001,2002,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
+# Copyright 2001,2002,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -190,6 +190,7 @@ libfilter_la_common_SOURCES = 		\
 	gr_fft_filter_fff.cc		\
 	gr_goertzel_fc.cc		\
 	gr_filter_delay_fc.cc		\
+	gri_fir_filter_with_buffer_ccf.cc \
 	gr_fractional_interpolator_ff.cc \
 	gr_fractional_interpolator_cc.cc \
 	gr_hilbert_fc.cc		\
@@ -267,6 +268,7 @@ grinclude_HEADERS = 			\
 	gr_fft_filter_ccc.h		\
 	gr_fft_filter_fff.h		\
 	gr_filter_delay_fc.h		\
+	gri_fir_filter_with_buffer_ccf.h \
 	gr_fir_sysconfig_x86.h		\
 	gr_fir_sysconfig_powerpc.h	\
 	gr_fractional_interpolator_ff.h	\
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
index b1365bcf90..0b31bcf72e 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
@@ -48,16 +48,18 @@ gr_pfb_synthesis_filterbank_ccf::gr_pfb_synthesis_filterbank_ccf
 			  numchans),
     d_updated (false), d_numchans(numchans)
 {
-  d_filters = std::vector<gr_fir_ccf*>(d_numchans);
+  //d_filters = std::vector<gr_fir_ccf*>(d_numchans);
+  d_filters = std::vector<gri_fir_filter_with_buffer_ccf*>(d_numchans);
 
-  d_buffer = new gr_complex*[d_numchans];
+  //d_buffer = new gr_complex*[d_numchans];
 
   // Create an FIR filter for each channel and zero out the taps
   std::vector<float> vtaps(0, d_numchans);
   for(unsigned int i = 0; i < d_numchans; i++) {
-    d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
-    d_buffer[i] = new gr_complex[65535];
-    memset(d_buffer[i], 0, 65535*sizeof(gr_complex));
+    d_filters[i] = new gri_fir_filter_with_buffer_ccf(vtaps);
+    //d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
+    //d_buffer[i] = new gr_complex[65535];
+    //memset(d_buffer[i], 0, 65535*sizeof(gr_complex));
   }
 
   // Now, actually set the filters' taps
@@ -134,7 +136,7 @@ gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
   gr_complex *out = (gr_complex *) output_items[0];
   int numsigs = input_items.size();
   int ndiff   = d_numchans - numsigs;
-  int nhalf = (int)ceil((float)numsigs/2.0f);
+  unsigned int nhalf = (unsigned int)ceil((float)numsigs/2.0f);
 
   if (d_updated) {
     d_updated = false;
@@ -165,18 +167,22 @@ gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
     d_fft->execute();
 
     for(i = 0; i < d_numchans; i++) {
-      d_buffer[i][n+d_taps_per_filter-1] = d_fft->get_outbuf()[i];
-      out[d_numchans-i-1] = d_filters[d_numchans-i-1]->filter(&d_buffer[i][n]);
+      //d_buffer[i][n+d_taps_per_filter-1] = d_fft->get_outbuf()[i];
+      //out[d_numchans-i-1] = d_filters[d_numchans-i-1]->filter(&d_buffer[i][n]);
+      out[d_numchans-i-1] = d_filters[d_numchans-i-1]->filter(d_fft->get_outbuf()[i]);
     }
     out += d_numchans;
   }
 
   // Move the last chunk of memory to the front for the next entry
   // this make sure that the first taps_per_filter values are correct
+
+  /*
   for(i = 0; i < d_numchans; i++) {
     memcpy(d_buffer[i], &d_buffer[i][n],
 	   (d_taps_per_filter)*sizeof(gr_complex));
   }
+  */
 
   return noutput_items;
 }
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
index 4b6235a8b5..27c8c2c508 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
@@ -25,6 +25,7 @@
 #define	INCLUDED_GR_PFB_SYNTHESIS_FILTERBANK_CCF_H
 
 #include <gr_sync_interpolator.h>
+#include <gri_fir_filter_with_buffer_ccf.h>
 
 class gr_pfb_synthesis_filterbank_ccf;
 typedef boost::shared_ptr<gr_pfb_synthesis_filterbank_ccf> gr_pfb_synthesis_filterbank_ccf_sptr;
@@ -49,24 +50,29 @@ class gr_pfb_synthesis_filterbank_ccf : public gr_sync_interpolator
  private:
   /*!
    * Build the polyphase synthesis filterbank.
-   * \param numchans (unsigned integer) Specifies the number of channels <EM>M</EM>
-   * \param taps    (vector/list of floats) The prototype filter to populate the filterbank.
+   * \param numchans (unsigned integer) Specifies the number of 
+                     channels <EM>M</EM>
+   * \param taps    (vector/list of floats) The prototype filter to
+                    populate the filterbank.
    */
   friend gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf 
       (unsigned int numchans, const std::vector<float> &taps);
 
   bool			   d_updated;
   unsigned int             d_numchans;
-  std::vector<gr_fir_ccf*> d_filters;
-  std::vector< std::vector<float> > d_taps;
   unsigned int             d_taps_per_filter;
   gri_fft_complex         *d_fft;
-  gr_complex             **d_buffer;
+  //gr_complex             **d_buffer;
+  std::vector< gri_fir_filter_with_buffer_ccf*> d_filters;
+  std::vector< std::vector<float> > d_taps;
+
 
   /*!
    * Build the polyphase synthesis filterbank.
-   * \param numchans (unsigned integer) Specifies the number of channels <EM>M</EM>
-   * \param taps    (vector/list of floats) The prototype filter to populate the filterbank.
+   * \param numchans (unsigned integer) Specifies the number of
+                     channels <EM>M</EM>
+   * \param taps    (vector/list of floats) The prototype filter
+                    to populate the filterbank.
    */
   gr_pfb_synthesis_filterbank_ccf (unsigned int numchans, 
 				   const std::vector<float> &taps);
@@ -76,7 +82,8 @@ public:
   
   /*!
    * Resets the filterbank's filter taps with the new prototype filter
-   * \param taps    (vector/list of floats) The prototype filter to populate the filterbank.
+   * \param taps    (vector/list of floats) The prototype filter to
+                    populate the filterbank.
    */
   void set_taps (const std::vector<float> &taps);
 
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
new file mode 100644
index 0000000000..e9545549f9
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
@@ -0,0 +1,81 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 <gri_fir_filter_with_buffer_ccf.h>
+#include <cstdio>
+
+gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector<float> &taps)
+{
+  d_buffer = NULL;
+  set_taps(taps);
+}
+
+gri_fir_filter_with_buffer_ccf::~gri_fir_filter_with_buffer_ccf()
+{
+  free(d_buffer);
+}
+
+gr_complex 
+gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
+{
+#if 0
+  unsigned int i;
+  
+  for(i = ntaps()-1; i > 0; i--) {
+    d_buffer[i] = d_buffer[i-1];
+  }
+  d_buffer[0] = input;
+
+  gr_complex out = d_buffer[0]*d_taps[0];
+  for(i = 1; i < ntaps(); i++) {
+    out += d_buffer[i]*d_taps[i];
+  }
+  return out;
+
+#else
+  unsigned int i;
+
+  d_buffer[d_idx] = input;
+  d_buffer[d_idx+ntaps()] = input;
+  //d_idx = (d_idx + 1) % ntaps();
+  d_idx++;
+  if(d_idx == ntaps())
+    d_idx = 0;
+
+  gr_complex out = d_buffer[d_idx]*d_taps[0];
+  for(i = 1; i < ntaps(); i++) {
+    out += d_buffer[d_idx + i]*d_taps[i];
+  }
+  return out;
+#endif
+}
+
+void
+gri_fir_filter_with_buffer_ccf::filterN (gr_complex output[],
+					 const gr_complex input[],
+					 unsigned long n)
+{
+
+}
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
new file mode 100644
index 0000000000..5adc3e231f
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
@@ -0,0 +1,130 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+/*
+ * WARNING: This file is automatically generated by generate_gr_fir_XXX.py
+ * Any changes made to this file will be overwritten.
+ */
+
+
+#ifndef INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_H
+#define INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_H
+
+#include <vector>
+#include <gr_types.h>
+#include <gr_reverse.h>
+#include <string.h>
+
+/*!
+ * \brief FIR with internal buffer for gr_complex input, 
+          gr_complex output and float taps
+ * \ingroup filter
+ * 
+ */
+
+class gri_fir_filter_with_buffer_ccf {
+
+protected:
+  std::vector<float>	d_taps;		// reversed taps
+  gr_complex           *d_buffer;
+  unsigned int          d_idx;
+
+public:
+
+  // CONSTRUCTORS
+
+  /*!
+   * \brief construct new FIR with given taps.
+   *
+   * Note that taps must be in forward order, e.g., coefficient 0 is
+   * stored in new_taps[0], coefficient 1 is stored in
+   * new_taps[1], etc.
+   */
+  gri_fir_filter_with_buffer_ccf (const std::vector<float> &taps);
+
+  ~gri_fir_filter_with_buffer_ccf ();
+
+  // MANIPULATORS
+
+  /*!
+   * \brief compute a single output value.
+   *
+   * \p input must have ntaps() valid entries.
+   * input[0] .. input[ntaps() - 1] are referenced to compute the output value.
+   *
+   * \returns the filtered input value.
+   */
+  gr_complex filter (gr_complex input);
+
+  /*!
+   * \brief compute an array of N output values.
+   *
+   * \p input must have (n - 1 + ntaps()) valid entries.
+   * input[0] .. input[n - 1 + ntaps() - 1] are referenced to compute the output values.
+   */
+  void filterN (gr_complex output[], const gr_complex input[],
+		unsigned long n);
+
+  /*!
+   * \brief compute an array of N output values, decimating the input
+   *
+   * \p input must have (decimate * (n - 1) + ntaps()) valid entries.
+   * input[0] .. input[decimate * (n - 1) + ntaps() - 1] are referenced to 
+   * compute the output values.
+   */
+  void filterNdec (gr_complex output[], const gr_complex input[],
+		   unsigned long n, unsigned decimate);
+
+  /*!
+   * \brief install \p new_taps as the current taps.
+   */
+  void set_taps (const std::vector<float> &taps)
+  {
+    d_taps = gr_reverse(taps);
+    //d_taps = (taps);
+
+    if(d_buffer != NULL)
+      free(d_buffer);
+    
+    // FIXME: memalign this to 16-byte boundaries for SIMD later
+    d_buffer = (gr_complex*)malloc(sizeof(gr_complex) * 2 * d_taps.size());
+    memset(d_buffer, 0x00, sizeof(gr_complex) * 2 * d_taps.size());
+    d_idx = 0;
+  }
+
+  // ACCESSORS
+
+  /*!
+   * \return number of taps in filter.
+   */
+  unsigned ntaps () const { return d_taps.size (); }
+
+  /*!
+   * \return current taps
+   */
+  const std::vector<float> get_taps () const
+  {
+    return gr_reverse(d_taps);
+  }
+};
+
+#endif /* INCLUDED_GR_GR_FIR_FILTER_WITH_BUFFER_CCF_H */
-- 
cgit v1.2.3


From 77f6fcffa4b63aed0cc5de87d2b8f7aff00ff2c8 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 11:46:46 -0400
Subject: Adding a test example for the synthesis filter.

---
 gnuradio-examples/python/pfb/synth_filter.py | 58 ++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100755 gnuradio-examples/python/pfb/synth_filter.py

diff --git a/gnuradio-examples/python/pfb/synth_filter.py b/gnuradio-examples/python/pfb/synth_filter.py
new file mode 100755
index 0000000000..b1708fde5b
--- /dev/null
+++ b/gnuradio-examples/python/pfb/synth_filter.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, blks2
+import scipy, pylab
+
+def main():
+    N = 1000000
+    fs = 8000
+
+    #freqs = [100, 200, 300, 400, 500]
+    freqs = [100,]
+    nchans = 7
+
+    sigs = list()
+    fmtx = list()
+    for fi in freqs:
+        s = gr.sig_source_c(fs, gr.GR_SIN_WAVE, fi, 1)
+        fm = blks2.nbfm_tx (fs, 4*fs, max_dev=10000, tau=75e-6)
+        sigs.append(s)
+        fmtx.append(fm)
+
+    taps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+    print "Num. Taps = %d (taps per filter = %d)" % (len(taps), 
+                                                     len(taps)/nchans)
+    #filtbank = blks2.synthesis_filterbank(nchans, taps)
+    filtbank = gr.pfb_synthesis_filterbank_ccf(nchans, taps)
+
+    head = gr.head(gr.sizeof_gr_complex, N)
+    snk = gr.vector_sink_c()
+
+    tb = gr.top_block()
+    tb.connect(filtbank, head, snk)
+
+    for i,si in enumerate(sigs):
+        #tb.connect(si, fmtx[i], (filtbank, i))
+        tb.connect(si, (filtbank, i))
+    
+    tb.run()
+
+    if 0:
+        f1 = pylab.figure(1)
+        s1 = f1.add_subplot(1,1,1)
+        s1.plot(snk.data()[1000:])
+        
+        fftlen = 2048
+        f2 = pylab.figure(2)
+        s2 = f2.add_subplot(1,1,1)
+        winfunc = scipy.blackman
+        #winfunc = scipy.hamming
+        s2.psd(snk.data()[10000:], NFFT=fftlen,
+               Fs = nchans*fs,
+               noverlap=fftlen/4,
+               window = lambda d: d*winfunc(fftlen))
+
+        pylab.show()
+
+if __name__ == "__main__":
+    main()
-- 
cgit v1.2.3


From e037d329ed2b80c655f7d5c0fcdcef8353b6c52f Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 14:35:03 -0400
Subject: Cleaning up the new FIR filter implementation. Protects against some
 corner cases and adds filterN.

---
 .../lib/filter/gri_fir_filter_with_buffer_ccf.cc   | 34 ++++++++--------------
 .../lib/filter/gri_fir_filter_with_buffer_ccf.h    | 11 ++++---
 2 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
index e9545549f9..55e316d027 100644
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
@@ -23,8 +23,8 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+
 #include <gri_fir_filter_with_buffer_ccf.h>
-#include <cstdio>
 
 gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector<float> &taps)
 {
@@ -34,42 +34,30 @@ gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector
 
 gri_fir_filter_with_buffer_ccf::~gri_fir_filter_with_buffer_ccf()
 {
-  free(d_buffer);
+  if(d_buffer != NULL)
+    free(d_buffer);
 }
 
 gr_complex 
 gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
 {
-#if 0
-  unsigned int i;
-  
-  for(i = ntaps()-1; i > 0; i--) {
-    d_buffer[i] = d_buffer[i-1];
-  }
-  d_buffer[0] = input;
-
-  gr_complex out = d_buffer[0]*d_taps[0];
-  for(i = 1; i < ntaps(); i++) {
-    out += d_buffer[i]*d_taps[i];
-  }
-  return out;
-
-#else
   unsigned int i;
 
   d_buffer[d_idx] = input;
   d_buffer[d_idx+ntaps()] = input;
+
+  // using the later for the case when ntaps=0;
+  // profiling shows this doesn't make a difference
   //d_idx = (d_idx + 1) % ntaps();
   d_idx++;
-  if(d_idx == ntaps())
+  if(d_idx >= ntaps())
     d_idx = 0;
 
-  gr_complex out = d_buffer[d_idx]*d_taps[0];
-  for(i = 1; i < ntaps(); i++) {
+  gr_complex out = gr_complex(0,0);
+  for(i = 0; i < ntaps(); i++) {
     out += d_buffer[d_idx + i]*d_taps[i];
   }
   return out;
-#endif
 }
 
 void
@@ -77,5 +65,7 @@ gri_fir_filter_with_buffer_ccf::filterN (gr_complex output[],
 					 const gr_complex input[],
 					 unsigned long n)
 {
-
+  for(unsigned long i = 0; i < n; i++) {
+    output[i] = filter(input[i]);
+  }
 }
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
index 5adc3e231f..c91d70534e 100644
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
@@ -33,6 +33,7 @@
 #include <gr_types.h>
 #include <gr_reverse.h>
 #include <string.h>
+#include <cstdio>
 
 /*!
  * \brief FIR with internal buffer for gr_complex input, 
@@ -100,14 +101,16 @@ public:
   void set_taps (const std::vector<float> &taps)
   {
     d_taps = gr_reverse(taps);
-    //d_taps = (taps);
 
-    if(d_buffer != NULL)
+    if(d_buffer != NULL) {
       free(d_buffer);
+      d_buffer = NULL;
+    }
     
     // FIXME: memalign this to 16-byte boundaries for SIMD later
-    d_buffer = (gr_complex*)malloc(sizeof(gr_complex) * 2 * d_taps.size());
-    memset(d_buffer, 0x00, sizeof(gr_complex) * 2 * d_taps.size());
+    size_t t = sizeof(gr_complex) * 2 * d_taps.size();
+    d_buffer = (gr_complex*)malloc(t);
+    memset(d_buffer, 0x00, t);
     d_idx = 0;
   }
 
-- 
cgit v1.2.3


From 72c9a5a158b0b18964c8f2f8f914f16060868146 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 14:36:38 -0400
Subject: Cleaning up synthesis filter and using new FIR filter with buffer.

---
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.cc   | 21 +--------------------
 .../lib/filter/gr_pfb_synthesis_filterbank_ccf.h    |  2 --
 2 files changed, 1 insertion(+), 22 deletions(-)

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
index 0b31bcf72e..9fad1bd0d8 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.cc
@@ -25,8 +25,6 @@
 #endif
 
 #include <gr_pfb_synthesis_filterbank_ccf.h>
-#include <gr_fir_ccf.h>
-#include <gr_fir_util.h>
 #include <gri_fft.h>
 #include <gr_io_signature.h>
 #include <cstdio>
@@ -48,18 +46,12 @@ gr_pfb_synthesis_filterbank_ccf::gr_pfb_synthesis_filterbank_ccf
 			  numchans),
     d_updated (false), d_numchans(numchans)
 {
-  //d_filters = std::vector<gr_fir_ccf*>(d_numchans);
   d_filters = std::vector<gri_fir_filter_with_buffer_ccf*>(d_numchans);
 
-  //d_buffer = new gr_complex*[d_numchans];
-
   // Create an FIR filter for each channel and zero out the taps
   std::vector<float> vtaps(0, d_numchans);
   for(unsigned int i = 0; i < d_numchans; i++) {
     d_filters[i] = new gri_fir_filter_with_buffer_ccf(vtaps);
-    //d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
-    //d_buffer[i] = new gr_complex[65535];
-    //memset(d_buffer[i], 0, 65535*sizeof(gr_complex));
   }
 
   // Now, actually set the filters' taps
@@ -167,22 +159,11 @@ gr_pfb_synthesis_filterbank_ccf::work (int noutput_items,
     d_fft->execute();
 
     for(i = 0; i < d_numchans; i++) {
-      //d_buffer[i][n+d_taps_per_filter-1] = d_fft->get_outbuf()[i];
-      //out[d_numchans-i-1] = d_filters[d_numchans-i-1]->filter(&d_buffer[i][n]);
       out[d_numchans-i-1] = d_filters[d_numchans-i-1]->filter(d_fft->get_outbuf()[i]);
     }
+    
     out += d_numchans;
   }
 
-  // Move the last chunk of memory to the front for the next entry
-  // this make sure that the first taps_per_filter values are correct
-
-  /*
-  for(i = 0; i < d_numchans; i++) {
-    memcpy(d_buffer[i], &d_buffer[i][n],
-	   (d_taps_per_filter)*sizeof(gr_complex));
-  }
-  */
-
   return noutput_items;
 }
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
index 27c8c2c508..f5b1cbb946 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
+++ b/gnuradio-core/src/lib/filter/gr_pfb_synthesis_filterbank_ccf.h
@@ -32,7 +32,6 @@ typedef boost::shared_ptr<gr_pfb_synthesis_filterbank_ccf> gr_pfb_synthesis_filt
 gr_pfb_synthesis_filterbank_ccf_sptr gr_make_pfb_synthesis_filterbank_ccf 
     (unsigned int numchans, const std::vector<float> &taps);
 
-class gr_fir_ccf;
 class gri_fft_complex;
 
 
@@ -62,7 +61,6 @@ class gr_pfb_synthesis_filterbank_ccf : public gr_sync_interpolator
   unsigned int             d_numchans;
   unsigned int             d_taps_per_filter;
   gri_fft_complex         *d_fft;
-  //gr_complex             **d_buffer;
   std::vector< gri_fir_filter_with_buffer_ccf*> d_filters;
   std::vector< std::vector<float> > d_taps;
 
-- 
cgit v1.2.3


From 62042813aeeffeeb6091e229761c5068b5ed5cde Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 14:37:55 -0400
Subject: Adding QA code for fir filter with buffer.

---
 gnuradio-core/src/lib/filter/Makefile.am           |   6 +-
 gnuradio-core/src/lib/filter/qa_filter.cc          |   2 +
 .../filter/qa_gri_fir_filter_with_buffer_ccf.cc    | 148 +++++++++++++++++++++
 .../lib/filter/qa_gri_fir_filter_with_buffer_ccf.h |  43 ++++++
 gnuradio-examples/python/pfb/synth_filter.py       |   3 +-
 5 files changed, 198 insertions(+), 4 deletions(-)
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h

diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index 5c7473d06f..ff6c546fdb 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -222,7 +222,8 @@ libfilter_qa_la_common_SOURCES = 	\
 	qa_gr_fir_scc.cc		\
 	qa_gr_rotator.cc		\
 	qa_gri_mmse_fir_interpolator.cc	\
-	qa_gri_mmse_fir_interpolator_cc.cc	
+	qa_gri_mmse_fir_interpolator_cc.cc \
+	qa_gri_fir_filter_with_buffer_ccf.cc
 
 if MD_CPU_generic
 libfilter_la_SOURCES = $(libfilter_la_common_SOURCES) $(generic_CODE)
@@ -328,7 +329,8 @@ noinst_HEADERS = 			\
 	qa_gr_fir_scc.h			\
 	qa_gr_rotator.h			\
 	qa_gri_mmse_fir_interpolator.h	\
-	qa_gri_mmse_fir_interpolator_cc.h	
+	qa_gri_mmse_fir_interpolator_cc.h \
+	qa_gri_fir_filter_with_buffer_ccf.h
 
 
 if PYTHON
diff --git a/gnuradio-core/src/lib/filter/qa_filter.cc b/gnuradio-core/src/lib/filter/qa_filter.cc
index 878d48023b..b9a30ba42b 100644
--- a/gnuradio-core/src/lib/filter/qa_filter.cc
+++ b/gnuradio-core/src/lib/filter/qa_filter.cc
@@ -36,6 +36,7 @@
 #include <qa_gri_mmse_fir_interpolator.h>
 #include <qa_gri_mmse_fir_interpolator_cc.h>
 #include <qa_gr_rotator.h>
+#include <qa_gri_fir_filter_with_buffer_ccf.h>
 
 CppUnit::TestSuite *
 qa_filter::suite ()
@@ -51,6 +52,7 @@ qa_filter::suite ()
   s->addTest (qa_gri_mmse_fir_interpolator::suite ());
   s->addTest (qa_gri_mmse_fir_interpolator_cc::suite ());
   s->addTest (qa_gr_rotator::suite ());
+  s->addTest (qa_gri_fir_filter_with_buffer_ccf::suite ());
 
   return s;
 }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
new file mode 100644
index 0000000000..f2e09db1cf
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
@@ -0,0 +1,148 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_types.h>
+#include <qa_gri_fir_filter_with_buffer_ccf.h>
+#include <gri_fir_filter_with_buffer_ccf.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef gr_complex	i_type;
+typedef gr_complex	o_type;
+typedef float		tap_type;
+typedef	gr_complex	acc_type;
+
+using std::vector;
+
+#define	ERR_DELTA	(1e-5)
+
+#define	NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+  return 2.0 * ((float) random () / RANDOM_MAX - 0.5);	// uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++)
+    buf[i] = (float) rint (uniform () * 32767);
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++){
+    float re = rint (uniform () * 32767);
+    float im = rint (uniform () * 32767);
+    buf[i] = gr_complex (re, im);
+  }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+  acc_type	sum = 0;
+  for (int i = 0; i < ntaps; i++) {
+    sum += input[i] * taps[i];
+  }
+      
+  return sum;
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+
+void
+qa_gri_fir_filter_with_buffer_ccf::t1 ()  
+{
+  const int	MAX_TAPS	= 9;
+  const int	OUTPUT_LEN	= 17;
+  const int	INPUT_LEN	= MAX_TAPS + OUTPUT_LEN;
+
+  // Mem aligned buffer not really necessary, but why not?
+  i_type       *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+  i_type       *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+  o_type 	expected_output[OUTPUT_LEN];
+  o_type 	actual_output[OUTPUT_LEN];
+  tap_type	taps[MAX_TAPS];
+
+  srandom (0);	// we want reproducibility
+  memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+  for (int n = 0; n <= MAX_TAPS; n++){
+    for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+      // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+      // build random test case
+      random_complex (input, INPUT_LEN);
+      random_floats (taps, MAX_TAPS);
+
+      // compute expected output values
+      memset(dline, 0, INPUT_LEN*sizeof(i_type));
+      for (int o = 0; o < ol; o++){
+	// use an actual delay line for this test
+	for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	  dline[oo] = dline[oo-1];
+	dline[0] = input[o];
+	expected_output[o] = ref_dotprod (dline, taps, n);
+      }
+
+      // build filter
+      vector<tap_type> f1_taps(&taps[0], &taps[n]);
+      gri_fir_filter_with_buffer_ccf *f1 = new gri_fir_filter_with_buffer_ccf(f1_taps);
+
+      // zero the output, then do the filtering
+      memset (actual_output, 0, sizeof (actual_output));
+      f1->filterN (actual_output, input, ol);
+
+      // check results
+      //
+      // we use a sloppy error margin because on the x86 architecture,
+      // our reference implementation is using 80 bit floating point
+      // arithmetic, while the SSE version is using 32 bit float point
+      // arithmetic.
+      
+      for (int o = 0; o < ol; o++){
+	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+				       abs (expected_output[o]) * ERR_DELTA);
+      }
+      delete f1;
+    }
+  }
+  free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h
new file mode 100644
index 0000000000..b80be70a79
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h
@@ -0,0 +1,43 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 _QA_GRI_FIR_FILTER_WITH_BUFFER_CCF_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_CCF_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_ccf : public CppUnit::TestCase {
+
+  CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_ccf);
+  CPPUNIT_TEST (t1);
+  CPPUNIT_TEST_SUITE_END ();
+
+ private:
+
+  void t1 ();
+  // void t2 ();
+  // void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_CCF_H_ */
diff --git a/gnuradio-examples/python/pfb/synth_filter.py b/gnuradio-examples/python/pfb/synth_filter.py
index b1708fde5b..015ebd6684 100755
--- a/gnuradio-examples/python/pfb/synth_filter.py
+++ b/gnuradio-examples/python/pfb/synth_filter.py
@@ -7,8 +7,7 @@ def main():
     N = 1000000
     fs = 8000
 
-    #freqs = [100, 200, 300, 400, 500]
-    freqs = [100,]
+    freqs = [100, 200, 300, 400, 500]
     nchans = 7
 
     sigs = list()
-- 
cgit v1.2.3


From 80b84262f6fba7da08d888e73e8cb0e981a3a065 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 17:00:11 -0400
Subject: Work on examples for the synthesize filterbank block. The cleans up
 the simple example and adds a new example that synthesizes a number of
 signals and then channelizes them again. It displays the synthesized PSD as
 well as the PSD and time waveform of one of the channels that's specified in
 teh code.

---
 gnuradio-examples/python/pfb/synth_filter.py  |  28 +++++--
 gnuradio-examples/python/pfb/synth_to_chan.py | 105 ++++++++++++++++++++++++++
 2 files changed, 126 insertions(+), 7 deletions(-)
 create mode 100755 gnuradio-examples/python/pfb/synth_to_chan.py

diff --git a/gnuradio-examples/python/pfb/synth_filter.py b/gnuradio-examples/python/pfb/synth_filter.py
index 015ebd6684..a1562f9eac 100755
--- a/gnuradio-examples/python/pfb/synth_filter.py
+++ b/gnuradio-examples/python/pfb/synth_filter.py
@@ -1,4 +1,24 @@
 #!/usr/bin/env python
+#
+# Copyright 2010 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, blks2
 import scipy, pylab
@@ -11,17 +31,13 @@ def main():
     nchans = 7
 
     sigs = list()
-    fmtx = list()
     for fi in freqs:
         s = gr.sig_source_c(fs, gr.GR_SIN_WAVE, fi, 1)
-        fm = blks2.nbfm_tx (fs, 4*fs, max_dev=10000, tau=75e-6)
         sigs.append(s)
-        fmtx.append(fm)
 
     taps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
     print "Num. Taps = %d (taps per filter = %d)" % (len(taps), 
                                                      len(taps)/nchans)
-    #filtbank = blks2.synthesis_filterbank(nchans, taps)
     filtbank = gr.pfb_synthesis_filterbank_ccf(nchans, taps)
 
     head = gr.head(gr.sizeof_gr_complex, N)
@@ -31,12 +47,11 @@ def main():
     tb.connect(filtbank, head, snk)
 
     for i,si in enumerate(sigs):
-        #tb.connect(si, fmtx[i], (filtbank, i))
         tb.connect(si, (filtbank, i))
     
     tb.run()
 
-    if 0:
+    if 1:
         f1 = pylab.figure(1)
         s1 = f1.add_subplot(1,1,1)
         s1.plot(snk.data()[1000:])
@@ -45,7 +60,6 @@ def main():
         f2 = pylab.figure(2)
         s2 = f2.add_subplot(1,1,1)
         winfunc = scipy.blackman
-        #winfunc = scipy.hamming
         s2.psd(snk.data()[10000:], NFFT=fftlen,
                Fs = nchans*fs,
                noverlap=fftlen/4,
diff --git a/gnuradio-examples/python/pfb/synth_to_chan.py b/gnuradio-examples/python/pfb/synth_to_chan.py
new file mode 100755
index 0000000000..1beda1a549
--- /dev/null
+++ b/gnuradio-examples/python/pfb/synth_to_chan.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 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, blks2
+import scipy, pylab
+
+def main():
+    N = 1000000
+    fs = 8000
+
+    freqs = [100, 200, 300, 400, 500]
+    nchans = 7
+
+    sigs = list()
+    fmtx = list()
+    for fi in freqs:
+        s = gr.sig_source_f(fs, gr.GR_SIN_WAVE, fi, 1)
+        fm = blks2.nbfm_tx (fs, 4*fs, max_dev=10000, tau=75e-6)
+        sigs.append(s)
+        fmtx.append(fm)
+
+    syntaps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+    print "Synthesis Num. Taps = %d (taps per filter = %d)" % (len(syntaps), 
+                                                               len(syntaps)/nchans)
+    chtaps = gr.firdes.low_pass_2(len(freqs), fs, fs/float(nchans)/2, 100, 100)
+    print "Channelizer Num. Taps = %d (taps per filter = %d)" % (len(chtaps), 
+                                                                 len(chtaps)/nchans)
+    filtbank = gr.pfb_synthesis_filterbank_ccf(nchans, syntaps)
+    channelizer = blks2.pfb_channelizer_ccf(nchans, chtaps)
+
+    noise_level = 0.01
+    head = gr.head(gr.sizeof_gr_complex, N)
+    noise = gr.noise_source_c(gr.GR_GAUSSIAN, noise_level)
+    addnoise = gr.add_cc()
+    snk_synth = gr.vector_sink_c()
+
+    tb = gr.top_block()
+
+    tb.connect(noise, (addnoise,0))
+    tb.connect(filtbank, head, (addnoise, 1))
+    tb.connect(addnoise, channelizer)
+    tb.connect(addnoise, snk_synth)
+
+    snk = list()
+    for i,si in enumerate(sigs):
+        tb.connect(si, fmtx[i], (filtbank, i))
+
+    for i in xrange(nchans):
+        snk.append(gr.vector_sink_c())
+        tb.connect((channelizer, i), snk[i])
+    
+    tb.run()
+
+    if 1:
+        channel = 1
+        data = snk[channel].data()[1000:]
+
+        f1 = pylab.figure(1)
+        s1 = f1.add_subplot(1,1,1)
+        s1.plot(data[10000:10200] )
+        s1.set_title(("Output Signal from Channel %d" % channel))
+        
+        fftlen = 2048
+        winfunc = scipy.blackman
+        #winfunc = scipy.hamming
+
+        f2 = pylab.figure(2)
+        s2 = f2.add_subplot(1,1,1)
+        s2.psd(data, NFFT=fftlen,
+               Fs = nchans*fs,
+               noverlap=fftlen/4,
+               window = lambda d: d*winfunc(fftlen))
+        s2.set_title(("Output PSD from Channel %d" % channel))
+
+        f3 = pylab.figure(3)
+        s3 = f3.add_subplot(1,1,1)
+        s3.psd(snk_synth.data()[1000:], NFFT=fftlen,
+               Fs = nchans*fs,
+               noverlap=fftlen/4,
+               window = lambda d: d*winfunc(fftlen))
+        s3.set_title("Output of Synthesis Filter")
+
+        pylab.show()
+
+if __name__ == "__main__":
+    main()
-- 
cgit v1.2.3


From eb7316ea486ab774c24cba1142a785080559e579 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 18:28:53 -0400
Subject: Using generators to make gri_fir_filter_with_buffer_XXX into all
 possible in/out/tap types we support.

---
 gnuradio-core/src/lib/filter/.gitignore            |  10 ++
 gnuradio-core/src/lib/filter/Makefile.am           |   7 +-
 gnuradio-core/src/lib/filter/Makefile.gen          |  17 ++-
 gnuradio-core/src/lib/filter/generate_all.py       |   2 +
 .../generate_gri_fir_filter_with_buffer_XXX.py     |  53 ++++++++
 .../lib/filter/gri_fir_filter_with_buffer_XXX.cc.t |  88 ++++++++++++++
 .../lib/filter/gri_fir_filter_with_buffer_XXX.h.t  | 119 ++++++++++++++++++
 .../lib/filter/gri_fir_filter_with_buffer_ccf.cc   |  71 -----------
 .../lib/filter/gri_fir_filter_with_buffer_ccf.h    | 133 ---------------------
 9 files changed, 293 insertions(+), 207 deletions(-)
 create mode 100755 gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
 create mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
 create mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
 delete mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
 delete mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h

diff --git a/gnuradio-core/src/lib/filter/.gitignore b/gnuradio-core/src/lib/filter/.gitignore
index 2d009f1545..4797b6b3a3 100644
--- a/gnuradio-core/src/lib/filter/.gitignore
+++ b/gnuradio-core/src/lib/filter/.gitignore
@@ -211,4 +211,14 @@
 /gr_rational_resampler_base_scc.cc
 /gr_rational_resampler_base_scc.h
 /gr_rational_resampler_base_scc.i
+/gri_fir_filter_with_buffer_ccc.cc
+/gri_fir_filter_with_buffer_ccc.h
+/gri_fir_filter_with_buffer_fcc.cc
+/gri_fir_filter_with_buffer_fcc.h
+/gri_fir_filter_with_buffer_fff.cc
+/gri_fir_filter_with_buffer_fff.h
+/gri_fir_filter_with_buffer_fsf.cc
+/gri_fir_filter_with_buffer_fsf.h
+/gri_fir_filter_with_buffer_scc.cc
+/gri_fir_filter_with_buffer_scc.h
 /stamp-*
diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index ff6c546fdb..31f919ba77 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -44,6 +44,7 @@ code_generator = 					\
 	generate_gr_fir_sysconfig_generic.py		\
 	generate_gr_fir_util.py				\
 	generate_gr_freq_xlating_fir_filter_XXX.py	\
+	generate_gri_fir_filter_with_buffer_XXX.py	\
 	generate_utils.py				\
 	gr_fir_XXX.cc.t					\
 	gr_fir_XXX.h.t					\
@@ -60,7 +61,11 @@ code_generator = 					\
 	gr_rational_resampler_base_XXX.i.t		\
 	gr_freq_xlating_fir_filter_XXX.cc.t		\
 	gr_freq_xlating_fir_filter_XXX.h.t		\
-	gr_freq_xlating_fir_filter_XXX.i.t
+	gr_freq_xlating_fir_filter_XXX.i.t		\
+	gri_fir_filter_with_buffer_XXX.cc.t		\
+	gri_fir_filter_with_buffer_XXX.h.t		\
+	gri_fir_filter_with_buffer_XXX.i.t
+
 
 # Source built by Python into $(builddir)
 BUILT_SOURCES =			\
diff --git a/gnuradio-core/src/lib/filter/Makefile.gen b/gnuradio-core/src/lib/filter/Makefile.gen
index 6809274fa9..909899c054 100644
--- a/gnuradio-core/src/lib/filter/Makefile.gen
+++ b/gnuradio-core/src/lib/filter/Makefile.gen
@@ -40,7 +40,14 @@ GENERATED_H = \
 	gr_rational_resampler_base_fcc.h \
 	gr_rational_resampler_base_fff.h \
 	gr_rational_resampler_base_fsf.h \
-	gr_rational_resampler_base_scc.h
+	gr_rational_resampler_base_scc.h \
+	gri_fir_filter_with_buffer_ccc.h \
+	gri_fir_filter_with_buffer_ccf.h \
+	gri_fir_filter_with_buffer_fcc.h \
+	gri_fir_filter_with_buffer_fff.h \
+	gri_fir_filter_with_buffer_fsf.h \
+	gri_fir_filter_with_buffer_scc.h
+
 
 GENERATED_I = \
 	gr_fir_filter_ccc.i \
@@ -107,5 +114,11 @@ GENERATED_CC = \
 	gr_rational_resampler_base_fcc.cc \
 	gr_rational_resampler_base_fff.cc \
 	gr_rational_resampler_base_fsf.cc \
-	gr_rational_resampler_base_scc.cc
+	gr_rational_resampler_base_scc.cc \
+	gri_fir_filter_with_buffer_ccc.cc \
+	gri_fir_filter_with_buffer_ccf.cc \
+	gri_fir_filter_with_buffer_fcc.cc \
+	gri_fir_filter_with_buffer_fff.cc \
+	gri_fir_filter_with_buffer_fsf.cc \
+	gri_fir_filter_with_buffer_scc.cc
 
diff --git a/gnuradio-core/src/lib/filter/generate_all.py b/gnuradio-core/src/lib/filter/generate_all.py
index b34e13c73e..ceed2b8510 100755
--- a/gnuradio-core/src/lib/filter/generate_all.py
+++ b/gnuradio-core/src/lib/filter/generate_all.py
@@ -30,6 +30,7 @@ import generate_gr_fir_sysconfig_generic
 import generate_gr_fir_sysconfig
 import generate_gr_fir_util
 import generate_gr_fir_XXX
+import generate_gri_fir_filter_with_buffer_XXX
 
 def generate_all():
     generate_gr_fir_XXX.generate()
@@ -40,6 +41,7 @@ def generate_all():
     generate_gr_fir_sysconfig_generic.generate()
     generate_gr_fir_sysconfig.generate()
     generate_gr_fir_util.generate()
+    generate_gri_fir_filter_with_buffer_XXX.generate()
     output_glue('filter')
 
 if __name__ == '__main__':
diff --git a/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py b/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
new file mode 100755
index 0000000000..7252e26f7f
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+# -*- python -*-
+#
+# Copyright 2010 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.
+# 
+
+import re
+from generate_utils import *
+
+roots = ['gri_fir_filter_with_buffer_XXX',]
+
+def code3_to_input_cast (code3):
+    if i_code (code3) == 's' and o_code (code3) == 'c':
+        return '(float)'
+    return ''
+
+def expand_h_cc (root, code3):
+    d = init_dict (root, code3)
+    expand_template (d, root + '.h.t')
+    expand_template (d, root + '.cc.t')
+
+def init_dict (root, code3):
+    name = re.sub ('X+', code3, root)
+    d = standard_dict (name, code3)
+    d['INPUT_CAST'] = code3_to_input_cast (code3)
+    return d
+    
+
+def generate ():
+    for r in roots:
+        for s in fir_signatures:
+            expand_h_cc (r, s)
+
+
+if __name__ == '__main__':
+    generate ()
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
new file mode 100644
index 0000000000..dd71a55fa6
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
@@ -0,0 +1,88 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 <@NAME@.h>
+
+@NAME@::@NAME@(const std::vector<@TAP_TYPE@> &taps)
+{
+  d_buffer = NULL;
+  set_taps(taps);
+}
+
+@NAME@::~@NAME@()
+{
+  if(d_buffer != NULL)
+    free(d_buffer);
+}
+
+void
+@NAME@::set_taps (const std::vector<@TAP_TYPE@> &taps)
+{
+  d_taps = gr_reverse(taps);
+  
+  if(d_buffer != NULL) {
+    free(d_buffer);
+    d_buffer = NULL;
+  }
+  
+  // FIXME: memalign this to 16-byte boundaries for SIMD later
+  size_t t = sizeof(@I_TYPE@) * 2 * d_taps.size();
+  d_buffer = (@I_TYPE@*)malloc(t);
+  memset(d_buffer, 0x00, t);
+  d_idx = 0;
+}
+
+@O_TYPE@
+@NAME@::filter (@I_TYPE@ input)
+{
+  unsigned int i;
+
+  d_buffer[d_idx] = input;
+  d_buffer[d_idx+ntaps()] = input;
+
+  // using the later for the case when ntaps=0;
+  // profiling shows this doesn't make a difference
+  //d_idx = (d_idx + 1) % ntaps();
+  d_idx++;
+  if(d_idx >= ntaps())
+    d_idx = 0;
+
+  @O_TYPE@ out = 0;
+  for(i = 0; i < ntaps(); i++) {
+    out += @INPUT_CAST@ d_buffer[d_idx + i] * d_taps[i];
+  }
+  return out;
+}
+
+void
+@NAME@::filterN (@O_TYPE@ output[],
+		 const @I_TYPE@ input[],
+		 unsigned long n)
+{
+  for(unsigned long i = 0; i < n; i++) {
+    output[i] = filter(input[i]);
+  }
+}
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
new file mode 100644
index 0000000000..d566b36746
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
@@ -0,0 +1,119 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+/*
+ * WARNING: This file is automatically generated by generate_gri_fir_XXX.py
+ * Any changes made to this file will be overwritten.
+ */
+
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <vector>
+#include <gr_types.h>
+#include <gr_reverse.h>
+#include <string.h>
+#include <cstdio>
+
+/*!
+ * \brief FIR with internal buffer for @I_TYPE@ input, 
+          @O_TYPE@ output and @TAP_TYPE@ taps
+ * \ingroup filter
+ * 
+ */
+
+class @NAME@ {
+
+protected:
+  std::vector<@TAP_TYPE@>	d_taps;		// reversed taps
+  @I_TYPE@                     *d_buffer;
+  unsigned int                  d_idx;
+
+public:
+
+  // CONSTRUCTORS
+
+  /*!
+   * \brief construct new FIR with given taps.
+   *
+   * Note that taps must be in forward order, e.g., coefficient 0 is
+   * stored in new_taps[0], coefficient 1 is stored in
+   * new_taps[1], etc.
+   */
+  @NAME@ (const std::vector<@TAP_TYPE@> &taps);
+
+  ~@NAME@ ();
+
+  // MANIPULATORS
+
+  /*!
+   * \brief compute a single output value.
+   *
+   * \p input must have ntaps() valid entries.
+   * input[0] .. input[ntaps() - 1] are referenced to compute the output value.
+   *
+   * \returns the filtered input value.
+   */
+  @O_TYPE@ filter (@I_TYPE@ input);
+
+  /*!
+   * \brief compute an array of N output values.
+   *
+   * \p input must have (n - 1 + ntaps()) valid entries.
+   * input[0] .. input[n - 1 + ntaps() - 1] are referenced to compute the output values.
+   */
+  void filterN (@O_TYPE@ output[], const @I_TYPE@ input[],
+		unsigned long n);
+
+  /*!
+   * \brief compute an array of N output values, decimating the input
+   *
+   * \p input must have (decimate * (n - 1) + ntaps()) valid entries.
+   * input[0] .. input[decimate * (n - 1) + ntaps() - 1] are referenced to 
+   * compute the output values.
+   */
+  void filterNdec (@O_TYPE@ output[], const @I_TYPE@ input[],
+		   unsigned long n, unsigned decimate);
+
+  /*!
+   * \brief install \p new_taps as the current taps.
+   */
+  void set_taps (const std::vector<@TAP_TYPE@> &taps);
+
+  // ACCESSORS
+
+  /*!
+   * \return number of taps in filter.
+   */
+  unsigned ntaps () const { return d_taps.size (); }
+
+  /*!
+   * \return current taps
+   */
+  const std::vector<@TAP_TYPE@> get_taps () const
+  {
+    return gr_reverse(d_taps);
+  }
+};
+
+#endif /* @GUARD_NAME@ */
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
deleted file mode 100644
index 55e316d027..0000000000
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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 <gri_fir_filter_with_buffer_ccf.h>
-
-gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector<float> &taps)
-{
-  d_buffer = NULL;
-  set_taps(taps);
-}
-
-gri_fir_filter_with_buffer_ccf::~gri_fir_filter_with_buffer_ccf()
-{
-  if(d_buffer != NULL)
-    free(d_buffer);
-}
-
-gr_complex 
-gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
-{
-  unsigned int i;
-
-  d_buffer[d_idx] = input;
-  d_buffer[d_idx+ntaps()] = input;
-
-  // using the later for the case when ntaps=0;
-  // profiling shows this doesn't make a difference
-  //d_idx = (d_idx + 1) % ntaps();
-  d_idx++;
-  if(d_idx >= ntaps())
-    d_idx = 0;
-
-  gr_complex out = gr_complex(0,0);
-  for(i = 0; i < ntaps(); i++) {
-    out += d_buffer[d_idx + i]*d_taps[i];
-  }
-  return out;
-}
-
-void
-gri_fir_filter_with_buffer_ccf::filterN (gr_complex output[],
-					 const gr_complex input[],
-					 unsigned long n)
-{
-  for(unsigned long i = 0; i < n; i++) {
-    output[i] = filter(input[i]);
-  }
-}
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
deleted file mode 100644
index c91d70534e..0000000000
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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.
- */
-
-/*
- * WARNING: This file is automatically generated by generate_gr_fir_XXX.py
- * Any changes made to this file will be overwritten.
- */
-
-
-#ifndef INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_H
-#define INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_H
-
-#include <vector>
-#include <gr_types.h>
-#include <gr_reverse.h>
-#include <string.h>
-#include <cstdio>
-
-/*!
- * \brief FIR with internal buffer for gr_complex input, 
-          gr_complex output and float taps
- * \ingroup filter
- * 
- */
-
-class gri_fir_filter_with_buffer_ccf {
-
-protected:
-  std::vector<float>	d_taps;		// reversed taps
-  gr_complex           *d_buffer;
-  unsigned int          d_idx;
-
-public:
-
-  // CONSTRUCTORS
-
-  /*!
-   * \brief construct new FIR with given taps.
-   *
-   * Note that taps must be in forward order, e.g., coefficient 0 is
-   * stored in new_taps[0], coefficient 1 is stored in
-   * new_taps[1], etc.
-   */
-  gri_fir_filter_with_buffer_ccf (const std::vector<float> &taps);
-
-  ~gri_fir_filter_with_buffer_ccf ();
-
-  // MANIPULATORS
-
-  /*!
-   * \brief compute a single output value.
-   *
-   * \p input must have ntaps() valid entries.
-   * input[0] .. input[ntaps() - 1] are referenced to compute the output value.
-   *
-   * \returns the filtered input value.
-   */
-  gr_complex filter (gr_complex input);
-
-  /*!
-   * \brief compute an array of N output values.
-   *
-   * \p input must have (n - 1 + ntaps()) valid entries.
-   * input[0] .. input[n - 1 + ntaps() - 1] are referenced to compute the output values.
-   */
-  void filterN (gr_complex output[], const gr_complex input[],
-		unsigned long n);
-
-  /*!
-   * \brief compute an array of N output values, decimating the input
-   *
-   * \p input must have (decimate * (n - 1) + ntaps()) valid entries.
-   * input[0] .. input[decimate * (n - 1) + ntaps() - 1] are referenced to 
-   * compute the output values.
-   */
-  void filterNdec (gr_complex output[], const gr_complex input[],
-		   unsigned long n, unsigned decimate);
-
-  /*!
-   * \brief install \p new_taps as the current taps.
-   */
-  void set_taps (const std::vector<float> &taps)
-  {
-    d_taps = gr_reverse(taps);
-
-    if(d_buffer != NULL) {
-      free(d_buffer);
-      d_buffer = NULL;
-    }
-    
-    // FIXME: memalign this to 16-byte boundaries for SIMD later
-    size_t t = sizeof(gr_complex) * 2 * d_taps.size();
-    d_buffer = (gr_complex*)malloc(t);
-    memset(d_buffer, 0x00, t);
-    d_idx = 0;
-  }
-
-  // ACCESSORS
-
-  /*!
-   * \return number of taps in filter.
-   */
-  unsigned ntaps () const { return d_taps.size (); }
-
-  /*!
-   * \return current taps
-   */
-  const std::vector<float> get_taps () const
-  {
-    return gr_reverse(d_taps);
-  }
-};
-
-#endif /* INCLUDED_GR_GR_FIR_FILTER_WITH_BUFFER_CCF_H */
-- 
cgit v1.2.3


From 4a3fb7eb7481177ae35bb98307a1845a7304d97e Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sat, 16 Oct 2010 19:42:58 -0400
Subject: Fixes Makefile for fir filter generators.

Adding new QA code for all other fir filters. fff and fsf versions currently failing.
---
 gnuradio-core/src/lib/filter/Makefile.am           |  16 ++-
 .../lib/filter/gri_fir_filter_with_buffer_ccf.cc   |  88 ++++++++++++
 .../lib/filter/gri_fir_filter_with_buffer_ccf.h    | 119 +++++++++++++++++
 gnuradio-core/src/lib/filter/qa_filter.cc          |  10 ++
 .../filter/qa_gri_fir_filter_with_buffer_ccc.cc    | 141 ++++++++++++++++++++
 .../lib/filter/qa_gri_fir_filter_with_buffer_ccc.h |  43 ++++++
 .../filter/qa_gri_fir_filter_with_buffer_fcc.cc    | 148 +++++++++++++++++++++
 .../lib/filter/qa_gri_fir_filter_with_buffer_fcc.h |  43 ++++++
 .../filter/qa_gri_fir_filter_with_buffer_fff.cc    | 138 +++++++++++++++++++
 .../lib/filter/qa_gri_fir_filter_with_buffer_fff.h |  43 ++++++
 .../filter/qa_gri_fir_filter_with_buffer_fsf.cc    | 138 +++++++++++++++++++
 .../lib/filter/qa_gri_fir_filter_with_buffer_fsf.h |  43 ++++++
 .../filter/qa_gri_fir_filter_with_buffer_scc.cc    | 148 +++++++++++++++++++++
 .../lib/filter/qa_gri_fir_filter_with_buffer_scc.h |  43 ++++++
 14 files changed, 1157 insertions(+), 4 deletions(-)
 create mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
 create mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
 create mode 100644 gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h

diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index 31f919ba77..cfd6535819 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -195,7 +195,6 @@ libfilter_la_common_SOURCES = 		\
 	gr_fft_filter_fff.cc		\
 	gr_goertzel_fc.cc		\
 	gr_filter_delay_fc.cc		\
-	gri_fir_filter_with_buffer_ccf.cc \
 	gr_fractional_interpolator_ff.cc \
 	gr_fractional_interpolator_cc.cc \
 	gr_hilbert_fc.cc		\
@@ -228,7 +227,12 @@ libfilter_qa_la_common_SOURCES = 	\
 	qa_gr_rotator.cc		\
 	qa_gri_mmse_fir_interpolator.cc	\
 	qa_gri_mmse_fir_interpolator_cc.cc \
-	qa_gri_fir_filter_with_buffer_ccf.cc
+	qa_gri_fir_filter_with_buffer_ccf.cc \
+	qa_gri_fir_filter_with_buffer_ccc.cc \
+	qa_gri_fir_filter_with_buffer_fcc.cc \
+	qa_gri_fir_filter_with_buffer_fff.cc \
+	qa_gri_fir_filter_with_buffer_fsf.cc \
+	qa_gri_fir_filter_with_buffer_scc.cc
 
 if MD_CPU_generic
 libfilter_la_SOURCES = $(libfilter_la_common_SOURCES) $(generic_CODE)
@@ -274,7 +278,6 @@ grinclude_HEADERS = 			\
 	gr_fft_filter_ccc.h		\
 	gr_fft_filter_fff.h		\
 	gr_filter_delay_fc.h		\
-	gri_fir_filter_with_buffer_ccf.h \
 	gr_fir_sysconfig_x86.h		\
 	gr_fir_sysconfig_powerpc.h	\
 	gr_fractional_interpolator_ff.h	\
@@ -335,7 +338,12 @@ noinst_HEADERS = 			\
 	qa_gr_rotator.h			\
 	qa_gri_mmse_fir_interpolator.h	\
 	qa_gri_mmse_fir_interpolator_cc.h \
-	qa_gri_fir_filter_with_buffer_ccf.h
+	qa_gri_fir_filter_with_buffer_ccf.h \
+	qa_gri_fir_filter_with_buffer_ccc.h \
+	qa_gri_fir_filter_with_buffer_fcc.h \
+	qa_gri_fir_filter_with_buffer_fff.h \
+	qa_gri_fir_filter_with_buffer_fsf.h \
+	qa_gri_fir_filter_with_buffer_scc.h
 
 
 if PYTHON
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
new file mode 100644
index 0000000000..35020bb782
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
@@ -0,0 +1,88 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 <gri_fir_filter_with_buffer_ccf.h>
+
+gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector<float> &taps)
+{
+  d_buffer = NULL;
+  set_taps(taps);
+}
+
+gri_fir_filter_with_buffer_ccf::~gri_fir_filter_with_buffer_ccf()
+{
+  if(d_buffer != NULL)
+    free(d_buffer);
+}
+
+void
+gri_fir_filter_with_buffer_ccf::set_taps (const std::vector<float> &taps)
+{
+  d_taps = gr_reverse(taps);
+  
+  if(d_buffer != NULL) {
+    free(d_buffer);
+    d_buffer = NULL;
+  }
+  
+  // FIXME: memalign this to 16-byte boundaries for SIMD later
+  size_t t = sizeof(gr_complex) * 2 * d_taps.size();
+  d_buffer = (gr_complex*)malloc(t);
+  memset(d_buffer, 0x00, t);
+  d_idx = 0;
+}
+
+gr_complex
+gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
+{
+  unsigned int i;
+
+  d_buffer[d_idx] = input;
+  d_buffer[d_idx+ntaps()] = input;
+
+  // using the later for the case when ntaps=0;
+  // profiling shows this doesn't make a difference
+  //d_idx = (d_idx + 1) % ntaps();
+  d_idx++;
+  if(d_idx >= ntaps())
+    d_idx = 0;
+
+  gr_complex out = 0;
+  for(i = 0; i < ntaps(); i++) {
+    out +=  d_buffer[d_idx + i] * d_taps[i];
+  }
+  return out;
+}
+
+void
+gri_fir_filter_with_buffer_ccf::filterN (gr_complex output[],
+		 const gr_complex input[],
+		 unsigned long n)
+{
+  for(unsigned long i = 0; i < n; i++) {
+    output[i] = filter(input[i]);
+  }
+}
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
new file mode 100644
index 0000000000..2b69f8b036
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
@@ -0,0 +1,119 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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.
+ */
+
+/*
+ * WARNING: This file is automatically generated by generate_gri_fir_XXX.py
+ * Any changes made to this file will be overwritten.
+ */
+
+
+#ifndef INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_CCF_H
+#define INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_CCF_H
+
+#include <vector>
+#include <gr_types.h>
+#include <gr_reverse.h>
+#include <string.h>
+#include <cstdio>
+
+/*!
+ * \brief FIR with internal buffer for gr_complex input, 
+          gr_complex output and float taps
+ * \ingroup filter
+ * 
+ */
+
+class gri_fir_filter_with_buffer_ccf {
+
+protected:
+  std::vector<float>	d_taps;		// reversed taps
+  gr_complex                     *d_buffer;
+  unsigned int                  d_idx;
+
+public:
+
+  // CONSTRUCTORS
+
+  /*!
+   * \brief construct new FIR with given taps.
+   *
+   * Note that taps must be in forward order, e.g., coefficient 0 is
+   * stored in new_taps[0], coefficient 1 is stored in
+   * new_taps[1], etc.
+   */
+  gri_fir_filter_with_buffer_ccf (const std::vector<float> &taps);
+
+  ~gri_fir_filter_with_buffer_ccf ();
+
+  // MANIPULATORS
+
+  /*!
+   * \brief compute a single output value.
+   *
+   * \p input must have ntaps() valid entries.
+   * input[0] .. input[ntaps() - 1] are referenced to compute the output value.
+   *
+   * \returns the filtered input value.
+   */
+  gr_complex filter (gr_complex input);
+
+  /*!
+   * \brief compute an array of N output values.
+   *
+   * \p input must have (n - 1 + ntaps()) valid entries.
+   * input[0] .. input[n - 1 + ntaps() - 1] are referenced to compute the output values.
+   */
+  void filterN (gr_complex output[], const gr_complex input[],
+		unsigned long n);
+
+  /*!
+   * \brief compute an array of N output values, decimating the input
+   *
+   * \p input must have (decimate * (n - 1) + ntaps()) valid entries.
+   * input[0] .. input[decimate * (n - 1) + ntaps() - 1] are referenced to 
+   * compute the output values.
+   */
+  void filterNdec (gr_complex output[], const gr_complex input[],
+		   unsigned long n, unsigned decimate);
+
+  /*!
+   * \brief install \p new_taps as the current taps.
+   */
+  void set_taps (const std::vector<float> &taps);
+
+  // ACCESSORS
+
+  /*!
+   * \return number of taps in filter.
+   */
+  unsigned ntaps () const { return d_taps.size (); }
+
+  /*!
+   * \return current taps
+   */
+  const std::vector<float> get_taps () const
+  {
+    return gr_reverse(d_taps);
+  }
+};
+
+#endif /* INCLUDED_GRI_FIR_FILTER_WITH_BUFFER_CCF_H */
diff --git a/gnuradio-core/src/lib/filter/qa_filter.cc b/gnuradio-core/src/lib/filter/qa_filter.cc
index b9a30ba42b..0d03cb0ee1 100644
--- a/gnuradio-core/src/lib/filter/qa_filter.cc
+++ b/gnuradio-core/src/lib/filter/qa_filter.cc
@@ -37,6 +37,11 @@
 #include <qa_gri_mmse_fir_interpolator_cc.h>
 #include <qa_gr_rotator.h>
 #include <qa_gri_fir_filter_with_buffer_ccf.h>
+#include <qa_gri_fir_filter_with_buffer_ccc.h>
+#include <qa_gri_fir_filter_with_buffer_fcc.h>
+#include <qa_gri_fir_filter_with_buffer_fff.h>
+#include <qa_gri_fir_filter_with_buffer_fsf.h>
+#include <qa_gri_fir_filter_with_buffer_scc.h>
 
 CppUnit::TestSuite *
 qa_filter::suite ()
@@ -53,6 +58,11 @@ qa_filter::suite ()
   s->addTest (qa_gri_mmse_fir_interpolator_cc::suite ());
   s->addTest (qa_gr_rotator::suite ());
   s->addTest (qa_gri_fir_filter_with_buffer_ccf::suite ());
+  s->addTest (qa_gri_fir_filter_with_buffer_ccc::suite ());
+  s->addTest (qa_gri_fir_filter_with_buffer_fcc::suite ());
+  s->addTest (qa_gri_fir_filter_with_buffer_fff::suite ());
+  s->addTest (qa_gri_fir_filter_with_buffer_fsf::suite ());
+  s->addTest (qa_gri_fir_filter_with_buffer_scc::suite ());
 
   return s;
 }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
new file mode 100644
index 0000000000..cff81ab13c
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
@@ -0,0 +1,141 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_types.h>
+#include <qa_gri_fir_filter_with_buffer_ccc.h>
+#include <gri_fir_filter_with_buffer_ccc.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef gr_complex	i_type;
+typedef gr_complex	o_type;
+typedef gr_complex	tap_type;
+typedef	gr_complex	acc_type;
+
+using std::vector;
+
+#define	ERR_DELTA	(1e-5)
+
+#define	NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+  return 2.0 * ((float) random () / RANDOM_MAX - 0.5);	// uniformly (-1, 1)
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++){
+    float re = rint (uniform () * 32767);
+    float im = rint (uniform () * 32767);
+    buf[i] = gr_complex (re, im);
+  }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+  acc_type	sum = 0;
+  for (int i = 0; i < ntaps; i++) {
+    sum += input[i] * taps[i];
+  }
+      
+  return sum;
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+
+void
+qa_gri_fir_filter_with_buffer_ccc::t1 ()
+{
+  const int	MAX_TAPS	= 9;
+  const int	OUTPUT_LEN	= 17;
+  const int	INPUT_LEN	= MAX_TAPS + OUTPUT_LEN;
+
+  // Mem aligned buffer not really necessary, but why not?
+  i_type       *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+  i_type       *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+  o_type 	expected_output[OUTPUT_LEN];
+  o_type 	actual_output[OUTPUT_LEN];
+  tap_type	taps[MAX_TAPS];
+
+  srandom (0);	// we want reproducibility
+  memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+  for (int n = 0; n <= MAX_TAPS; n++){
+    for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+      // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+      // build random test case
+      random_complex (input, INPUT_LEN);
+      random_complex (taps, MAX_TAPS);
+
+      // compute expected output values
+      memset(dline, 0, INPUT_LEN*sizeof(i_type));
+      for (int o = 0; o < ol; o++){
+	// use an actual delay line for this test
+	for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	  dline[oo] = dline[oo-1];
+	dline[0] = input[o];
+	expected_output[o] = ref_dotprod (dline, taps, n);
+      }
+
+      // build filter
+      vector<tap_type> f1_taps(&taps[0], &taps[n]);
+      gri_fir_filter_with_buffer_ccc *f1 = new gri_fir_filter_with_buffer_ccc(f1_taps);
+
+      // zero the output, then do the filtering
+      memset (actual_output, 0, sizeof (actual_output));
+      f1->filterN (actual_output, input, ol);
+
+      // check results
+      //
+      // we use a sloppy error margin because on the x86 architecture,
+      // our reference implementation is using 80 bit floating point
+      // arithmetic, while the SSE version is using 32 bit float point
+      // arithmetic.
+      
+      for (int o = 0; o < ol; o++){
+	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+				       abs (expected_output[o]) * ERR_DELTA);
+      }
+      delete f1;
+    }
+  }
+  free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
new file mode 100644
index 0000000000..411a66a9aa
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
@@ -0,0 +1,43 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 _QA_GRI_FIR_FILTER_WITH_BUFFER_CCC_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_CCC_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_ccc : public CppUnit::TestCase {
+
+  CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_ccc);
+  CPPUNIT_TEST (t1);
+  CPPUNIT_TEST_SUITE_END ();
+
+ private:
+
+  void t1 ();
+  // void t2 ();
+  // void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_CCC_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
new file mode 100644
index 0000000000..de0da9f1ca
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
@@ -0,0 +1,148 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_types.h>
+#include <qa_gri_fir_filter_with_buffer_fcc.h>
+#include <gri_fir_filter_with_buffer_fcc.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef float	        i_type;
+typedef gr_complex	o_type;
+typedef gr_complex	tap_type;
+typedef	gr_complex	acc_type;
+
+using std::vector;
+
+#define	ERR_DELTA	(1e-5)
+
+#define	NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+  return 2.0 * ((float) random () / RANDOM_MAX - 0.5);	// uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++)
+    buf[i] = (float) rint (uniform () * 32767);
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++){
+    float re = rint (uniform () * 32767);
+    float im = rint (uniform () * 32767);
+    buf[i] = gr_complex (re, im);
+  }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+  acc_type	sum = 0;
+  for (int i = 0; i < ntaps; i++) {
+    sum += input[i] * taps[i];
+  }
+      
+  return sum;
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+
+void
+qa_gri_fir_filter_with_buffer_fcc::t1 ()
+{
+  const int	MAX_TAPS	= 9;
+  const int	OUTPUT_LEN	= 17;
+  const int	INPUT_LEN	= MAX_TAPS + OUTPUT_LEN;
+
+  // Mem aligned buffer not really necessary, but why not?
+  i_type       *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+  i_type       *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+  o_type 	expected_output[OUTPUT_LEN];
+  o_type 	actual_output[OUTPUT_LEN];
+  tap_type	taps[MAX_TAPS];
+
+  srandom (0);	// we want reproducibility
+  memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+  for (int n = 0; n <= MAX_TAPS; n++){
+    for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+      // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+      // build random test case
+      random_floats (input, INPUT_LEN);
+      random_complex (taps, MAX_TAPS);
+
+      // compute expected output values
+      memset(dline, 0, INPUT_LEN*sizeof(i_type));
+      for (int o = 0; o < ol; o++){
+	// use an actual delay line for this test
+	for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	  dline[oo] = dline[oo-1];
+	dline[0] = input[o];
+	expected_output[o] = ref_dotprod (dline, taps, n);
+      }
+
+      // build filter
+      vector<tap_type> f1_taps(&taps[0], &taps[n]);
+      gri_fir_filter_with_buffer_fcc *f1 = new gri_fir_filter_with_buffer_fcc(f1_taps);
+
+      // zero the output, then do the filtering
+      memset (actual_output, 0, sizeof (actual_output));
+      f1->filterN (actual_output, input, ol);
+
+      // check results
+      //
+      // we use a sloppy error margin because on the x86 architecture,
+      // our reference implementation is using 80 bit floating point
+      // arithmetic, while the SSE version is using 32 bit float point
+      // arithmetic.
+      
+      for (int o = 0; o < ol; o++){
+	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+				       abs (expected_output[o]) * ERR_DELTA);
+      }
+      delete f1;
+    }
+  }
+  free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
new file mode 100644
index 0000000000..81b39f4884
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
@@ -0,0 +1,43 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 _QA_GRI_FIR_FILTER_WITH_BUFFER_FCC_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_FCC_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_fcc : public CppUnit::TestCase {
+
+  CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fcc);
+  CPPUNIT_TEST (t1);
+  CPPUNIT_TEST_SUITE_END ();
+
+ private:
+
+  void t1 ();
+  // void t2 ();
+  // void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_FCC_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
new file mode 100644
index 0000000000..518d98ab87
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
@@ -0,0 +1,138 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_types.h>
+#include <qa_gri_fir_filter_with_buffer_fff.h>
+#include <gri_fir_filter_with_buffer_fff.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef float	i_type;
+typedef float	o_type;
+typedef float	tap_type;
+typedef	float	acc_type;
+
+using std::vector;
+
+#define	ERR_DELTA	(1e-5)
+
+#define	NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+  return 2.0 * ((float) random () / RANDOM_MAX - 0.5);	// uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++)
+    buf[i] = (float) rint (uniform () * 32767);
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+  acc_type	sum = 0;
+  for (int i = 0; i < ntaps; i++) {
+    sum += input[i] * taps[i];
+  }
+      
+  return sum;
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+
+void
+qa_gri_fir_filter_with_buffer_fff::t1 ()  
+{
+  const int	MAX_TAPS	= 9;
+  const int	OUTPUT_LEN	= 17;
+  const int	INPUT_LEN	= MAX_TAPS + OUTPUT_LEN;
+
+  // Mem aligned buffer not really necessary, but why not?
+  i_type       *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+  i_type       *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+  o_type 	expected_output[OUTPUT_LEN];
+  o_type 	actual_output[OUTPUT_LEN];
+  tap_type	taps[MAX_TAPS];
+
+  srandom (0);	// we want reproducibility
+  memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+  for (int n = 0; n <= MAX_TAPS; n++){
+    for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+      // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+      // build random test case
+      random_floats (input, INPUT_LEN);
+      random_floats (taps, MAX_TAPS);
+
+      // compute expected output values
+      memset(dline, 0, INPUT_LEN*sizeof(i_type));
+      for (int o = 0; o < ol; o++){
+	// use an actual delay line for this test
+	for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	  dline[oo] = dline[oo-1];
+	dline[0] = input[o];
+	expected_output[o] = ref_dotprod (dline, taps, n);
+      }
+
+      // build filter
+      vector<tap_type> f1_taps(&taps[0], &taps[n]);
+      gri_fir_filter_with_buffer_fff *f1 = new gri_fir_filter_with_buffer_fff(f1_taps);
+
+      // zero the output, then do the filtering
+      memset (actual_output, 0, sizeof (actual_output));
+      f1->filterN (actual_output, input, ol);
+
+      // check results
+      //
+      // we use a sloppy error margin because on the x86 architecture,
+      // our reference implementation is using 80 bit floating point
+      // arithmetic, while the SSE version is using 32 bit float point
+      // arithmetic.
+      
+      for (int o = 0; o < ol; o++){
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_output[o], actual_output[o],
+				     abs (expected_output[o]) * ERR_DELTA);
+      }
+      delete f1;
+    }
+  }
+  free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
new file mode 100644
index 0000000000..5bb6c3e937
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
@@ -0,0 +1,43 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 _QA_GRI_FIR_FILTER_WITH_BUFFER_FFF_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_FFF_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_fff : public CppUnit::TestCase {
+
+  CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fff);
+  CPPUNIT_TEST (t1);
+  CPPUNIT_TEST_SUITE_END ();
+
+ private:
+
+  void t1 ();
+  // void t2 ();
+  // void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_FFF_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
new file mode 100644
index 0000000000..1dc869ef76
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
@@ -0,0 +1,138 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_types.h>
+#include <qa_gri_fir_filter_with_buffer_fsf.h>
+#include <gri_fir_filter_with_buffer_fsf.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef float   i_type;
+typedef short	o_type;
+typedef float	tap_type;
+typedef	int	acc_type;
+
+using std::vector;
+
+#define	ERR_DELTA	(1e-5)
+
+#define	NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+  return 2.0 * ((float) random () / RANDOM_MAX - 0.5);	// uniformly (-1, 1)
+}
+
+static void
+random_floats (float *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++)
+    buf[i] = (float) rint (uniform () * 32767);
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+  acc_type	sum = 0;
+  for (int i = 0; i < ntaps; i++) {
+    sum += input[i] * taps[i];
+  }
+      
+  return sum;
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t1 ()  
+{
+  const int	MAX_TAPS	= 9;
+  const int	OUTPUT_LEN	= 17;
+  const int	INPUT_LEN	= MAX_TAPS + OUTPUT_LEN;
+
+  // Mem aligned buffer not really necessary, but why not?
+  i_type       *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+  i_type       *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+  o_type 	expected_output[OUTPUT_LEN];
+  o_type 	actual_output[OUTPUT_LEN];
+  tap_type	taps[MAX_TAPS];
+
+  srandom (0);	// we want reproducibility
+  memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+  for (int n = 0; n <= MAX_TAPS; n++){
+    for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+      // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+      // build random test case
+      random_floats (input, INPUT_LEN);
+      random_floats (taps, MAX_TAPS);
+
+      // compute expected output values
+      memset(dline, 0, INPUT_LEN*sizeof(i_type));
+      for (int o = 0; o < ol; o++){
+	// use an actual delay line for this test
+	for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	  dline[oo] = dline[oo-1];
+	dline[0] = input[o];
+	expected_output[o] = ref_dotprod (dline, taps, n);
+      }
+
+      // build filter
+      vector<tap_type> f1_taps(&taps[0], &taps[n]);
+      gri_fir_filter_with_buffer_fsf *f1 = new gri_fir_filter_with_buffer_fsf(f1_taps);
+
+      // zero the output, then do the filtering
+      memset (actual_output, 0, sizeof (actual_output));
+      f1->filterN (actual_output, input, ol);
+
+      // check results
+      //
+      // we use a sloppy error margin because on the x86 architecture,
+      // our reference implementation is using 80 bit floating point
+      // arithmetic, while the SSE version is using 32 bit float point
+      // arithmetic.
+      
+      for (int o = 0; o < ol; o++){
+	CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_output[o], actual_output[o],
+				     abs (expected_output[o]) * ERR_DELTA);
+      }
+      delete f1;
+    }
+  }
+  free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
new file mode 100644
index 0000000000..38899b3520
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
@@ -0,0 +1,43 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 _QA_GRI_FIR_FILTER_WITH_BUFFER_FSF_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_FSF_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_fsf : public CppUnit::TestCase {
+
+  CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fsf);
+  CPPUNIT_TEST (t1);
+  CPPUNIT_TEST_SUITE_END ();
+
+ private:
+
+  void t1 ();
+  // void t2 ();
+  // void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_FSF_H_ */
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
new file mode 100644
index 0000000000..4ba433ebfd
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
@@ -0,0 +1,148 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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_types.h>
+#include <qa_gri_fir_filter_with_buffer_scc.h>
+#include <gri_fir_filter_with_buffer_scc.h>
+#include <string.h>
+#include <iostream>
+#include <cmath>
+#include <cppunit/TestAssert.h>
+#include <random.h>
+#include <malloc16.h>
+#include <string.h>
+
+typedef short	        i_type;
+typedef gr_complex	o_type;
+typedef gr_complex	tap_type;
+typedef	gr_complex	acc_type;
+
+using std::vector;
+
+#define	ERR_DELTA	(1e-5)
+
+#define	NELEM(x) (sizeof (x) / sizeof (x[0]))
+
+static float
+uniform ()
+{
+  return 2.0 * ((float) random () / RANDOM_MAX - 0.5);	// uniformly (-1, 1)
+}
+
+static void
+random_shorts (short *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++)
+    buf[i] = (short) rint (uniform () * 16384);
+}
+
+static void
+random_complex (gr_complex *buf, unsigned n)
+{
+  for (unsigned i = 0; i < n; i++){
+    float re = rint (uniform () * 32767);
+    float im = rint (uniform () * 32767);
+    buf[i] = gr_complex (re, im);
+  }
+}
+
+static o_type
+ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
+{
+  acc_type	sum = 0;
+  for (int i = 0; i < ntaps; i++) {
+    sum += (float)input[i] * taps[i];
+  }
+      
+  return sum;
+}
+
+//
+// Test for ntaps in [0,9], and input lengths in [0,17].
+// This ensures that we are building the shifted taps correctly,
+// and exercises all corner cases on input alignment and length.
+//
+
+void
+qa_gri_fir_filter_with_buffer_scc::t1 ()  
+{
+  const int	MAX_TAPS	= 9;
+  const int	OUTPUT_LEN	= 17;
+  const int	INPUT_LEN	= MAX_TAPS + OUTPUT_LEN;
+
+  // Mem aligned buffer not really necessary, but why not?
+  i_type       *input = (i_type *)malloc16Align(INPUT_LEN * sizeof(i_type));
+  i_type       *dline = (i_type*)malloc16Align(INPUT_LEN * sizeof(i_type));
+  o_type 	expected_output[OUTPUT_LEN];
+  o_type 	actual_output[OUTPUT_LEN];
+  tap_type	taps[MAX_TAPS];
+
+  srandom (0);	// we want reproducibility
+  memset(dline, 0, INPUT_LEN*sizeof(i_type));
+
+  for (int n = 0; n <= MAX_TAPS; n++){
+    for (int ol = 0; ol <= OUTPUT_LEN; ol++){
+
+      // cerr << "@@@ n:ol " << n << ":" << ol << endl;
+
+      // build random test case
+      random_shorts (input, INPUT_LEN);
+      random_complex (taps, MAX_TAPS);
+
+      // compute expected output values
+      memset(dline, 0, INPUT_LEN*sizeof(i_type));
+      for (int o = 0; o < ol; o++){
+	// use an actual delay line for this test
+	for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	  dline[oo] = dline[oo-1];
+	dline[0] = input[o];
+	expected_output[o] = ref_dotprod (dline, taps, n);
+      }
+
+      // build filter
+      vector<tap_type> f1_taps(&taps[0], &taps[n]);
+      gri_fir_filter_with_buffer_scc *f1 = new gri_fir_filter_with_buffer_scc(f1_taps);
+
+      // zero the output, then do the filtering
+      memset (actual_output, 0, sizeof (actual_output));
+      f1->filterN (actual_output, input, ol);
+
+      // check results
+      //
+      // we use a sloppy error margin because on the x86 architecture,
+      // our reference implementation is using 80 bit floating point
+      // arithmetic, while the SSE version is using 32 bit float point
+      // arithmetic.
+
+      for (int o = 0; o < ol; o++){
+	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
+				       abs (expected_output[o]) * ERR_DELTA);
+      }
+      delete f1;
+    }
+  }
+  free16Align(input);
+}
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h
new file mode 100644
index 0000000000..fd9fe5b767
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h
@@ -0,0 +1,43 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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 _QA_GRI_FIR_FILTER_WITH_BUFFER_SCC_H_
+#define _QA_GRI_FIR_FILTER_WITH_BUFFER_SCC_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_gri_fir_filter_with_buffer_scc : public CppUnit::TestCase {
+
+  CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_scc);
+  CPPUNIT_TEST (t1);
+  CPPUNIT_TEST_SUITE_END ();
+
+ private:
+
+  void t1 ();
+  // void t2 ();
+  // void t3 ();
+
+};
+
+
+#endif /* _QA_GR_FIR_FILTER_WITH_BUFFER_SCC_H_ */
-- 
cgit v1.2.3


From b9cbe9c9ca65b620cab9bf1b8e652637a885d3c2 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sun, 17 Oct 2010 15:25:11 -0400
Subject: Fixing up filters a bit to pass QA tests for all versions.

---
 .../filter/generate_gri_fir_filter_with_buffer_XXX.py  | 11 +++++++++++
 .../src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t |  4 ++--
 .../src/lib/filter/gri_fir_filter_with_buffer_ccf.cc   |  2 +-
 .../lib/filter/qa_gri_fir_filter_with_buffer_fff.cc    |  3 +--
 .../lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc    | 18 ++++--------------
 5 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py b/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
index 7252e26f7f..f586b0c277 100755
--- a/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
+++ b/gnuradio-core/src/lib/filter/generate_gri_fir_filter_with_buffer_XXX.py
@@ -26,6 +26,15 @@ from generate_utils import *
 
 roots = ['gri_fir_filter_with_buffer_XXX',]
 
+def code3_to_acc_code (code3):
+    if i_code (code3) == 'c' or o_code (code3) == 'c' or tap_code (code3) == 'c':
+        return 'c'
+    if i_code (code3) == 'f' or o_code (code3) == 'f' or tap_code (code3) == 'f':
+        return 'f'
+    if i_code (code3) == 'i' or o_code (code3) == 'i' or tap_code (code3) == 'i':
+        return 'i'
+    return 'i'                          # even short short short needs int accumulator
+
 def code3_to_input_cast (code3):
     if i_code (code3) == 's' and o_code (code3) == 'c':
         return '(float)'
@@ -40,6 +49,8 @@ def init_dict (root, code3):
     name = re.sub ('X+', code3, root)
     d = standard_dict (name, code3)
     d['INPUT_CAST'] = code3_to_input_cast (code3)
+    acc_code = code3_to_acc_code (code3)
+    d['ACC_TYPE'] = char_to_type[acc_code]
     return d
     
 
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
index dd71a55fa6..c0d061c817 100644
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
@@ -70,11 +70,11 @@ void
   if(d_idx >= ntaps())
     d_idx = 0;
 
-  @O_TYPE@ out = 0;
+  @ACC_TYPE@ out = 0;
   for(i = 0; i < ntaps(); i++) {
     out += @INPUT_CAST@ d_buffer[d_idx + i] * d_taps[i];
   }
-  return out;
+  return (@O_TYPE@)out;
 }
 
 void
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
index 35020bb782..b2db8ce0a7 100644
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
@@ -74,7 +74,7 @@ gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
   for(i = 0; i < ntaps(); i++) {
     out +=  d_buffer[d_idx + i] * d_taps[i];
   }
-  return out;
+  return (gr_complex)out;
 }
 
 void
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
index 518d98ab87..ce689a54bb 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
@@ -66,7 +66,6 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   for (int i = 0; i < ntaps; i++) {
     sum += input[i] * taps[i];
   }
-      
   return sum;
 }
 
@@ -129,7 +128,7 @@ qa_gri_fir_filter_with_buffer_fff::t1 ()
       
       for (int o = 0; o < ol; o++){
 	CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_output[o], actual_output[o],
-				     abs (expected_output[o]) * ERR_DELTA);
+				     fabsf (expected_output[o]) * ERR_DELTA);
       }
       delete f1;
     }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
index 1dc869ef76..f09a1d7ac6 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
@@ -38,12 +38,10 @@
 typedef float   i_type;
 typedef short	o_type;
 typedef float	tap_type;
-typedef	int	acc_type;
+typedef	float	acc_type;
 
 using std::vector;
 
-#define	ERR_DELTA	(1e-5)
-
 #define	NELEM(x) (sizeof (x) / sizeof (x[0]))
 
 static float
@@ -56,7 +54,7 @@ static void
 random_floats (float *buf, unsigned n)
 {
   for (unsigned i = 0; i < n; i++)
-    buf[i] = (float) rint (uniform () * 32767);
+    buf[i] = (float) rint (uniform () * 128);
 }
 
 static o_type
@@ -66,8 +64,7 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   for (int i = 0; i < ntaps; i++) {
     sum += input[i] * taps[i];
   }
-      
-  return sum;
+  return (o_type)sum;
 }
 
 //
@@ -121,15 +118,8 @@ qa_gri_fir_filter_with_buffer_fsf::t1 ()
       f1->filterN (actual_output, input, ol);
 
       // check results
-      //
-      // we use a sloppy error margin because on the x86 architecture,
-      // our reference implementation is using 80 bit floating point
-      // arithmetic, while the SSE version is using 32 bit float point
-      // arithmetic.
-      
       for (int o = 0; o < ol; o++){
-	CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_output[o], actual_output[o],
-				     abs (expected_output[o]) * ERR_DELTA);
+	CPPUNIT_ASSERT_EQUAL(expected_output[o], actual_output[o]);
       }
       delete f1;
     }
-- 
cgit v1.2.3


From 740d8974427d25f1bd4e4e045fc6f0a101cea9eb Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sun, 17 Oct 2010 15:25:44 -0400
Subject: Removing ccf version of filter that is now autogenerated.

---
 .../lib/filter/gri_fir_filter_with_buffer_ccf.cc   | 88 ----------------------
 1 file changed, 88 deletions(-)
 delete mode 100644 gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc

diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
deleted file mode 100644
index b2db8ce0a7..0000000000
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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 <gri_fir_filter_with_buffer_ccf.h>
-
-gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector<float> &taps)
-{
-  d_buffer = NULL;
-  set_taps(taps);
-}
-
-gri_fir_filter_with_buffer_ccf::~gri_fir_filter_with_buffer_ccf()
-{
-  if(d_buffer != NULL)
-    free(d_buffer);
-}
-
-void
-gri_fir_filter_with_buffer_ccf::set_taps (const std::vector<float> &taps)
-{
-  d_taps = gr_reverse(taps);
-  
-  if(d_buffer != NULL) {
-    free(d_buffer);
-    d_buffer = NULL;
-  }
-  
-  // FIXME: memalign this to 16-byte boundaries for SIMD later
-  size_t t = sizeof(gr_complex) * 2 * d_taps.size();
-  d_buffer = (gr_complex*)malloc(t);
-  memset(d_buffer, 0x00, t);
-  d_idx = 0;
-}
-
-gr_complex
-gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
-{
-  unsigned int i;
-
-  d_buffer[d_idx] = input;
-  d_buffer[d_idx+ntaps()] = input;
-
-  // using the later for the case when ntaps=0;
-  // profiling shows this doesn't make a difference
-  //d_idx = (d_idx + 1) % ntaps();
-  d_idx++;
-  if(d_idx >= ntaps())
-    d_idx = 0;
-
-  gr_complex out = 0;
-  for(i = 0; i < ntaps(); i++) {
-    out +=  d_buffer[d_idx + i] * d_taps[i];
-  }
-  return (gr_complex)out;
-}
-
-void
-gri_fir_filter_with_buffer_ccf::filterN (gr_complex output[],
-		 const gr_complex input[],
-		 unsigned long n)
-{
-  for(unsigned long i = 0; i < n; i++) {
-    output[i] = filter(input[i]);
-  }
-}
-- 
cgit v1.2.3


From 9810ae784492ca23cce40cdd0cc3ca83eb5f5aef Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sun, 17 Oct 2010 15:51:06 -0400
Subject: Removing nonexistent gri .i file from Makefile. Got a bit carried
 away with the copy/paste.

---
 gnuradio-core/src/lib/filter/Makefile.am | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index cfd6535819..6d2ec1c7e6 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -63,8 +63,7 @@ code_generator = 					\
 	gr_freq_xlating_fir_filter_XXX.h.t		\
 	gr_freq_xlating_fir_filter_XXX.i.t		\
 	gri_fir_filter_with_buffer_XXX.cc.t		\
-	gri_fir_filter_with_buffer_XXX.h.t		\
-	gri_fir_filter_with_buffer_XXX.i.t
+	gri_fir_filter_with_buffer_XXX.h.t
 
 
 # Source built by Python into $(builddir)
-- 
cgit v1.2.3


From b03f921273423dddc5c8b76d6ab0cfcfe80123a3 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sun, 17 Oct 2010 16:14:09 -0400
Subject: Adding ccf version of fir filter to gitignore.

---
 gnuradio-core/src/lib/filter/.gitignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gnuradio-core/src/lib/filter/.gitignore b/gnuradio-core/src/lib/filter/.gitignore
index 4797b6b3a3..faaf02cb85 100644
--- a/gnuradio-core/src/lib/filter/.gitignore
+++ b/gnuradio-core/src/lib/filter/.gitignore
@@ -213,6 +213,8 @@
 /gr_rational_resampler_base_scc.i
 /gri_fir_filter_with_buffer_ccc.cc
 /gri_fir_filter_with_buffer_ccc.h
+/gri_fir_filter_with_buffer_ccf.cc
+/gri_fir_filter_with_buffer_ccf.h
 /gri_fir_filter_with_buffer_fcc.cc
 /gri_fir_filter_with_buffer_fcc.h
 /gri_fir_filter_with_buffer_fff.cc
-- 
cgit v1.2.3


From dd74b98a42f5e79c4d464cfa745b3f8af51e486e Mon Sep 17 00:00:00 2001
From: Marcus Leech <mleech@ripnet.com>
Date: Sun, 17 Oct 2010 17:20:04 -0400
Subject: Adds a new parameter "y_axis_label" to scopesink2 and the GRC .xml
 file that contains the string for the Y axis label.  It defaults to 'Counts'
 to be consistent with the old version.

---
 gr-wxgui/src/python/constants.py    | 1 +
 gr-wxgui/src/python/scope_window.py | 4 +++-
 gr-wxgui/src/python/scopesink_gl.py | 2 ++
 grc/blocks/wxgui_scopesink2.xml     | 7 +++++++
 4 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/gr-wxgui/src/python/constants.py b/gr-wxgui/src/python/constants.py
index 9612f36dde..070be0808b 100644
--- a/gr-wxgui/src/python/constants.py
+++ b/gr-wxgui/src/python/constants.py
@@ -66,6 +66,7 @@ X_PER_DIV_KEY = 'x_per_div'
 Y_DIVS_KEY = 'y_divs'
 Y_OFF_KEY = 'y_off'
 Y_PER_DIV_KEY = 'y_per_div'
+Y_AXIS_LABEL = 'y_axis_label'
 MAXIMUM_KEY = 'maximum'
 MINIMUM_KEY = 'minimum'
 NUM_BINS_KEY = 'num_bins'
diff --git a/gr-wxgui/src/python/scope_window.py b/gr-wxgui/src/python/scope_window.py
index a9917782f4..89a808cec0 100644
--- a/gr-wxgui/src/python/scope_window.py
+++ b/gr-wxgui/src/python/scope_window.py
@@ -435,6 +435,7 @@ class scope_window(wx.Panel, pubsub.pubsub):
                 use_persistence,
                 persist_alpha,
 		trig_mode,
+		y_axis_label,
 	):
 		pubsub.pubsub.__init__(self)
 		#check num inputs
@@ -471,6 +472,7 @@ class scope_window(wx.Panel, pubsub.pubsub):
 		self[T_DIVS_KEY] = 8
 		self[X_DIVS_KEY] = 8
 		self[Y_DIVS_KEY] = 8
+		self[Y_AXIS_LABEL] = y_axis_label
 		self[FRAME_RATE_KEY] = frame_rate
 		self[TRIGGER_LEVEL_KEY] = 0
 		self[TRIGGER_CHANNEL_KEY] = 0
@@ -676,7 +678,7 @@ class scope_window(wx.Panel, pubsub.pubsub):
 			self.plotter.set_x_label('Time', 's')
 			self.plotter.set_x_grid(self.get_t_min(), self.get_t_max(), self[T_PER_DIV_KEY], True)
 			#update the y axis
-			self.plotter.set_y_label('Counts')
+			self.plotter.set_y_label(self[Y_AXIS_LABEL])
 			self.plotter.set_y_grid(self.get_y_min(), self.get_y_max(), self[Y_PER_DIV_KEY])
 		#redraw current sample
 		self.handle_samples()
diff --git a/gr-wxgui/src/python/scopesink_gl.py b/gr-wxgui/src/python/scopesink_gl.py
index 15be23d5ae..5ae897400b 100644
--- a/gr-wxgui/src/python/scopesink_gl.py
+++ b/gr-wxgui/src/python/scopesink_gl.py
@@ -77,6 +77,7 @@ class _scope_sink_base(gr.hier_block2, common.wxgui_hb):
 		ac_couple=False,
 		num_inputs=1,
 		trig_mode=scope_window.DEFAULT_TRIG_MODE,
+		y_axis_label='Counts',
 		frame_rate=scope_window.DEFAULT_FRAME_RATE,
                 use_persistence=False,
                 persist_alpha=None,
@@ -134,6 +135,7 @@ class _scope_sink_base(gr.hier_block2, common.wxgui_hb):
 			v_offset=v_offset,
 			xy_mode=xy_mode,
 			trig_mode=trig_mode,
+			y_axis_label=y_axis_label,
 			ac_couple_key=AC_COUPLE_KEY,
 			trigger_level_key=TRIGGER_LEVEL_KEY,
 			trigger_mode_key=TRIGGER_MODE_KEY,
diff --git a/grc/blocks/wxgui_scopesink2.xml b/grc/blocks/wxgui_scopesink2.xml
index 50cd977be2..ef03773739 100644
--- a/grc/blocks/wxgui_scopesink2.xml
+++ b/grc/blocks/wxgui_scopesink2.xml
@@ -21,6 +21,7 @@ scopesink2.$(type.fcn)(
 	xy_mode=$xy_mode,
 	num_inputs=$num_inputs,
 	trig_mode=$trig_mode,
+	y_axis_label=$y_axis_label,
 #if $win_size()
 	size=$win_size,
 #end if
@@ -156,6 +157,12 @@ $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos()))))
 			<key>gr.gr_TRIG_MODE_STRIPCHART</key>
 		</option>
 	</param>
+	<param>
+		<name>Y Axis Label</name>
+		<key>y_axis_label</key>
+		<value>Counts</value>
+		<type>string</type>
+	</param>
 	<check>not $win_size or len($win_size) == 2</check>
 	<check>not $xy_mode or '$type' == 'complex' or $num_inputs != 1</check>
 	<sink>
-- 
cgit v1.2.3


From 5e9908fbec19ce9309c12ea61c0303e6666e981a Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 01:03:11 -0700
Subject: uhd: removed utils warning functions, moved into the lower level
 wrappers

---
 gr-uhd/lib/Makefile.am               |  4 +--
 gr-uhd/lib/uhd_mimo_sink.cc          |  6 ++--
 gr-uhd/lib/uhd_mimo_source.cc        |  6 ++--
 gr-uhd/lib/uhd_simple_sink.cc        |  6 ++--
 gr-uhd/lib/uhd_simple_source.cc      |  6 ++--
 gr-uhd/lib/uhd_single_usrp_sink.cc   |  3 --
 gr-uhd/lib/uhd_single_usrp_source.cc |  3 --
 gr-uhd/lib/utils.cc                  | 56 ------------------------------------
 gr-uhd/lib/utils.h                   | 40 --------------------------
 9 files changed, 13 insertions(+), 117 deletions(-)
 delete mode 100644 gr-uhd/lib/utils.cc
 delete mode 100644 gr-uhd/lib/utils.h

diff --git a/gr-uhd/lib/Makefile.am b/gr-uhd/lib/Makefile.am
index 1260201a5c..69a41e7884 100644
--- a/gr-uhd/lib/Makefile.am
+++ b/gr-uhd/lib/Makefile.am
@@ -29,7 +29,6 @@ AM_CPPFLAGS = \
 lib_LTLIBRARIES = libgnuradio-uhd.la
 
 libgnuradio_uhd_la_SOURCES = \
-	utils.cc \
 	uhd_mimo_source.cc \
 	uhd_mimo_sink.cc \
 	uhd_simple_source.cc \
@@ -51,5 +50,4 @@ grinclude_HEADERS = \
 	uhd_single_usrp_source.h \
 	uhd_single_usrp_sink.h
 
-noinst_HEADERS = \
-	utils.h
+noinst_HEADERS =
diff --git a/gr-uhd/lib/uhd_mimo_sink.cc b/gr-uhd/lib/uhd_mimo_sink.cc
index 0a2ce1b0a7..03d310b1ea 100644
--- a/gr-uhd/lib/uhd_mimo_sink.cc
+++ b/gr-uhd/lib/uhd_mimo_sink.cc
@@ -23,7 +23,7 @@
 #include <uhd_mimo_sink.h>
 #include <gr_io_signature.h>
 #include <stdexcept>
-#include "utils.h"
+//#include "utils.h"
 
 /***********************************************************************
  * UHD Sink
@@ -59,7 +59,7 @@ public:
 
     void set_samp_rate_all(double rate){
         _dev->set_tx_rate_all(rate);
-        do_samp_rate_error_message(rate, get_samp_rate_all(), "TX");
+        //do_samp_rate_error_message(rate, get_samp_rate_all(), "TX");
     }
 
     double get_samp_rate_all(void){
@@ -68,7 +68,7 @@ public:
 
     uhd::tune_result_t set_center_freq(size_t chan, double freq){
         uhd::tune_result_t tr = _dev->set_tx_freq(chan, freq);
-        do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX");
+        //do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX");
         return tr;
     }
 
diff --git a/gr-uhd/lib/uhd_mimo_source.cc b/gr-uhd/lib/uhd_mimo_source.cc
index 62157142db..abd70ba369 100644
--- a/gr-uhd/lib/uhd_mimo_source.cc
+++ b/gr-uhd/lib/uhd_mimo_source.cc
@@ -23,7 +23,7 @@
 #include <uhd_mimo_source.h>
 #include <gr_io_signature.h>
 #include <stdexcept>
-#include "utils.h"
+//#include "utils.h"
 
 /***********************************************************************
  * UHD Source
@@ -59,7 +59,7 @@ public:
 
     void set_samp_rate_all(double rate){
         _dev->set_rx_rate_all(rate);
-        do_samp_rate_error_message(rate, get_samp_rate_all(), "RX");
+        //do_samp_rate_error_message(rate, get_samp_rate_all(), "RX");
     }
 
     double get_samp_rate_all(void){
@@ -68,7 +68,7 @@ public:
 
     uhd::tune_result_t set_center_freq(size_t chan, double freq){
         uhd::tune_result_t tr = _dev->set_rx_freq(chan, freq);
-        do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX");
+        //do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX");
         return tr;
     }
 
diff --git a/gr-uhd/lib/uhd_simple_sink.cc b/gr-uhd/lib/uhd_simple_sink.cc
index 7b31218dbb..d7b04465d4 100644
--- a/gr-uhd/lib/uhd_simple_sink.cc
+++ b/gr-uhd/lib/uhd_simple_sink.cc
@@ -23,7 +23,7 @@
 #include <uhd_simple_sink.h>
 #include <gr_io_signature.h>
 #include <stdexcept>
-#include "utils.h"
+//#include "utils.h"
 
 /***********************************************************************
  * UHD Sink
@@ -56,7 +56,7 @@ public:
 
     void set_samp_rate(double rate){
         _dev->set_tx_rate(rate);
-        do_samp_rate_error_message(rate, get_samp_rate(), "TX");
+        //do_samp_rate_error_message(rate, get_samp_rate(), "TX");
     }
 
     double get_samp_rate(void){
@@ -65,7 +65,7 @@ public:
 
     uhd::tune_result_t set_center_freq(double freq){
         uhd::tune_result_t tr = _dev->set_tx_freq(freq);
-        do_tune_freq_error_message(freq, _dev->get_tx_freq(), "TX");
+        //do_tune_freq_error_message(freq, _dev->get_tx_freq(), "TX");
         return tr;
     }
 
diff --git a/gr-uhd/lib/uhd_simple_source.cc b/gr-uhd/lib/uhd_simple_source.cc
index c1e11e85d2..d74c8414d2 100644
--- a/gr-uhd/lib/uhd_simple_source.cc
+++ b/gr-uhd/lib/uhd_simple_source.cc
@@ -25,7 +25,7 @@
 #include <stdexcept>
 #include <iostream>
 #include <boost/format.hpp>
-#include "utils.h"
+//#include "utils.h"
 
 /***********************************************************************
  * UHD Source
@@ -59,7 +59,7 @@ public:
 
     void set_samp_rate(double rate){
         _dev->set_rx_rate(rate);
-        do_samp_rate_error_message(rate, get_samp_rate(), "RX");
+        //do_samp_rate_error_message(rate, get_samp_rate(), "RX");
     }
 
     double get_samp_rate(void){
@@ -68,7 +68,7 @@ public:
 
     uhd::tune_result_t set_center_freq(double freq){
         uhd::tune_result_t tr = _dev->set_rx_freq(freq);
-        do_tune_freq_error_message(freq, _dev->get_rx_freq(), "RX");
+        //do_tune_freq_error_message(freq, _dev->get_rx_freq(), "RX");
         return tr;
     }
 
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc
index 96f86c8db7..cd7d7a6188 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_single_usrp_sink.cc
@@ -22,7 +22,6 @@
 #include <uhd_single_usrp_sink.h>
 #include <gr_io_signature.h>
 #include <stdexcept>
-#include "utils.h"
 
 /***********************************************************************
  * UHD Single USPR Sink
@@ -56,7 +55,6 @@ public:
 
     void set_samp_rate(double rate){
         _dev->set_tx_rate(rate);
-        do_samp_rate_error_message(rate, get_samp_rate(), "TX");
     }
 
     double get_samp_rate(void){
@@ -65,7 +63,6 @@ public:
 
     uhd::tune_result_t set_center_freq(double freq, size_t chan){
         uhd::tune_result_t tr = _dev->set_tx_freq(freq, chan);
-        do_tune_freq_error_message(freq, _dev->get_tx_freq(chan), "TX");
         return tr;
     }
 
diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc
index b5e39b5a4d..fc2c453eb3 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.cc
+++ b/gr-uhd/lib/uhd_single_usrp_source.cc
@@ -24,7 +24,6 @@
 #include <stdexcept>
 #include <iostream>
 #include <boost/format.hpp>
-#include "utils.h"
 
 /***********************************************************************
  * UHD Single USPR Source
@@ -54,7 +53,6 @@ public:
 
     void set_samp_rate(double rate){
         _dev->set_rx_rate(rate);
-        do_samp_rate_error_message(rate, get_samp_rate(), "RX");
     }
 
     double get_samp_rate(void){
@@ -63,7 +61,6 @@ public:
 
     uhd::tune_result_t set_center_freq(double freq, size_t chan){
         uhd::tune_result_t tr = _dev->set_rx_freq(freq, chan);
-        do_tune_freq_error_message(freq, _dev->get_rx_freq(chan), "RX");
         return tr;
     }
 
diff --git a/gr-uhd/lib/utils.cc b/gr-uhd/lib/utils.cc
deleted file mode 100644
index da83529650..0000000000
--- a/gr-uhd/lib/utils.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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.
- */
-
-#include "utils.h" //local include
-#include <uhd/utils/warning.hpp>
-#include <boost/format.hpp>
-#include <cmath>
-
-void do_samp_rate_error_message(
-    double target_rate,
-    double actual_rate,
-    const std::string &xx
-){
-    static const double max_allowed_error = 1.0; //Sps
-    if (std::abs(target_rate - actual_rate) > max_allowed_error){
-        uhd::print_warning(str(boost::format(
-            "The hardware does not support the requested %s sample rate:\n"
-            "Target sample rate: %f MSps\n"
-            "Actual sample rate: %f MSps\n"
-        ) % xx % (target_rate/1e6) % (actual_rate/1e6)));
-    }
-}
-
-void do_tune_freq_error_message(
-    double target_freq,
-    double actual_freq,
-    const std::string &xx
-){
-    static const double max_allowed_error = 1.0; //Hz
-    if (std::abs(target_freq - actual_freq) > max_allowed_error){
-        uhd::print_warning(str(boost::format(
-            "The hardware does not support the requested %s frequency:\n"
-            "Target frequency: %f MHz\n"
-            "Actual frequency: %f MHz\n"
-        ) % xx % (target_freq/1e6) % (actual_freq/1e6)));
-    }
-}
diff --git a/gr-uhd/lib/utils.h b/gr-uhd/lib/utils.h
deleted file mode 100644
index 4a05476bdb..0000000000
--- a/gr-uhd/lib/utils.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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_NOINST_UTILS_H
-#define INCLUDED_NOINST_UTILS_H
-
-#include <string>
-
-void do_samp_rate_error_message(
-    double target_rate,
-    double actual_rate,
-    const std::string &xx
-);
-
-void do_tune_freq_error_message(
-    double target_freq,
-    double actual_freq,
-    const std::string &xx
-);
-
-#endif /* INCLUDED_NOINST_UTILS_H */
-- 
cgit v1.2.3


From 4ac5545625d3d6df9881695f764c9c94049edb7b Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 12:18:13 -0700
Subject: uhd: added multi usrp skeleton and added deprecation note to other
 headers

---
 gr-uhd/lib/Makefile.am              |   8 +--
 gr-uhd/lib/uhd_mimo_sink.h          |   3 +
 gr-uhd/lib/uhd_mimo_source.h        |   3 +
 gr-uhd/lib/uhd_multi_usrp_sink.cc   |  24 +++++++
 gr-uhd/lib/uhd_multi_usrp_sink.h    | 138 ++++++++++++++++++++++++++++++++++++
 gr-uhd/lib/uhd_multi_usrp_source.cc |  24 +++++++
 gr-uhd/lib/uhd_multi_usrp_source.h  | 138 ++++++++++++++++++++++++++++++++++++
 gr-uhd/lib/uhd_simple_sink.h        |   3 +
 gr-uhd/lib/uhd_simple_source.h      |   3 +
 9 files changed, 340 insertions(+), 4 deletions(-)
 create mode 100644 gr-uhd/lib/uhd_multi_usrp_sink.cc
 create mode 100644 gr-uhd/lib/uhd_multi_usrp_sink.h
 create mode 100644 gr-uhd/lib/uhd_multi_usrp_source.cc
 create mode 100644 gr-uhd/lib/uhd_multi_usrp_source.h

diff --git a/gr-uhd/lib/Makefile.am b/gr-uhd/lib/Makefile.am
index 69a41e7884..d9a296c754 100644
--- a/gr-uhd/lib/Makefile.am
+++ b/gr-uhd/lib/Makefile.am
@@ -31,6 +31,8 @@ lib_LTLIBRARIES = libgnuradio-uhd.la
 libgnuradio_uhd_la_SOURCES = \
 	uhd_mimo_source.cc \
 	uhd_mimo_sink.cc \
+	uhd_multi_usrp_source.cc \
+	uhd_multi_usrp_sink.cc \
 	uhd_simple_source.cc \
 	uhd_simple_sink.cc \
 	uhd_single_usrp_source.cc \
@@ -43,10 +45,8 @@ libgnuradio_uhd_la_LIBADD = \
 libgnuradio_uhd_la_LDFLAGS = $(LTVERSIONFLAGS)
 
 grinclude_HEADERS = \
-	uhd_mimo_source.h \
-	uhd_mimo_sink.h \
-	uhd_simple_source.h \
-	uhd_simple_sink.h \
+	uhd_multi_usrp_source.h \
+	uhd_multi_usrp_sink.h \
 	uhd_single_usrp_source.h \
 	uhd_single_usrp_sink.h
 
diff --git a/gr-uhd/lib/uhd_mimo_sink.h b/gr-uhd/lib/uhd_mimo_sink.h
index 46679d973d..a0a30381c3 100644
--- a/gr-uhd/lib/uhd_mimo_sink.h
+++ b/gr-uhd/lib/uhd_mimo_sink.h
@@ -34,6 +34,9 @@ boost::shared_ptr<uhd_mimo_sink> uhd_make_mimo_sink(
     const uhd::io_type_t::tid_t &type
 );
 
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
 class uhd_mimo_sink : public gr_sync_block{
 public:
 
diff --git a/gr-uhd/lib/uhd_mimo_source.h b/gr-uhd/lib/uhd_mimo_source.h
index fbd7f2c420..f6f18eedcf 100644
--- a/gr-uhd/lib/uhd_mimo_source.h
+++ b/gr-uhd/lib/uhd_mimo_source.h
@@ -34,6 +34,9 @@ boost::shared_ptr<uhd_mimo_source> uhd_make_mimo_source(
     const uhd::io_type_t::tid_t &type
 );
 
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
 class uhd_mimo_source : public gr_sync_block{
 public:
 
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc
new file mode 100644
index 0000000000..6854649c34
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2010 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.
+ */
+
+#include <uhd_multi_usrp_sink.h>
+#include <gr_io_signature.h>
+#include <stdexcept>
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h
new file mode 100644
index 0000000000..b29657e941
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2010 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_UHD_MULTI_USRP_SINK_H
+#define INCLUDED_UHD_MULTI_USRP_SINK_H
+
+#include <gr_sync_block.h>
+#include <uhd/usrp/multi_usrp.hpp>
+
+class uhd_multi_usrp_sink;
+
+boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink(
+    const std::string &args,
+    const uhd::io_type_t::tid_t &type,
+    size_t num_channels
+);
+
+class uhd_multi_usrp_sink : public gr_sync_block{
+public:
+
+    /*!
+     * Set the IO signature for this block.
+     * \param sig the input signature
+     */
+    uhd_multi_usrp_sink(gr_io_signature_sptr sig);
+
+    /*!
+     * Set the subdevice specification.
+     * \param spec the subdev spec markup string
+     */
+    virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0;
+
+    /*!
+     * Set the sample rate for the usrp device.
+     * \param rate a new rate in Sps
+     */
+    virtual void set_samp_rate(double rate) = 0;
+
+    /*!
+     * Get the sample rate for the usrp device.
+     * This is the actual sample rate and may differ from the rate set.
+     * \return the actual rate in Sps
+     */
+    virtual double get_samp_rate(void) = 0;
+
+    /*!
+     * Tune the usrp device to the desired center frequency.
+     * \param freq the desired frequency in Hz
+     * \return a tune result with the actual frequencies
+     */
+    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+
+    /*!
+     * Get the tunable frequency range.
+     * \return the frequency range in Hz
+     */
+    virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
+
+    /*!
+     * Set the gain for the dboard.
+     * \param gain the gain in dB
+     */
+    virtual void set_gain(float gain, size_t chan = 0) = 0;
+
+    /*!
+     * Get the actual dboard gain setting.
+     * \return the actual gain in dB
+     */
+    virtual float get_gain(size_t chan = 0) = 0;
+
+    /*!
+     * Get the settable gain range.
+     * \return the gain range in dB
+     */
+    virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
+
+    /*!
+     * Set the antenna to use.
+     * \param ant the antenna string
+     */
+    virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
+
+    /*!
+     * Get the antenna in use.
+     * \return the antenna string
+     */
+    virtual std::string get_antenna(size_t chan = 0) = 0;
+
+    /*!
+     * Get a list of possible antennas.
+     * \return a vector of antenna strings
+     */
+    virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
+
+    /*!
+     * Set the clock configuration.
+     * \param clock_config the new configuration
+     */
+    virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0;
+
+    /*!
+     * Get the current time registers.
+     * \return the current usrp time
+     */
+    virtual uhd::time_spec_t get_time_now(void) = 0;
+
+    /*!
+     * Set the time registers at the next pps.
+     * \param time_spec the new time
+     */
+    virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0;
+
+    /*!
+     * Get access to the underlying uhd device object.
+     * \return the multi usrp device object
+     */
+    virtual uhd::usrp::multi_usrp::sptr get_device(void) = 0;
+};
+
+#endif /* INCLUDED_UHD_MULTI_USRP_SINK_H */
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
new file mode 100644
index 0000000000..27caffbfc8
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2010 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.
+ */
+
+#include <uhd_multi_usrp_source.h>
+#include <gr_io_signature.h>
+#include <stdexcept>
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h
new file mode 100644
index 0000000000..b2c4a3ac17
--- /dev/null
+++ b/gr-uhd/lib/uhd_multi_usrp_source.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2010 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_UHD_MULTI_USRP_SOURCE_H
+#define INCLUDED_UHD_MULTI_USRP_SOURCE_H
+
+#include <gr_sync_block.h>
+#include <uhd/usrp/multi_usrp.hpp>
+
+class uhd_multi_usrp_source;
+
+boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source(
+    const std::string &args,
+    const uhd::io_type_t::tid_t &type,
+    size_t num_channels
+);
+
+class uhd_multi_usrp_source : public gr_sync_block{
+public:
+
+    /*!
+     * Set the IO signature for this block.
+     * \param sig the output signature
+     */
+    uhd_multi_usrp_source(gr_io_signature_sptr sig);
+
+    /*!
+     * Set the subdevice specification.
+     * \param spec the subdev spec markup string
+     */
+    virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0;
+
+    /*!
+     * Set the sample rate for the usrp device.
+     * \param rate a new rate in Sps
+     */
+    virtual void set_samp_rate(double rate) = 0;
+
+    /*!
+     * Get the sample rate for the usrp device.
+     * This is the actual sample rate and may differ from the rate set.
+     * \return the actual rate in Sps
+     */
+    virtual double get_samp_rate(void) = 0;
+
+    /*!
+     * Tune the usrp device to the desired center frequency.
+     * \param freq the desired frequency in Hz
+     * \return a tune result with the actual frequencies
+     */
+    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+
+    /*!
+     * Get the tunable frequency range.
+     * \return the frequency range in Hz
+     */
+    virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
+
+    /*!
+     * Set the gain for the dboard.
+     * \param gain the gain in dB
+     */
+    virtual void set_gain(float gain, size_t chan = 0) = 0;
+
+    /*!
+     * Get the actual dboard gain setting.
+     * \return the actual gain in dB
+     */
+    virtual float get_gain(size_t chan = 0) = 0;
+
+    /*!
+     * Get the settable gain range.
+     * \return the gain range in dB
+     */
+    virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
+
+    /*!
+     * Set the antenna to use.
+     * \param ant the antenna string
+     */
+    virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
+
+    /*!
+     * Get the antenna in use.
+     * \return the antenna string
+     */
+    virtual std::string get_antenna(size_t chan = 0) = 0;
+
+    /*!
+     * Get a list of possible antennas.
+     * \return a vector of antenna strings
+     */
+    virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
+
+    /*!
+     * Set the clock configuration.
+     * \param clock_config the new configuration
+     */
+    virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0;
+
+    /*!
+     * Get the current time registers.
+     * \return the current usrp time
+     */
+    virtual uhd::time_spec_t get_time_now(void) = 0;
+
+    /*!
+     * Set the time registers at the next pps.
+     * \param time_spec the new time
+     */
+    virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0;
+
+    /*!
+     * Get access to the underlying uhd device object.
+     * \return the multi usrp device object
+     */
+    virtual uhd::usrp::multi_usrp::sptr get_device(void) = 0;
+};
+
+#endif /* INCLUDED_UHD_MULTI_USRP_SOURCE_H */
diff --git a/gr-uhd/lib/uhd_simple_sink.h b/gr-uhd/lib/uhd_simple_sink.h
index 0abf306816..44b868698c 100644
--- a/gr-uhd/lib/uhd_simple_sink.h
+++ b/gr-uhd/lib/uhd_simple_sink.h
@@ -33,6 +33,9 @@ boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink(
     const uhd::io_type_t::tid_t &type
 );
 
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
 class uhd_simple_sink : public gr_sync_block{
 public:
 
diff --git a/gr-uhd/lib/uhd_simple_source.h b/gr-uhd/lib/uhd_simple_source.h
index b95c0cfd9d..4e79afa21e 100644
--- a/gr-uhd/lib/uhd_simple_source.h
+++ b/gr-uhd/lib/uhd_simple_source.h
@@ -33,6 +33,9 @@ boost::shared_ptr<uhd_simple_source> uhd_make_simple_source(
     const uhd::io_type_t::tid_t &type
 );
 
+/***********************************************************************
+ * DEPRECATED
+ **********************************************************************/
 class uhd_simple_source : public gr_sync_block{
 public:
 
-- 
cgit v1.2.3


From 873228d25b3ea5df8eb10f6652518f144858af61 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 13:46:51 -0700
Subject: uhd: filled in multi usrp code and swig file

---
 gr-uhd/lib/uhd_multi_usrp_sink.cc    | 151 ++++++++++++++++++++++++++++++++++
 gr-uhd/lib/uhd_multi_usrp_sink.h     |   6 ++
 gr-uhd/lib/uhd_multi_usrp_source.cc  | 154 +++++++++++++++++++++++++++++++++++
 gr-uhd/lib/uhd_multi_usrp_source.h   |   6 ++
 gr-uhd/lib/uhd_single_usrp_sink.cc   |  10 +--
 gr-uhd/lib/uhd_single_usrp_source.cc |   6 +-
 gr-uhd/swig/uhd_swig.i               |  33 +++++---
 7 files changed, 344 insertions(+), 22 deletions(-)

diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc
index 6854649c34..202f128406 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc
@@ -22,3 +22,154 @@
 #include <uhd_multi_usrp_sink.h>
 #include <gr_io_signature.h>
 #include <stdexcept>
+
+/***********************************************************************
+ * UHD Multi USRP Sink
+ **********************************************************************/
+uhd_multi_usrp_sink::uhd_multi_usrp_sink(gr_io_signature_sptr sig)
+:gr_sync_block("uhd multi usrp sink", sig, gr_make_io_signature(0, 0, 0)){
+    /* NOP */
+}
+
+/***********************************************************************
+ * UHD Multi USRP Sink Impl
+ **********************************************************************/
+class uhd_multi_usrp_sink_impl : public uhd_multi_usrp_sink{
+public:
+    uhd_multi_usrp_sink_impl(
+        const std::string &args,
+        const uhd::io_type_t &type,
+        size_t num_channels
+    ) : uhd_multi_usrp_sink(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type), _nchan(num_channels)
+    {
+        _dev = uhd::usrp::multi_usrp::make(args);
+    }
+
+    void set_subdev_spec(const std::string &spec, size_t mboard){
+        return _dev->set_tx_subdev_spec(spec, mboard);
+    }
+
+    void set_samp_rate(double rate){
+        _dev->set_tx_rate(rate);
+    }
+
+    double get_samp_rate(void){
+        return _dev->get_tx_rate();
+    }
+
+    uhd::tune_result_t set_center_freq(double freq, size_t chan){
+        uhd::tune_result_t tr = _dev->set_tx_freq(freq, chan);
+        return tr;
+    }
+
+    uhd::freq_range_t get_freq_range(size_t chan){
+        return _dev->get_tx_freq_range(chan);
+    }
+
+    void set_gain(float gain, size_t chan){
+        return _dev->set_tx_gain(gain, chan);
+    }
+
+    float get_gain(size_t chan){
+        return _dev->get_tx_gain(chan);
+    }
+
+    uhd::gain_range_t get_gain_range(size_t chan){
+        return _dev->get_tx_gain_range(chan);
+    }
+
+    void set_antenna(const std::string &ant, size_t chan){
+        return _dev->set_tx_antenna(ant, chan);
+    }
+
+    std::string get_antenna(size_t chan){
+        return _dev->get_tx_antenna(chan);
+    }
+
+    std::vector<std::string> get_antennas(size_t chan){
+        return _dev->get_tx_antennas(chan);
+    }
+
+    void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){
+        return _dev->set_clock_config(clock_config, mboard);
+    }
+
+    uhd::time_spec_t get_time_now(void){
+        return _dev->get_time_now();
+    }
+
+    void set_time_next_pps(const uhd::time_spec_t &time_spec){
+        return _dev->set_time_next_pps(time_spec);
+    }
+
+    void set_time_unknown_pps(const uhd::time_spec_t &time_spec){
+        return _dev->set_time_unknown_pps(time_spec);
+    }
+
+    uhd::usrp::multi_usrp::sptr get_device(void){
+        return _dev;
+    }
+
+/***********************************************************************
+ * Work
+ **********************************************************************/
+    int work(
+        int noutput_items,
+        gr_vector_const_void_star &input_items,
+        gr_vector_void_star &output_items
+    ){
+        uhd::tx_metadata_t metadata;
+        metadata.start_of_burst = true;
+
+        return _dev->get_device()->send(
+            input_items, noutput_items, metadata,
+            _type, uhd::device::SEND_MODE_FULL_BUFF
+        );
+    }
+
+    //Send an empty start-of-burst packet to begin streaming.
+    //Set at a time in the near future so data will be sync'd.
+    bool start(void){
+        uhd::tx_metadata_t metadata;
+        metadata.start_of_burst = true;
+        metadata.has_time_spec = true;
+        metadata.time_spec = get_time_now() + uhd::time_spec_t(0.01); //10ms offset in future
+
+        _dev->get_device()->send(
+            gr_vector_const_void_star(_nchan), 0, metadata,
+            _type, uhd::device::SEND_MODE_ONE_PACKET
+        );
+        return true;
+    }
+
+    //Send an empty end-of-burst packet to end streaming.
+    //Ending the burst avoids an underflow error on stop.
+    bool stop(void){
+        uhd::tx_metadata_t metadata;
+        metadata.end_of_burst = true;
+
+        _dev->get_device()->send(
+            gr_vector_const_void_star(_nchan), 0, metadata,
+            _type, uhd::device::SEND_MODE_ONE_PACKET
+        );
+        return true;
+    }
+
+protected:
+    uhd::usrp::multi_usrp::sptr _dev;
+    const uhd::io_type_t _type;
+    size_t _nchan;
+};
+
+/***********************************************************************
+ * Make UHD Multi USRP Sink
+ **********************************************************************/
+boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink(
+    const std::string &args,
+    const uhd::io_type_t::tid_t &type,
+    size_t num_channels
+){
+    return boost::shared_ptr<uhd_multi_usrp_sink>(
+        new uhd_multi_usrp_sink_impl(args, type, num_channels)
+    );
+}
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h
index b29657e941..13bba20fb6 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.h
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.h
@@ -128,6 +128,12 @@ public:
      */
     virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0;
 
+    /*!
+     * Sync the time registers with an unknown pps edge.
+     * \param time_spec the new time
+     */
+    virtual void set_time_unknown_pps(const uhd::time_spec_t &time_spec) = 0;
+
     /*!
      * Get access to the underlying uhd device object.
      * \return the multi usrp device object
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
index 27caffbfc8..c10c08c500 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -22,3 +22,157 @@
 #include <uhd_multi_usrp_source.h>
 #include <gr_io_signature.h>
 #include <stdexcept>
+#include <iostream>
+#include <boost/format.hpp>
+
+/***********************************************************************
+ * UHD Multi USRP Source
+ **********************************************************************/
+uhd_multi_usrp_source::uhd_multi_usrp_source(gr_io_signature_sptr sig)
+:gr_sync_block("uhd multi_usrp source", gr_make_io_signature(0, 0, 0), sig){
+    /* NOP */
+}
+
+/***********************************************************************
+ * UHD Multi USRP Source Impl
+ **********************************************************************/
+class uhd_multi_usrp_source_impl : public uhd_multi_usrp_source{
+public:
+    uhd_multi_usrp_source_impl(
+        const std::string &args,
+        const uhd::io_type_t &type,
+        size_t num_channels
+    ) : uhd_multi_usrp_source(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type)
+    {
+        _dev = uhd::usrp::multi_usrp::make(args);
+    }
+
+    void set_subdev_spec(const std::string &spec, size_t mboard){
+        return _dev->set_rx_subdev_spec(spec, mboard);
+    }
+
+    void set_samp_rate(double rate){
+        _dev->set_rx_rate(rate);
+    }
+
+    double get_samp_rate(void){
+        return _dev->get_rx_rate();
+    }
+
+    uhd::tune_result_t set_center_freq(double freq, size_t chan){
+        uhd::tune_result_t tr = _dev->set_rx_freq(freq, chan);
+        return tr;
+    }
+
+    uhd::freq_range_t get_freq_range(size_t chan){
+        return _dev->get_rx_freq_range(chan);
+    }
+
+    void set_gain(float gain, size_t chan){
+        return _dev->set_rx_gain(gain, chan);
+    }
+
+    float get_gain(size_t chan){
+        return _dev->get_rx_gain(chan);
+    }
+
+    uhd::gain_range_t get_gain_range(size_t chan){
+        return _dev->get_rx_gain_range(chan);
+    }
+
+    void set_antenna(const std::string &ant, size_t chan){
+        return _dev->set_rx_antenna(ant, chan);
+    }
+
+    std::string get_antenna(size_t chan){
+        return _dev->get_rx_antenna(chan);
+    }
+
+    std::vector<std::string> get_antennas(size_t chan){
+        return _dev->get_rx_antennas(chan);
+    }
+
+    void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){
+        return _dev->set_clock_config(clock_config, mboard);
+    }
+
+    uhd::time_spec_t get_time_now(void){
+        return _dev->get_time_now();
+    }
+
+    void set_time_next_pps(const uhd::time_spec_t &time_spec){
+        return _dev->set_time_next_pps(time_spec);
+    }
+
+    void set_time_unknown_pps(const uhd::time_spec_t &time_spec){
+        return _dev->set_time_unknown_pps(time_spec);
+    }
+
+    uhd::usrp::multi_usrp::sptr get_device(void){
+        return _dev;
+    }
+
+/***********************************************************************
+ * Work
+ **********************************************************************/
+    int work(
+        int noutput_items,
+        gr_vector_const_void_star &input_items,
+        gr_vector_void_star &output_items
+    ){
+        uhd::rx_metadata_t metadata; //not passed out of this block
+
+        size_t num_samps = _dev->get_device()->recv(
+            output_items, noutput_items, metadata,
+            _type, uhd::device::RECV_MODE_FULL_BUFF
+        );
+
+        switch(metadata.error_code){
+        case uhd::rx_metadata_t::ERROR_CODE_NONE:
+            return num_samps;
+
+        case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW:
+            //ignore overflows and try work again
+            return work(noutput_items, input_items, output_items);
+
+        default:
+            std::cout << boost::format(
+                "UHD source block got error code 0x%x"
+            ) % metadata.error_code << std::endl;
+            return num_samps;
+        }
+    }
+
+    bool start(void){
+        //setup a stream command that starts streaming slightly in the future
+        static const double reasonable_delay = 0.01; //10 ms (order of magnitude >> RTT)
+        uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
+        stream_cmd.stream_now = false;
+        stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(_dev->get_num_mboards() * reasonable_delay);
+        _dev->issue_stream_cmd(stream_cmd);
+        return true;
+    }
+
+    bool stop(void){
+        _dev->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
+        return true;
+    }
+
+private:
+    uhd::usrp::multi_usrp::sptr _dev;
+    const uhd::io_type_t _type;
+};
+
+
+/***********************************************************************
+ * Make UHD Multi USRP Source
+ **********************************************************************/
+boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source(
+    const std::string &args,
+    const uhd::io_type_t::tid_t &type,
+    size_t num_channels
+){
+    return boost::shared_ptr<uhd_multi_usrp_source>(
+        new uhd_multi_usrp_source_impl(args, type, num_channels)
+    );
+}
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h
index b2c4a3ac17..b94e53f01b 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.h
+++ b/gr-uhd/lib/uhd_multi_usrp_source.h
@@ -128,6 +128,12 @@ public:
      */
     virtual void set_time_next_pps(const uhd::time_spec_t &time_spec) = 0;
 
+    /*!
+     * Sync the time registers with an unknown pps edge.
+     * \param time_spec the new time
+     */
+    virtual void set_time_unknown_pps(const uhd::time_spec_t &time_spec) = 0;
+
     /*!
      * Get access to the underlying uhd device object.
      * \return the multi usrp device object
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc
index cd7d7a6188..96c1dbdf49 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_single_usrp_sink.cc
@@ -24,7 +24,7 @@
 #include <stdexcept>
 
 /***********************************************************************
- * UHD Single USPR Sink
+ * UHD Single USRP Sink
  **********************************************************************/
 uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig)
 :gr_sync_block("uhd single usrp sink", sig, gr_make_io_signature(0, 0, 0)){
@@ -32,7 +32,7 @@ uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig)
 }
 
 /***********************************************************************
- * UHD Single USPR Sink Impl
+ * UHD Single USRP Sink Impl
  **********************************************************************/
 class uhd_single_usrp_sink_impl : public uhd_single_usrp_sink{
 public:
@@ -45,10 +45,6 @@ public:
         _dev = uhd::usrp::single_usrp::make(args);
     }
 
-    ~uhd_single_usrp_sink_impl(void){
-        //NOP
-    }
-
     void set_subdev_spec(const std::string &spec){
         return _dev->set_tx_subdev_spec(spec);
     }
@@ -164,7 +160,7 @@ protected:
 };
 
 /***********************************************************************
- * Make UHD Single USPR Sink
+ * Make UHD Single USRP Sink
  **********************************************************************/
 boost::shared_ptr<uhd_single_usrp_sink> uhd_make_single_usrp_sink(
     const std::string &args,
diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc
index fc2c453eb3..7c3694a99d 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.cc
+++ b/gr-uhd/lib/uhd_single_usrp_source.cc
@@ -26,7 +26,7 @@
 #include <boost/format.hpp>
 
 /***********************************************************************
- * UHD Single USPR Source
+ * UHD Single USRP Source
  **********************************************************************/
 uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig)
 :gr_sync_block("uhd single_usrp source", gr_make_io_signature(0, 0, 0), sig){
@@ -34,7 +34,7 @@ uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig)
 }
 
 /***********************************************************************
- * UHD Single USPR Source Impl
+ * UHD Single USRP Source Impl
  **********************************************************************/
 class uhd_single_usrp_source_impl : public uhd_single_usrp_source{
 public:
@@ -160,7 +160,7 @@ private:
 
 
 /***********************************************************************
- * Make UHD Single USPR Source
+ * Make UHD Single USRP Source
  **********************************************************************/
 boost::shared_ptr<uhd_single_usrp_source> uhd_make_single_usrp_source(
     const std::string &args,
diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i
index d755dfeee6..1631a768a7 100644
--- a/gr-uhd/swig/uhd_swig.i
+++ b/gr-uhd/swig/uhd_swig.i
@@ -29,10 +29,13 @@ namespace std {
 }
 
 %{
-#include <uhd_mimo_source.h>
-#include <uhd_mimo_sink.h>
-#include <uhd_simple_source.h>
-#include <uhd_simple_sink.h>
+#include <uhd_mimo_source.h> //deprecated
+#include <uhd_mimo_sink.h> //deprecated
+#include <uhd_simple_source.h> //deprecated
+#include <uhd_simple_sink.h> //deprecated
+
+#include <uhd_multi_usrp_source.h>
+#include <uhd_multi_usrp_sink.h>
 #include <uhd_single_usrp_source.h>
 #include <uhd_single_usrp_sink.h>
 %}
@@ -44,17 +47,23 @@ namespace std {
 %include <uhd/types/time_spec.hpp>
 %include <uhd/types/clock_config.hpp>
 
-GR_SWIG_BLOCK_MAGIC(uhd,mimo_source)
-%include <uhd_mimo_source.h>
+GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) //deprecated
+%include <uhd_mimo_source.h> //deprecated
+
+GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink) //deprecated
+%include <uhd_mimo_sink.h> //deprecated
+
+GR_SWIG_BLOCK_MAGIC(uhd,simple_source) //deprecated
+%include <uhd_simple_source.h> //deprecated
 
-GR_SWIG_BLOCK_MAGIC(uhd,mimo_sink)
-%include <uhd_mimo_sink.h>
+GR_SWIG_BLOCK_MAGIC(uhd,simple_sink) //deprecated
+%include <uhd_simple_sink.h> //deprecated
 
-GR_SWIG_BLOCK_MAGIC(uhd,simple_source)
-%include <uhd_simple_source.h>
+GR_SWIG_BLOCK_MAGIC(uhd,multi_usrp_source)
+%include <uhd_multi_usrp_source.h>
 
-GR_SWIG_BLOCK_MAGIC(uhd,simple_sink)
-%include <uhd_simple_sink.h>
+GR_SWIG_BLOCK_MAGIC(uhd,multi_usrp_sink)
+%include <uhd_multi_usrp_sink.h>
 
 GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_source)
 %include <uhd_single_usrp_source.h>
-- 
cgit v1.2.3


From d029af43c3367a4611185ade70639cc6b7cc5e3d Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 14:09:23 -0700
Subject: uhd: created multi usrp grc wrapper generator, removed mimo gen and
 checked in its generated files

---
 gr-uhd/grc/.gitignore                       |   2 +-
 gr-uhd/grc/Makefile.am                      |  21 +-
 gr-uhd/grc/gen_uhd_mimo_blocks_xml.py       | 190 ----------
 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py | 211 +++++++++++
 gr-uhd/grc/uhd_mimo_sink.xml                | 550 ++++++++++++++++++++++++++++
 gr-uhd/grc/uhd_mimo_source.xml              | 550 ++++++++++++++++++++++++++++
 gr-uhd/lib/Makefile.am                      |  11 +-
 7 files changed, 1332 insertions(+), 203 deletions(-)
 delete mode 100755 gr-uhd/grc/gen_uhd_mimo_blocks_xml.py
 create mode 100755 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
 create mode 100644 gr-uhd/grc/uhd_mimo_sink.xml
 create mode 100644 gr-uhd/grc/uhd_mimo_source.xml

diff --git a/gr-uhd/grc/.gitignore b/gr-uhd/grc/.gitignore
index c95275d8d4..d8ab9bd0c3 100644
--- a/gr-uhd/grc/.gitignore
+++ b/gr-uhd/grc/.gitignore
@@ -1,4 +1,4 @@
-/uhd_mimo*.xml
+/uhd_multi*.xml
 /uhd_single*.xml
 /Makefile
 /Makefile.in
diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am
index a19a28f033..04b7dca365 100644
--- a/gr-uhd/grc/Makefile.am
+++ b/gr-uhd/grc/Makefile.am
@@ -23,31 +23,36 @@ include $(top_srcdir)/Makefile.common
 
 grcblocksdir = $(grc_blocksdir)
 
-generated_uhd_mimo_blocks = \
-	uhd_mimo_source.xml \
-	uhd_mimo_sink.xml
+generated_uhd_multi_usrp_blocks = \
+	uhd_multi_usrp_source.xml \
+	uhd_multi_usrp_sink.xml
 
 generated_uhd_single_usrp_blocks = \
 	uhd_single_usrp_source.xml \
 	uhd_single_usrp_sink.xml
 
 BUILT_SOURCES = \
-	$(generated_uhd_mimo_blocks) \
+	$(generated_uhd_multi_usrp_blocks) \
 	$(generated_uhd_single_usrp_blocks)
 
 dist_grcblocks_DATA = \
-	$(BUILT_SOURCES) \
+	$(BUILT_SOURCES)
+
+# add the deprecated files
+dist_grcblocks_DATA += \
+	uhd_mimo_source.xml \
+	uhd_mimo_sink.xml \
 	uhd_simple_source.xml \
 	uhd_simple_sink.xml
 
 ########################################################################
-# Rules for generating the mimo source and sink blocks
+# Rules for generating the source and sink xml wrappers
 ########################################################################
 EXTRA_DIST = \
-	$(srcdir)/gen_uhd_mimo_blocks_xml.py \
+	$(srcdir)/gen_uhd_multi_usrp_blocks_xml.py \
 	$(srcdir)/gen_uhd_single_usrp_blocks_xml.py
 
-$(generated_uhd_mimo_blocks): $(srcdir)/gen_uhd_mimo_blocks_xml.py
+$(generated_uhd_multi_usrp_blocks): $(srcdir)/gen_uhd_multi_usrp_blocks_xml.py
 	@echo "generating $@..."
 	$(PYTHON) $< $@
 
diff --git a/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py b/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py
deleted file mode 100755
index 7e61563cc8..0000000000
--- a/gr-uhd/grc/gen_uhd_mimo_blocks_xml.py
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/usr/bin/env python
-"""
-Copyright 2010 Free Software Foundation, Inc.
-
-This file is part of GNU Radio
-
-GNU Radio Companion 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
-of the License, or (at your option) any later version.
-
-GNU Radio Companion 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 this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
-"""
-
-MAIN_TMPL = """\
-<?xml version="1.0"?>
-<block>
-	<name>UHD MIMO $sourk.title()</name>
-	<key>uhd_mimo_$(sourk)</key>
-	<category>UHD</category>
-	<import>from gnuradio import uhd</import>
-	<make>uhd.mimo_$(sourk)(\$nchan, \$args, uhd.io_type_t.\$type.type)
-self.\$(id).set_samp_rate_all(\$samp_rate)
-#for $n in range($max_nchan)
-\#if \$nchan() > $n
-self.\$(id).set_subdev_spec($n, \$sd_spec$(n))
-self.\$(id).set_center_freq($n, \$center_freq$(n))
-self.\$(id).set_gain($n, \$gain$(n))
-	\#if \$ant$(n)()
-self.\$(id).set_antenna($n, \$ant$(n))
-	\#end if
-\#end if
-#end for
-</make>
-	<callback>set_samp_rate(\$samp_rate)</callback>
-	#for $n in range($max_nchan)
-	<callback>set_center_freq($n, \$center_freq$(n))</callback>
-	<callback>set_gain($n, \$gain$(n))</callback>
-	<callback>set_antenna($n, \$ant$(n))</callback>
-	#end for
-	<param>
-		<name>Input Type</name>
-		<key>type</key>
-		<type>enum</type>
-		<option>
-			<name>Complex</name>
-			<key>complex</key>
-			<opt>type:COMPLEX_FLOAT32</opt>
-			<opt>vlen:1</opt>
-		</option>
-		<option>
-			<name>Short</name>
-			<key>short</key>
-			<opt>type:COMPLEX_INT16</opt>
-			<opt>vlen:2</opt>
-		</option>
-	</param>
-	<param>
-		<name>Num Channels</name>
-		<key>nchan</key>
-		<value>2</value>
-		<type>int</type>
-		#for $n in range(2, $max_nchan+1)
-		<option>
-			<name>$n Channels</name>
-			<key>$n</key>
-		</option>
-		#end for
-	</param>
-	<param>
-		<name>Args</name>
-		<key>args</key>
-		<value>addr=192.168.10.2 192.168.20.2</value>
-		<type>string</type>
-	</param>
-	<param>
-		<name>Samp Rate (Sps)</name>
-		<key>samp_rate</key>
-		<value>samp_rate</value>
-		<type>real</type>
-	</param>
-	$params
-	<check>$max_nchan >= \$nchan</check>
-	<check>\$nchan >= 0</check>
-	<$sourk>
-		<name>$direction</name>
-		<type>\$type</type>
-		<vlen>\$type.vlen</vlen>
-		<nports>\$nchan</nports>
-	</$sourk>
-	<doc>
-The UHD $sourk.title() Block:
-
-Args:
-Args is a delimited string used to locate UHD devices on your system. \\
-If left blank, the first UHD device found will be used. \\
-Used args to specify a specfic device. \\
-USRP2 Example: addr=192.168.10.2
-
-Sample rate:
-The sample rate is the number of samples per second input by this block. \\
-The UHD device driver will try its best to match the requested sample rate. \\
-If the requested rate is not possible, the UHD block will print an error at runtime.
-
-Antenna:
-For subdevices/daughterboards with only one antenna, this may be left blank. \\
-Otherwise, the user should specify one of the possible antenna choices. \\
-See the daughterboard application notes for the possible antenna choices.
-	</doc>
-</block>
-"""
-
-PARAMS_TMPL = """
-	<param>
-		<name>Ch$(n): Subdev Spec</name>
-		<key>sd_spec$(n)</key>
-		<value></value>
-		<type>string</type>
-		<hide>
-			\#if not \$nchan() > $n
-				all
-			\#elif \$sd_spec$(n)()
-				none
-			\#else
-				part
-			\#end if
-		</hide>
-	</param>
-	<param>
-		<name>Ch$(n): Center Freq (Hz)</name>
-		<key>center_freq$(n)</key>
-		<value>0</value>
-		<type>real</type>
-		<hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
-	</param>
-	<param>
-		<name>Ch$(n): Gain (dB)</name>
-		<key>gain$(n)</key>
-		<value>0</value>
-		<type>real</type>
-		<hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
-	</param>
-	<param>
-		<name>Ch$(n): Antenna</name>
-		<key>ant$(n)</key>
-		<value></value>
-		<type>string</type>
-		<hide>
-			\#if not \$nchan() > $n
-				all
-			\#elif \$ant$(n)()
-				none
-			\#else
-				part
-			\#end if
-		</hide>
-	</param>
-"""
-
-def parse_tmpl(_tmpl, **kwargs):
-	from Cheetah import Template
-	return str(Template.Template(_tmpl, kwargs))
-
-max_num_channels = 8
-
-if __name__ == '__main__':
-	import sys
-	for file in sys.argv[1:]:
-		if 'source' in file:
-			sourk = 'source'
-			direction = 'out'
-		elif 'sink' in file:
-			sourk = 'sink'
-			direction = 'in'
-		else: raise Exception, 'is %s a source or sink?'%file
-
-		params = ''.join([parse_tmpl(PARAMS_TMPL, n=n) for n in range(max_num_channels)])
-		open(file, 'w').write(parse_tmpl(MAIN_TMPL,
-			max_nchan=max_num_channels,
-			params=params,
-			sourk=sourk,
-			direction=direction,
-		))
diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
new file mode 100755
index 0000000000..a4da53a188
--- /dev/null
+++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
@@ -0,0 +1,211 @@
+#!/usr/bin/env python
+"""
+Copyright 2010 Free Software Foundation, Inc.
+
+This file is part of GNU Radio
+
+GNU Radio Companion 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
+of the License, or (at your option) any later version.
+
+GNU Radio Companion 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 this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+"""
+
+MAIN_TMPL = """\
+<?xml version="1.0"?>
+<block>
+	<name>UHD: Multi USRP $sourk.title()</name>
+	<key>uhd_multi_usrp_$(sourk)</key>
+	<category>UHD</category>
+	<import>from gnuradio import uhd</import>
+	<make>uhd.multi_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan)
+self.\$(id).set_subdev_spec(\$sd_spec)
+self.\$(id).set_samp_rate(\$samp_rate)
+#for $n in range($max_nchan)
+\#if \$nchan() > $n
+self.\$(id).set_center_freq(\$center_freq$(n), $n)
+self.\$(id).set_gain(\$gain$(n), $n)
+	\#if \$ant$(n)()
+self.\$(id).set_antenna(\$ant$(n), $n)
+	\#end if
+\#end if
+#end for
+</make>
+	<callback>set_samp_rate(\$samp_rate)</callback>
+	#for $n in range($max_nchan)
+	<callback>set_center_freq(\$center_freq$(n), $n)</callback>
+	<callback>set_gain(\$gain$(n), $n)</callback>
+	<callback>set_antenna(\$ant$(n), $n)</callback>
+	#end for
+	<param>
+		<name>Input Type</name>
+		<key>type</key>
+		<type>enum</type>
+		<option>
+			<name>Complex</name>
+			<key>complex</key>
+			<opt>type:COMPLEX_FLOAT32</opt>
+			<opt>vlen:1</opt>
+		</option>
+		<option>
+			<name>Short</name>
+			<key>short</key>
+			<opt>type:COMPLEX_INT16</opt>
+			<opt>vlen:2</opt>
+		</option>
+	</param>
+	<param>
+		<name>Num Channels</name>
+		<key>nchan</key>
+		<value>1</value>
+		<type>int</type>
+		<hide>part</hide>
+		<option>
+			<name>Multi Channel</name>
+			<key>1</key>
+		</option>
+		<option>
+			<name>Dual Channel</name>
+			<key>2</key>
+		</option>
+		<option>
+			<name>Quad Channel</name>
+			<key>4</key>
+		</option>
+	</param>
+	<param>
+		<name>Device Addr</name>
+		<key>dev_addr</key>
+		<value>addr=192.168.10.2</value>
+		<type>string</type>
+		<hide>
+			\#if \$dev_addr()
+				none
+			\#else
+				part
+			\#end if
+		</hide>
+	</param>
+	<param>
+		<name>Subdev Spec</name>
+		<key>sd_spec</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			\#if \$sd_spec()
+				none
+			\#else
+				part
+			\#end if
+		</hide>
+	</param>
+	<param>
+		<name>Samp Rate (Sps)</name>
+		<key>samp_rate</key>
+		<value>samp_rate</value>
+		<type>real</type>
+	</param>
+	$params
+	<check>$max_nchan >= \$nchan</check>
+	<check>\$nchan >= 0</check>
+	<check>(len((\$sd_spec).split()) or 1) == \$nchan</check>
+	<$sourk>
+		<name>$direction</name>
+		<type>\$type</type>
+		<vlen>\$type.vlen</vlen>
+		<nports>\$nchan</nports>
+	</$sourk>
+	<doc>
+The UHD Multi USRP $sourk.title() Block:
+
+Device Address:
+The device address is a delimited string used to locate UHD devices on your system. \\
+If left blank, the first UHD device found will be used. \\
+Used args to specify a specfic device.
+USRP2 Example: addr=192.168.10.2 192.168.10.3
+
+Sample rate:
+The sample rate is the number of samples per second input by this block. \\
+The UHD device driver will try its best to match the requested sample rate. \\
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Subdevice specification:
+Select the subdevice or subdevices for each channel using a markup string. \\
+The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\
+If left blank, the UHD will try to select the first subdevice on your system. \\
+See the application notes for further details.
+Single channel example: A:AB
+Dual channel example: A:AB B:0
+
+Antenna:
+For subdevices/daughterboards with only one antenna, this may be left blank. \\
+Otherwise, the user should specify one of the possible antenna choices. \\
+See the daughterboard application notes for the possible antenna choices.
+	</doc>
+</block>
+"""
+
+PARAMS_TMPL = """
+	<param>
+		<name>Ch$(n): Center Freq (Hz)</name>
+		<key>center_freq$(n)</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch$(n): Gain (dB)</name>
+		<key>gain$(n)</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch$(n): Antenna</name>
+		<key>ant$(n)</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			\#if not \$nchan() > $n
+				all
+			\#elif \$ant$(n)()
+				none
+			\#else
+				part
+			\#end if
+		</hide>
+	</param>
+"""
+
+def parse_tmpl(_tmpl, **kwargs):
+	from Cheetah import Template
+	return str(Template.Template(_tmpl, kwargs))
+
+max_num_channels = 4
+
+if __name__ == '__main__':
+	import sys
+	for file in sys.argv[1:]:
+		if 'source' in file:
+			sourk = 'source'
+			direction = 'out'
+		elif 'sink' in file:
+			sourk = 'sink'
+			direction = 'in'
+		else: raise Exception, 'is %s a source or sink?'%file
+
+		params = ''.join([parse_tmpl(PARAMS_TMPL, n=n) for n in range(max_num_channels)])
+		open(file, 'w').write(parse_tmpl(MAIN_TMPL,
+			max_nchan=max_num_channels,
+			params=params,
+			sourk=sourk,
+			direction=direction,
+		))
diff --git a/gr-uhd/grc/uhd_mimo_sink.xml b/gr-uhd/grc/uhd_mimo_sink.xml
new file mode 100644
index 0000000000..2f5f2011f1
--- /dev/null
+++ b/gr-uhd/grc/uhd_mimo_sink.xml
@@ -0,0 +1,550 @@
+<?xml version="1.0"?>
+<block>
+	<name>UHD MIMO Sink</name>
+	<key>uhd_mimo_sink</key>
+	<category>UHD</category>
+	<import>from gnuradio import uhd</import>
+	<make>uhd.mimo_sink($nchan, $args, uhd.io_type_t.$type.type)
+self.$(id).set_samp_rate_all($samp_rate)
+#if $nchan() > 0
+self.$(id).set_subdev_spec(0, $sd_spec0)
+self.$(id).set_center_freq(0, $center_freq0)
+self.$(id).set_gain(0, $gain0)
+	#if $ant0()
+self.$(id).set_antenna(0, $ant0)
+	#end if
+#end if
+#if $nchan() > 1
+self.$(id).set_subdev_spec(1, $sd_spec1)
+self.$(id).set_center_freq(1, $center_freq1)
+self.$(id).set_gain(1, $gain1)
+	#if $ant1()
+self.$(id).set_antenna(1, $ant1)
+	#end if
+#end if
+#if $nchan() > 2
+self.$(id).set_subdev_spec(2, $sd_spec2)
+self.$(id).set_center_freq(2, $center_freq2)
+self.$(id).set_gain(2, $gain2)
+	#if $ant2()
+self.$(id).set_antenna(2, $ant2)
+	#end if
+#end if
+#if $nchan() > 3
+self.$(id).set_subdev_spec(3, $sd_spec3)
+self.$(id).set_center_freq(3, $center_freq3)
+self.$(id).set_gain(3, $gain3)
+	#if $ant3()
+self.$(id).set_antenna(3, $ant3)
+	#end if
+#end if
+#if $nchan() > 4
+self.$(id).set_subdev_spec(4, $sd_spec4)
+self.$(id).set_center_freq(4, $center_freq4)
+self.$(id).set_gain(4, $gain4)
+	#if $ant4()
+self.$(id).set_antenna(4, $ant4)
+	#end if
+#end if
+#if $nchan() > 5
+self.$(id).set_subdev_spec(5, $sd_spec5)
+self.$(id).set_center_freq(5, $center_freq5)
+self.$(id).set_gain(5, $gain5)
+	#if $ant5()
+self.$(id).set_antenna(5, $ant5)
+	#end if
+#end if
+#if $nchan() > 6
+self.$(id).set_subdev_spec(6, $sd_spec6)
+self.$(id).set_center_freq(6, $center_freq6)
+self.$(id).set_gain(6, $gain6)
+	#if $ant6()
+self.$(id).set_antenna(6, $ant6)
+	#end if
+#end if
+#if $nchan() > 7
+self.$(id).set_subdev_spec(7, $sd_spec7)
+self.$(id).set_center_freq(7, $center_freq7)
+self.$(id).set_gain(7, $gain7)
+	#if $ant7()
+self.$(id).set_antenna(7, $ant7)
+	#end if
+#end if
+</make>
+	<callback>set_samp_rate($samp_rate)</callback>
+	<callback>set_center_freq(0, $center_freq0)</callback>
+	<callback>set_gain(0, $gain0)</callback>
+	<callback>set_antenna(0, $ant0)</callback>
+	<callback>set_center_freq(1, $center_freq1)</callback>
+	<callback>set_gain(1, $gain1)</callback>
+	<callback>set_antenna(1, $ant1)</callback>
+	<callback>set_center_freq(2, $center_freq2)</callback>
+	<callback>set_gain(2, $gain2)</callback>
+	<callback>set_antenna(2, $ant2)</callback>
+	<callback>set_center_freq(3, $center_freq3)</callback>
+	<callback>set_gain(3, $gain3)</callback>
+	<callback>set_antenna(3, $ant3)</callback>
+	<callback>set_center_freq(4, $center_freq4)</callback>
+	<callback>set_gain(4, $gain4)</callback>
+	<callback>set_antenna(4, $ant4)</callback>
+	<callback>set_center_freq(5, $center_freq5)</callback>
+	<callback>set_gain(5, $gain5)</callback>
+	<callback>set_antenna(5, $ant5)</callback>
+	<callback>set_center_freq(6, $center_freq6)</callback>
+	<callback>set_gain(6, $gain6)</callback>
+	<callback>set_antenna(6, $ant6)</callback>
+	<callback>set_center_freq(7, $center_freq7)</callback>
+	<callback>set_gain(7, $gain7)</callback>
+	<callback>set_antenna(7, $ant7)</callback>
+	<param>
+		<name>Input Type</name>
+		<key>type</key>
+		<type>enum</type>
+		<option>
+			<name>Complex</name>
+			<key>complex</key>
+			<opt>type:COMPLEX_FLOAT32</opt>
+			<opt>vlen:1</opt>
+		</option>
+		<option>
+			<name>Short</name>
+			<key>short</key>
+			<opt>type:COMPLEX_INT16</opt>
+			<opt>vlen:2</opt>
+		</option>
+	</param>
+	<param>
+		<name>Num Channels</name>
+		<key>nchan</key>
+		<value>2</value>
+		<type>int</type>
+		<option>
+			<name>2 Channels</name>
+			<key>2</key>
+		</option>
+		<option>
+			<name>3 Channels</name>
+			<key>3</key>
+		</option>
+		<option>
+			<name>4 Channels</name>
+			<key>4</key>
+		</option>
+		<option>
+			<name>5 Channels</name>
+			<key>5</key>
+		</option>
+		<option>
+			<name>6 Channels</name>
+			<key>6</key>
+		</option>
+		<option>
+			<name>7 Channels</name>
+			<key>7</key>
+		</option>
+		<option>
+			<name>8 Channels</name>
+			<key>8</key>
+		</option>
+	</param>
+	<param>
+		<name>Args</name>
+		<key>args</key>
+		<value>addr=192.168.10.2 192.168.20.2</value>
+		<type>string</type>
+	</param>
+	<param>
+		<name>Samp Rate (Sps)</name>
+		<key>samp_rate</key>
+		<value>samp_rate</value>
+		<type>real</type>
+	</param>
+	
+	<param>
+		<name>Ch0: Subdev Spec</name>
+		<key>sd_spec0</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 0
+				all
+			#elif $sd_spec0()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch0: Center Freq (Hz)</name>
+		<key>center_freq0</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch0: Gain (dB)</name>
+		<key>gain0</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch0: Antenna</name>
+		<key>ant0</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 0
+				all
+			#elif $ant0()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch1: Subdev Spec</name>
+		<key>sd_spec1</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 1
+				all
+			#elif $sd_spec1()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch1: Center Freq (Hz)</name>
+		<key>center_freq1</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch1: Gain (dB)</name>
+		<key>gain1</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch1: Antenna</name>
+		<key>ant1</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 1
+				all
+			#elif $ant1()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch2: Subdev Spec</name>
+		<key>sd_spec2</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 2
+				all
+			#elif $sd_spec2()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch2: Center Freq (Hz)</name>
+		<key>center_freq2</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch2: Gain (dB)</name>
+		<key>gain2</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch2: Antenna</name>
+		<key>ant2</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 2
+				all
+			#elif $ant2()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch3: Subdev Spec</name>
+		<key>sd_spec3</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 3
+				all
+			#elif $sd_spec3()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch3: Center Freq (Hz)</name>
+		<key>center_freq3</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch3: Gain (dB)</name>
+		<key>gain3</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch3: Antenna</name>
+		<key>ant3</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 3
+				all
+			#elif $ant3()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch4: Subdev Spec</name>
+		<key>sd_spec4</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 4
+				all
+			#elif $sd_spec4()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch4: Center Freq (Hz)</name>
+		<key>center_freq4</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch4: Gain (dB)</name>
+		<key>gain4</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch4: Antenna</name>
+		<key>ant4</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 4
+				all
+			#elif $ant4()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch5: Subdev Spec</name>
+		<key>sd_spec5</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 5
+				all
+			#elif $sd_spec5()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch5: Center Freq (Hz)</name>
+		<key>center_freq5</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch5: Gain (dB)</name>
+		<key>gain5</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch5: Antenna</name>
+		<key>ant5</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 5
+				all
+			#elif $ant5()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch6: Subdev Spec</name>
+		<key>sd_spec6</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 6
+				all
+			#elif $sd_spec6()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch6: Center Freq (Hz)</name>
+		<key>center_freq6</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch6: Gain (dB)</name>
+		<key>gain6</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch6: Antenna</name>
+		<key>ant6</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 6
+				all
+			#elif $ant6()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch7: Subdev Spec</name>
+		<key>sd_spec7</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 7
+				all
+			#elif $sd_spec7()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch7: Center Freq (Hz)</name>
+		<key>center_freq7</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch7: Gain (dB)</name>
+		<key>gain7</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch7: Antenna</name>
+		<key>ant7</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 7
+				all
+			#elif $ant7()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<check>8 >= $nchan</check>
+	<check>$nchan >= 0</check>
+	<sink>
+		<name>in</name>
+		<type>$type</type>
+		<vlen>$type.vlen</vlen>
+		<nports>$nchan</nports>
+	</sink>
+	<doc>
+The UHD Sink Block:
+
+Args:
+Args is a delimited string used to locate UHD devices on your system. \
+If left blank, the first UHD device found will be used. \
+Used args to specify a specfic device. \
+USRP2 Example: addr=192.168.10.2
+
+Sample rate:
+The sample rate is the number of samples per second input by this block. \
+The UHD device driver will try its best to match the requested sample rate. \
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Antenna:
+For subdevices/daughterboards with only one antenna, this may be left blank. \
+Otherwise, the user should specify one of the possible antenna choices. \
+See the daughterboard application notes for the possible antenna choices.
+	</doc>
+</block>
diff --git a/gr-uhd/grc/uhd_mimo_source.xml b/gr-uhd/grc/uhd_mimo_source.xml
new file mode 100644
index 0000000000..d8f4e6d667
--- /dev/null
+++ b/gr-uhd/grc/uhd_mimo_source.xml
@@ -0,0 +1,550 @@
+<?xml version="1.0"?>
+<block>
+	<name>UHD MIMO Source</name>
+	<key>uhd_mimo_source</key>
+	<category>UHD</category>
+	<import>from gnuradio import uhd</import>
+	<make>uhd.mimo_source($nchan, $args, uhd.io_type_t.$type.type)
+self.$(id).set_samp_rate_all($samp_rate)
+#if $nchan() > 0
+self.$(id).set_subdev_spec(0, $sd_spec0)
+self.$(id).set_center_freq(0, $center_freq0)
+self.$(id).set_gain(0, $gain0)
+	#if $ant0()
+self.$(id).set_antenna(0, $ant0)
+	#end if
+#end if
+#if $nchan() > 1
+self.$(id).set_subdev_spec(1, $sd_spec1)
+self.$(id).set_center_freq(1, $center_freq1)
+self.$(id).set_gain(1, $gain1)
+	#if $ant1()
+self.$(id).set_antenna(1, $ant1)
+	#end if
+#end if
+#if $nchan() > 2
+self.$(id).set_subdev_spec(2, $sd_spec2)
+self.$(id).set_center_freq(2, $center_freq2)
+self.$(id).set_gain(2, $gain2)
+	#if $ant2()
+self.$(id).set_antenna(2, $ant2)
+	#end if
+#end if
+#if $nchan() > 3
+self.$(id).set_subdev_spec(3, $sd_spec3)
+self.$(id).set_center_freq(3, $center_freq3)
+self.$(id).set_gain(3, $gain3)
+	#if $ant3()
+self.$(id).set_antenna(3, $ant3)
+	#end if
+#end if
+#if $nchan() > 4
+self.$(id).set_subdev_spec(4, $sd_spec4)
+self.$(id).set_center_freq(4, $center_freq4)
+self.$(id).set_gain(4, $gain4)
+	#if $ant4()
+self.$(id).set_antenna(4, $ant4)
+	#end if
+#end if
+#if $nchan() > 5
+self.$(id).set_subdev_spec(5, $sd_spec5)
+self.$(id).set_center_freq(5, $center_freq5)
+self.$(id).set_gain(5, $gain5)
+	#if $ant5()
+self.$(id).set_antenna(5, $ant5)
+	#end if
+#end if
+#if $nchan() > 6
+self.$(id).set_subdev_spec(6, $sd_spec6)
+self.$(id).set_center_freq(6, $center_freq6)
+self.$(id).set_gain(6, $gain6)
+	#if $ant6()
+self.$(id).set_antenna(6, $ant6)
+	#end if
+#end if
+#if $nchan() > 7
+self.$(id).set_subdev_spec(7, $sd_spec7)
+self.$(id).set_center_freq(7, $center_freq7)
+self.$(id).set_gain(7, $gain7)
+	#if $ant7()
+self.$(id).set_antenna(7, $ant7)
+	#end if
+#end if
+</make>
+	<callback>set_samp_rate($samp_rate)</callback>
+	<callback>set_center_freq(0, $center_freq0)</callback>
+	<callback>set_gain(0, $gain0)</callback>
+	<callback>set_antenna(0, $ant0)</callback>
+	<callback>set_center_freq(1, $center_freq1)</callback>
+	<callback>set_gain(1, $gain1)</callback>
+	<callback>set_antenna(1, $ant1)</callback>
+	<callback>set_center_freq(2, $center_freq2)</callback>
+	<callback>set_gain(2, $gain2)</callback>
+	<callback>set_antenna(2, $ant2)</callback>
+	<callback>set_center_freq(3, $center_freq3)</callback>
+	<callback>set_gain(3, $gain3)</callback>
+	<callback>set_antenna(3, $ant3)</callback>
+	<callback>set_center_freq(4, $center_freq4)</callback>
+	<callback>set_gain(4, $gain4)</callback>
+	<callback>set_antenna(4, $ant4)</callback>
+	<callback>set_center_freq(5, $center_freq5)</callback>
+	<callback>set_gain(5, $gain5)</callback>
+	<callback>set_antenna(5, $ant5)</callback>
+	<callback>set_center_freq(6, $center_freq6)</callback>
+	<callback>set_gain(6, $gain6)</callback>
+	<callback>set_antenna(6, $ant6)</callback>
+	<callback>set_center_freq(7, $center_freq7)</callback>
+	<callback>set_gain(7, $gain7)</callback>
+	<callback>set_antenna(7, $ant7)</callback>
+	<param>
+		<name>Input Type</name>
+		<key>type</key>
+		<type>enum</type>
+		<option>
+			<name>Complex</name>
+			<key>complex</key>
+			<opt>type:COMPLEX_FLOAT32</opt>
+			<opt>vlen:1</opt>
+		</option>
+		<option>
+			<name>Short</name>
+			<key>short</key>
+			<opt>type:COMPLEX_INT16</opt>
+			<opt>vlen:2</opt>
+		</option>
+	</param>
+	<param>
+		<name>Num Channels</name>
+		<key>nchan</key>
+		<value>2</value>
+		<type>int</type>
+		<option>
+			<name>2 Channels</name>
+			<key>2</key>
+		</option>
+		<option>
+			<name>3 Channels</name>
+			<key>3</key>
+		</option>
+		<option>
+			<name>4 Channels</name>
+			<key>4</key>
+		</option>
+		<option>
+			<name>5 Channels</name>
+			<key>5</key>
+		</option>
+		<option>
+			<name>6 Channels</name>
+			<key>6</key>
+		</option>
+		<option>
+			<name>7 Channels</name>
+			<key>7</key>
+		</option>
+		<option>
+			<name>8 Channels</name>
+			<key>8</key>
+		</option>
+	</param>
+	<param>
+		<name>Args</name>
+		<key>args</key>
+		<value>addr=192.168.10.2 192.168.20.2</value>
+		<type>string</type>
+	</param>
+	<param>
+		<name>Samp Rate (Sps)</name>
+		<key>samp_rate</key>
+		<value>samp_rate</value>
+		<type>real</type>
+	</param>
+	
+	<param>
+		<name>Ch0: Subdev Spec</name>
+		<key>sd_spec0</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 0
+				all
+			#elif $sd_spec0()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch0: Center Freq (Hz)</name>
+		<key>center_freq0</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch0: Gain (dB)</name>
+		<key>gain0</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 0 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch0: Antenna</name>
+		<key>ant0</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 0
+				all
+			#elif $ant0()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch1: Subdev Spec</name>
+		<key>sd_spec1</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 1
+				all
+			#elif $sd_spec1()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch1: Center Freq (Hz)</name>
+		<key>center_freq1</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch1: Gain (dB)</name>
+		<key>gain1</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 1 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch1: Antenna</name>
+		<key>ant1</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 1
+				all
+			#elif $ant1()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch2: Subdev Spec</name>
+		<key>sd_spec2</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 2
+				all
+			#elif $sd_spec2()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch2: Center Freq (Hz)</name>
+		<key>center_freq2</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch2: Gain (dB)</name>
+		<key>gain2</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 2 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch2: Antenna</name>
+		<key>ant2</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 2
+				all
+			#elif $ant2()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch3: Subdev Spec</name>
+		<key>sd_spec3</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 3
+				all
+			#elif $sd_spec3()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch3: Center Freq (Hz)</name>
+		<key>center_freq3</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch3: Gain (dB)</name>
+		<key>gain3</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 3 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch3: Antenna</name>
+		<key>ant3</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 3
+				all
+			#elif $ant3()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch4: Subdev Spec</name>
+		<key>sd_spec4</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 4
+				all
+			#elif $sd_spec4()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch4: Center Freq (Hz)</name>
+		<key>center_freq4</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch4: Gain (dB)</name>
+		<key>gain4</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 4 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch4: Antenna</name>
+		<key>ant4</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 4
+				all
+			#elif $ant4()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch5: Subdev Spec</name>
+		<key>sd_spec5</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 5
+				all
+			#elif $sd_spec5()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch5: Center Freq (Hz)</name>
+		<key>center_freq5</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch5: Gain (dB)</name>
+		<key>gain5</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 5 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch5: Antenna</name>
+		<key>ant5</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 5
+				all
+			#elif $ant5()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch6: Subdev Spec</name>
+		<key>sd_spec6</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 6
+				all
+			#elif $sd_spec6()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch6: Center Freq (Hz)</name>
+		<key>center_freq6</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch6: Gain (dB)</name>
+		<key>gain6</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 6 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch6: Antenna</name>
+		<key>ant6</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 6
+				all
+			#elif $ant6()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<param>
+		<name>Ch7: Subdev Spec</name>
+		<key>sd_spec7</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 7
+				all
+			#elif $sd_spec7()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+	<param>
+		<name>Ch7: Center Freq (Hz)</name>
+		<key>center_freq7</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch7: Gain (dB)</name>
+		<key>gain7</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>#if $nchan() > 7 then 'none' else 'all'#</hide>
+	</param>
+	<param>
+		<name>Ch7: Antenna</name>
+		<key>ant7</key>
+		<value></value>
+		<type>string</type>
+		<hide>
+			#if not $nchan() > 7
+				all
+			#elif $ant7()
+				none
+			#else
+				part
+			#end if
+		</hide>
+	</param>
+
+	<check>8 >= $nchan</check>
+	<check>$nchan >= 0</check>
+	<source>
+		<name>out</name>
+		<type>$type</type>
+		<vlen>$type.vlen</vlen>
+		<nports>$nchan</nports>
+	</source>
+	<doc>
+The UHD Source Block:
+
+Args:
+Args is a delimited string used to locate UHD devices on your system. \
+If left blank, the first UHD device found will be used. \
+Used args to specify a specfic device. \
+USRP2 Example: addr=192.168.10.2
+
+Sample rate:
+The sample rate is the number of samples per second input by this block. \
+The UHD device driver will try its best to match the requested sample rate. \
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Antenna:
+For subdevices/daughterboards with only one antenna, this may be left blank. \
+Otherwise, the user should specify one of the possible antenna choices. \
+See the daughterboard application notes for the possible antenna choices.
+	</doc>
+</block>
diff --git a/gr-uhd/lib/Makefile.am b/gr-uhd/lib/Makefile.am
index d9a296c754..b4b1abfc67 100644
--- a/gr-uhd/lib/Makefile.am
+++ b/gr-uhd/lib/Makefile.am
@@ -29,15 +29,18 @@ AM_CPPFLAGS = \
 lib_LTLIBRARIES = libgnuradio-uhd.la
 
 libgnuradio_uhd_la_SOURCES = \
-	uhd_mimo_source.cc \
-	uhd_mimo_sink.cc \
 	uhd_multi_usrp_source.cc \
 	uhd_multi_usrp_sink.cc \
-	uhd_simple_source.cc \
-	uhd_simple_sink.cc \
 	uhd_single_usrp_source.cc \
 	uhd_single_usrp_sink.cc
 
+# add the deprecated sources
+libgnuradio_uhd_la_SOURCES += \
+	uhd_mimo_source.cc \
+	uhd_mimo_sink.cc \
+	uhd_simple_source.cc \
+	uhd_simple_sink.cc
+
 libgnuradio_uhd_la_LIBADD = \
 	$(GNURADIO_CORE_LA) \
 	$(UHD_LIBS)
-- 
cgit v1.2.3


From 1e5db4248e2488e0f1b44ac1405d78e16c2408d8 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 16:13:10 -0700
Subject: uhd: work on multi usrp blocks, use block tree to categorize blocks,
 deprecate mimo blocks

---
 gr-uhd/grc/Makefile.am                       |   1 +
 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py  | 101 +++++++++++++++++++--------
 gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py |   3 +-
 gr-uhd/grc/uhd_block_tree.xml                |  23 ++++++
 gr-uhd/grc/uhd_mimo_sink.xml                 |   3 +-
 gr-uhd/grc/uhd_mimo_source.xml               |   3 +-
 gr-uhd/grc/uhd_simple_sink.xml               |   1 -
 gr-uhd/grc/uhd_simple_source.xml             |   1 -
 8 files changed, 99 insertions(+), 37 deletions(-)
 create mode 100644 gr-uhd/grc/uhd_block_tree.xml

diff --git a/gr-uhd/grc/Makefile.am b/gr-uhd/grc/Makefile.am
index 04b7dca365..d424ca7096 100644
--- a/gr-uhd/grc/Makefile.am
+++ b/gr-uhd/grc/Makefile.am
@@ -36,6 +36,7 @@ BUILT_SOURCES = \
 	$(generated_uhd_single_usrp_blocks)
 
 dist_grcblocks_DATA = \
+	uhd_block_tree.xml \
 	$(BUILT_SOURCES)
 
 # add the deprecated files
diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
index a4da53a188..8de4408d5a 100755
--- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
@@ -24,10 +24,16 @@ MAIN_TMPL = """\
 <block>
 	<name>UHD: Multi USRP $sourk.title()</name>
 	<key>uhd_multi_usrp_$(sourk)</key>
-	<category>UHD</category>
 	<import>from gnuradio import uhd</import>
 	<make>uhd.multi_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan)
-self.\$(id).set_subdev_spec(\$sd_spec)
+\#if \$sync()
+self.\$(id).set_time_unknown_pps(uhd.time_spec_t())
+\#end if
+#for $m in range($max_mboards)
+\#if \$num_mboards() > $m
+self.\$(id).set_subdev_spec(\$sd_spec$(m), $m)
+\#end if
+#end for
 self.\$(id).set_samp_rate(\$samp_rate)
 #for $n in range($max_nchan)
 \#if \$nchan() > $n
@@ -62,25 +68,6 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 			<opt>vlen:2</opt>
 		</option>
 	</param>
-	<param>
-		<name>Num Channels</name>
-		<key>nchan</key>
-		<value>1</value>
-		<type>int</type>
-		<hide>part</hide>
-		<option>
-			<name>Multi Channel</name>
-			<key>1</key>
-		</option>
-		<option>
-			<name>Dual Channel</name>
-			<key>2</key>
-		</option>
-		<option>
-			<name>Quad Channel</name>
-			<key>4</key>
-		</option>
-	</param>
 	<param>
 		<name>Device Addr</name>
 		<key>dev_addr</key>
@@ -95,18 +82,61 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 		</hide>
 	</param>
 	<param>
-		<name>Subdev Spec</name>
-		<key>sd_spec</key>
+		<name>Sync</name>
+		<key>sync</key>
+		<value>sync</value>
+		<type>enum</type>
+		<hide>\#if \$sync() then 'none' else 'part'#</hide>
+		<option>
+			<name>unknown PPS</name>
+			<key>sync</key>
+		</option>
+		<option>
+			<name>don't sync</name>
+			<key></key>
+		</option>
+	</param>
+	<param>
+		<name>Num Mboards</name>
+		<key>num_mboards</key>
+		<value>2</value>
+		<type>int</type>
+		#for $m in range(1, $max_mboards)
+		<option>
+			<name>$(m)</name>
+			<key>$m</key>
+		</option>
+		#end for
+	</param>
+	#for $m in range($max_mboards)
+	<param>
+		<name>Mb$(m): Subdev Spec</name>
+		<key>sd_spec$(m)</key>
 		<value></value>
 		<type>string</type>
 		<hide>
-			\#if \$sd_spec()
+			\#if not \$num_mboards() > $m
+				all
+			\#elif \$sd_spec$(m)()
 				none
 			\#else
 				part
 			\#end if
 		</hide>
 	</param>
+	#end for
+	<param>
+		<name>Num Channels</name>
+		<key>nchan</key>
+		<value>2</value>
+		<type>int</type>
+		#for $n in range(1, $max_nchan)
+		<option>
+			<name>$(n)</name>
+			<key>$n</key>
+		</option>
+		#end for
+	</param>
 	<param>
 		<name>Samp Rate (Sps)</name>
 		<key>samp_rate</key>
@@ -115,8 +145,10 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 	</param>
 	$params
 	<check>$max_nchan >= \$nchan</check>
-	<check>\$nchan >= 0</check>
-	<check>(len((\$sd_spec).split()) or 1) == \$nchan</check>
+	<check>\$nchan > 0</check>
+	<check>$max_mboards >= \$num_mboards</check>
+	<check>\$num_mboards > 0</check>
+	<check>\$nchan >= \$num_mboards</check>
 	<$sourk>
 		<name>$direction</name>
 		<type>\$type</type>
@@ -132,18 +164,27 @@ If left blank, the first UHD device found will be used. \\
 Used args to specify a specfic device.
 USRP2 Example: addr=192.168.10.2 192.168.10.3
 
+Num Motherboards:
+Selects the number of USRP motherboards in this multi-USRP configuration.
+
+Num Channels:
+Selects the total number of channels in this multi-USRP configuration.
+Ex: 4 motherboards with 2 channels per board = 8 channels total
+
 Sample rate:
 The sample rate is the number of samples per second input by this block. \\
 The UHD device driver will try its best to match the requested sample rate. \\
 If the requested rate is not possible, the UHD block will print an error at runtime.
 
 Subdevice specification:
+Each motherboard should have its own subdevice specification \\
+and all subdevice specifications should be the same length. \\
 Select the subdevice or subdevices for each channel using a markup string. \\
 The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\
 If left blank, the UHD will try to select the first subdevice on your system. \\
 See the application notes for further details.
-Single channel example: A:AB
-Dual channel example: A:AB B:0
+Single channel example: :AB
+Dual channel example: :A :B
 
 Antenna:
 For subdevices/daughterboards with only one antenna, this may be left blank. \\
@@ -189,7 +230,8 @@ def parse_tmpl(_tmpl, **kwargs):
 	from Cheetah import Template
 	return str(Template.Template(_tmpl, kwargs))
 
-max_num_channels = 4
+max_num_mboards = 4
+max_num_channels = max_num_mboards*4
 
 if __name__ == '__main__':
 	import sys
@@ -205,6 +247,7 @@ if __name__ == '__main__':
 		params = ''.join([parse_tmpl(PARAMS_TMPL, n=n) for n in range(max_num_channels)])
 		open(file, 'w').write(parse_tmpl(MAIN_TMPL,
 			max_nchan=max_num_channels,
+			max_mboards=max_num_mboards,
 			params=params,
 			sourk=sourk,
 			direction=direction,
diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index 5b3cb5b5aa..5b87719e5e 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -24,7 +24,6 @@ MAIN_TMPL = """\
 <block>
 	<name>UHD: Single USRP $sourk.title()</name>
 	<key>uhd_single_usrp_$(sourk)</key>
-	<category>UHD</category>
 	<import>from gnuradio import uhd</import>
 	<make>uhd.single_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan)
 self.\$(id).set_subdev_spec(\$sd_spec)
@@ -115,7 +114,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 	</param>
 	$params
 	<check>$max_nchan >= \$nchan</check>
-	<check>\$nchan >= 0</check>
+	<check>\$nchan > 0</check>
 	<check>(len((\$sd_spec).split()) or 1) == \$nchan</check>
 	<$sourk>
 		<name>$direction</name>
diff --git a/gr-uhd/grc/uhd_block_tree.xml b/gr-uhd/grc/uhd_block_tree.xml
new file mode 100644
index 0000000000..e8c4f069d9
--- /dev/null
+++ b/gr-uhd/grc/uhd_block_tree.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##Block Tree for uhd blocks.
+###################################################
+ -->
+<cat>
+	<name></name> <!-- Blank for Root Name -->
+	<cat>
+		<name>UHD</name>
+		<block>uhd_single_usrp_source</block>
+		<block>uhd_single_usrp_sink</block>
+		<block>uhd_multi_usrp_source</block>
+		<block>uhd_multi_usrp_sink</block>
+	</cat>
+	<cat>
+		<name>UHD (DEPRECATED)</name>
+		<block>uhd_simple_source</block>
+		<block>uhd_simple_sink</block>
+		<block>uhd_mimo_source</block>
+		<block>uhd_mimo_sink</block>
+	</cat>
+</cat>
diff --git a/gr-uhd/grc/uhd_mimo_sink.xml b/gr-uhd/grc/uhd_mimo_sink.xml
index 2f5f2011f1..13865c913a 100644
--- a/gr-uhd/grc/uhd_mimo_sink.xml
+++ b/gr-uhd/grc/uhd_mimo_sink.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0"?>
 <block>
-	<name>UHD MIMO Sink</name>
+	<name>UHD MIMO Sink (DEPRECATED)</name>
 	<key>uhd_mimo_sink</key>
-	<category>UHD</category>
 	<import>from gnuradio import uhd</import>
 	<make>uhd.mimo_sink($nchan, $args, uhd.io_type_t.$type.type)
 self.$(id).set_samp_rate_all($samp_rate)
diff --git a/gr-uhd/grc/uhd_mimo_source.xml b/gr-uhd/grc/uhd_mimo_source.xml
index d8f4e6d667..6167838b0b 100644
--- a/gr-uhd/grc/uhd_mimo_source.xml
+++ b/gr-uhd/grc/uhd_mimo_source.xml
@@ -1,8 +1,7 @@
 <?xml version="1.0"?>
 <block>
-	<name>UHD MIMO Source</name>
+	<name>UHD MIMO Source (DEPRECATED)</name>
 	<key>uhd_mimo_source</key>
-	<category>UHD</category>
 	<import>from gnuradio import uhd</import>
 	<make>uhd.mimo_source($nchan, $args, uhd.io_type_t.$type.type)
 self.$(id).set_samp_rate_all($samp_rate)
diff --git a/gr-uhd/grc/uhd_simple_sink.xml b/gr-uhd/grc/uhd_simple_sink.xml
index 66dc5bf145..ee6051432a 100644
--- a/gr-uhd/grc/uhd_simple_sink.xml
+++ b/gr-uhd/grc/uhd_simple_sink.xml
@@ -7,7 +7,6 @@
 <block>
 	<name>UHD Simple Sink (DEPRECATED)</name>
 	<key>uhd_simple_sink</key>
-	<category>UHD</category>
 	<import>from gnuradio import uhd</import>
 	<make>uhd.simple_sink($args, uhd.io_type_t.$type.type)
 self.$(id).set_subdev_spec($sd_spec)
diff --git a/gr-uhd/grc/uhd_simple_source.xml b/gr-uhd/grc/uhd_simple_source.xml
index 00c60f41d9..825981d66f 100644
--- a/gr-uhd/grc/uhd_simple_source.xml
+++ b/gr-uhd/grc/uhd_simple_source.xml
@@ -7,7 +7,6 @@
 <block>
 	<name>UHD Simple Source (DEPRECATED)</name>
 	<key>uhd_simple_source</key>
-	<category>UHD</category>
 	<import>from gnuradio import uhd</import>
 	<make>uhd.simple_source($args, uhd.io_type_t.$type.type)
 self.$(id).set_subdev_spec($sd_spec)
-- 
cgit v1.2.3


From 7f46efca9cb0c87e9130c117ac41650f6e0c25cc Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 16:49:08 -0700
Subject: uhd: renamed make function params, cleanup, clock config for multi
 usrp

---
 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py  | 11 ++++++++++-
 gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py |  6 +++++-
 gr-uhd/lib/uhd_multi_usrp_sink.cc            | 19 ++++++++++++-------
 gr-uhd/lib/uhd_multi_usrp_sink.h             |  4 ++--
 gr-uhd/lib/uhd_multi_usrp_source.cc          | 18 +++++++++++-------
 gr-uhd/lib/uhd_multi_usrp_source.h           |  4 ++--
 gr-uhd/lib/uhd_single_usrp_sink.cc           | 19 ++++++++++++-------
 gr-uhd/lib/uhd_single_usrp_sink.h            |  4 ++--
 gr-uhd/lib/uhd_single_usrp_source.cc         | 18 +++++++++++-------
 gr-uhd/lib/uhd_single_usrp_source.h          |  4 ++--
 10 files changed, 69 insertions(+), 38 deletions(-)

diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
index 8de4408d5a..aa550157d2 100755
--- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
@@ -25,8 +25,17 @@ MAIN_TMPL = """\
 	<name>UHD: Multi USRP $sourk.title()</name>
 	<key>uhd_multi_usrp_$(sourk)</key>
 	<import>from gnuradio import uhd</import>
-	<make>uhd.multi_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan)
+	<make>uhd.multi_usrp_$(sourk)(
+	device_addr=\$dev_addr,
+	io_type=uhd.io_type_t.\$type.type,
+	num_channels=\$nchan,
+)
 \#if \$sync()
+clk_cfg = uhd.clock_config_t()
+clk_cfg.ref_source = uhd.clock_config_t.REF_SMA
+clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA
+clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS
+self.\$(id).set_clock_config(clk_cfg, ~0);
 self.\$(id).set_time_unknown_pps(uhd.time_spec_t())
 \#end if
 #for $m in range($max_mboards)
diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index 5b87719e5e..4d645afe15 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -25,7 +25,11 @@ MAIN_TMPL = """\
 	<name>UHD: Single USRP $sourk.title()</name>
 	<key>uhd_single_usrp_$(sourk)</key>
 	<import>from gnuradio import uhd</import>
-	<make>uhd.single_usrp_$(sourk)(\$dev_addr, uhd.io_type_t.\$type.type, \$nchan)
+	<make>uhd.single_usrp_$(sourk)(
+	device_addr=\$dev_addr,
+	io_type=uhd.io_type_t.\$type.type,
+	num_channels\$nchan,
+)
 self.\$(id).set_subdev_spec(\$sd_spec)
 self.\$(id).set_samp_rate(\$samp_rate)
 #for $n in range($max_nchan)
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc
index 202f128406..31dbac44f4 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc
@@ -37,12 +37,17 @@ uhd_multi_usrp_sink::uhd_multi_usrp_sink(gr_io_signature_sptr sig)
 class uhd_multi_usrp_sink_impl : public uhd_multi_usrp_sink{
 public:
     uhd_multi_usrp_sink_impl(
-        const std::string &args,
-        const uhd::io_type_t &type,
+        const std::string &device_addr,
+        const uhd::io_type_t &io_type,
         size_t num_channels
-    ) : uhd_multi_usrp_sink(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type), _nchan(num_channels)
+    ):
+        uhd_multi_usrp_sink(gr_make_io_signature(
+            num_channels, num_channels, io_type.size
+        )),
+        _type(io_type),
+        _nchan(num_channels)
     {
-        _dev = uhd::usrp::multi_usrp::make(args);
+        _dev = uhd::usrp::multi_usrp::make(device_addr);
     }
 
     void set_subdev_spec(const std::string &spec, size_t mboard){
@@ -165,11 +170,11 @@ protected:
  * Make UHD Multi USRP Sink
  **********************************************************************/
 boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels
 ){
     return boost::shared_ptr<uhd_multi_usrp_sink>(
-        new uhd_multi_usrp_sink_impl(args, type, num_channels)
+        new uhd_multi_usrp_sink_impl(device_addr, io_type, num_channels)
     );
 }
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h
index 13bba20fb6..5dacc1fac7 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.h
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.h
@@ -28,8 +28,8 @@
 class uhd_multi_usrp_sink;
 
 boost::shared_ptr<uhd_multi_usrp_sink> uhd_make_multi_usrp_sink(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels
 );
 
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
index c10c08c500..1fcb576501 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -39,12 +39,16 @@ uhd_multi_usrp_source::uhd_multi_usrp_source(gr_io_signature_sptr sig)
 class uhd_multi_usrp_source_impl : public uhd_multi_usrp_source{
 public:
     uhd_multi_usrp_source_impl(
-        const std::string &args,
-        const uhd::io_type_t &type,
+        const std::string &device_addr,
+        const uhd::io_type_t &io_type,
         size_t num_channels
-    ) : uhd_multi_usrp_source(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type)
+    ):
+        uhd_multi_usrp_source(gr_make_io_signature(
+            num_channels, num_channels, io_type.size
+        )),
+        _type(io_type)
     {
-        _dev = uhd::usrp::multi_usrp::make(args);
+        _dev = uhd::usrp::multi_usrp::make(device_addr);
     }
 
     void set_subdev_spec(const std::string &spec, size_t mboard){
@@ -168,11 +172,11 @@ private:
  * Make UHD Multi USRP Source
  **********************************************************************/
 boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels
 ){
     return boost::shared_ptr<uhd_multi_usrp_source>(
-        new uhd_multi_usrp_source_impl(args, type, num_channels)
+        new uhd_multi_usrp_source_impl(device_addr, io_type, num_channels)
     );
 }
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h
index b94e53f01b..36c4b6fdcc 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.h
+++ b/gr-uhd/lib/uhd_multi_usrp_source.h
@@ -28,8 +28,8 @@
 class uhd_multi_usrp_source;
 
 boost::shared_ptr<uhd_multi_usrp_source> uhd_make_multi_usrp_source(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels
 );
 
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc
index 96c1dbdf49..4297a83ffa 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_single_usrp_sink.cc
@@ -37,12 +37,17 @@ uhd_single_usrp_sink::uhd_single_usrp_sink(gr_io_signature_sptr sig)
 class uhd_single_usrp_sink_impl : public uhd_single_usrp_sink{
 public:
     uhd_single_usrp_sink_impl(
-        const std::string &args,
-        const uhd::io_type_t &type,
+        const std::string &device_addr,
+        const uhd::io_type_t &io_type,
         size_t num_channels
-    ) : uhd_single_usrp_sink(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type), _nchan(num_channels)
+    ):
+        uhd_single_usrp_sink(gr_make_io_signature(
+            num_channels, num_channels, io_type.size
+        )),
+        _type(io_type),
+        _nchan(num_channels)
     {
-        _dev = uhd::usrp::single_usrp::make(args);
+        _dev = uhd::usrp::single_usrp::make(device_addr);
     }
 
     void set_subdev_spec(const std::string &spec){
@@ -163,11 +168,11 @@ protected:
  * Make UHD Single USRP Sink
  **********************************************************************/
 boost::shared_ptr<uhd_single_usrp_sink> uhd_make_single_usrp_sink(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels
 ){
     return boost::shared_ptr<uhd_single_usrp_sink>(
-        new uhd_single_usrp_sink_impl(args, type, num_channels)
+        new uhd_single_usrp_sink_impl(device_addr, io_type, num_channels)
     );
 }
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.h b/gr-uhd/lib/uhd_single_usrp_sink.h
index bec788193b..e83bb6ded8 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.h
+++ b/gr-uhd/lib/uhd_single_usrp_sink.h
@@ -28,8 +28,8 @@
 class uhd_single_usrp_sink;
 
 boost::shared_ptr<uhd_single_usrp_sink> uhd_make_single_usrp_sink(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels = 1
 );
 
diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc
index 7c3694a99d..27a788d960 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.cc
+++ b/gr-uhd/lib/uhd_single_usrp_source.cc
@@ -39,12 +39,16 @@ uhd_single_usrp_source::uhd_single_usrp_source(gr_io_signature_sptr sig)
 class uhd_single_usrp_source_impl : public uhd_single_usrp_source{
 public:
     uhd_single_usrp_source_impl(
-        const std::string &args,
-        const uhd::io_type_t &type,
+        const std::string &device_addr,
+        const uhd::io_type_t &io_type,
         size_t num_channels
-    ) : uhd_single_usrp_source(gr_make_io_signature(num_channels, num_channels, type.size)), _type(type)
+    ):
+        uhd_single_usrp_source(gr_make_io_signature(
+            num_channels, num_channels, io_type.size
+        )),
+        _type(io_type)
     {
-        _dev = uhd::usrp::single_usrp::make(args);
+        _dev = uhd::usrp::single_usrp::make(device_addr);
     }
 
     void set_subdev_spec(const std::string &spec){
@@ -163,11 +167,11 @@ private:
  * Make UHD Single USRP Source
  **********************************************************************/
 boost::shared_ptr<uhd_single_usrp_source> uhd_make_single_usrp_source(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels
 ){
     return boost::shared_ptr<uhd_single_usrp_source>(
-        new uhd_single_usrp_source_impl(args, type, num_channels)
+        new uhd_single_usrp_source_impl(device_addr, io_type, num_channels)
     );
 }
diff --git a/gr-uhd/lib/uhd_single_usrp_source.h b/gr-uhd/lib/uhd_single_usrp_source.h
index 196b7c6759..c323fbd7ed 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.h
+++ b/gr-uhd/lib/uhd_single_usrp_source.h
@@ -28,8 +28,8 @@
 class uhd_single_usrp_source;
 
 boost::shared_ptr<uhd_single_usrp_source> uhd_make_single_usrp_source(
-    const std::string &args,
-    const uhd::io_type_t::tid_t &type,
+    const std::string &device_addr,
+    const uhd::io_type_t::tid_t &io_type,
     size_t num_channels = 1
 );
 
-- 
cgit v1.2.3


From 8c6445cb3dd2a8db361203fedf55f3efb6953635 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 17:31:48 -0700
Subject: uhd: typo fix for single usrp grc file generator

---
 gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index 4d645afe15..7bc2425ee8 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -28,7 +28,7 @@ MAIN_TMPL = """\
 	<make>uhd.single_usrp_$(sourk)(
 	device_addr=\$dev_addr,
 	io_type=uhd.io_type_t.\$type.type,
-	num_channels\$nchan,
+	num_channels=\$nchan,
 )
 self.\$(id).set_subdev_spec(\$sd_spec)
 self.\$(id).set_samp_rate(\$samp_rate)
-- 
cgit v1.2.3


From 343cba5663d0eefdd3ee3918bef812dc1bd75508 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 18 Oct 2010 18:29:20 -0700
Subject: uhd: tweaked and tested multi usrp with a single channel

---
 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py  | 16 ++++++++--------
 gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py |  2 ++
 gr-uhd/lib/uhd_multi_usrp_source.cc          |  4 ++--
 gr-uhd/swig/uhd_swig.i                       | 20 ++++++++++++++++++++
 4 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
index aa550157d2..2297167320 100755
--- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
@@ -31,15 +31,15 @@ MAIN_TMPL = """\
 	num_channels=\$nchan,
 )
 \#if \$sync()
-clk_cfg = uhd.clock_config_t()
-clk_cfg.ref_source = uhd.clock_config_t.REF_SMA
-clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA
-clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS
-self.\$(id).set_clock_config(clk_cfg, ~0);
+_clk_cfg = uhd.clock_config_t()
+_clk_cfg.ref_source = uhd.clock_config_t.REF_SMA
+_clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA
+_clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS
+self.\$(id).set_clock_config(_clk_cfg, uhd.ALL_MBOARDS);
 self.\$(id).set_time_unknown_pps(uhd.time_spec_t())
 \#end if
 #for $m in range($max_mboards)
-\#if \$num_mboards() > $m
+\#if \$num_mboards() > $m and \$sd_spec$(m)()
 self.\$(id).set_subdev_spec(\$sd_spec$(m), $m)
 \#end if
 #end for
@@ -110,7 +110,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 		<key>num_mboards</key>
 		<value>2</value>
 		<type>int</type>
-		#for $m in range(1, $max_mboards)
+		#for $m in range(1, $max_mboards+1)
 		<option>
 			<name>$(m)</name>
 			<key>$m</key>
@@ -139,7 +139,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 		<key>nchan</key>
 		<value>2</value>
 		<type>int</type>
-		#for $n in range(1, $max_nchan)
+		#for $n in range(1, $max_nchan+1)
 		<option>
 			<name>$(n)</name>
 			<key>$n</key>
diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index 7bc2425ee8..02cdf64cc2 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -30,7 +30,9 @@ MAIN_TMPL = """\
 	io_type=uhd.io_type_t.\$type.type,
 	num_channels=\$nchan,
 )
+\#if \$sd_spec()
 self.\$(id).set_subdev_spec(\$sd_spec)
+\#end if
 self.\$(id).set_samp_rate(\$samp_rate)
 #for $n in range($max_nchan)
 \#if \$nchan() > $n
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
index 1fcb576501..0ac686c795 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -149,10 +149,10 @@ public:
 
     bool start(void){
         //setup a stream command that starts streaming slightly in the future
-        static const double reasonable_delay = 0.01; //10 ms (order of magnitude >> RTT)
+        static const double reasonable_delay = 0.05; //order of magnitude over RTT
         uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
         stream_cmd.stream_now = false;
-        stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(_dev->get_num_mboards() * reasonable_delay);
+        stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(reasonable_delay);
         _dev->issue_stream_cmd(stream_cmd);
         return true;
     }
diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i
index 1631a768a7..6f29f706d7 100644
--- a/gr-uhd/swig/uhd_swig.i
+++ b/gr-uhd/swig/uhd_swig.i
@@ -20,6 +20,9 @@
  * Boston, MA 02110-1301, USA.
  */
 
+////////////////////////////////////////////////////////////////////////
+// standard includes
+////////////////////////////////////////////////////////////////////////
 %include "gnuradio.i"
 %include "std_string.i"
 %include "std_vector.i"
@@ -28,6 +31,9 @@ namespace std {
     %template(StringVector) vector<string>;
 }
 
+////////////////////////////////////////////////////////////////////////
+// block headers
+////////////////////////////////////////////////////////////////////////
 %{
 #include <uhd_mimo_source.h> //deprecated
 #include <uhd_mimo_sink.h> //deprecated
@@ -40,6 +46,9 @@ namespace std {
 #include <uhd_single_usrp_sink.h>
 %}
 
+////////////////////////////////////////////////////////////////////////
+// used types
+////////////////////////////////////////////////////////////////////////
 %include <uhd/config.hpp>
 %include <uhd/types/ranges.hpp>
 %include <uhd/types/tune_result.hpp>
@@ -47,6 +56,9 @@ namespace std {
 %include <uhd/types/time_spec.hpp>
 %include <uhd/types/clock_config.hpp>
 
+////////////////////////////////////////////////////////////////////////
+// block magic
+////////////////////////////////////////////////////////////////////////
 GR_SWIG_BLOCK_MAGIC(uhd,mimo_source) //deprecated
 %include <uhd_mimo_source.h> //deprecated
 
@@ -70,3 +82,11 @@ GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_source)
 
 GR_SWIG_BLOCK_MAGIC(uhd,single_usrp_sink)
 %include <uhd_single_usrp_sink.h>
+
+////////////////////////////////////////////////////////////////////////
+// helpful constants
+////////////////////////////////////////////////////////////////////////
+%{
+static const size_t ALL_MBOARDS = uhd::usrp::multi_usrp::ALL_MBOARDS;
+%}
+static const size_t ALL_MBOARDS;
-- 
cgit v1.2.3


From f8c63c369e0e8800f76d427434424f7209fcde86 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Tue, 19 Oct 2010 13:04:42 -0700
Subject: uhd: tweaking timeouts for multi usrp blocks

---
 gr-uhd/lib/uhd_multi_usrp_sink.cc   | 11 +++++++----
 gr-uhd/lib/uhd_multi_usrp_source.cc |  4 ++--
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc
index 31dbac44f4..17cd1ad78e 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc
@@ -128,7 +128,7 @@ public:
 
         return _dev->get_device()->send(
             input_items, noutput_items, metadata,
-            _type, uhd::device::SEND_MODE_FULL_BUFF
+            _type, uhd::device::SEND_MODE_FULL_BUFF, 1.0
         );
     }
 
@@ -138,11 +138,14 @@ public:
         uhd::tx_metadata_t metadata;
         metadata.start_of_burst = true;
         metadata.has_time_spec = true;
-        metadata.time_spec = get_time_now() + uhd::time_spec_t(0.01); //10ms offset in future
+        //TODO: Time in the near future, must be less than source time in future
+        //because ethernet pause frames with throttle stream commands.
+        //It will be fixed with the invention of host-based flow control.
+        metadata.time_spec = get_time_now() + uhd::time_spec_t(0.05);
 
         _dev->get_device()->send(
             gr_vector_const_void_star(_nchan), 0, metadata,
-            _type, uhd::device::SEND_MODE_ONE_PACKET
+            _type, uhd::device::SEND_MODE_ONE_PACKET, 1.0
         );
         return true;
     }
@@ -155,7 +158,7 @@ public:
 
         _dev->get_device()->send(
             gr_vector_const_void_star(_nchan), 0, metadata,
-            _type, uhd::device::SEND_MODE_ONE_PACKET
+            _type, uhd::device::SEND_MODE_ONE_PACKET, 1.0
         );
         return true;
     }
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
index 0ac686c795..63dad1a25e 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -128,7 +128,7 @@ public:
 
         size_t num_samps = _dev->get_device()->recv(
             output_items, noutput_items, metadata,
-            _type, uhd::device::RECV_MODE_FULL_BUFF
+            _type, uhd::device::RECV_MODE_FULL_BUFF, 1.0
         );
 
         switch(metadata.error_code){
@@ -149,7 +149,7 @@ public:
 
     bool start(void){
         //setup a stream command that starts streaming slightly in the future
-        static const double reasonable_delay = 0.05; //order of magnitude over RTT
+        static const double reasonable_delay = 0.1; //order of magnitude over RTT
         uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
         stream_cmd.stream_now = false;
         stream_cmd.time_spec = get_time_now() + uhd::time_spec_t(reasonable_delay);
-- 
cgit v1.2.3


From c6e4a54769e2d5be3cfd28df6697c54c4a4a7e90 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Tue, 19 Oct 2010 15:03:08 -0700
Subject: uhd: mark simple and mimo classes with the deprecated flag

---
 gr-uhd/lib/uhd_mimo_sink.h     | 2 +-
 gr-uhd/lib/uhd_mimo_source.h   | 2 +-
 gr-uhd/lib/uhd_simple_sink.h   | 2 +-
 gr-uhd/lib/uhd_simple_source.h | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/gr-uhd/lib/uhd_mimo_sink.h b/gr-uhd/lib/uhd_mimo_sink.h
index a0a30381c3..28a530b603 100644
--- a/gr-uhd/lib/uhd_mimo_sink.h
+++ b/gr-uhd/lib/uhd_mimo_sink.h
@@ -37,7 +37,7 @@ boost::shared_ptr<uhd_mimo_sink> uhd_make_mimo_sink(
 /***********************************************************************
  * DEPRECATED
  **********************************************************************/
-class uhd_mimo_sink : public gr_sync_block{
+class UHD_DEPRECATED uhd_mimo_sink : public gr_sync_block{
 public:
 
     /*!
diff --git a/gr-uhd/lib/uhd_mimo_source.h b/gr-uhd/lib/uhd_mimo_source.h
index f6f18eedcf..dc29275985 100644
--- a/gr-uhd/lib/uhd_mimo_source.h
+++ b/gr-uhd/lib/uhd_mimo_source.h
@@ -37,7 +37,7 @@ boost::shared_ptr<uhd_mimo_source> uhd_make_mimo_source(
 /***********************************************************************
  * DEPRECATED
  **********************************************************************/
-class uhd_mimo_source : public gr_sync_block{
+class UHD_DEPRECATED uhd_mimo_source : public gr_sync_block{
 public:
 
     /*!
diff --git a/gr-uhd/lib/uhd_simple_sink.h b/gr-uhd/lib/uhd_simple_sink.h
index 44b868698c..b239e3f212 100644
--- a/gr-uhd/lib/uhd_simple_sink.h
+++ b/gr-uhd/lib/uhd_simple_sink.h
@@ -36,7 +36,7 @@ boost::shared_ptr<uhd_simple_sink> uhd_make_simple_sink(
 /***********************************************************************
  * DEPRECATED
  **********************************************************************/
-class uhd_simple_sink : public gr_sync_block{
+class UHD_DEPRECATED uhd_simple_sink : public gr_sync_block{
 public:
 
     /*!
diff --git a/gr-uhd/lib/uhd_simple_source.h b/gr-uhd/lib/uhd_simple_source.h
index 4e79afa21e..c524a024a8 100644
--- a/gr-uhd/lib/uhd_simple_source.h
+++ b/gr-uhd/lib/uhd_simple_source.h
@@ -36,7 +36,7 @@ boost::shared_ptr<uhd_simple_source> uhd_make_simple_source(
 /***********************************************************************
  * DEPRECATED
  **********************************************************************/
-class uhd_simple_source : public gr_sync_block{
+class UHD_DEPRECATED uhd_simple_source : public gr_sync_block{
 public:
 
     /*!
-- 
cgit v1.2.3


From f13e1e1a87cf3d8b891e94226be047cff3733bb7 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Tue, 19 Oct 2010 15:46:27 -0700
Subject: uhd: implement set bandwidth for uhd blocks, remove chan=0 default
 for multi blocks

---
 gr-uhd/lib/uhd_multi_usrp_sink.cc    |  4 ++++
 gr-uhd/lib/uhd_multi_usrp_sink.h     | 22 ++++++++++++++--------
 gr-uhd/lib/uhd_multi_usrp_source.cc  |  4 ++++
 gr-uhd/lib/uhd_multi_usrp_source.h   | 22 ++++++++++++++--------
 gr-uhd/lib/uhd_single_usrp_sink.cc   |  4 ++++
 gr-uhd/lib/uhd_single_usrp_sink.h    |  6 ++++++
 gr-uhd/lib/uhd_single_usrp_source.cc |  4 ++++
 gr-uhd/lib/uhd_single_usrp_source.h  |  6 ++++++
 8 files changed, 56 insertions(+), 16 deletions(-)

diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc
index 17cd1ad78e..b75a8303cb 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc
@@ -95,6 +95,10 @@ public:
         return _dev->get_tx_antennas(chan);
     }
 
+    void set_bandwidth(double bandwidth, size_t chan){
+        return _dev->set_tx_bandwidth(bandwidth, chan);
+    }
+
     void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){
         return _dev->set_clock_config(clock_config, mboard);
     }
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h
index 5dacc1fac7..0ccc0fe6c5 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.h
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.h
@@ -66,49 +66,55 @@ public:
      * \param freq the desired frequency in Hz
      * \return a tune result with the actual frequencies
      */
-    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan) = 0;
 
     /*!
      * Get the tunable frequency range.
      * \return the frequency range in Hz
      */
-    virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
+    virtual uhd::freq_range_t get_freq_range(size_t chan) = 0;
 
     /*!
      * Set the gain for the dboard.
      * \param gain the gain in dB
      */
-    virtual void set_gain(float gain, size_t chan = 0) = 0;
+    virtual void set_gain(float gain, size_t chan) = 0;
 
     /*!
      * Get the actual dboard gain setting.
      * \return the actual gain in dB
      */
-    virtual float get_gain(size_t chan = 0) = 0;
+    virtual float get_gain(size_t chan) = 0;
 
     /*!
      * Get the settable gain range.
      * \return the gain range in dB
      */
-    virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
+    virtual uhd::gain_range_t get_gain_range(size_t chan) = 0;
 
     /*!
      * Set the antenna to use.
      * \param ant the antenna string
      */
-    virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
+    virtual void set_antenna(const std::string &ant, size_t chan) = 0;
 
     /*!
      * Get the antenna in use.
      * \return the antenna string
      */
-    virtual std::string get_antenna(size_t chan = 0) = 0;
+    virtual std::string get_antenna(size_t chan) = 0;
 
     /*!
      * Get a list of possible antennas.
      * \return a vector of antenna strings
      */
-    virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
+    virtual std::vector<std::string> get_antennas(size_t chan) = 0;
+
+    /*!
+     * Set the subdevice bandpass filter.
+     * \param bandwidth the filter bandwidth in Hz
+     */
+    virtual void set_bandwidth(double bandwidth, size_t chan) = 0;
 
     /*!
      * Set the clock configuration.
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
index 63dad1a25e..226e8b86fb 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -96,6 +96,10 @@ public:
         return _dev->get_rx_antennas(chan);
     }
 
+    void set_bandwidth(double bandwidth, size_t chan){
+        return _dev->set_rx_bandwidth(bandwidth, chan);
+    }
+
     void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard){
         return _dev->set_clock_config(clock_config, mboard);
     }
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h
index 36c4b6fdcc..483ce098cf 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.h
+++ b/gr-uhd/lib/uhd_multi_usrp_source.h
@@ -66,49 +66,55 @@ public:
      * \param freq the desired frequency in Hz
      * \return a tune result with the actual frequencies
      */
-    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan) = 0;
 
     /*!
      * Get the tunable frequency range.
      * \return the frequency range in Hz
      */
-    virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
+    virtual uhd::freq_range_t get_freq_range(size_t chan) = 0;
 
     /*!
      * Set the gain for the dboard.
      * \param gain the gain in dB
      */
-    virtual void set_gain(float gain, size_t chan = 0) = 0;
+    virtual void set_gain(float gain, size_t chan) = 0;
 
     /*!
      * Get the actual dboard gain setting.
      * \return the actual gain in dB
      */
-    virtual float get_gain(size_t chan = 0) = 0;
+    virtual float get_gain(size_t chan) = 0;
 
     /*!
      * Get the settable gain range.
      * \return the gain range in dB
      */
-    virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
+    virtual uhd::gain_range_t get_gain_range(size_t chan) = 0;
 
     /*!
      * Set the antenna to use.
      * \param ant the antenna string
      */
-    virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
+    virtual void set_antenna(const std::string &ant, size_t chan) = 0;
 
     /*!
      * Get the antenna in use.
      * \return the antenna string
      */
-    virtual std::string get_antenna(size_t chan = 0) = 0;
+    virtual std::string get_antenna(size_t chan) = 0;
 
     /*!
      * Get a list of possible antennas.
      * \return a vector of antenna strings
      */
-    virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
+    virtual std::vector<std::string> get_antennas(size_t chan) = 0;
+
+    /*!
+     * Set the subdevice bandpass filter.
+     * \param bandwidth the filter bandwidth in Hz
+     */
+    virtual void set_bandwidth(double bandwidth, size_t chan) = 0;
 
     /*!
      * Set the clock configuration.
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc
index 4297a83ffa..24981a59af 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_single_usrp_sink.cc
@@ -95,6 +95,10 @@ public:
         return _dev->get_tx_antennas(chan);
     }
 
+    void set_bandwidth(double bandwidth, size_t chan){
+        return _dev->set_tx_bandwidth(bandwidth, chan);
+    }
+
     void set_clock_config(const uhd::clock_config_t &clock_config){
         return _dev->set_clock_config(clock_config);
     }
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.h b/gr-uhd/lib/uhd_single_usrp_sink.h
index e83bb6ded8..0987685f47 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.h
+++ b/gr-uhd/lib/uhd_single_usrp_sink.h
@@ -110,6 +110,12 @@ public:
      */
     virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
 
+    /*!
+     * Set the subdevice bandpass filter.
+     * \param bandwidth the filter bandwidth in Hz
+     */
+    virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0;
+
     /*!
      * Set the clock configuration.
      * \param clock_config the new configuration
diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc
index 27a788d960..f7c7fc8396 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.cc
+++ b/gr-uhd/lib/uhd_single_usrp_source.cc
@@ -96,6 +96,10 @@ public:
         return _dev->get_rx_antennas(chan);
     }
 
+    void set_bandwidth(double bandwidth, size_t chan){
+        return _dev->set_rx_bandwidth(bandwidth, chan);
+    }
+
     void set_clock_config(const uhd::clock_config_t &clock_config){
         return _dev->set_clock_config(clock_config);
     }
diff --git a/gr-uhd/lib/uhd_single_usrp_source.h b/gr-uhd/lib/uhd_single_usrp_source.h
index c323fbd7ed..1b71d2ad54 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.h
+++ b/gr-uhd/lib/uhd_single_usrp_source.h
@@ -110,6 +110,12 @@ public:
      */
     virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
 
+    /*!
+     * Set the subdevice bandpass filter.
+     * \param bandwidth the filter bandwidth in Hz
+     */
+    virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0;
+
     /*!
      * Set the clock configuration.
      * \param clock_config the new configuration
-- 
cgit v1.2.3


From 13970fed3ae4114689d08bf01cee8b8706d316a5 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Wed, 20 Oct 2010 12:24:04 -0700
Subject: uhd: added channel param to docstrings

---
 gr-uhd/lib/uhd_multi_usrp_sink.h    | 11 +++++++++++
 gr-uhd/lib/uhd_multi_usrp_source.h  | 11 +++++++++++
 gr-uhd/lib/uhd_single_usrp_sink.h   |  9 +++++++++
 gr-uhd/lib/uhd_single_usrp_source.h |  9 +++++++++
 4 files changed, 40 insertions(+)

diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h
index 0ccc0fe6c5..a94e7bd5ae 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.h
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.h
@@ -45,6 +45,7 @@ public:
     /*!
      * Set the subdevice specification.
      * \param spec the subdev spec markup string
+     * \param mboard the motherboard index 0 to M-1
      */
     virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0;
 
@@ -64,12 +65,14 @@ public:
     /*!
      * Tune the usrp device to the desired center frequency.
      * \param freq the desired frequency in Hz
+     * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
     virtual uhd::tune_result_t set_center_freq(double freq, size_t chan) = 0;
 
     /*!
      * Get the tunable frequency range.
+     * \param chan the channel index 0 to N-1
      * \return the frequency range in Hz
      */
     virtual uhd::freq_range_t get_freq_range(size_t chan) = 0;
@@ -77,17 +80,20 @@ public:
     /*!
      * Set the gain for the dboard.
      * \param gain the gain in dB
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_gain(float gain, size_t chan) = 0;
 
     /*!
      * Get the actual dboard gain setting.
+     * \param chan the channel index 0 to N-1
      * \return the actual gain in dB
      */
     virtual float get_gain(size_t chan) = 0;
 
     /*!
      * Get the settable gain range.
+     * \param chan the channel index 0 to N-1
      * \return the gain range in dB
      */
     virtual uhd::gain_range_t get_gain_range(size_t chan) = 0;
@@ -95,23 +101,27 @@ public:
     /*!
      * Set the antenna to use.
      * \param ant the antenna string
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_antenna(const std::string &ant, size_t chan) = 0;
 
     /*!
      * Get the antenna in use.
+     * \param chan the channel index 0 to N-1
      * \return the antenna string
      */
     virtual std::string get_antenna(size_t chan) = 0;
 
     /*!
      * Get a list of possible antennas.
+     * \param chan the channel index 0 to N-1
      * \return a vector of antenna strings
      */
     virtual std::vector<std::string> get_antennas(size_t chan) = 0;
 
     /*!
      * Set the subdevice bandpass filter.
+     * \param chan the channel index 0 to N-1
      * \param bandwidth the filter bandwidth in Hz
      */
     virtual void set_bandwidth(double bandwidth, size_t chan) = 0;
@@ -119,6 +129,7 @@ public:
     /*!
      * Set the clock configuration.
      * \param clock_config the new configuration
+     * \param mboard the motherboard index 0 to M-1
      */
     virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0;
 
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h
index 483ce098cf..081c82ee64 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.h
+++ b/gr-uhd/lib/uhd_multi_usrp_source.h
@@ -45,6 +45,7 @@ public:
     /*!
      * Set the subdevice specification.
      * \param spec the subdev spec markup string
+     * \param mboard the motherboard index 0 to M-1
      */
     virtual void set_subdev_spec(const std::string &spec, size_t mboard) = 0;
 
@@ -64,12 +65,14 @@ public:
     /*!
      * Tune the usrp device to the desired center frequency.
      * \param freq the desired frequency in Hz
+     * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
     virtual uhd::tune_result_t set_center_freq(double freq, size_t chan) = 0;
 
     /*!
      * Get the tunable frequency range.
+     * \param chan the channel index 0 to N-1
      * \return the frequency range in Hz
      */
     virtual uhd::freq_range_t get_freq_range(size_t chan) = 0;
@@ -77,17 +80,20 @@ public:
     /*!
      * Set the gain for the dboard.
      * \param gain the gain in dB
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_gain(float gain, size_t chan) = 0;
 
     /*!
      * Get the actual dboard gain setting.
+     * \param chan the channel index 0 to N-1
      * \return the actual gain in dB
      */
     virtual float get_gain(size_t chan) = 0;
 
     /*!
      * Get the settable gain range.
+     * \param chan the channel index 0 to N-1
      * \return the gain range in dB
      */
     virtual uhd::gain_range_t get_gain_range(size_t chan) = 0;
@@ -95,17 +101,20 @@ public:
     /*!
      * Set the antenna to use.
      * \param ant the antenna string
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_antenna(const std::string &ant, size_t chan) = 0;
 
     /*!
      * Get the antenna in use.
+     * \param chan the channel index 0 to N-1
      * \return the antenna string
      */
     virtual std::string get_antenna(size_t chan) = 0;
 
     /*!
      * Get a list of possible antennas.
+     * \param chan the channel index 0 to N-1
      * \return a vector of antenna strings
      */
     virtual std::vector<std::string> get_antennas(size_t chan) = 0;
@@ -113,12 +122,14 @@ public:
     /*!
      * Set the subdevice bandpass filter.
      * \param bandwidth the filter bandwidth in Hz
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_bandwidth(double bandwidth, size_t chan) = 0;
 
     /*!
      * Set the clock configuration.
      * \param clock_config the new configuration
+     * \param mboard the motherboard index 0 to M-1
      */
     virtual void set_clock_config(const uhd::clock_config_t &clock_config, size_t mboard) = 0;
 
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.h b/gr-uhd/lib/uhd_single_usrp_sink.h
index 0987685f47..390667df9c 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.h
+++ b/gr-uhd/lib/uhd_single_usrp_sink.h
@@ -64,12 +64,14 @@ public:
     /*!
      * Tune the usrp device to the desired center frequency.
      * \param freq the desired frequency in Hz
+     * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
     virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
 
     /*!
      * Get the tunable frequency range.
+     * \param chan the channel index 0 to N-1
      * \return the frequency range in Hz
      */
     virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
@@ -77,17 +79,20 @@ public:
     /*!
      * Set the gain for the dboard.
      * \param gain the gain in dB
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_gain(float gain, size_t chan = 0) = 0;
 
     /*!
      * Get the actual dboard gain setting.
+     * \param chan the channel index 0 to N-1
      * \return the actual gain in dB
      */
     virtual float get_gain(size_t chan = 0) = 0;
 
     /*!
      * Get the settable gain range.
+     * \param chan the channel index 0 to N-1
      * \return the gain range in dB
      */
     virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
@@ -95,17 +100,20 @@ public:
     /*!
      * Set the antenna to use.
      * \param ant the antenna string
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
 
     /*!
      * Get the antenna in use.
+     * \param chan the channel index 0 to N-1
      * \return the antenna string
      */
     virtual std::string get_antenna(size_t chan = 0) = 0;
 
     /*!
      * Get a list of possible antennas.
+     * \param chan the channel index 0 to N-1
      * \return a vector of antenna strings
      */
     virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
@@ -113,6 +121,7 @@ public:
     /*!
      * Set the subdevice bandpass filter.
      * \param bandwidth the filter bandwidth in Hz
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0;
 
diff --git a/gr-uhd/lib/uhd_single_usrp_source.h b/gr-uhd/lib/uhd_single_usrp_source.h
index 1b71d2ad54..415c52e9a5 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.h
+++ b/gr-uhd/lib/uhd_single_usrp_source.h
@@ -64,12 +64,14 @@ public:
     /*!
      * Tune the usrp device to the desired center frequency.
      * \param freq the desired frequency in Hz
+     * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
     virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
 
     /*!
      * Get the tunable frequency range.
+     * \param chan the channel index 0 to N-1
      * \return the frequency range in Hz
      */
     virtual uhd::freq_range_t get_freq_range(size_t chan = 0) = 0;
@@ -77,17 +79,20 @@ public:
     /*!
      * Set the gain for the dboard.
      * \param gain the gain in dB
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_gain(float gain, size_t chan = 0) = 0;
 
     /*!
      * Get the actual dboard gain setting.
+     * \param chan the channel index 0 to N-1
      * \return the actual gain in dB
      */
     virtual float get_gain(size_t chan = 0) = 0;
 
     /*!
      * Get the settable gain range.
+     * \param chan the channel index 0 to N-1
      * \return the gain range in dB
      */
     virtual uhd::gain_range_t get_gain_range(size_t chan = 0) = 0;
@@ -95,17 +100,20 @@ public:
     /*!
      * Set the antenna to use.
      * \param ant the antenna string
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_antenna(const std::string &ant, size_t chan = 0) = 0;
 
     /*!
      * Get the antenna in use.
+     * \param chan the channel index 0 to N-1
      * \return the antenna string
      */
     virtual std::string get_antenna(size_t chan = 0) = 0;
 
     /*!
      * Get a list of possible antennas.
+     * \param chan the channel index 0 to N-1
      * \return a vector of antenna strings
      */
     virtual std::vector<std::string> get_antennas(size_t chan = 0) = 0;
@@ -113,6 +121,7 @@ public:
     /*!
      * Set the subdevice bandpass filter.
      * \param bandwidth the filter bandwidth in Hz
+     * \param chan the channel index 0 to N-1
      */
     virtual void set_bandwidth(double bandwidth, size_t chan = 0) = 0;
 
-- 
cgit v1.2.3


From cd6b9eee92cbb16c4b36f568b812de4dc918eac8 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Thu, 21 Oct 2010 15:09:31 -0700
Subject: uhd: install swig exception handler

---
 gr-uhd/swig/uhd_swig.i | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i
index 6f29f706d7..5b3b524720 100644
--- a/gr-uhd/swig/uhd_swig.i
+++ b/gr-uhd/swig/uhd_swig.i
@@ -20,6 +20,24 @@
  * Boston, MA 02110-1301, USA.
  */
 
+////////////////////////////////////////////////////////////////////////
+// Language independent exception handler
+////////////////////////////////////////////////////////////////////////
+%include exception.i
+
+%exception {
+    try {
+        $action
+    }
+    catch(std::exception &e) {
+        SWIG_exception(SWIG_RuntimeError, e.what());
+    }
+    catch(...) {
+        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
+    }
+
+}
+
 ////////////////////////////////////////////////////////////////////////
 // standard includes
 ////////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From df9a3f3bad0942fe0d6ec45dd02eec62544d02be Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Thu, 21 Oct 2010 15:48:52 -0700
Subject: uhd: added support for setting bw filters through grc

---
 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py  | 26 +++++++++++++++++++++++++-
 gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 26 +++++++++++++++++++++++++-
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
index 2297167320..ae40e551ad 100755
--- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
@@ -51,6 +51,9 @@ self.\$(id).set_gain(\$gain$(n), $n)
 	\#if \$ant$(n)()
 self.\$(id).set_antenna(\$ant$(n), $n)
 	\#end if
+	\#if \$bw$(n)()
+self.\$(id).set_bandwidth(\$bw$(n), $n)
+	\#end if
 \#end if
 #end for
 </make>
@@ -59,6 +62,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 	<callback>set_center_freq(\$center_freq$(n), $n)</callback>
 	<callback>set_gain(\$gain$(n), $n)</callback>
 	<callback>set_antenna(\$ant$(n), $n)</callback>
+	<callback>set_bandwidth(\$bw$(n), $n)</callback>
 	#end for
 	<param>
 		<name>Input Type</name>
@@ -196,9 +200,14 @@ Single channel example: :AB
 Dual channel example: :A :B
 
 Antenna:
-For subdevices/daughterboards with only one antenna, this may be left blank. \\
+For subdevices with only one antenna, this may be left blank. \\
 Otherwise, the user should specify one of the possible antenna choices. \\
 See the daughterboard application notes for the possible antenna choices.
+
+Bandwidth:
+To use the default bandwidth filter setting, this should be zero. \\
+Only certain subdevices have configurable bandwidth filters. \\
+See the daughterboard application notes for possible configurations.
 	</doc>
 </block>
 """
@@ -233,6 +242,21 @@ PARAMS_TMPL = """
 			\#end if
 		</hide>
 	</param>
+	<param>
+		<name>Ch$(n): Bandwidth (Hz)</name>
+		<key>bw$(n)</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>
+			\#if not \$nchan() > $n
+				all
+			\#elif \$bw$(n)()
+				none
+			\#else
+				part
+			\#end if
+		</hide>
+	</param>
 """
 
 def parse_tmpl(_tmpl, **kwargs):
diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index 02cdf64cc2..cb2143f8f9 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -41,6 +41,9 @@ self.\$(id).set_gain(\$gain$(n), $n)
 	\#if \$ant$(n)()
 self.\$(id).set_antenna(\$ant$(n), $n)
 	\#end if
+	\#if \$bw$(n)()
+self.\$(id).set_bandwidth(\$bw$(n), $n)
+	\#end if
 \#end if
 #end for
 </make>
@@ -49,6 +52,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
 	<callback>set_center_freq(\$center_freq$(n), $n)</callback>
 	<callback>set_gain(\$gain$(n), $n)</callback>
 	<callback>set_antenna(\$ant$(n), $n)</callback>
+	<callback>set_bandwidth(\$bw$(n), $n)</callback>
 	#end for
 	<param>
 		<name>Input Type</name>
@@ -152,9 +156,14 @@ Single channel example: A:AB
 Dual channel example: A:AB B:0
 
 Antenna:
-For subdevices/daughterboards with only one antenna, this may be left blank. \\
+For subdevices with only one antenna, this may be left blank. \\
 Otherwise, the user should specify one of the possible antenna choices. \\
 See the daughterboard application notes for the possible antenna choices.
+
+Bandwidth:
+To use the default bandwidth filter setting, this should be zero. \\
+Only certain subdevices have configurable bandwidth filters. \\
+See the daughterboard application notes for possible configurations.
 	</doc>
 </block>
 """
@@ -189,6 +198,21 @@ PARAMS_TMPL = """
 			\#end if
 		</hide>
 	</param>
+	<param>
+		<name>Ch$(n): Bandwidth (Hz)</name>
+		<key>bw$(n)</key>
+		<value>0</value>
+		<type>real</type>
+		<hide>
+			\#if not \$nchan() > $n
+				all
+			\#elif \$bw$(n)()
+				none
+			\#else
+				part
+			\#end if
+		</hide>
+	</param>
 """
 
 def parse_tmpl(_tmpl, **kwargs):
-- 
cgit v1.2.3


From 5a2de999da86d48cd7f005d08cc48965cb8c7a65 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 25 Oct 2010 16:22:05 -0700
Subject: uhd: move tune functions to tune_request and provide wrapper for
 simple case

---
 gr-uhd/lib/uhd_multi_usrp_sink.cc    |  7 ++++---
 gr-uhd/lib/uhd_multi_usrp_sink.h     | 16 +++++++++++++++-
 gr-uhd/lib/uhd_multi_usrp_source.cc  |  7 ++++---
 gr-uhd/lib/uhd_multi_usrp_source.h   | 16 +++++++++++++++-
 gr-uhd/lib/uhd_single_usrp_sink.cc   |  7 ++++---
 gr-uhd/lib/uhd_single_usrp_sink.h    | 16 +++++++++++++++-
 gr-uhd/lib/uhd_single_usrp_source.cc |  7 ++++---
 gr-uhd/lib/uhd_single_usrp_source.h  | 16 +++++++++++++++-
 gr-uhd/swig/uhd_swig.i               |  1 +
 9 files changed, 77 insertions(+), 16 deletions(-)

diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.cc b/gr-uhd/lib/uhd_multi_usrp_sink.cc
index b75a8303cb..ee16e2928d 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.cc
@@ -62,9 +62,10 @@ public:
         return _dev->get_tx_rate();
     }
 
-    uhd::tune_result_t set_center_freq(double freq, size_t chan){
-        uhd::tune_result_t tr = _dev->set_tx_freq(freq, chan);
-        return tr;
+    uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ){
+        return _dev->set_tx_freq(tune_request, chan);
     }
 
     uhd::freq_range_t get_freq_range(size_t chan){
diff --git a/gr-uhd/lib/uhd_multi_usrp_sink.h b/gr-uhd/lib/uhd_multi_usrp_sink.h
index a94e7bd5ae..370e59d0e1 100644
--- a/gr-uhd/lib/uhd_multi_usrp_sink.h
+++ b/gr-uhd/lib/uhd_multi_usrp_sink.h
@@ -64,11 +64,25 @@ public:
 
     /*!
      * Tune the usrp device to the desired center frequency.
+     * \param tune_request the tune request instructions
+     * \param chan the channel index 0 to N-1
+     * \return a tune result with the actual frequencies
+     */
+    virtual uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ) = 0;
+
+    /*!
+     * Tune the usrp device to the desired center frequency.
+     * This is a wrapper around set center freq so that in this case,
+     * the user can pass a single frequency in the call through swig.
      * \param freq the desired frequency in Hz
      * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
-    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan) = 0;
+    uhd::tune_result_t set_center_freq(double freq, size_t chan){
+        return set_center_freq(uhd::tune_request_t(freq), chan);
+    }
 
     /*!
      * Get the tunable frequency range.
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.cc b/gr-uhd/lib/uhd_multi_usrp_source.cc
index 226e8b86fb..029a763e33 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.cc
+++ b/gr-uhd/lib/uhd_multi_usrp_source.cc
@@ -63,9 +63,10 @@ public:
         return _dev->get_rx_rate();
     }
 
-    uhd::tune_result_t set_center_freq(double freq, size_t chan){
-        uhd::tune_result_t tr = _dev->set_rx_freq(freq, chan);
-        return tr;
+    uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ){
+        return _dev->set_rx_freq(tune_request, chan);
     }
 
     uhd::freq_range_t get_freq_range(size_t chan){
diff --git a/gr-uhd/lib/uhd_multi_usrp_source.h b/gr-uhd/lib/uhd_multi_usrp_source.h
index 081c82ee64..b3cbdae1f6 100644
--- a/gr-uhd/lib/uhd_multi_usrp_source.h
+++ b/gr-uhd/lib/uhd_multi_usrp_source.h
@@ -64,11 +64,25 @@ public:
 
     /*!
      * Tune the usrp device to the desired center frequency.
+     * \param tune_request the tune request instructions
+     * \param chan the channel index 0 to N-1
+     * \return a tune result with the actual frequencies
+     */
+    virtual uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ) = 0;
+
+    /*!
+     * Tune the usrp device to the desired center frequency.
+     * This is a wrapper around set center freq so that in this case,
+     * the user can pass a single frequency in the call through swig.
      * \param freq the desired frequency in Hz
      * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
-    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan) = 0;
+    uhd::tune_result_t set_center_freq(double freq, size_t chan){
+        return set_center_freq(uhd::tune_request_t(freq), chan);
+    }
 
     /*!
      * Get the tunable frequency range.
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.cc b/gr-uhd/lib/uhd_single_usrp_sink.cc
index 24981a59af..622f506b55 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.cc
+++ b/gr-uhd/lib/uhd_single_usrp_sink.cc
@@ -62,9 +62,10 @@ public:
         return _dev->get_tx_rate();
     }
 
-    uhd::tune_result_t set_center_freq(double freq, size_t chan){
-        uhd::tune_result_t tr = _dev->set_tx_freq(freq, chan);
-        return tr;
+    uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ){
+        return _dev->set_tx_freq(tune_request, chan);
     }
 
     uhd::freq_range_t get_freq_range(size_t chan){
diff --git a/gr-uhd/lib/uhd_single_usrp_sink.h b/gr-uhd/lib/uhd_single_usrp_sink.h
index 390667df9c..a4c4e6452e 100644
--- a/gr-uhd/lib/uhd_single_usrp_sink.h
+++ b/gr-uhd/lib/uhd_single_usrp_sink.h
@@ -63,11 +63,25 @@ public:
 
     /*!
      * Tune the usrp device to the desired center frequency.
+     * \param tune_request the tune request instructions
+     * \param chan the channel index 0 to N-1
+     * \return a tune result with the actual frequencies
+     */
+    virtual uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ) = 0;
+
+    /*!
+     * Tune the usrp device to the desired center frequency.
+     * This is a wrapper around set center freq so that in this case,
+     * the user can pass a single frequency in the call through swig.
      * \param freq the desired frequency in Hz
      * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
-    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+    uhd::tune_result_t set_center_freq(double freq, size_t chan){
+        return set_center_freq(uhd::tune_request_t(freq), chan);
+    }
 
     /*!
      * Get the tunable frequency range.
diff --git a/gr-uhd/lib/uhd_single_usrp_source.cc b/gr-uhd/lib/uhd_single_usrp_source.cc
index f7c7fc8396..907e8be542 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.cc
+++ b/gr-uhd/lib/uhd_single_usrp_source.cc
@@ -63,9 +63,10 @@ public:
         return _dev->get_rx_rate();
     }
 
-    uhd::tune_result_t set_center_freq(double freq, size_t chan){
-        uhd::tune_result_t tr = _dev->set_rx_freq(freq, chan);
-        return tr;
+    uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ){
+        return _dev->set_rx_freq(tune_request, chan);
     }
 
     uhd::freq_range_t get_freq_range(size_t chan){
diff --git a/gr-uhd/lib/uhd_single_usrp_source.h b/gr-uhd/lib/uhd_single_usrp_source.h
index 415c52e9a5..495f8c6117 100644
--- a/gr-uhd/lib/uhd_single_usrp_source.h
+++ b/gr-uhd/lib/uhd_single_usrp_source.h
@@ -63,11 +63,25 @@ public:
 
     /*!
      * Tune the usrp device to the desired center frequency.
+     * \param tune_request the tune request instructions
+     * \param chan the channel index 0 to N-1
+     * \return a tune result with the actual frequencies
+     */
+    virtual uhd::tune_result_t set_center_freq(
+        const uhd::tune_request_t tune_request, size_t chan
+    ) = 0;
+
+    /*!
+     * Tune the usrp device to the desired center frequency.
+     * This is a wrapper around set center freq so that in this case,
+     * the user can pass a single frequency in the call through swig.
      * \param freq the desired frequency in Hz
      * \param chan the channel index 0 to N-1
      * \return a tune result with the actual frequencies
      */
-    virtual uhd::tune_result_t set_center_freq(double freq, size_t chan = 0) = 0;
+    uhd::tune_result_t set_center_freq(double freq, size_t chan){
+        return set_center_freq(uhd::tune_request_t(freq), chan);
+    }
 
     /*!
      * Get the tunable frequency range.
diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i
index 5b3b524720..d332bb6171 100644
--- a/gr-uhd/swig/uhd_swig.i
+++ b/gr-uhd/swig/uhd_swig.i
@@ -69,6 +69,7 @@ namespace std {
 ////////////////////////////////////////////////////////////////////////
 %include <uhd/config.hpp>
 %include <uhd/types/ranges.hpp>
+%include <uhd/types/tune_request.hpp>
 %include <uhd/types/tune_result.hpp>
 %include <uhd/types/io_type.hpp>
 %include <uhd/types/time_spec.hpp>
-- 
cgit v1.2.3


From 3dab5d93a45928baa4fb23878d644751e06943a0 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Thu, 28 Oct 2010 13:24:23 -0700
Subject: uhd: make a tune_request_t that inherits from float for GRC, added
 docs

---
 gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py  | 24 +++++++++++++++---------
 gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 16 +++++++++++-----
 gr-uhd/swig/__init__.py                      | 12 ++++++++++++
 3 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
index ae40e551ad..112d881599 100755
--- a/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_multi_usrp_blocks_xml.py
@@ -180,15 +180,6 @@ USRP2 Example: addr=192.168.10.2 192.168.10.3
 Num Motherboards:
 Selects the number of USRP motherboards in this multi-USRP configuration.
 
-Num Channels:
-Selects the total number of channels in this multi-USRP configuration.
-Ex: 4 motherboards with 2 channels per board = 8 channels total
-
-Sample rate:
-The sample rate is the number of samples per second input by this block. \\
-The UHD device driver will try its best to match the requested sample rate. \\
-If the requested rate is not possible, the UHD block will print an error at runtime.
-
 Subdevice specification:
 Each motherboard should have its own subdevice specification \\
 and all subdevice specifications should be the same length. \\
@@ -199,6 +190,21 @@ See the application notes for further details.
 Single channel example: :AB
 Dual channel example: :A :B
 
+Num Channels:
+Selects the total number of channels in this multi-USRP configuration.
+Ex: 4 motherboards with 2 channels per board = 8 channels total
+
+Sample rate:
+The sample rate is the number of samples per second input by this block. \\
+The UHD device driver will try its best to match the requested sample rate. \\
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Center frequency:
+The center frequency is the overall frequency of the RF chain. \\
+For greater control of how the UHD tunes elements in the RF chain, \\
+pass a tune_request_t object rather than a simple target frequency.
+Tuning with an LO offset example: uhd.tune_request_t(freq, lo_off)
+
 Antenna:
 For subdevices with only one antenna, this may be left blank. \\
 Otherwise, the user should specify one of the possible antenna choices. \\
diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index cb2143f8f9..9b6422f7a2 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -142,11 +142,6 @@ Used args to specify a specfic device.
 USRP2 Example: addr=192.168.10.2
 USRP1 Example: serial=12345678
 
-Sample rate:
-The sample rate is the number of samples per second input by this block. \\
-The UHD device driver will try its best to match the requested sample rate. \\
-If the requested rate is not possible, the UHD block will print an error at runtime.
-
 Subdevice specification:
 Select the subdevice or subdevices for each channel using a markup string. \\
 The markup string consists of a list of dboard_slot:subdev_name pairs (one pair per channel). \\
@@ -155,6 +150,17 @@ See the application notes for further details.
 Single channel example: A:AB
 Dual channel example: A:AB B:0
 
+Sample rate:
+The sample rate is the number of samples per second input by this block. \\
+The UHD device driver will try its best to match the requested sample rate. \\
+If the requested rate is not possible, the UHD block will print an error at runtime.
+
+Center frequency:
+The center frequency is the overall frequency of the RF chain. \\
+For greater control of how the UHD tunes elements in the RF chain, \\
+pass a tune_request_t object rather than a simple target frequency.
+Tuning with an LO offset example: uhd.tune_request_t(freq, lo_off)
+
 Antenna:
 For subdevices with only one antenna, this may be left blank. \\
 Otherwise, the user should specify one of the possible antenna choices. \\
diff --git a/gr-uhd/swig/__init__.py b/gr-uhd/swig/__init__.py
index 2fed17e578..0fdacb796c 100644
--- a/gr-uhd/swig/__init__.py
+++ b/gr-uhd/swig/__init__.py
@@ -21,8 +21,20 @@
 
 # The presence of this file turns this directory into a Python package
 
+########################################################################
 # Add SWIG generated code to this namespace
+########################################################################
 from uhd_swig import *
 
+########################################################################
 # Add other content from pure-Python modules here
+########################################################################
 
+class tune_request_t(tune_request_t, float):
+    """
+    Make the python tune request object inherit from float
+    so that it can be passed in GRC as a frequency parameter.
+    The type checking in GRC will accept the tune request.
+    """
+    def __new__(self, *args): return float.__new__(self)
+    def __float__(self): return self.target_freq
-- 
cgit v1.2.3


From 2aef04843d248d0584b4865c62d7ca0772113dc9 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Thu, 28 Oct 2010 17:22:25 -0700
Subject: uhd: added ref clock option to single usrp blocks, minor grc fix on
 empty option keys

---
 gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py | 22 ++++++++++++++++++++++
 grc/base/Param.py                            |  2 +-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
index 9b6422f7a2..7337c71d7b 100755
--- a/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
+++ b/gr-uhd/grc/gen_uhd_single_usrp_blocks_xml.py
@@ -30,6 +30,13 @@ MAIN_TMPL = """\
 	io_type=uhd.io_type_t.\$type.type,
 	num_channels=\$nchan,
 )
+\#if \$ref_clk()
+_clk_cfg = uhd.clock_config_t()
+_clk_cfg.ref_source = uhd.clock_config_t.REF_SMA
+_clk_cfg.pps_source = uhd.clock_config_t.PPS_SMA
+_clk_cfg.pps_polarity = uhd.clock_config_t.PPS_POS
+self.\$(id).set_clock_config(_clk_cfg);
+\#end if
 \#if \$sd_spec()
 self.\$(id).set_subdev_spec(\$sd_spec)
 \#end if
@@ -103,6 +110,21 @@ self.\$(id).set_bandwidth(\$bw$(n), $n)
 			\#end if
 		</hide>
 	</param>
+	<param>
+		<name>Ref Clock</name>
+		<key>ref_clk</key>
+		<value></value>
+		<type>enum</type>
+		<hide>\#if \$ref_clk() then 'none' else 'part'#</hide>
+		<option>
+			<name>External</name>
+			<key>ext</key>
+		</option>
+		<option>
+			<name>Internal</name>
+			<key></key>
+		</option>
+	</param>
 	<param>
 		<name>Subdev Spec</name>
 		<key>sd_spec</key>
diff --git a/grc/base/Param.py b/grc/base/Param.py
index e56eac36e1..5cd0f9d6d8 100644
--- a/grc/base/Param.py
+++ b/grc/base/Param.py
@@ -94,7 +94,7 @@ class Param(Element):
 				try: assert set(opt_keys) == set(option.get_opt_keys())
 				except AssertionError: raise Exception, 'Opt keys "%s" are not identical across all options.'%opt_keys
 			#if a value is specified, it must be in the options keys
-			self._value = value or self.get_option_keys()[0]
+			self._value = value if value or value in self.get_option_keys() else self.get_option_keys()[0]
 			try: assert self.get_value() in self.get_option_keys()
 			except AssertionError: raise Exception, 'The value "%s" is not in the possible values of "%s".'%(self.get_value(), self.get_option_keys())
 		else: self._value = value or ''
-- 
cgit v1.2.3


From 1d63a52520ebdac7242784eafa79093b7fc2710d Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 2 Nov 2010 12:47:46 -0400
Subject: Adding ability for FIR filter with internal buffer to decimate.

Also adds QA code to test decimate by 2 and 5.

Removes lib/filter/gri_fir_filter_with_buffer_ccf.h that is autogenerated.
---
 .../lib/filter/gri_fir_filter_with_buffer_XXX.cc.t | 33 ++++++++++++++++++++
 .../lib/filter/gri_fir_filter_with_buffer_XXX.h.t  | 18 +++++++++--
 .../lib/filter/gri_fir_filter_with_buffer_ccf.h    | 18 +++++++++--
 .../filter/qa_gri_fir_filter_with_buffer_ccc.cc    | 35 ++++++++++++++++-----
 .../lib/filter/qa_gri_fir_filter_with_buffer_ccc.h |  7 +++--
 .../filter/qa_gri_fir_filter_with_buffer_ccf.cc    | 35 ++++++++++++++++-----
 .../lib/filter/qa_gri_fir_filter_with_buffer_ccf.h |  7 +++--
 .../filter/qa_gri_fir_filter_with_buffer_fcc.cc    | 36 +++++++++++++++++-----
 .../lib/filter/qa_gri_fir_filter_with_buffer_fcc.h |  7 +++--
 .../filter/qa_gri_fir_filter_with_buffer_fff.cc    | 35 ++++++++++++++++-----
 .../lib/filter/qa_gri_fir_filter_with_buffer_fff.h |  7 +++--
 .../filter/qa_gri_fir_filter_with_buffer_fsf.cc    | 35 ++++++++++++++++-----
 .../lib/filter/qa_gri_fir_filter_with_buffer_fsf.h |  9 ++++--
 .../filter/qa_gri_fir_filter_with_buffer_scc.cc    | 35 ++++++++++++++++-----
 .../lib/filter/qa_gri_fir_filter_with_buffer_scc.h |  7 +++--
 15 files changed, 257 insertions(+), 67 deletions(-)

diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
index c0d061c817..1540688403 100644
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.cc.t
@@ -77,6 +77,26 @@ void
   return (@O_TYPE@)out;
 }
 
+@O_TYPE@
+@NAME@::filter (const @I_TYPE@ input[], unsigned long dec)
+{
+  unsigned int i;
+
+  for(i = 0; i < dec; i++) {
+    d_buffer[d_idx] = input[i];
+    d_buffer[d_idx+ntaps()] = input[i];
+    d_idx++;
+    if(d_idx >= ntaps())
+      d_idx = 0;
+  }
+
+  @ACC_TYPE@ out = 0;
+  for(i = 0; i < ntaps(); i++) {
+    out += @INPUT_CAST@ d_buffer[d_idx + i] * d_taps[i];
+  }
+  return (@O_TYPE@)out;
+}
+
 void
 @NAME@::filterN (@O_TYPE@ output[],
 		 const @I_TYPE@ input[],
@@ -86,3 +106,16 @@ void
     output[i] = filter(input[i]);
   }
 }
+
+void
+@NAME@::filterNdec (@O_TYPE@ output[],
+		    const @I_TYPE@ input[],
+		    unsigned long n,
+		    unsigned long decimate)
+{
+  unsigned long j = 0;
+  for(unsigned long i = 0; i < n; i++) {
+    output[i] = filter(&input[j], decimate);
+    j += decimate;
+  }
+}
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
index d566b36746..23d64b65dd 100644
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_XXX.h.t
@@ -69,13 +69,25 @@ public:
   /*!
    * \brief compute a single output value.
    *
-   * \p input must have ntaps() valid entries.
-   * input[0] .. input[ntaps() - 1] are referenced to compute the output value.
+   * \p input is a single input value of the filter type
    *
    * \returns the filtered input value.
    */
   @O_TYPE@ filter (@I_TYPE@ input);
 
+  
+  /*!
+   * \brief compute a single output value; designed for decimating filters.
+   *
+   * \p input is a single input value of the filter type. The value of dec is the
+   *    decimating value of the filter, so input[] must have dec valid values.
+   *    The filter pushes dec number of items onto the circ. buffer before computing
+   *    a single output.
+   *
+   * \returns the filtered input value.
+   */
+  @O_TYPE@ filter (const @I_TYPE@ input[], unsigned long dec);
+
   /*!
    * \brief compute an array of N output values.
    *
@@ -93,7 +105,7 @@ public:
    * compute the output values.
    */
   void filterNdec (@O_TYPE@ output[], const @I_TYPE@ input[],
-		   unsigned long n, unsigned decimate);
+		   unsigned long n, unsigned long decimate);
 
   /*!
    * \brief install \p new_taps as the current taps.
diff --git a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
index 2b69f8b036..bd7fa33cf6 100644
--- a/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
+++ b/gnuradio-core/src/lib/filter/gri_fir_filter_with_buffer_ccf.h
@@ -69,13 +69,25 @@ public:
   /*!
    * \brief compute a single output value.
    *
-   * \p input must have ntaps() valid entries.
-   * input[0] .. input[ntaps() - 1] are referenced to compute the output value.
+   * \p input is a single input value of the filter type
    *
    * \returns the filtered input value.
    */
   gr_complex filter (gr_complex input);
 
+  
+  /*!
+   * \brief compute a single output value; designed for decimating filters.
+   *
+   * \p input is a single input value of the filter type. The value of dec is the
+   *    decimating value of the filter, so input[] must have dec valid values.
+   *    The filter pushes dec number of items onto the circ. buffer before computing
+   *    a single output.
+   *
+   * \returns the filtered input value.
+   */
+  gr_complex filter (const gr_complex input[], unsigned long dec);
+
   /*!
    * \brief compute an array of N output values.
    *
@@ -93,7 +105,7 @@ public:
    * compute the output values.
    */
   void filterNdec (gr_complex output[], const gr_complex input[],
-		   unsigned long n, unsigned decimate);
+		   unsigned long n, unsigned long decimate);
 
   /*!
    * \brief install \p new_taps as the current taps.
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
index cff81ab13c..e87d93ebff 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.cc
@@ -73,14 +73,31 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   return sum;
 }
 
+void
+qa_gri_fir_filter_with_buffer_ccc::t1 ()
+{
+  test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccc::t2 ()
+{
+  test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccc::t3 ()
+{
+  test_decimate(5);
+}
+
 //
 // Test for ntaps in [0,9], and input lengths in [0,17].
 // This ensures that we are building the shifted taps correctly,
 // and exercises all corner cases on input alignment and length.
 //
-
 void
-qa_gri_fir_filter_with_buffer_ccc::t1 ()
+qa_gri_fir_filter_with_buffer_ccc::test_decimate(unsigned int decimate)
 {
   const int	MAX_TAPS	= 9;
   const int	OUTPUT_LEN	= 17;
@@ -107,11 +124,13 @@ qa_gri_fir_filter_with_buffer_ccc::t1 ()
 
       // compute expected output values
       memset(dline, 0, INPUT_LEN*sizeof(i_type));
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	// use an actual delay line for this test
-	for(int oo = INPUT_LEN-1; oo > 0; oo--)
-	  dline[oo] = dline[oo-1];
-	dline[0] = input[o];
+	for(int dd = 0; dd < (int)decimate; dd++) {
+	  for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	    dline[oo] = dline[oo-1];
+	  dline[0] = input[decimate*o+dd];
+	}
 	expected_output[o] = ref_dotprod (dline, taps, n);
       }
 
@@ -121,7 +140,7 @@ qa_gri_fir_filter_with_buffer_ccc::t1 ()
 
       // zero the output, then do the filtering
       memset (actual_output, 0, sizeof (actual_output));
-      f1->filterN (actual_output, input, ol);
+      f1->filterNdec (actual_output, input, ol/decimate, decimate);
 
       // check results
       //
@@ -130,7 +149,7 @@ qa_gri_fir_filter_with_buffer_ccc::t1 ()
       // arithmetic, while the SSE version is using 32 bit float point
       // arithmetic.
       
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
 				       abs (expected_output[o]) * ERR_DELTA);
       }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
index 411a66a9aa..f9f206f664 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccc.h
@@ -29,13 +29,16 @@ class qa_gri_fir_filter_with_buffer_ccc : public CppUnit::TestCase {
 
   CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_ccc);
   CPPUNIT_TEST (t1);
+  CPPUNIT_TEST (t2);
+  CPPUNIT_TEST (t3);
   CPPUNIT_TEST_SUITE_END ();
 
  private:
+  void test_decimate(unsigned int decimate);
 
   void t1 ();
-  // void t2 ();
-  // void t3 ();
+  void t2 ();
+  void t3 ();
 
 };
 
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
index f2e09db1cf..c25853b1e4 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.cc
@@ -80,14 +80,31 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   return sum;
 }
 
+void
+qa_gri_fir_filter_with_buffer_ccf::t1 ()
+{
+  test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccf::t2 ()
+{
+  test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_ccf::t3 ()
+{
+  test_decimate(5);
+}
+
 //
 // Test for ntaps in [0,9], and input lengths in [0,17].
 // This ensures that we are building the shifted taps correctly,
 // and exercises all corner cases on input alignment and length.
 //
-
 void
-qa_gri_fir_filter_with_buffer_ccf::t1 ()  
+qa_gri_fir_filter_with_buffer_ccf::test_decimate (unsigned int decimate)
 {
   const int	MAX_TAPS	= 9;
   const int	OUTPUT_LEN	= 17;
@@ -114,11 +131,13 @@ qa_gri_fir_filter_with_buffer_ccf::t1 ()
 
       // compute expected output values
       memset(dline, 0, INPUT_LEN*sizeof(i_type));
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	// use an actual delay line for this test
-	for(int oo = INPUT_LEN-1; oo > 0; oo--)
-	  dline[oo] = dline[oo-1];
-	dline[0] = input[o];
+	for(int dd = 0; dd < (int)decimate; dd++) {
+	  for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	    dline[oo] = dline[oo-1];
+	  dline[0] = input[decimate*o+dd];
+	}
 	expected_output[o] = ref_dotprod (dline, taps, n);
       }
 
@@ -128,7 +147,7 @@ qa_gri_fir_filter_with_buffer_ccf::t1 ()
 
       // zero the output, then do the filtering
       memset (actual_output, 0, sizeof (actual_output));
-      f1->filterN (actual_output, input, ol);
+      f1->filterNdec (actual_output, input, ol/decimate, decimate);
 
       // check results
       //
@@ -137,7 +156,7 @@ qa_gri_fir_filter_with_buffer_ccf::t1 ()
       // arithmetic, while the SSE version is using 32 bit float point
       // arithmetic.
       
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
 				       abs (expected_output[o]) * ERR_DELTA);
       }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h
index b80be70a79..924b4bc2e5 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_ccf.h
@@ -29,13 +29,16 @@ class qa_gri_fir_filter_with_buffer_ccf : public CppUnit::TestCase {
 
   CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_ccf);
   CPPUNIT_TEST (t1);
+  CPPUNIT_TEST (t2);
+  CPPUNIT_TEST (t3);
   CPPUNIT_TEST_SUITE_END ();
 
  private:
+  void test_decimate(unsigned int decimate);
 
   void t1 ();
-  // void t2 ();
-  // void t3 ();
+  void t2 ();
+  void t3 ();
 
 };
 
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
index de0da9f1ca..19f270200d 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.cc
@@ -80,14 +80,32 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   return sum;
 }
 
+void
+qa_gri_fir_filter_with_buffer_fcc::t1()
+{
+  test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fcc::t2()
+{
+  test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fcc::t3()
+{
+  test_decimate(5);
+}
+
+
 //
 // Test for ntaps in [0,9], and input lengths in [0,17].
 // This ensures that we are building the shifted taps correctly,
 // and exercises all corner cases on input alignment and length.
 //
-
 void
-qa_gri_fir_filter_with_buffer_fcc::t1 ()
+qa_gri_fir_filter_with_buffer_fcc::test_decimate(unsigned int decimate)
 {
   const int	MAX_TAPS	= 9;
   const int	OUTPUT_LEN	= 17;
@@ -114,11 +132,13 @@ qa_gri_fir_filter_with_buffer_fcc::t1 ()
 
       // compute expected output values
       memset(dline, 0, INPUT_LEN*sizeof(i_type));
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	// use an actual delay line for this test
-	for(int oo = INPUT_LEN-1; oo > 0; oo--)
-	  dline[oo] = dline[oo-1];
-	dline[0] = input[o];
+	for(int dd = 0; dd < (int)decimate; dd++) {
+	  for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	    dline[oo] = dline[oo-1];
+	  dline[0] = input[decimate*o+dd];
+	}
 	expected_output[o] = ref_dotprod (dline, taps, n);
       }
 
@@ -128,7 +148,7 @@ qa_gri_fir_filter_with_buffer_fcc::t1 ()
 
       // zero the output, then do the filtering
       memset (actual_output, 0, sizeof (actual_output));
-      f1->filterN (actual_output, input, ol);
+      f1->filterNdec (actual_output, input, ol/decimate, decimate);
 
       // check results
       //
@@ -137,7 +157,7 @@ qa_gri_fir_filter_with_buffer_fcc::t1 ()
       // arithmetic, while the SSE version is using 32 bit float point
       // arithmetic.
       
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
 				       abs (expected_output[o]) * ERR_DELTA);
       }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
index 81b39f4884..6201800f9d 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fcc.h
@@ -29,13 +29,16 @@ class qa_gri_fir_filter_with_buffer_fcc : public CppUnit::TestCase {
 
   CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fcc);
   CPPUNIT_TEST (t1);
+  CPPUNIT_TEST (t2);
+  CPPUNIT_TEST (t3);
   CPPUNIT_TEST_SUITE_END ();
 
  private:
+  void test_decimate(unsigned int decimate);
 
   void t1 ();
-  // void t2 ();
-  // void t3 ();
+  void t2 ();
+  void t3 ();
 
 };
 
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
index ce689a54bb..8401e484bf 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.cc
@@ -69,14 +69,31 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   return sum;
 }
 
+void
+qa_gri_fir_filter_with_buffer_fff::t1 ()  
+{
+  test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fff::t2 ()
+{
+  test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fff::t3 ()
+{
+  test_decimate(5);
+}
+
 //
 // Test for ntaps in [0,9], and input lengths in [0,17].
 // This ensures that we are building the shifted taps correctly,
 // and exercises all corner cases on input alignment and length.
 //
-
 void
-qa_gri_fir_filter_with_buffer_fff::t1 ()  
+qa_gri_fir_filter_with_buffer_fff::test_decimate(unsigned int decimate)
 {
   const int	MAX_TAPS	= 9;
   const int	OUTPUT_LEN	= 17;
@@ -103,11 +120,13 @@ qa_gri_fir_filter_with_buffer_fff::t1 ()
 
       // compute expected output values
       memset(dline, 0, INPUT_LEN*sizeof(i_type));
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	// use an actual delay line for this test
-	for(int oo = INPUT_LEN-1; oo > 0; oo--)
-	  dline[oo] = dline[oo-1];
-	dline[0] = input[o];
+	for(int dd = 0; dd < (int)decimate; dd++) {
+	  for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	    dline[oo] = dline[oo-1];
+	  dline[0] = input[decimate*o+dd];
+	}
 	expected_output[o] = ref_dotprod (dline, taps, n);
       }
 
@@ -117,7 +136,7 @@ qa_gri_fir_filter_with_buffer_fff::t1 ()
 
       // zero the output, then do the filtering
       memset (actual_output, 0, sizeof (actual_output));
-      f1->filterN (actual_output, input, ol);
+      f1->filterNdec (actual_output, input, ol/decimate, decimate);
 
       // check results
       //
@@ -126,7 +145,7 @@ qa_gri_fir_filter_with_buffer_fff::t1 ()
       // arithmetic, while the SSE version is using 32 bit float point
       // arithmetic.
       
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_output[o], actual_output[o],
 				     fabsf (expected_output[o]) * ERR_DELTA);
       }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
index 5bb6c3e937..54a9cdc53a 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fff.h
@@ -29,13 +29,16 @@ class qa_gri_fir_filter_with_buffer_fff : public CppUnit::TestCase {
 
   CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fff);
   CPPUNIT_TEST (t1);
+  CPPUNIT_TEST (t2);
+  CPPUNIT_TEST (t3);
   CPPUNIT_TEST_SUITE_END ();
 
  private:
+  void test_decimate(unsigned int decimate);
 
   void t1 ();
-  // void t2 ();
-  // void t3 ();
+  void t2 ();
+  void t3 ();
 
 };
 
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
index f09a1d7ac6..091505380c 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.cc
@@ -67,14 +67,31 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   return (o_type)sum;
 }
 
+void
+qa_gri_fir_filter_with_buffer_fsf::t1 ()
+{
+  test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t2 ()
+{
+  test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_fsf::t3 ()
+{
+  test_decimate(5);
+}
+
 //
 // Test for ntaps in [0,9], and input lengths in [0,17].
 // This ensures that we are building the shifted taps correctly,
 // and exercises all corner cases on input alignment and length.
 //
-
 void
-qa_gri_fir_filter_with_buffer_fsf::t1 ()  
+qa_gri_fir_filter_with_buffer_fsf::test_decimate (unsigned int decimate)  
 {
   const int	MAX_TAPS	= 9;
   const int	OUTPUT_LEN	= 17;
@@ -101,11 +118,13 @@ qa_gri_fir_filter_with_buffer_fsf::t1 ()
 
       // compute expected output values
       memset(dline, 0, INPUT_LEN*sizeof(i_type));
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	// use an actual delay line for this test
-	for(int oo = INPUT_LEN-1; oo > 0; oo--)
-	  dline[oo] = dline[oo-1];
-	dline[0] = input[o];
+	for(int dd = 0; dd < (int)decimate; dd++) {
+	  for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	    dline[oo] = dline[oo-1];
+	  dline[0] = input[decimate*o+dd];
+	}
 	expected_output[o] = ref_dotprod (dline, taps, n);
       }
 
@@ -115,10 +134,10 @@ qa_gri_fir_filter_with_buffer_fsf::t1 ()
 
       // zero the output, then do the filtering
       memset (actual_output, 0, sizeof (actual_output));
-      f1->filterN (actual_output, input, ol);
+      f1->filterNdec (actual_output, input, ol/decimate, decimate);
 
       // check results
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	CPPUNIT_ASSERT_EQUAL(expected_output[o], actual_output[o]);
       }
       delete f1;
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
index 38899b3520..9c901464ed 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_fsf.h
@@ -29,13 +29,16 @@ class qa_gri_fir_filter_with_buffer_fsf : public CppUnit::TestCase {
 
   CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_fsf);
   CPPUNIT_TEST (t1);
+  CPPUNIT_TEST (t2);
+  CPPUNIT_TEST (t3);
   CPPUNIT_TEST_SUITE_END ();
 
  private:
-
+  void test_decimate(unsigned int decimate);
+  
   void t1 ();
-  // void t2 ();
-  // void t3 ();
+  void t2 ();
+  void t3 ();
 
 };
 
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
index 4ba433ebfd..03cd710223 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.cc
@@ -80,14 +80,31 @@ ref_dotprod (const i_type input[], const tap_type taps[], int ntaps)
   return sum;
 }
 
+void
+qa_gri_fir_filter_with_buffer_scc::t1 ()
+{
+  test_decimate(1);
+}
+
+void
+qa_gri_fir_filter_with_buffer_scc::t2 ()
+{
+  test_decimate(2);
+}
+
+void
+qa_gri_fir_filter_with_buffer_scc::t3 ()
+{
+  test_decimate(5);
+}
+
 //
 // Test for ntaps in [0,9], and input lengths in [0,17].
 // This ensures that we are building the shifted taps correctly,
 // and exercises all corner cases on input alignment and length.
 //
-
 void
-qa_gri_fir_filter_with_buffer_scc::t1 ()  
+qa_gri_fir_filter_with_buffer_scc::test_decimate (unsigned int decimate)
 {
   const int	MAX_TAPS	= 9;
   const int	OUTPUT_LEN	= 17;
@@ -114,11 +131,13 @@ qa_gri_fir_filter_with_buffer_scc::t1 ()
 
       // compute expected output values
       memset(dline, 0, INPUT_LEN*sizeof(i_type));
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	// use an actual delay line for this test
-	for(int oo = INPUT_LEN-1; oo > 0; oo--)
-	  dline[oo] = dline[oo-1];
-	dline[0] = input[o];
+	for(int dd = 0; dd < (int)decimate; dd++) {
+	  for(int oo = INPUT_LEN-1; oo > 0; oo--)
+	    dline[oo] = dline[oo-1];
+	  dline[0] = input[decimate*o+dd];
+	}
 	expected_output[o] = ref_dotprod (dline, taps, n);
       }
 
@@ -128,7 +147,7 @@ qa_gri_fir_filter_with_buffer_scc::t1 ()
 
       // zero the output, then do the filtering
       memset (actual_output, 0, sizeof (actual_output));
-      f1->filterN (actual_output, input, ol);
+      f1->filterNdec (actual_output, input, ol/decimate, decimate);
 
       // check results
       //
@@ -137,7 +156,7 @@ qa_gri_fir_filter_with_buffer_scc::t1 ()
       // arithmetic, while the SSE version is using 32 bit float point
       // arithmetic.
 
-      for (int o = 0; o < ol; o++){
+      for (int o = 0; o < (int)(ol/decimate); o++){
 	CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected_output[o], actual_output[o],
 				       abs (expected_output[o]) * ERR_DELTA);
       }
diff --git a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h
index fd9fe5b767..970ca37498 100644
--- a/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h
+++ b/gnuradio-core/src/lib/filter/qa_gri_fir_filter_with_buffer_scc.h
@@ -29,13 +29,16 @@ class qa_gri_fir_filter_with_buffer_scc : public CppUnit::TestCase {
 
   CPPUNIT_TEST_SUITE (qa_gri_fir_filter_with_buffer_scc);
   CPPUNIT_TEST (t1);
+  CPPUNIT_TEST (t2);
+  CPPUNIT_TEST (t3);
   CPPUNIT_TEST_SUITE_END ();
 
  private:
+  void test_decimate(unsigned int decimate);
 
   void t1 ();
-  // void t2 ();
-  // void t3 ();
+  void t2 ();
+  void t3 ();
 
 };
 
-- 
cgit v1.2.3


From 1fa9a8ea31115b878bff48d2259fc72d1a37b52c Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Tue, 2 Nov 2010 12:53:15 -0400
Subject: Sneaking in a few warning fixes to this branch.

---
 gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc | 1 -
 gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc   | 5 +++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
index cb67b81040..db16a634b7 100644
--- a/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
+++ b/gnuradio-core/src/lib/filter/gr_pfb_channelizer_ccf.cc
@@ -55,7 +55,6 @@ gr_pfb_channelizer_ccf::gr_pfb_channelizer_ccf (unsigned int numchans,
   // This tests the specified input sample rate to see if it conforms to this
   // requirement within a few significant figures.
   double intp = 0;
-  double x = (10000.0*rint(numchans / oversample_rate)) / 10000.0;
   double fltp = modf(numchans / oversample_rate, &intp);
   if(fltp != 0.0)
     throw std::invalid_argument("gr_pfb_channelizer: oversample rate must be N/i for i in [1, N]"); 
diff --git a/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc b/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc
index ff997e7a97..c32398e6d5 100644
--- a/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc
+++ b/gnuradio-core/src/lib/general/gr_fll_band_edge_cc.cc
@@ -161,8 +161,9 @@ gr_fll_band_edge_cc::work (int noutput_items,
   const gr_complex *in  = (const gr_complex *) input_items[0];
   gr_complex *out = (gr_complex *) output_items[0];
 
-  float *frq, *phs;
-  gr_complex *err;
+  float *frq = NULL;
+  float *phs = NULL;
+  gr_complex *err = NULL;
   if(output_items.size() > 2) {
     frq = (float *) output_items[1];
     phs = (float *) output_items[2];
-- 
cgit v1.2.3