Directory reorganization to newer layout
authorJohnathan Corgan <jcorgan@corganenterprises.com>
Fri, 16 Oct 2009 19:22:42 +0000 (12:22 -0700)
committerJohnathan Corgan <jcorgan@corganenterprises.com>
Tue, 3 Nov 2009 15:21:42 +0000 (07:21 -0800)
Top-level applications go into 'apps' (previous commit)
C++ library build goes into 'lib'
SWIG generation goes into 'swig'
Pure python modules/code goes into 'python'

64 files changed:
config/grc_gr_pager.m4
gr-pager/Makefile.am
gr-pager/lib/.gitignore [new file with mode: 0644]
gr-pager/lib/Makefile.am [new file with mode: 0644]
gr-pager/lib/Makefile.swig.gen [new file with mode: 0644]
gr-pager/lib/pager_flex_deinterleave.cc [new file with mode: 0644]
gr-pager/lib/pager_flex_deinterleave.h [new file with mode: 0644]
gr-pager/lib/pager_flex_frame.cc [new file with mode: 0644]
gr-pager/lib/pager_flex_frame.h [new file with mode: 0644]
gr-pager/lib/pager_flex_parse.cc [new file with mode: 0644]
gr-pager/lib/pager_flex_parse.h [new file with mode: 0644]
gr-pager/lib/pager_flex_sync.cc [new file with mode: 0644]
gr-pager/lib/pager_flex_sync.h [new file with mode: 0644]
gr-pager/lib/pager_slicer_fb.cc [new file with mode: 0644]
gr-pager/lib/pager_slicer_fb.h [new file with mode: 0644]
gr-pager/lib/pageri_bch3221.cc [new file with mode: 0644]
gr-pager/lib/pageri_bch3221.h [new file with mode: 0644]
gr-pager/lib/pageri_flex_modes.cc [new file with mode: 0644]
gr-pager/lib/pageri_flex_modes.h [new file with mode: 0644]
gr-pager/lib/pageri_util.cc [new file with mode: 0644]
gr-pager/lib/pageri_util.h [new file with mode: 0644]
gr-pager/python/.gitignore [new file with mode: 0644]
gr-pager/python/Makefile.am [new file with mode: 0644]
gr-pager/python/__init__.py [new file with mode: 0644]
gr-pager/python/flex_demod.py [new file with mode: 0644]
gr-pager/python/pager_utils.py [new file with mode: 0644]
gr-pager/python/qa_pager.py [new file with mode: 0755]
gr-pager/python/run_tests.in [new file with mode: 0644]
gr-pager/src/.gitignore [deleted file]
gr-pager/src/Makefile.am [deleted file]
gr-pager/src/Makefile.swig.gen [deleted file]
gr-pager/src/__init__.py [deleted file]
gr-pager/src/flex_demod.py [deleted file]
gr-pager/src/pager_flex_deinterleave.cc [deleted file]
gr-pager/src/pager_flex_deinterleave.h [deleted file]
gr-pager/src/pager_flex_frame.cc [deleted file]
gr-pager/src/pager_flex_frame.h [deleted file]
gr-pager/src/pager_flex_frame.i [deleted file]
gr-pager/src/pager_flex_parse.cc [deleted file]
gr-pager/src/pager_flex_parse.h [deleted file]
gr-pager/src/pager_flex_sync.cc [deleted file]
gr-pager/src/pager_flex_sync.h [deleted file]
gr-pager/src/pager_slicer_fb.cc [deleted file]
gr-pager/src/pager_slicer_fb.h [deleted file]
gr-pager/src/pager_swig.i [deleted file]
gr-pager/src/pager_utils.py [deleted file]
gr-pager/src/pageri_bch3221.cc [deleted file]
gr-pager/src/pageri_bch3221.h [deleted file]
gr-pager/src/pageri_flex_modes.cc [deleted file]
gr-pager/src/pageri_flex_modes.h [deleted file]
gr-pager/src/pageri_util.cc [deleted file]
gr-pager/src/pageri_util.h [deleted file]
gr-pager/src/qa_pager.py [deleted file]
gr-pager/src/run_tests.in [deleted file]
gr-pager/swig/.gitignore [new file with mode: 0644]
gr-pager/swig/Makefile.am [new file with mode: 0644]
gr-pager/swig/Makefile.swig.gen [new file with mode: 0644]
gr-pager/swig/pager_flex_deinterleave.i [new file with mode: 0644]
gr-pager/swig/pager_flex_frame.i [new file with mode: 0644]
gr-pager/swig/pager_flex_parse.i [new file with mode: 0644]
gr-pager/swig/pager_flex_sync.i [new file with mode: 0644]
gr-pager/swig/pager_slicer_fb.i [new file with mode: 0644]
gr-pager/swig/pager_swig.i [new file with mode: 0644]
run_tests.sh.in

index 8b49321946807ee3378255ac3b57c6c1e70b757a..3f36dfffb784f007c58cfe232cdd730a85f4a8d7 100644 (file)
@@ -1,4 +1,4 @@
-dnl Copyright 2001,2002,2003,2004,2005,2006,2008 Free Software Foundation, Inc.
+dnl Copyright 2006,2008,2009 Free Software Foundation, Inc.
 dnl 
 dnl This file is part of GNU Radio
 dnl 
@@ -27,12 +27,14 @@ AC_DEFUN([GRC_GR_PAGER],[
         gr-pager/Makefile \
        gr-pager/gnuradio-pager.pc \
        gr-pager/apps/Makefile \
-        gr-pager/src/Makefile \
-        gr-pager/src/run_tests
+        gr-pager/lib/Makefile \
+       gr-pager/python/Makefile \
+       gr-pager/python/run_tests \
+       gr-pager/swig/Makefile \
     ])
 
     GRC_BUILD_CONDITIONAL(gr-pager,[
         dnl run_tests is created from run_tests.in.  Make it executable.
-        AC_CONFIG_COMMANDS([run_tests_pager], [chmod +x gr-pager/src/run_tests])
+        AC_CONFIG_COMMANDS([run_tests_pager], [chmod +x gr-pager/python/run_tests])
     ])
 ])
index 984e6479868d20a57082670a4c7868aa924dea2a..c302cd5df6ec7e7ddec60f88dd033be69229d496 100644 (file)
 
 include $(top_srcdir)/Makefile.common
 
-SUBDIRS = src
+SUBDIRS = lib
 
 if PYTHON
-SUBDIRS += apps
+SUBDIRS += swig python apps
 endif
 
 pkgconfigdir = $(libdir)/pkgconfig
diff --git a/gr-pager/lib/.gitignore b/gr-pager/lib/.gitignore
new file mode 100644 (file)
index 0000000..1b6114c
--- /dev/null
@@ -0,0 +1,4 @@
+/.libs
+/.deps
+/Makefile
+/Makefile.in
diff --git a/gr-pager/lib/Makefile.am b/gr-pager/lib/Makefile.am
new file mode 100644 (file)
index 0000000..42053eb
--- /dev/null
@@ -0,0 +1,55 @@
+#
+# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+include $(top_srcdir)/Makefile.common
+
+EXTRA_DIST = run_tests.in
+
+AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) $(WITH_INCLUDES)
+
+# These headers get installed in ${prefix}/include/gnuradio
+grinclude_HEADERS = \
+       pager_slicer_fb.h \
+       pager_flex_sync.h \
+       pager_flex_deinterleave.h \
+       pager_flex_parse.h \
+       pager_flex_frame.h \
+       pageri_bch3221.h \
+       pageri_flex_modes.h \
+       pageri_util.h
+
+lib_LTLIBRARIES = libgnuradio-pager.la
+
+libgnuradio_pager_la_SOURCES = \
+       pager_flex_frame.cc \
+       pager_slicer_fb.cc \
+       pager_flex_sync.cc \
+       pager_flex_deinterleave.cc \
+       pager_flex_parse.cc \
+       pageri_bch3221.cc \
+       pageri_flex_modes.cc \
+       pageri_util.cc
+
+libgnuradio_pager_la_LIBADD =  \
+       $(GNURADIO_CORE_LA)
+
+libgnuradio_pager_la_LDFLAGS = \
+       $(NO_UNDEFINED)
diff --git a/gr-pager/lib/Makefile.swig.gen b/gr-pager/lib/Makefile.swig.gen
new file mode 100644 (file)
index 0000000..5cfbc66
--- /dev/null
@@ -0,0 +1,259 @@
+# -*- Makefile -*-
+#
+# Copyright 2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+# Makefile.swig.gen for pager_swig.i
+
+## Default install locations for these files:
+##
+## Default location for the Python directory is:
+##  ${prefix}/lib/python${python_version}/site-packages/[category]/pager_swig
+## Default location for the Python exec directory is:
+##  ${exec_prefix}/lib/python${python_version}/site-packages/[category]/pager_swig
+##
+## The following can be overloaded to change the install location, but
+## this has to be done in the including Makefile.am -before-
+## Makefile.swig is included.
+
+pager_swig_pythondir_category ?= gnuradio/pager_swig
+pager_swig_pylibdir_category ?= $(pager_swig_pythondir_category)
+pager_swig_pythondir = $(pythondir)/$(pager_swig_pythondir_category)
+pager_swig_pylibdir = $(pyexecdir)/$(pager_swig_pylibdir_category)
+
+## SWIG headers are always installed into the same directory.
+
+pager_swig_swigincludedir = $(swigincludedir)
+
+## This is a template file for a "generated" Makefile addition (in
+## this case, "Makefile.swig.gen").  By including the top-level
+## Makefile.swig, this file will be used to generate the SWIG
+## dependencies.  Assign the variable TOP_SWIG_FILES to be the list of
+## SWIG .i files to generated wrappings for; there can be more than 1
+## so long as the names are unique (no sorting is done on the
+## TOP_SWIG_FILES list). This file explicitly assumes that a SWIG .i
+## file will generate .cc, .py, and possibly .h files -- meaning that
+## all of these files will have the same base name (that provided for
+## the SWIG .i file).
+##
+## This code is setup to ensure parallel MAKE ("-j" or "-jN") does the
+## right thing.  For more info, see <
+## http://sources.redhat.com/automake/automake.html#Multiple-Outputs >
+
+## Stamps used to ensure parallel make does the right thing.  These
+## are removed by "make clean", but otherwise unused except during the
+## parallel built.  These will not be included in a tarball, because
+## the SWIG-generated files will be removed from the distribution.
+
+STAMPS += $(DEPDIR)/pager_swig-generate-*
+
+## Other cleaned files: dependency files generated by SWIG or this Makefile
+
+MOSTLYCLEANFILES += $(DEPDIR)/*.S*
+
+## Add the .py and .cc files to the list of SWIG built sources.  The
+## .h file is sometimes built, but not always ... so that one has to
+## be added manually by the including Makefile.am .
+
+swig_built_sources += pager_swig.py pager_swig.cc
+
+## Various SWIG variables.  These can be overloaded in the including
+## Makefile.am by setting the variable value there, then including
+## Makefile.swig .
+
+pager_swig_swiginclude_HEADERS =               \
+       pager_swig.i                    \
+       $(pager_swig_swiginclude_headers)
+
+pager_swig_pylib_LTLIBRARIES =         \
+       _pager_swig.la
+
+_pager_swig_la_SOURCES =                       \
+       pager_swig.cc                   \
+       $(pager_swig_la_swig_sources)
+
+_pager_swig_la_LIBADD =                        \
+       $(STD_SWIG_LA_LIB_ADD)          \
+       $(pager_swig_la_swig_libadd)
+
+_pager_swig_la_LDFLAGS =                       \
+       $(STD_SWIG_LA_LD_FLAGS)         \
+       $(pager_swig_la_swig_ldflags)
+
+_pager_swig_la_CXXFLAGS =                      \
+       $(STD_SWIG_CXX_FLAGS)           \
+       $(pager_swig_la_swig_cxxflags)
+
+pager_swig_python_PYTHON =                     \
+       pager_swig.py                   \
+       $(pager_swig_python)
+
+## Entry rule for running SWIG
+
+pager_swig.h pager_swig.py pager_swig.cc: pager_swig.i
+## This rule will get called only when MAKE decides that one of the
+## targets needs to be created or re-created, because:
+##
+## * The .i file is newer than any or all of the generated files;
+##
+## * Any or all of the .cc, .h, or .py files does not exist and is
+##   needed (in the case this file is not needed, the rule for it is
+##   ignored); or
+##
+## * Some SWIG-based dependecy of the .cc file isn't met and hence the
+##   .cc file needs be be regenerated.  Explanation: Because MAKE
+##   knows how to handle dependencies for .cc files (regardless of
+##   their name or extension), then the .cc file is used as a target
+##   instead of the .i file -- but with the dependencies of the .i
+##   file.  It is this last reason why the line:
+##
+##             if test -f $@; then :; else
+##
+##   cannot be used in this case: If a .i file dependecy is not met,
+##   then the .cc file needs to be rebuilt.  But if the stamp is newer
+##   than the .cc file, and the .cc file exists, then in the original
+##   version (with the 'test' above) the internal MAKE call will not
+##   be issued and hence the .cc file will not be rebuilt.
+##
+## Once execution gets to here, it should always proceed no matter the
+## state of a stamp (as discussed in link above).  The
+## $(DEPDIR)/pager_swig-generate stuff is used to allow for parallel
+## builds to "do the right thing".  The stamp has no relationship with
+## either the target files or dependency file; it is used solely for
+## the protection of multiple builds during a given call to MAKE.
+##
+## Catch signals SIGHUP (1), SIGINT (2), SIGPIPE (13), and SIGTERM
+## (15).  At a caught signal, the quoted command will be issued before
+## exiting.  In this case, remove any stamp, whether temporary of not.
+## The trap is valid until the process exits; the process includes all
+## commands appended via "\"s.
+##
+       trap 'rm -rf $(DEPDIR)/pager_swig-generate-*' 1 2 13 15; \
+##
+## Create a temporary directory, which acts as a lock.  The first
+## process to create the directory will succeed and issue the MAKE
+## command to do the actual work, while all subsequent processes will
+## fail -- leading them to wait for the first process to finish.
+##
+       if mkdir $(DEPDIR)/pager_swig-generate-lock 2>/dev/null; then \
+##
+## This code is being executed by the first process to succeed in
+## creating the directory lock.
+##
+## Remove the stamp associated with this filename.
+##
+               rm -f $(DEPDIR)/pager_swig-generate-stamp; \
+##
+## Tell MAKE to run the rule for creating this stamp.
+##
+               $(MAKE) $(AM_MAKEFLAGS) $(DEPDIR)/pager_swig-generate-stamp WHAT=$<; \
+##
+## Now that the .cc, .h, and .py files have been (re)created from the
+## .i file, future checking of this rule during the same MAKE
+## execution will come back that the rule doesn't need to be executed
+## because none of the conditions mentioned at the start of this rule
+## will be positive.  Remove the the directory lock, which frees up
+## any waiting process(es) to continue.
+##
+               rmdir $(DEPDIR)/pager_swig-generate-lock; \
+       else \
+##
+## This code is being executed by any follower processes while the
+## directory lock is in place.
+##
+## Wait until the first process is done, testing once per second.
+##
+               while test -d $(DEPDIR)/pager_swig-generate-lock; do \
+                       sleep 1; \
+               done; \
+##
+## Succeed if and only if the first process succeeded; exit this
+## process returning the status of the generated stamp.
+##
+               test -f $(DEPDIR)/pager_swig-generate-stamp; \
+               exit $$?; \
+       fi;
+
+$(DEPDIR)/pager_swig-generate-stamp:
+## This rule will be called only by the first process issuing the
+## above rule to succeed in creating the lock directory, after
+## removing the actual stamp file in order to guarantee that MAKE will
+## execute this rule.
+##
+## Call SWIG to generate the various output files; special
+## post-processing on 'mingw32' host OS for the dependency file.
+##
+       if $(SWIG) $(STD_SWIG_PYTHON_ARGS) $(pager_swig_swig_args) \
+               -MD -MF $(DEPDIR)/pager_swig.Std \
+               -module pager_swig -o pager_swig.cc $(WHAT); then \
+           if test $(host_os) = mingw32; then \
+               $(RM) $(DEPDIR)/pager_swig.Sd; \
+               $(SED) 's,\\\\,/,g' < $(DEPDIR)/pager_swig.Std \
+                       > $(DEPDIR)/pager_swig.Sd; \
+               $(RM) $(DEPDIR)/pager_swig.Std; \
+               $(MV) $(DEPDIR)/pager_swig.Sd $(DEPDIR)/pager_swig.Std; \
+           fi; \
+       else \
+           $(RM) $(DEPDIR)/pager_swig.S*; exit 1; \
+       fi;
+##
+## Mess with the SWIG output .Std dependency file, to create a
+## dependecy file valid for the input .i file: Basically, simulate the
+## dependency file created for libraries by GNU's libtool for C++,
+## where all of the dependencies for the target are first listed, then
+## each individual dependency is listed as a target with no further
+## dependencies.
+##
+## (1) remove the current dependency file
+##
+       $(RM) $(DEPDIR)/pager_swig.d
+##
+## (2) Copy the whole SWIG file:
+##
+       cp $(DEPDIR)/pager_swig.Std $(DEPDIR)/pager_swig.d
+##
+## (3) all a carriage return to the end of the dependency file.
+##
+       echo "" >> $(DEPDIR)/pager_swig.d
+##
+## (4) from the SWIG file, remove the first line (the target); remove
+##     trailing " \" and " " from each line.  Append ":" to each line,
+##     followed by 2 carriage returns, then append this to the end of
+##     the dependency file.
+##
+       $(SED) -e '1d;s, \\,,g;s, ,,g' < $(DEPDIR)/pager_swig.Std | \
+               awk '{ printf "%s:\n\n", $$0 }' >> $(DEPDIR)/pager_swig.d
+##
+## (5) remove the SWIG-generated file
+##
+       $(RM) $(DEPDIR)/pager_swig.Std
+##
+## Create the stamp for this filename generation, to signal success in
+## executing this rule; allows other threads waiting on this process
+## to continue.
+##
+       touch $(DEPDIR)/pager_swig-generate-stamp
+
+# KLUDGE: Force runtime include of a SWIG dependency file.  This is
+# not guaranteed to be portable, but will probably work.  If it works,
+# we have accurate dependencies for our swig stuff, which is good.
+
+@am__include@ @am__quote@./$(DEPDIR)/pager_swig.d@am__quote@
+
diff --git a/gr-pager/lib/pager_flex_deinterleave.cc b/gr-pager/lib/pager_flex_deinterleave.cc
new file mode 100644 (file)
index 0000000..25ea22e
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2004,2006 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 <pager_flex_deinterleave.h>
+#include <pageri_bch3221.h>
+#include <pageri_util.h>
+#include <gr_io_signature.h>
+
+pager_flex_deinterleave_sptr pager_make_flex_deinterleave()
+{
+    return pager_flex_deinterleave_sptr(new pager_flex_deinterleave());
+}
+
+pager_flex_deinterleave::pager_flex_deinterleave() :
+    gr_sync_decimator("flex_deinterleave",
+    gr_make_io_signature(1, 1, sizeof(unsigned char)),
+    gr_make_io_signature(1, 1, sizeof(gr_int32)), 32)
+{
+    set_output_multiple(8); // One FLEX block at a time
+}
+
+int pager_flex_deinterleave::work(int noutput_items,
+    gr_vector_const_void_star &input_items,
+    gr_vector_void_star &output_items)
+{
+    const unsigned char *in = (const unsigned char *)input_items[0];
+    gr_int32 *out = (gr_int32 *)output_items[0];    
+
+    // FLEX codewords are interleaved in blocks of 256 bits or 8, 32 bit
+    // codes.  To deinterleave we parcel each incoming bit into the MSB
+    // of each codeword, then switch to MSB-1, etc.  This is done by shifting
+    // in the bits from the right on each codeword as the bits come in.
+    // When we are done we have a FLEX block of eight codewords, ready for
+    // conversion to data words.
+    //
+    // FLEX data words are recovered by reversing the bit order of the code
+    // word, masking off the (reversed) ECC, and inverting the remainder of 
+    // the bits (!).
+    //
+    // The data portion of a FLEX frame consists of 11 of these deinterleaved
+    // and converted blocks.
+    //
+    // set_output_multiple garauntees we have output space for at least
+    // eight data words, and 256 bits are supplied on input
+
+    int i, j;
+    for (i = 0; i < 32; i++) {
+       for (j = 0; j < 8; j++) {
+           d_codewords[j] <<= 1;
+           d_codewords[j]  |= *in++;
+       }
+    }
+
+    // Now convert code words into data words  
+    for (j = 0; j < 8; j++) {
+       gr_int32 codeword = d_codewords[j];
+       
+       // Apply BCH 32,21 error correction
+       // TODO: mark dataword when codeword fails ECC
+       pageri_bch3221(codeword);
+       
+       // Reverse bit order
+       codeword = pageri_reverse_bits32(codeword);
+
+       // Mask off ECC then invert lower 21 bits
+       codeword = (codeword & 0x001FFFFF)^0x001FFFFF;
+
+       *out++ = codeword;
+    }
+    
+    return j;
+}
diff --git a/gr-pager/lib/pager_flex_deinterleave.h b/gr-pager/lib/pager_flex_deinterleave.h
new file mode 100644 (file)
index 0000000..7211a71
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2006 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_PAGER_FLEX_DEINTERLEAVE_H
+#define INCLUDED_PAGER_FLEX_DEINTERLEAVE_H
+
+#include <gr_sync_decimator.h>
+
+class pager_flex_deinterleave;
+typedef boost::shared_ptr<pager_flex_deinterleave> pager_flex_deinterleave_sptr;
+
+pager_flex_deinterleave_sptr pager_make_flex_deinterleave();
+
+/*!
+ * \brief flex deinterleave description
+ * \ingroup pager_blk
+ */
+
+class pager_flex_deinterleave : public gr_sync_decimator
+{
+private:
+    // Constructors
+    friend pager_flex_deinterleave_sptr pager_make_flex_deinterleave();
+    pager_flex_deinterleave();
+
+    // One FLEX block of deinterleaved data
+    gr_int32 d_codewords[8];
+   
+public:
+
+    int work(int noutput_items,
+             gr_vector_const_void_star &input_items, 
+             gr_vector_void_star &output_items);
+};
+
+#endif /* INCLUDED_PAGER_FLEX_DEINTERLEAVE_H */
diff --git a/gr-pager/lib/pager_flex_frame.cc b/gr-pager/lib/pager_flex_frame.cc
new file mode 100644 (file)
index 0000000..b707dbb
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2006 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 <pager_flex_frame.h>
+
+pager_flex_frame_sptr pager_make_flex_frame()
+{
+    return pager_flex_frame_sptr(new pager_flex_frame());
+}
+
+pager_flex_frame::pager_flex_frame()
+{
+}
+
+pager_flex_frame::~pager_flex_frame()
+{
+}
diff --git a/gr-pager/lib/pager_flex_frame.h b/gr-pager/lib/pager_flex_frame.h
new file mode 100644 (file)
index 0000000..1f4999e
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2006 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_PAGER_FLEX_FRAME_H
+#define INCLUDED_PAGER_FLEX_FRAME_H
+
+#include <boost/shared_ptr.hpp>
+
+class pager_flex_frame;
+typedef boost::shared_ptr<pager_flex_frame> pager_flex_frame_sptr;
+
+/*!
+ * \brief public constructor for pager_flex_frame
+ */
+pager_flex_frame_sptr pager_make_flex_frame();
+
+/*!
+ * \brief flex_frame.
+ */
+class pager_flex_frame {
+    // Constructor is private to force use of shared_ptr
+    pager_flex_frame();
+    friend pager_flex_frame_sptr pager_make_flex_frame();
+
+public:
+    ~pager_flex_frame();
+};
+
+#endif /* INCLUDED_PAGER_FLEX_FRAME_H */
diff --git a/gr-pager/lib/pager_flex_parse.cc b/gr-pager/lib/pager_flex_parse.cc
new file mode 100644 (file)
index 0000000..0819294
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2004,2006,2007 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 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 <pager_flex_parse.h>
+#include <pageri_bch3221.h>
+#include <gr_io_signature.h>
+#include <ctype.h>
+#include <iostream>
+#include <iomanip>
+
+pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq)
+{
+    return pager_flex_parse_sptr(new pager_flex_parse(queue, freq));
+}
+
+pager_flex_parse::pager_flex_parse(gr_msg_queue_sptr queue, float freq) :
+    gr_sync_block("flex_parse",
+    gr_make_io_signature(1, 1, sizeof(gr_int32)),
+    gr_make_io_signature(0, 0, 0)),
+    d_queue(queue),
+    d_freq(freq)
+{
+    d_count = 0;
+}
+
+int pager_flex_parse::work(int noutput_items,
+    gr_vector_const_void_star &input_items,
+    gr_vector_void_star &output_items)
+{
+    const gr_int32 *in = (const gr_int32 *)input_items[0];
+    
+    int i = 0;
+    while (i < noutput_items) {
+       // Accumulate one whole frame's worth of data words (88 of them)
+       d_datawords[d_count] = *in++; i++;
+       if (++d_count == 88) {
+           parse_data();
+           d_count = 0;
+       }
+    }
+
+    return i;
+}
+
+/* FLEX data frames (that is, 88 data words per phase recovered after sync,
+   symbol decoding, dephasing, deinterleaving, error correction, and conversion
+   from codewords to data words) start with a block information word containing
+   indices of the page address field and page vector fields.
+*/
+
+void pager_flex_parse::parse_capcode(gr_int32 aw1, gr_int32 aw2)
+{
+    d_laddr = (aw1 < 0x008001L) ||
+              (aw1 > 0x1E0000L) ||
+             (aw1 > 0x1E7FFEL);        
+    
+    if (d_laddr)
+        d_capcode = aw1+((aw2^0x001FFFFF)<<15)+0x1F9000;  // Don't ask
+    else
+        d_capcode = aw1-0x8000;
+}
+
+void pager_flex_parse::parse_data()
+{
+    // Block information word is the first data word in frame
+    gr_int32 biw = d_datawords[0];
+
+    // Nothing to see here, please move along
+    if (biw == 0 || biw == 0x001FFFFF)
+       return;
+
+    // Vector start index is bits 15-10
+    // Address start address is bits 9-8, plus one for offset
+    int voffset = (biw >> 10) & 0x3f;
+    int aoffset = ((biw >> 8) & 0x03) + 1;
+    
+    //printf("BIW:%08X AW:%02i-%02i\n", biw, aoffset, voffset);
+
+    // Iterate through pages and dispatch to appropriate handler
+    for (int i = aoffset; i < voffset; i++) {
+       int j = voffset+i-aoffset;              // Start of vector field for address @ i
+
+       if (d_datawords[i] == 0x00000000 ||
+           d_datawords[i] == 0x001FFFFF)
+           continue;                           // Idle codewords, invalid address
+
+       parse_capcode(d_datawords[i], d_datawords[i+1]);
+        if (d_laddr)
+           i++;
+                           
+        if (d_capcode < 0)                     // Invalid address, skip
+          continue;        
+
+        // Parse vector information word for address @ offset 'i'
+       gr_int32 viw = d_datawords[j];
+       d_type = (page_type_t)((viw >> 4) & 0x00000007);
+       int mw1 = (viw >> 7) & 0x00000007F;
+       int len = (viw >> 14) & 0x0000007F;
+
+       if (is_numeric_page(d_type))
+            len &= 0x07;
+        int mw2 = mw1+len;
+           
+       if (mw1 == 0 && mw2 == 0)
+           continue;                           // Invalid VIW
+
+       if (is_tone_page(d_type))
+           mw1 = mw2 = 0;
+
+       if (mw1 > 87 || mw2 > 87)
+           continue;                           // Invalid offsets
+
+       d_payload.str("");
+       d_payload.setf(std::ios::showpoint);
+       d_payload << std::setprecision(6) << std::setw(7)
+                 << d_freq/1e6 << FIELD_DELIM 
+                 << std::setw(10) << d_capcode << FIELD_DELIM
+                 << flex_page_desc[d_type] << FIELD_DELIM;
+
+       if (is_alphanumeric_page(d_type))
+           parse_alphanumeric(mw1, mw2-1, j);
+       else if (is_numeric_page(d_type))
+           parse_numeric(mw1, mw2, j);
+       else if (is_tone_page(d_type))
+           parse_tone_only();
+       else
+           parse_unknown(mw1, mw2);
+
+       gr_message_sptr msg = gr_make_message_from_string(std::string(d_payload.str()));
+       d_queue->handle(msg);
+    }
+}
+
+void pager_flex_parse::parse_alphanumeric(int mw1, int mw2, int j)
+{
+    int frag;
+    bool cont;
+
+    if (!d_laddr) {
+       frag = (d_datawords[mw1] >> 11) & 0x03;
+       cont = (d_datawords[mw1] >> 10) & 0x01;
+       mw1++;
+    }
+    else {
+       frag = (d_datawords[j+1] >> 11) & 0x03;
+       cont = (d_datawords[j+1] >> 10) & 0x01;
+       mw2--;
+    }    
+
+    //d_payload << frag << FIELD_DELIM;
+    //d_payload << cont << FIELD_DELIM;
+
+    for (int i = mw1; i <= mw2; i++) {
+       gr_int32 dw = d_datawords[i];
+       unsigned char ch;
+       
+       if (i > mw1 || frag != 0x03) {
+           ch = dw & 0x7F;
+           if (ch != 0x03)
+               d_payload << ch;
+       }
+       
+       ch = (dw >> 7) & 0x7F;
+       if (ch != 0x03) // Fill
+           d_payload << ch;
+               
+       ch = (dw >> 14) & 0x7F;
+       if (ch != 0x03) // Fill
+           d_payload << ch;
+    }
+}
+
+void pager_flex_parse::parse_numeric(int mw1, int mw2, int j)
+{
+    // Get first dataword from message field or from second
+    // vector word if long address
+    gr_int32 dw;
+    if (!d_laddr) {
+       dw = d_datawords[mw1];
+       mw1++;
+       mw2++;
+    }
+    else {
+       dw = d_datawords[j+1];
+    }
+
+    unsigned char digit = 0;
+    int count = 4;
+    if (d_type == FLEX_NUMBERED_NUMERIC)
+       count += 10;    // Skip 10 header bits for numbered numeric pages
+    else
+       count += 2;     // Otherwise skip 2
+    
+    for (int i = mw1; i <= mw2; i++) {
+       for (int k = 0; k < 21; k++) {
+           // Shift LSB from data word into digit
+           digit = (digit >> 1) & 0x0F;
+           if (dw & 0x01)
+               digit ^= 0x08;
+           dw >>= 1;
+           if (--count == 0) {
+               if (digit != 0x0C) // Fill
+                    d_payload << flex_bcd[digit];
+               count = 4;
+           }
+       }
+       
+       dw = d_datawords[i];
+    }
+}
+
+void pager_flex_parse::parse_tone_only()
+{
+}
+
+void pager_flex_parse::parse_unknown(int mw1, int mw2)
+{
+}
diff --git a/gr-pager/lib/pager_flex_parse.h b/gr-pager/lib/pager_flex_parse.h
new file mode 100644 (file)
index 0000000..0f7cfb3
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2006 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_PAGER_FLEX_PARSE_H
+#define INCLUDED_PAGER_FLEX_PARSE_H
+
+#include <gr_sync_block.h>
+#include <gr_msg_queue.h>
+#include <pageri_flex_modes.h>
+#include <sstream>
+
+class pager_flex_parse;
+typedef boost::shared_ptr<pager_flex_parse> pager_flex_parse_sptr;
+
+pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq);
+
+#define FIELD_DELIM ((unsigned char)128)
+
+/*!
+ * \brief flex parse description
+ * \ingroup pager_blk
+ */
+class pager_flex_parse : public gr_sync_block
+{
+private:
+    // Constructors
+    friend pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq);
+    pager_flex_parse(gr_msg_queue_sptr queue, float freq);
+
+    std::ostringstream d_payload;
+    gr_msg_queue_sptr d_queue;           // Destination for decoded pages
+
+    int d_count;                         // Count of received codewords
+    gr_int32 d_datawords[88];             // 11 blocks of 8 32-bit words
+
+    page_type_t d_type;                          // Current page type
+    int d_capcode;                       // Current page destination address
+    bool d_laddr;                        // Current page has long address
+    float d_freq;                        // Channel frequency
+    
+    void parse_data();                   // Handle a frame's worth of data
+    void parse_capcode(gr_int32 aw1, gr_int32 aw2);     
+    void parse_alphanumeric(int mw1, int mw2, int j);
+    void parse_numeric(int mw1, int mw2, int j);
+    void parse_tone_only();
+    void parse_unknown(int mw1, int mw2);
+    
+public:
+    int work(int noutput_items,
+        gr_vector_const_void_star &input_items, 
+        gr_vector_void_star &output_items);
+};
+
+#endif /* INCLUDED_PAGER_FLEX_PARSE_H */
diff --git a/gr-pager/lib/pager_flex_sync.cc b/gr-pager/lib/pager_flex_sync.cc
new file mode 100644 (file)
index 0000000..6bcee8e
--- /dev/null
@@ -0,0 +1,340 @@
+/*
+ * Copyright 2004,2006 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 <pager_flex_sync.h>
+#include <pageri_flex_modes.h>
+#include <pageri_bch3221.h>
+#include <pageri_util.h>
+#include <gr_io_signature.h>
+#include <gr_count_bits.h>
+#include <cstdio>
+
+pager_flex_sync_sptr pager_make_flex_sync()
+{
+    return pager_flex_sync_sptr(new pager_flex_sync());
+}
+
+// FLEX sync block takes input from sliced baseband stream [0-3] at specified 
+// channel rate.  Symbol timing is established based on receiving one of the
+// defined FLEX protocol synchronization words.  The block outputs one FLEX frame
+// worth of bits on each output phase for the data portion of the frame. Unused phases
+// get all zeros, which are considered idle code words.
+
+pager_flex_sync::pager_flex_sync() :
+    gr_block ("flex_sync",
+    gr_make_io_signature (1, 1, sizeof(unsigned char)),
+    gr_make_io_signature (4, 4, sizeof(unsigned char))),
+    d_sync(10) // Fixed at 10 samples per baud (@ 1600 baud)
+{
+    enter_idle();
+}
+
+void pager_flex_sync::forecast(int noutput_items, gr_vector_int &inputs_required)
+{
+    // samples per bit X number of outputs needed
+    int items = noutput_items*d_spb;
+    for (unsigned int i = 0; i < inputs_required.size(); i++)
+        inputs_required[i] = items;
+}
+
+int pager_flex_sync::index_avg(int start, int end)
+{
+    // modulo average
+    if (start < end)
+        return (end + start)/2;
+    else
+        return ((end + start)/2 + d_spb/2) % d_spb;
+}
+
+bool pager_flex_sync::test_sync(unsigned char sym)
+{
+    // 64-bit FLEX sync code:
+    // AAAA:BBBBBBBB:CCCC
+    //
+    // Where BBBBBBBB is always 0xA6C6AAAA
+    // and AAAA^CCCC is 0xFFFF
+    // 
+    // Specific values of AAAA determine what bps and encoding the
+    // packet is beyond the frame information word
+    //
+    // First we match on the marker field with a hamming distance < 4
+    // Then we match on the outer code with a hamming distance < 4
+
+    d_sync[d_index] = (d_sync[d_index] << 1) | (sym < 2);
+    gr_int64 val = d_sync[d_index];
+    gr_int32 marker = ((val & 0x0000FFFFFFFF0000ULL)) >> 16;
+
+    if (gr_count_bits32(marker^FLEX_SYNC_MARKER) < 4) {
+        gr_int32 code = ((val & 0xFFFF000000000000ULL) >> 32) |
+                         (val & 0x000000000000FFFFULL);
+
+        for (int i = 0; i < num_flex_modes; i++) {
+            if (gr_count_bits32(code^flex_modes[i].sync) < 4) {
+                d_mode = i;
+                return true;
+            }
+        }
+
+        // Marker received but doesn't match known codes
+        // All codes have high word inverted to low word
+        unsigned short high = (code & 0xFFFF0000) >> 16;
+        unsigned short low = code & 0x0000FFFF;
+        unsigned short syn = high^low;
+        if (syn == 0xFFFF)
+            fprintf(stderr, "Unknown sync code detected: %08X\n", code);
+    }
+
+    return false;
+}
+
+void pager_flex_sync::enter_idle()
+{
+    d_state = ST_IDLE;
+    d_index = 0;
+    d_start = 0;
+    d_center = 0;
+    d_end = 0;
+    d_count = 0;
+    d_mode = 0;
+    d_baudrate = 1600;
+    d_levels = 2;
+    d_spb = 16000/d_baudrate;
+    d_bit_a = 0;
+    d_bit_b = 0;
+    d_bit_c = 0;
+    d_bit_d = 0;
+    d_hibit = false;
+    fflush(stdout);
+}
+
+void pager_flex_sync::enter_syncing()
+{
+    d_start = d_index;
+    d_state = ST_SYNCING;
+}
+
+void pager_flex_sync::enter_sync1()
+{
+    d_state = ST_SYNC1;
+    d_end = d_index;
+    d_center = index_avg(d_start, d_end); // Center of goodness
+    d_count = 0;
+}
+
+void pager_flex_sync::enter_sync2()
+{
+    d_state = ST_SYNC2;
+    d_count = 0;
+    d_baudrate = flex_modes[d_mode].baud;
+    d_levels = flex_modes[d_mode].levels;
+    d_spb = 16000/d_baudrate;
+
+    if (d_baudrate == 3200) {
+        // Oversampling buffer just got halved
+        d_center = d_center/2;
+
+       // We're here at the center of a 1600 baud bit
+       // So this hack puts the index and bit counter
+       // in the right place for 3200 bps.
+        d_index = d_index/2-d_spb/2;         
+       d_count = -1;                
+    }                               
+}
+
+void pager_flex_sync::enter_data()
+{
+    d_state = ST_DATA;
+    d_count = 0;
+}
+
+void pager_flex_sync::parse_fiw()
+{
+    // Nothing is done with these now, but these will end up getting
+    // passed as metadata when mblocks are available
+
+    // Bits 31-28 are frame number related, but unknown function
+    // This might be a checksum
+    d_unknown2 = pageri_reverse_bits8((d_fiw >> 24) & 0xF0);
+       
+    // Cycle is bits 27-24, reversed
+    d_cycle = pageri_reverse_bits8((d_fiw >> 20) & 0xF0);
+
+    // Frame is bits 23-17, reversed
+    d_frame = pageri_reverse_bits8((d_fiw >> 16) & 0xFE);
+
+    // Bits 16-11 are some sort of marker, usually identical across
+    // many frames but sometimes changes between frames or modes
+    d_unknown1 = (d_fiw >> 11) & 0x3F;
+
+    //printf("CYC:%02i FRM:%03i\n", d_cycle, d_frame);
+}
+
+int pager_flex_sync::output_symbol(unsigned char sym)
+{
+    // Here is where we output a 1 or 0 on each phase according
+    // to current FLEX mode and symbol value.  Unassigned phases
+    // are zero from the enter_idle() initialization.
+    //
+    // FLEX can transmit the data portion of the frame at either
+    // 1600 bps or 3200 bps, and can use either two- or four-level
+    // FSK encoding.
+    //
+    // At 1600 bps, 2-level, a single "phase" is transmitted with bit
+    // value '0' using level '3' and bit value '1' using level '0'.
+    //
+    // At 1600 bps, 4-level, a second "phase" is transmitted, and the 
+    // di-bits are encoded with a gray code:
+    //
+    // Symbol  Phase 1  Phase 2
+    // ------   -------  -------
+    //   0         1        1
+    //   1         1        0
+    //   2         0        0
+    //   3         0        1
+    //
+    // At 1600 bps, 4-level, these are called PHASE A and PHASE B.
+    //
+    // At 3200 bps, the same 1 or 2 bit encoding occurs, except that
+    // additionally two streams are interleaved on alternating symbols.
+    // Thus, PHASE A (and PHASE B if 4-level) are decoded on one symbol,
+    // then PHASE C (and PHASE D if 4-level) are decoded on the next.
+    
+    int bits = 0;
+    
+    if (d_baudrate == 1600) {
+       d_bit_a = (sym < 2);
+       if (d_levels == 4)
+           d_bit_b = (sym == 0) || (sym == 3);
+
+       *d_phase_a++ = d_bit_a;
+       *d_phase_b++ = d_bit_b;
+       *d_phase_c++ = d_bit_c;
+       *d_phase_d++ = d_bit_d;
+       bits++;
+    }
+    else {
+       if (!d_hibit) {
+           d_bit_a = (sym < 2);
+           if (d_levels == 4)
+               d_bit_b = (sym == 0) || (sym == 3);
+           d_hibit = true;
+       }
+       else {
+           d_bit_c = (sym < 2);
+           if (d_levels == 4)
+               d_bit_d = (sym == 0) || (sym == 3);
+           d_hibit = false;
+
+           *d_phase_a++ = d_bit_a;
+           *d_phase_b++ = d_bit_b;
+           *d_phase_c++ = d_bit_c;
+           *d_phase_d++ = d_bit_d;
+           bits++;
+       }
+    }
+
+    return bits;
+}
+
+int pager_flex_sync::general_work(int noutput_items,
+    gr_vector_int &ninput_items,
+    gr_vector_const_void_star &input_items,
+    gr_vector_void_star &output_items)
+{
+    const unsigned char *in = (const unsigned char *)input_items[0];
+    d_phase_a = (unsigned char *)output_items[0];
+    d_phase_b = (unsigned char *)output_items[1];
+    d_phase_c = (unsigned char *)output_items[2];
+    d_phase_d = (unsigned char *)output_items[3];
+
+    int i = 0, j = 0;
+    int ninputs = ninput_items[0];
+
+    while (i < ninputs && j < noutput_items) {
+        unsigned char sym = *in++; i++;
+        d_index = ++d_index % d_spb;
+    
+        switch (d_state) {
+            case ST_IDLE:
+               // Continually compare the received symbol stream
+               // against the known FLEX sync words.
+                if (test_sync(sym))
+                    enter_syncing();
+                break;
+    
+            case ST_SYNCING:
+               // Wait until we stop seeing sync, then calculate
+               // the center of the bit period (d_center)
+                if (!test_sync(sym))
+                    enter_sync1();
+                break;
+    
+            case ST_SYNC1:
+               // Skip 16 bits of dotting, then accumulate 32 bits
+               // of Frame Information Word.
+                if (d_index == d_center) {
+                   d_fiw = (d_fiw << 1) | (sym > 1);
+                    if (++d_count == 48) {
+                       // FIW is accumulated, call BCH to error correct it
+                       pageri_bch3221(d_fiw);
+                       parse_fiw();
+                        enter_sync2();  
+                   }
+                }
+                break;
+    
+            case ST_SYNC2:
+               // This part and the remainder of the frame are transmitted
+               // at either 1600 bps or 3200 bps based on the received
+               // FLEX sync word. The second SYNC header is 25ms of idle bits
+               // at either speed.
+                if (d_index == d_center) {
+                    // Skip 25 ms = 40 bits @ 1600 bps, 80 @ 3200 bps
+                    if (++d_count == d_baudrate/40)
+                        enter_data();
+                }
+                break;
+    
+            case ST_DATA:
+               // The data portion of the frame is 1760 ms long at either 
+               // baudrate.  This is 2816 bits @ 1600 bps and 5632 bits @ 3200 bps.
+               // The output_symbol() routine decodes and doles out the bits
+               // to each of the four transmitted phases of FLEX interleaved codes.
+                if (d_index == d_center) {
+                   j += output_symbol(sym);                
+                    if (++d_count == d_baudrate*1760/1000)
+                        enter_idle();
+               }
+                break;
+
+            default:
+                assert(0); // memory corruption of d_state if ever gets here
+                break;
+        }
+    }
+
+    consume_each(i);
+    return j;
+}
diff --git a/gr-pager/lib/pager_flex_sync.h b/gr-pager/lib/pager_flex_sync.h
new file mode 100644 (file)
index 0000000..b401bf5
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2006 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_PAGER_FLEX_SYNC_H
+#define INCLUDED_PAGER_FLEX_SYNC_H
+
+#include <gr_block.h>
+
+class pager_flex_sync;
+typedef boost::shared_ptr<pager_flex_sync> pager_flex_sync_sptr;
+typedef std::vector<gr_int64> gr_int64_vector;
+
+pager_flex_sync_sptr pager_make_flex_sync();
+
+/*!
+ * \brief flex sync description
+ * \ingroup pager_blk
+ */
+
+class pager_flex_sync : public gr_block
+{
+private:
+    // Constructors
+    friend pager_flex_sync_sptr pager_make_flex_sync();
+    pager_flex_sync();
+   
+    // State machine transitions
+    void enter_idle();
+    void enter_syncing();
+    void enter_sync1();
+    void enter_sync2();
+    void enter_data();
+
+    int index_avg(int start, int end);
+    bool test_sync(unsigned char sym);
+    void parse_fiw();
+    int output_symbol(unsigned char sym);    
+    
+    // Simple state machine
+    enum state_t { ST_IDLE, ST_SYNCING, ST_SYNC1, ST_SYNC2, ST_DATA };
+    state_t d_state;     
+
+    int d_index;    // Index into current baud
+    int d_start;    // Start of good sync 
+    int d_center;   // Center of bit
+    int d_end;      // End of good sync
+    int d_count;    // Bit counter
+
+    int d_mode;     // Current packet mode
+    int d_baudrate; // Current decoding baud rate
+    int d_levels;   // Current decoding levels
+    int d_spb;      // Current samples per baud
+    bool d_hibit;   // Alternating bit indicator for 3200 bps
+    
+    gr_int32 d_fiw; // Frame information word
+    int d_frame;    // Current FLEX frame
+    int d_cycle;    // Current FLEX cycle
+    int d_unknown1;
+    int d_unknown2;
+
+    unsigned char d_bit_a;
+    unsigned char d_bit_b;
+    unsigned char d_bit_c;
+    unsigned char d_bit_d;
+    
+    unsigned char *d_phase_a;  
+    unsigned char *d_phase_b;
+    unsigned char *d_phase_c;
+    unsigned char *d_phase_d;
+    
+    gr_int64_vector d_sync; // Trial synchronizers
+
+public:
+    void forecast(int noutput_items, gr_vector_int &inputs_required);
+
+    int general_work(int noutput_items,
+                     gr_vector_int &ninput_items,
+                     gr_vector_const_void_star &input_items, 
+                     gr_vector_void_star &output_items);
+};
+
+#endif /* INCLUDED_PAGER_FLEX_SYNC_H */
diff --git a/gr-pager/lib/pager_slicer_fb.cc b/gr-pager/lib/pager_slicer_fb.cc
new file mode 100644 (file)
index 0000000..d419db7
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2004,2006,2007 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 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 <pager_slicer_fb.h>
+#include <gr_io_signature.h>
+
+pager_slicer_fb_sptr pager_make_slicer_fb(float alpha)
+{
+    return pager_slicer_fb_sptr(new pager_slicer_fb(alpha));
+}
+
+pager_slicer_fb::pager_slicer_fb(float alpha) :
+    gr_sync_block ("slicer_fb",
+                   gr_make_io_signature (1, 1, sizeof(float)),
+                   gr_make_io_signature (1, 1, sizeof(unsigned char)))
+{
+    d_alpha = alpha;
+    d_beta = 1.0-alpha;
+    d_avg = 0.0;
+}
+
+// Tracks average, minimum, and peak, then converts input into one of:
+//
+// [0, 1, 2, 3]
+unsigned char pager_slicer_fb::slice(float sample)
+{
+    unsigned char decision;
+
+    // Update DC level and remove
+    d_avg = d_avg*d_beta+sample*d_alpha;
+    sample -= d_avg;
+
+    if (sample > 0) {
+        if (sample > 2.0)          
+            decision = 3;
+        else
+            decision = 2;
+    }
+    else {
+        if (sample < -2.0)
+            decision = 0;
+        else
+            decision = 1;
+    }
+
+    return decision;
+}
+
+int pager_slicer_fb::work(int noutput_items,
+                          gr_vector_const_void_star &input_items,
+                                 gr_vector_void_star &output_items)
+{
+    float *iptr = (float *) input_items[0];
+    unsigned char *optr = (unsigned char *) output_items[0];
+
+    int size = noutput_items;
+
+    for (int i = 0; i < size; i++)
+        *optr++ = slice(*iptr++);
+
+    return noutput_items;
+}
diff --git a/gr-pager/lib/pager_slicer_fb.h b/gr-pager/lib/pager_slicer_fb.h
new file mode 100644 (file)
index 0000000..75eea3c
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2006,2007 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 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_PAGER_SLICER_FB_H
+#define INCLUDED_PAGER_SLICER_FB_H
+
+#include <gr_sync_block.h>
+
+class pager_slicer_fb;
+typedef boost::shared_ptr<pager_slicer_fb> pager_slicer_fb_sptr;
+
+pager_slicer_fb_sptr pager_make_slicer_fb(float alpha);
+
+/*!
+ * \brief slicer description
+ * \ingroup pager_blk
+ */
+class pager_slicer_fb : public gr_sync_block
+{
+private:
+    friend pager_slicer_fb_sptr pager_make_slicer_fb(float alpha);
+    pager_slicer_fb(float alpha);
+
+    unsigned char slice(float sample);
+
+    float d_alpha;      // DC removal time constant
+    float d_beta;      // 1.0-d_alpha
+    float d_avg;        // Average value for DC offset subtraction
+
+public:
+    int work (int noutput_items,
+              gr_vector_const_void_star &input_items, 
+              gr_vector_void_star &output_items);
+
+    float dc_offset() const { return d_avg; }
+};
+
+#endif /* INCLUDED_PAGER_SLICER_FB_H */
diff --git a/gr-pager/lib/pageri_bch3221.cc b/gr-pager/lib/pageri_bch3221.cc
new file mode 100644 (file)
index 0000000..984ed4d
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2006 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 <pageri_bch3221.h>
+
+// Corrects supplied data word according to BCH3221 encoding and
+// returns the number of errors detected/corrected.
+//
+// Not implemented yet
+
+int pageri_bch3221(gr_int32 &data)
+{
+    return 0;
+}
diff --git a/gr-pager/lib/pageri_bch3221.h b/gr-pager/lib/pageri_bch3221.h
new file mode 100644 (file)
index 0000000..9dd2be8
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2006 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_PAGERI_BCH3221_H
+#define INCLUDED_PAGERI_BCH3221_H
+
+#include <gr_types.h>
+
+// Perform BCH (32,21) error correction on supplied data
+// Return number of errors found/corrected (0, 1, or 2)
+int pageri_bch3221(gr_int32 &data);
+
+#endif /* INCLUDED_PAGERI_BCH3221_H */
diff --git a/gr-pager/lib/pageri_flex_modes.cc b/gr-pager/lib/pageri_flex_modes.cc
new file mode 100644 (file)
index 0000000..4553e0b
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2006,2007 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 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 "pageri_flex_modes.h"
+
+const flex_mode_t flex_modes[] = 
+{
+    { 0x870C78F3, 1600, 2 },
+    { 0xB0684F97, 1600, 4 },
+//  { 0xUNKNOWN,  3200, 2 },
+    { 0xDEA0215F, 3200, 4 },
+    { 0x4C7CB383, 3200, 4 }
+};
+
+const int num_flex_modes = sizeof(flex_modes)/sizeof(flex_modes[0]);
+
+unsigned char flex_bcd[17] = "0123456789 U -][";
+
+const char *flex_page_desc[] =
+{
+    "ENC",
+    "UNK",
+    "TON",
+    "NUM",
+    "SPN",
+    "ALN",
+    "BIN",
+    "NNM"
+};
+
+int find_flex_mode(gr_int32 sync_code)
+{
+    for (int i = 0; i < num_flex_modes; i++)
+       if (flex_modes[i].sync == sync_code)
+           return i;
+       
+    // Not found
+    return -1;
+}
diff --git a/gr-pager/lib/pageri_flex_modes.h b/gr-pager/lib/pageri_flex_modes.h
new file mode 100644 (file)
index 0000000..bc53c12
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2006,2007 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 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_PAGERI_FLEX_MODES_H
+#define INCLUDED_PAGERI_FLEX_MODES_H
+
+#include <gr_types.h>
+
+#define FLEX_SYNC_MARKER 0xA6C6AAAA
+
+typedef struct flex_mode
+{
+    gr_int32     sync;          // Outer synchronization code
+    unsigned int baud;          // Baudrate of SYNC2 and DATA
+    unsigned int levels;        // FSK encoding of SYNC2 and DATA
+}
+flex_mode_t;
+
+extern const flex_mode_t flex_modes[];
+extern const char *flex_page_desc[];
+extern const int num_flex_modes;
+int find_flex_mode(gr_int32 sync_code);
+extern unsigned char flex_bcd[];
+
+typedef enum {
+    FLEX_SECURE,
+    FLEX_UNKNOWN,
+    FLEX_TONE,
+    FLEX_STANDARD_NUMERIC,
+    FLEX_SPECIAL_NUMERIC,
+    FLEX_ALPHANUMERIC,
+    FLEX_BINARY,
+    FLEX_NUMBERED_NUMERIC,
+    NUM_FLEX_PAGE_TYPES
+}
+page_type_t;
+
+inline bool is_alphanumeric_page(page_type_t type)
+{
+    return (type == FLEX_ALPHANUMERIC ||
+           type == FLEX_SECURE);
+}
+
+inline bool is_numeric_page(page_type_t type)
+{
+    return (type == FLEX_STANDARD_NUMERIC ||
+            type == FLEX_SPECIAL_NUMERIC  ||
+            type == FLEX_NUMBERED_NUMERIC);
+}
+
+inline bool is_tone_page(page_type_t type)
+{
+    return (type == FLEX_TONE);
+}
+
+#endif // INCLUDED_PAGERI_FLEX_MODES_H
diff --git a/gr-pager/lib/pageri_util.cc b/gr-pager/lib/pageri_util.cc
new file mode 100644 (file)
index 0000000..bdd0957
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2006 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 <pageri_util.h>
+
+unsigned char pageri_reverse_bits8(unsigned char val)
+{
+    // This method was attributed to Rich Schroeppel in the Programming 
+    // Hacks section of Beeler, M., Gosper, R. W., and Schroeppel, R. 
+    // HAKMEM. MIT AI Memo 239, Feb. 29, 1972.
+    //
+    // Reverses 8 bits in 5 machine operations with 64 bit arch
+    return (val * 0x0202020202ULL & 0x010884422010ULL) % 1023;
+}
+
+gr_int32 pageri_reverse_bits32(gr_int32 val)
+{
+    gr_int32 out = 0x00000000;
+    out |= (pageri_reverse_bits8((val >> 24) & 0x000000FF)      );
+    out |= (pageri_reverse_bits8((val >> 16) & 0x000000FF) <<  8);
+    out |= (pageri_reverse_bits8((val >>  8) & 0x000000FF) << 16);
+    out |= (pageri_reverse_bits8((val      ) & 0x000000FF) << 24);
+    return out;
+}
diff --git a/gr-pager/lib/pageri_util.h b/gr-pager/lib/pageri_util.h
new file mode 100644 (file)
index 0000000..78ae7aa
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2006 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_PAGERI_UTIL_H
+#define INCLUDED_PAGERI_UTIL_H
+
+#include <gr_types.h>
+
+unsigned char pageri_reverse_bits8(unsigned char val);
+gr_int32 pageri_reverse_bits32(gr_int32 val);
+
+#endif /* INCLUDED_PAGERI_UTIL_H */
diff --git a/gr-pager/python/.gitignore b/gr-pager/python/.gitignore
new file mode 100644 (file)
index 0000000..b336cc7
--- /dev/null
@@ -0,0 +1,2 @@
+/Makefile
+/Makefile.in
diff --git a/gr-pager/python/Makefile.am b/gr-pager/python/Makefile.am
new file mode 100644 (file)
index 0000000..f80375c
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+include $(top_srcdir)/Makefile.common
+
+if PYTHON
+pagerdir = $(grpythondir)/pager
+
+noinst_PYTHON = \
+       qa_pager.py
+
+pager_PYTHON = \
+       __init__.py \
+       pager_utils.py \
+       flex_demod.py
+
+TESTS = run_tests
+
+EXTRA_DIST = run_tests.in
+
+endif
diff --git a/gr-pager/python/__init__.py b/gr-pager/python/__init__.py
new file mode 100644 (file)
index 0000000..664b799
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# Copyright 2006 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.
+# 
+
+# The presence of this file turns this directory into a Python package
+
+from pager_swig import *
+from flex_demod import flex_demod
+from pager_utils import *
diff --git a/gr-pager/python/flex_demod.py b/gr-pager/python/flex_demod.py
new file mode 100644 (file)
index 0000000..b79c1ad
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# Copyright 2006,2007 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 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, gru, optfir, blks2
+from math import pi
+import pager_swig
+
+class flex_demod(gr.hier_block2):
+    """
+    FLEX pager protocol demodulation block.
+
+    This block demodulates a band-limited, complex down-converted baseband 
+    channel into FLEX protocol frames.
+
+    """
+
+    def __init__(self, queue, freq=0.0, verbose=False, log=False):
+       gr.hier_block2.__init__(self, "flex_demod",
+                               gr.io_signature(1, 1, gr.sizeof_gr_complex),
+                               gr.io_signature(0,0,0))
+
+        k = 25000/(2*pi*1600)        # 4800 Hz max deviation
+        quad = gr.quadrature_demod_cf(k)
+       self.connect(self, quad)
+       
+        rsamp = blks2.rational_resampler_fff(16, 25)
+        self.slicer = pager_swig.slicer_fb(5e-6) # DC removal averaging filter constant
+       self.sync = pager_swig.flex_sync()
+
+        self.connect(quad, rsamp, self.slicer, self.sync)
+
+       for i in range(4):
+           self.connect((self.sync, i), pager_swig.flex_deinterleave(), pager_swig.flex_parse(queue, freq))
+
+       if log:
+           suffix = '_'+ "%3.3f" % (freq/1e6,) + '.dat'
+           quad_sink = gr.file_sink(gr.sizeof_float, 'quad'+suffix)
+           rsamp_sink = gr.file_sink(gr.sizeof_float, 'rsamp'+suffix)
+           slicer_sink = gr.file_sink(gr.sizeof_char, 'slicer'+suffix)
+           self.connect(rsamp, rsamp_sink)
+           self.connect(quad, quad_sink)
+           self.connect(self.slicer, slicer_sink)
+
+    def dc_offset(self):
+       return self.slicer.dc_offset()
+                   
\ No newline at end of file
diff --git a/gr-pager/python/pager_utils.py b/gr-pager/python/pager_utils.py
new file mode 100644 (file)
index 0000000..72aac68
--- /dev/null
@@ -0,0 +1,60 @@
+#
+# Copyright 2008,2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+from gnuradio import gr
+import gnuradio.gr.gr_threading as _threading
+from string import split, join, printable
+import time
+
+def make_trans_table():
+    table = 256 * ['.']
+    for i in range(256):
+        if (i < 32):
+            table[i] = '.'
+        else:
+            table[i] = chr(i)
+    return ''.join(table)
+
+_trans_table = make_trans_table()
+
+def make_printable(s):
+    return s.translate(_trans_table)
+
+
+class queue_runner(_threading.Thread):
+    def __init__(self, msgq):
+        _threading.Thread.__init__(self)
+        self.msgq = msgq
+        self.done = False
+        self.start()
+
+    def run(self):
+        while 1:
+            msg = self.msgq.delete_head() # Blocking read
+            if msg.type() != 0:
+                break
+            
+            page = join(split(msg.to_string(), chr(128)), '|')
+            s = make_printable(page)
+            print msg.type(), s
+                
+    def end(self):
+        self.msgq.insert_tail(gr.message(1))
+        self.done = True
diff --git a/gr-pager/python/qa_pager.py b/gr-pager/python/qa_pager.py
new file mode 100755 (executable)
index 0000000..5bf72b5
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+#
+# Copyright 2004,2006 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+from gnuradio import gr, gr_unittest
+import pager_swig
+
+class qa_pgr(gr_unittest.TestCase):
+
+    def setUp (self):
+        self.tb = gr.top_block ()
+
+    def tearDown (self):
+        self.tb = None
+
+if __name__ == '__main__':
+    gr_unittest.main ()
diff --git a/gr-pager/python/run_tests.in b/gr-pager/python/run_tests.in
new file mode 100644 (file)
index 0000000..6bb0c39
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# 1st parameter is absolute path to component source directory
+# 2nd parameter is absolute path to component build directory
+# 3rd parameter is path to Python QA directory
+
+@top_builddir@/run_tests.sh \
+    @abs_top_srcdir@/gr-pager \
+    @abs_top_builddir@/gr-pager \
+    @srcdir@
diff --git a/gr-pager/src/.gitignore b/gr-pager/src/.gitignore
deleted file mode 100644 (file)
index 3e806d6..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/.libs
-/.deps
-/Makefile
-/Makefile.in
-/pager_swig.py
-/pager_swig.cc
-/*.pyc
-/run_tests
diff --git a/gr-pager/src/Makefile.am b/gr-pager/src/Makefile.am
deleted file mode 100644 (file)
index 8a9f90d..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#
-# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
-# 
-# This file is part of GNU Radio
-# 
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-# 
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with GNU Radio; see the file COPYING.  If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-# 
-
-include $(top_srcdir)/Makefile.common
-
-EXTRA_DIST = run_tests.in
-
-AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) $(PYTHON_CPPFLAGS) $(WITH_INCLUDES)
-
-noinst_PYTHON = \
-       qa_pager.py
-
-# These headers get installed in ${prefix}/include/gnuradio
-grinclude_HEADERS = \
-       pager_slicer_fb.h \
-       pager_flex_sync.h \
-       pager_flex_deinterleave.h \
-       pager_flex_parse.h \
-       pager_flex_frame.h \
-       pageri_bch3221.h \
-       pageri_flex_modes.h \
-       pageri_util.h
-
-lib_LTLIBRARIES = libgnuradio-pager.la
-
-libgnuradio_pager_la_SOURCES = \
-       pager_flex_frame.cc \
-       pager_slicer_fb.cc \
-       pager_flex_sync.cc \
-       pager_flex_deinterleave.cc \
-       pager_flex_parse.cc \
-       pageri_bch3221.cc \
-       pageri_flex_modes.cc \
-       pageri_util.cc
-
-libgnuradio_pager_la_LIBADD =  \
-       $(GNURADIO_CORE_LA)
-
-libgnuradio_pager_la_LDFLAGS = \
-       $(NO_UNDEFINED)
-
-if PYTHON
-
-##############################
-# SWIG interface and library
-TESTS = run_tests
-DISTCLEANFILES = run_tests
-
-TOP_SWIG_IFILES = \
-       pager_swig.i
-
-# Install so that they end up available as:
-#   import gnuradio.pager
-# This ends up at:
-#   ${prefix}/lib/python${python_version}/site-packages/gnuradio/pager
-pager_swig_pythondir_category = \
-       gnuradio/pager
-
-# additional libraries for linking with the SWIG-generated library
-pager_swig_la_swig_libadd = \
-       libgnuradio-pager.la
-
-# additional Python files to be installed along with the SWIG-generated one
-pager_swig_python = \
-       __init__.py \
-       pager_utils.py \
-       flex_demod.py
-
-# additional SWIG files to be installed
-pager_swig_swiginclude_headers = \
-       pager_flex_frame.i
-
-include $(top_srcdir)/Makefile.swig
-
-# add some of the variables generated inside the Makefile.swig.gen
-BUILT_SOURCES = $(swig_built_sources)
-
-# Do not distribute the output of SWIG
-no_dist_files = $(swig_built_sources)
-endif
diff --git a/gr-pager/src/Makefile.swig.gen b/gr-pager/src/Makefile.swig.gen
deleted file mode 100644 (file)
index 5cfbc66..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-# -*- Makefile -*-
-#
-# Copyright 2009 Free Software Foundation, Inc.
-# 
-# This file is part of GNU Radio
-# 
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-# 
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with GNU Radio; see the file COPYING.  If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-# 
-
-# Makefile.swig.gen for pager_swig.i
-
-## Default install locations for these files:
-##
-## Default location for the Python directory is:
-##  ${prefix}/lib/python${python_version}/site-packages/[category]/pager_swig
-## Default location for the Python exec directory is:
-##  ${exec_prefix}/lib/python${python_version}/site-packages/[category]/pager_swig
-##
-## The following can be overloaded to change the install location, but
-## this has to be done in the including Makefile.am -before-
-## Makefile.swig is included.
-
-pager_swig_pythondir_category ?= gnuradio/pager_swig
-pager_swig_pylibdir_category ?= $(pager_swig_pythondir_category)
-pager_swig_pythondir = $(pythondir)/$(pager_swig_pythondir_category)
-pager_swig_pylibdir = $(pyexecdir)/$(pager_swig_pylibdir_category)
-
-## SWIG headers are always installed into the same directory.
-
-pager_swig_swigincludedir = $(swigincludedir)
-
-## This is a template file for a "generated" Makefile addition (in
-## this case, "Makefile.swig.gen").  By including the top-level
-## Makefile.swig, this file will be used to generate the SWIG
-## dependencies.  Assign the variable TOP_SWIG_FILES to be the list of
-## SWIG .i files to generated wrappings for; there can be more than 1
-## so long as the names are unique (no sorting is done on the
-## TOP_SWIG_FILES list). This file explicitly assumes that a SWIG .i
-## file will generate .cc, .py, and possibly .h files -- meaning that
-## all of these files will have the same base name (that provided for
-## the SWIG .i file).
-##
-## This code is setup to ensure parallel MAKE ("-j" or "-jN") does the
-## right thing.  For more info, see <
-## http://sources.redhat.com/automake/automake.html#Multiple-Outputs >
-
-## Stamps used to ensure parallel make does the right thing.  These
-## are removed by "make clean", but otherwise unused except during the
-## parallel built.  These will not be included in a tarball, because
-## the SWIG-generated files will be removed from the distribution.
-
-STAMPS += $(DEPDIR)/pager_swig-generate-*
-
-## Other cleaned files: dependency files generated by SWIG or this Makefile
-
-MOSTLYCLEANFILES += $(DEPDIR)/*.S*
-
-## Add the .py and .cc files to the list of SWIG built sources.  The
-## .h file is sometimes built, but not always ... so that one has to
-## be added manually by the including Makefile.am .
-
-swig_built_sources += pager_swig.py pager_swig.cc
-
-## Various SWIG variables.  These can be overloaded in the including
-## Makefile.am by setting the variable value there, then including
-## Makefile.swig .
-
-pager_swig_swiginclude_HEADERS =               \
-       pager_swig.i                    \
-       $(pager_swig_swiginclude_headers)
-
-pager_swig_pylib_LTLIBRARIES =         \
-       _pager_swig.la
-
-_pager_swig_la_SOURCES =                       \
-       pager_swig.cc                   \
-       $(pager_swig_la_swig_sources)
-
-_pager_swig_la_LIBADD =                        \
-       $(STD_SWIG_LA_LIB_ADD)          \
-       $(pager_swig_la_swig_libadd)
-
-_pager_swig_la_LDFLAGS =                       \
-       $(STD_SWIG_LA_LD_FLAGS)         \
-       $(pager_swig_la_swig_ldflags)
-
-_pager_swig_la_CXXFLAGS =                      \
-       $(STD_SWIG_CXX_FLAGS)           \
-       $(pager_swig_la_swig_cxxflags)
-
-pager_swig_python_PYTHON =                     \
-       pager_swig.py                   \
-       $(pager_swig_python)
-
-## Entry rule for running SWIG
-
-pager_swig.h pager_swig.py pager_swig.cc: pager_swig.i
-## This rule will get called only when MAKE decides that one of the
-## targets needs to be created or re-created, because:
-##
-## * The .i file is newer than any or all of the generated files;
-##
-## * Any or all of the .cc, .h, or .py files does not exist and is
-##   needed (in the case this file is not needed, the rule for it is
-##   ignored); or
-##
-## * Some SWIG-based dependecy of the .cc file isn't met and hence the
-##   .cc file needs be be regenerated.  Explanation: Because MAKE
-##   knows how to handle dependencies for .cc files (regardless of
-##   their name or extension), then the .cc file is used as a target
-##   instead of the .i file -- but with the dependencies of the .i
-##   file.  It is this last reason why the line:
-##
-##             if test -f $@; then :; else
-##
-##   cannot be used in this case: If a .i file dependecy is not met,
-##   then the .cc file needs to be rebuilt.  But if the stamp is newer
-##   than the .cc file, and the .cc file exists, then in the original
-##   version (with the 'test' above) the internal MAKE call will not
-##   be issued and hence the .cc file will not be rebuilt.
-##
-## Once execution gets to here, it should always proceed no matter the
-## state of a stamp (as discussed in link above).  The
-## $(DEPDIR)/pager_swig-generate stuff is used to allow for parallel
-## builds to "do the right thing".  The stamp has no relationship with
-## either the target files or dependency file; it is used solely for
-## the protection of multiple builds during a given call to MAKE.
-##
-## Catch signals SIGHUP (1), SIGINT (2), SIGPIPE (13), and SIGTERM
-## (15).  At a caught signal, the quoted command will be issued before
-## exiting.  In this case, remove any stamp, whether temporary of not.
-## The trap is valid until the process exits; the process includes all
-## commands appended via "\"s.
-##
-       trap 'rm -rf $(DEPDIR)/pager_swig-generate-*' 1 2 13 15; \
-##
-## Create a temporary directory, which acts as a lock.  The first
-## process to create the directory will succeed and issue the MAKE
-## command to do the actual work, while all subsequent processes will
-## fail -- leading them to wait for the first process to finish.
-##
-       if mkdir $(DEPDIR)/pager_swig-generate-lock 2>/dev/null; then \
-##
-## This code is being executed by the first process to succeed in
-## creating the directory lock.
-##
-## Remove the stamp associated with this filename.
-##
-               rm -f $(DEPDIR)/pager_swig-generate-stamp; \
-##
-## Tell MAKE to run the rule for creating this stamp.
-##
-               $(MAKE) $(AM_MAKEFLAGS) $(DEPDIR)/pager_swig-generate-stamp WHAT=$<; \
-##
-## Now that the .cc, .h, and .py files have been (re)created from the
-## .i file, future checking of this rule during the same MAKE
-## execution will come back that the rule doesn't need to be executed
-## because none of the conditions mentioned at the start of this rule
-## will be positive.  Remove the the directory lock, which frees up
-## any waiting process(es) to continue.
-##
-               rmdir $(DEPDIR)/pager_swig-generate-lock; \
-       else \
-##
-## This code is being executed by any follower processes while the
-## directory lock is in place.
-##
-## Wait until the first process is done, testing once per second.
-##
-               while test -d $(DEPDIR)/pager_swig-generate-lock; do \
-                       sleep 1; \
-               done; \
-##
-## Succeed if and only if the first process succeeded; exit this
-## process returning the status of the generated stamp.
-##
-               test -f $(DEPDIR)/pager_swig-generate-stamp; \
-               exit $$?; \
-       fi;
-
-$(DEPDIR)/pager_swig-generate-stamp:
-## This rule will be called only by the first process issuing the
-## above rule to succeed in creating the lock directory, after
-## removing the actual stamp file in order to guarantee that MAKE will
-## execute this rule.
-##
-## Call SWIG to generate the various output files; special
-## post-processing on 'mingw32' host OS for the dependency file.
-##
-       if $(SWIG) $(STD_SWIG_PYTHON_ARGS) $(pager_swig_swig_args) \
-               -MD -MF $(DEPDIR)/pager_swig.Std \
-               -module pager_swig -o pager_swig.cc $(WHAT); then \
-           if test $(host_os) = mingw32; then \
-               $(RM) $(DEPDIR)/pager_swig.Sd; \
-               $(SED) 's,\\\\,/,g' < $(DEPDIR)/pager_swig.Std \
-                       > $(DEPDIR)/pager_swig.Sd; \
-               $(RM) $(DEPDIR)/pager_swig.Std; \
-               $(MV) $(DEPDIR)/pager_swig.Sd $(DEPDIR)/pager_swig.Std; \
-           fi; \
-       else \
-           $(RM) $(DEPDIR)/pager_swig.S*; exit 1; \
-       fi;
-##
-## Mess with the SWIG output .Std dependency file, to create a
-## dependecy file valid for the input .i file: Basically, simulate the
-## dependency file created for libraries by GNU's libtool for C++,
-## where all of the dependencies for the target are first listed, then
-## each individual dependency is listed as a target with no further
-## dependencies.
-##
-## (1) remove the current dependency file
-##
-       $(RM) $(DEPDIR)/pager_swig.d
-##
-## (2) Copy the whole SWIG file:
-##
-       cp $(DEPDIR)/pager_swig.Std $(DEPDIR)/pager_swig.d
-##
-## (3) all a carriage return to the end of the dependency file.
-##
-       echo "" >> $(DEPDIR)/pager_swig.d
-##
-## (4) from the SWIG file, remove the first line (the target); remove
-##     trailing " \" and " " from each line.  Append ":" to each line,
-##     followed by 2 carriage returns, then append this to the end of
-##     the dependency file.
-##
-       $(SED) -e '1d;s, \\,,g;s, ,,g' < $(DEPDIR)/pager_swig.Std | \
-               awk '{ printf "%s:\n\n", $$0 }' >> $(DEPDIR)/pager_swig.d
-##
-## (5) remove the SWIG-generated file
-##
-       $(RM) $(DEPDIR)/pager_swig.Std
-##
-## Create the stamp for this filename generation, to signal success in
-## executing this rule; allows other threads waiting on this process
-## to continue.
-##
-       touch $(DEPDIR)/pager_swig-generate-stamp
-
-# KLUDGE: Force runtime include of a SWIG dependency file.  This is
-# not guaranteed to be portable, but will probably work.  If it works,
-# we have accurate dependencies for our swig stuff, which is good.
-
-@am__include@ @am__quote@./$(DEPDIR)/pager_swig.d@am__quote@
-
diff --git a/gr-pager/src/__init__.py b/gr-pager/src/__init__.py
deleted file mode 100644 (file)
index 664b799..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Copyright 2006 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.
-# 
-
-# The presence of this file turns this directory into a Python package
-
-from pager_swig import *
-from flex_demod import flex_demod
-from pager_utils import *
diff --git a/gr-pager/src/flex_demod.py b/gr-pager/src/flex_demod.py
deleted file mode 100644 (file)
index b79c1ad..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#
-# Copyright 2006,2007 Free Software Foundation, Inc.
-# 
-# This file is part of GNU Radio
-# 
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 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, gru, optfir, blks2
-from math import pi
-import pager_swig
-
-class flex_demod(gr.hier_block2):
-    """
-    FLEX pager protocol demodulation block.
-
-    This block demodulates a band-limited, complex down-converted baseband 
-    channel into FLEX protocol frames.
-
-    """
-
-    def __init__(self, queue, freq=0.0, verbose=False, log=False):
-       gr.hier_block2.__init__(self, "flex_demod",
-                               gr.io_signature(1, 1, gr.sizeof_gr_complex),
-                               gr.io_signature(0,0,0))
-
-        k = 25000/(2*pi*1600)        # 4800 Hz max deviation
-        quad = gr.quadrature_demod_cf(k)
-       self.connect(self, quad)
-       
-        rsamp = blks2.rational_resampler_fff(16, 25)
-        self.slicer = pager_swig.slicer_fb(5e-6) # DC removal averaging filter constant
-       self.sync = pager_swig.flex_sync()
-
-        self.connect(quad, rsamp, self.slicer, self.sync)
-
-       for i in range(4):
-           self.connect((self.sync, i), pager_swig.flex_deinterleave(), pager_swig.flex_parse(queue, freq))
-
-       if log:
-           suffix = '_'+ "%3.3f" % (freq/1e6,) + '.dat'
-           quad_sink = gr.file_sink(gr.sizeof_float, 'quad'+suffix)
-           rsamp_sink = gr.file_sink(gr.sizeof_float, 'rsamp'+suffix)
-           slicer_sink = gr.file_sink(gr.sizeof_char, 'slicer'+suffix)
-           self.connect(rsamp, rsamp_sink)
-           self.connect(quad, quad_sink)
-           self.connect(self.slicer, slicer_sink)
-
-    def dc_offset(self):
-       return self.slicer.dc_offset()
-                   
\ No newline at end of file
diff --git a/gr-pager/src/pager_flex_deinterleave.cc b/gr-pager/src/pager_flex_deinterleave.cc
deleted file mode 100644 (file)
index 25ea22e..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2004,2006 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 <pager_flex_deinterleave.h>
-#include <pageri_bch3221.h>
-#include <pageri_util.h>
-#include <gr_io_signature.h>
-
-pager_flex_deinterleave_sptr pager_make_flex_deinterleave()
-{
-    return pager_flex_deinterleave_sptr(new pager_flex_deinterleave());
-}
-
-pager_flex_deinterleave::pager_flex_deinterleave() :
-    gr_sync_decimator("flex_deinterleave",
-    gr_make_io_signature(1, 1, sizeof(unsigned char)),
-    gr_make_io_signature(1, 1, sizeof(gr_int32)), 32)
-{
-    set_output_multiple(8); // One FLEX block at a time
-}
-
-int pager_flex_deinterleave::work(int noutput_items,
-    gr_vector_const_void_star &input_items,
-    gr_vector_void_star &output_items)
-{
-    const unsigned char *in = (const unsigned char *)input_items[0];
-    gr_int32 *out = (gr_int32 *)output_items[0];    
-
-    // FLEX codewords are interleaved in blocks of 256 bits or 8, 32 bit
-    // codes.  To deinterleave we parcel each incoming bit into the MSB
-    // of each codeword, then switch to MSB-1, etc.  This is done by shifting
-    // in the bits from the right on each codeword as the bits come in.
-    // When we are done we have a FLEX block of eight codewords, ready for
-    // conversion to data words.
-    //
-    // FLEX data words are recovered by reversing the bit order of the code
-    // word, masking off the (reversed) ECC, and inverting the remainder of 
-    // the bits (!).
-    //
-    // The data portion of a FLEX frame consists of 11 of these deinterleaved
-    // and converted blocks.
-    //
-    // set_output_multiple garauntees we have output space for at least
-    // eight data words, and 256 bits are supplied on input
-
-    int i, j;
-    for (i = 0; i < 32; i++) {
-       for (j = 0; j < 8; j++) {
-           d_codewords[j] <<= 1;
-           d_codewords[j]  |= *in++;
-       }
-    }
-
-    // Now convert code words into data words  
-    for (j = 0; j < 8; j++) {
-       gr_int32 codeword = d_codewords[j];
-       
-       // Apply BCH 32,21 error correction
-       // TODO: mark dataword when codeword fails ECC
-       pageri_bch3221(codeword);
-       
-       // Reverse bit order
-       codeword = pageri_reverse_bits32(codeword);
-
-       // Mask off ECC then invert lower 21 bits
-       codeword = (codeword & 0x001FFFFF)^0x001FFFFF;
-
-       *out++ = codeword;
-    }
-    
-    return j;
-}
diff --git a/gr-pager/src/pager_flex_deinterleave.h b/gr-pager/src/pager_flex_deinterleave.h
deleted file mode 100644 (file)
index 7211a71..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2006 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_PAGER_FLEX_DEINTERLEAVE_H
-#define INCLUDED_PAGER_FLEX_DEINTERLEAVE_H
-
-#include <gr_sync_decimator.h>
-
-class pager_flex_deinterleave;
-typedef boost::shared_ptr<pager_flex_deinterleave> pager_flex_deinterleave_sptr;
-
-pager_flex_deinterleave_sptr pager_make_flex_deinterleave();
-
-/*!
- * \brief flex deinterleave description
- * \ingroup pager_blk
- */
-
-class pager_flex_deinterleave : public gr_sync_decimator
-{
-private:
-    // Constructors
-    friend pager_flex_deinterleave_sptr pager_make_flex_deinterleave();
-    pager_flex_deinterleave();
-
-    // One FLEX block of deinterleaved data
-    gr_int32 d_codewords[8];
-   
-public:
-
-    int work(int noutput_items,
-             gr_vector_const_void_star &input_items, 
-             gr_vector_void_star &output_items);
-};
-
-#endif /* INCLUDED_PAGER_FLEX_DEINTERLEAVE_H */
diff --git a/gr-pager/src/pager_flex_frame.cc b/gr-pager/src/pager_flex_frame.cc
deleted file mode 100644 (file)
index b707dbb..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2006 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 <pager_flex_frame.h>
-
-pager_flex_frame_sptr pager_make_flex_frame()
-{
-    return pager_flex_frame_sptr(new pager_flex_frame());
-}
-
-pager_flex_frame::pager_flex_frame()
-{
-}
-
-pager_flex_frame::~pager_flex_frame()
-{
-}
diff --git a/gr-pager/src/pager_flex_frame.h b/gr-pager/src/pager_flex_frame.h
deleted file mode 100644 (file)
index 1f4999e..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2006 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_PAGER_FLEX_FRAME_H
-#define INCLUDED_PAGER_FLEX_FRAME_H
-
-#include <boost/shared_ptr.hpp>
-
-class pager_flex_frame;
-typedef boost::shared_ptr<pager_flex_frame> pager_flex_frame_sptr;
-
-/*!
- * \brief public constructor for pager_flex_frame
- */
-pager_flex_frame_sptr pager_make_flex_frame();
-
-/*!
- * \brief flex_frame.
- */
-class pager_flex_frame {
-    // Constructor is private to force use of shared_ptr
-    pager_flex_frame();
-    friend pager_flex_frame_sptr pager_make_flex_frame();
-
-public:
-    ~pager_flex_frame();
-};
-
-#endif /* INCLUDED_PAGER_FLEX_FRAME_H */
diff --git a/gr-pager/src/pager_flex_frame.i b/gr-pager/src/pager_flex_frame.i
deleted file mode 100644 (file)
index d754f5f..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2006 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.
- */
-
-class pager_flex_frame;
-typedef boost::shared_ptr<pager_flex_frame> pager_flex_frame_sptr;
-%template(pager_flex_frame_sptr) boost::shared_ptr<pager_flex_frame>;
-
-%rename(flex_frame) pager_make_flex_frame;
-pager_flex_frame_sptr pager_make_flex_frame();
-
-/*!
- * \brief flex_frame.
- */
-class pager_flex_frame {
-    pager_flex_frame();
-
-public:
-};
-
diff --git a/gr-pager/src/pager_flex_parse.cc b/gr-pager/src/pager_flex_parse.cc
deleted file mode 100644 (file)
index 0819294..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright 2004,2006,2007 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 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 <pager_flex_parse.h>
-#include <pageri_bch3221.h>
-#include <gr_io_signature.h>
-#include <ctype.h>
-#include <iostream>
-#include <iomanip>
-
-pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq)
-{
-    return pager_flex_parse_sptr(new pager_flex_parse(queue, freq));
-}
-
-pager_flex_parse::pager_flex_parse(gr_msg_queue_sptr queue, float freq) :
-    gr_sync_block("flex_parse",
-    gr_make_io_signature(1, 1, sizeof(gr_int32)),
-    gr_make_io_signature(0, 0, 0)),
-    d_queue(queue),
-    d_freq(freq)
-{
-    d_count = 0;
-}
-
-int pager_flex_parse::work(int noutput_items,
-    gr_vector_const_void_star &input_items,
-    gr_vector_void_star &output_items)
-{
-    const gr_int32 *in = (const gr_int32 *)input_items[0];
-    
-    int i = 0;
-    while (i < noutput_items) {
-       // Accumulate one whole frame's worth of data words (88 of them)
-       d_datawords[d_count] = *in++; i++;
-       if (++d_count == 88) {
-           parse_data();
-           d_count = 0;
-       }
-    }
-
-    return i;
-}
-
-/* FLEX data frames (that is, 88 data words per phase recovered after sync,
-   symbol decoding, dephasing, deinterleaving, error correction, and conversion
-   from codewords to data words) start with a block information word containing
-   indices of the page address field and page vector fields.
-*/
-
-void pager_flex_parse::parse_capcode(gr_int32 aw1, gr_int32 aw2)
-{
-    d_laddr = (aw1 < 0x008001L) ||
-              (aw1 > 0x1E0000L) ||
-             (aw1 > 0x1E7FFEL);        
-    
-    if (d_laddr)
-        d_capcode = aw1+((aw2^0x001FFFFF)<<15)+0x1F9000;  // Don't ask
-    else
-        d_capcode = aw1-0x8000;
-}
-
-void pager_flex_parse::parse_data()
-{
-    // Block information word is the first data word in frame
-    gr_int32 biw = d_datawords[0];
-
-    // Nothing to see here, please move along
-    if (biw == 0 || biw == 0x001FFFFF)
-       return;
-
-    // Vector start index is bits 15-10
-    // Address start address is bits 9-8, plus one for offset
-    int voffset = (biw >> 10) & 0x3f;
-    int aoffset = ((biw >> 8) & 0x03) + 1;
-    
-    //printf("BIW:%08X AW:%02i-%02i\n", biw, aoffset, voffset);
-
-    // Iterate through pages and dispatch to appropriate handler
-    for (int i = aoffset; i < voffset; i++) {
-       int j = voffset+i-aoffset;              // Start of vector field for address @ i
-
-       if (d_datawords[i] == 0x00000000 ||
-           d_datawords[i] == 0x001FFFFF)
-           continue;                           // Idle codewords, invalid address
-
-       parse_capcode(d_datawords[i], d_datawords[i+1]);
-        if (d_laddr)
-           i++;
-                           
-        if (d_capcode < 0)                     // Invalid address, skip
-          continue;        
-
-        // Parse vector information word for address @ offset 'i'
-       gr_int32 viw = d_datawords[j];
-       d_type = (page_type_t)((viw >> 4) & 0x00000007);
-       int mw1 = (viw >> 7) & 0x00000007F;
-       int len = (viw >> 14) & 0x0000007F;
-
-       if (is_numeric_page(d_type))
-            len &= 0x07;
-        int mw2 = mw1+len;
-           
-       if (mw1 == 0 && mw2 == 0)
-           continue;                           // Invalid VIW
-
-       if (is_tone_page(d_type))
-           mw1 = mw2 = 0;
-
-       if (mw1 > 87 || mw2 > 87)
-           continue;                           // Invalid offsets
-
-       d_payload.str("");
-       d_payload.setf(std::ios::showpoint);
-       d_payload << std::setprecision(6) << std::setw(7)
-                 << d_freq/1e6 << FIELD_DELIM 
-                 << std::setw(10) << d_capcode << FIELD_DELIM
-                 << flex_page_desc[d_type] << FIELD_DELIM;
-
-       if (is_alphanumeric_page(d_type))
-           parse_alphanumeric(mw1, mw2-1, j);
-       else if (is_numeric_page(d_type))
-           parse_numeric(mw1, mw2, j);
-       else if (is_tone_page(d_type))
-           parse_tone_only();
-       else
-           parse_unknown(mw1, mw2);
-
-       gr_message_sptr msg = gr_make_message_from_string(std::string(d_payload.str()));
-       d_queue->handle(msg);
-    }
-}
-
-void pager_flex_parse::parse_alphanumeric(int mw1, int mw2, int j)
-{
-    int frag;
-    bool cont;
-
-    if (!d_laddr) {
-       frag = (d_datawords[mw1] >> 11) & 0x03;
-       cont = (d_datawords[mw1] >> 10) & 0x01;
-       mw1++;
-    }
-    else {
-       frag = (d_datawords[j+1] >> 11) & 0x03;
-       cont = (d_datawords[j+1] >> 10) & 0x01;
-       mw2--;
-    }    
-
-    //d_payload << frag << FIELD_DELIM;
-    //d_payload << cont << FIELD_DELIM;
-
-    for (int i = mw1; i <= mw2; i++) {
-       gr_int32 dw = d_datawords[i];
-       unsigned char ch;
-       
-       if (i > mw1 || frag != 0x03) {
-           ch = dw & 0x7F;
-           if (ch != 0x03)
-               d_payload << ch;
-       }
-       
-       ch = (dw >> 7) & 0x7F;
-       if (ch != 0x03) // Fill
-           d_payload << ch;
-               
-       ch = (dw >> 14) & 0x7F;
-       if (ch != 0x03) // Fill
-           d_payload << ch;
-    }
-}
-
-void pager_flex_parse::parse_numeric(int mw1, int mw2, int j)
-{
-    // Get first dataword from message field or from second
-    // vector word if long address
-    gr_int32 dw;
-    if (!d_laddr) {
-       dw = d_datawords[mw1];
-       mw1++;
-       mw2++;
-    }
-    else {
-       dw = d_datawords[j+1];
-    }
-
-    unsigned char digit = 0;
-    int count = 4;
-    if (d_type == FLEX_NUMBERED_NUMERIC)
-       count += 10;    // Skip 10 header bits for numbered numeric pages
-    else
-       count += 2;     // Otherwise skip 2
-    
-    for (int i = mw1; i <= mw2; i++) {
-       for (int k = 0; k < 21; k++) {
-           // Shift LSB from data word into digit
-           digit = (digit >> 1) & 0x0F;
-           if (dw & 0x01)
-               digit ^= 0x08;
-           dw >>= 1;
-           if (--count == 0) {
-               if (digit != 0x0C) // Fill
-                    d_payload << flex_bcd[digit];
-               count = 4;
-           }
-       }
-       
-       dw = d_datawords[i];
-    }
-}
-
-void pager_flex_parse::parse_tone_only()
-{
-}
-
-void pager_flex_parse::parse_unknown(int mw1, int mw2)
-{
-}
diff --git a/gr-pager/src/pager_flex_parse.h b/gr-pager/src/pager_flex_parse.h
deleted file mode 100644 (file)
index 0f7cfb3..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2006 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_PAGER_FLEX_PARSE_H
-#define INCLUDED_PAGER_FLEX_PARSE_H
-
-#include <gr_sync_block.h>
-#include <gr_msg_queue.h>
-#include <pageri_flex_modes.h>
-#include <sstream>
-
-class pager_flex_parse;
-typedef boost::shared_ptr<pager_flex_parse> pager_flex_parse_sptr;
-
-pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq);
-
-#define FIELD_DELIM ((unsigned char)128)
-
-/*!
- * \brief flex parse description
- * \ingroup pager_blk
- */
-class pager_flex_parse : public gr_sync_block
-{
-private:
-    // Constructors
-    friend pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq);
-    pager_flex_parse(gr_msg_queue_sptr queue, float freq);
-
-    std::ostringstream d_payload;
-    gr_msg_queue_sptr d_queue;           // Destination for decoded pages
-
-    int d_count;                         // Count of received codewords
-    gr_int32 d_datawords[88];             // 11 blocks of 8 32-bit words
-
-    page_type_t d_type;                          // Current page type
-    int d_capcode;                       // Current page destination address
-    bool d_laddr;                        // Current page has long address
-    float d_freq;                        // Channel frequency
-    
-    void parse_data();                   // Handle a frame's worth of data
-    void parse_capcode(gr_int32 aw1, gr_int32 aw2);     
-    void parse_alphanumeric(int mw1, int mw2, int j);
-    void parse_numeric(int mw1, int mw2, int j);
-    void parse_tone_only();
-    void parse_unknown(int mw1, int mw2);
-    
-public:
-    int work(int noutput_items,
-        gr_vector_const_void_star &input_items, 
-        gr_vector_void_star &output_items);
-};
-
-#endif /* INCLUDED_PAGER_FLEX_PARSE_H */
diff --git a/gr-pager/src/pager_flex_sync.cc b/gr-pager/src/pager_flex_sync.cc
deleted file mode 100644 (file)
index 6bcee8e..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright 2004,2006 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 <pager_flex_sync.h>
-#include <pageri_flex_modes.h>
-#include <pageri_bch3221.h>
-#include <pageri_util.h>
-#include <gr_io_signature.h>
-#include <gr_count_bits.h>
-#include <cstdio>
-
-pager_flex_sync_sptr pager_make_flex_sync()
-{
-    return pager_flex_sync_sptr(new pager_flex_sync());
-}
-
-// FLEX sync block takes input from sliced baseband stream [0-3] at specified 
-// channel rate.  Symbol timing is established based on receiving one of the
-// defined FLEX protocol synchronization words.  The block outputs one FLEX frame
-// worth of bits on each output phase for the data portion of the frame. Unused phases
-// get all zeros, which are considered idle code words.
-
-pager_flex_sync::pager_flex_sync() :
-    gr_block ("flex_sync",
-    gr_make_io_signature (1, 1, sizeof(unsigned char)),
-    gr_make_io_signature (4, 4, sizeof(unsigned char))),
-    d_sync(10) // Fixed at 10 samples per baud (@ 1600 baud)
-{
-    enter_idle();
-}
-
-void pager_flex_sync::forecast(int noutput_items, gr_vector_int &inputs_required)
-{
-    // samples per bit X number of outputs needed
-    int items = noutput_items*d_spb;
-    for (unsigned int i = 0; i < inputs_required.size(); i++)
-        inputs_required[i] = items;
-}
-
-int pager_flex_sync::index_avg(int start, int end)
-{
-    // modulo average
-    if (start < end)
-        return (end + start)/2;
-    else
-        return ((end + start)/2 + d_spb/2) % d_spb;
-}
-
-bool pager_flex_sync::test_sync(unsigned char sym)
-{
-    // 64-bit FLEX sync code:
-    // AAAA:BBBBBBBB:CCCC
-    //
-    // Where BBBBBBBB is always 0xA6C6AAAA
-    // and AAAA^CCCC is 0xFFFF
-    // 
-    // Specific values of AAAA determine what bps and encoding the
-    // packet is beyond the frame information word
-    //
-    // First we match on the marker field with a hamming distance < 4
-    // Then we match on the outer code with a hamming distance < 4
-
-    d_sync[d_index] = (d_sync[d_index] << 1) | (sym < 2);
-    gr_int64 val = d_sync[d_index];
-    gr_int32 marker = ((val & 0x0000FFFFFFFF0000ULL)) >> 16;
-
-    if (gr_count_bits32(marker^FLEX_SYNC_MARKER) < 4) {
-        gr_int32 code = ((val & 0xFFFF000000000000ULL) >> 32) |
-                         (val & 0x000000000000FFFFULL);
-
-        for (int i = 0; i < num_flex_modes; i++) {
-            if (gr_count_bits32(code^flex_modes[i].sync) < 4) {
-                d_mode = i;
-                return true;
-            }
-        }
-
-        // Marker received but doesn't match known codes
-        // All codes have high word inverted to low word
-        unsigned short high = (code & 0xFFFF0000) >> 16;
-        unsigned short low = code & 0x0000FFFF;
-        unsigned short syn = high^low;
-        if (syn == 0xFFFF)
-            fprintf(stderr, "Unknown sync code detected: %08X\n", code);
-    }
-
-    return false;
-}
-
-void pager_flex_sync::enter_idle()
-{
-    d_state = ST_IDLE;
-    d_index = 0;
-    d_start = 0;
-    d_center = 0;
-    d_end = 0;
-    d_count = 0;
-    d_mode = 0;
-    d_baudrate = 1600;
-    d_levels = 2;
-    d_spb = 16000/d_baudrate;
-    d_bit_a = 0;
-    d_bit_b = 0;
-    d_bit_c = 0;
-    d_bit_d = 0;
-    d_hibit = false;
-    fflush(stdout);
-}
-
-void pager_flex_sync::enter_syncing()
-{
-    d_start = d_index;
-    d_state = ST_SYNCING;
-}
-
-void pager_flex_sync::enter_sync1()
-{
-    d_state = ST_SYNC1;
-    d_end = d_index;
-    d_center = index_avg(d_start, d_end); // Center of goodness
-    d_count = 0;
-}
-
-void pager_flex_sync::enter_sync2()
-{
-    d_state = ST_SYNC2;
-    d_count = 0;
-    d_baudrate = flex_modes[d_mode].baud;
-    d_levels = flex_modes[d_mode].levels;
-    d_spb = 16000/d_baudrate;
-
-    if (d_baudrate == 3200) {
-        // Oversampling buffer just got halved
-        d_center = d_center/2;
-
-       // We're here at the center of a 1600 baud bit
-       // So this hack puts the index and bit counter
-       // in the right place for 3200 bps.
-        d_index = d_index/2-d_spb/2;         
-       d_count = -1;                
-    }                               
-}
-
-void pager_flex_sync::enter_data()
-{
-    d_state = ST_DATA;
-    d_count = 0;
-}
-
-void pager_flex_sync::parse_fiw()
-{
-    // Nothing is done with these now, but these will end up getting
-    // passed as metadata when mblocks are available
-
-    // Bits 31-28 are frame number related, but unknown function
-    // This might be a checksum
-    d_unknown2 = pageri_reverse_bits8((d_fiw >> 24) & 0xF0);
-       
-    // Cycle is bits 27-24, reversed
-    d_cycle = pageri_reverse_bits8((d_fiw >> 20) & 0xF0);
-
-    // Frame is bits 23-17, reversed
-    d_frame = pageri_reverse_bits8((d_fiw >> 16) & 0xFE);
-
-    // Bits 16-11 are some sort of marker, usually identical across
-    // many frames but sometimes changes between frames or modes
-    d_unknown1 = (d_fiw >> 11) & 0x3F;
-
-    //printf("CYC:%02i FRM:%03i\n", d_cycle, d_frame);
-}
-
-int pager_flex_sync::output_symbol(unsigned char sym)
-{
-    // Here is where we output a 1 or 0 on each phase according
-    // to current FLEX mode and symbol value.  Unassigned phases
-    // are zero from the enter_idle() initialization.
-    //
-    // FLEX can transmit the data portion of the frame at either
-    // 1600 bps or 3200 bps, and can use either two- or four-level
-    // FSK encoding.
-    //
-    // At 1600 bps, 2-level, a single "phase" is transmitted with bit
-    // value '0' using level '3' and bit value '1' using level '0'.
-    //
-    // At 1600 bps, 4-level, a second "phase" is transmitted, and the 
-    // di-bits are encoded with a gray code:
-    //
-    // Symbol  Phase 1  Phase 2
-    // ------   -------  -------
-    //   0         1        1
-    //   1         1        0
-    //   2         0        0
-    //   3         0        1
-    //
-    // At 1600 bps, 4-level, these are called PHASE A and PHASE B.
-    //
-    // At 3200 bps, the same 1 or 2 bit encoding occurs, except that
-    // additionally two streams are interleaved on alternating symbols.
-    // Thus, PHASE A (and PHASE B if 4-level) are decoded on one symbol,
-    // then PHASE C (and PHASE D if 4-level) are decoded on the next.
-    
-    int bits = 0;
-    
-    if (d_baudrate == 1600) {
-       d_bit_a = (sym < 2);
-       if (d_levels == 4)
-           d_bit_b = (sym == 0) || (sym == 3);
-
-       *d_phase_a++ = d_bit_a;
-       *d_phase_b++ = d_bit_b;
-       *d_phase_c++ = d_bit_c;
-       *d_phase_d++ = d_bit_d;
-       bits++;
-    }
-    else {
-       if (!d_hibit) {
-           d_bit_a = (sym < 2);
-           if (d_levels == 4)
-               d_bit_b = (sym == 0) || (sym == 3);
-           d_hibit = true;
-       }
-       else {
-           d_bit_c = (sym < 2);
-           if (d_levels == 4)
-               d_bit_d = (sym == 0) || (sym == 3);
-           d_hibit = false;
-
-           *d_phase_a++ = d_bit_a;
-           *d_phase_b++ = d_bit_b;
-           *d_phase_c++ = d_bit_c;
-           *d_phase_d++ = d_bit_d;
-           bits++;
-       }
-    }
-
-    return bits;
-}
-
-int pager_flex_sync::general_work(int noutput_items,
-    gr_vector_int &ninput_items,
-    gr_vector_const_void_star &input_items,
-    gr_vector_void_star &output_items)
-{
-    const unsigned char *in = (const unsigned char *)input_items[0];
-    d_phase_a = (unsigned char *)output_items[0];
-    d_phase_b = (unsigned char *)output_items[1];
-    d_phase_c = (unsigned char *)output_items[2];
-    d_phase_d = (unsigned char *)output_items[3];
-
-    int i = 0, j = 0;
-    int ninputs = ninput_items[0];
-
-    while (i < ninputs && j < noutput_items) {
-        unsigned char sym = *in++; i++;
-        d_index = ++d_index % d_spb;
-    
-        switch (d_state) {
-            case ST_IDLE:
-               // Continually compare the received symbol stream
-               // against the known FLEX sync words.
-                if (test_sync(sym))
-                    enter_syncing();
-                break;
-    
-            case ST_SYNCING:
-               // Wait until we stop seeing sync, then calculate
-               // the center of the bit period (d_center)
-                if (!test_sync(sym))
-                    enter_sync1();
-                break;
-    
-            case ST_SYNC1:
-               // Skip 16 bits of dotting, then accumulate 32 bits
-               // of Frame Information Word.
-                if (d_index == d_center) {
-                   d_fiw = (d_fiw << 1) | (sym > 1);
-                    if (++d_count == 48) {
-                       // FIW is accumulated, call BCH to error correct it
-                       pageri_bch3221(d_fiw);
-                       parse_fiw();
-                        enter_sync2();  
-                   }
-                }
-                break;
-    
-            case ST_SYNC2:
-               // This part and the remainder of the frame are transmitted
-               // at either 1600 bps or 3200 bps based on the received
-               // FLEX sync word. The second SYNC header is 25ms of idle bits
-               // at either speed.
-                if (d_index == d_center) {
-                    // Skip 25 ms = 40 bits @ 1600 bps, 80 @ 3200 bps
-                    if (++d_count == d_baudrate/40)
-                        enter_data();
-                }
-                break;
-    
-            case ST_DATA:
-               // The data portion of the frame is 1760 ms long at either 
-               // baudrate.  This is 2816 bits @ 1600 bps and 5632 bits @ 3200 bps.
-               // The output_symbol() routine decodes and doles out the bits
-               // to each of the four transmitted phases of FLEX interleaved codes.
-                if (d_index == d_center) {
-                   j += output_symbol(sym);                
-                    if (++d_count == d_baudrate*1760/1000)
-                        enter_idle();
-               }
-                break;
-
-            default:
-                assert(0); // memory corruption of d_state if ever gets here
-                break;
-        }
-    }
-
-    consume_each(i);
-    return j;
-}
diff --git a/gr-pager/src/pager_flex_sync.h b/gr-pager/src/pager_flex_sync.h
deleted file mode 100644 (file)
index b401bf5..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2006 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_PAGER_FLEX_SYNC_H
-#define INCLUDED_PAGER_FLEX_SYNC_H
-
-#include <gr_block.h>
-
-class pager_flex_sync;
-typedef boost::shared_ptr<pager_flex_sync> pager_flex_sync_sptr;
-typedef std::vector<gr_int64> gr_int64_vector;
-
-pager_flex_sync_sptr pager_make_flex_sync();
-
-/*!
- * \brief flex sync description
- * \ingroup pager_blk
- */
-
-class pager_flex_sync : public gr_block
-{
-private:
-    // Constructors
-    friend pager_flex_sync_sptr pager_make_flex_sync();
-    pager_flex_sync();
-   
-    // State machine transitions
-    void enter_idle();
-    void enter_syncing();
-    void enter_sync1();
-    void enter_sync2();
-    void enter_data();
-
-    int index_avg(int start, int end);
-    bool test_sync(unsigned char sym);
-    void parse_fiw();
-    int output_symbol(unsigned char sym);    
-    
-    // Simple state machine
-    enum state_t { ST_IDLE, ST_SYNCING, ST_SYNC1, ST_SYNC2, ST_DATA };
-    state_t d_state;     
-
-    int d_index;    // Index into current baud
-    int d_start;    // Start of good sync 
-    int d_center;   // Center of bit
-    int d_end;      // End of good sync
-    int d_count;    // Bit counter
-
-    int d_mode;     // Current packet mode
-    int d_baudrate; // Current decoding baud rate
-    int d_levels;   // Current decoding levels
-    int d_spb;      // Current samples per baud
-    bool d_hibit;   // Alternating bit indicator for 3200 bps
-    
-    gr_int32 d_fiw; // Frame information word
-    int d_frame;    // Current FLEX frame
-    int d_cycle;    // Current FLEX cycle
-    int d_unknown1;
-    int d_unknown2;
-
-    unsigned char d_bit_a;
-    unsigned char d_bit_b;
-    unsigned char d_bit_c;
-    unsigned char d_bit_d;
-    
-    unsigned char *d_phase_a;  
-    unsigned char *d_phase_b;
-    unsigned char *d_phase_c;
-    unsigned char *d_phase_d;
-    
-    gr_int64_vector d_sync; // Trial synchronizers
-
-public:
-    void forecast(int noutput_items, gr_vector_int &inputs_required);
-
-    int general_work(int noutput_items,
-                     gr_vector_int &ninput_items,
-                     gr_vector_const_void_star &input_items, 
-                     gr_vector_void_star &output_items);
-};
-
-#endif /* INCLUDED_PAGER_FLEX_SYNC_H */
diff --git a/gr-pager/src/pager_slicer_fb.cc b/gr-pager/src/pager_slicer_fb.cc
deleted file mode 100644 (file)
index d419db7..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2004,2006,2007 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 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 <pager_slicer_fb.h>
-#include <gr_io_signature.h>
-
-pager_slicer_fb_sptr pager_make_slicer_fb(float alpha)
-{
-    return pager_slicer_fb_sptr(new pager_slicer_fb(alpha));
-}
-
-pager_slicer_fb::pager_slicer_fb(float alpha) :
-    gr_sync_block ("slicer_fb",
-                   gr_make_io_signature (1, 1, sizeof(float)),
-                   gr_make_io_signature (1, 1, sizeof(unsigned char)))
-{
-    d_alpha = alpha;
-    d_beta = 1.0-alpha;
-    d_avg = 0.0;
-}
-
-// Tracks average, minimum, and peak, then converts input into one of:
-//
-// [0, 1, 2, 3]
-unsigned char pager_slicer_fb::slice(float sample)
-{
-    unsigned char decision;
-
-    // Update DC level and remove
-    d_avg = d_avg*d_beta+sample*d_alpha;
-    sample -= d_avg;
-
-    if (sample > 0) {
-        if (sample > 2.0)          
-            decision = 3;
-        else
-            decision = 2;
-    }
-    else {
-        if (sample < -2.0)
-            decision = 0;
-        else
-            decision = 1;
-    }
-
-    return decision;
-}
-
-int pager_slicer_fb::work(int noutput_items,
-                          gr_vector_const_void_star &input_items,
-                                 gr_vector_void_star &output_items)
-{
-    float *iptr = (float *) input_items[0];
-    unsigned char *optr = (unsigned char *) output_items[0];
-
-    int size = noutput_items;
-
-    for (int i = 0; i < size; i++)
-        *optr++ = slice(*iptr++);
-
-    return noutput_items;
-}
diff --git a/gr-pager/src/pager_slicer_fb.h b/gr-pager/src/pager_slicer_fb.h
deleted file mode 100644 (file)
index 75eea3c..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2006,2007 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 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_PAGER_SLICER_FB_H
-#define INCLUDED_PAGER_SLICER_FB_H
-
-#include <gr_sync_block.h>
-
-class pager_slicer_fb;
-typedef boost::shared_ptr<pager_slicer_fb> pager_slicer_fb_sptr;
-
-pager_slicer_fb_sptr pager_make_slicer_fb(float alpha);
-
-/*!
- * \brief slicer description
- * \ingroup pager_blk
- */
-class pager_slicer_fb : public gr_sync_block
-{
-private:
-    friend pager_slicer_fb_sptr pager_make_slicer_fb(float alpha);
-    pager_slicer_fb(float alpha);
-
-    unsigned char slice(float sample);
-
-    float d_alpha;      // DC removal time constant
-    float d_beta;      // 1.0-d_alpha
-    float d_avg;        // Average value for DC offset subtraction
-
-public:
-    int work (int noutput_items,
-              gr_vector_const_void_star &input_items, 
-              gr_vector_void_star &output_items);
-
-    float dc_offset() const { return d_avg; }
-};
-
-#endif /* INCLUDED_PAGER_SLICER_FB_H */
diff --git a/gr-pager/src/pager_swig.i b/gr-pager/src/pager_swig.i
deleted file mode 100644 (file)
index aeb576d..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2005,2006,2009 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- * 
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-%include "gnuradio.i"
-
-%{
-#include "pager_flex_frame.h"
-#include "pager_slicer_fb.h"
-#include "pager_flex_sync.h"
-#include "pager_flex_deinterleave.h"
-#include "pager_flex_parse.h"
-%}
-
-%include "pager_flex_frame.i"
-
-// ----------------------------------------------------------------
-
-GR_SWIG_BLOCK_MAGIC(pager,slicer_fb);
-
-pager_slicer_fb_sptr pager_make_slicer_fb(float alpha);
-
-class pager_slicer_fb : public gr_sync_block
-{
-private:
-    pager_slicer_fb(float alpha);
-
-public:
-    float dc_offset() const { return d_avg; }
-};
-
-// ----------------------------------------------------------------
-
-GR_SWIG_BLOCK_MAGIC(pager,flex_sync);
-
-pager_flex_sync_sptr pager_make_flex_sync();
-
-class pager_flex_sync : public gr_block
-{
-private:
-    pager_flex_sync();
-
-public:
-};
-
-// ----------------------------------------------------------------
-
-GR_SWIG_BLOCK_MAGIC(pager,flex_deinterleave);
-
-pager_flex_deinterleave_sptr pager_make_flex_deinterleave();
-
-class pager_flex_deinterleave : public gr_sync_decimator
-{
-private:
-    pager_flex_deinterleave();
-
-public:
-};
-
-// ----------------------------------------------------------------
-
-GR_SWIG_BLOCK_MAGIC(pager,flex_parse);
-
-pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq);
-
-class pager_flex_parse : public gr_block
-{
-private:
-    pager_flex_parse(gr_msg_queue_sptr queue, float freq);
-
-public:
-};
diff --git a/gr-pager/src/pager_utils.py b/gr-pager/src/pager_utils.py
deleted file mode 100644 (file)
index 72aac68..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# Copyright 2008,2009 Free Software Foundation, Inc.
-# 
-# This file is part of GNU Radio
-# 
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-# 
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-
-from gnuradio import gr
-import gnuradio.gr.gr_threading as _threading
-from string import split, join, printable
-import time
-
-def make_trans_table():
-    table = 256 * ['.']
-    for i in range(256):
-        if (i < 32):
-            table[i] = '.'
-        else:
-            table[i] = chr(i)
-    return ''.join(table)
-
-_trans_table = make_trans_table()
-
-def make_printable(s):
-    return s.translate(_trans_table)
-
-
-class queue_runner(_threading.Thread):
-    def __init__(self, msgq):
-        _threading.Thread.__init__(self)
-        self.msgq = msgq
-        self.done = False
-        self.start()
-
-    def run(self):
-        while 1:
-            msg = self.msgq.delete_head() # Blocking read
-            if msg.type() != 0:
-                break
-            
-            page = join(split(msg.to_string(), chr(128)), '|')
-            s = make_printable(page)
-            print msg.type(), s
-                
-    def end(self):
-        self.msgq.insert_tail(gr.message(1))
-        self.done = True
diff --git a/gr-pager/src/pageri_bch3221.cc b/gr-pager/src/pageri_bch3221.cc
deleted file mode 100644 (file)
index 984ed4d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2006 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 <pageri_bch3221.h>
-
-// Corrects supplied data word according to BCH3221 encoding and
-// returns the number of errors detected/corrected.
-//
-// Not implemented yet
-
-int pageri_bch3221(gr_int32 &data)
-{
-    return 0;
-}
diff --git a/gr-pager/src/pageri_bch3221.h b/gr-pager/src/pageri_bch3221.h
deleted file mode 100644 (file)
index 9dd2be8..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2006 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_PAGERI_BCH3221_H
-#define INCLUDED_PAGERI_BCH3221_H
-
-#include <gr_types.h>
-
-// Perform BCH (32,21) error correction on supplied data
-// Return number of errors found/corrected (0, 1, or 2)
-int pageri_bch3221(gr_int32 &data);
-
-#endif /* INCLUDED_PAGERI_BCH3221_H */
diff --git a/gr-pager/src/pageri_flex_modes.cc b/gr-pager/src/pageri_flex_modes.cc
deleted file mode 100644 (file)
index 4553e0b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2006,2007 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 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 "pageri_flex_modes.h"
-
-const flex_mode_t flex_modes[] = 
-{
-    { 0x870C78F3, 1600, 2 },
-    { 0xB0684F97, 1600, 4 },
-//  { 0xUNKNOWN,  3200, 2 },
-    { 0xDEA0215F, 3200, 4 },
-    { 0x4C7CB383, 3200, 4 }
-};
-
-const int num_flex_modes = sizeof(flex_modes)/sizeof(flex_modes[0]);
-
-unsigned char flex_bcd[17] = "0123456789 U -][";
-
-const char *flex_page_desc[] =
-{
-    "ENC",
-    "UNK",
-    "TON",
-    "NUM",
-    "SPN",
-    "ALN",
-    "BIN",
-    "NNM"
-};
-
-int find_flex_mode(gr_int32 sync_code)
-{
-    for (int i = 0; i < num_flex_modes; i++)
-       if (flex_modes[i].sync == sync_code)
-           return i;
-       
-    // Not found
-    return -1;
-}
diff --git a/gr-pager/src/pageri_flex_modes.h b/gr-pager/src/pageri_flex_modes.h
deleted file mode 100644 (file)
index bc53c12..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2006,2007 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 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_PAGERI_FLEX_MODES_H
-#define INCLUDED_PAGERI_FLEX_MODES_H
-
-#include <gr_types.h>
-
-#define FLEX_SYNC_MARKER 0xA6C6AAAA
-
-typedef struct flex_mode
-{
-    gr_int32     sync;          // Outer synchronization code
-    unsigned int baud;          // Baudrate of SYNC2 and DATA
-    unsigned int levels;        // FSK encoding of SYNC2 and DATA
-}
-flex_mode_t;
-
-extern const flex_mode_t flex_modes[];
-extern const char *flex_page_desc[];
-extern const int num_flex_modes;
-int find_flex_mode(gr_int32 sync_code);
-extern unsigned char flex_bcd[];
-
-typedef enum {
-    FLEX_SECURE,
-    FLEX_UNKNOWN,
-    FLEX_TONE,
-    FLEX_STANDARD_NUMERIC,
-    FLEX_SPECIAL_NUMERIC,
-    FLEX_ALPHANUMERIC,
-    FLEX_BINARY,
-    FLEX_NUMBERED_NUMERIC,
-    NUM_FLEX_PAGE_TYPES
-}
-page_type_t;
-
-inline bool is_alphanumeric_page(page_type_t type)
-{
-    return (type == FLEX_ALPHANUMERIC ||
-           type == FLEX_SECURE);
-}
-
-inline bool is_numeric_page(page_type_t type)
-{
-    return (type == FLEX_STANDARD_NUMERIC ||
-            type == FLEX_SPECIAL_NUMERIC  ||
-            type == FLEX_NUMBERED_NUMERIC);
-}
-
-inline bool is_tone_page(page_type_t type)
-{
-    return (type == FLEX_TONE);
-}
-
-#endif // INCLUDED_PAGERI_FLEX_MODES_H
diff --git a/gr-pager/src/pageri_util.cc b/gr-pager/src/pageri_util.cc
deleted file mode 100644 (file)
index bdd0957..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2006 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 <pageri_util.h>
-
-unsigned char pageri_reverse_bits8(unsigned char val)
-{
-    // This method was attributed to Rich Schroeppel in the Programming 
-    // Hacks section of Beeler, M., Gosper, R. W., and Schroeppel, R. 
-    // HAKMEM. MIT AI Memo 239, Feb. 29, 1972.
-    //
-    // Reverses 8 bits in 5 machine operations with 64 bit arch
-    return (val * 0x0202020202ULL & 0x010884422010ULL) % 1023;
-}
-
-gr_int32 pageri_reverse_bits32(gr_int32 val)
-{
-    gr_int32 out = 0x00000000;
-    out |= (pageri_reverse_bits8((val >> 24) & 0x000000FF)      );
-    out |= (pageri_reverse_bits8((val >> 16) & 0x000000FF) <<  8);
-    out |= (pageri_reverse_bits8((val >>  8) & 0x000000FF) << 16);
-    out |= (pageri_reverse_bits8((val      ) & 0x000000FF) << 24);
-    return out;
-}
diff --git a/gr-pager/src/pageri_util.h b/gr-pager/src/pageri_util.h
deleted file mode 100644 (file)
index 78ae7aa..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2006 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_PAGERI_UTIL_H
-#define INCLUDED_PAGERI_UTIL_H
-
-#include <gr_types.h>
-
-unsigned char pageri_reverse_bits8(unsigned char val);
-gr_int32 pageri_reverse_bits32(gr_int32 val);
-
-#endif /* INCLUDED_PAGERI_UTIL_H */
diff --git a/gr-pager/src/qa_pager.py b/gr-pager/src/qa_pager.py
deleted file mode 100755 (executable)
index 5bf72b5..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2004,2006 Free Software Foundation, Inc.
-# 
-# This file is part of GNU Radio
-# 
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-# 
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with GNU Radio; see the file COPYING.  If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-# 
-
-from gnuradio import gr, gr_unittest
-import pager_swig
-
-class qa_pgr(gr_unittest.TestCase):
-
-    def setUp (self):
-        self.tb = gr.top_block ()
-
-    def tearDown (self):
-        self.tb = None
-
-if __name__ == '__main__':
-    gr_unittest.main ()
diff --git a/gr-pager/src/run_tests.in b/gr-pager/src/run_tests.in
deleted file mode 100644 (file)
index 6bb0c39..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-# 1st parameter is absolute path to component source directory
-# 2nd parameter is absolute path to component build directory
-# 3rd parameter is path to Python QA directory
-
-@top_builddir@/run_tests.sh \
-    @abs_top_srcdir@/gr-pager \
-    @abs_top_builddir@/gr-pager \
-    @srcdir@
diff --git a/gr-pager/swig/.gitignore b/gr-pager/swig/.gitignore
new file mode 100644 (file)
index 0000000..6df28c3
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile
+/Makefile.in
+/pager_swig.py
+/pager_swig.cc
+/*.pyc
+/run_tests
diff --git a/gr-pager/swig/Makefile.am b/gr-pager/swig/Makefile.am
new file mode 100644 (file)
index 0000000..890459c
--- /dev/null
@@ -0,0 +1,60 @@
+#
+# Copyright 2004,2005,2006,2008,2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+include $(top_srcdir)/Makefile.common
+
+AM_CPPFLAGS = \
+       $(STD_DEFINES_AND_INCLUDES) \
+       $(PYTHON_CPPFLAGS) \
+       $(WITH_INCLUDES) \
+       -I$(top_srcdir)/gr-pager/lib
+
+##############################
+# SWIG interface and library
+TOP_SWIG_IFILES = \
+       pager_swig.i
+
+# Install so that they end up available as:
+#   import gnuradio.pager
+# This ends up at:
+#   ${prefix}/lib/python${python_version}/site-packages/gnuradio/pager
+pager_swig_pythondir_category = \
+       gnuradio/pager
+
+# additional libraries for linking with the SWIG-generated library
+pager_swig_la_swig_libadd = \
+       $(builddir)/../lib/libgnuradio-pager.la
+
+# additional SWIG files to be installed
+pager_swig_swiginclude_headers = \
+       pager_flex_deinterleave.i \
+       pager_flex_frame.i \
+       pager_flex_parse.i \
+       pager_flex_sync.i \
+       pager_slicer_fb.i
+
+include $(top_srcdir)/Makefile.swig
+
+# add some of the variables generated inside the Makefile.swig.gen
+BUILT_SOURCES = $(swig_built_sources)
+
+# Do not distribute the output of SWIG
+no_dist_files = $(swig_built_sources)
diff --git a/gr-pager/swig/Makefile.swig.gen b/gr-pager/swig/Makefile.swig.gen
new file mode 100644 (file)
index 0000000..5cfbc66
--- /dev/null
@@ -0,0 +1,259 @@
+# -*- Makefile -*-
+#
+# Copyright 2009 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+# Makefile.swig.gen for pager_swig.i
+
+## Default install locations for these files:
+##
+## Default location for the Python directory is:
+##  ${prefix}/lib/python${python_version}/site-packages/[category]/pager_swig
+## Default location for the Python exec directory is:
+##  ${exec_prefix}/lib/python${python_version}/site-packages/[category]/pager_swig
+##
+## The following can be overloaded to change the install location, but
+## this has to be done in the including Makefile.am -before-
+## Makefile.swig is included.
+
+pager_swig_pythondir_category ?= gnuradio/pager_swig
+pager_swig_pylibdir_category ?= $(pager_swig_pythondir_category)
+pager_swig_pythondir = $(pythondir)/$(pager_swig_pythondir_category)
+pager_swig_pylibdir = $(pyexecdir)/$(pager_swig_pylibdir_category)
+
+## SWIG headers are always installed into the same directory.
+
+pager_swig_swigincludedir = $(swigincludedir)
+
+## This is a template file for a "generated" Makefile addition (in
+## this case, "Makefile.swig.gen").  By including the top-level
+## Makefile.swig, this file will be used to generate the SWIG
+## dependencies.  Assign the variable TOP_SWIG_FILES to be the list of
+## SWIG .i files to generated wrappings for; there can be more than 1
+## so long as the names are unique (no sorting is done on the
+## TOP_SWIG_FILES list). This file explicitly assumes that a SWIG .i
+## file will generate .cc, .py, and possibly .h files -- meaning that
+## all of these files will have the same base name (that provided for
+## the SWIG .i file).
+##
+## This code is setup to ensure parallel MAKE ("-j" or "-jN") does the
+## right thing.  For more info, see <
+## http://sources.redhat.com/automake/automake.html#Multiple-Outputs >
+
+## Stamps used to ensure parallel make does the right thing.  These
+## are removed by "make clean", but otherwise unused except during the
+## parallel built.  These will not be included in a tarball, because
+## the SWIG-generated files will be removed from the distribution.
+
+STAMPS += $(DEPDIR)/pager_swig-generate-*
+
+## Other cleaned files: dependency files generated by SWIG or this Makefile
+
+MOSTLYCLEANFILES += $(DEPDIR)/*.S*
+
+## Add the .py and .cc files to the list of SWIG built sources.  The
+## .h file is sometimes built, but not always ... so that one has to
+## be added manually by the including Makefile.am .
+
+swig_built_sources += pager_swig.py pager_swig.cc
+
+## Various SWIG variables.  These can be overloaded in the including
+## Makefile.am by setting the variable value there, then including
+## Makefile.swig .
+
+pager_swig_swiginclude_HEADERS =               \
+       pager_swig.i                    \
+       $(pager_swig_swiginclude_headers)
+
+pager_swig_pylib_LTLIBRARIES =         \
+       _pager_swig.la
+
+_pager_swig_la_SOURCES =                       \
+       pager_swig.cc                   \
+       $(pager_swig_la_swig_sources)
+
+_pager_swig_la_LIBADD =                        \
+       $(STD_SWIG_LA_LIB_ADD)          \
+       $(pager_swig_la_swig_libadd)
+
+_pager_swig_la_LDFLAGS =                       \
+       $(STD_SWIG_LA_LD_FLAGS)         \
+       $(pager_swig_la_swig_ldflags)
+
+_pager_swig_la_CXXFLAGS =                      \
+       $(STD_SWIG_CXX_FLAGS)           \
+       $(pager_swig_la_swig_cxxflags)
+
+pager_swig_python_PYTHON =                     \
+       pager_swig.py                   \
+       $(pager_swig_python)
+
+## Entry rule for running SWIG
+
+pager_swig.h pager_swig.py pager_swig.cc: pager_swig.i
+## This rule will get called only when MAKE decides that one of the
+## targets needs to be created or re-created, because:
+##
+## * The .i file is newer than any or all of the generated files;
+##
+## * Any or all of the .cc, .h, or .py files does not exist and is
+##   needed (in the case this file is not needed, the rule for it is
+##   ignored); or
+##
+## * Some SWIG-based dependecy of the .cc file isn't met and hence the
+##   .cc file needs be be regenerated.  Explanation: Because MAKE
+##   knows how to handle dependencies for .cc files (regardless of
+##   their name or extension), then the .cc file is used as a target
+##   instead of the .i file -- but with the dependencies of the .i
+##   file.  It is this last reason why the line:
+##
+##             if test -f $@; then :; else
+##
+##   cannot be used in this case: If a .i file dependecy is not met,
+##   then the .cc file needs to be rebuilt.  But if the stamp is newer
+##   than the .cc file, and the .cc file exists, then in the original
+##   version (with the 'test' above) the internal MAKE call will not
+##   be issued and hence the .cc file will not be rebuilt.
+##
+## Once execution gets to here, it should always proceed no matter the
+## state of a stamp (as discussed in link above).  The
+## $(DEPDIR)/pager_swig-generate stuff is used to allow for parallel
+## builds to "do the right thing".  The stamp has no relationship with
+## either the target files or dependency file; it is used solely for
+## the protection of multiple builds during a given call to MAKE.
+##
+## Catch signals SIGHUP (1), SIGINT (2), SIGPIPE (13), and SIGTERM
+## (15).  At a caught signal, the quoted command will be issued before
+## exiting.  In this case, remove any stamp, whether temporary of not.
+## The trap is valid until the process exits; the process includes all
+## commands appended via "\"s.
+##
+       trap 'rm -rf $(DEPDIR)/pager_swig-generate-*' 1 2 13 15; \
+##
+## Create a temporary directory, which acts as a lock.  The first
+## process to create the directory will succeed and issue the MAKE
+## command to do the actual work, while all subsequent processes will
+## fail -- leading them to wait for the first process to finish.
+##
+       if mkdir $(DEPDIR)/pager_swig-generate-lock 2>/dev/null; then \
+##
+## This code is being executed by the first process to succeed in
+## creating the directory lock.
+##
+## Remove the stamp associated with this filename.
+##
+               rm -f $(DEPDIR)/pager_swig-generate-stamp; \
+##
+## Tell MAKE to run the rule for creating this stamp.
+##
+               $(MAKE) $(AM_MAKEFLAGS) $(DEPDIR)/pager_swig-generate-stamp WHAT=$<; \
+##
+## Now that the .cc, .h, and .py files have been (re)created from the
+## .i file, future checking of this rule during the same MAKE
+## execution will come back that the rule doesn't need to be executed
+## because none of the conditions mentioned at the start of this rule
+## will be positive.  Remove the the directory lock, which frees up
+## any waiting process(es) to continue.
+##
+               rmdir $(DEPDIR)/pager_swig-generate-lock; \
+       else \
+##
+## This code is being executed by any follower processes while the
+## directory lock is in place.
+##
+## Wait until the first process is done, testing once per second.
+##
+               while test -d $(DEPDIR)/pager_swig-generate-lock; do \
+                       sleep 1; \
+               done; \
+##
+## Succeed if and only if the first process succeeded; exit this
+## process returning the status of the generated stamp.
+##
+               test -f $(DEPDIR)/pager_swig-generate-stamp; \
+               exit $$?; \
+       fi;
+
+$(DEPDIR)/pager_swig-generate-stamp:
+## This rule will be called only by the first process issuing the
+## above rule to succeed in creating the lock directory, after
+## removing the actual stamp file in order to guarantee that MAKE will
+## execute this rule.
+##
+## Call SWIG to generate the various output files; special
+## post-processing on 'mingw32' host OS for the dependency file.
+##
+       if $(SWIG) $(STD_SWIG_PYTHON_ARGS) $(pager_swig_swig_args) \
+               -MD -MF $(DEPDIR)/pager_swig.Std \
+               -module pager_swig -o pager_swig.cc $(WHAT); then \
+           if test $(host_os) = mingw32; then \
+               $(RM) $(DEPDIR)/pager_swig.Sd; \
+               $(SED) 's,\\\\,/,g' < $(DEPDIR)/pager_swig.Std \
+                       > $(DEPDIR)/pager_swig.Sd; \
+               $(RM) $(DEPDIR)/pager_swig.Std; \
+               $(MV) $(DEPDIR)/pager_swig.Sd $(DEPDIR)/pager_swig.Std; \
+           fi; \
+       else \
+           $(RM) $(DEPDIR)/pager_swig.S*; exit 1; \
+       fi;
+##
+## Mess with the SWIG output .Std dependency file, to create a
+## dependecy file valid for the input .i file: Basically, simulate the
+## dependency file created for libraries by GNU's libtool for C++,
+## where all of the dependencies for the target are first listed, then
+## each individual dependency is listed as a target with no further
+## dependencies.
+##
+## (1) remove the current dependency file
+##
+       $(RM) $(DEPDIR)/pager_swig.d
+##
+## (2) Copy the whole SWIG file:
+##
+       cp $(DEPDIR)/pager_swig.Std $(DEPDIR)/pager_swig.d
+##
+## (3) all a carriage return to the end of the dependency file.
+##
+       echo "" >> $(DEPDIR)/pager_swig.d
+##
+## (4) from the SWIG file, remove the first line (the target); remove
+##     trailing " \" and " " from each line.  Append ":" to each line,
+##     followed by 2 carriage returns, then append this to the end of
+##     the dependency file.
+##
+       $(SED) -e '1d;s, \\,,g;s, ,,g' < $(DEPDIR)/pager_swig.Std | \
+               awk '{ printf "%s:\n\n", $$0 }' >> $(DEPDIR)/pager_swig.d
+##
+## (5) remove the SWIG-generated file
+##
+       $(RM) $(DEPDIR)/pager_swig.Std
+##
+## Create the stamp for this filename generation, to signal success in
+## executing this rule; allows other threads waiting on this process
+## to continue.
+##
+       touch $(DEPDIR)/pager_swig-generate-stamp
+
+# KLUDGE: Force runtime include of a SWIG dependency file.  This is
+# not guaranteed to be portable, but will probably work.  If it works,
+# we have accurate dependencies for our swig stuff, which is good.
+
+@am__include@ @am__quote@./$(DEPDIR)/pager_swig.d@am__quote@
+
diff --git a/gr-pager/swig/pager_flex_deinterleave.i b/gr-pager/swig/pager_flex_deinterleave.i
new file mode 100644 (file)
index 0000000..f34951a
--- /dev/null
@@ -0,0 +1,11 @@
+GR_SWIG_BLOCK_MAGIC(pager,flex_deinterleave);
+
+pager_flex_deinterleave_sptr pager_make_flex_deinterleave();
+
+class pager_flex_deinterleave : public gr_sync_decimator
+{
+private:
+    pager_flex_deinterleave();
+
+public:
+};
diff --git a/gr-pager/swig/pager_flex_frame.i b/gr-pager/swig/pager_flex_frame.i
new file mode 100644 (file)
index 0000000..d754f5f
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2006 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.
+ */
+
+class pager_flex_frame;
+typedef boost::shared_ptr<pager_flex_frame> pager_flex_frame_sptr;
+%template(pager_flex_frame_sptr) boost::shared_ptr<pager_flex_frame>;
+
+%rename(flex_frame) pager_make_flex_frame;
+pager_flex_frame_sptr pager_make_flex_frame();
+
+/*!
+ * \brief flex_frame.
+ */
+class pager_flex_frame {
+    pager_flex_frame();
+
+public:
+};
+
diff --git a/gr-pager/swig/pager_flex_parse.i b/gr-pager/swig/pager_flex_parse.i
new file mode 100644 (file)
index 0000000..21e0245
--- /dev/null
@@ -0,0 +1,11 @@
+GR_SWIG_BLOCK_MAGIC(pager,flex_parse);
+
+pager_flex_parse_sptr pager_make_flex_parse(gr_msg_queue_sptr queue, float freq);
+
+class pager_flex_parse : public gr_block
+{
+private:
+    pager_flex_parse(gr_msg_queue_sptr queue, float freq);
+
+public:
+};
diff --git a/gr-pager/swig/pager_flex_sync.i b/gr-pager/swig/pager_flex_sync.i
new file mode 100644 (file)
index 0000000..49823db
--- /dev/null
@@ -0,0 +1,11 @@
+GR_SWIG_BLOCK_MAGIC(pager,flex_sync);
+
+pager_flex_sync_sptr pager_make_flex_sync();
+
+class pager_flex_sync : public gr_block
+{
+private:
+    pager_flex_sync();
+
+public:
+};
diff --git a/gr-pager/swig/pager_slicer_fb.i b/gr-pager/swig/pager_slicer_fb.i
new file mode 100644 (file)
index 0000000..4ffb5b7
--- /dev/null
@@ -0,0 +1,12 @@
+GR_SWIG_BLOCK_MAGIC(pager,slicer_fb);
+
+pager_slicer_fb_sptr pager_make_slicer_fb(float alpha);
+
+class pager_slicer_fb : public gr_sync_block
+{
+private:
+    pager_slicer_fb(float alpha);
+
+public:
+    float dc_offset() const { return d_avg; }
+};
diff --git a/gr-pager/swig/pager_swig.i b/gr-pager/swig/pager_swig.i
new file mode 100644 (file)
index 0000000..66d6de7
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2005,2006,2009 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+%include "gnuradio.i"
+
+%{
+#include "pager_flex_frame.h"
+#include "pager_slicer_fb.h"
+#include "pager_flex_sync.h"
+#include "pager_flex_deinterleave.h"
+#include "pager_flex_parse.h"
+%}
+
+%include "pager_flex_frame.i"
+%include "pager_slicer_fb.i"
+%include "pager_flex_sync.i"
+%include "pager_flex_deinterleave.i"
+%include "pager_flex_parse.i"
index 69fbe26dc0758c12fc39a7af13c4d797d2ec86df..7e1ab93876209ff03640c895d8495f9414f36ff1 100644 (file)
@@ -14,7 +14,7 @@ abs_top_builddir=@abs_top_builddir@
 export srcdir=$3
 
 # Where to find my swig generated shared library
-mylibdir=$2/src:$2/src/.libs:$2/src/lib:$2/src/lib/.libs
+mylibdir=$2/src:$2/src/.libs:$2/src/lib:$2/src/lib/.libs:$2/swig:$2/swig/.libs
 
 # Where to find my swig generated python module
 mysrcdir=$1/src:$1/src/lib