summaryrefslogtreecommitdiff
path: root/gr-pager/apps
diff options
context:
space:
mode:
Diffstat (limited to 'gr-pager/apps')
-rw-r--r--gr-pager/apps/.gitignore2
-rw-r--r--gr-pager/apps/Makefile.am36
-rwxr-xr-xgr-pager/apps/usrp_flex.py172
-rwxr-xr-xgr-pager/apps/usrp_flex_all.py109
-rwxr-xr-xgr-pager/apps/usrp_flex_band.py110
-rw-r--r--gr-pager/apps/usrp_rx_flex.grc1804
-rwxr-xr-xgr-pager/apps/usrp_rx_flex.py434
7 files changed, 2667 insertions, 0 deletions
diff --git a/gr-pager/apps/.gitignore b/gr-pager/apps/.gitignore
new file mode 100644
index 000000000..282522db0
--- /dev/null
+++ b/gr-pager/apps/.gitignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/gr-pager/apps/Makefile.am b/gr-pager/apps/Makefile.am
new file mode 100644
index 000000000..7b495fd2b
--- /dev/null
+++ b/gr-pager/apps/Makefile.am
@@ -0,0 +1,36 @@
+#
+# 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
diff --git a/gr-pager/apps/usrp_flex.py b/gr-pager/apps/usrp_flex.py
new file mode 100755
index 000000000..f8d9d25b1
--- /dev/null
+++ b/gr-pager/apps/usrp_flex.py
@@ -0,0 +1,172 @@
+#!/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()
diff --git a/gr-pager/apps/usrp_flex_all.py b/gr-pager/apps/usrp_flex_all.py
new file mode 100755
index 000000000..14f9151de
--- /dev/null
+++ b/gr-pager/apps/usrp_flex_all.py
@@ -0,0 +1,109 @@
+#!/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()
diff --git a/gr-pager/apps/usrp_flex_band.py b/gr-pager/apps/usrp_flex_band.py
new file mode 100755
index 000000000..06c2488c0
--- /dev/null
+++ b/gr-pager/apps/usrp_flex_band.py
@@ -0,0 +1,110 @@
+#!/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()
diff --git a/gr-pager/apps/usrp_rx_flex.grc b/gr-pager/apps/usrp_rx_flex.grc
new file mode 100644
index 000000000..b9461a57f
--- /dev/null
+++ b/gr-pager/apps/usrp_rx_flex.grc
@@ -0,0 +1,1804 @@
+<?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>
diff --git a/gr-pager/apps/usrp_rx_flex.py b/gr-pager/apps/usrp_rx_flex.py
new file mode 100755
index 000000000..47bf5a3df
--- /dev/null
+++ b/gr-pager/apps/usrp_rx_flex.py
@@ -0,0 +1,434 @@
+#!/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)
+