Simplify USE_SELECT usage
[debian/gnuradio] / gr-pager / apps / usrp_rx_flex.py
1 #!/usr/bin/env python
2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP FLEX Pager Receiver (Single Channel)
5 # Generated: Thu Oct 29 11:03:16 2009
6 ##################################################
7
8 from gnuradio import blks2
9 from gnuradio import eng_notation
10 from gnuradio import gr
11 from gnuradio import pager
12 from gnuradio import window
13 from gnuradio.eng_option import eng_option
14 from gnuradio.gr import firdes
15 from gnuradio.wxgui import fftsink2
16 from gnuradio.wxgui import forms
17 from gnuradio.wxgui import scopesink2
18 from grc_gnuradio import usrp as grc_usrp
19 from grc_gnuradio import wxgui as grc_wxgui
20 from optparse import OptionParser
21 import ConfigParser
22 import os, math
23 import wx
24
25 class usrp_rx_flex(grc_wxgui.top_block_gui):
26
27         def __init__(self):
28                 grc_wxgui.top_block_gui.__init__(self, title="USRP FLEX Pager Receiver (Single Channel)")
29
30                 ##################################################
31                 # Variables
32                 ##################################################
33                 self.config_filename = config_filename = os.environ["HOME"]+"/.gnuradio/config.conf"
34                 self.symbol_rate = symbol_rate = 3200
35                 self._saved_channel_config = ConfigParser.ConfigParser()
36                 self._saved_channel_config.read(config_filename)
37                 try: saved_channel = self._saved_channel_config.getint("gr-pager", "channel")
38                 except: saved_channel = 25
39                 self.saved_channel = saved_channel
40                 self._saved_band_freq_config = ConfigParser.ConfigParser()
41                 self._saved_band_freq_config.read(config_filename)
42                 try: saved_band_freq = self._saved_band_freq_config.getfloat("gr-pager", "band_center")
43                 except: saved_band_freq = 930.5125e6
44                 self.saved_band_freq = saved_band_freq
45                 self.deviation = deviation = 4800
46                 self.decim = decim = 20
47                 self.adc_rate = adc_rate = 64e6
48                 self.sample_rate = sample_rate = adc_rate/decim
49                 self.passband = passband = 2*(deviation+symbol_rate)
50                 self.channel_rate = channel_rate = 8*3200
51                 self.channel = channel = saved_channel
52                 self.band_freq = band_freq = saved_band_freq
53                 self._saved_rx_gain_config = ConfigParser.ConfigParser()
54                 self._saved_rx_gain_config.read(config_filename)
55                 try: saved_rx_gain = self._saved_rx_gain_config.getint("gr-pager", "rx_gain")
56                 except: saved_rx_gain = 40
57                 self.saved_rx_gain = saved_rx_gain
58                 self._saved_offset_config = ConfigParser.ConfigParser()
59                 self._saved_offset_config.read(config_filename)
60                 try: saved_offset = self._saved_offset_config.getfloat("gr-pager", "freq_offset")
61                 except: saved_offset = 0
62                 self.saved_offset = saved_offset
63                 self.freq = freq = band_freq+(channel-61)*25e3
64                 self.channel_taps = channel_taps = firdes.low_pass(10, sample_rate, passband/2.0, (channel_rate-passband)/2.0)
65                 self.rx_gain = rx_gain = saved_rx_gain
66                 self.offset = offset = saved_offset
67                 self.nchan_taps = nchan_taps = len(channel_taps)
68                 self.ma_ntaps = ma_ntaps = int(channel_rate/symbol_rate)
69                 self.freq_text = freq_text = freq
70                 self.demod_k = demod_k = 3*channel_rate/(2*math.pi*deviation)
71                 self.channel_decim = channel_decim = int(sample_rate/channel_rate)
72                 self.bb_interp = bb_interp = 5
73                 self.bb_decim = bb_decim = 8
74                 self.baseband_rate = baseband_rate = 16000
75
76                 ##################################################
77                 # Notebooks
78                 ##################################################
79                 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
80                 self.displays.AddPage(grc_wxgui.Panel(self.displays), "RX Spectrum")
81                 self.displays.AddPage(grc_wxgui.Panel(self.displays), "Baseband")
82                 self.GridAdd(self.displays, 1, 0, 1, 5)
83
84                 ##################################################
85                 # Controls
86                 ##################################################
87                 _channel_sizer = wx.BoxSizer(wx.VERTICAL)
88                 self._channel_text_box = forms.text_box(
89                         parent=self.GetWin(),
90                         sizer=_channel_sizer,
91                         value=self.channel,
92                         callback=self.set_channel,
93                         label="Channel",
94                         converter=forms.int_converter(),
95                         proportion=0,
96                 )
97                 self._channel_slider = forms.slider(
98                         parent=self.GetWin(),
99                         sizer=_channel_sizer,
100                         value=self.channel,
101                         callback=self.set_channel,
102                         minimum=1,
103                         maximum=120,
104                         num_steps=119,
105                         style=wx.SL_HORIZONTAL,
106                         cast=int,
107                         proportion=1,
108                 )
109                 self.GridAdd(_channel_sizer, 0, 1, 1, 1)
110                 self._band_freq_text_box = forms.text_box(
111                         parent=self.GetWin(),
112                         value=self.band_freq,
113                         callback=self.set_band_freq,
114                         label="Band Freq.",
115                         converter=forms.float_converter(),
116                 )
117                 self.GridAdd(self._band_freq_text_box, 0, 0, 1, 1)
118                 _rx_gain_sizer = wx.BoxSizer(wx.VERTICAL)
119                 self._rx_gain_text_box = forms.text_box(
120                         parent=self.GetWin(),
121                         sizer=_rx_gain_sizer,
122                         value=self.rx_gain,
123                         callback=self.set_rx_gain,
124                         label="Analog Gain",
125                         converter=forms.int_converter(),
126                         proportion=0,
127                 )
128                 self._rx_gain_slider = forms.slider(
129                         parent=self.GetWin(),
130                         sizer=_rx_gain_sizer,
131                         value=self.rx_gain,
132                         callback=self.set_rx_gain,
133                         minimum=0,
134                         maximum=100,
135                         num_steps=100,
136                         style=wx.SL_HORIZONTAL,
137                         cast=int,
138                         proportion=1,
139                 )
140                 self.GridAdd(_rx_gain_sizer, 0, 4, 1, 1)
141                 _offset_sizer = wx.BoxSizer(wx.VERTICAL)
142                 self._offset_text_box = forms.text_box(
143                         parent=self.GetWin(),
144                         sizer=_offset_sizer,
145                         value=self.offset,
146                         callback=self.set_offset,
147                         label="Freq. Offset",
148                         converter=forms.float_converter(),
149                         proportion=0,
150                 )
151                 self._offset_slider = forms.slider(
152                         parent=self.GetWin(),
153                         sizer=_offset_sizer,
154                         value=self.offset,
155                         callback=self.set_offset,
156                         minimum=-12.5e3,
157                         maximum=12.5e3,
158                         num_steps=100,
159                         style=wx.SL_HORIZONTAL,
160                         cast=float,
161                         proportion=1,
162                 )
163                 self.GridAdd(_offset_sizer, 0, 3, 1, 1)
164                 self._freq_text_static_text = forms.static_text(
165                         parent=self.GetWin(),
166                         value=self.freq_text,
167                         callback=self.set_freq_text,
168                         label="Ch. Freq",
169                         converter=forms.float_converter(),
170                 )
171                 self.GridAdd(self._freq_text_static_text, 0, 2, 1, 1)
172
173                 ##################################################
174                 # Blocks
175                 ##################################################
176                 self.fm_demod = gr.quadrature_demod_cf(demod_k)
177                 self.gr_freq_xlating_fir_filter_xxx_0 = gr.freq_xlating_fir_filter_ccc(channel_decim, (channel_taps), band_freq-freq+offset, sample_rate)
178                 self.gr_null_sink_0 = gr.null_sink(gr.sizeof_int*1)
179                 self.gr_null_sink_0_0 = gr.null_sink(gr.sizeof_int*1)
180                 self.gr_null_sink_0_1 = gr.null_sink(gr.sizeof_int*1)
181                 self.gr_null_sink_0_2 = gr.null_sink(gr.sizeof_int*1)
182                 self.pager_flex_deinterleave_0 = pager.flex_deinterleave()
183                 self.pager_flex_deinterleave_0_0 = pager.flex_deinterleave()
184                 self.pager_flex_deinterleave_0_1 = pager.flex_deinterleave()
185                 self.pager_flex_deinterleave_0_1_0 = pager.flex_deinterleave()
186                 self.pager_flex_sync_0 = pager.flex_sync()
187                 self.pager_slicer_fb_0 = pager.slicer_fb(1e-6)
188                 self.resampler = blks2.rational_resampler_fff(
189                         interpolation=bb_interp,
190                         decimation=bb_decim,
191                         taps=([1.0/ma_ntaps,]*ma_ntaps*bb_interp),
192                         fractional_bw=None,
193                 )
194                 self.usrp_source = grc_usrp.simple_source_c(which=0, side="A", rx_ant="RXA")
195                 self.usrp_source.set_decim_rate(decim)
196                 self.usrp_source.set_frequency(band_freq, verbose=True)
197                 self.usrp_source.set_gain(rx_gain)
198                 self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(
199                         self.displays.GetPage(0).GetWin(),
200                         baseband_freq=band_freq,
201                         y_per_div=10,
202                         y_divs=10,
203                         ref_level=0,
204                         ref_scale=65536,
205                         sample_rate=sample_rate,
206                         fft_size=1024,
207                         fft_rate=30,
208                         average=False,
209                         avg_alpha=None,
210                         title="FLEX Spectrum",
211                         peak_hold=False,
212                 )
213                 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1)
214                 self.wxgui_fftsink2_1 = fftsink2.fft_sink_c(
215                         self.displays.GetPage(0).GetWin(),
216                         baseband_freq=freq,
217                         y_per_div=10,
218                         y_divs=10,
219                         ref_level=0,
220                         ref_scale=65536,
221                         sample_rate=channel_rate,
222                         fft_size=1024,
223                         fft_rate=30,
224                         average=False,
225                         avg_alpha=None,
226                         title="Channel Spectrum",
227                         peak_hold=False,
228                 )
229                 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_1.win, 1, 0, 1, 1)
230                 self.wxgui_scopesink2_0_0 = scopesink2.scope_sink_f(
231                         self.displays.GetPage(1).GetWin(),
232                         title="Baseband",
233                         sample_rate=16e3,
234                         v_scale=1,
235                         v_offset=0,
236                         t_scale=40.0/16e3,
237                         ac_couple=False,
238                         xy_mode=False,
239                         num_inputs=1,
240                 )
241                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_0_0.win, 0, 0, 1, 1)
242
243                 ##################################################
244                 # Connections
245                 ##################################################
246                 self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.wxgui_fftsink2_1, 0))
247                 self.connect((self.usrp_source, 0), (self.gr_freq_xlating_fir_filter_xxx_0, 0))
248                 self.connect((self.usrp_source, 0), (self.wxgui_fftsink2_0, 0))
249                 self.connect((self.gr_freq_xlating_fir_filter_xxx_0, 0), (self.fm_demod, 0))
250                 self.connect((self.resampler, 0), (self.wxgui_scopesink2_0_0, 0))
251                 self.connect((self.fm_demod, 0), (self.resampler, 0))
252                 self.connect((self.pager_slicer_fb_0, 0), (self.pager_flex_sync_0, 0))
253                 self.connect((self.resampler, 0), (self.pager_slicer_fb_0, 0))
254                 self.connect((self.pager_flex_sync_0, 1), (self.pager_flex_deinterleave_0_1_0, 0))
255                 self.connect((self.pager_flex_sync_0, 2), (self.pager_flex_deinterleave_0_1, 0))
256                 self.connect((self.pager_flex_sync_0, 0), (self.pager_flex_deinterleave_0, 0))
257                 self.connect((self.pager_flex_sync_0, 3), (self.pager_flex_deinterleave_0_0, 0))
258                 self.connect((self.pager_flex_deinterleave_0, 0), (self.gr_null_sink_0, 0))
259                 self.connect((self.pager_flex_deinterleave_0_1_0, 0), (self.gr_null_sink_0_0, 0))
260                 self.connect((self.pager_flex_deinterleave_0_1, 0), (self.gr_null_sink_0_1, 0))
261                 self.connect((self.pager_flex_deinterleave_0_0, 0), (self.gr_null_sink_0_2, 0))
262
263         def set_config_filename(self, config_filename):
264                 self.config_filename = config_filename
265                 self._saved_band_freq_config = ConfigParser.ConfigParser()
266                 self._saved_band_freq_config.read(self.config_filename)
267                 if not self._saved_band_freq_config.has_section("gr-pager"):
268                         self._saved_band_freq_config.add_section("gr-pager")
269                 self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
270                 self._saved_band_freq_config.write(open(self.config_filename, 'w'))
271                 self._saved_channel_config = ConfigParser.ConfigParser()
272                 self._saved_channel_config.read(self.config_filename)
273                 if not self._saved_channel_config.has_section("gr-pager"):
274                         self._saved_channel_config.add_section("gr-pager")
275                 self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
276                 self._saved_channel_config.write(open(self.config_filename, 'w'))
277                 self._saved_offset_config = ConfigParser.ConfigParser()
278                 self._saved_offset_config.read(self.config_filename)
279                 if not self._saved_offset_config.has_section("gr-pager"):
280                         self._saved_offset_config.add_section("gr-pager")
281                 self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
282                 self._saved_offset_config.write(open(self.config_filename, 'w'))
283                 self._saved_rx_gain_config = ConfigParser.ConfigParser()
284                 self._saved_rx_gain_config.read(self.config_filename)
285                 if not self._saved_rx_gain_config.has_section("gr-pager"):
286                         self._saved_rx_gain_config.add_section("gr-pager")
287                 self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
288                 self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
289
290         def set_symbol_rate(self, symbol_rate):
291                 self.symbol_rate = symbol_rate
292                 self.set_passband(2*(self.deviation+self.symbol_rate))
293                 self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate))
294
295         def set_saved_channel(self, saved_channel):
296                 self.saved_channel = saved_channel
297                 self.set_channel(self.saved_channel)
298
299         def set_saved_band_freq(self, saved_band_freq):
300                 self.saved_band_freq = saved_band_freq
301                 self.set_band_freq(self.saved_band_freq)
302
303         def set_deviation(self, deviation):
304                 self.deviation = deviation
305                 self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
306                 self.set_passband(2*(self.deviation+self.symbol_rate))
307
308         def set_decim(self, decim):
309                 self.decim = decim
310                 self.set_sample_rate(self.adc_rate/self.decim)
311                 self.usrp_source.set_decim_rate(self.decim)
312
313         def set_adc_rate(self, adc_rate):
314                 self.adc_rate = adc_rate
315                 self.set_sample_rate(self.adc_rate/self.decim)
316
317         def set_sample_rate(self, sample_rate):
318                 self.sample_rate = sample_rate
319                 self.wxgui_fftsink2_0.set_sample_rate(self.sample_rate)
320                 self.set_channel_decim(int(self.sample_rate/self.channel_rate))
321                 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
322
323         def set_passband(self, passband):
324                 self.passband = passband
325                 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
326
327         def set_channel_rate(self, channel_rate):
328                 self.channel_rate = channel_rate
329                 self.wxgui_fftsink2_1.set_sample_rate(self.channel_rate)
330                 self.set_channel_decim(int(self.sample_rate/self.channel_rate))
331                 self.set_demod_k(3*self.channel_rate/(2*math.pi*self.deviation))
332                 self.set_channel_taps(firdes.low_pass(10, self.sample_rate, self.passband/2.0, (self.channel_rate-self.passband)/2.0))
333                 self.set_ma_ntaps(int(self.channel_rate/self.symbol_rate))
334
335         def set_channel(self, channel):
336                 self.channel = channel
337                 self.set_freq(self.band_freq+(self.channel-61)*25e3)
338                 self._saved_channel_config = ConfigParser.ConfigParser()
339                 self._saved_channel_config.read(self.config_filename)
340                 if not self._saved_channel_config.has_section("gr-pager"):
341                         self._saved_channel_config.add_section("gr-pager")
342                 self._saved_channel_config.set("gr-pager", "channel", str(self.channel))
343                 self._saved_channel_config.write(open(self.config_filename, 'w'))
344                 self._channel_slider.set_value(self.channel)
345                 self._channel_text_box.set_value(self.channel)
346
347         def set_band_freq(self, band_freq):
348                 self.band_freq = band_freq
349                 self.set_freq(self.band_freq+(self.channel-61)*25e3)
350                 self.wxgui_fftsink2_0.set_baseband_freq(self.band_freq)
351                 self.usrp_source.set_frequency(self.band_freq)
352                 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
353                 self._saved_band_freq_config = ConfigParser.ConfigParser()
354                 self._saved_band_freq_config.read(self.config_filename)
355                 if not self._saved_band_freq_config.has_section("gr-pager"):
356                         self._saved_band_freq_config.add_section("gr-pager")
357                 self._saved_band_freq_config.set("gr-pager", "band_center", str(self.band_freq))
358                 self._saved_band_freq_config.write(open(self.config_filename, 'w'))
359                 self._band_freq_text_box.set_value(self.band_freq)
360
361         def set_saved_rx_gain(self, saved_rx_gain):
362                 self.saved_rx_gain = saved_rx_gain
363                 self.set_rx_gain(self.saved_rx_gain)
364
365         def set_saved_offset(self, saved_offset):
366                 self.saved_offset = saved_offset
367                 self.set_offset(self.saved_offset)
368
369         def set_freq(self, freq):
370                 self.freq = freq
371                 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
372                 self.wxgui_fftsink2_1.set_baseband_freq(self.freq)
373                 self.set_freq_text(self.freq)
374
375         def set_channel_taps(self, channel_taps):
376                 self.channel_taps = channel_taps
377                 self.gr_freq_xlating_fir_filter_xxx_0.set_taps((self.channel_taps))
378                 self.set_nchan_taps(len(self.channel_taps))
379
380         def set_rx_gain(self, rx_gain):
381                 self.rx_gain = rx_gain
382                 self.usrp_source.set_gain(self.rx_gain)
383                 self._saved_rx_gain_config = ConfigParser.ConfigParser()
384                 self._saved_rx_gain_config.read(self.config_filename)
385                 if not self._saved_rx_gain_config.has_section("gr-pager"):
386                         self._saved_rx_gain_config.add_section("gr-pager")
387                 self._saved_rx_gain_config.set("gr-pager", "rx_gain", str(self.rx_gain))
388                 self._saved_rx_gain_config.write(open(self.config_filename, 'w'))
389                 self._rx_gain_slider.set_value(self.rx_gain)
390                 self._rx_gain_text_box.set_value(self.rx_gain)
391
392         def set_offset(self, offset):
393                 self.offset = offset
394                 self.gr_freq_xlating_fir_filter_xxx_0.set_center_freq(self.band_freq-self.freq+self.offset)
395                 self._saved_offset_config = ConfigParser.ConfigParser()
396                 self._saved_offset_config.read(self.config_filename)
397                 if not self._saved_offset_config.has_section("gr-pager"):
398                         self._saved_offset_config.add_section("gr-pager")
399                 self._saved_offset_config.set("gr-pager", "freq_offset", str(self.offset))
400                 self._saved_offset_config.write(open(self.config_filename, 'w'))
401                 self._offset_slider.set_value(self.offset)
402                 self._offset_text_box.set_value(self.offset)
403
404         def set_nchan_taps(self, nchan_taps):
405                 self.nchan_taps = nchan_taps
406
407         def set_ma_ntaps(self, ma_ntaps):
408                 self.ma_ntaps = ma_ntaps
409
410         def set_freq_text(self, freq_text):
411                 self.freq_text = freq_text
412                 self._freq_text_static_text.set_value(self.freq_text)
413
414         def set_demod_k(self, demod_k):
415                 self.demod_k = demod_k
416
417         def set_channel_decim(self, channel_decim):
418                 self.channel_decim = channel_decim
419
420         def set_bb_interp(self, bb_interp):
421                 self.bb_interp = bb_interp
422
423         def set_bb_decim(self, bb_decim):
424                 self.bb_decim = bb_decim
425
426         def set_baseband_rate(self, baseband_rate):
427                 self.baseband_rate = baseband_rate
428
429 if __name__ == '__main__':
430         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
431         (options, args) = parser.parse_args()
432         tb = usrp_rx_flex()
433         tb.Run(True)
434