bc313e3af08552771e6505142b04da8feb147a26
[debian/gnuradio] / gr-noaa / apps / usrp_rx_lrit.py
1 #!/usr/bin/env python
2 ##################################################
3 # Gnuradio Python Flow Graph
4 # Title: USRP LRIT Receiver
5 # Generated: Sat Aug 29 11:26:03 2009
6 ##################################################
7
8 from gnuradio import gr
9 from gnuradio.eng_option import eng_option
10 from gnuradio.wxgui import fftsink2
11 from gnuradio.wxgui import forms
12 from gnuradio.wxgui import numbersink2
13 from gnuradio.wxgui import scopesink2
14 from grc_gnuradio import blks2 as grc_blks2
15 from grc_gnuradio import wxgui as grc_wxgui
16 from optparse import OptionParser
17 import ConfigParser
18 import wx
19
20 class usrp_rx_lrit(grc_wxgui.top_block_gui):
21
22         def __init__(self):
23                 grc_wxgui.top_block_gui.__init__(self, title="USRP LRIT Receiver")
24
25                 ##################################################
26                 # Variables
27                 ##################################################
28                 self.config_filename = config_filename = "usrp_rx_lrit.cfg"
29                 self._saved_decim_config = ConfigParser.ConfigParser()
30                 self._saved_decim_config.read(config_filename)
31                 try: saved_decim = self._saved_decim_config.getint("main", "decim")
32                 except: saved_decim = 160
33                 self.saved_decim = saved_decim
34                 self.decim = decim = saved_decim
35                 self.symbol_rate = symbol_rate = 293e3
36                 self._saved_gain_mu_config = ConfigParser.ConfigParser()
37                 self._saved_gain_mu_config.read(config_filename)
38                 try: saved_gain_mu = self._saved_gain_mu_config.getfloat("main", "gain_mu")
39                 except: saved_gain_mu = 0.005
40                 self.saved_gain_mu = saved_gain_mu
41                 self._saved_gain_config = ConfigParser.ConfigParser()
42                 self._saved_gain_config.read(config_filename)
43                 try: saved_gain = self._saved_gain_config.getfloat("main", "gain")
44                 except: saved_gain = 33
45                 self.saved_gain = saved_gain
46                 self._saved_freq_config = ConfigParser.ConfigParser()
47                 self._saved_freq_config.read(config_filename)
48                 try: saved_freq = self._saved_freq_config.getfloat("main", "freq")
49                 except: saved_freq = 137e6
50                 self.saved_freq = saved_freq
51                 self._saved_costas_alpha_config = ConfigParser.ConfigParser()
52                 self._saved_costas_alpha_config.read(config_filename)
53                 try: saved_costas_alpha = self._saved_costas_alpha_config.getfloat("main", "costas_alpha")
54                 except: saved_costas_alpha = 0.005
55                 self.saved_costas_alpha = saved_costas_alpha
56                 self.samp_rate = samp_rate = 64e6/decim
57                 self.sps = sps = samp_rate/symbol_rate
58                 self.gain_mu = gain_mu = saved_gain_mu
59                 self.gain = gain = saved_gain
60                 self.freq = freq = saved_freq
61                 self.costas_alpha = costas_alpha = saved_costas_alpha
62
63                 ##################################################
64                 # Notebooks
65                 ##################################################
66                 self.displays = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
67                 self.displays.AddPage(grc_wxgui.Panel(self.displays), "USRP RX")
68                 self.displays.AddPage(grc_wxgui.Panel(self.displays), "Costas Output")
69                 self.GridAdd(self.displays, 2, 0, 1, 3)
70
71                 ##################################################
72                 # Controls
73                 ##################################################
74                 self._decim_text_box = forms.text_box(
75                         parent=self.GetWin(),
76                         value=self.decim,
77                         callback=self.set_decim,
78                         label="Decim",
79                         converter=forms.int_converter(),
80                 )
81                 self.GridAdd(self._decim_text_box, 0, 0, 1, 1)
82                 _gain_mu_sizer = wx.BoxSizer(wx.VERTICAL)
83                 self._gain_mu_text_box = forms.text_box(
84                         parent=self.GetWin(),
85                         sizer=_gain_mu_sizer,
86                         value=self.gain_mu,
87                         callback=self.set_gain_mu,
88                         label="Gain Mu",
89                         converter=forms.float_converter(),
90                         proportion=0,
91                 )
92                 self._gain_mu_slider = forms.slider(
93                         parent=self.GetWin(),
94                         sizer=_gain_mu_sizer,
95                         value=self.gain_mu,
96                         callback=self.set_gain_mu,
97                         minimum=0,
98                         maximum=0.5,
99                         num_steps=100,
100                         style=wx.SL_HORIZONTAL,
101                         cast=float,
102                         proportion=1,
103                 )
104                 self.GridAdd(_gain_mu_sizer, 1, 1, 1, 1)
105                 _gain_sizer = wx.BoxSizer(wx.VERTICAL)
106                 self._gain_text_box = forms.text_box(
107                         parent=self.GetWin(),
108                         sizer=_gain_sizer,
109                         value=self.gain,
110                         callback=self.set_gain,
111                         label="Gain",
112                         converter=forms.float_converter(),
113                         proportion=0,
114                 )
115                 self._gain_slider = forms.slider(
116                         parent=self.GetWin(),
117                         sizer=_gain_sizer,
118                         value=self.gain,
119                         callback=self.set_gain,
120                         minimum=0,
121                         maximum=115,
122                         num_steps=115,
123                         style=wx.SL_HORIZONTAL,
124                         cast=float,
125                         proportion=1,
126                 )
127                 self.GridAdd(_gain_sizer, 0, 1, 1, 1)
128                 _freq_sizer = wx.BoxSizer(wx.VERTICAL)
129                 self._freq_text_box = forms.text_box(
130                         parent=self.GetWin(),
131                         sizer=_freq_sizer,
132                         value=self.freq,
133                         callback=self.set_freq,
134                         label="Frequency",
135                         converter=forms.float_converter(),
136                         proportion=0,
137                 )
138                 self._freq_slider = forms.slider(
139                         parent=self.GetWin(),
140                         sizer=_freq_sizer,
141                         value=self.freq,
142                         callback=self.set_freq,
143                         minimum=135e6,
144                         maximum=139e6,
145                         num_steps=400,
146                         style=wx.SL_HORIZONTAL,
147                         cast=float,
148                         proportion=1,
149                 )
150                 self.GridAdd(_freq_sizer, 0, 2, 1, 1)
151                 _costas_alpha_sizer = wx.BoxSizer(wx.VERTICAL)
152                 self._costas_alpha_text_box = forms.text_box(
153                         parent=self.GetWin(),
154                         sizer=_costas_alpha_sizer,
155                         value=self.costas_alpha,
156                         callback=self.set_costas_alpha,
157                         label="Costas Alpha",
158                         converter=forms.float_converter(),
159                         proportion=0,
160                 )
161                 self._costas_alpha_slider = forms.slider(
162                         parent=self.GetWin(),
163                         sizer=_costas_alpha_sizer,
164                         value=self.costas_alpha,
165                         callback=self.set_costas_alpha,
166                         minimum=0,
167                         maximum=0.5,
168                         num_steps=100,
169                         style=wx.SL_HORIZONTAL,
170                         cast=float,
171                         proportion=1,
172                 )
173                 self.GridAdd(_costas_alpha_sizer, 1, 0, 1, 1)
174
175                 ##################################################
176                 # Blocks
177                 ##################################################
178                 self.gr_add_const_vxx_0 = gr.add_const_vff((48.0, ))
179                 self.gr_agc_xx_0 = gr.agc_cc(1e-6, 1.0, 1.0/32767.0, 1.0)
180                 self.gr_binary_slicer_fb_0 = gr.binary_slicer_fb()
181                 self.gr_char_to_float_0 = gr.char_to_float()
182                 self.gr_complex_to_real_0 = gr.complex_to_real(1)
183                 self.gr_file_sink_0 = gr.file_sink(gr.sizeof_char*1, "bits.dat")
184                 self.gr_file_source_0 = gr.file_source(gr.sizeof_gr_complex*1, "lrit.dat", False)
185                 self.gr_float_to_char_0 = gr.float_to_char()
186                 self.gr_mpsk_receiver_cc_0 = gr.mpsk_receiver_cc(2, 0, costas_alpha, costas_alpha*costas_alpha/4.0, -0.05, 0.05, 0.5, gain_mu, sps, gain_mu*gain_mu/4.0, 0.05)
187                 self.gr_probe_mpsk_snr_c_0 = grc_blks2.probe_mpsk_snr_c(
188                         type='snr',
189                         alpha=0.0001,
190                         probe_rate=10,
191                 )
192                 self.gr_throttle_0 = gr.throttle(gr.sizeof_gr_complex*1, samp_rate)
193                 self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(
194                         self.displays.GetPage(0).GetWin(),
195                         baseband_freq=freq,
196                         y_per_div=10,
197                         y_divs=10,
198                         ref_level=50,
199                         sample_rate=samp_rate,
200                         fft_size=1024,
201                         fft_rate=30,
202                         average=False,
203                         avg_alpha=None,
204                         title="Spectrum",
205                         peak_hold=False,
206                 )
207                 self.displays.GetPage(0).GridAdd(self.wxgui_fftsink2_0.win, 0, 0, 1, 1)
208                 self.wxgui_numbersink2_0 = numbersink2.number_sink_f(
209                         self.displays.GetPage(1).GetWin(),
210                         unit="dB",
211                         minval=0,
212                         maxval=30,
213                         factor=1.0,
214                         decimal_places=1,
215                         ref_level=0,
216                         sample_rate=10,
217                         number_rate=10,
218                         average=False,
219                         avg_alpha=None,
220                         label="SNR",
221                         peak_hold=False,
222                         show_gauge=True,
223                 )
224                 self.displays.GetPage(1).GridAdd(self.wxgui_numbersink2_0.win, 2, 0, 1, 1)
225                 self.wxgui_scopesink2_0 = scopesink2.scope_sink_c(
226                         self.displays.GetPage(0).GetWin(),
227                         title="Waveform",
228                         sample_rate=samp_rate,
229                         v_scale=0.5,
230                         t_scale=20.0/samp_rate,
231                         ac_couple=False,
232                         xy_mode=True,
233                         num_inputs=1,
234                 )
235                 self.displays.GetPage(0).GridAdd(self.wxgui_scopesink2_0.win, 1, 0, 1, 1)
236                 self.wxgui_scopesink2_1 = scopesink2.scope_sink_c(
237                         self.displays.GetPage(1).GetWin(),
238                         title="Scope Plot",
239                         sample_rate=samp_rate,
240                         v_scale=0.4,
241                         t_scale=20.0/samp_rate,
242                         ac_couple=False,
243                         xy_mode=True,
244                         num_inputs=1,
245                 )
246                 self.displays.GetPage(1).GridAdd(self.wxgui_scopesink2_1.win, 0, 0, 1, 1)
247
248                 ##################################################
249                 # Connections
250                 ##################################################
251                 self.connect((self.gr_agc_xx_0, 0), (self.wxgui_scopesink2_0, 0))
252                 self.connect((self.gr_file_source_0, 0), (self.gr_throttle_0, 0))
253                 self.connect((self.gr_throttle_0, 0), (self.gr_agc_xx_0, 0))
254                 self.connect((self.gr_probe_mpsk_snr_c_0, 0), (self.wxgui_numbersink2_0, 0))
255                 self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_probe_mpsk_snr_c_0, 0))
256                 self.connect((self.gr_agc_xx_0, 0), (self.gr_mpsk_receiver_cc_0, 0))
257                 self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.wxgui_scopesink2_1, 0))
258                 self.connect((self.gr_agc_xx_0, 0), (self.wxgui_fftsink2_0, 0))
259                 self.connect((self.gr_mpsk_receiver_cc_0, 0), (self.gr_complex_to_real_0, 0))
260                 self.connect((self.gr_complex_to_real_0, 0), (self.gr_binary_slicer_fb_0, 0))
261                 self.connect((self.gr_binary_slicer_fb_0, 0), (self.gr_char_to_float_0, 0))
262                 self.connect((self.gr_char_to_float_0, 0), (self.gr_add_const_vxx_0, 0))
263                 self.connect((self.gr_add_const_vxx_0, 0), (self.gr_float_to_char_0, 0))
264                 self.connect((self.gr_float_to_char_0, 0), (self.gr_file_sink_0, 0))
265
266         def set_config_filename(self, config_filename):
267                 self.config_filename = config_filename
268                 self._saved_decim_config = ConfigParser.ConfigParser()
269                 self._saved_decim_config.read(self.config_filename)
270                 if not self._saved_decim_config.has_section("main"):
271                         self._saved_decim_config.add_section("main")
272                 self._saved_decim_config.set("main", "decim", str(self.decim))
273                 self._saved_decim_config.write(open(self.config_filename, 'w'))
274                 self._saved_gain_config = ConfigParser.ConfigParser()
275                 self._saved_gain_config.read(self.config_filename)
276                 if not self._saved_gain_config.has_section("main"):
277                         self._saved_gain_config.add_section("main")
278                 self._saved_gain_config.set("main", "gain", str(self.gain))
279                 self._saved_gain_config.write(open(self.config_filename, 'w'))
280                 self._saved_freq_config = ConfigParser.ConfigParser()
281                 self._saved_freq_config.read(self.config_filename)
282                 if not self._saved_freq_config.has_section("main"):
283                         self._saved_freq_config.add_section("main")
284                 self._saved_freq_config.set("main", "freq", str(self.freq))
285                 self._saved_freq_config.write(open(self.config_filename, 'w'))
286                 self._saved_costas_alpha_config = ConfigParser.ConfigParser()
287                 self._saved_costas_alpha_config.read(self.config_filename)
288                 if not self._saved_costas_alpha_config.has_section("main"):
289                         self._saved_costas_alpha_config.add_section("main")
290                 self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha))
291                 self._saved_costas_alpha_config.write(open(self.config_filename, 'w'))
292                 self._saved_gain_mu_config = ConfigParser.ConfigParser()
293                 self._saved_gain_mu_config.read(self.config_filename)
294                 if not self._saved_gain_mu_config.has_section("main"):
295                         self._saved_gain_mu_config.add_section("main")
296                 self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu))
297                 self._saved_gain_mu_config.write(open(self.config_filename, 'w'))
298
299         def set_saved_decim(self, saved_decim):
300                 self.saved_decim = saved_decim
301                 self.set_decim(self.saved_decim)
302
303         def set_decim(self, decim):
304                 self.decim = decim
305                 self.set_samp_rate(64e6/self.decim)
306                 self._decim_text_box.set_value(self.decim)
307                 self._saved_decim_config = ConfigParser.ConfigParser()
308                 self._saved_decim_config.read(self.config_filename)
309                 if not self._saved_decim_config.has_section("main"):
310                         self._saved_decim_config.add_section("main")
311                 self._saved_decim_config.set("main", "decim", str(self.decim))
312                 self._saved_decim_config.write(open(self.config_filename, 'w'))
313
314         def set_symbol_rate(self, symbol_rate):
315                 self.symbol_rate = symbol_rate
316                 self.set_sps(self.samp_rate/self.symbol_rate)
317
318         def set_saved_gain_mu(self, saved_gain_mu):
319                 self.saved_gain_mu = saved_gain_mu
320                 self.set_gain_mu(self.saved_gain_mu)
321
322         def set_saved_gain(self, saved_gain):
323                 self.saved_gain = saved_gain
324                 self.set_gain(self.saved_gain)
325
326         def set_saved_freq(self, saved_freq):
327                 self.saved_freq = saved_freq
328                 self.set_freq(self.saved_freq)
329
330         def set_saved_costas_alpha(self, saved_costas_alpha):
331                 self.saved_costas_alpha = saved_costas_alpha
332                 self.set_costas_alpha(self.saved_costas_alpha)
333
334         def set_samp_rate(self, samp_rate):
335                 self.samp_rate = samp_rate
336                 self.set_sps(self.samp_rate/self.symbol_rate)
337                 self.wxgui_scopesink2_0.set_sample_rate(self.samp_rate)
338                 self.wxgui_fftsink2_0.set_sample_rate(self.samp_rate)
339                 self.wxgui_scopesink2_1.set_sample_rate(self.samp_rate)
340
341         def set_sps(self, sps):
342                 self.sps = sps
343                 self.gr_mpsk_receiver_cc_0.set_omega(self.sps)
344
345         def set_gain_mu(self, gain_mu):
346                 self.gain_mu = gain_mu
347                 self.gr_mpsk_receiver_cc_0.set_gain_mu(self.gain_mu)
348                 self.gr_mpsk_receiver_cc_0.set_gain_omega(self.gain_mu*self.gain_mu/4.0)
349                 self._saved_gain_mu_config = ConfigParser.ConfigParser()
350                 self._saved_gain_mu_config.read(self.config_filename)
351                 if not self._saved_gain_mu_config.has_section("main"):
352                         self._saved_gain_mu_config.add_section("main")
353                 self._saved_gain_mu_config.set("main", "gain_mu", str(self.gain_mu))
354                 self._saved_gain_mu_config.write(open(self.config_filename, 'w'))
355                 self._gain_mu_slider.set_value(self.gain_mu)
356                 self._gain_mu_text_box.set_value(self.gain_mu)
357
358         def set_gain(self, gain):
359                 self.gain = gain
360                 self._gain_slider.set_value(self.gain)
361                 self._gain_text_box.set_value(self.gain)
362                 self._saved_gain_config = ConfigParser.ConfigParser()
363                 self._saved_gain_config.read(self.config_filename)
364                 if not self._saved_gain_config.has_section("main"):
365                         self._saved_gain_config.add_section("main")
366                 self._saved_gain_config.set("main", "gain", str(self.gain))
367                 self._saved_gain_config.write(open(self.config_filename, 'w'))
368
369         def set_freq(self, freq):
370                 self.freq = freq
371                 self.wxgui_fftsink2_0.set_baseband_freq(self.freq)
372                 self._freq_slider.set_value(self.freq)
373                 self._freq_text_box.set_value(self.freq)
374                 self._saved_freq_config = ConfigParser.ConfigParser()
375                 self._saved_freq_config.read(self.config_filename)
376                 if not self._saved_freq_config.has_section("main"):
377                         self._saved_freq_config.add_section("main")
378                 self._saved_freq_config.set("main", "freq", str(self.freq))
379                 self._saved_freq_config.write(open(self.config_filename, 'w'))
380
381         def set_costas_alpha(self, costas_alpha):
382                 self.costas_alpha = costas_alpha
383                 self.gr_mpsk_receiver_cc_0.set_alpha(self.costas_alpha)
384                 self.gr_mpsk_receiver_cc_0.set_beta(self.costas_alpha*self.costas_alpha/4.0)
385                 self._costas_alpha_slider.set_value(self.costas_alpha)
386                 self._costas_alpha_text_box.set_value(self.costas_alpha)
387                 self._saved_costas_alpha_config = ConfigParser.ConfigParser()
388                 self._saved_costas_alpha_config.read(self.config_filename)
389                 if not self._saved_costas_alpha_config.has_section("main"):
390                         self._saved_costas_alpha_config.add_section("main")
391                 self._saved_costas_alpha_config.set("main", "costas_alpha", str(self.costas_alpha))
392                 self._saved_costas_alpha_config.write(open(self.config_filename, 'w'))
393
394 if __name__ == '__main__':
395         parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
396         (options, args) = parser.parse_args()
397         tb = usrp_rx_lrit()
398         tb.Run(True)
399