From version < 30.2 >
edited by Jean-Yves Dupertuis
on 27-03-2018, 17:23
To version < 35.1 >
edited by Jean-Yves Dupertuis
on 04-04-2018, 16:19
< >
Change comment: testSDR-b new

Summary

Details

Page properties
Content
... ... @@ -27,6 +27,436 @@
27 27  Le wiki me demande de lancer un script écrit en python qui se trouve :
28 28  https://raw.githubusercontent.com/pothosware/gnuradio-companion-exe/master/GNURadioHelper.py
29 29  
30 +
31 +{{code language="python" title="fichier de test"}}
32 +# Copyright (c) 2015-2016 Josh Blum
33 +# SPDX-License-Identifier: BSL-1.0
34 +
35 +########################################################################
36 +## Do checks and prepare dependencies for GRC
37 +########################################################################
38 +import os
39 +import sys
40 +import inspect
41 +import tempfile
42 +import subprocess
43 +from ctypes.util import find_library
44 +
45 +########################################################################
46 +## Registry/Environment helpers
47 +########################################################################
48 +import ctypes
49 +from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM, LPVOID
50 +LRESULT = LPARAM
51 +import os
52 +import sys
53 +try:
54 + import winreg
55 + unicode = str
56 +except ImportError:
57 + import _winreg as winreg # Python 2.x
58 +
59 +class Environment(object):
60 + #path = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
61 + #hklm = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
62 + path = r'Environment'
63 + hklm = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
64 + key = winreg.OpenKey(hklm, path, 0, winreg.KEY_READ | winreg.KEY_WRITE)
65 + SendMessage = ctypes.windll.user32.SendMessageW
66 + SendMessage.argtypes = HWND, UINT, WPARAM, LPVOID
67 + SendMessage.restype = LRESULT
68 + HWND_BROADCAST = 0xFFFF
69 + WM_SETTINGCHANGE = 0x1A
70 + NO_DEFAULT = type('NO_DEFAULT', (object,), {})()
71 +
72 + def get(self, name, default=NO_DEFAULT):
73 + try:
74 + value = winreg.QueryValueEx(self.key, name)[0]
75 + except WindowsError:
76 + if default is self.NO_DEFAULT:
77 + raise ValueError("No such registry key", name)
78 + value = default
79 + return value
80 +
81 + def set(self, name, value):
82 + if value:
83 + winreg.SetValueEx(self.key, name, 0, winreg.REG_EXPAND_SZ, value)
84 + else:
85 + winreg.DeleteValue(self.key, name)
86 + self.notify()
87 +
88 + def notify(self):
89 + self.SendMessage(
90 + self.HWND_BROADCAST, self.WM_SETTINGCHANGE, 0, u'Environment')
91 +
92 +########################################################################
93 +## determine-if-an-executable-or-library-is-32-or-64-bits-on-windows
94 +## https://stackoverflow.com/questions/1345632
95 +########################################################################
96 +import struct
97 +
98 +IMAGE_FILE_MACHINE_I386=332
99 +IMAGE_FILE_MACHINE_IA64=512
100 +IMAGE_FILE_MACHINE_AMD64=34404
101 +
102 +def getDllMachineType(path):
103 + f=open(path, "rb")
104 + s=f.read(2)
105 + if s!="MZ": raise Exception("%s is not a DLL"%path)
106 + f.seek(60)
107 + s=f.read(4)
108 + header_offset=struct.unpack("<L", s)[0]
109 + f.seek(header_offset+4)
110 + s=f.read(2)
111 + machine=struct.unpack("<H", s)[0]
112 + f.close()
113 + return machine
114 +
115 +########################################################################
116 +## Pip helpers
117 +########################################################################
118 +PIP_EXE = os.path.join(os.path.dirname(sys.executable), 'Scripts', 'pip.exe')
119 +
120 +def pip_install(arg):
121 + ret = subprocess.call([PIP_EXE, 'install', arg], shell=True)
122 + if ret != 0:
123 + print("Error: pip failed to install %s"%arg)
124 + return -1
125 +
126 +########################################################################
127 +## Python checks
128 +########################################################################
129 +def check_python_version():
130 + is_64bits = sys.maxsize > 2**32
131 + if not is_64bits:
132 + raise Exception("requires 64-bit Python")
133 +
134 + if sys.version_info.major != 2 or sys.version_info.minor != 7:
135 + raise Exception("requires Python version 2.7")
136 +
137 + if not os.path.exists(PIP_EXE):
138 + raise Exception("can't find pip executable %s"%PIP_EXE)
139 +
140 + return sys.version
141 +
142 +def handle_python_version():
143 + print("Error: Invoke/Reinstall Python2.7 for amd64")
144 + return -1
145 +
146 +########################################################################
147 +## GTK checks
148 +########################################################################
149 +def check_gtk_runtime():
150 +
151 + gtk_dll_name = "libgtk-win32-2.0-0.dll"
152 +
153 + #first check that the installer default is found
154 + installer_default = os.path.join("C:\\Program Files\\GTK2-Runtime Win64\\bin", gtk_dll_name)
155 + if os.path.exists(installer_default): return installer_default
156 +
157 + #regular dll search within the path
158 + libgtk = find_library(gtk_dll_name)
159 + if libgtk is None:
160 + raise Exception("failed to locate the GTK+ runtime DLL")
161 +
162 + #reject 32-bit versions of this dll
163 + if getDllMachineType(libgtk) != IMAGE_FILE_MACHINE_AMD64:
164 + raise Exception("%s is not AMD64"%libgtk)
165 +
166 + return libgtk
167 +
168 +def handle_gtk_runtime():
169 +
170 + GTK_URL = 'http://downloads.myriadrf.org/binaries/python27_amd64/gtk2-runtime-2.22.1-2014-02-01-ts-win64.exe'
171 + GTK_EXE = os.path.join(tempfile.gettempdir(), 'gtk2-runtime-2.22.1-2014-02-01-ts-win64.exe')
172 +
173 + if not os.path.exists(GTK_EXE):
174 +
175 + #need requests to download the exe
176 + try: import requests
177 + except: pip_install("requests")
178 + import requests
179 +
180 + #download from the url to the destination
181 + r = requests.get(GTK_URL)
182 + with open(GTK_EXE, 'wb') as fd:
183 + for chunk in r.iter_content(1024*1024):
184 + fd.write(chunk)
185 +
186 + if not os.path.exists(GTK_EXE):
187 + print("Cant find installer: %s"%GTK_EXE)
188 + print("Failed to download: %s"%GTK_URL)
189 + return -1
190 +
191 + print("Running installer: %s"%GTK_EXE)
192 + ret = subprocess.call([GTK_EXE, '/S'], shell=True) #silent install
193 + if ret != 0:
194 + print("The GTK installer failed with exit code %d"%ret)
195 + exit(ret)
196 +
197 + print("The GTK installer should have modified the system path")
198 + print("Open a new command window and re-run this script...")
199 +
200 +def check_import_gtk():
201 + import gtk
202 + return inspect.getfile(gtk)
203 +
204 +def handle_import_gtk():
205 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/pygtk-2.22.0-cp27-none-win_amd64.whl')
206 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/pygobject-2.28.6-cp27-none-win_amd64.whl')
207 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/pycairo_gtk-1.10.0-cp27-none-win_amd64.whl')
208 +
209 +########################################################################
210 +## GNU Radio checks
211 +########################################################################
212 +def guess_bin_path():
213 +
214 + #was it run from the proper install directory?
215 + path = os.path.abspath(os.path.dirname(__file__))
216 + if os.path.exists(os.path.join(path, "gnuradio-runtime.dll")): return path
217 +
218 + #otherwise search the path to find the root
219 + gnuradio_runtime = find_library("gnuradio-runtime.dll")
220 + if gnuradio_runtime: return gnuradio_runtime
221 +
222 +def check_gr_runtime():
223 + gnuradio_runtime = find_library("gnuradio-runtime.dll")
224 +
225 + if gnuradio_runtime is None:
226 + raise Exception("failed to locate the GNURadio runtime DLL")
227 +
228 + return gnuradio_runtime
229 +
230 +def handle_gr_runtime():
231 +
232 + path = guess_bin_path()
233 +
234 + #we dont know where the bin path is, this is probably an installer issue
235 + #print this message and return error so other handlers are not invoked
236 + if path is None:
237 + print("Error: PothosSDR DLLs missing from the system path")
238 + print(" See instructions to 'Add PothosSDR to the system PATH'")
239 + print(" https://github.com/pothosware/PothosSDR/wiki/Tutorial")
240 + return -1
241 +
242 + e = Environment()
243 + PATH = e.get('PATH', '')
244 + print("Current PATH: '%s'"%PATH)
245 + if not PATH: PATH = list()
246 + else: PATH = PATH.split(';')
247 +
248 + if path not in PATH:
249 + print("Adding %s to the PATH"%path)
250 + PATH.append(path)
251 + e.set('PATH', ';'.join(PATH))
252 +
253 + print("")
254 + print("The PATH for the current user has been modified")
255 + print("Open a new command window and re-run this script...")
256 +
257 +def check_import_gr():
258 + import gnuradio
259 + from gnuradio import gr
260 + return inspect.getfile(gnuradio)
261 +
262 +def handle_import_gr():
263 + binDir = guess_bin_path()
264 + path = os.path.join(os.path.dirname(binDir), 'lib', 'python2.7', 'site-packages')
265 + if not os.path.exists(path): #or use old-style path without python version
266 + path = os.path.join(os.path.dirname(binDir), 'lib', 'site-packages')
267 + path = os.path.normpath(path)
268 + print("Error: GNURadio modules missing from PYTHONPATH")
269 +
270 + print("")
271 + print("Current search path:")
272 + for searchPath in sys.path: print(" * %s"%searchPath)
273 + print("")
274 +
275 + e = Environment()
276 + PYTHONPATH = e.get('PYTHONPATH', '')
277 + print("Current PYTHONPATH: '%s'"%PYTHONPATH)
278 + if not PYTHONPATH: PYTHONPATH = list()
279 + else: PYTHONPATH = PYTHONPATH.split(';')
280 +
281 + if path not in PYTHONPATH:
282 + print("Adding %s to the PYTHONPATH"%path)
283 + PYTHONPATH.append(path)
284 + e.set('PYTHONPATH', ';'.join(PYTHONPATH))
285 +
286 + print("")
287 + print("The PYTHONPATH for the current user has been modified")
288 + print("Open a new command window and re-run this script...")
289 +
290 +def check_grc_blocks_path():
291 + GRC_BLOCKS_PATH = os.environ.get('GRC_BLOCKS_PATH', '').split(';')[0] #take the first entry
292 + if not GRC_BLOCKS_PATH:
293 + raise Exception("GRC_BLOCKS_PATH is not set")
294 + if not os.path.exists(GRC_BLOCKS_PATH):
295 + raise Exception("GRC_BLOCKS_PATH '%s' does not exist"%GRC_BLOCKS_PATH)
296 + if not os.path.exists(os.path.join(GRC_BLOCKS_PATH, 'options.xml')):
297 + raise Exception("GRC_BLOCKS_PATH '%s' does not contain options.xml"%GRC_BLOCKS_PATH)
298 + return GRC_BLOCKS_PATH
299 +
300 +def handle_grc_blocks_path():
301 + binDir = guess_bin_path()
302 + path = os.path.join(os.path.dirname(binDir), 'share', 'gnuradio', 'grc', 'blocks')
303 + path = os.path.normpath(path)
304 +
305 + print("Setting the GRC_BLOCKS_PATH to %s"%path)
306 + e = Environment()
307 + e.set('GRC_BLOCKS_PATH', path)
308 +
309 + print("")
310 + print("The GRC_BLOCKS_PATH for the current user has been modified")
311 + print("Open a new command window and re-run this script...")
312 +
313 +########################################################################
314 +## Other module checks
315 +########################################################################
316 +def check_import_numpy():
317 + import numpy
318 + return inspect.getfile(numpy)
319 +
320 +def handle_import_numpy():
321 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/numpy-1.12.0+mkl-cp27-cp27m-win_amd64.whl')
322 +
323 +def check_import_lxml():
324 + import lxml
325 + return inspect.getfile(lxml)
326 +
327 +def handle_import_lxml():
328 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/lxml-3.7.2-cp27-cp27m-win_amd64.whl')
329 +
330 +def check_import_cheetah():
331 + import Cheetah
332 + return inspect.getfile(Cheetah)
333 +
334 +def handle_import_cheetah():
335 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/Cheetah-2.4.4-cp27-none-win_amd64.whl')
336 +
337 +def check_import_wxpython():
338 + import wx
339 + import wx.glcanvas
340 + return inspect.getfile(wx)
341 +
342 +def handle_import_wxpython():
343 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/wxPython-3.0.2.0-cp27-none-win_amd64.whl')
344 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/wxPython_common-3.0.2.0-py2-none-any.whl')
345 +
346 +def check_import_pyopengl():
347 + import OpenGL
348 + import OpenGL.GL
349 + return inspect.getfile(OpenGL)
350 +
351 +def handle_import_pyopengl():
352 + print("Installing PyOpenGL with pip:")
353 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/PyOpenGL-3.1.1-cp27-cp27m-win_amd64.whl')
354 + pip_install('http://downloads.myriadrf.org/binaries/python27_amd64/PyOpenGL_accelerate-3.1.1-cp27-cp27m-win_amd64.whl')
355 + print(" Done!")
356 +
357 +CHECKS = [
358 + #first check gr runtime so we can locate the install based on runtime dll in PATH
359 + ("GR_RUNTIME", 'locate GNURadio runtime', check_gr_runtime, handle_gr_runtime),
360 +
361 + #gtk runtime is similar check for dlls in the seatch PATH (no python required)
362 + ("GTK_RUNTIME", 'locate GTK+ runtime', check_gtk_runtime, handle_gtk_runtime),
363 +
364 + #basic python environment and import checks and using pip to install from a URL
365 + ("PYVERSION", 'Python version is 2.7', check_python_version, handle_python_version),
366 + ("IMPORT_GTK", 'import gtk module', check_import_gtk, handle_import_gtk),
367 + ("IMPORT_NUMPY", 'import numpy module', check_import_numpy, handle_import_numpy),
368 + ("IMPORT_LXML", 'import lxml module', check_import_lxml, handle_import_lxml),
369 + ("IMPORT_CHEETAH", 'import Cheetah module', check_import_cheetah, handle_import_cheetah),
370 + ("IMPORT_WX", 'import wx module', check_import_wxpython, handle_import_wxpython),
371 + ("IMPORT_OPENGL", 'import OpenGL module', check_import_pyopengl, handle_import_pyopengl),
372 +
373 + #final checks for GNU Radio and GRC that set local environment variables
374 + ("GRC_BLOCKS", 'GRC blocks path set', check_grc_blocks_path, handle_grc_blocks_path),
375 + ("IMPORT_GR", 'import GNURadio module', check_import_gr, handle_import_gr),
376 +]
377 +
378 +def main():
379 + print("")
380 + print("="*40)
381 + print("== Runtime and import checks")
382 + print("="*40)
383 +
384 + maxLen = max([len(c[1]) for c in CHECKS])
385 + msgs = dict()
386 + statuses = dict()
387 + numFails = 0
388 + numPasses = 0
389 + for key, what, check, handle in CHECKS:
390 + whatStr = "%s...%s"%(what, ' '*(maxLen-len(what)))
391 + try:
392 + msg = check()
393 + statStr = "PASS"
394 + checkPassed = True
395 + numPasses += 1
396 + except Exception as ex:
397 + statStr = "FAIL"
398 + checkPassed = False
399 + msg = str(ex)
400 + numFails += 1
401 +
402 + print(" * Check %s %s"%(whatStr, statStr))
403 + msgs[key] = msg
404 + statuses[key] = checkPassed
405 +
406 + if numPasses:
407 + print("")
408 + print("="*40)
409 + print("== Checks passed summary")
410 + print("="*40)
411 + for key, what, check, handle in CHECKS:
412 + if statuses[key]: print("%s:\t%s"%(key, msgs[key]))
413 +
414 + if numFails == 0:
415 + print("")
416 + print("All checked passed! gnuradio-companion is ready to use.")
417 + return 0
418 +
419 + if numFails:
420 + print("")
421 + print("="*40)
422 + print("== Checks failed summary")
423 + print("="*40)
424 + for key, what, check, handle in CHECKS:
425 + if not statuses[key]: print("%s:\t%s"%(key, msgs[key]))
426 +
427 + if numFails:
428 + print("")
429 + print("="*40)
430 + print("== Fixing problems")
431 + print("="*40)
432 + for key, what, check, handle in CHECKS:
433 + if not statuses[key]:
434 + print("Handling issues for %s..."%key)
435 + ret = handle()
436 + #exit asap when return code provided
437 + if ret is not None: return ret
438 +
439 + print("")
440 + print("Changes made! Please re-run this script in a new terminal.")
441 +
442 +if __name__ == '__main__':
443 +
444 + #run main with exception handling
445 + ret = None
446 + try: ret = main()
447 + except Exception as ex:
448 + print("Error: %s"%str(ex))
449 +
450 + #give time to read message if opened from explorer
451 + #wait for user to press a key
452 + print("")
453 + os.system('pause')
454 +
455 + #return the error code from main
456 + if ret is None: ret = 0
457 + exit(ret)
458 +{{/code}}
459 +
30 30  Avec copier - coller, je l'ai sauvé sur mon PC.
31 31  
32 32  J'ouvre le fichier avec "Edit with IDLE", ensuite via "run modul F5" , après avoir installé GTK+ runtime, il m'annonce que je dois réinstallé python 2.7, car j'avais chargé un autre 2.7.14 !
... ... @@ -163,7 +163,7 @@
163 163  
164 164  Je profite pour installer directement GQRX :
165 165  
166 -~~$//sudo apt install gqrx//
596 +~~$//sudo apt install gqrx-sdr//
167 167  
168 168  Ensuite je branche ma clef DVB-t, et je regarde si le programme GQRX la trouve.
169 169  
... ... @@ -180,12 +180,23 @@
180 180  
181 181  == GNURadio ==
182 182  
613 +{{error}}
614 +Attention AVANT DE LANCER GNU COMPAGNON VOUS DEVEZ INSTALLER GQRX-SDR, SINON il vous manquera des bibliothèques !!!
615 +{{/error}}
616 +
617 +
183 183  En suivant l'excellent document qui se trouve :
184 184  http://f0fyf.blogspot.ch/2014/08/recepteur-fm-avec-gnuradio.html
185 185  je réalise mon premier programme SDR avec ma clef RTL-SDR.
186 186  
187 -[[testSDR.grc>>attach:testSDR.grc]]
622 +[[testSDR-b.grc>>attach:testSDR-b.grc]]
188 188  
624 +{{error}}
625 +Sur une version linux , mon module "Options" n'avait pas la dimension de la page !?
626 +ecrivez : 1280, 1024
627 +{{/error}}
628 +
629 +
189 189  [[image:DJtestDaarioSDR.png||height="545" width="562"]]
190 190  
191 191  
testSDR-b.grc
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.Dupertuis
Size
... ... @@ -1,0 +1,1 @@
1 +18.1 KB
Content
... ... @@ -1,0 +1,932 @@
1 +<?xml version='1.0' encoding='ASCII'?>
2 +<flow_graph>
3 + <timestamp>Wed Apr 4 10:10:57 2018</timestamp>
4 + <block>
5 + <key>variable</key>
6 + <param>
7 + <key>id</key>
8 + <value>samp_rate</value>
9 + </param>
10 + <param>
11 + <key>_enabled</key>
12 + <value>True</value>
13 + </param>
14 + <param>
15 + <key>value</key>
16 + <value>2e6</value>
17 + </param>
18 + <param>
19 + <key>_coordinate</key>
20 + <value>(176, 5)</value>
21 + </param>
22 + <param>
23 + <key>_rotation</key>
24 + <value>0</value>
25 + </param>
26 + </block>
27 + <block>
28 + <key>variable</key>
29 + <param>
30 + <key>id</key>
31 + <value>cutoff</value>
32 + </param>
33 + <param>
34 + <key>_enabled</key>
35 + <value>True</value>
36 + </param>
37 + <param>
38 + <key>value</key>
39 + <value>100e3</value>
40 + </param>
41 + <param>
42 + <key>_coordinate</key>
43 + <value>(494, 193)</value>
44 + </param>
45 + <param>
46 + <key>_rotation</key>
47 + <value>0</value>
48 + </param>
49 + </block>
50 + <block>
51 + <key>variable</key>
52 + <param>
53 + <key>id</key>
54 + <value>audio_dec</value>
55 + </param>
56 + <param>
57 + <key>_enabled</key>
58 + <value>True</value>
59 + </param>
60 + <param>
61 + <key>value</key>
62 + <value>10</value>
63 + </param>
64 + <param>
65 + <key>_coordinate</key>
66 + <value>(747, 226)</value>
67 + </param>
68 + <param>
69 + <key>_rotation</key>
70 + <value>0</value>
71 + </param>
72 + </block>
73 + <block>
74 + <key>variable</key>
75 + <param>
76 + <key>id</key>
77 + <value>quadrature</value>
78 + </param>
79 + <param>
80 + <key>_enabled</key>
81 + <value>True</value>
82 + </param>
83 + <param>
84 + <key>value</key>
85 + <value>500e3</value>
86 + </param>
87 + <param>
88 + <key>_coordinate</key>
89 + <value>(176, 69)</value>
90 + </param>
91 + <param>
92 + <key>_rotation</key>
93 + <value>0</value>
94 + </param>
95 + </block>
96 + <block>
97 + <key>rational_resampler_xxx</key>
98 + <param>
99 + <key>id</key>
100 + <value>rational_resampler_xxx_1</value>
101 + </param>
102 + <param>
103 + <key>_enabled</key>
104 + <value>True</value>
105 + </param>
106 + <param>
107 + <key>type</key>
108 + <value>fff</value>
109 + </param>
110 + <param>
111 + <key>interp</key>
112 + <value>48</value>
113 + </param>
114 + <param>
115 + <key>decim</key>
116 + <value>int(quadrature/1e3/audio_dec)</value>
117 + </param>
118 + <param>
119 + <key>taps</key>
120 + <value></value>
121 + </param>
122 + <param>
123 + <key>fbw</key>
124 + <value>0</value>
125 + </param>
126 + <param>
127 + <key>affinity</key>
128 + <value></value>
129 + </param>
130 + <param>
131 + <key>minoutbuf</key>
132 + <value>0</value>
133 + </param>
134 + <param>
135 + <key>maxoutbuf</key>
136 + <value>0</value>
137 + </param>
138 + <param>
139 + <key>_coordinate</key>
140 + <value>(312, 455)</value>
141 + </param>
142 + <param>
143 + <key>_rotation</key>
144 + <value>0</value>
145 + </param>
146 + </block>
147 + <block>
148 + <key>options</key>
149 + <param>
150 + <key>id</key>
151 + <value>DJTestRadioSDR</value>
152 + </param>
153 + <param>
154 + <key>_enabled</key>
155 + <value>True</value>
156 + </param>
157 + <param>
158 + <key>title</key>
159 + <value>Test Radion SDR</value>
160 + </param>
161 + <param>
162 + <key>author</key>
163 + <value>Jean-Yves HB9FOU</value>
164 + </param>
165 + <param>
166 + <key>description</key>
167 + <value></value>
168 + </param>
169 + <param>
170 + <key>window_size</key>
171 + <value>1280, 1024</value>
172 + </param>
173 + <param>
174 + <key>generate_options</key>
175 + <value>wx_gui</value>
176 + </param>
177 + <param>
178 + <key>category</key>
179 + <value>Custom</value>
180 + </param>
181 + <param>
182 + <key>run_options</key>
183 + <value>prompt</value>
184 + </param>
185 + <param>
186 + <key>run</key>
187 + <value>True</value>
188 + </param>
189 + <param>
190 + <key>max_nouts</key>
191 + <value>0</value>
192 + </param>
193 + <param>
194 + <key>realtime_scheduling</key>
195 + <value></value>
196 + </param>
197 + <param>
198 + <key>_coordinate</key>
199 + <value>(8, -1)</value>
200 + </param>
201 + <param>
202 + <key>_rotation</key>
203 + <value>0</value>
204 + </param>
205 + </block>
206 + <block>
207 + <key>analog_wfm_rcv</key>
208 + <param>
209 + <key>id</key>
210 + <value>analog_wfm_rcv_0</value>
211 + </param>
212 + <param>
213 + <key>_enabled</key>
214 + <value>True</value>
215 + </param>
216 + <param>
217 + <key>quad_rate</key>
218 + <value>quadrature</value>
219 + </param>
220 + <param>
221 + <key>audio_decimation</key>
222 + <value>audio_dec</value>
223 + </param>
224 + <param>
225 + <key>affinity</key>
226 + <value></value>
227 + </param>
228 + <param>
229 + <key>minoutbuf</key>
230 + <value>0</value>
231 + </param>
232 + <param>
233 + <key>maxoutbuf</key>
234 + <value>0</value>
235 + </param>
236 + <param>
237 + <key>_coordinate</key>
238 + <value>(734, 297)</value>
239 + </param>
240 + <param>
241 + <key>_rotation</key>
242 + <value>0</value>
243 + </param>
244 + </block>
245 + <block>
246 + <key>low_pass_filter</key>
247 + <param>
248 + <key>id</key>
249 + <value>low_pass_filter_0</value>
250 + </param>
251 + <param>
252 + <key>_enabled</key>
253 + <value>True</value>
254 + </param>
255 + <param>
256 + <key>type</key>
257 + <value>fir_filter_ccf</value>
258 + </param>
259 + <param>
260 + <key>decim</key>
261 + <value>1</value>
262 + </param>
263 + <param>
264 + <key>interp</key>
265 + <value>1</value>
266 + </param>
267 + <param>
268 + <key>gain</key>
269 + <value>1</value>
270 + </param>
271 + <param>
272 + <key>samp_rate</key>
273 + <value>samp_rate</value>
274 + </param>
275 + <param>
276 + <key>cutoff_freq</key>
277 + <value>cutoff</value>
278 + </param>
279 + <param>
280 + <key>width</key>
281 + <value>1e6</value>
282 + </param>
283 + <param>
284 + <key>win</key>
285 + <value>firdes.WIN_HAMMING</value>
286 + </param>
287 + <param>
288 + <key>beta</key>
289 + <value>6.76</value>
290 + </param>
291 + <param>
292 + <key>affinity</key>
293 + <value></value>
294 + </param>
295 + <param>
296 + <key>minoutbuf</key>
297 + <value>0</value>
298 + </param>
299 + <param>
300 + <key>maxoutbuf</key>
301 + <value>0</value>
302 + </param>
303 + <param>
304 + <key>_coordinate</key>
305 + <value>(489, 256)</value>
306 + </param>
307 + <param>
308 + <key>_rotation</key>
309 + <value>0</value>
310 + </param>
311 + </block>
312 + <block>
313 + <key>wxgui_waterfallsink2</key>
314 + <param>
315 + <key>id</key>
316 + <value>wxgui_waterfallsink2_0</value>
317 + </param>
318 + <param>
319 + <key>_enabled</key>
320 + <value>True</value>
321 + </param>
322 + <param>
323 + <key>type</key>
324 + <value>complex</value>
325 + </param>
326 + <param>
327 + <key>title</key>
328 + <value>Waterfall </value>
329 + </param>
330 + <param>
331 + <key>samp_rate</key>
332 + <value>samp_rate</value>
333 + </param>
334 + <param>
335 + <key>baseband_freq</key>
336 + <value>0</value>
337 + </param>
338 + <param>
339 + <key>dynamic_range</key>
340 + <value>100</value>
341 + </param>
342 + <param>
343 + <key>ref_level</key>
344 + <value>0</value>
345 + </param>
346 + <param>
347 + <key>ref_scale</key>
348 + <value>2.0</value>
349 + </param>
350 + <param>
351 + <key>fft_size</key>
352 + <value>512</value>
353 + </param>
354 + <param>
355 + <key>fft_rate</key>
356 + <value>15</value>
357 + </param>
358 + <param>
359 + <key>average</key>
360 + <value>False</value>
361 + </param>
362 + <param>
363 + <key>avg_alpha</key>
364 + <value>0</value>
365 + </param>
366 + <param>
367 + <key>win</key>
368 + <value>None</value>
369 + </param>
370 + <param>
371 + <key>win_size</key>
372 + <value></value>
373 + </param>
374 + <param>
375 + <key>grid_pos</key>
376 + <value></value>
377 + </param>
378 + <param>
379 + <key>notebook</key>
380 + <value></value>
381 + </param>
382 + <param>
383 + <key>freqvar</key>
384 + <value>None</value>
385 + </param>
386 + <param>
387 + <key>affinity</key>
388 + <value></value>
389 + </param>
390 + <param>
391 + <key>_coordinate</key>
392 + <value>(249, 586)</value>
393 + </param>
394 + <param>
395 + <key>_rotation</key>
396 + <value>0</value>
397 + </param>
398 + </block>
399 + <block>
400 + <key>rational_resampler_xxx</key>
401 + <param>
402 + <key>id</key>
403 + <value>rational_resampler_xxx_0</value>
404 + </param>
405 + <param>
406 + <key>_enabled</key>
407 + <value>True</value>
408 + </param>
409 + <param>
410 + <key>type</key>
411 + <value>ccc</value>
412 + </param>
413 + <param>
414 + <key>interp</key>
415 + <value>1</value>
416 + </param>
417 + <param>
418 + <key>decim</key>
419 + <value>int(samp_rate/quadrature)</value>
420 + </param>
421 + <param>
422 + <key>taps</key>
423 + <value></value>
424 + </param>
425 + <param>
426 + <key>fbw</key>
427 + <value>0</value>
428 + </param>
429 + <param>
430 + <key>affinity</key>
431 + <value></value>
432 + </param>
433 + <param>
434 + <key>minoutbuf</key>
435 + <value>0</value>
436 + </param>
437 + <param>
438 + <key>maxoutbuf</key>
439 + <value>0</value>
440 + </param>
441 + <param>
442 + <key>_coordinate</key>
443 + <value>(260, 287)</value>
444 + </param>
445 + <param>
446 + <key>_rotation</key>
447 + <value>0</value>
448 + </param>
449 + </block>
450 + <block>
451 + <key>audio_sink</key>
452 + <param>
453 + <key>id</key>
454 + <value>audio_sink_0</value>
455 + </param>
456 + <param>
457 + <key>_enabled</key>
458 + <value>True</value>
459 + </param>
460 + <param>
461 + <key>samp_rate</key>
462 + <value>48000</value>
463 + </param>
464 + <param>
465 + <key>device_name</key>
466 + <value></value>
467 + </param>
468 + <param>
469 + <key>ok_to_block</key>
470 + <value>True</value>
471 + </param>
472 + <param>
473 + <key>num_inputs</key>
474 + <value>1</value>
475 + </param>
476 + <param>
477 + <key>affinity</key>
478 + <value></value>
479 + </param>
480 + <param>
481 + <key>_coordinate</key>
482 + <value>(770, 476)</value>
483 + </param>
484 + <param>
485 + <key>_rotation</key>
486 + <value>0</value>
487 + </param>
488 + </block>
489 + <block>
490 + <key>blocks_multiply_const_vxx</key>
491 + <param>
492 + <key>id</key>
493 + <value>blocks_multiply_const_vxx_0</value>
494 + </param>
495 + <param>
496 + <key>_enabled</key>
497 + <value>True</value>
498 + </param>
499 + <param>
500 + <key>type</key>
501 + <value>float</value>
502 + </param>
503 + <param>
504 + <key>const</key>
505 + <value>Volume</value>
506 + </param>
507 + <param>
508 + <key>vlen</key>
509 + <value>1</value>
510 + </param>
511 + <param>
512 + <key>affinity</key>
513 + <value></value>
514 + </param>
515 + <param>
516 + <key>minoutbuf</key>
517 + <value>0</value>
518 + </param>
519 + <param>
520 + <key>maxoutbuf</key>
521 + <value>0</value>
522 + </param>
523 + <param>
524 + <key>_coordinate</key>
525 + <value>(535, 474)</value>
526 + </param>
527 + <param>
528 + <key>_rotation</key>
529 + <value>0</value>
530 + </param>
531 + </block>
532 + <block>
533 + <key>variable_slider</key>
534 + <param>
535 + <key>id</key>
536 + <value>Volume</value>
537 + </param>
538 + <param>
539 + <key>_enabled</key>
540 + <value>True</value>
541 + </param>
542 + <param>
543 + <key>label</key>
544 + <value>volume</value>
545 + </param>
546 + <param>
547 + <key>value</key>
548 + <value>1</value>
549 + </param>
550 + <param>
551 + <key>min</key>
552 + <value>0</value>
553 + </param>
554 + <param>
555 + <key>max</key>
556 + <value>100</value>
557 + </param>
558 + <param>
559 + <key>num_steps</key>
560 + <value>100</value>
561 + </param>
562 + <param>
563 + <key>style</key>
564 + <value>wx.SL_HORIZONTAL</value>
565 + </param>
566 + <param>
567 + <key>converver</key>
568 + <value>float_converter</value>
569 + </param>
570 + <param>
571 + <key>grid_pos</key>
572 + <value></value>
573 + </param>
574 + <param>
575 + <key>notebook</key>
576 + <value></value>
577 + </param>
578 + <param>
579 + <key>_coordinate</key>
580 + <value>(524, 539)</value>
581 + </param>
582 + <param>
583 + <key>_rotation</key>
584 + <value>0</value>
585 + </param>
586 + </block>
587 + <block>
588 + <key>rtlsdr_source</key>
589 + <param>
590 + <key>id</key>
591 + <value>rtlsdr_source_0</value>
592 + </param>
593 + <param>
594 + <key>_enabled</key>
595 + <value>True</value>
596 + </param>
597 + <param>
598 + <key>type</key>
599 + <value>fc32</value>
600 + </param>
601 + <param>
602 + <key>args</key>
603 + <value></value>
604 + </param>
605 + <param>
606 + <key>nchan</key>
607 + <value>1</value>
608 + </param>
609 + <param>
610 + <key>sample_rate</key>
611 + <value>samp_rate</value>
612 + </param>
613 + <param>
614 + <key>freq0</key>
615 + <value>freq*1e6</value>
616 + </param>
617 + <param>
618 + <key>corr0</key>
619 + <value>-30</value>
620 + </param>
621 + <param>
622 + <key>dc_offset_mode0</key>
623 + <value>0</value>
624 + </param>
625 + <param>
626 + <key>iq_balance_mode0</key>
627 + <value>0</value>
628 + </param>
629 + <param>
630 + <key>gain_mode0</key>
631 + <value>True</value>
632 + </param>
633 + <param>
634 + <key>gain0</key>
635 + <value>50</value>
636 + </param>
637 + <param>
638 + <key>if_gain0</key>
639 + <value>30</value>
640 + </param>
641 + <param>
642 + <key>bb_gain0</key>
643 + <value>20</value>
644 + </param>
645 + <param>
646 + <key>ant0</key>
647 + <value>1</value>
648 + </param>
649 + <param>
650 + <key>bw0</key>
651 + <value>0</value>
652 + </param>
653 + <param>
654 + <key>freq1</key>
655 + <value>100e6</value>
656 + </param>
657 + <param>
658 + <key>corr1</key>
659 + <value>0</value>
660 + </param>
661 + <param>
662 + <key>dc_offset_mode1</key>
663 + <value>0</value>
664 + </param>
665 + <param>
666 + <key>iq_balance_mode1</key>
667 + <value>0</value>
668 + </param>
669 + <param>
670 + <key>gain_mode1</key>
671 + <value>False</value>
672 + </param>
673 + <param>
674 + <key>gain1</key>
675 + <value>10</value>
676 + </param>
677 + <param>
678 + <key>if_gain1</key>
679 + <value>20</value>
680 + </param>
681 + <param>
682 + <key>bb_gain1</key>
683 + <value>20</value>
684 + </param>
685 + <param>
686 + <key>ant1</key>
687 + <value></value>
688 + </param>
689 + <param>
690 + <key>bw1</key>
691 + <value>0</value>
692 + </param>
693 + <param>
694 + <key>freq2</key>
695 + <value>100e6</value>
696 + </param>
697 + <param>
698 + <key>corr2</key>
699 + <value>0</value>
700 + </param>
701 + <param>
702 + <key>dc_offset_mode2</key>
703 + <value>0</value>
704 + </param>
705 + <param>
706 + <key>iq_balance_mode2</key>
707 + <value>0</value>
708 + </param>
709 + <param>
710 + <key>gain_mode2</key>
711 + <value>False</value>
712 + </param>
713 + <param>
714 + <key>gain2</key>
715 + <value>10</value>
716 + </param>
717 + <param>
718 + <key>if_gain2</key>
719 + <value>20</value>
720 + </param>
721 + <param>
722 + <key>bb_gain2</key>
723 + <value>20</value>
724 + </param>
725 + <param>
726 + <key>ant2</key>
727 + <value></value>
728 + </param>
729 + <param>
730 + <key>bw2</key>
731 + <value>0</value>
732 + </param>
733 + <param>
734 + <key>freq3</key>
735 + <value>100e6</value>
736 + </param>
737 + <param>
738 + <key>corr3</key>
739 + <value>0</value>
740 + </param>
741 + <param>
742 + <key>dc_offset_mode3</key>
743 + <value>0</value>
744 + </param>
745 + <param>
746 + <key>iq_balance_mode3</key>
747 + <value>0</value>
748 + </param>
749 + <param>
750 + <key>gain_mode3</key>
751 + <value>False</value>
752 + </param>
753 + <param>
754 + <key>gain3</key>
755 + <value>10</value>
756 + </param>
757 + <param>
758 + <key>if_gain3</key>
759 + <value>20</value>
760 + </param>
761 + <param>
762 + <key>bb_gain3</key>
763 + <value>20</value>
764 + </param>
765 + <param>
766 + <key>ant3</key>
767 + <value></value>
768 + </param>
769 + <param>
770 + <key>bw3</key>
771 + <value>0</value>
772 + </param>
773 + <param>
774 + <key>freq4</key>
775 + <value>100e6</value>
776 + </param>
777 + <param>
778 + <key>corr4</key>
779 + <value>0</value>
780 + </param>
781 + <param>
782 + <key>dc_offset_mode4</key>
783 + <value>0</value>
784 + </param>
785 + <param>
786 + <key>iq_balance_mode4</key>
787 + <value>0</value>
788 + </param>
789 + <param>
790 + <key>gain_mode4</key>
791 + <value>False</value>
792 + </param>
793 + <param>
794 + <key>gain4</key>
795 + <value>10</value>
796 + </param>
797 + <param>
798 + <key>if_gain4</key>
799 + <value>20</value>
800 + </param>
801 + <param>
802 + <key>bb_gain4</key>
803 + <value>20</value>
804 + </param>
805 + <param>
806 + <key>ant4</key>
807 + <value></value>
808 + </param>
809 + <param>
810 + <key>bw4</key>
811 + <value>0</value>
812 + </param>
813 + <param>
814 + <key>affinity</key>
815 + <value></value>
816 + </param>
817 + <param>
818 + <key>minoutbuf</key>
819 + <value>0</value>
820 + </param>
821 + <param>
822 + <key>maxoutbuf</key>
823 + <value>0</value>
824 + </param>
825 + <param>
826 + <key>_coordinate</key>
827 + <value>(0, 237)</value>
828 + </param>
829 + <param>
830 + <key>_rotation</key>
831 + <value>0</value>
832 + </param>
833 + </block>
834 + <block>
835 + <key>variable_slider</key>
836 + <param>
837 + <key>id</key>
838 + <value>freq</value>
839 + </param>
840 + <param>
841 + <key>_enabled</key>
842 + <value>True</value>
843 + </param>
844 + <param>
845 + <key>label</key>
846 + <value>Frequence RTN</value>
847 + </param>
848 + <param>
849 + <key>value</key>
850 + <value>98.2</value>
851 + </param>
852 + <param>
853 + <key>min</key>
854 + <value>88</value>
855 + </param>
856 + <param>
857 + <key>max</key>
858 + <value>108</value>
859 + </param>
860 + <param>
861 + <key>num_steps</key>
862 + <value>100</value>
863 + </param>
864 + <param>
865 + <key>style</key>
866 + <value>wx.SL_HORIZONTAL</value>
867 + </param>
868 + <param>
869 + <key>converver</key>
870 + <value>float_converter</value>
871 + </param>
872 + <param>
873 + <key>grid_pos</key>
874 + <value></value>
875 + </param>
876 + <param>
877 + <key>notebook</key>
878 + <value></value>
879 + </param>
880 + <param>
881 + <key>_coordinate</key>
882 + <value>(4, 460)</value>
883 + </param>
884 + <param>
885 + <key>_rotation</key>
886 + <value>0</value>
887 + </param>
888 + </block>
889 + <connection>
890 + <source_block_id>analog_wfm_rcv_0</source_block_id>
891 + <sink_block_id>rational_resampler_xxx_1</sink_block_id>
892 + <source_key>0</source_key>
893 + <sink_key>0</sink_key>
894 + </connection>
895 + <connection>
896 + <source_block_id>blocks_multiply_const_vxx_0</source_block_id>
897 + <sink_block_id>audio_sink_0</sink_block_id>
898 + <source_key>0</source_key>
899 + <sink_key>0</sink_key>
900 + </connection>
901 + <connection>
902 + <source_block_id>low_pass_filter_0</source_block_id>
903 + <sink_block_id>analog_wfm_rcv_0</sink_block_id>
904 + <source_key>0</source_key>
905 + <sink_key>0</sink_key>
906 + </connection>
907 + <connection>
908 + <source_block_id>rational_resampler_xxx_0</source_block_id>
909 + <sink_block_id>low_pass_filter_0</sink_block_id>
910 + <source_key>0</source_key>
911 + <sink_key>0</sink_key>
912 + </connection>
913 + <connection>
914 + <source_block_id>rational_resampler_xxx_1</source_block_id>
915 + <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id>
916 + <source_key>0</source_key>
917 + <sink_key>0</sink_key>
918 + </connection>
919 + <connection>
920 + <source_block_id>rtlsdr_source_0</source_block_id>
921 + <sink_block_id>rational_resampler_xxx_0</sink_block_id>
922 + <source_key>0</source_key>
923 + <sink_key>0</sink_key>
924 + </connection>
925 + <connection>
926 + <source_block_id>rtlsdr_source_0</source_block_id>
927 + <sink_block_id>wxgui_waterfallsink2_0</sink_block_id>
928 + <source_key>0</source_key>
929 + <sink_key>0</sink_key>
930 + </connection>
931 +</flow_graph>
932 +