-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
AC_CONFIG_FILES([\
gr-pager/Makefile \
gr-pager/gnuradio-pager.pc \
- gr-pager/src/Makefile \
- gr-pager/src/run_tests
+ gr-pager/apps/Makefile \
+ gr-pager/grc/Makefile \
+ 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])
])
])
include $(top_srcdir)/Makefile.common
-SUBDIRS = src
+SUBDIRS = lib
+
+if PYTHON
+SUBDIRS += swig python apps grc
+endif
pkgconfigdir = $(libdir)/pkgconfig
dist_pkgconfig_DATA = gnuradio-pager.pc
--- /dev/null
+Makefile
+Makefile.in
--- /dev/null
+#
+# 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.
+#
+
+include $(top_srcdir)/Makefile.common
+
+if PYTHON
+
+dist_bin_SCRIPTS = \
+ usrp_flex.py \
+ usrp_flex_all.py \
+ usrp_flex_band.py
+
+noinst_PYTHON = \
+ usrp_rx_flex.py
+endif
+
+EXTRA_DIST = \
+ usrp_rx_flex.grc
--- /dev/null
+#!/usr/bin/env python
+#
+# Copyright 2006,2007,2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio import gr, gru, usrp, optfir, eng_notation, pager
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+import time, os, sys
+
+"""
+This example application demonstrates receiving and demodulating the
+FLEX pager protocol.
+
+The following are required command line parameters:
+
+-f FREQ USRP receive frequency
+
+The following are optional command line parameters:
+
+-R SUBDEV Daughter board specification, defaults to first found
+-F FILE Read samples from a file instead of USRP.
+-c FREQ Calibration offset. Gets added to receive frequency.
+ Defaults to 0.0 Hz.
+-g GAIN Daughterboard gain setting. Defaults to mid-range.
+-l Log flow graph to files (LOTS of data)
+-v Verbose output
+
+Once the program is running, ctrl-break (Ctrl-C) stops operation.
+"""
+
+class app_top_block(gr.top_block):
+ def __init__(self, options, queue):
+ gr.top_block.__init__(self, "usrp_flex")
+ self.options = options
+ self.offset = 0.0
+ self.adj_time = time.time()
+ self.verbose = options.verbose
+
+ if options.from_file is None:
+ # Set up USRP source with specified RX daughterboard
+ self.src = usrp.source_c()
+ if options.rx_subdev_spec == None:
+ options.rx_subdev_spec = usrp.pick_rx_subdevice(self.src)
+ self.subdev = usrp.selected_subdev(self.src, options.rx_subdev_spec)
+ self.src.set_mux(usrp.determine_rx_mux_value(self.src, options.rx_subdev_spec))
+
+ # Grab 250 KHz of spectrum (sample rate becomes 250 ksps complex)
+ self.src.set_decim_rate(256)
+
+ # If no gain specified, set to midrange
+ if options.gain is None:
+ g = self.subdev.gain_range()
+ options.gain = (g[0]+g[1])/2.0
+ self.subdev.set_gain(options.gain)
+
+ # Tune daughterboard
+ actual_frequency = options.frequency+options.calibration
+ tune_result = usrp.tune(self.src, 0, self.subdev, actual_frequency)
+ if not tune_result:
+ sys.stderr.write("Failed to set center frequency to "+`actual_frequency`+"\n")
+ sys.exit(1)
+
+ if options.verbose:
+ print "Using RX daughterboard", self.subdev.side_and_name()
+ print "USRP gain is", options.gain
+ print "USRP tuned to", actual_frequency
+
+ else:
+ # Use supplied file as source of samples
+ self.src = gr.file_source(gr.sizeof_gr_complex, options.from_file)
+ if options.verbose:
+ print "Reading samples from", options.from_file
+
+ if options.log and not options.from_file:
+ usrp_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat')
+ self.connect(self.src, usrp_sink)
+
+ # Set up 22KHz-wide bandpass about center frequency. Decimate by 10
+ # to get channel rate of 25Ksps
+ taps = optfir.low_pass(1.0, # Filter gain
+ 250e3, # Sample rate
+ 11000, # One-sided modulation bandwidth
+ 12500, # One-sided channel bandwidth
+ 0.1, # Passband ripple
+ 60) # Stopband attenuation
+
+ if options.verbose:
+ print "Channel filter has", len(taps), "taps."
+
+ self.chan = gr.freq_xlating_fir_filter_ccf(10, # Decimation rate
+ taps, # Filter taps
+ 0.0, # Offset frequency
+ 250e3) # Sample rate
+
+ if options.log:
+ chan_sink = gr.file_sink(gr.sizeof_gr_complex, 'chan.dat')
+ self.connect(self.chan, chan_sink)
+
+ # FLEX protocol demodulator
+ self.flex = pager.flex_demod(queue, options.frequency, options.verbose, options.log)
+
+ self.connect(self.src, self.chan, self.flex)
+
+ def freq_offset(self):
+ return self.flex.dc_offset()*1600
+
+ def adjust_freq(self):
+ if time.time() - self.adj_time > 1.6: # Only do it once per FLEX frame
+ self.adj_time = time.time()
+ self.offset -= self.freq_offset()
+ self.chan.set_center_freq(self.offset)
+ if self.verbose:
+ print "Channel frequency offset (Hz):", int(self.offset)
+
+def main():
+ parser = OptionParser(option_class=eng_option)
+ parser.add_option("-f", "--frequency", type="eng_float", default=None,
+ help="set receive frequency to Hz", metavar="Hz")
+ parser.add_option("-R", "--rx-subdev-spec", type="subdev",
+ help="select USRP Rx side A or B", metavar="SUBDEV")
+ parser.add_option("-c", "--calibration", type="eng_float", default=0.0,
+ help="set frequency offset to Hz", metavar="Hz")
+ parser.add_option("-g", "--gain", type="int", default=None,
+ help="set RF gain", metavar="dB")
+ parser.add_option("-l", "--log", action="store_true", default=False,
+ help="log flowgraph to files (LOTS of data)")
+ parser.add_option("-v", "--verbose", action="store_true", default=False,
+ help="display debug output")
+ parser.add_option("-F", "--from-file", default=None,
+ help="read samples from file instead of USRP")
+ (options, args) = parser.parse_args()
+
+ if len(args) > 0 or (options.frequency == None and options.from_file == None):
+ print "Run 'usrp_flex.py -h' for options."
+ sys.exit(1)
+
+ if options.frequency == None:
+ options.frequency = 0.0
+
+ # Flow graph emits pages into message queue
+ queue = gr.msg_queue()
+ tb = app_top_block(options, queue)
+ runner = pager.queue_runner(queue)
+
+ try:
+ tb.run()
+ except KeyboardInterrupt:
+ pass
+
+ runner.end()
+
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+#!/usr/bin/env python
+#
+# Copyright 2006,2007,2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio import gr, gru, usrp, optfir, eng_notation, blks2, pager
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+from string import split, join, printable
+import time
+
+class app_top_block(gr.top_block):
+ def __init__(self, options, queue):
+ gr.top_block.__init__(self, "usrp_flex_all")
+
+ if options.from_file is not None:
+ src = gr.file_source(gr.sizeof_gr_complex, options.from_file)
+ if options.verbose:
+ print "Reading samples from file", options.from_file
+ else:
+ src = usrp.source_c()
+ if options.rx_subdev_spec is None:
+ options.rx_subdev_spec = usrp.pick_rx_subdevice(src)
+ subdev = usrp.selected_subdev(src, options.rx_subdev_spec)
+ src.set_mux(usrp.determine_rx_mux_value(src, options.rx_subdev_spec))
+ src.set_decim_rate(20)
+ result = usrp.tune(src, 0, subdev, 930.5125e6+options.calibration)
+ if options.verbose:
+ print "Using", subdev.name(), " for receiving."
+ print "Tuned USRP to", 930.5125e6+options.calibration
+
+ taps = gr.firdes.low_pass(1.0,
+ 1.0,
+ 1.0/128.0*0.4,
+ 1.0/128.0*0.1,
+ gr.firdes.WIN_HANN)
+
+ if options.verbose:
+ print "Channel filter has", len(taps), "taps"
+
+ bank = blks2.analysis_filterbank(128, taps)
+ self.connect(src, bank)
+
+ if options.log and options.from_file == None:
+ src_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat')
+ self.connect(src, src_sink)
+
+ for i in range(128):
+ if i < 64:
+ freq = 930.5e6+i*25e3
+ else:
+ freq = 928.9e6+(i-64)*25e3
+
+ if (freq < 929.0e6 or freq > 932.0e6):
+ self.connect((bank, i), gr.null_sink(gr.sizeof_gr_complex))
+ else:
+ self.connect((bank, i), pager.flex_demod(queue, freq, options.verbose, options.log))
+ if options.log:
+ self.connect((bank, i), gr.file_sink(gr.sizeof_gr_complex, 'chan_'+'%3.3f'%(freq/1e6)+'.dat'))
+
+def main():
+ parser = OptionParser(option_class=eng_option)
+ parser.add_option("-R", "--rx-subdev-spec", type="subdev",
+ help="select USRP Rx side A or B (default=first daughterboard found)")
+ parser.add_option("-c", "--calibration", type="eng_float", default=0.0,
+ help="set frequency offset to Hz", metavar="Hz")
+ parser.add_option("-g", "--gain", type="int",
+ help="set RF gain", metavar="dB")
+ parser.add_option("-F", "--from-file", default=None,
+ help="Read from file instead of USRP")
+ parser.add_option("-l", "--log", action="store_true", default=False,
+ help="log flowgraph to files (LOTS of data)")
+ parser.add_option("-v", "--verbose", action="store_true", default=False,
+ help="display debug output")
+ (options, args) = parser.parse_args()
+
+ if options.verbose:
+ print options
+
+ queue = gr.msg_queue()
+ tb = app_top_block(options, queue)
+ runner = pager.queue_runner(queue)
+
+ try:
+ tb.run()
+ except KeyboardInterrupt:
+ pass
+
+ runner.end()
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+#!/usr/bin/env python
+#
+# Copyright 2006,2007,2009 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio import gr, gru, usrp, optfir, eng_notation, blks2, pager
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser
+
+class app_top_block(gr.top_block):
+ def __init__(self, options, queue):
+ gr.top_block.__init__(self, "usrp_flex_all")
+ self.subdev = None
+
+ if options.from_file is not None:
+ self.src = gr.file_source(gr.sizeof_gr_complex, options.from_file)
+ if options.verbose:
+ print "Reading samples from file", options.from_file
+ else:
+ self.src = usrp.source_c()
+ if options.rx_subdev_spec is None:
+ options.rx_subdev_spec = usrp.pick_rx_subdevice(self.src)
+ self.subdev = usrp.selected_subdev(self.src, options.rx_subdev_spec)
+ self.src.set_mux(usrp.determine_rx_mux_value(self.src, options.rx_subdev_spec))
+ self.src.set_decim_rate(64)
+ frequency = options.frequency+options.calibration
+ result = usrp.tune(self.src, 0, self.subdev, frequency)
+ if options.verbose:
+ print "Using", self.subdev.name(), " for receiving."
+ print "Tuned USRP to", frequency
+
+ taps = gr.firdes.low_pass(1.0,
+ 1.0,
+ 1.0/40.0*0.4,
+ 1.0/40.0*0.1,
+ gr.firdes.WIN_HANN)
+
+ if options.verbose:
+ print "Channel filter has", len(taps), "taps"
+
+ bank = blks2.analysis_filterbank(40, taps)
+ self.connect(self.src, bank)
+
+ if options.log and options.from_file == None:
+ src_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat')
+ self.connect(self.src, src_sink)
+
+ for i in range(40):
+ if i < 20:
+ freq = options.frequency+i*25e3
+ else:
+ freq = options.frequency-0.5e6+(i-20)*25e3
+
+ self.connect((bank, i), pager.flex_demod(queue, freq, options.verbose, options.log))
+ if options.log:
+ self.connect((bank, i), gr.file_sink(gr.sizeof_gr_complex, 'chan_'+'%3.3f'%(freq/1e6)+'.dat'))
+
+
+def main():
+ parser = OptionParser(option_class=eng_option)
+ parser.add_option("-f", "--frequency", type="eng_float", default=929.5e6,
+ help="set receive center frequency to Hz", metavar="Hz")
+ parser.add_option("-R", "--rx-subdev-spec", type="subdev",
+ help="select USRP Rx side A or B (default=first daughterboard found)")
+ parser.add_option("-c", "--calibration", type="eng_float", default=0.0,
+ help="set frequency offset to Hz", metavar="Hz")
+ parser.add_option("-g", "--gain", type="int",
+ help="set RF gain", metavar="dB")
+ parser.add_option("-F", "--from-file", default=None,
+ help="Read from file instead of USRP")
+ parser.add_option("-l", "--log", action="store_true", default=False,
+ help="log flowgraph to files (LOTS of data)")
+ parser.add_option("-v", "--verbose", action="store_true", default=False,
+ help="display debug output")
+ (options, args) = parser.parse_args()
+
+ if options.verbose:
+ print options
+
+ queue = gr.msg_queue()
+ tb = app_top_block(options, queue)
+ runner = pager.queue_runner(queue)
+
+ try:
+ tb.run()
+ except KeyboardInterrupt:
+ pass
+
+ runner.end()
+
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+<?xml version='1.0' encoding='ASCII'?>
+<flow_graph>
+ <timestamp>Thu Oct 29 11:01:22 2009</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>usrp_rx_flex</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>USRP FLEX Pager Receiver (Single Channel)</value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>4095,4095</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>wx_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>adc_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>64e6</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(225, 12)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>sample_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>adc_rate/decim</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(382, 12)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>freq</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>band_freq+(channel-61)*25e3</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(480, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_fftsink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_fftsink2_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>FLEX Spectrum</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>sample_rate</value>
+ </param>
+ <param>
+ <key>baseband_freq</key>
+ <value>band_freq</value>
+ </param>
+ <param>
+ <key>y_per_div</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>y_divs</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ref_level</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ref_scale</key>
+ <value>65536</value>
+ </param>
+ <param>
+ <key>fft_size</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>fft_rate</key>
+ <value>30</value>
+ </param>
+ <param>
+ <key>peak_hold</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>avg_alpha</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>win</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>win_size</key>
+ <value></value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>0,0,1,1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>displays,0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(34, 508)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>notebook</key>
+ <param>
+ <key>id</key>
+ <value>displays</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.NB_TOP</value>
+ </param>
+ <param>
+ <key>labels</key>
+ <value>['RX Spectrum','Baseband']</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>1, 0, 1, 5</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(9, 209)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>import</key>
+ <param>
+ <key>id</key>
+ <value>import_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>import</key>
+ <value>import os, math</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 76)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>usrp_simple_source_x</key>
+ <param>
+ <key>id</key>
+ <value>usrp_source</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>format</key>
+ <value></value>
+ </param>
+ <param>
+ <key>which</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>decimation</key>
+ <value>decim</value>
+ </param>
+ <param>
+ <key>frequency</key>
+ <value>band_freq</value>
+ </param>
+ <param>
+ <key>lo_offset</key>
+ <value>float('inf')</value>
+ </param>
+ <param>
+ <key>gain</key>
+ <value>rx_gain</value>
+ </param>
+ <param>
+ <key>side</key>
+ <value>A</value>
+ </param>
+ <param>
+ <key>rx_ant</key>
+ <value>RXA</value>
+ </param>
+ <param>
+ <key>hb_filters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(32, 734)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_freq_xlating_fir_filter_xxx</key>
+ <param>
+ <key>id</key>
+ <value>gr_freq_xlating_fir_filter_xxx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ccc</value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>channel_decim</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>channel_taps</value>
+ </param>
+ <param>
+ <key>center_freq</key>
+ <value>band_freq-freq+offset</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>sample_rate</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(321, 750)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_fftsink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_fftsink2_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Channel Spectrum</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>channel_rate</value>
+ </param>
+ <param>
+ <key>baseband_freq</key>
+ <value>freq</value>
+ </param>
+ <param>
+ <key>y_per_div</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>y_divs</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ref_level</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ref_scale</key>
+ <value>65536</value>
+ </param>
+ <param>
+ <key>fft_size</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>fft_rate</key>
+ <value>30</value>
+ </param>
+ <param>
+ <key>peak_hold</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>avg_alpha</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>win</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>win_size</key>
+ <value></value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>1, 0, 1, 1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>displays, 0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(344, 511)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>decim</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(310, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>symbol_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>3200</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(590, 12)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>channel_decim</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>int(sample_rate/channel_rate)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(906, 12)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>deviation</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4800</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(688, 14)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>demod_k</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>3*channel_rate/(2*math.pi*deviation)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(598, 857)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>channel_taps</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>firdes.low_pass(10, sample_rate, passband/2.0, (channel_rate-passband)/2.0)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(325, 857)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>config_filename</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>os.environ["HOME"]+"/.gnuradio/config.conf"</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(9, 133)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_config</key>
+ <param>
+ <key>id</key>
+ <value>saved_band_freq</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>930.5125e6</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>real</value>
+ </param>
+ <param>
+ <key>config_file</key>
+ <value>config_filename</value>
+ </param>
+ <param>
+ <key>section</key>
+ <value>gr-pager</value>
+ </param>
+ <param>
+ <key>option</key>
+ <value>band_center</value>
+ </param>
+ <param>
+ <key>writeback</key>
+ <value>band_freq</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(228, 311)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_config</key>
+ <param>
+ <key>id</key>
+ <value>saved_channel</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>25</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>config_file</key>
+ <value>config_filename</value>
+ </param>
+ <param>
+ <key>section</key>
+ <value>gr-pager</value>
+ </param>
+ <param>
+ <key>option</key>
+ <value>channel</value>
+ </param>
+ <param>
+ <key>writeback</key>
+ <value>channel</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(387, 312)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_config</key>
+ <param>
+ <key>id</key>
+ <value>saved_offset</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>real</value>
+ </param>
+ <param>
+ <key>config_file</key>
+ <value>config_filename</value>
+ </param>
+ <param>
+ <key>section</key>
+ <value>gr-pager</value>
+ </param>
+ <param>
+ <key>option</key>
+ <value>freq_offset</value>
+ </param>
+ <param>
+ <key>writeback</key>
+ <value>offset</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(547, 312)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_config</key>
+ <param>
+ <key>id</key>
+ <value>saved_rx_gain</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>40</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>config_file</key>
+ <value>config_filename</value>
+ </param>
+ <param>
+ <key>section</key>
+ <value>gr-pager</value>
+ </param>
+ <param>
+ <key>option</key>
+ <value>rx_gain</value>
+ </param>
+ <param>
+ <key>writeback</key>
+ <value>rx_gain</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(706, 312)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_text_box</key>
+ <param>
+ <key>id</key>
+ <value>band_freq</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Band Freq.</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>saved_band_freq</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>formatter</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>0, 0, 1, 1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(225, 121)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_static_text</key>
+ <param>
+ <key>id</key>
+ <value>freq_text</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Ch. Freq</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>freq</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>formatter</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>0, 2, 1, 1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(801, 124)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>passband</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2*(deviation+symbol_rate)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(327, 930)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>channel_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>8*3200</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(792, 13)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>channel</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Channel</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>saved_channel</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>120</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>119</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>int_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>0, 1, 1, 1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(376, 120)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>rx_gain</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Analog Gain</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>saved_rx_gain</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>int_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>0, 4, 1, 1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(658, 122)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>id</key>
+ <value>offset</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Freq. Offset</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>saved_offset</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>-12.5e3</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>12.5e3</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>0, 3, 1, 1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(518, 118)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_quadrature_demod_cf</key>
+ <param>
+ <key>id</key>
+ <value>fm_demod</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gain</key>
+ <value>demod_k</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(599, 774)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>baseband_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>16000</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1019, 17)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>nchan_taps</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>len(channel_taps)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(412, 931)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>ma_ntaps</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>int(channel_rate/symbol_rate)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(850, 863)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>bb_interp</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>5</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(938, 862)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>virtual_sink</key>
+ <param>
+ <key>id</key>
+ <value>virtual_sink_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>stream_id</key>
+ <value>baseband</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1100, 774)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blks2_rational_resampler_xxx</key>
+ <param>
+ <key>id</key>
+ <value>resampler</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>fff</value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>bb_decim</value>
+ </param>
+ <param>
+ <key>interp</key>
+ <value>bb_interp</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>[1.0/ma_ntaps,]*ma_ntaps*bb_interp</value>
+ </param>
+ <param>
+ <key>fractional_bw</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(851, 750)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>bb_decim</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1027, 864)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_scopesink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_scopesink2_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Baseband</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>16e3</value>
+ </param>
+ <param>
+ <key>v_scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>v_offset</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>t_scale</key>
+ <value>40.0/16e3</value>
+ </param>
+ <param>
+ <key>ac_couple</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>xy_mode</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>win_size</key>
+ <value></value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>0, 0, 1, 1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>displays, 1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(851, 586)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>virtual_source</key>
+ <param>
+ <key>id</key>
+ <value>virtual_source_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>stream_id</key>
+ <value>baseband</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(79, 1186)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>pager_slicer_fb</key>
+ <param>
+ <key>id</key>
+ <value>pager_slicer_fb_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alpha</key>
+ <value>1e-6</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(304, 1186)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_scopesink2</key>
+ <param>
+ <key>id</key>
+ <value>wxgui_scopesink2_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Slicer Output</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>baseband_rate</value>
+ </param>
+ <param>
+ <key>v_scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>v_offset</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>t_scale</key>
+ <value>40.0/baseband_rate</value>
+ </param>
+ <param>
+ <key>ac_couple</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>xy_mode</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>win_size</key>
+ <value></value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value>1,0,1,1</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value>displays, 1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(75, 1044)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>gr_char_to_float_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(325, 1088)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>pager_flex_sync</key>
+ <param>
+ <key>id</key>
+ <value>pager_flex_sync_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(529, 1139)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>pager_flex_deinterleave</key>
+ <param>
+ <key>id</key>
+ <value>pager_flex_deinterleave_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(777, 1116)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_null_sink</key>
+ <param>
+ <key>id</key>
+ <value>gr_null_sink_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1042, 1116)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>pager_flex_deinterleave</key>
+ <param>
+ <key>id</key>
+ <value>pager_flex_deinterleave_0_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(778, 1168)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>pager_flex_deinterleave</key>
+ <param>
+ <key>id</key>
+ <value>pager_flex_deinterleave_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(776, 1225)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>pager_flex_deinterleave</key>
+ <param>
+ <key>id</key>
+ <value>pager_flex_deinterleave_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(776, 1273)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_null_sink</key>
+ <param>
+ <key>id</key>
+ <value>gr_null_sink_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1042, 1168)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_null_sink</key>
+ <param>
+ <key>id</key>
+ <value>gr_null_sink_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1041, 1225)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_null_sink</key>
+ <param>
+ <key>id</key>
+ <value>gr_null_sink_0_2</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1040, 1273)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>gr_freq_xlating_fir_filter_xxx_0</source_block_id>
+ <sink_block_id>wxgui_fftsink2_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>usrp_source</source_block_id>
+ <sink_block_id>gr_freq_xlating_fir_filter_xxx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>usrp_source</source_block_id>
+ <sink_block_id>wxgui_fftsink2_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_freq_xlating_fir_filter_xxx_0</source_block_id>
+ <sink_block_id>fm_demod</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>resampler</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fm_demod</source_block_id>
+ <sink_block_id>resampler</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>resampler</source_block_id>
+ <sink_block_id>virtual_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_slicer_fb_0</source_block_id>
+ <sink_block_id>pager_flex_sync_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>virtual_source_0</source_block_id>
+ <sink_block_id>pager_slicer_fb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_slicer_fb_0</source_block_id>
+ <sink_block_id>gr_char_to_float_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_char_to_float_0</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_sync_0</source_block_id>
+ <sink_block_id>pager_flex_deinterleave_0_1_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_sync_0</source_block_id>
+ <sink_block_id>pager_flex_deinterleave_0_1</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_sync_0</source_block_id>
+ <sink_block_id>pager_flex_deinterleave_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_sync_0</source_block_id>
+ <sink_block_id>pager_flex_deinterleave_0_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_deinterleave_0</source_block_id>
+ <sink_block_id>gr_null_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_deinterleave_0_1_0</source_block_id>
+ <sink_block_id>gr_null_sink_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_deinterleave_0_1</source_block_id>
+ <sink_block_id>gr_null_sink_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pager_flex_deinterleave_0_0</source_block_id>
+ <sink_block_id>gr_null_sink_0_2</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
--- /dev/null
+#!/usr/bin/env python
+##################################################
+# Gnuradio Python Flow Graph
+# Title: USRP FLEX Pager Receiver (Single Channel)
+# Generated: Thu Oct 29 11:03:16 2009
+##################################################
+
+from gnuradio import blks2
+from gnuradio import eng_notation
+from gnuradio import gr
+from gnuradio import pager
+from gnuradio import window
+from gnuradio.eng_option import eng_option
+from gnuradio.gr import firdes
+from gnuradio.wxgui import fftsink2
+from gnuradio.wxgui import forms
+from gnuradio.wxgui import scopesink2
+from grc_gnuradio import usrp as grc_usrp
+from grc_gnuradio import wxgui as grc_wxgui
+from optparse import OptionParser
+import ConfigParser
+import os, math
+import wx
+
+class usrp_rx_flex(grc_wxgui.top_block_gui):
+
+ def __init__(self):
+ grc_wxgui.top_block_gui.__init__(self, title="USRP FLEX Pager Receiver (Single Channel)")
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.config_filename = config_filename = os.environ["HOME"]+"/.gnuradio/config.conf"
+ self.symbol_rate = symbol_rate = 3200
+ self._saved_channel_config = ConfigParser.ConfigParser()
+ self._saved_channel_config.read(config_filename)
+ try: saved_channel = self._saved_channel_config.getint("gr-pager", "channel")
+ except: saved_channel = 25
+ self.saved_channel = saved_channel
+ self._saved_band_freq_config = ConfigParser.ConfigParser()
+ self._saved_band_freq_config.read(config_filename)
+ try: saved_band_freq = self._saved_band_freq_config.getfloat("gr-pager", "band_center")
+ except: saved_band_freq = 930.5125e6
+ self.saved_band_freq = saved_band_freq
+ self.deviation = deviation = 4800
+ self.decim = decim = 20
+ self.adc_rate = adc_rate = 64e6
+ self.sample_rate = sample_rate = adc_rate/decim
+ self.passband = passband = 2*(deviation+symbol_rate)
+ self.channel_rate = channel_rate = 8*3200
+ self.channel = channel = saved_channel
+ self.band_freq = band_freq = saved_band_freq
+ self._saved_rx_gain_config = ConfigParser.ConfigParser()
+ self._saved_rx_gain_config.read(config_filename)
+ try: saved_rx_gain = self._saved_rx_gain_config.getint("gr-pager", "rx_gain")
+ except: saved_rx_gain = 40
+ self.saved_rx_gain = saved_rx_gain
+ self._saved_offset_config = ConfigParser.ConfigParser()
+ self._saved_offset_config.read(config_filename)
+ try: saved_offset = self._saved_offset_config.getfloat("gr-pager", "freq_offset")
+ except: saved_offset = 0
+ self.saved_offset = saved_offset
+ self.freq = freq = band_freq+(channel-61)*25e3
+ self.channel_taps = channel_taps = firdes.low_pass(10, sample_rate, passband/2.0, (channel_rate-passband)/2.0)
+ self.rx_gain = rx_gain = saved_rx_gain
+ self.offset = offset = saved_offset
+ self.nchan_taps = nchan_taps = len(channel_taps)
+ self.ma_ntaps = ma_ntaps = int(channel_rate/symbol_rate)
+ self.freq_text = freq_text = freq
+ self.demod_k = demod_k = 3*channel_rate/(2*math.pi*deviation)
+ self.channel_decim = channel_decim = int(sample_rate/channel_rate)
+ self.bb_interp = bb_interp = 5
+ self.bb_decim = bb_decim = 8
+ self.baseband_rate = baseband_rate = 16000
+
+ ##################################################
+ # Notebooks
+ ##################################################
+ self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
+ self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX Spectrum")
+ self.displays.AddPage(grc_wxgui.Panel(self.displays), "Baseband")
+ self.GridAdd(self.displays, 1, 0, 1, 5)
+
+ ##################################################
+ # Controls
+ ##################################################
+ _channel_sizer = wx.BoxSizer(wx.VERTICAL)
+ self._channel_text_box = forms.text_box(
+ parent=self.GetWin(),
+ sizer=_channel_sizer,
+ value=self.channel,
+ callback=self.set_channel,
+ label="Channel",
+ converter=forms.int_converter(),
+ proportion=0,
+ )
+ self._channel_slider = forms.slider(
+ parent=self.GetWin(),
+ sizer=_channel_sizer,
+ value=self.channel,
+ callback=self.set_channel,
+ minimum=1,
+ maximum=120,
+ num_steps=119,
+ style=wx.SL_HORIZONTAL,
+ cast=int,
+ proportion=1,
+ )
+ self.GridAdd(_channel_sizer, 0, 1, 1, 1)
+ self._band_freq_text_box = forms.text_box(
+ parent=self.GetWin(),
+ value=self.band_freq,
+ callback=self.set_band_freq,
+ label="Band Freq.",
+ converter=forms.float_converter(),
+ )
+ self.GridAdd(self._band_freq_text_box, 0, 0, 1, 1)
+ _rx_gain_sizer = wx.BoxSizer(wx.VERTICAL)
+ self._rx_gain_text_box = forms.text_box(
+ parent=self.GetWin(),
+ sizer=_rx_gain_sizer,
+ value=self.rx_gain,
+ callback=self.set_rx_gain,
+ label="Analog Gain",
+ converter=forms.int_converter(),
+ proportion=0,
+ )
+ self._rx_gain_slider = forms.slider(
+ parent=self.GetWin(),
+ sizer=_rx_gain_sizer,
+ value=self.rx_gain,
+ callback=self.set_rx_gain,
+ minimum=0,
+ maximum=100,
+ num_steps=100,
+ style=wx.SL_HORIZONTAL,
+ cast=int,
+ proportion=1,
+ )
+ self.GridAdd(_rx_gain_sizer, 0, 4, 1, 1)
+ _offset_sizer = wx.BoxSizer(wx.VERTICAL)
+ self._offset_text_box = forms.text_box(
+ parent=self.GetWin(),
+ sizer=_offset_sizer,
+ value=self.offset,
+ callback=self.set_offset,
+ label="Freq. Offset",
+ converter=forms.float_converter(),
+ proportion=0,
+ )
+ self._offset_slider = forms.slider(
+ parent=self.GetWin(),
+ sizer=_offset_sizer,
+ value=self.offset,
+ callback=self.set_offset,
+ minimum=-12.5e3,
+ maximum=12.5e3,
+ num_steps=100,
+ style=wx.SL_HORIZONTAL,
+ cast=float,
+ proportion=1,
+ )
+ self.GridAdd(_offset_sizer, 0, 3, 1, 1)
+ self._freq_text_static_text = forms.static_text(
+ parent=self.GetWin(),
+ value=self.freq_text,
+ callback=self.set_freq_text,
+ label="Ch. Freq",
+ converter=forms.float_converter(),
+ )
+ self.GridAdd(self._freq_text_static_text, 0, 2, 1, 1)
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.fm_demod = gr.quadrature_demod_cf(demod_k)
+ self.gr_freq_xlating_fir_filter_xxx_0 = gr.freq_xlating_fir_filter_ccc(channel_decim, (channel_taps), band_freq-freq+offset, sample_rate)
+ self.gr_null_sink_0 = gr.null_sink(gr.sizeof_int*1)
+ self.gr_null_sink_0_0 = gr.null_sink(gr.sizeof_int*1)
+ self.gr_null_sink_0_1 = gr.null_sink(gr.sizeof_int*1)
+ self.gr_null_sink_0_2 = gr.null_sink(gr.sizeof_int*1)
+ self.pager_flex_deinterleave_0 = pager.flex_deinterleave()
+ self.pager_flex_deinterleave_0_0 = pager.flex_deinterleave()
+ self.pager_flex_deinterleave_0_1 = pager.flex_deinterleave()
+ self.pager_flex_deinterleave_0_1_0 = pager.flex_deinterleave()
+ self.pager_flex_sync_0 = pager.flex_sync()
+ self.pager_slicer_fb_0 = pager.slicer_fb(1e-6)
+ self.resampler = blks2.rational_resampler_fff(
+ interpolation=bb_interp,
+ decimation=bb_decim,
+ taps=([1.0/ma_ntaps,]*ma_ntaps*bb_interp),
+ fractional_bw=None,
+ )
+ self.usrp_source = grc_usrp.simple_source_c(which=0, side="A", rx_ant="RXA")
+ self.usrp_source.set_decim_rate(decim)
+ self.usrp_source.set_frequency(band_freq, verbose=True)
+ self.usrp_source.set_gain(rx_gain)
+ self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(
+ self.displays.GetPage(0).GetWin(),
+ baseband_freq=band_freq,
+ y_per_div=10,
+ y_divs=10,
+ ref_level=0,
+ ref_scale=65536,
+ sample_rate=sample_rate,
+ fft_size=1024,
+ fft_rate=30,
+ average=False,
+ avg_alpha=None,
+ title="FLEX Spectrum",
+ peak_hold=False,
+ )
+ self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1)
+ self.wxgui_fftsink2_1 = fftsink2.fft_sink_c(
+ self.displays.GetPage(0).GetWin(),
+ baseband_freq=freq,
+ y_per_div=10,
+ y_divs=10,
+ ref_level=0,
+ ref_scale=65536,
+ sample_rate=channel_rate,
+ fft_size=1024,
+ fft_rate=30,
+ average=False,
+ avg_alpha=None,
+ title="Channel Spectrum",
+ peak_hold=False,
+ )
+ self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_1.win, 1, 0, 1, 1)
+ self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
+ self.displays.GetPage(1).GetWin(),
+ title="Baseband",
+ sample_rate=16e3,
+ v_scale=1,
+ v_offset=0,
+ t_scale=40.0/16e3,
+ ac_couple=False,
+ xy_mode=False,
+ num_inputs=1,
+ )
+ self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_1, 0))
+ self.connect((self.usrp_source, 0), (self.gr_freq_xlating_fir_filter_xxx_0, 0))
+ self.connect((self.usrp_source, 0), (self.wxgui_fftsink2_0, 0))
+ self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.fm_demod, 0))
+ self.connect((self.resampler, 0), (self.wxgui_scopesink2_0_0, 0))
+ self.connect((self.fm_demod, 0), (self.resampler, 0))
+ self.connect((self.pager_slicer_fb_0, 0), (self.pager_flex_sync_0, 0))
+ self.connect((self.resampler, 0), (self.pager_slicer_fb_0, 0))
+ self.connect((self.pager_flex_sync_0, 1), (self.pager_flex_deinterleave_0_1_0, 0))
+ self.connect((self.pager_flex_sync_0, 2), (self.pager_flex_deinterleave_0_1, 0))
+ self.connect((self.pager_flex_sync_0, 0), (self.pager_flex_deinterleave_0, 0))
+ self.connect((self.pager_flex_sync_0, 3), (self.pager_flex_deinterleave_0_0, 0))
+ self.connect((self.pager_flex_deinterleave_0, 0), (self.gr_null_sink_0, 0))
+ self.connect((self.pager_flex_deinterleave_0_1_0, 0), (self.gr_null_sink_0_0, 0))
+ self.connect((self.pager_flex_deinterleave_0_1, 0), (self.gr_null_sink_0_1, 0))
+ self.connect((self.pager_flex_deinterleave_0_0, 0), (self.gr_null_sink_0_2, 0))
+
+ def set_config_filename(self, config_filename):
+ self.config_filename = config_filename
+ self._saved_band_freq_config = ConfigParser.ConfigParser()
+ self._saved_band_freq_config.read(self.config_filename)
+ if not self._saved_band_freq_config.has_section("gr-pager"):
+ self._saved_band_freq_config.add_section("gr-pager")
+ self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
+ self._saved_band_freq_config.write(open(self.config_filename, 'w'))
+ self._saved_channel_config = ConfigParser.ConfigParser()
+ self._saved_channel_config.read(self.config_filename)
+ if not self._saved_channel_config.has_section("gr-pager"):
+ self._saved_channel_config.add_section("gr-pager")
+ self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
+ self._saved_channel_config.write(open(self.config_filename, 'w'))
+ self._saved_offset_config = ConfigParser.ConfigParser()
+ self._saved_offset_config.read(self.config_filename)
+ if not self._saved_offset_config.has_section("gr-pager"):
+ self._saved_offset_config.add_section("gr-pager")
+ self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
+ self._saved_offset_config.write(open(self.config_filename, 'w'))
+ self._saved_rx_gain_config = ConfigParser.ConfigParser()
+ self._saved_rx_gain_config.read(self.config_filename)
+ if not self._saved_rx_gain_config.has_section("gr-pager"):
+ self._saved_rx_gain_config.add_section("gr-pager")
+ self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
+ self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
+
+ def set_symbol_rate(self, symbol_rate):
+ self.symbol_rate = symbol_rate
+ self.set_passband(2*(self.deviation+self.symbol_rate))
+ self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate))
+
+ def set_saved_channel(self, saved_channel):
+ self.saved_channel = saved_channel
+ self.set_channel(self.saved_channel)
+
+ def set_saved_band_freq(self, saved_band_freq):
+ self.saved_band_freq = saved_band_freq
+ self.set_band_freq(self.saved_band_freq)
+
+ def set_deviation(self, deviation):
+ self.deviation = deviation
+ self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
+ self.set_passband(2*(self.deviation+self.symbol_rate))
+
+ def set_decim(self, decim):
+ self.decim = decim
+ self.set_sample_rate(self.adc_rate/self.decim)
+ self.usrp_source.set_decim_rate(self.decim)
+
+ def set_adc_rate(self, adc_rate):
+ self.adc_rate = adc_rate
+ self.set_sample_rate(self.adc_rate/self.decim)
+
+ def set_sample_rate(self, sample_rate):
+ self.sample_rate = sample_rate
+ self.wxgui_fftsink2_0.set_sample_rate(self.sample_rate)
+ self.set_channel_decim(int(self.sample_rate/self.channel_rate))
+ self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
+
+ def set_passband(self, passband):
+ self.passband = passband
+ self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
+
+ def set_channel_rate(self, channel_rate):
+ self.channel_rate = channel_rate
+ self.wxgui_fftsink2_1.set_sample_rate(self.channel_rate)
+ self.set_channel_decim(int(self.sample_rate/self.channel_rate))
+ self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
+ self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
+ self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate))
+
+ def set_channel(self, channel):
+ self.channel = channel
+ self.set_freq(self.band_freq+(self.channel-61)*25e3)
+ self._saved_channel_config = ConfigParser.ConfigParser()
+ self._saved_channel_config.read(self.config_filename)
+ if not self._saved_channel_config.has_section("gr-pager"):
+ self._saved_channel_config.add_section("gr-pager")
+ self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
+ self._saved_channel_config.write(open(self.config_filename, 'w'))
+ self._channel_slider.set_value(self.channel)
+ self._channel_text_box.set_value(self.channel)
+
+ def set_band_freq(self, band_freq):
+ self.band_freq = band_freq
+ self.set_freq(self.band_freq+(self.channel-61)*25e3)
+ self.wxgui_fftsink2_0.set_baseband_freq(self.band_freq)
+ self.usrp_source.set_frequency(self.band_freq)
+ self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
+ self._saved_band_freq_config = ConfigParser.ConfigParser()
+ self._saved_band_freq_config.read(self.config_filename)
+ if not self._saved_band_freq_config.has_section("gr-pager"):
+ self._saved_band_freq_config.add_section("gr-pager")
+ self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
+ self._saved_band_freq_config.write(open(self.config_filename, 'w'))
+ self._band_freq_text_box.set_value(self.band_freq)
+
+ def set_saved_rx_gain(self, saved_rx_gain):
+ self.saved_rx_gain = saved_rx_gain
+ self.set_rx_gain(self.saved_rx_gain)
+
+ def set_saved_offset(self, saved_offset):
+ self.saved_offset = saved_offset
+ self.set_offset(self.saved_offset)
+
+ def set_freq(self, freq):
+ self.freq = freq
+ self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
+ self.wxgui_fftsink2_1.set_baseband_freq(self.freq)
+ self.set_freq_text(self.freq)
+
+ def set_channel_taps(self, channel_taps):
+ self.channel_taps = channel_taps
+ self.gr_freq_xlating_fir_filter_xxx_0.set_taps((self.channel_taps))
+ self.set_nchan_taps(len(self.channel_taps))
+
+ def set_rx_gain(self, rx_gain):
+ self.rx_gain = rx_gain
+ self.usrp_source.set_gain(self.rx_gain)
+ self._saved_rx_gain_config = ConfigParser.ConfigParser()
+ self._saved_rx_gain_config.read(self.config_filename)
+ if not self._saved_rx_gain_config.has_section("gr-pager"):
+ self._saved_rx_gain_config.add_section("gr-pager")
+ self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
+ self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
+ self._rx_gain_slider.set_value(self.rx_gain)
+ self._rx_gain_text_box.set_value(self.rx_gain)
+
+ def set_offset(self, offset):
+ self.offset = offset
+ self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
+ self._saved_offset_config = ConfigParser.ConfigParser()
+ self._saved_offset_config.read(self.config_filename)
+ if not self._saved_offset_config.has_section("gr-pager"):
+ self._saved_offset_config.add_section("gr-pager")
+ self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
+ self._saved_offset_config.write(open(self.config_filename, 'w'))
+ self._offset_slider.set_value(self.offset)
+ self._offset_text_box.set_value(self.offset)
+
+ def set_nchan_taps(self, nchan_taps):
+ self.nchan_taps = nchan_taps
+
+ def set_ma_ntaps(self, ma_ntaps):
+ self.ma_ntaps = ma_ntaps
+
+ def set_freq_text(self, freq_text):
+ self.freq_text = freq_text
+ self._freq_text_static_text.set_value(self.freq_text)
+
+ def set_demod_k(self, demod_k):
+ self.demod_k = demod_k
+
+ def set_channel_decim(self, channel_decim):
+ self.channel_decim = channel_decim
+
+ def set_bb_interp(self, bb_interp):
+ self.bb_interp = bb_interp
+
+ def set_bb_decim(self, bb_decim):
+ self.bb_decim = bb_decim
+
+ def set_baseband_rate(self, baseband_rate):
+ self.baseband_rate = baseband_rate
+
+if __name__ == '__main__':
+ parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
+ (options, args) = parser.parse_args()
+ tb = usrp_rx_flex()
+ tb.Run(True)
+
--- /dev/null
+Makefile.in
--- /dev/null
+#
+# 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.
+#
+
+include $(top_srcdir)/Makefile.common
+
+grcblocksdir = $(grc_blocksdir)
+
+dist_grcblocks_DATA = \
+ pager_slicer_fb.xml \
+ pager_flex_sync.xml \
+ pager_flex_deinterleave.xml
--- /dev/null
+<?xml version="1.0"?>
+<!--
+###################################################
+## FLEX Pager Deinterleaver
+###################################################
+ -->
+<block>
+ <name>FLEX Deinterleave</name>
+ <key>pager_flex_deinterleave</key>
+ <category>Pager</category>
+ <import>from gnuradio import pager</import>
+ <make>pager.flex_deinterleave()</make>
+
+ <sink>
+ <name>bits</name>
+ <type>byte</type>
+ </sink>
+
+ <source>
+ <name>codes</name>
+ <type>int</type>
+ </source>
+</block>
--- /dev/null
+<?xml version="1.0"?>
+<!--
+###################################################
+## FLEX Pager Synchronizer
+###################################################
+ -->
+<block>
+ <name>FLEX Synchronizer</name>
+ <key>pager_flex_sync</key>
+ <category>Pager</category>
+ <import>from gnuradio import pager</import>
+ <make>pager.flex_sync()</make>
+
+ <sink>
+ <name>dibits</name>
+ <type>byte</type>
+ </sink>
+
+ <source>
+ <name>A</name>
+ <type>byte</type>
+ </source>
+ <source>
+ <name>B</name>
+ <type>byte</type>
+ </source>
+ <source>
+ <name>C</name>
+ <type>byte</type>
+ </source>
+ <source>
+ <name>D</name>
+ <type>byte</type>
+ </source>
+
+</block>
--- /dev/null
+<?xml version="1.0"?>
+<!--
+###################################################
+## FLEX Pager Slicer w/DC offset removal
+###################################################
+ -->
+<block>
+ <name>4-Level Slicer/DCR</name>
+ <key>pager_slicer_fb</key>
+ <category>Pager</category>
+ <import>from gnuradio import pager</import>
+ <make>pager.slicer_fb($alpha)</make>
+
+ <param>
+ <name>Alpha</name>
+ <key>alpha</key>
+ <value>1e-6</value>
+ <type>real</type>
+ </param>
+
+ <sink>
+ <name>bb</name>
+ <type>float</type>
+ </sink>
+
+ <source>
+ <name>dibits</name>
+ <type>byte</type>
+ </source>
+
+</block>
--- /dev/null
+/.libs
+/.deps
+/Makefile
+/Makefile.in
--- /dev/null
+#
+# 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)
+
+# 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)
--- /dev/null
+# -*- 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@
+
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+/*
+ * 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()
+{
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+/*
+ * 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)
+{
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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 */
--- /dev/null
+/Makefile
+/Makefile.in
--- /dev/null
+#
+# 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
--- /dev/null
+#
+# 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 *
--- /dev/null
+#
+# 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
--- /dev/null
+#
+# 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
--- /dev/null
+#!/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 ()
--- /dev/null
+#!/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@
+++ /dev/null
-/.libs
-/.deps
-/Makefile
-/Makefile.in
-/pager_swig.py
-/pager_swig.cc
-/*.pyc
-/run_tests
+++ /dev/null
-#
-# 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
-
-dist_bin_SCRIPTS = \
- usrp_flex.py \
- usrp_flex_all.py \
- usrp_flex_band.py
-
-##############################
-# 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
+++ /dev/null
-# -*- 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@
-
+++ /dev/null
-#
-# 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 *
+++ /dev/null
-#
-# 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
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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()
-{
-}
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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:
-};
-
+++ /dev/null
-/*
- * 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)
-{
-}
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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:
-};
+++ /dev/null
-#
-# 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
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-#!/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 ()
+++ /dev/null
-#!/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@
+++ /dev/null
-#!/usr/bin/env python
-#
-# Copyright 2006,2007,2009 Free Software Foundation, Inc.
-#
-# This file is part of GNU Radio
-#
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Radio; see the file COPYING. If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-#
-
-from gnuradio import gr, gru, usrp, optfir, eng_notation, pager
-from gnuradio.eng_option import eng_option
-from optparse import OptionParser
-import time, os, sys
-
-"""
-This example application demonstrates receiving and demodulating the
-FLEX pager protocol.
-
-The following are required command line parameters:
-
--f FREQ USRP receive frequency
-
-The following are optional command line parameters:
-
--R SUBDEV Daughter board specification, defaults to first found
--F FILE Read samples from a file instead of USRP.
--c FREQ Calibration offset. Gets added to receive frequency.
- Defaults to 0.0 Hz.
--g GAIN Daughterboard gain setting. Defaults to mid-range.
--l Log flow graph to files (LOTS of data)
--v Verbose output
-
-Once the program is running, ctrl-break (Ctrl-C) stops operation.
-"""
-
-class app_top_block(gr.top_block):
- def __init__(self, options, queue):
- gr.top_block.__init__(self, "usrp_flex")
- self.options = options
- self.offset = 0.0
- self.adj_time = time.time()
- self.verbose = options.verbose
-
- if options.from_file is None:
- # Set up USRP source with specified RX daughterboard
- self.src = usrp.source_c()
- if options.rx_subdev_spec == None:
- options.rx_subdev_spec = usrp.pick_rx_subdevice(self.src)
- self.subdev = usrp.selected_subdev(self.src, options.rx_subdev_spec)
- self.src.set_mux(usrp.determine_rx_mux_value(self.src, options.rx_subdev_spec))
-
- # Grab 250 KHz of spectrum (sample rate becomes 250 ksps complex)
- self.src.set_decim_rate(256)
-
- # If no gain specified, set to midrange
- if options.gain is None:
- g = self.subdev.gain_range()
- options.gain = (g[0]+g[1])/2.0
- self.subdev.set_gain(options.gain)
-
- # Tune daughterboard
- actual_frequency = options.frequency+options.calibration
- tune_result = usrp.tune(self.src, 0, self.subdev, actual_frequency)
- if not tune_result:
- sys.stderr.write("Failed to set center frequency to "+`actual_frequency`+"\n")
- sys.exit(1)
-
- if options.verbose:
- print "Using RX daughterboard", self.subdev.side_and_name()
- print "USRP gain is", options.gain
- print "USRP tuned to", actual_frequency
-
- else:
- # Use supplied file as source of samples
- self.src = gr.file_source(gr.sizeof_gr_complex, options.from_file)
- if options.verbose:
- print "Reading samples from", options.from_file
-
- if options.log and not options.from_file:
- usrp_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat')
- self.connect(self.src, usrp_sink)
-
- # Set up 22KHz-wide bandpass about center frequency. Decimate by 10
- # to get channel rate of 25Ksps
- taps = optfir.low_pass(1.0, # Filter gain
- 250e3, # Sample rate
- 11000, # One-sided modulation bandwidth
- 12500, # One-sided channel bandwidth
- 0.1, # Passband ripple
- 60) # Stopband attenuation
-
- if options.verbose:
- print "Channel filter has", len(taps), "taps."
-
- self.chan = gr.freq_xlating_fir_filter_ccf(10, # Decimation rate
- taps, # Filter taps
- 0.0, # Offset frequency
- 250e3) # Sample rate
-
- if options.log:
- chan_sink = gr.file_sink(gr.sizeof_gr_complex, 'chan.dat')
- self.connect(self.chan, chan_sink)
-
- # FLEX protocol demodulator
- self.flex = pager.flex_demod(queue, options.frequency, options.verbose, options.log)
-
- self.connect(self.src, self.chan, self.flex)
-
- def freq_offset(self):
- return self.flex.dc_offset()*1600
-
- def adjust_freq(self):
- if time.time() - self.adj_time > 1.6: # Only do it once per FLEX frame
- self.adj_time = time.time()
- self.offset -= self.freq_offset()
- self.chan.set_center_freq(self.offset)
- if self.verbose:
- print "Channel frequency offset (Hz):", int(self.offset)
-
-def main():
- parser = OptionParser(option_class=eng_option)
- parser.add_option("-f", "--frequency", type="eng_float", default=None,
- help="set receive frequency to Hz", metavar="Hz")
- parser.add_option("-R", "--rx-subdev-spec", type="subdev",
- help="select USRP Rx side A or B", metavar="SUBDEV")
- parser.add_option("-c", "--calibration", type="eng_float", default=0.0,
- help="set frequency offset to Hz", metavar="Hz")
- parser.add_option("-g", "--gain", type="int", default=None,
- help="set RF gain", metavar="dB")
- parser.add_option("-l", "--log", action="store_true", default=False,
- help="log flowgraph to files (LOTS of data)")
- parser.add_option("-v", "--verbose", action="store_true", default=False,
- help="display debug output")
- parser.add_option("-F", "--from-file", default=None,
- help="read samples from file instead of USRP")
- (options, args) = parser.parse_args()
-
- if len(args) > 0 or (options.frequency == None and options.from_file == None):
- print "Run 'usrp_flex.py -h' for options."
- sys.exit(1)
-
- if options.frequency == None:
- options.frequency = 0.0
-
- # Flow graph emits pages into message queue
- queue = gr.msg_queue()
- tb = app_top_block(options, queue)
- runner = pager.queue_runner(queue)
-
- try:
- tb.run()
- except KeyboardInterrupt:
- pass
-
- runner.end()
-
-
-if __name__ == "__main__":
- main()
+++ /dev/null
-#!/usr/bin/env python
-#
-# Copyright 2006,2007,2009 Free Software Foundation, Inc.
-#
-# This file is part of GNU Radio
-#
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Radio; see the file COPYING. If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-#
-
-from gnuradio import gr, gru, usrp, optfir, eng_notation, blks2, pager
-from gnuradio.eng_option import eng_option
-from optparse import OptionParser
-from string import split, join, printable
-import time
-
-class app_top_block(gr.top_block):
- def __init__(self, options, queue):
- gr.top_block.__init__(self, "usrp_flex_all")
-
- if options.from_file is not None:
- src = gr.file_source(gr.sizeof_gr_complex, options.from_file)
- if options.verbose:
- print "Reading samples from file", options.from_file
- else:
- src = usrp.source_c()
- if options.rx_subdev_spec is None:
- options.rx_subdev_spec = usrp.pick_rx_subdevice(src)
- subdev = usrp.selected_subdev(src, options.rx_subdev_spec)
- src.set_mux(usrp.determine_rx_mux_value(src, options.rx_subdev_spec))
- src.set_decim_rate(20)
- result = usrp.tune(src, 0, subdev, 930.5125e6+options.calibration)
- if options.verbose:
- print "Using", subdev.name(), " for receiving."
- print "Tuned USRP to", 930.5125e6+options.calibration
-
- taps = gr.firdes.low_pass(1.0,
- 1.0,
- 1.0/128.0*0.4,
- 1.0/128.0*0.1,
- gr.firdes.WIN_HANN)
-
- if options.verbose:
- print "Channel filter has", len(taps), "taps"
-
- bank = blks2.analysis_filterbank(128, taps)
- self.connect(src, bank)
-
- if options.log and options.from_file == None:
- src_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat')
- self.connect(src, src_sink)
-
- for i in range(128):
- if i < 64:
- freq = 930.5e6+i*25e3
- else:
- freq = 928.9e6+(i-64)*25e3
-
- if (freq < 929.0e6 or freq > 932.0e6):
- self.connect((bank, i), gr.null_sink(gr.sizeof_gr_complex))
- else:
- self.connect((bank, i), pager.flex_demod(queue, freq, options.verbose, options.log))
- if options.log:
- self.connect((bank, i), gr.file_sink(gr.sizeof_gr_complex, 'chan_'+'%3.3f'%(freq/1e6)+'.dat'))
-
-def main():
- parser = OptionParser(option_class=eng_option)
- parser.add_option("-R", "--rx-subdev-spec", type="subdev",
- help="select USRP Rx side A or B (default=first daughterboard found)")
- parser.add_option("-c", "--calibration", type="eng_float", default=0.0,
- help="set frequency offset to Hz", metavar="Hz")
- parser.add_option("-g", "--gain", type="int",
- help="set RF gain", metavar="dB")
- parser.add_option("-F", "--from-file", default=None,
- help="Read from file instead of USRP")
- parser.add_option("-l", "--log", action="store_true", default=False,
- help="log flowgraph to files (LOTS of data)")
- parser.add_option("-v", "--verbose", action="store_true", default=False,
- help="display debug output")
- (options, args) = parser.parse_args()
-
- if options.verbose:
- print options
-
- queue = gr.msg_queue()
- tb = app_top_block(options, queue)
- runner = pager.queue_runner(queue)
-
- try:
- tb.run()
- except KeyboardInterrupt:
- pass
-
- runner.end()
-
-if __name__ == "__main__":
- main()
+++ /dev/null
-#!/usr/bin/env python
-#
-# Copyright 2006,2007,2009 Free Software Foundation, Inc.
-#
-# This file is part of GNU Radio
-#
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Radio; see the file COPYING. If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-#
-
-from gnuradio import gr, gru, usrp, optfir, eng_notation, blks2, pager
-from gnuradio.eng_option import eng_option
-from optparse import OptionParser
-
-class app_top_block(gr.top_block):
- def __init__(self, options, queue):
- gr.top_block.__init__(self, "usrp_flex_all")
- self.subdev = None
-
- if options.from_file is not None:
- self.src = gr.file_source(gr.sizeof_gr_complex, options.from_file)
- if options.verbose:
- print "Reading samples from file", options.from_file
- else:
- self.src = usrp.source_c()
- if options.rx_subdev_spec is None:
- options.rx_subdev_spec = usrp.pick_rx_subdevice(self.src)
- self.subdev = usrp.selected_subdev(self.src, options.rx_subdev_spec)
- self.src.set_mux(usrp.determine_rx_mux_value(self.src, options.rx_subdev_spec))
- self.src.set_decim_rate(64)
- frequency = options.frequency+options.calibration
- result = usrp.tune(self.src, 0, self.subdev, frequency)
- if options.verbose:
- print "Using", self.subdev.name(), " for receiving."
- print "Tuned USRP to", frequency
-
- taps = gr.firdes.low_pass(1.0,
- 1.0,
- 1.0/40.0*0.4,
- 1.0/40.0*0.1,
- gr.firdes.WIN_HANN)
-
- if options.verbose:
- print "Channel filter has", len(taps), "taps"
-
- bank = blks2.analysis_filterbank(40, taps)
- self.connect(self.src, bank)
-
- if options.log and options.from_file == None:
- src_sink = gr.file_sink(gr.sizeof_gr_complex, 'usrp.dat')
- self.connect(self.src, src_sink)
-
- for i in range(40):
- if i < 20:
- freq = options.frequency+i*25e3
- else:
- freq = options.frequency-0.5e6+(i-20)*25e3
-
- self.connect((bank, i), pager.flex_demod(queue, freq, options.verbose, options.log))
- if options.log:
- self.connect((bank, i), gr.file_sink(gr.sizeof_gr_complex, 'chan_'+'%3.3f'%(freq/1e6)+'.dat'))
-
-
-def main():
- parser = OptionParser(option_class=eng_option)
- parser.add_option("-f", "--frequency", type="eng_float", default=929.5e6,
- help="set receive center frequency to Hz", metavar="Hz")
- parser.add_option("-R", "--rx-subdev-spec", type="subdev",
- help="select USRP Rx side A or B (default=first daughterboard found)")
- parser.add_option("-c", "--calibration", type="eng_float", default=0.0,
- help="set frequency offset to Hz", metavar="Hz")
- parser.add_option("-g", "--gain", type="int",
- help="set RF gain", metavar="dB")
- parser.add_option("-F", "--from-file", default=None,
- help="Read from file instead of USRP")
- parser.add_option("-l", "--log", action="store_true", default=False,
- help="log flowgraph to files (LOTS of data)")
- parser.add_option("-v", "--verbose", action="store_true", default=False,
- help="display debug output")
- (options, args) = parser.parse_args()
-
- if options.verbose:
- print options
-
- queue = gr.msg_queue()
- tb = app_top_block(options, queue)
- runner = pager.queue_runner(queue)
-
- try:
- tb.run()
- except KeyboardInterrupt:
- pass
-
- runner.end()
-
-
-if __name__ == "__main__":
- main()
--- /dev/null
+/Makefile
+/Makefile.in
+/pager_swig.py
+/pager_swig.cc
+/*.pyc
+/run_tests
--- /dev/null
+#
+# 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)
--- /dev/null
+# -*- 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@
+
--- /dev/null
+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:
+};
--- /dev/null
+/*
+ * 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:
+};
+
--- /dev/null
+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:
+};
--- /dev/null
+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:
+};
--- /dev/null
+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; }
+};
--- /dev/null
+/*
+ * 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"
echo "Begin freedesktop install..."
for size in ${ICON_SIZES}; do \
echo "Install icon: ${size}x${size}"
- xdg-icon-resource install --context mimetypes --theme gnome --size ${size} ${SRCDIR}/grc-icon-${size}.png application-gnuradio-grc; \
- xdg-icon-resource install --context mimetypes --size ${size} ${SRCDIR}/grc-icon-${size}.png application-gnuradio-grc; \
- xdg-icon-resource install --context apps --theme gnome --size ${size} ${SRCDIR}/grc-icon-${size}.png gnuradio-grc; \
- xdg-icon-resource install --context apps --size ${size} ${SRCDIR}/grc-icon-${size}.png gnuradio-grc; \
+ xdg-icon-resource install --noupdate --context mimetypes --theme gnome --size ${size} ${SRCDIR}/grc-icon-${size}.png application-gnuradio-grc; \
+ xdg-icon-resource install --noupdate --context mimetypes --size ${size} ${SRCDIR}/grc-icon-${size}.png application-gnuradio-grc; \
+ xdg-icon-resource install --noupdate --context apps --theme gnome --size ${size} ${SRCDIR}/grc-icon-${size}.png gnuradio-grc; \
+ xdg-icon-resource install --noupdate --context apps --size ${size} ${SRCDIR}/grc-icon-${size}.png gnuradio-grc; \
done
+ xdg-icon-resource forceupdate
echo "Install mime type"
xdg-mime install ${SRCDIR}/gnuradio-grc.xml
echo "Install menu items"
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