Changes for page SDR
Last modified by Administrator on 10-03-2021, 11:01
edited by Jean-Yves Dupertuis
on 27-03-2018, 17:24
on 27-03-2018, 17:24
edited by Jean-Yves Dupertuis
on 04-04-2018, 16:19
on 04-04-2018, 16:19
Change comment:
testSDR-b new
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Attachments (0 modified, 1 added, 0 removed)
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 +