Codebase list gr-limesdr / 6786822
Add patch by Chris Gorman, NZSmartie, and Daniel Estévez to support GNUradio 3.9. (Closes: #1002121) Christoph Berg 2 years ago
3 changed file(s) with 21144 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
99 [ Christoph Berg ]
1010 * B-D on libspdlog-dev.
1111 * Disable detection of git at build time.
12 * Add patch by Chris Gorman, NZSmartie, and Daniel Estévez to support
13 GNUradio 3.9. (Closes: #1002121)
1214
1315 -- Debian Janitor <janitor@jelmer.uk> Sat, 06 Jun 2020 13:08:37 -0000
1416
0 diff --git a/.clang-format b/.clang-format
1 index b023ad2..3e4ddd4 100644
2 --- a/.clang-format
3 +++ b/.clang-format
4 @@ -6,7 +6,7 @@ AlignAfterOpenBracket: Align
5 AlignConsecutiveAssignments: false
6 AlignConsecutiveDeclarations: false
7 AlignEscapedNewlinesLeft: true
8 -AlignOperands: true
9 +AlignOperands: true
10 AlignTrailingComments: true
11 AllowAllParametersOfDeclarationOnNextLine: true
12 AllowShortBlocksOnASingleLine: false
13 @@ -22,58 +22,58 @@ BinPackArguments: false
14 BinPackParameters: false
15 BreakBeforeBraces: Custom
16 BraceWrapping:
17 - AfterClass: true
18 + AfterClass: true
19 AfterControlStatement: false
20 - AfterEnum: false
21 - AfterFunction: true
22 - AfterNamespace: false
23 + AfterEnum: false
24 + AfterFunction: true
25 + AfterNamespace: false
26 AfterObjCDeclaration: false
27 - AfterStruct: false
28 - AfterUnion: false
29 - BeforeCatch: false
30 - BeforeElse: false
31 - IndentBraces: false
32 + AfterStruct: false
33 + AfterUnion: false
34 + BeforeCatch: false
35 + BeforeElse: false
36 + IndentBraces: false
37 BreakBeforeBinaryOperators: None
38 BreakBeforeTernaryOperators: true
39 BreakConstructorInitializersBeforeComma: false
40 BreakAfterJavaFieldAnnotations: false
41 BreakStringLiterals: true
42 -ColumnLimit: 90
43 -CommentPragmas: "^ IWYU pragma:"
44 +ColumnLimit: 90
45 +CommentPragmas: '^ IWYU pragma:'
46 ConstructorInitializerAllOnOneLineOrOnePerLine: true
47 ConstructorInitializerIndentWidth: 4
48 ContinuationIndentWidth: 4
49 Cpp11BracedListStyle: false
50 DerivePointerAlignment: false
51 -DisableFormat: false
52 +DisableFormat: false
53 ExperimentalAutoDetectBinPacking: false
54 ForEachMacros:
55 - foreach
56 - Q_FOREACH
57 - BOOST_FOREACH
58 IncludeCategories:
59 - - Regex: '^"(gnuradio)/'
60 - Priority: 1
61 - - Regex: "^<(gnuradio)/"
62 - Priority: 2
63 - - Regex: "^<(boost)/"
64 - Priority: 98
65 - - Regex: "^<[a-z]*>$"
66 - Priority: 99
67 - - Regex: '^".*"$'
68 - Priority: 0
69 - - Regex: ".*"
70 - Priority: 10
71 + - Regex: '^"(gnuradio)/'
72 + Priority: 1
73 + - Regex: '^<(gnuradio)/'
74 + Priority: 2
75 + - Regex: '^<(boost)/'
76 + Priority: 98
77 + - Regex: '^<[a-z]*>$'
78 + Priority: 99
79 + - Regex: '^".*"$'
80 + Priority: 0
81 + - Regex: '.*'
82 + Priority: 10
83
84 -IncludeIsMainRegex: "(Test)?$"
85 +IncludeIsMainRegex: '(Test)?$'
86 IndentCaseLabels: false
87 IndentWidth: 4
88 IndentWrappedFunctionNames: false
89 JavaScriptQuotes: Leave
90 JavaScriptWrapImports: true
91 KeepEmptyLinesAtTheStartOfBlocks: true
92 -MacroBlockBegin: ""
93 -MacroBlockEnd: ""
94 +MacroBlockBegin: ''
95 +MacroBlockEnd: ''
96 MaxEmptyLinesToKeep: 2
97 NamespaceIndentation: None
98 ObjCBlockIndentWidth: 2
99 @@ -86,19 +86,19 @@ PenaltyBreakString: 1000
100 PenaltyExcessCharacter: 1000000
101 PenaltyReturnTypeOnItsOwnLine: 60
102 PointerAlignment: Left
103 -ReflowComments: true
104 -SortIncludes: true
105 +ReflowComments: true
106 +SortIncludes: true
107 SpaceAfterCStyleCast: false
108 SpaceAfterTemplateKeyword: true
109 SpaceBeforeAssignmentOperators: true
110 SpaceBeforeParens: ControlStatements
111 SpaceInEmptyParentheses: false
112 SpacesBeforeTrailingComments: 1
113 -SpacesInAngles: false
114 +SpacesInAngles: false
115 SpacesInContainerLiterals: true
116 SpacesInCStyleCastParentheses: false
117 SpacesInParentheses: false
118 SpacesInSquareBrackets: false
119 -Standard: Cpp11
120 -TabWidth: 8
121 -UseTab: Never
122 +Standard: Cpp11
123 +TabWidth: 8
124 +UseTab: Never
125 diff --git a/.gitignore b/.gitignore
126 index 065e739..85c92e8 100644
127 --- a/.gitignore
128 +++ b/.gitignore
129 @@ -1,2 +1,5 @@
130 -build/**
131 -.vscode/**
132 +*~
133 +*.pyc
134 +*.pyo
135 +build*/
136 +examples/grc/*.py
137 diff --git a/CMakeLists.txt b/CMakeLists.txt
138 index 78290cc..1572d1e 100644
139 --- a/CMakeLists.txt
140 +++ b/CMakeLists.txt
141 @@ -1,22 +1,10 @@
142 -# Copyright 2011,2012,2014,2016,2018 Free Software Foundation, Inc.
143 +# Copyright 2011-2020 Free Software Foundation, Inc.
144 #
145 # This file was generated by gr_modtool, a tool from the GNU Radio framework
146 # This file is a part of gr-limesdr
147 #
148 -# GNU Radio is free software; you can redistribute it and/or modify
149 -# it under the terms of the GNU General Public License as published by
150 -# the Free Software Foundation; either version 3, or (at your option)
151 -# any later version.
152 +# SPDX-License-Identifier: GPL-3.0-or-later
153 #
154 -# GNU Radio is distributed in the hope that it will be useful,
155 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
156 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
157 -# GNU General Public License for more details.
158 -#
159 -# You should have received a copy of the GNU General Public License
160 -# along with GNU Radio; see the file COPYING. If not, write to
161 -# the Free Software Foundation, Inc., 51 Franklin Street,
162 -# Boston, MA 02110-1301, USA.
163
164 ########################################################################
165 # Project setup
166 @@ -42,10 +30,10 @@ set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
167 list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
168
169 # Set the version information here
170 -set(VERSION_MAJOR 3)
171 -set(VERSION_API 0)
172 -set(VERSION_ABI 1)
173 -set(VERSION_PATCH 0)
174 +set(VERSION_MAJOR 1)
175 +set(VERSION_API 0)
176 +set(VERSION_ABI 0)
177 +set(VERSION_PATCH git)
178
179 cmake_policy(SET CMP0011 NEW)
180
181 @@ -63,11 +51,11 @@ if((CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
182 endif()
183
184 IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
185 - SET(CMAKE_CXX_STANDARD 11)
186 + SET(CMAKE_CXX_STANDARD 14)
187 ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
188 - SET(CMAKE_CXX_STANDARD 11)
189 + SET(CMAKE_CXX_STANDARD 14)
190 ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
191 - SET(CMAKE_CXX_STANDARD 11)
192 + SET(CMAKE_CXX_STANDARD 14)
193 ELSE()
194 message(WARNING "C++ standard could not be set because compiler is not GNU, Clang or MSVC.")
195 ENDIF()
196 @@ -82,19 +70,12 @@ ELSE()
197 message(WARNING "C standard could not be set because compiler is not GNU, Clang or MSVC.")
198 ENDIF()
199
200 -
201 ########################################################################
202 # Install directories
203 ########################################################################
204 -set(MIN_GR_VERSION "3.8.0")
205 -set(MAX_GR_VERSION "3.9.0")
206 -find_package(Gnuradio REQUIRED)
207 +include(FindPkgConfig)
208 +find_package(Gnuradio "3.9" REQUIRED)
209 include(GrVersion)
210 -if("${Gnuradio_VERSION}" VERSION_LESS MIN_GR_VERSION OR "${Gnuradio_VERSION}"
211 - VERSION_GREATER_EQUAL MAX_GR_VERSION)
212 - MESSAGE(FATAL_ERROR "GnuRadio version required: >=\"" ${MIN_GR_VERSION} "\" \
213 - < \"${MAX_GR_VERSION}\" found: \"" ${Gnuradio_VERSION} "\"")
214 -endif()
215
216 include(GrPlatform) #define LIB_SUFFIX
217
218 @@ -109,14 +90,6 @@ set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME})
219 set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d)
220 set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME})
221
222 -########################################################################
223 -# LimeSuite
224 -########################################################################
225 -
226 -find_package(LimeSuite REQUIRED)
227 -message(STATUS "LimeSuite version ${LimeSuite_VERSION} found.")
228 -include_directories("${LIMESUITE_INCLUDE_DIR}/lime")
229 -
230 ########################################################################
231 # On Apple only, set install name and use rpath correctly, if not already set
232 ########################################################################
233 @@ -142,6 +115,53 @@ endif(APPLE)
234 ########################################################################
235 find_package(Doxygen)
236
237 +########################################################################
238 +# PyBind11 Related
239 +########################################################################
240 +
241 +find_package(pybind11 REQUIRED)
242 +execute_process(
243 + COMMAND "${PYTHON_EXECUTABLE}" -c
244 + "try:\n import numpy\n import os\n inc_path = numpy.get_include()\n if os.path.exists(os.path.join(inc_path, 'numpy', 'arrayobject.h')):\n print(inc_path, end='')\nexcept:\n pass"
245 + OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIR)
246 +# format path in CMake-style for consistency with other path variables
247 +# (a consistent style helps conda builds by using the same path separators)
248 +file(TO_CMAKE_PATH "${PYTHON_NUMPY_INCLUDE_DIR}" PYTHON_NUMPY_INCLUDE_DIR)
249 +
250 +########################################################################
251 +# Find LimeSuite
252 +########################################################################
253 +MESSAGE(STATUS "Configuring LimeSuite C++ Libraries...")
254 +INCLUDE(FindPkgConfig)
255 +PKG_CHECK_MODULES(PC_LIMESUITE LimeSuite)
256 +find_path(LIMESUITE_INCLUDE_DIRS
257 + NAMES LimeSuite.h
258 + HINTS ${PC_LIMESUITE_INCLUDEDIR}/lime
259 + PATHS ${LIMESUITE_PKG_INCLUDE_DIRS}
260 + /usr/include/lime
261 + /usr/local/include/lime
262 +)
263 +find_library(LIMESUITE_LIB
264 + NAMES LimeSuite limesuite
265 + HINTS ${PC_LIMESUITE_LIBDIR}
266 + PATHS ${LIMESDR_PKG_LIBRARY_DIRS}
267 + /usr/lib
268 + /usr/local/lib
269 +)
270 +
271 +message(STATUS "Found LimeSuite: ${LIMESUITE_INCLUDE_DIRS}, ${LIMESUITE_LIB}")
272 +
273 +########################################################################
274 +# LimeRFE
275 +########################################################################
276 +include(FeatureSummary)
277 +include(CMakeDependentOption)
278 +option(ENABLE_RFE "Enable LimeRFE support" OFF)
279 +add_feature_info(LimeRFE ENABLE_LIBRARY "LimeRFE support")
280 +if(ENABLE_RFE)
281 + message(STATUS "Enabling LimeRFE support")
282 +endif()
283 +
284 ########################################################################
285 # Setup doxygen option
286 ########################################################################
287 @@ -163,7 +183,6 @@ add_custom_target(uninstall
288 ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
289 )
290
291 -
292 ########################################################################
293 # Add subdirectories
294 ########################################################################
295 @@ -171,9 +190,14 @@ add_subdirectory(include/limesdr)
296 add_subdirectory(lib)
297 add_subdirectory(apps)
298 add_subdirectory(docs)
299 -add_subdirectory(swig)
300 -add_subdirectory(python)
301 -add_subdirectory(grc)
302 +# NOTE: manually update below to use GRC to generate C++ flowgraphs w/o python
303 +if(ENABLE_PYTHON)
304 + message(STATUS "PYTHON and GRC components are enabled")
305 + add_subdirectory(python)
306 + add_subdirectory(grc)
307 +else(ENABLE_PYTHON)
308 + message(STATUS "PYTHON and GRC components are disabled")
309 +endif(ENABLE_PYTHON)
310
311 ########################################################################
312 # Install cmake search helper for this library
313 diff --git a/LICENSE b/LICENSE
314 index 6ea713f..42ac245 100755
315 --- a/LICENSE
316 +++ b/LICENSE
317 @@ -1,4 +1,4 @@
318 -Copyright 2019 Lime Microsystems info@limemicro.com
319 +Copyright 2018 Lime Microsystems info@limemicro.com
320
321 This program is free software: you can redistribute it and/or modify
322 it under the terms of the GNU General Public License as published by
323 @@ -11,4 +11,4 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
324 GNU General Public License for more details.
325
326 You should have received a copy of the GNU General Public License
327 -along with this program. If not, see <https://www.gnu.org/licenses/>.
328 +along with this program. If not, see <https://www.gnu.org/licenses/>.
329 \ No newline at end of file
330 diff --git a/MANIFEST.md b/MANIFEST.md
331 old mode 100755
332 new mode 100644
333 index d189447..303d9c5
334 --- a/MANIFEST.md
335 +++ b/MANIFEST.md
336 @@ -1,13 +1,17 @@
337 title: The LIMESDR OOT Module
338 -brief: gr-limesdr blocks are used to control LimeSDR family devices
339 -tags: #sink, #source, #settings
340 +brief: Short description of gr-limesdr
341 +tags: # Tags are arbitrary, but look at CGRAN what other authors are using
342 - sdr
343 author:
344 - - Lime Microsystems <info@limemicro.com>
345 + - Author Name <authors@email.address>
346 copyright_owner:
347 - - Lime Microsystems
348 + - Copyright Owner 1
349 license:
350 -#repo:
351 -#website:
352 -#icon:
353 +gr_supported_version: # Put a comma separated list of supported GR versions here
354 +#repo: # Put the URL of the repository here, or leave blank for default
355 +#website: <module_website> # If you have a separate project website, put it here
356 +#icon: <icon_url> # Put a URL to a square image here that will be used as an icon on CGRAN
357 ---
358 +A longer, multi-line description of gr-limesdr.
359 +You may use some *basic* Markdown here.
360 +If left empty, it will try to find a README file instead.
361 diff --git a/README.md b/README.md
362 index 075af86..0e7142b 100755
363 --- a/README.md
364 +++ b/README.md
365 @@ -8,21 +8,19 @@ Package includes GNU Radio blocks for various LimeSDR boards.
366
367 ## Dependencies
368
369 -* GNU Radio (>=3.8)
370 +* GNU Radio(3.9)
371 * BOOST
372 -* SWIG
373 +* pybind11
374 * LimeSuite
375
376 ## Installation process
377
378 -* Installing GNURadio
379 -To install GNURadio3.8 please follow this guide [Installing GNURadio](https://wiki.gnuradio.org/index.php/InstallingGR)
380 +#### Linux
381
382 * Building from source
383 <pre>
384 -git clone https://github.com/myriadrf/gr-limesdr.git
385 +git clone https://github.com/chrisjohgorman/gr-limesdr.git
386 cd gr-limesdr
387 -git checkout gr-3.8
388 mkdir build
389 cd build
390 cmake ..
391 @@ -31,6 +29,11 @@ sudo make install
392 sudo ldconfig
393 </pre>
394
395 +## Known issues
396 +
397 +Known issues are located in:
398 +gr-limesdr/docs/known_issues.txt
399 +
400 ## GNU Radio-Companion examples
401
402 GNU Radio-Companion examples are located in:
403 diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
404 index 6005bc1..7dbba51 100644
405 --- a/apps/CMakeLists.txt
406 +++ b/apps/CMakeLists.txt
407 @@ -3,20 +3,8 @@
408 # This file was generated by gr_modtool, a tool from the GNU Radio framework
409 # This file is a part of gr-limesdr
410 #
411 -# GNU Radio is free software; you can redistribute it and/or modify
412 -# it under the terms of the GNU General Public License as published by
413 -# the Free Software Foundation; either version 3, or (at your option)
414 -# any later version.
415 +# SPDX-License-Identifier: GPL-3.0-or-later
416 #
417 -# GNU Radio is distributed in the hope that it will be useful,
418 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
419 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
420 -# GNU General Public License for more details.
421 -#
422 -# You should have received a copy of the GNU General Public License
423 -# along with GNU Radio; see the file COPYING. If not, write to
424 -# the Free Software Foundation, Inc., 51 Franklin Street,
425 -# Boston, MA 02110-1301, USA.
426
427 include(GrPython)
428
429 diff --git a/cmake/Modules/FindCppUnit.cmake b/cmake/Modules/FindCppUnit.cmake
430 new file mode 100755
431 index 0000000..f93ade3
432 --- /dev/null
433 +++ b/cmake/Modules/FindCppUnit.cmake
434 @@ -0,0 +1,39 @@
435 +# http://www.cmake.org/pipermail/cmake/2006-October/011446.html
436 +# Modified to use pkg config and use standard var names
437 +
438 +#
439 +# Find the CppUnit includes and library
440 +#
441 +# This module defines
442 +# CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc.
443 +# CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit.
444 +# CPPUNIT_FOUND, If false, do not try to use CppUnit.
445 +
446 +INCLUDE(FindPkgConfig)
447 +PKG_CHECK_MODULES(PC_CPPUNIT "cppunit")
448 +
449 +FIND_PATH(CPPUNIT_INCLUDE_DIRS
450 + NAMES cppunit/TestCase.h
451 + HINTS ${PC_CPPUNIT_INCLUDE_DIR}
452 + ${CMAKE_INSTALL_PREFIX}/include
453 + PATHS
454 + /usr/local/include
455 + /usr/include
456 +)
457 +
458 +FIND_LIBRARY(CPPUNIT_LIBRARIES
459 + NAMES cppunit
460 + HINTS ${PC_CPPUNIT_LIBDIR}
461 + ${CMAKE_INSTALL_PREFIX}/lib
462 + ${CMAKE_INSTALL_PREFIX}/lib64
463 + PATHS
464 + ${CPPUNIT_INCLUDE_DIRS}/../lib
465 + /usr/local/lib
466 + /usr/lib
467 +)
468 +
469 +LIST(APPEND CPPUNIT_LIBRARIES ${CMAKE_DL_LIBS})
470 +
471 +INCLUDE(FindPackageHandleStandardArgs)
472 +FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPPUNIT DEFAULT_MSG CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
473 +MARK_AS_ADVANCED(CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
474 diff --git a/cmake/Modules/FindGnuradioRuntime.cmake b/cmake/Modules/FindGnuradioRuntime.cmake
475 new file mode 100755
476 index 0000000..afed684
477 --- /dev/null
478 +++ b/cmake/Modules/FindGnuradioRuntime.cmake
479 @@ -0,0 +1,36 @@
480 +INCLUDE(FindPkgConfig)
481 +PKG_CHECK_MODULES(PC_GNURADIO_RUNTIME gnuradio-runtime)
482 +
483 +if(PC_GNURADIO_RUNTIME_FOUND)
484 + # look for include files
485 + FIND_PATH(
486 + GNURADIO_RUNTIME_INCLUDE_DIRS
487 + NAMES gnuradio/top_block.h
488 + HINTS $ENV{GNURADIO_RUNTIME_DIR}/include
489 + ${PC_GNURADIO_RUNTIME_INCLUDE_DIRS}
490 + ${CMAKE_INSTALL_PREFIX}/include
491 + PATHS /usr/local/include
492 + /usr/include
493 + )
494 +
495 + # look for libs
496 + FIND_LIBRARY(
497 + GNURADIO_RUNTIME_LIBRARIES
498 + NAMES gnuradio-runtime
499 + HINTS $ENV{GNURADIO_RUNTIME_DIR}/lib
500 + ${PC_GNURADIO_RUNTIME_LIBDIR}
501 + ${CMAKE_INSTALL_PREFIX}/lib/
502 + ${CMAKE_INSTALL_PREFIX}/lib64/
503 + PATHS /usr/local/lib
504 + /usr/local/lib64
505 + /usr/lib
506 + /usr/lib64
507 + )
508 +
509 + set(GNURADIO_RUNTIME_FOUND ${PC_GNURADIO_RUNTIME_FOUND})
510 +endif(PC_GNURADIO_RUNTIME_FOUND)
511 +
512 +INCLUDE(FindPackageHandleStandardArgs)
513 +# do not check GNURADIO_RUNTIME_INCLUDE_DIRS, is not set when default include path us used.
514 +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_RUNTIME DEFAULT_MSG GNURADIO_RUNTIME_LIBRARIES)
515 +MARK_AS_ADVANCED(GNURADIO_RUNTIME_LIBRARIES GNURADIO_RUNTIME_INCLUDE_DIRS)
516 diff --git a/cmake/Modules/GrMiscUtils.cmake b/cmake/Modules/GrMiscUtils.cmake
517 new file mode 100755
518 index 0000000..188c404
519 --- /dev/null
520 +++ b/cmake/Modules/GrMiscUtils.cmake
521 @@ -0,0 +1,525 @@
522 +# Copyright 2010-2011,2014 Free Software Foundation, Inc.
523 +#
524 +# This file is part of GNU Radio
525 +#
526 +# GNU Radio is free software; you can redistribute it and/or modify
527 +# it under the terms of the GNU General Public License as published by
528 +# the Free Software Foundation; either version 3, or (at your option)
529 +# any later version.
530 +#
531 +# GNU Radio is distributed in the hope that it will be useful,
532 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
533 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
534 +# GNU General Public License for more details.
535 +#
536 +# You should have received a copy of the GNU General Public License
537 +# along with GNU Radio; see the file COPYING. If not, write to
538 +# the Free Software Foundation, Inc., 51 Franklin Street,
539 +# Boston, MA 02110-1301, USA.
540 +
541 +if(DEFINED __INCLUDED_GR_MISC_UTILS_CMAKE)
542 + return()
543 +endif()
544 +set(__INCLUDED_GR_MISC_UTILS_CMAKE TRUE)
545 +
546 +########################################################################
547 +# Set global variable macro.
548 +# Used for subdirectories to export settings.
549 +# Example: include and library paths.
550 +########################################################################
551 +function(GR_SET_GLOBAL var)
552 + set(${var} ${ARGN} CACHE INTERNAL "" FORCE)
553 +endfunction(GR_SET_GLOBAL)
554 +
555 +########################################################################
556 +# Set the pre-processor definition if the condition is true.
557 +# - def the pre-processor definition to set and condition name
558 +########################################################################
559 +function(GR_ADD_COND_DEF def)
560 + if(${def})
561 + add_definitions(-D${def})
562 + endif(${def})
563 +endfunction(GR_ADD_COND_DEF)
564 +
565 +########################################################################
566 +# Check for a header and conditionally set a compile define.
567 +# - hdr the relative path to the header file
568 +# - def the pre-processor definition to set
569 +########################################################################
570 +function(GR_CHECK_HDR_N_DEF hdr def)
571 + include(CheckIncludeFileCXX)
572 + CHECK_INCLUDE_FILE_CXX(${hdr} ${def})
573 + GR_ADD_COND_DEF(${def})
574 +endfunction(GR_CHECK_HDR_N_DEF)
575 +
576 +########################################################################
577 +# Include subdirectory macro.
578 +# Sets the CMake directory variables,
579 +# includes the subdirectory CMakeLists.txt,
580 +# resets the CMake directory variables.
581 +#
582 +# This macro includes subdirectories rather than adding them
583 +# so that the subdirectory can affect variables in the level above.
584 +# This provides a work-around for the lack of convenience libraries.
585 +# This way a subdirectory can append to the list of library sources.
586 +########################################################################
587 +macro(GR_INCLUDE_SUBDIRECTORY subdir)
588 + #insert the current directories on the front of the list
589 + list(INSERT _cmake_source_dirs 0 ${CMAKE_CURRENT_SOURCE_DIR})
590 + list(INSERT _cmake_binary_dirs 0 ${CMAKE_CURRENT_BINARY_DIR})
591 +
592 + #set the current directories to the names of the subdirs
593 + set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
594 + set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${subdir})
595 +
596 + #include the subdirectory CMakeLists to run it
597 + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
598 + include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt)
599 +
600 + #reset the value of the current directories
601 + list(GET _cmake_source_dirs 0 CMAKE_CURRENT_SOURCE_DIR)
602 + list(GET _cmake_binary_dirs 0 CMAKE_CURRENT_BINARY_DIR)
603 +
604 + #pop the subdir names of the front of the list
605 + list(REMOVE_AT _cmake_source_dirs 0)
606 + list(REMOVE_AT _cmake_binary_dirs 0)
607 +endmacro(GR_INCLUDE_SUBDIRECTORY)
608 +
609 +########################################################################
610 +# Check if a compiler flag works and conditionally set a compile define.
611 +# - flag the compiler flag to check for
612 +# - have the variable to set with result
613 +########################################################################
614 +macro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE flag have)
615 + include(CheckCXXCompilerFlag)
616 + CHECK_CXX_COMPILER_FLAG(${flag} ${have})
617 + if(${have})
618 + if(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
619 + STRING(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_dup)
620 + if(${flag_dup} EQUAL -1)
621 + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
622 + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
623 + endif(${flag_dup} EQUAL -1)
624 + endif(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
625 + endif(${have})
626 +endmacro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE)
627 +
628 +########################################################################
629 +# Generates the .la libtool file
630 +# This appears to generate libtool files that cannot be used by auto*.
631 +# Usage GR_LIBTOOL(TARGET [target] DESTINATION [dest])
632 +# Notice: there is not COMPONENT option, these will not get distributed.
633 +########################################################################
634 +function(GR_LIBTOOL)
635 + if(NOT DEFINED GENERATE_LIBTOOL)
636 + set(GENERATE_LIBTOOL OFF) #disabled by default
637 + endif()
638 +
639 + if(GENERATE_LIBTOOL)
640 + include(CMakeParseArgumentsCopy)
641 + CMAKE_PARSE_ARGUMENTS(GR_LIBTOOL "" "TARGET;DESTINATION" "" ${ARGN})
642 +
643 + find_program(LIBTOOL libtool)
644 + if(LIBTOOL)
645 + include(CMakeMacroLibtoolFile)
646 + CREATE_LIBTOOL_FILE(${GR_LIBTOOL_TARGET} /${GR_LIBTOOL_DESTINATION})
647 + endif(LIBTOOL)
648 + endif(GENERATE_LIBTOOL)
649 +
650 +endfunction(GR_LIBTOOL)
651 +
652 +########################################################################
653 +# Do standard things to the library target
654 +# - set target properties
655 +# - make install rules
656 +# Also handle gnuradio custom naming conventions w/ extras mode.
657 +########################################################################
658 +function(GR_LIBRARY_FOO target)
659 + #parse the arguments for component names
660 + include(CMakeParseArgumentsCopy)
661 + CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN})
662 +
663 + #set additional target properties
664 + set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER})
665 +
666 + #install the generated files like so...
667 + install(TARGETS ${target}
668 + LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file
669 + ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT} # .lib file
670 + RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file
671 + )
672 +
673 + #extras mode enabled automatically on linux
674 + if(NOT DEFINED LIBRARY_EXTRAS)
675 + set(LIBRARY_EXTRAS ${LINUX})
676 + endif()
677 +
678 + #special extras mode to enable alternative naming conventions
679 + if(LIBRARY_EXTRAS)
680 +
681 + #create .la file before changing props
682 + GR_LIBTOOL(TARGET ${target} DESTINATION ${GR_LIBRARY_DIR})
683 +
684 + #give the library a special name with ultra-zero soversion
685 + set_target_properties(${target} PROPERTIES OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
686 + set(target_name lib${target}-${LIBVER}.so.0.0.0)
687 +
688 + #custom command to generate symlinks
689 + add_custom_command(
690 + TARGET ${target}
691 + POST_BUILD
692 + COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
693 + COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
694 + COMMAND ${CMAKE_COMMAND} -E touch ${target_name} #so the symlinks point to something valid so cmake 2.6 will install
695 + )
696 +
697 + #and install the extra symlinks
698 + install(
699 + FILES
700 + ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
701 + ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
702 + DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT}
703 + )
704 +
705 + endif(LIBRARY_EXTRAS)
706 +endfunction(GR_LIBRARY_FOO)
707 +
708 +########################################################################
709 +# Create a dummy custom command that depends on other targets.
710 +# Usage:
711 +# GR_GEN_TARGET_DEPS(unique_name target_deps <target1> <target2> ...)
712 +# ADD_CUSTOM_COMMAND(<the usual args> ${target_deps})
713 +#
714 +# Custom command cant depend on targets, but can depend on executables,
715 +# and executables can depend on targets. So this is the process:
716 +########################################################################
717 +function(GR_GEN_TARGET_DEPS name var)
718 + file(
719 + WRITE ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
720 + "int main(void){return 0;}\n"
721 + )
722 + execute_process(
723 + COMMAND ${CMAKE_COMMAND} -E copy_if_different
724 + ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
725 + ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp
726 + )
727 + add_executable(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp)
728 + if(ARGN)
729 + add_dependencies(${name} ${ARGN})
730 + endif(ARGN)
731 +
732 + if(CMAKE_CROSSCOMPILING)
733 + set(${var} "DEPENDS;${name}" PARENT_SCOPE) #cant call command when cross
734 + else()
735 + set(${var} "DEPENDS;${name};COMMAND;${name}" PARENT_SCOPE)
736 + endif()
737 +endfunction(GR_GEN_TARGET_DEPS)
738 +
739 +########################################################################
740 +# Control use of gr_logger
741 +# Usage:
742 +# GR_LOGGING()
743 +#
744 +# Will set ENABLE_GR_LOG to 1 by default.
745 +# Can manually set with -DENABLE_GR_LOG=0|1
746 +########################################################################
747 +function(GR_LOGGING)
748 + find_package(Log4cpp)
749 +
750 + OPTION(ENABLE_GR_LOG "Use gr_logger" ON)
751 + if(ENABLE_GR_LOG)
752 + # If gr_logger is enabled, make it usable
753 + add_definitions( -DENABLE_GR_LOG )
754 +
755 + # also test LOG4CPP; if we have it, use this version of the logger
756 + # otherwise, default to the stdout/stderr model.
757 + if(LOG4CPP_FOUND)
758 + SET(HAVE_LOG4CPP True CACHE INTERNAL "" FORCE)
759 + add_definitions( -DHAVE_LOG4CPP )
760 + else(not LOG4CPP_FOUND)
761 + SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
762 + SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
763 + SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
764 + SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
765 + endif(LOG4CPP_FOUND)
766 +
767 + SET(ENABLE_GR_LOG ${ENABLE_GR_LOG} CACHE INTERNAL "" FORCE)
768 +
769 + else(ENABLE_GR_LOG)
770 + SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
771 + SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
772 + SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
773 + SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
774 + endif(ENABLE_GR_LOG)
775 +
776 + message(STATUS "ENABLE_GR_LOG set to ${ENABLE_GR_LOG}.")
777 + message(STATUS "HAVE_LOG4CPP set to ${HAVE_LOG4CPP}.")
778 + message(STATUS "LOG4CPP_LIBRARIES set to ${LOG4CPP_LIBRARIES}.")
779 +
780 +endfunction(GR_LOGGING)
781 +
782 +########################################################################
783 +# Run GRCC to compile .grc files into .py files.
784 +#
785 +# Usage: GRCC(filename, directory)
786 +# - filenames: List of file name of .grc file
787 +# - directory: directory of built .py file - usually in
788 +# ${CMAKE_CURRENT_BINARY_DIR}
789 +# - Sets PYFILES: output converted GRC file names to Python files.
790 +########################################################################
791 +function(GRCC)
792 + # Extract directory from list of args, remove it for the list of filenames.
793 + list(GET ARGV -1 directory)
794 + list(REMOVE_AT ARGV -1)
795 + set(filenames ${ARGV})
796 + file(MAKE_DIRECTORY ${directory})
797 +
798 + SET(GRCC_COMMAND ${CMAKE_SOURCE_DIR}/gr-utils/python/grcc)
799 +
800 + # GRCC uses some stuff in grc and gnuradio-runtime, so we force
801 + # the known paths here
802 + list(APPEND PYTHONPATHS
803 + ${CMAKE_SOURCE_DIR}
804 + ${CMAKE_SOURCE_DIR}/gnuradio-runtime/python
805 + ${CMAKE_SOURCE_DIR}/gnuradio-runtime/lib/swig
806 + ${CMAKE_BINARY_DIR}/gnuradio-runtime/lib/swig
807 + )
808 +
809 + if(WIN32)
810 + #SWIG generates the python library files into a subdirectory.
811 + #Therefore, we must append this subdirectory into PYTHONPATH.
812 + #Only do this for the python directories matching the following:
813 + foreach(pydir ${PYTHONPATHS})
814 + get_filename_component(name ${pydir} NAME)
815 + if(name MATCHES "^(swig|lib|src)$")
816 + list(APPEND PYTHONPATHS ${pydir}/${CMAKE_BUILD_TYPE})
817 + endif()
818 + endforeach(pydir)
819 + endif(WIN32)
820 +
821 + file(TO_NATIVE_PATH "${PYTHONPATHS}" pypath)
822 +
823 + if(UNIX)
824 + list(APPEND pypath "$PYTHONPATH")
825 + string(REPLACE ";" ":" pypath "${pypath}")
826 + set(ENV{PYTHONPATH} ${pypath})
827 + endif(UNIX)
828 +
829 + if(WIN32)
830 + list(APPEND pypath "%PYTHONPATH%")
831 + string(REPLACE ";" "\\;" pypath "${pypath}")
832 + #list(APPEND environs "PYTHONPATH=${pypath}")
833 + set(ENV{PYTHONPATH} ${pypath})
834 + endif(WIN32)
835 +
836 + foreach(f ${filenames})
837 + execute_process(
838 + COMMAND ${GRCC_COMMAND} -d ${directory} ${f}
839 + )
840 + string(REPLACE ".grc" ".py" pyfile "${f}")
841 + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" pyfile "${pyfile}")
842 + list(APPEND pyfiles ${pyfile})
843 + endforeach(f)
844 +
845 + set(PYFILES ${pyfiles} PARENT_SCOPE)
846 +endfunction(GRCC)
847 +
848 +########################################################################
849 +# Check if HAVE_PTHREAD_SETSCHEDPARAM and HAVE_SCHED_SETSCHEDULER
850 +# should be defined
851 +########################################################################
852 +macro(GR_CHECK_LINUX_SCHED_AVAIL)
853 +set(CMAKE_REQUIRED_LIBRARIES -lpthread)
854 + CHECK_CXX_SOURCE_COMPILES("
855 + #include <pthread.h>
856 + int main(){
857 + pthread_t pthread;
858 + pthread_setschedparam(pthread, 0, 0);
859 + return 0;
860 + } " HAVE_PTHREAD_SETSCHEDPARAM
861 + )
862 + GR_ADD_COND_DEF(HAVE_PTHREAD_SETSCHEDPARAM)
863 +
864 + CHECK_CXX_SOURCE_COMPILES("
865 + #include <sched.h>
866 + int main(){
867 + pid_t pid;
868 + sched_setscheduler(pid, 0, 0);
869 + return 0;
870 + } " HAVE_SCHED_SETSCHEDULER
871 + )
872 + GR_ADD_COND_DEF(HAVE_SCHED_SETSCHEDULER)
873 +endmacro(GR_CHECK_LINUX_SCHED_AVAIL)
874 +
875 +########################################################################
876 +# Macros to generate source and header files from template
877 +########################################################################
878 +macro(GR_EXPAND_X_H component root)
879 +
880 + include(GrPython)
881 +
882 + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
883 +"#!${PYTHON_EXECUTABLE}
884 +
885 +import sys, os, re
886 +sys.path.append('${GR_RUNTIME_PYTHONPATH}')
887 +os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
888 +os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
889 +
890 +if __name__ == '__main__':
891 + import build_utils
892 + root, inp = sys.argv[1:3]
893 + for sig in sys.argv[3:]:
894 + name = re.sub ('X+', sig, root)
895 + d = build_utils.standard_dict2(name, sig, '${component}')
896 + build_utils.expand_template(d, inp)
897 +")
898 +
899 + #make a list of all the generated headers
900 + unset(expanded_files_h)
901 + foreach(sig ${ARGN})
902 + string(REGEX REPLACE "X+" ${sig} name ${root})
903 + list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
904 + endforeach(sig)
905 + unset(name)
906 +
907 + #create a command to generate the headers
908 + add_custom_command(
909 + OUTPUT ${expanded_files_h}
910 + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
911 + COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
912 + ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
913 + ${root} ${root}.h.t ${ARGN}
914 + )
915 +
916 + #install rules for the generated headers
917 + list(APPEND generated_includes ${expanded_files_h})
918 +
919 +endmacro(GR_EXPAND_X_H)
920 +
921 +macro(GR_EXPAND_X_CC_H component root)
922 +
923 + include(GrPython)
924 +
925 + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
926 +"#!${PYTHON_EXECUTABLE}
927 +
928 +import sys, os, re
929 +sys.path.append('${GR_RUNTIME_PYTHONPATH}')
930 +os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
931 +os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
932 +
933 +if __name__ == '__main__':
934 + import build_utils
935 + root, inp = sys.argv[1:3]
936 + for sig in sys.argv[3:]:
937 + name = re.sub ('X+', sig, root)
938 + d = build_utils.standard_impl_dict2(name, sig, '${component}')
939 + build_utils.expand_template(d, inp)
940 +")
941 +
942 + #make a list of all the generated files
943 + unset(expanded_files_cc)
944 + unset(expanded_files_h)
945 + foreach(sig ${ARGN})
946 + string(REGEX REPLACE "X+" ${sig} name ${root})
947 + list(APPEND expanded_files_cc ${CMAKE_CURRENT_BINARY_DIR}/${name}.cc)
948 + list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
949 + endforeach(sig)
950 + unset(name)
951 +
952 + #create a command to generate the source files
953 + add_custom_command(
954 + OUTPUT ${expanded_files_cc}
955 + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.cc.t
956 + COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
957 + ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
958 + ${root} ${root}.cc.t ${ARGN}
959 + )
960 +
961 + #create a command to generate the header files
962 + add_custom_command(
963 + OUTPUT ${expanded_files_h}
964 + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
965 + COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
966 + ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
967 + ${root} ${root}.h.t ${ARGN}
968 + )
969 +
970 + #make source files depends on headers to force generation
971 + set_source_files_properties(${expanded_files_cc}
972 + PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
973 + )
974 +
975 + #install rules for the generated files
976 + list(APPEND generated_sources ${expanded_files_cc})
977 + list(APPEND generated_headers ${expanded_files_h})
978 +
979 +endmacro(GR_EXPAND_X_CC_H)
980 +
981 +macro(GR_EXPAND_X_CC_H_IMPL component root)
982 +
983 + include(GrPython)
984 +
985 + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
986 +"#!${PYTHON_EXECUTABLE}
987 +
988 +import sys, os, re
989 +sys.path.append('${GR_RUNTIME_PYTHONPATH}')
990 +os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
991 +os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
992 +
993 +if __name__ == '__main__':
994 + import build_utils
995 + root, inp = sys.argv[1:3]
996 + for sig in sys.argv[3:]:
997 + name = re.sub ('X+', sig, root)
998 + d = build_utils.standard_dict(name, sig, '${component}')
999 + build_utils.expand_template(d, inp, '_impl')
1000 +")
1001 +
1002 + #make a list of all the generated files
1003 + unset(expanded_files_cc_impl)
1004 + unset(expanded_files_h_impl)
1005 + unset(expanded_files_h)
1006 + foreach(sig ${ARGN})
1007 + string(REGEX REPLACE "X+" ${sig} name ${root})
1008 + list(APPEND expanded_files_cc_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.cc)
1009 + list(APPEND expanded_files_h_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.h)
1010 + list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/../include/gnuradio/${component}/${name}.h)
1011 + endforeach(sig)
1012 + unset(name)
1013 +
1014 + #create a command to generate the _impl.cc files
1015 + add_custom_command(
1016 + OUTPUT ${expanded_files_cc_impl}
1017 + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.cc.t
1018 + COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
1019 + ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
1020 + ${root} ${root}_impl.cc.t ${ARGN}
1021 + )
1022 +
1023 + #create a command to generate the _impl.h files
1024 + add_custom_command(
1025 + OUTPUT ${expanded_files_h_impl}
1026 + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.h.t
1027 + COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
1028 + ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
1029 + ${root} ${root}_impl.h.t ${ARGN}
1030 + )
1031 +
1032 + #make _impl.cc source files depend on _impl.h to force generation
1033 + set_source_files_properties(${expanded_files_cc_impl}
1034 + PROPERTIES OBJECT_DEPENDS "${expanded_files_h_impl}"
1035 + )
1036 +
1037 + #make _impl.h source files depend on headers to force generation
1038 + set_source_files_properties(${expanded_files_h_impl}
1039 + PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
1040 + )
1041 +
1042 + #install rules for the generated files
1043 + list(APPEND generated_sources ${expanded_files_cc_impl})
1044 + list(APPEND generated_headers ${expanded_files_h_impl})
1045 +
1046 +endmacro(GR_EXPAND_X_CC_H_IMPL)
1047 diff --git a/cmake/Modules/GrPlatform.cmake b/cmake/Modules/GrPlatform.cmake
1048 new file mode 100755
1049 index 0000000..fbbea5f
1050 --- /dev/null
1051 +++ b/cmake/Modules/GrPlatform.cmake
1052 @@ -0,0 +1,54 @@
1053 +# Copyright 2011 Free Software Foundation, Inc.
1054 +#
1055 +# This file is part of GNU Radio
1056 +#
1057 +# GNU Radio is free software; you can redistribute it and/or modify
1058 +# it under the terms of the GNU General Public License as published by
1059 +# the Free Software Foundation; either version 3, or (at your option)
1060 +# any later version.
1061 +#
1062 +# GNU Radio is distributed in the hope that it will be useful,
1063 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
1064 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1065 +# GNU General Public License for more details.
1066 +#
1067 +# You should have received a copy of the GNU General Public License
1068 +# along with GNU Radio; see the file COPYING. If not, write to
1069 +# the Free Software Foundation, Inc., 51 Franklin Street,
1070 +# Boston, MA 02110-1301, USA.
1071 +
1072 +if(DEFINED __INCLUDED_GR_PLATFORM_CMAKE)
1073 + return()
1074 +endif()
1075 +set(__INCLUDED_GR_PLATFORM_CMAKE TRUE)
1076 +
1077 +########################################################################
1078 +# Setup additional defines for OS types
1079 +########################################################################
1080 +if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
1081 + set(LINUX TRUE)
1082 +endif()
1083 +
1084 +if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/debian_version")
1085 + set(DEBIAN TRUE)
1086 +endif()
1087 +
1088 +if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/redhat-release")
1089 + set(REDHAT TRUE)
1090 +endif()
1091 +
1092 +if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/slackware-version")
1093 + set(SLACKWARE TRUE)
1094 +endif()
1095 +
1096 +########################################################################
1097 +# when the library suffix should be 64 (applies to redhat linux family)
1098 +########################################################################
1099 +if (REDHAT OR SLACKWARE)
1100 + set(LIB64_CONVENTION TRUE)
1101 +endif()
1102 +
1103 +if(NOT DEFINED LIB_SUFFIX AND LIB64_CONVENTION AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$")
1104 + set(LIB_SUFFIX 64)
1105 +endif()
1106 +set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
1107 diff --git a/cmake/Modules/GrPython.cmake b/cmake/Modules/GrPython.cmake
1108 new file mode 100755
1109 index 0000000..06e061e
1110 --- /dev/null
1111 +++ b/cmake/Modules/GrPython.cmake
1112 @@ -0,0 +1,241 @@
1113 +# Copyright 2010-2011 Free Software Foundation, Inc.
1114 +#
1115 +# This file is part of GNU Radio
1116 +#
1117 +# GNU Radio is free software; you can redistribute it and/or modify
1118 +# it under the terms of the GNU General Public License as published by
1119 +# the Free Software Foundation; either version 3, or (at your option)
1120 +# any later version.
1121 +#
1122 +# GNU Radio is distributed in the hope that it will be useful,
1123 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
1124 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1125 +# GNU General Public License for more details.
1126 +#
1127 +# You should have received a copy of the GNU General Public License
1128 +# along with GNU Radio; see the file COPYING. If not, write to
1129 +# the Free Software Foundation, Inc., 51 Franklin Street,
1130 +# Boston, MA 02110-1301, USA.
1131 +
1132 +if(DEFINED __INCLUDED_GR_PYTHON_CMAKE)
1133 + return()
1134 +endif()
1135 +set(__INCLUDED_GR_PYTHON_CMAKE TRUE)
1136 +
1137 +########################################################################
1138 +# Setup the python interpreter:
1139 +# This allows the user to specify a specific interpreter,
1140 +# or finds the interpreter via the built-in cmake module.
1141 +########################################################################
1142 +#this allows the user to override PYTHON_EXECUTABLE
1143 +if(PYTHON_EXECUTABLE)
1144 +
1145 + set(PYTHONINTERP_FOUND TRUE)
1146 +
1147 +#otherwise if not set, try to automatically find it
1148 +else(PYTHON_EXECUTABLE)
1149 +
1150 + #use the built-in find script
1151 + find_package(PythonInterp 2)
1152 +
1153 + #and if that fails use the find program routine
1154 + if(NOT PYTHONINTERP_FOUND)
1155 + find_program(PYTHON_EXECUTABLE NAMES python python2 python2.7 python2.6 python2.5)
1156 + if(PYTHON_EXECUTABLE)
1157 + set(PYTHONINTERP_FOUND TRUE)
1158 + endif(PYTHON_EXECUTABLE)
1159 + endif(NOT PYTHONINTERP_FOUND)
1160 +
1161 +endif(PYTHON_EXECUTABLE)
1162 +
1163 +if (CMAKE_CROSSCOMPILING)
1164 + set(QA_PYTHON_EXECUTABLE "/usr/bin/python")
1165 +else (CMAKE_CROSSCOMPILING)
1166 + set(QA_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
1167 +endif(CMAKE_CROSSCOMPILING)
1168 +
1169 +#make the path to the executable appear in the cmake gui
1170 +set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
1171 +set(QA_PYTHON_EXECUTABLE ${QA_PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter for QA tests")
1172 +
1173 +#make sure we can use -B with python (introduced in 2.6)
1174 +if(PYTHON_EXECUTABLE)
1175 + execute_process(
1176 + COMMAND ${PYTHON_EXECUTABLE} -B -c ""
1177 + OUTPUT_QUIET ERROR_QUIET
1178 + RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
1179 + )
1180 + if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
1181 + set(PYTHON_DASH_B "-B")
1182 + endif()
1183 +endif(PYTHON_EXECUTABLE)
1184 +
1185 +########################################################################
1186 +# Check for the existence of a python module:
1187 +# - desc a string description of the check
1188 +# - mod the name of the module to import
1189 +# - cmd an additional command to run
1190 +# - have the result variable to set
1191 +########################################################################
1192 +macro(GR_PYTHON_CHECK_MODULE desc mod cmd have)
1193 + message(STATUS "")
1194 + message(STATUS "Python checking for ${desc}")
1195 + execute_process(
1196 + COMMAND ${PYTHON_EXECUTABLE} -c "
1197 +#########################################
1198 +try:
1199 + import ${mod}
1200 + assert ${cmd}
1201 +except ImportError, AssertionError: exit(-1)
1202 +except: pass
1203 +#########################################"
1204 + RESULT_VARIABLE ${have}
1205 + )
1206 + if(${have} EQUAL 0)
1207 + message(STATUS "Python checking for ${desc} - found")
1208 + set(${have} TRUE)
1209 + else(${have} EQUAL 0)
1210 + message(STATUS "Python checking for ${desc} - not found")
1211 + set(${have} FALSE)
1212 + endif(${have} EQUAL 0)
1213 +endmacro(GR_PYTHON_CHECK_MODULE)
1214 +
1215 +########################################################################
1216 +# Sets the python installation directory GR_PYTHON_DIR
1217 +########################################################################
1218 +if(NOT DEFINED GR_PYTHON_DIR)
1219 +execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
1220 +from distutils import sysconfig
1221 +print sysconfig.get_python_lib(plat_specific=True, prefix='')
1222 +" OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
1223 +)
1224 +endif()
1225 +file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR)
1226 +
1227 +########################################################################
1228 +# Create an always-built target with a unique name
1229 +# Usage: GR_UNIQUE_TARGET(<description> <dependencies list>)
1230 +########################################################################
1231 +function(GR_UNIQUE_TARGET desc)
1232 + file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
1233 + execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
1234 +unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
1235 +print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
1236 + OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
1237 + add_custom_target(${_target} ALL DEPENDS ${ARGN})
1238 +endfunction(GR_UNIQUE_TARGET)
1239 +
1240 +########################################################################
1241 +# Install python sources (also builds and installs byte-compiled python)
1242 +########################################################################
1243 +function(GR_PYTHON_INSTALL)
1244 + include(CMakeParseArgumentsCopy)
1245 + CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
1246 +
1247 + ####################################################################
1248 + if(GR_PYTHON_INSTALL_FILES)
1249 + ####################################################################
1250 + install(${ARGN}) #installs regular python files
1251 +
1252 + #create a list of all generated files
1253 + unset(pysrcfiles)
1254 + unset(pycfiles)
1255 + unset(pyofiles)
1256 + foreach(pyfile ${GR_PYTHON_INSTALL_FILES})
1257 + get_filename_component(pyfile ${pyfile} ABSOLUTE)
1258 + list(APPEND pysrcfiles ${pyfile})
1259 +
1260 + #determine if this file is in the source or binary directory
1261 + file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
1262 + string(LENGTH "${source_rel_path}" source_rel_path_len)
1263 + file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
1264 + string(LENGTH "${binary_rel_path}" binary_rel_path_len)
1265 +
1266 + #and set the generated path appropriately
1267 + if(${source_rel_path_len} GREATER ${binary_rel_path_len})
1268 + set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
1269 + else()
1270 + set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
1271 + endif()
1272 + list(APPEND pycfiles ${pygenfile}c)
1273 + list(APPEND pyofiles ${pygenfile}o)
1274 +
1275 + #ensure generation path exists
1276 + get_filename_component(pygen_path ${pygenfile} PATH)
1277 + file(MAKE_DIRECTORY ${pygen_path})
1278 +
1279 + endforeach(pyfile)
1280 +
1281 + #the command to generate the pyc files
1282 + add_custom_command(
1283 + DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
1284 + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
1285 + )
1286 +
1287 + #the command to generate the pyo files
1288 + add_custom_command(
1289 + DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
1290 + COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
1291 + )
1292 +
1293 + #create install rule and add generated files to target list
1294 + set(python_install_gen_targets ${pycfiles} ${pyofiles})
1295 + install(FILES ${python_install_gen_targets}
1296 + DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
1297 + COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
1298 + )
1299 +
1300 + ####################################################################
1301 + elseif(GR_PYTHON_INSTALL_PROGRAMS)
1302 + ####################################################################
1303 + file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
1304 +
1305 + if (CMAKE_CROSSCOMPILING)
1306 + set(pyexe_native "/usr/bin/env python")
1307 + endif()
1308 +
1309 + foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS})
1310 + get_filename_component(pyfile_name ${pyfile} NAME)
1311 + get_filename_component(pyfile ${pyfile} ABSOLUTE)
1312 + string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe")
1313 + list(APPEND python_install_gen_targets ${pyexefile})
1314 +
1315 + get_filename_component(pyexefile_path ${pyexefile} PATH)
1316 + file(MAKE_DIRECTORY ${pyexefile_path})
1317 +
1318 + add_custom_command(
1319 + OUTPUT ${pyexefile} DEPENDS ${pyfile}
1320 + COMMAND ${PYTHON_EXECUTABLE} -c
1321 + "import re; R=re.compile('^\#!.*$\\n',flags=re.MULTILINE); open('${pyexefile}','w').write('\#!${pyexe_native}\\n'+R.sub('',open('${pyfile}','r').read()))"
1322 + COMMENT "Shebangin ${pyfile_name}"
1323 + VERBATIM
1324 + )
1325 +
1326 + #on windows, python files need an extension to execute
1327 + get_filename_component(pyfile_ext ${pyfile} EXT)
1328 + if(WIN32 AND NOT pyfile_ext)
1329 + set(pyfile_name "${pyfile_name}.py")
1330 + endif()
1331 +
1332 + install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
1333 + DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
1334 + COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
1335 + )
1336 + endforeach(pyfile)
1337 +
1338 + endif()
1339 +
1340 + GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})
1341 +
1342 +endfunction(GR_PYTHON_INSTALL)
1343 +
1344 +########################################################################
1345 +# Write the python helper script that generates byte code files
1346 +########################################################################
1347 +file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py "
1348 +import sys, py_compile
1349 +files = sys.argv[1:]
1350 +srcs, gens = files[:len(files)/2], files[len(files)/2:]
1351 +for src, gen in zip(srcs, gens):
1352 + py_compile.compile(file=src, cfile=gen, doraise=True)
1353 +")
1354 diff --git a/cmake/Modules/GrSwig.cmake b/cmake/Modules/GrSwig.cmake
1355 new file mode 100755
1356 index 0000000..abf4dc4
1357 --- /dev/null
1358 +++ b/cmake/Modules/GrSwig.cmake
1359 @@ -0,0 +1,251 @@
1360 +# Copyright 2010-2011 Free Software Foundation, Inc.
1361 +#
1362 +# This file is part of GNU Radio
1363 +#
1364 +# GNU Radio is free software; you can redistribute it and/or modify
1365 +# it under the terms of the GNU General Public License as published by
1366 +# the Free Software Foundation; either version 3, or (at your option)
1367 +# any later version.
1368 +#
1369 +# GNU Radio is distributed in the hope that it will be useful,
1370 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
1371 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1372 +# GNU General Public License for more details.
1373 +#
1374 +# You should have received a copy of the GNU General Public License
1375 +# along with GNU Radio; see the file COPYING. If not, write to
1376 +# the Free Software Foundation, Inc., 51 Franklin Street,
1377 +# Boston, MA 02110-1301, USA.
1378 +
1379 +if(DEFINED __INCLUDED_GR_SWIG_CMAKE)
1380 + return()
1381 +endif()
1382 +set(__INCLUDED_GR_SWIG_CMAKE TRUE)
1383 +
1384 +include(GrPython)
1385 +
1386 +########################################################################
1387 +# Builds a swig documentation file to be generated into python docstrings
1388 +# Usage: GR_SWIG_MAKE_DOCS(output_file input_path input_path....)
1389 +#
1390 +# Set the following variable to specify extra dependent targets:
1391 +# - GR_SWIG_DOCS_SOURCE_DEPS
1392 +# - GR_SWIG_DOCS_TARGET_DEPS
1393 +########################################################################
1394 +function(GR_SWIG_MAKE_DOCS output_file)
1395 + if(ENABLE_DOXYGEN)
1396 +
1397 + #setup the input files variable list, quote formated
1398 + set(input_files)
1399 + unset(INPUT_PATHS)
1400 + foreach(input_path ${ARGN})
1401 + if(IS_DIRECTORY ${input_path}) #when input path is a directory
1402 + file(GLOB input_path_h_files ${input_path}/*.h)
1403 + else() #otherwise its just a file, no glob
1404 + set(input_path_h_files ${input_path})
1405 + endif()
1406 + list(APPEND input_files ${input_path_h_files})
1407 + set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"")
1408 + endforeach(input_path)
1409 +
1410 + #determine the output directory
1411 + get_filename_component(name ${output_file} NAME_WE)
1412 + get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH)
1413 + set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs)
1414 + make_directory(${OUTPUT_DIRECTORY})
1415 +
1416 + #generate the Doxyfile used by doxygen
1417 + configure_file(
1418 + ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in
1419 + ${OUTPUT_DIRECTORY}/Doxyfile
1420 + @ONLY)
1421 +
1422 + #Create a dummy custom command that depends on other targets
1423 + include(GrMiscUtils)
1424 + GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS})
1425 +
1426 + #call doxygen on the Doxyfile + input headers
1427 + add_custom_command(
1428 + OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
1429 + DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
1430 + COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
1431 + COMMENT "Generating doxygen xml for ${name} docs"
1432 + )
1433 +
1434 + #call the swig_doc script on the xml files
1435 + add_custom_command(
1436 + OUTPUT ${output_file}
1437 + DEPENDS ${input_files} ${stamp-file} ${OUTPUT_DIRECTORY}/xml/index.xml
1438 + COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
1439 + ${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
1440 + ${OUTPUT_DIRECTORY}/xml
1441 + ${output_file}
1442 + COMMENT "Generating python docstrings for ${name}"
1443 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
1444 + )
1445 +
1446 + else(ENABLE_DOXYGEN)
1447 + file(WRITE ${output_file} "\n") #no doxygen -> empty file
1448 + endif(ENABLE_DOXYGEN)
1449 +endfunction(GR_SWIG_MAKE_DOCS)
1450 +
1451 +########################################################################
1452 +# Build a swig target for the common gnuradio use case. Usage:
1453 +# GR_SWIG_MAKE(target ifile ifile ifile...)
1454 +#
1455 +# Set the following variables before calling:
1456 +# - GR_SWIG_FLAGS
1457 +# - GR_SWIG_INCLUDE_DIRS
1458 +# - GR_SWIG_LIBRARIES
1459 +# - GR_SWIG_SOURCE_DEPS
1460 +# - GR_SWIG_TARGET_DEPS
1461 +# - GR_SWIG_DOC_FILE
1462 +# - GR_SWIG_DOC_DIRS
1463 +########################################################################
1464 +macro(GR_SWIG_MAKE name)
1465 + set(ifiles ${ARGN})
1466 +
1467 + # Shimming this in here to take care of a SWIG bug with handling
1468 + # vector<size_t> and vector<unsigned int> (on 32-bit machines) and
1469 + # vector<long unsigned int> (on 64-bit machines). Use this to test
1470 + # the size of size_t, then set SIZE_T_32 if it's a 32-bit machine
1471 + # or not if it's 64-bit. The logic in gr_type.i handles the rest.
1472 + INCLUDE(CheckTypeSize)
1473 + CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
1474 + CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
1475 + if(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
1476 + list(APPEND GR_SWIG_FLAGS -DSIZE_T_32)
1477 + endif(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
1478 +
1479 + #do swig doc generation if specified
1480 + if(GR_SWIG_DOC_FILE)
1481 + set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS})
1482 + list(APPEND GR_SWIG_DOCS_TARGET_DEPS ${GR_SWIG_TARGET_DEPS})
1483 + GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS})
1484 + add_custom_target(${name}_swig_doc DEPENDS ${GR_SWIG_DOC_FILE})
1485 + list(APPEND GR_SWIG_TARGET_DEPS ${name}_swig_doc ${GR_RUNTIME_SWIG_DOC_FILE})
1486 + endif()
1487 +
1488 + #append additional include directories
1489 + find_package(PythonLibs 2)
1490 + list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs)
1491 + list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
1492 +
1493 + #prepend local swig directories
1494 + list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_SOURCE_DIR})
1495 + list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_BINARY_DIR})
1496 +
1497 + #determine include dependencies for swig file
1498 + execute_process(
1499 + COMMAND ${PYTHON_EXECUTABLE}
1500 + ${CMAKE_BINARY_DIR}/get_swig_deps.py
1501 + "${ifiles}" "${GR_SWIG_INCLUDE_DIRS}"
1502 + OUTPUT_STRIP_TRAILING_WHITESPACE
1503 + OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS
1504 + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
1505 + )
1506 +
1507 + #Create a dummy custom command that depends on other targets
1508 + include(GrMiscUtils)
1509 + GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS})
1510 + set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag)
1511 + add_custom_command(
1512 + OUTPUT ${tag_file}
1513 + DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps}
1514 + COMMAND ${CMAKE_COMMAND} -E touch ${tag_file}
1515 + )
1516 +
1517 + #append the specified include directories
1518 + include_directories(${GR_SWIG_INCLUDE_DIRS})
1519 + list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file})
1520 +
1521 + #setup the swig flags with flags and include directories
1522 + set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS})
1523 + foreach(dir ${GR_SWIG_INCLUDE_DIRS})
1524 + list(APPEND CMAKE_SWIG_FLAGS "-I${dir}")
1525 + endforeach(dir)
1526 +
1527 + #set the C++ property on the swig .i file so it builds
1528 + set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON)
1529 +
1530 + #setup the actual swig library target to be built
1531 + include(UseSWIG)
1532 + SWIG_ADD_MODULE(${name} python ${ifiles})
1533 + SWIG_LINK_LIBRARIES(${name} ${PYTHON_LIBRARIES} ${GR_SWIG_LIBRARIES})
1534 + if(${name} STREQUAL "runtime_swig")
1535 + SET_TARGET_PROPERTIES(${SWIG_MODULE_runtime_swig_REAL_NAME} PROPERTIES DEFINE_SYMBOL "gnuradio_runtime_EXPORTS")
1536 + endif(${name} STREQUAL "runtime_swig")
1537 +
1538 +endmacro(GR_SWIG_MAKE)
1539 +
1540 +########################################################################
1541 +# Install swig targets generated by GR_SWIG_MAKE. Usage:
1542 +# GR_SWIG_INSTALL(
1543 +# TARGETS target target target...
1544 +# [DESTINATION destination]
1545 +# [COMPONENT component]
1546 +# )
1547 +########################################################################
1548 +macro(GR_SWIG_INSTALL)
1549 +
1550 + include(CMakeParseArgumentsCopy)
1551 + CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN})
1552 +
1553 + foreach(name ${GR_SWIG_INSTALL_TARGETS})
1554 + install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME}
1555 + DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
1556 + COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
1557 + )
1558 +
1559 + include(GrPython)
1560 + GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py
1561 + DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
1562 + COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
1563 + )
1564 +
1565 + GR_LIBTOOL(
1566 + TARGET ${SWIG_MODULE_${name}_REAL_NAME}
1567 + DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
1568 + )
1569 +
1570 + endforeach(name)
1571 +
1572 +endmacro(GR_SWIG_INSTALL)
1573 +
1574 +########################################################################
1575 +# Generate a python file that can determine swig dependencies.
1576 +# Used by the make macro above to determine extra dependencies.
1577 +# When you build C++, CMake figures out the header dependencies.
1578 +# This code essentially performs that logic for swig includes.
1579 +########################################################################
1580 +file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py "
1581 +
1582 +import os, sys, re
1583 +
1584 +i_include_matcher = re.compile('%(include|import)\\s*[<|\"](.*)[>|\"]')
1585 +h_include_matcher = re.compile('#(include)\\s*[<|\"](.*)[>|\"]')
1586 +include_dirs = sys.argv[2].split(';')
1587 +
1588 +def get_swig_incs(file_path):
1589 + if file_path.endswith('.i'): matcher = i_include_matcher
1590 + else: matcher = h_include_matcher
1591 + file_contents = open(file_path, 'r').read()
1592 + return matcher.findall(file_contents, re.MULTILINE)
1593 +
1594 +def get_swig_deps(file_path, level):
1595 + deps = [file_path]
1596 + if level == 0: return deps
1597 + for keyword, inc_file in get_swig_incs(file_path):
1598 + for inc_dir in include_dirs:
1599 + inc_path = os.path.join(inc_dir, inc_file)
1600 + if not os.path.exists(inc_path): continue
1601 + deps.extend(get_swig_deps(inc_path, level-1))
1602 + break #found, we dont search in lower prio inc dirs
1603 + return deps
1604 +
1605 +if __name__ == '__main__':
1606 + ifiles = sys.argv[1].split(';')
1607 + deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
1608 + #sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
1609 + print(';'.join(set(deps)))
1610 +")
1611 diff --git a/cmake/Modules/GrTest.cmake b/cmake/Modules/GrTest.cmake
1612 new file mode 100755
1613 index 0000000..62caab4
1614 --- /dev/null
1615 +++ b/cmake/Modules/GrTest.cmake
1616 @@ -0,0 +1,143 @@
1617 +# Copyright 2010-2011 Free Software Foundation, Inc.
1618 +#
1619 +# This file is part of GNU Radio
1620 +#
1621 +# GNU Radio is free software; you can redistribute it and/or modify
1622 +# it under the terms of the GNU General Public License as published by
1623 +# the Free Software Foundation; either version 3, or (at your option)
1624 +# any later version.
1625 +#
1626 +# GNU Radio is distributed in the hope that it will be useful,
1627 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
1628 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1629 +# GNU General Public License for more details.
1630 +#
1631 +# You should have received a copy of the GNU General Public License
1632 +# along with GNU Radio; see the file COPYING. If not, write to
1633 +# the Free Software Foundation, Inc., 51 Franklin Street,
1634 +# Boston, MA 02110-1301, USA.
1635 +
1636 +if(DEFINED __INCLUDED_GR_TEST_CMAKE)
1637 + return()
1638 +endif()
1639 +set(__INCLUDED_GR_TEST_CMAKE TRUE)
1640 +
1641 +########################################################################
1642 +# Add a unit test and setup the environment for a unit test.
1643 +# Takes the same arguments as the ADD_TEST function.
1644 +#
1645 +# Before calling set the following variables:
1646 +# GR_TEST_TARGET_DEPS - built targets for the library path
1647 +# GR_TEST_LIBRARY_DIRS - directories for the library path
1648 +# GR_TEST_PYTHON_DIRS - directories for the python path
1649 +# GR_TEST_ENVIRONS - other environment key/value pairs
1650 +########################################################################
1651 +function(GR_ADD_TEST test_name)
1652 +
1653 + #Ensure that the build exe also appears in the PATH.
1654 + list(APPEND GR_TEST_TARGET_DEPS ${ARGN})
1655 +
1656 + #In the land of windows, all libraries must be in the PATH.
1657 + #Since the dependent libraries are not yet installed,
1658 + #we must manually set them in the PATH to run tests.
1659 + #The following appends the path of a target dependency.
1660 + foreach(target ${GR_TEST_TARGET_DEPS})
1661 + get_target_property(location ${target} LOCATION)
1662 + if(location)
1663 + get_filename_component(path ${location} PATH)
1664 + string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path})
1665 + list(APPEND GR_TEST_LIBRARY_DIRS ${path})
1666 + endif(location)
1667 + endforeach(target)
1668 +
1669 + if(WIN32)
1670 + #SWIG generates the python library files into a subdirectory.
1671 + #Therefore, we must append this subdirectory into PYTHONPATH.
1672 + #Only do this for the python directories matching the following:
1673 + foreach(pydir ${GR_TEST_PYTHON_DIRS})
1674 + get_filename_component(name ${pydir} NAME)
1675 + if(name MATCHES "^(swig|lib|src)$")
1676 + list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
1677 + endif()
1678 + endforeach(pydir)
1679 + endif(WIN32)
1680 +
1681 + file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
1682 + file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
1683 + file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
1684 +
1685 + set(environs "VOLK_GENERIC=1" "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
1686 + list(APPEND environs ${GR_TEST_ENVIRONS})
1687 +
1688 + #http://www.cmake.org/pipermail/cmake/2009-May/029464.html
1689 + #Replaced this add test + set environs code with the shell script generation.
1690 + #Its nicer to be able to manually run the shell script to diagnose problems.
1691 + #ADD_TEST(${ARGV})
1692 + #SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
1693 +
1694 + if(UNIX)
1695 + set(LD_PATH_VAR "LD_LIBRARY_PATH")
1696 + if(APPLE)
1697 + set(LD_PATH_VAR "DYLD_LIBRARY_PATH")
1698 + endif()
1699 +
1700 + set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
1701 + list(APPEND libpath "$${LD_PATH_VAR}")
1702 + list(APPEND pypath "$PYTHONPATH")
1703 +
1704 + #replace list separator with the path separator
1705 + string(REPLACE ";" ":" libpath "${libpath}")
1706 + string(REPLACE ";" ":" pypath "${pypath}")
1707 + list(APPEND environs "PATH=${binpath}" "${LD_PATH_VAR}=${libpath}" "PYTHONPATH=${pypath}")
1708 +
1709 + #generate a bat file that sets the environment and runs the test
1710 + if (CMAKE_CROSSCOMPILING)
1711 + set(SHELL "/bin/sh")
1712 + else(CMAKE_CROSSCOMPILING)
1713 + find_program(SHELL sh)
1714 + endif(CMAKE_CROSSCOMPILING)
1715 + set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
1716 + file(WRITE ${sh_file} "#!${SHELL}\n")
1717 + #each line sets an environment variable
1718 + foreach(environ ${environs})
1719 + file(APPEND ${sh_file} "export ${environ}\n")
1720 + endforeach(environ)
1721 + #load the command to run with its arguments
1722 + foreach(arg ${ARGN})
1723 + file(APPEND ${sh_file} "${arg} ")
1724 + endforeach(arg)
1725 + file(APPEND ${sh_file} "\n")
1726 +
1727 + #make the shell file executable
1728 + execute_process(COMMAND chmod +x ${sh_file})
1729 +
1730 + add_test(${test_name} ${SHELL} ${sh_file})
1731 +
1732 + endif(UNIX)
1733 +
1734 + if(WIN32)
1735 + list(APPEND libpath ${DLL_PATHS} "%PATH%")
1736 + list(APPEND pypath "%PYTHONPATH%")
1737 +
1738 + #replace list separator with the path separator (escaped)
1739 + string(REPLACE ";" "\\;" libpath "${libpath}")
1740 + string(REPLACE ";" "\\;" pypath "${pypath}")
1741 + list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
1742 +
1743 + #generate a bat file that sets the environment and runs the test
1744 + set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
1745 + file(WRITE ${bat_file} "@echo off\n")
1746 + #each line sets an environment variable
1747 + foreach(environ ${environs})
1748 + file(APPEND ${bat_file} "SET ${environ}\n")
1749 + endforeach(environ)
1750 + #load the command to run with its arguments
1751 + foreach(arg ${ARGN})
1752 + file(APPEND ${bat_file} "${arg} ")
1753 + endforeach(arg)
1754 + file(APPEND ${bat_file} "\n")
1755 +
1756 + add_test(${test_name} ${bat_file})
1757 + endif(WIN32)
1758 +
1759 +endfunction(GR_ADD_TEST)
1760 diff --git a/cmake/Modules/UseSWIG.cmake b/cmake/Modules/UseSWIG.cmake
1761 new file mode 100755
1762 index 0000000..c0f1728
1763 --- /dev/null
1764 +++ b/cmake/Modules/UseSWIG.cmake
1765 @@ -0,0 +1,304 @@
1766 +# - SWIG module for CMake
1767 +# Defines the following macros:
1768 +# SWIG_ADD_MODULE(name language [ files ])
1769 +# - Define swig module with given name and specified language
1770 +# SWIG_LINK_LIBRARIES(name [ libraries ])
1771 +# - Link libraries to swig module
1772 +# All other macros are for internal use only.
1773 +# To get the actual name of the swig module,
1774 +# use: ${SWIG_MODULE_${name}_REAL_NAME}.
1775 +# Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify
1776 +# special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add
1777 +# special flags to all swig calls.
1778 +# Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify
1779 +# where to write all the swig generated module (swig -outdir option)
1780 +# The name-specific variable SWIG_MODULE_<name>_EXTRA_DEPS may be used
1781 +# to specify extra dependencies for the generated modules.
1782 +# If the source file generated by swig need some special flag you can use
1783 +# set_source_files_properties( ${swig_generated_file_fullname}
1784 +# PROPERTIES COMPILE_FLAGS "-bla")
1785 +
1786 +
1787 +#=============================================================================
1788 +# Copyright 2004-2009 Kitware, Inc.
1789 +# Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com>
1790 +#
1791 +# Distributed under the OSI-approved BSD License (the "License");
1792 +# see accompanying file Copyright.txt for details.
1793 +#
1794 +# This software is distributed WITHOUT ANY WARRANTY; without even the
1795 +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1796 +# See the License for more information.
1797 +#=============================================================================
1798 +# (To distribute this file outside of CMake, substitute the full
1799 +# License text for the above reference.)
1800 +
1801 +set(SWIG_CXX_EXTENSION "cxx")
1802 +set(SWIG_EXTRA_LIBRARIES "")
1803 +
1804 +set(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
1805 +
1806 +#
1807 +# For given swig module initialize variables associated with it
1808 +#
1809 +macro(SWIG_MODULE_INITIALIZE name language)
1810 + string(TOUPPER "${language}" swig_uppercase_language)
1811 + string(TOLOWER "${language}" swig_lowercase_language)
1812 + set(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
1813 + set(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
1814 +
1815 + set(SWIG_MODULE_${name}_REAL_NAME "${name}")
1816 + if("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "UNKNOWN")
1817 + message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
1818 + elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PYTHON")
1819 + # when swig is used without the -interface it will produce in the module.py
1820 + # a 'import _modulename' statement, which implies having a corresponding
1821 + # _modulename.so (*NIX), _modulename.pyd (Win32).
1822 + set(SWIG_MODULE_${name}_REAL_NAME "_${name}")
1823 + elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PERL")
1824 + set(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
1825 + endif()
1826 +endmacro()
1827 +
1828 +#
1829 +# For a given language, input file, and output file, determine extra files that
1830 +# will be generated. This is internal swig macro.
1831 +#
1832 +
1833 +macro(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
1834 + set(${outfiles} "")
1835 + get_source_file_property(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
1836 + ${infile} SWIG_MODULE_NAME)
1837 + if(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
1838 + get_filename_component(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE)
1839 + endif()
1840 + foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSION})
1841 + set(${outfiles} ${${outfiles}}
1842 + "${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}")
1843 + endforeach()
1844 +endmacro()
1845 +
1846 +#
1847 +# Take swig (*.i) file and add proper custom commands for it
1848 +#
1849 +macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
1850 + set(swig_full_infile ${infile})
1851 + get_filename_component(swig_source_file_path "${infile}" PATH)
1852 + get_filename_component(swig_source_file_name_we "${infile}" NAME_WE)
1853 + get_source_file_property(swig_source_file_generated ${infile} GENERATED)
1854 + get_source_file_property(swig_source_file_cplusplus ${infile} CPLUSPLUS)
1855 + get_source_file_property(swig_source_file_flags ${infile} SWIG_FLAGS)
1856 + if("${swig_source_file_flags}" STREQUAL "NOTFOUND")
1857 + set(swig_source_file_flags "")
1858 + endif()
1859 + set(swig_source_file_fullname "${infile}")
1860 + if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
1861 + string(REGEX REPLACE
1862 + "^${CMAKE_CURRENT_SOURCE_DIR}" ""
1863 + swig_source_file_relative_path
1864 + "${swig_source_file_path}")
1865 + else()
1866 + if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
1867 + string(REGEX REPLACE
1868 + "^${CMAKE_CURRENT_BINARY_DIR}" ""
1869 + swig_source_file_relative_path
1870 + "${swig_source_file_path}")
1871 + set(swig_source_file_generated 1)
1872 + else()
1873 + set(swig_source_file_relative_path "${swig_source_file_path}")
1874 + if(swig_source_file_generated)
1875 + set(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}")
1876 + else()
1877 + set(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}")
1878 + endif()
1879 + endif()
1880 + endif()
1881 +
1882 + set(swig_generated_file_fullname
1883 + "${CMAKE_CURRENT_BINARY_DIR}")
1884 + if(swig_source_file_relative_path)
1885 + set(swig_generated_file_fullname
1886 + "${swig_generated_file_fullname}/${swig_source_file_relative_path}")
1887 + endif()
1888 + # If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
1889 + if(CMAKE_SWIG_OUTDIR)
1890 + set(swig_outdir ${CMAKE_SWIG_OUTDIR})
1891 + else()
1892 + set(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
1893 + endif()
1894 + SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
1895 + swig_extra_generated_files
1896 + "${swig_outdir}"
1897 + "${infile}")
1898 + set(swig_generated_file_fullname
1899 + "${swig_generated_file_fullname}/${swig_source_file_name_we}")
1900 + # add the language into the name of the file (i.e. TCL_wrap)
1901 + # this allows for the same .i file to be wrapped into different languages
1902 + set(swig_generated_file_fullname
1903 + "${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap")
1904 +
1905 + if(swig_source_file_cplusplus)
1906 + set(swig_generated_file_fullname
1907 + "${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}")
1908 + else()
1909 + set(swig_generated_file_fullname
1910 + "${swig_generated_file_fullname}.c")
1911 + endif()
1912 +
1913 + # Shut up some warnings from poor SWIG code generation that we
1914 + # can do nothing about, when this flag is available
1915 + include(CheckCXXCompilerFlag)
1916 + check_cxx_compiler_flag("-Wno-unused-but-set-variable" HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
1917 + if(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
1918 + set_source_files_properties(${swig_generated_file_fullname}
1919 + PROPERTIES COMPILE_FLAGS "-Wno-unused-but-set-variable")
1920 + endif(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
1921 +
1922 + get_directory_property(cmake_include_directories INCLUDE_DIRECTORIES)
1923 + set(swig_include_dirs)
1924 + foreach(it ${cmake_include_directories})
1925 + set(swig_include_dirs ${swig_include_dirs} "-I${it}")
1926 + endforeach()
1927 +
1928 + set(swig_special_flags)
1929 + # default is c, so add c++ flag if it is c++
1930 + if(swig_source_file_cplusplus)
1931 + set(swig_special_flags ${swig_special_flags} "-c++")
1932 + endif()
1933 + set(swig_extra_flags)
1934 + if(SWIG_MODULE_${name}_EXTRA_FLAGS)
1935 + set(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
1936 + endif()
1937 +
1938 + # hack to work around CMake bug in add_custom_command with multiple OUTPUT files
1939 +
1940 + file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
1941 + execute_process(
1942 + COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
1943 +unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
1944 +print(re.sub('\\W', '_', '${name} ${reldir} ' + unique))"
1945 + OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE
1946 + )
1947 +
1948 + file(
1949 + WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
1950 + "int main(void){return 0;}\n"
1951 + )
1952 +
1953 + # create dummy dependencies
1954 + add_custom_command(
1955 + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
1956 + COMMAND ${CMAKE_COMMAND} -E copy
1957 + ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
1958 + ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
1959 + DEPENDS "${swig_source_file_fullname}" ${SWIG_MODULE_${name}_EXTRA_DEPS}
1960 + COMMENT ""
1961 + )
1962 +
1963 + # create the dummy target
1964 + add_executable(${_target} ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp)
1965 +
1966 + # add a custom command to the dummy target
1967 + add_custom_command(
1968 + TARGET ${_target}
1969 + # Let's create the ${swig_outdir} at execution time, in case dir contains $(OutDir)
1970 + COMMAND ${CMAKE_COMMAND} -E make_directory ${swig_outdir}
1971 + COMMAND "${SWIG_EXECUTABLE}"
1972 + ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
1973 + ${swig_source_file_flags}
1974 + ${CMAKE_SWIG_FLAGS}
1975 + -outdir ${swig_outdir}
1976 + ${swig_special_flags}
1977 + ${swig_extra_flags}
1978 + ${swig_include_dirs}
1979 + -o "${swig_generated_file_fullname}"
1980 + "${swig_source_file_fullname}"
1981 + COMMENT "Swig source"
1982 + )
1983 +
1984 + #add dummy independent dependencies from the _target to each file
1985 + #that will be generated by the SWIG command above
1986 +
1987 + set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
1988 +
1989 + foreach(swig_gen_file ${${outfiles}})
1990 + add_custom_command(
1991 + OUTPUT ${swig_gen_file}
1992 + COMMAND ""
1993 + DEPENDS ${_target}
1994 + COMMENT ""
1995 + )
1996 + endforeach()
1997 +
1998 + set_source_files_properties(
1999 + ${outfiles} PROPERTIES GENERATED 1
2000 + )
2001 +
2002 +endmacro()
2003 +
2004 +#
2005 +# Create Swig module
2006 +#
2007 +macro(SWIG_ADD_MODULE name language)
2008 + SWIG_MODULE_INITIALIZE(${name} ${language})
2009 + set(swig_dot_i_sources)
2010 + set(swig_other_sources)
2011 + foreach(it ${ARGN})
2012 + if(${it} MATCHES ".*\\.i$")
2013 + set(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
2014 + else()
2015 + set(swig_other_sources ${swig_other_sources} "${it}")
2016 + endif()
2017 + endforeach()
2018 +
2019 + set(swig_generated_sources)
2020 + foreach(it ${swig_dot_i_sources})
2021 + SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
2022 + set(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
2023 + endforeach()
2024 + get_directory_property(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
2025 + set_directory_properties(PROPERTIES
2026 + ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
2027 + add_library(${SWIG_MODULE_${name}_REAL_NAME}
2028 + MODULE
2029 + ${swig_generated_sources}
2030 + ${swig_other_sources})
2031 + string(TOLOWER "${language}" swig_lowercase_language)
2032 + if ("${swig_lowercase_language}" STREQUAL "java")
2033 + if (APPLE)
2034 + # In java you want:
2035 + # System.loadLibrary("LIBRARY");
2036 + # then JNI will look for a library whose name is platform dependent, namely
2037 + # MacOS : libLIBRARY.jnilib
2038 + # Windows: LIBRARY.dll
2039 + # Linux : libLIBRARY.so
2040 + set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
2041 + endif ()
2042 + endif ()
2043 + if ("${swig_lowercase_language}" STREQUAL "python")
2044 + # this is only needed for the python case where a _modulename.so is generated
2045 + set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
2046 + # Python extension modules on Windows must have the extension ".pyd"
2047 + # instead of ".dll" as of Python 2.5. Older python versions do support
2048 + # this suffix.
2049 + # http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000
2050 + # <quote>
2051 + # Windows: .dll is no longer supported as a filename extension for extension modules.
2052 + # .pyd is now the only filename extension that will be searched for.
2053 + # </quote>
2054 + if(WIN32 AND NOT CYGWIN)
2055 + set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
2056 + endif()
2057 + endif ()
2058 +endmacro()
2059 +
2060 +#
2061 +# Like TARGET_LINK_LIBRARIES but for swig modules
2062 +#
2063 +macro(SWIG_LINK_LIBRARIES name)
2064 + if(SWIG_MODULE_${name}_REAL_NAME)
2065 + target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
2066 + else()
2067 + message(SEND_ERROR "Cannot find Swig library \"${name}\".")
2068 + endif()
2069 +endmacro()
2070 diff --git a/cmake/Modules/limesdrConfig.cmake b/cmake/Modules/limesdrConfig.cmake
2071 index 610f9a2..4564656 100644
2072 --- a/cmake/Modules/limesdrConfig.cmake
2073 +++ b/cmake/Modules/limesdrConfig.cmake
2074 @@ -1,4 +1,6 @@
2075 -INCLUDE(FindPkgConfig)
2076 +if(NOT PKG_CONFIG_FOUND)
2077 + INCLUDE(FindPkgConfig)
2078 +endif()
2079 PKG_CHECK_MODULES(PC_LIMESDR limesdr)
2080
2081 FIND_PATH(
2082 diff --git a/cmake/Modules/targetConfig.cmake.in b/cmake/Modules/targetConfig.cmake.in
2083 index 79e4a28..4a1fb31 100644
2084 --- a/cmake/Modules/targetConfig.cmake.in
2085 +++ b/cmake/Modules/targetConfig.cmake.in
2086 @@ -2,20 +2,8 @@
2087 #
2088 # This file is part of GNU Radio
2089 #
2090 -# GNU Radio is free software; you can redistribute it and/or modify
2091 -# it under the terms of the GNU General Public License as published by
2092 -# the Free Software Foundation; either version 3, or (at your option)
2093 -# any later version.
2094 +# SPDX-License-Identifier: GPL-3.0-or-later
2095 #
2096 -# GNU Radio is distributed in the hope that it will be useful,
2097 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
2098 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2099 -# GNU General Public License for more details.
2100 -#
2101 -# You should have received a copy of the GNU General Public License
2102 -# along with GNU Radio; see the file COPYING. If not, write to
2103 -# the Free Software Foundation, Inc., 51 Franklin Street,
2104 -# Boston, MA 02110-1301, USA.
2105
2106 include(CMakeFindDependencyMacro)
2107
2108 diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
2109 index 350ab24..3dfec04 100644
2110 --- a/docs/CMakeLists.txt
2111 +++ b/docs/CMakeLists.txt
2112 @@ -3,20 +3,8 @@
2113 # This file was generated by gr_modtool, a tool from the GNU Radio framework
2114 # This file is a part of gr-limesdr
2115 #
2116 -# GNU Radio is free software; you can redistribute it and/or modify
2117 -# it under the terms of the GNU General Public License as published by
2118 -# the Free Software Foundation; either version 3, or (at your option)
2119 -# any later version.
2120 +# SPDX-License-Identifier: GPL-3.0-or-later
2121 #
2122 -# GNU Radio is distributed in the hope that it will be useful,
2123 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
2124 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2125 -# GNU General Public License for more details.
2126 -#
2127 -# You should have received a copy of the GNU General Public License
2128 -# along with GNU Radio; see the file COPYING. If not, write to
2129 -# the Free Software Foundation, Inc., 51 Franklin Street,
2130 -# Boston, MA 02110-1301, USA.
2131
2132 ########################################################################
2133 # Setup dependencies
2134 diff --git a/docs/doxygen/CMakeLists.txt b/docs/doxygen/CMakeLists.txt
2135 index 7d280d4..bee1232 100644
2136 --- a/docs/doxygen/CMakeLists.txt
2137 +++ b/docs/doxygen/CMakeLists.txt
2138 @@ -3,20 +3,8 @@
2139 # This file was generated by gr_modtool, a tool from the GNU Radio framework
2140 # This file is a part of gr-limesdr
2141 #
2142 -# GNU Radio is free software; you can redistribute it and/or modify
2143 -# it under the terms of the GNU General Public License as published by
2144 -# the Free Software Foundation; either version 3, or (at your option)
2145 -# any later version.
2146 +# SPDX-License-Identifier: GPL-3.0-or-later
2147 #
2148 -# GNU Radio is distributed in the hope that it will be useful,
2149 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
2150 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2151 -# GNU General Public License for more details.
2152 -#
2153 -# You should have received a copy of the GNU General Public License
2154 -# along with GNU Radio; see the file COPYING. If not, write to
2155 -# the Free Software Foundation, Inc., 51 Franklin Street,
2156 -# Boston, MA 02110-1301, USA.
2157
2158 ########################################################################
2159 # Create the doxygen configuration file
2160 @@ -29,6 +17,7 @@ file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir)
2161 set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
2162 set(enable_html_docs YES)
2163 set(enable_latex_docs NO)
2164 +set(enable_mathjax NO)
2165 set(enable_xml_docs YES)
2166
2167 configure_file(
2168 diff --git a/docs/doxygen/Doxyfile.in b/docs/doxygen/Doxyfile.in
2169 index f6df40e..91a2019 100644
2170 --- a/docs/doxygen/Doxyfile.in
2171 +++ b/docs/doxygen/Doxyfile.in
2172 @@ -199,13 +199,6 @@ TAB_SIZE = 8
2173
2174 ALIASES =
2175
2176 -# This tag can be used to specify a number of word-keyword mappings (TCL only).
2177 -# A mapping has the form "name=value". For example adding
2178 -# "class=itcl::class" will allow you to use the command class in the
2179 -# itcl::class meaning.
2180 -
2181 -TCL_SUBST =
2182 -
2183 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
2184 # sources only. Doxygen will then generate output that is more tailored for C.
2185 # For instance, some of the names that are used will be different. The list
2186 @@ -723,8 +716,6 @@ EXCLUDE_PATTERNS = */.deps/* \
2187
2188 EXCLUDE_SYMBOLS = ad9862 \
2189 numpy \
2190 - *swig* \
2191 - *Swig* \
2192 *my_top_block* \
2193 *my_graph* \
2194 *app_top_block* \
2195 @@ -1220,14 +1211,14 @@ FORMULA_TRANSPARENT = YES
2196 # output. When enabled you may also need to install MathJax separately and
2197 # configure the path to it using the MATHJAX_RELPATH option.
2198
2199 -USE_MATHJAX = NO
2200 +USE_MATHJAX = @enable_mathjax@
2201
2202 # When MathJax is enabled you can set the default output format to be used for
2203 # the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
2204 # SVG. The default value is HTML-CSS, which is slower, but has the best
2205 # compatibility.
2206
2207 -MATHJAX_FORMAT = HTML-CSS
2208 +MATHJAX_FORMAT = SVG
2209
2210 # When MathJax is enabled you need to specify the location relative to the
2211 # HTML output directory using the MATHJAX_RELPATH option. The destination
2212 @@ -1239,12 +1230,12 @@ MATHJAX_FORMAT = HTML-CSS
2213 # However, it is strongly recommended to install a local
2214 # copy of MathJax from http://www.mathjax.org before deployment.
2215
2216 -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
2217 +MATHJAX_RELPATH = @MATHJAX2_PATH@
2218
2219 # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
2220 # names that should be enabled during MathJax rendering.
2221
2222 -MATHJAX_EXTENSIONS =
2223 +MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
2224
2225 # The MATHJAX_CODEFILE tag can be used to specify a file with javascript
2226 # pieces of code that will be used on startup of the MathJax code.
2227 @@ -1680,11 +1671,6 @@ EXTERNAL_GROUPS = YES
2228
2229 EXTERNAL_PAGES = YES
2230
2231 -# The PERL_PATH should be the absolute path and name of the perl script
2232 -# interpreter (i.e. the result of `which perl').
2233 -
2234 -PERL_PATH = /usr/bin/perl
2235 -
2236 #---------------------------------------------------------------------------
2237 # Configuration options related to the dot tool
2238 #---------------------------------------------------------------------------
2239 @@ -1697,15 +1683,6 @@ PERL_PATH = /usr/bin/perl
2240
2241 CLASS_DIAGRAMS = YES
2242
2243 -# You can define message sequence charts within doxygen comments using the \msc
2244 -# command. Doxygen will then run the mscgen tool (see
2245 -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
2246 -# documentation. The MSCGEN_PATH tag allows you to specify the directory where
2247 -# the mscgen tool resides. If left empty the tool is assumed to be found in the
2248 -# default search path.
2249 -
2250 -MSCGEN_PATH =
2251 -
2252 # If set to YES, the inheritance and collaboration graphs will hide
2253 # inheritance and usage relations if the target is undocumented
2254 # or is not a class.
2255 @@ -1834,7 +1811,7 @@ DIRECTORY_GRAPH = YES
2256 # HTML_FILE_EXTENSION to xhtml in order to make the SVG files
2257 # visible in IE 9+ (other browsers do not have this requirement).
2258
2259 -DOT_IMAGE_FORMAT = png
2260 +DOT_IMAGE_FORMAT = svg
2261
2262 # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
2263 # enable generation of interactive SVG images that allow zooming and panning.
2264 diff --git a/docs/doxygen/Doxyfile.swig_doc.in b/docs/doxygen/Doxyfile.swig_doc.in
2265 old mode 100644
2266 new mode 100755
2267 index cbe06d6..19e17dc
2268 --- a/docs/doxygen/Doxyfile.swig_doc.in
2269 +++ b/docs/doxygen/Doxyfile.swig_doc.in
2270 @@ -54,7 +54,7 @@ PROJECT_LOGO =
2271 # If a relative path is entered, it will be relative to the location
2272 # where doxygen was started. If left blank the current directory will be used.
2273
2274 -OUTPUT_DIRECTORY = "@OUTPUT_DIRECTORY@"
2275 +OUTPUT_DIRECTORY = @OUTPUT_DIRECTORY@
2276
2277 # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
2278 # 4096 sub-directories (in 2 levels) under the output directory of each output
2279 @@ -121,7 +121,7 @@ INLINE_INHERITED_MEMB = NO
2280 # path before files name in the file list and in the header files. If set
2281 # to NO the shortest path that makes the file name unique will be used.
2282
2283 -FULL_PATH_NAMES = NO
2284 +FULL_PATH_NAMES = YES
2285
2286 # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
2287 # can be used to strip a user-defined part of the path. Stripping is
2288 @@ -913,7 +913,7 @@ HTML_STYLESHEET =
2289 # user-defined cascading style sheet that is included after the standard
2290 # style sheets created by doxygen. Using this option one can overrule
2291 # certain style aspects. This is preferred over using HTML_STYLESHEET
2292 -# since it does not replace the standard style sheet and is therefore more
2293 +# since it does not replace the standard style sheet and is therefor more
2294 # robust against future updates. Doxygen will copy the style sheet file to
2295 # the output directory.
2296
2297 @@ -957,7 +957,7 @@ HTML_COLORSTYLE_GAMMA = 80
2298 # page will contain the date and time when the page was generated. Setting
2299 # this to NO can help when comparing the output of multiple runs.
2300
2301 -HTML_TIMESTAMP = NO
2302 +HTML_TIMESTAMP = YES
2303
2304 # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
2305 # documentation will contain sections that can be hidden and shown after the
2306 diff --git a/docs/doxygen/doxyxml/__init__.py b/docs/doxygen/doxyxml/__init__.py
2307 index 58f6c35..be2978b 100644
2308 --- a/docs/doxygen/doxyxml/__init__.py
2309 +++ b/docs/doxygen/doxyxml/__init__.py
2310 @@ -4,20 +4,8 @@
2311 # This file was generated by gr_modtool, a tool from the GNU Radio framework
2312 # This file is a part of gr-limesdr
2313 #
2314 -# GNU Radio is free software; you can redistribute it and/or modify
2315 -# it under the terms of the GNU General Public License as published by
2316 -# the Free Software Foundation; either version 3, or (at your option)
2317 -# any later version.
2318 +# SPDX-License-Identifier: GPL-3.0-or-later
2319 #
2320 -# GNU Radio is distributed in the hope that it will be useful,
2321 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
2322 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2323 -# GNU General Public License for more details.
2324 -#
2325 -# You should have received a copy of the GNU General Public License
2326 -# along with GNU Radio; see the file COPYING. If not, write to
2327 -# the Free Software Foundation, Inc., 51 Franklin Street,
2328 -# Boston, MA 02110-1301, USA.
2329 #
2330 """
2331 Python interface to contents of doxygen xml documentation.
2332 @@ -64,7 +52,6 @@ This line is uninformative and is only to test line breaks in the comments.
2333 u'Outputs the vital aadvark statistics.'
2334
2335 """
2336 -from __future__ import unicode_literals
2337
2338 from .doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
2339
2340 diff --git a/docs/doxygen/doxyxml/__init__.pyc b/docs/doxygen/doxyxml/__init__.pyc
2341 new file mode 100755
2342 index 0000000..586ac48
2343 Binary files /dev/null and b/docs/doxygen/doxyxml/__init__.pyc differ
2344 diff --git a/docs/doxygen/doxyxml/base.py b/docs/doxygen/doxyxml/base.py
2345 index 9d218a3..9807e1e 100644
2346 --- a/docs/doxygen/doxyxml/base.py
2347 +++ b/docs/doxygen/doxyxml/base.py
2348 @@ -4,20 +4,8 @@
2349 # This file was generated by gr_modtool, a tool from the GNU Radio framework
2350 # This file is a part of gr-limesdr
2351 #
2352 -# GNU Radio is free software; you can redistribute it and/or modify
2353 -# it under the terms of the GNU General Public License as published by
2354 -# the Free Software Foundation; either version 3, or (at your option)
2355 -# any later version.
2356 +# SPDX-License-Identifier: GPL-3.0-or-later
2357 #
2358 -# GNU Radio is distributed in the hope that it will be useful,
2359 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
2360 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2361 -# GNU General Public License for more details.
2362 -#
2363 -# You should have received a copy of the GNU General Public License
2364 -# along with GNU Radio; see the file COPYING. If not, write to
2365 -# the Free Software Foundation, Inc., 51 Franklin Street,
2366 -# Boston, MA 02110-1301, USA.
2367 #
2368 """
2369 A base class is created.
2370 @@ -25,8 +13,6 @@ A base class is created.
2371 Classes based upon this are used to make more user-friendly interfaces
2372 to the doxygen xml docs than the generated classes provide.
2373 """
2374 -from __future__ import print_function
2375 -from __future__ import unicode_literals
2376
2377 import os
2378 import pdb
2379 diff --git a/docs/doxygen/doxyxml/base.pyc b/docs/doxygen/doxyxml/base.pyc
2380 new file mode 100755
2381 index 0000000..ebd0ce1
2382 Binary files /dev/null and b/docs/doxygen/doxyxml/base.pyc differ
2383 diff --git a/docs/doxygen/doxyxml/doxyindex.py b/docs/doxygen/doxyxml/doxyindex.py
2384 index 6a65b97..c59050e 100644
2385 --- a/docs/doxygen/doxyxml/doxyindex.py
2386 +++ b/docs/doxygen/doxyxml/doxyindex.py
2387 @@ -4,27 +4,13 @@
2388 # This file was generated by gr_modtool, a tool from the GNU Radio framework
2389 # This file is a part of gr-limesdr
2390 #
2391 -# GNU Radio is free software; you can redistribute it and/or modify
2392 -# it under the terms of the GNU General Public License as published by
2393 -# the Free Software Foundation; either version 3, or (at your option)
2394 -# any later version.
2395 +# SPDX-License-Identifier: GPL-3.0-or-later
2396 #
2397 -# GNU Radio is distributed in the hope that it will be useful,
2398 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
2399 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2400 -# GNU General Public License for more details.
2401 -#
2402 -# You should have received a copy of the GNU General Public License
2403 -# along with GNU Radio; see the file COPYING. If not, write to
2404 -# the Free Software Foundation, Inc., 51 Franklin Street,
2405 -# Boston, MA 02110-1301, USA.
2406 #
2407 """
2408 Classes providing more user-friendly interfaces to the doxygen xml
2409 docs than the generated classes provide.
2410 """
2411 -from __future__ import absolute_import
2412 -from __future__ import unicode_literals
2413
2414 import os
2415
2416 @@ -60,14 +46,6 @@ class DoxyIndex(Base):
2417 self._members.append(converted)
2418
2419
2420 -def generate_swig_doc_i(self):
2421 - """
2422 - %feature("docstring") gr_make_align_on_samplenumbers_ss::align_state "
2423 - Wraps the C++: gr_align_on_samplenumbers_ss::align_state";
2424 - """
2425 - pass
2426 -
2427 -
2428 class DoxyCompMem(Base):
2429
2430
2431 diff --git a/docs/doxygen/doxyxml/doxyindex.pyc b/docs/doxygen/doxyxml/doxyindex.pyc
2432 new file mode 100755
2433 index 0000000..0f56da2
2434 Binary files /dev/null and b/docs/doxygen/doxyxml/doxyindex.pyc differ
2435 diff --git a/docs/doxygen/doxyxml/generated/__init__.py b/docs/doxygen/doxyxml/generated/__init__.py
2436 index 23095c1..3982397 100644
2437 --- a/docs/doxygen/doxyxml/generated/__init__.py
2438 +++ b/docs/doxygen/doxyxml/generated/__init__.py
2439 @@ -5,4 +5,3 @@ These do the real work of parsing the doxygen xml files but the
2440 resultant classes are not very friendly to navigate so the rest of the
2441 doxyxml module processes them further.
2442 """
2443 -from __future__ import unicode_literals
2444 diff --git a/docs/doxygen/doxyxml/generated/__init__.pyc b/docs/doxygen/doxyxml/generated/__init__.pyc
2445 new file mode 100755
2446 index 0000000..aedc669
2447 Binary files /dev/null and b/docs/doxygen/doxyxml/generated/__init__.pyc differ
2448 diff --git a/docs/doxygen/doxyxml/generated/compound.py b/docs/doxygen/doxyxml/generated/compound.py
2449 index acfa0dd..d0b164e 100644
2450 --- a/docs/doxygen/doxyxml/generated/compound.py
2451 +++ b/docs/doxygen/doxyxml/generated/compound.py
2452 @@ -3,8 +3,6 @@
2453 """
2454 Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
2455 """
2456 -from __future__ import absolute_import
2457 -from __future__ import unicode_literals
2458
2459
2460 from xml.dom import minidom
2461 diff --git a/docs/doxygen/doxyxml/generated/compound.pyc b/docs/doxygen/doxyxml/generated/compound.pyc
2462 new file mode 100755
2463 index 0000000..80a8648
2464 Binary files /dev/null and b/docs/doxygen/doxyxml/generated/compound.pyc differ
2465 diff --git a/docs/doxygen/doxyxml/generated/compoundsuper.py b/docs/doxygen/doxyxml/generated/compoundsuper.py
2466 index 6e984e1..05c4928 100644
2467 --- a/docs/doxygen/doxyxml/generated/compoundsuper.py
2468 +++ b/docs/doxygen/doxyxml/generated/compoundsuper.py
2469 @@ -4,17 +4,12 @@
2470 # Generated Thu Jun 11 18:44:25 2009 by generateDS.py.
2471 #
2472
2473 -from __future__ import print_function
2474 -from __future__ import unicode_literals
2475
2476 import sys
2477
2478 from xml.dom import minidom
2479 from xml.dom import Node
2480
2481 -import six
2482 -
2483 -
2484 #
2485 # User methods
2486 #
2487 @@ -69,7 +64,7 @@ def showIndent(outfile, level):
2488 outfile.write(' ')
2489
2490 def quote_xml(inStr):
2491 - s1 = (isinstance(inStr, six.string_types) and inStr or
2492 + s1 = (isinstance(inStr, str) and inStr or
2493 '%s' % inStr)
2494 s1 = s1.replace('&', '&amp;')
2495 s1 = s1.replace('<', '&lt;')
2496 @@ -77,7 +72,7 @@ def quote_xml(inStr):
2497 return s1
2498
2499 def quote_attrib(inStr):
2500 - s1 = (isinstance(inStr, six.string_types) and inStr or
2501 + s1 = (isinstance(inStr, str) and inStr or
2502 '%s' % inStr)
2503 s1 = s1.replace('&', '&amp;')
2504 s1 = s1.replace('<', '&lt;')
2505 diff --git a/docs/doxygen/doxyxml/generated/compoundsuper.pyc b/docs/doxygen/doxyxml/generated/compoundsuper.pyc
2506 new file mode 100755
2507 index 0000000..9cd5855
2508 Binary files /dev/null and b/docs/doxygen/doxyxml/generated/compoundsuper.pyc differ
2509 diff --git a/docs/doxygen/doxyxml/generated/index.py b/docs/doxygen/doxyxml/generated/index.py
2510 index 0c63512..c58407d 100644
2511 --- a/docs/doxygen/doxyxml/generated/index.py
2512 +++ b/docs/doxygen/doxyxml/generated/index.py
2513 @@ -3,8 +3,6 @@
2514 """
2515 Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
2516 """
2517 -from __future__ import absolute_import
2518 -from __future__ import unicode_literals
2519
2520 from xml.dom import minidom
2521
2522 diff --git a/docs/doxygen/doxyxml/generated/index.pyc b/docs/doxygen/doxyxml/generated/index.pyc
2523 new file mode 100755
2524 index 0000000..80fbc78
2525 Binary files /dev/null and b/docs/doxygen/doxyxml/generated/index.pyc differ
2526 diff --git a/docs/doxygen/doxyxml/generated/indexsuper.py b/docs/doxygen/doxyxml/generated/indexsuper.py
2527 index 11312db..cc2c112 100644
2528 --- a/docs/doxygen/doxyxml/generated/indexsuper.py
2529 +++ b/docs/doxygen/doxyxml/generated/indexsuper.py
2530 @@ -4,16 +4,12 @@
2531 # Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
2532 #
2533
2534 -from __future__ import print_function
2535 -from __future__ import unicode_literals
2536
2537 import sys
2538
2539 from xml.dom import minidom
2540 from xml.dom import Node
2541
2542 -import six
2543 -
2544 #
2545 # User methods
2546 #
2547 @@ -68,7 +64,7 @@ def showIndent(outfile, level):
2548 outfile.write(' ')
2549
2550 def quote_xml(inStr):
2551 - s1 = (isinstance(inStr, six.string_types) and inStr or
2552 + s1 = (isinstance(inStr, str) and inStr or
2553 '%s' % inStr)
2554 s1 = s1.replace('&', '&amp;')
2555 s1 = s1.replace('<', '&lt;')
2556 @@ -76,7 +72,7 @@ def quote_xml(inStr):
2557 return s1
2558
2559 def quote_attrib(inStr):
2560 - s1 = (isinstance(inStr, six.string_types) and inStr or
2561 + s1 = (isinstance(inStr, str) and inStr or
2562 '%s' % inStr)
2563 s1 = s1.replace('&', '&amp;')
2564 s1 = s1.replace('<', '&lt;')
2565 diff --git a/docs/doxygen/doxyxml/generated/indexsuper.pyc b/docs/doxygen/doxyxml/generated/indexsuper.pyc
2566 new file mode 100755
2567 index 0000000..8eddaf0
2568 Binary files /dev/null and b/docs/doxygen/doxyxml/generated/indexsuper.pyc differ
2569 diff --git a/docs/doxygen/doxyxml/text.py b/docs/doxygen/doxyxml/text.py
2570 index 02513b2..45de7a8 100644
2571 --- a/docs/doxygen/doxyxml/text.py
2572 +++ b/docs/doxygen/doxyxml/text.py
2573 @@ -4,25 +4,12 @@
2574 # This file was generated by gr_modtool, a tool from the GNU Radio framework
2575 # This file is a part of gr-limesdr
2576 #
2577 -# GNU Radio is free software; you can redistribute it and/or modify
2578 -# it under the terms of the GNU General Public License as published by
2579 -# the Free Software Foundation; either version 3, or (at your option)
2580 -# any later version.
2581 +# SPDX-License-Identifier: GPL-3.0-or-later
2582 #
2583 -# GNU Radio is distributed in the hope that it will be useful,
2584 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
2585 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2586 -# GNU General Public License for more details.
2587 -#
2588 -# You should have received a copy of the GNU General Public License
2589 -# along with GNU Radio; see the file COPYING. If not, write to
2590 -# the Free Software Foundation, Inc., 51 Franklin Street,
2591 -# Boston, MA 02110-1301, USA.
2592 #
2593 """
2594 Utilities for extracting text from generated classes.
2595 """
2596 -from __future__ import unicode_literals
2597
2598 def is_string(txt):
2599 if isinstance(txt, str):
2600 diff --git a/docs/doxygen/doxyxml/text.pyc b/docs/doxygen/doxyxml/text.pyc
2601 new file mode 100755
2602 index 0000000..dcc507b
2603 Binary files /dev/null and b/docs/doxygen/doxyxml/text.pyc differ
2604 diff --git a/docs/doxygen/pydoc_macros.h b/docs/doxygen/pydoc_macros.h
2605 new file mode 100644
2606 index 0000000..98bf7cd
2607 --- /dev/null
2608 +++ b/docs/doxygen/pydoc_macros.h
2609 @@ -0,0 +1,19 @@
2610 +#ifndef PYDOC_MACROS_H
2611 +#define PYDOC_MACROS_H
2612 +
2613 +#define __EXPAND(x) x
2614 +#define __COUNT(_1, _2, _3, _4, _5, _6, _7, COUNT, ...) COUNT
2615 +#define __VA_SIZE(...) __EXPAND(__COUNT(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1))
2616 +#define __CAT1(a, b) a##b
2617 +#define __CAT2(a, b) __CAT1(a, b)
2618 +#define __DOC1(n1) __doc_##n1
2619 +#define __DOC2(n1, n2) __doc_##n1##_##n2
2620 +#define __DOC3(n1, n2, n3) __doc_##n1##_##n2##_##n3
2621 +#define __DOC4(n1, n2, n3, n4) __doc_##n1##_##n2##_##n3##_##n4
2622 +#define __DOC5(n1, n2, n3, n4, n5) __doc_##n1##_##n2##_##n3##_##n4##_##n5
2623 +#define __DOC6(n1, n2, n3, n4, n5, n6) __doc_##n1##_##n2##_##n3##_##n4##_##n5##_##n6
2624 +#define __DOC7(n1, n2, n3, n4, n5, n6, n7) \
2625 + __doc_##n1##_##n2##_##n3##_##n4##_##n5##_##n6##_##n7
2626 +#define DOC(...) __EXPAND(__EXPAND(__CAT2(__DOC, __VA_SIZE(__VA_ARGS__)))(__VA_ARGS__))
2627 +
2628 +#endif // PYDOC_MACROS_H
2629 \ No newline at end of file
2630 diff --git a/docs/doxygen/swig_doc.py b/docs/doxygen/swig_doc.py
2631 old mode 100644
2632 new mode 100755
2633 index 26f9fbd..4e1ce2e
2634 --- a/docs/doxygen/swig_doc.py
2635 +++ b/docs/doxygen/swig_doc.py
2636 @@ -1,8 +1,7 @@
2637 #
2638 -# Copyright 2010-2012 Free Software Foundation, Inc.
2639 +# Copyright 2010,2011 Free Software Foundation, Inc.
2640 #
2641 -# This file was generated by gr_modtool, a tool from the GNU Radio framework
2642 -# This file is a part of gr-limesdr
2643 +# This file is part of GNU Radio
2644 #
2645 # GNU Radio is free software; you can redistribute it and/or modify
2646 # it under the terms of the GNU General Public License as published by
2647 @@ -27,12 +26,14 @@ The file instructs SWIG to transfer the doxygen comments into the
2648 python docstrings.
2649
2650 """
2651 -from __future__ import unicode_literals
2652
2653 -import sys, time
2654 +import sys
2655 +
2656 +try:
2657 + from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
2658 +except ImportError:
2659 + from gnuradio.doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
2660
2661 -from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile
2662 -from doxyxml import DoxyOther, base
2663
2664 def py_name(name):
2665 bits = name.split('_')
2666 @@ -55,41 +56,18 @@ class Block(object):
2667 # Check for a parsing error.
2668 if item.error():
2669 return False
2670 - friendname = make_name(item.name())
2671 - is_a_block = item.has_member(friendname, DoxyFriend)
2672 - # But now sometimes the make function isn't a friend so check again.
2673 - if not is_a_block:
2674 - is_a_block = di.has_member(friendname, DoxyFunction)
2675 - return is_a_block
2676 -
2677 -class Block2(object):
2678 - """
2679 - Checks if doxyxml produced objects correspond to a new style
2680 - gnuradio block.
2681 - """
2682 -
2683 - @classmethod
2684 - def includes(cls, item):
2685 - if not isinstance(item, DoxyClass):
2686 - return False
2687 - # Check for a parsing error.
2688 - if item.error():
2689 - return False
2690 - is_a_block2 = item.has_member('make', DoxyFunction) and item.has_member('sptr', DoxyOther)
2691 - return is_a_block2
2692 + return item.has_member(make_name(item.name()), DoxyFriend)
2693
2694
2695 def utoascii(text):
2696 """
2697 - Convert unicode text into ascii and escape quotes and backslashes.
2698 + Convert unicode text into ascii and escape quotes.
2699 """
2700 if text is None:
2701 return ''
2702 out = text.encode('ascii', 'replace')
2703 - # swig will require us to replace blackslash with 4 backslashes
2704 - out = out.replace(b'\\', b'\\\\\\\\')
2705 - out = out.replace(b'"', b'\\"').decode('ascii')
2706 - return str(out)
2707 + out = out.replace('"', '\\"')
2708 + return out
2709
2710
2711 def combine_descriptions(obj):
2712 @@ -105,15 +83,9 @@ def combine_descriptions(obj):
2713 description.append(dd)
2714 return utoascii('\n\n'.join(description)).strip()
2715
2716 -def format_params(parameteritems):
2717 - output = ['Args:']
2718 - template = ' {0} : {1}'
2719 - for pi in parameteritems:
2720 - output.append(template.format(pi.name, pi.description))
2721 - return '\n'.join(output)
2722
2723 entry_templ = '%feature("docstring") {name} "{docstring}"'
2724 -def make_entry(obj, name=None, templ="{description}", description=None, params=[]):
2725 +def make_entry(obj, name=None, templ="{description}", description=None):
2726 """
2727 Create a docstring entry for a swig interface file.
2728
2729 @@ -130,9 +102,6 @@ def make_entry(obj, name=None, templ="{description}", description=None, params=[
2730 return ''
2731 if description is None:
2732 description = combine_descriptions(obj)
2733 - if params:
2734 - description += '\n\n'
2735 - description += utoascii(format_params(params))
2736 docstring = templ.format(description=description)
2737 if not docstring:
2738 return ''
2739 @@ -152,31 +121,27 @@ def make_func_entry(func, name=None, description=None, params=None):
2740 used as the description instead of extracting it from func.
2741 params - a parameter list that overrides using func.params.
2742 """
2743 - #if params is None:
2744 - # params = func.params
2745 - #params = [prm.declname for prm in params]
2746 - #if params:
2747 - # sig = "Params: (%s)" % ", ".join(params)
2748 - #else:
2749 - # sig = "Params: (NONE)"
2750 - #templ = "{description}\n\n" + sig
2751 - #return make_entry(func, name=name, templ=utoascii(templ),
2752 - # description=description)
2753 - return make_entry(func, name=name, description=description, params=params)
2754 -
2755 -
2756 -def make_class_entry(klass, description=None, ignored_methods=[], params=None):
2757 + if params is None:
2758 + params = func.params
2759 + params = [prm.declname for prm in params]
2760 + if params:
2761 + sig = "Params: (%s)" % ", ".join(params)
2762 + else:
2763 + sig = "Params: (NONE)"
2764 + templ = "{description}\n\n" + sig
2765 + return make_entry(func, name=name, templ=utoascii(templ),
2766 + description=description)
2767 +
2768 +
2769 +def make_class_entry(klass, description=None):
2770 """
2771 Create a class docstring for a swig interface file.
2772 """
2773 - if params is None:
2774 - params = klass.params
2775 output = []
2776 - output.append(make_entry(klass, description=description, params=params))
2777 + output.append(make_entry(klass, description=description))
2778 for func in klass.in_category(DoxyFunction):
2779 - if func.name() not in ignored_methods:
2780 - name = klass.name() + '::' + func.name()
2781 - output.append(make_func_entry(func, name=name))
2782 + name = klass.name() + '::' + func.name()
2783 + output.append(make_func_entry(func, name=name))
2784 return "\n\n".join(output)
2785
2786
2787 @@ -210,33 +175,11 @@ def make_block_entry(di, block):
2788 # the make function.
2789 output = []
2790 output.append(make_class_entry(block, description=super_description))
2791 + creator = block.get_member(block.name(), DoxyFunction)
2792 output.append(make_func_entry(make_func, description=super_description,
2793 - params=block.params))
2794 + params=creator.params))
2795 return "\n\n".join(output)
2796
2797 -def make_block2_entry(di, block):
2798 - """
2799 - Create class and function docstrings of a new style gnuradio block for a
2800 - swig interface file.
2801 - """
2802 - descriptions = []
2803 - # For new style blocks all the relevant documentation should be
2804 - # associated with the 'make' method.
2805 - class_description = combine_descriptions(block)
2806 - make_func = block.get_member('make', DoxyFunction)
2807 - make_description = combine_descriptions(make_func)
2808 - description = class_description + "\n\nConstructor Specific Documentation:\n\n" + make_description
2809 - # Associate the combined description with the class and
2810 - # the make function.
2811 - output = []
2812 - output.append(make_class_entry(
2813 - block, description=description,
2814 - ignored_methods=['make'], params=make_func.params))
2815 - makename = block.name() + '::make'
2816 - output.append(make_func_entry(
2817 - make_func, name=makename, description=description,
2818 - params=make_func.params))
2819 - return "\n\n".join(output)
2820
2821 def make_swig_interface_file(di, swigdocfilename, custom_output=None):
2822
2823 @@ -253,59 +196,39 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
2824
2825 # Create docstrings for the blocks.
2826 blocks = di.in_category(Block)
2827 - blocks2 = di.in_category(Block2)
2828 -
2829 make_funcs = set([])
2830 for block in blocks:
2831 try:
2832 make_func = di.get_member(make_name(block.name()), DoxyFunction)
2833 - # Don't want to risk writing to output twice.
2834 - if make_func.name() not in make_funcs:
2835 - make_funcs.add(make_func.name())
2836 - output.append(make_block_entry(di, block))
2837 - except block.ParsingError:
2838 - sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
2839 - raise
2840 -
2841 - for block in blocks2:
2842 - try:
2843 - make_func = block.get_member('make', DoxyFunction)
2844 - make_func_name = block.name() +'::make'
2845 - # Don't want to risk writing to output twice.
2846 - if make_func_name not in make_funcs:
2847 - make_funcs.add(make_func_name)
2848 - output.append(make_block2_entry(di, block))
2849 + make_funcs.add(make_func.name())
2850 + output.append(make_block_entry(di, block))
2851 except block.ParsingError:
2852 - sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
2853 - raise
2854 + print('Parsing error for block %s' % block.name())
2855
2856 # Create docstrings for functions
2857 # Don't include the make functions since they have already been dealt with.
2858 - funcs = [f for f in di.in_category(DoxyFunction)
2859 - if f.name() not in make_funcs and not f.name().startswith('std::')]
2860 + funcs = [f for f in di.in_category(DoxyFunction) if f.name() not in make_funcs]
2861 for f in funcs:
2862 try:
2863 output.append(make_func_entry(f))
2864 except f.ParsingError:
2865 - sys.stderr.write('Parsing error for function {0}\n'.format(f.name()))
2866 + print('Parsing error for function %s' % f.name())
2867
2868 # Create docstrings for classes
2869 block_names = [block.name() for block in blocks]
2870 - block_names += [block.name() for block in blocks2]
2871 - klasses = [k for k in di.in_category(DoxyClass)
2872 - if k.name() not in block_names and not k.name().startswith('std::')]
2873 + klasses = [k for k in di.in_category(DoxyClass) if k.name() not in block_names]
2874 for k in klasses:
2875 try:
2876 output.append(make_class_entry(k))
2877 except k.ParsingError:
2878 - sys.stderr.write('Parsing error for class {0}\n'.format(k.name()))
2879 + print('Parsing error for class %s' % k.name())
2880
2881 # Docstrings are not created for anything that is not a function or a class.
2882 # If this excludes anything important please add it here.
2883
2884 output = "\n\n".join(output)
2885
2886 - swig_doc = open(swigdocfilename, 'w')
2887 + swig_doc = file(swigdocfilename, 'w')
2888 swig_doc.write(output)
2889 swig_doc.close()
2890
2891 @@ -313,7 +236,7 @@ if __name__ == "__main__":
2892 # Parse command line options and set up doxyxml.
2893 err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
2894 if len(sys.argv) != 3:
2895 - raise Exception(err_msg)
2896 + raise StandardError(err_msg)
2897 xml_path = sys.argv[1]
2898 swigdocfilename = sys.argv[2]
2899 di = DoxyIndex(xml_path)
2900 diff --git a/docs/doxygen/swig_doc.pyc b/docs/doxygen/swig_doc.pyc
2901 new file mode 100755
2902 index 0000000..df927c8
2903 Binary files /dev/null and b/docs/doxygen/swig_doc.pyc differ
2904 diff --git a/docs/doxygen/update_pydoc.py b/docs/doxygen/update_pydoc.py
2905 new file mode 100644
2906 index 0000000..e6b4544
2907 --- /dev/null
2908 +++ b/docs/doxygen/update_pydoc.py
2909 @@ -0,0 +1,346 @@
2910 +#
2911 +# Copyright 2010-2012 Free Software Foundation, Inc.
2912 +#
2913 +# This file was generated by gr_modtool, a tool from the GNU Radio framework
2914 +# This file is a part of gnuradio
2915 +#
2916 +# SPDX-License-Identifier: GPL-3.0-or-later
2917 +#
2918 +#
2919 +"""
2920 +Updates the *pydoc_h files for a module
2921 +Execute using: python update_pydoc.py xml_path outputfilename
2922 +
2923 +The file instructs Pybind11 to transfer the doxygen comments into the
2924 +python docstrings.
2925 +
2926 +"""
2927 +
2928 +import os, sys, time, glob, re, json
2929 +from argparse import ArgumentParser
2930 +
2931 +from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile
2932 +from doxyxml import DoxyOther, base
2933 +
2934 +def py_name(name):
2935 + bits = name.split('_')
2936 + return '_'.join(bits[1:])
2937 +
2938 +def make_name(name):
2939 + bits = name.split('_')
2940 + return bits[0] + '_make_' + '_'.join(bits[1:])
2941 +
2942 +
2943 +class Block(object):
2944 + """
2945 + Checks if doxyxml produced objects correspond to a gnuradio block.
2946 + """
2947 +
2948 + @classmethod
2949 + def includes(cls, item):
2950 + if not isinstance(item, DoxyClass):
2951 + return False
2952 + # Check for a parsing error.
2953 + if item.error():
2954 + return False
2955 + friendname = make_name(item.name())
2956 + is_a_block = item.has_member(friendname, DoxyFriend)
2957 + # But now sometimes the make function isn't a friend so check again.
2958 + if not is_a_block:
2959 + is_a_block = di.has_member(friendname, DoxyFunction)
2960 + return is_a_block
2961 +
2962 +class Block2(object):
2963 + """
2964 + Checks if doxyxml produced objects correspond to a new style
2965 + gnuradio block.
2966 + """
2967 +
2968 + @classmethod
2969 + def includes(cls, item):
2970 + if not isinstance(item, DoxyClass):
2971 + return False
2972 + # Check for a parsing error.
2973 + if item.error():
2974 + return False
2975 + is_a_block2 = item.has_member('make', DoxyFunction) and item.has_member('sptr', DoxyOther)
2976 + return is_a_block2
2977 +
2978 +
2979 +def utoascii(text):
2980 + """
2981 + Convert unicode text into ascii and escape quotes and backslashes.
2982 + """
2983 + if text is None:
2984 + return ''
2985 + out = text.encode('ascii', 'replace')
2986 + # swig will require us to replace blackslash with 4 backslashes
2987 + # TODO: evaluate what this should be for pybind11
2988 + out = out.replace(b'\\', b'\\\\\\\\')
2989 + out = out.replace(b'"', b'\\"').decode('ascii')
2990 + return str(out)
2991 +
2992 +
2993 +def combine_descriptions(obj):
2994 + """
2995 + Combines the brief and detailed descriptions of an object together.
2996 + """
2997 + description = []
2998 + bd = obj.brief_description.strip()
2999 + dd = obj.detailed_description.strip()
3000 + if bd:
3001 + description.append(bd)
3002 + if dd:
3003 + description.append(dd)
3004 + return utoascii('\n\n'.join(description)).strip()
3005 +
3006 +def format_params(parameteritems):
3007 + output = ['Args:']
3008 + template = ' {0} : {1}'
3009 + for pi in parameteritems:
3010 + output.append(template.format(pi.name, pi.description))
3011 + return '\n'.join(output)
3012 +
3013 +entry_templ = '%feature("docstring") {name} "{docstring}"'
3014 +def make_entry(obj, name=None, templ="{description}", description=None, params=[]):
3015 + """
3016 + Create a docstring key/value pair, where the key is the object name.
3017 +
3018 + obj - a doxyxml object from which documentation will be extracted.
3019 + name - the name of the C object (defaults to obj.name())
3020 + templ - an optional template for the docstring containing only one
3021 + variable named 'description'.
3022 + description - if this optional variable is set then it's value is
3023 + used as the description instead of extracting it from obj.
3024 + """
3025 + if name is None:
3026 + name=obj.name()
3027 + if hasattr(obj,'_parse_data') and hasattr(obj._parse_data,'definition'):
3028 + name=obj._parse_data.definition.split(' ')[-1]
3029 + if "operator " in name:
3030 + return ''
3031 + if description is None:
3032 + description = combine_descriptions(obj)
3033 + if params:
3034 + description += '\n\n'
3035 + description += utoascii(format_params(params))
3036 + docstring = templ.format(description=description)
3037 +
3038 + return {name: docstring}
3039 +
3040 +
3041 +def make_class_entry(klass, description=None, ignored_methods=[], params=None):
3042 + """
3043 + Create a class docstring key/value pair.
3044 + """
3045 + if params is None:
3046 + params = klass.params
3047 + output = {}
3048 + output.update(make_entry(klass, description=description, params=params))
3049 + for func in klass.in_category(DoxyFunction):
3050 + if func.name() not in ignored_methods:
3051 + name = klass.name() + '::' + func.name()
3052 + output.update(make_entry(func, name=name))
3053 + return output
3054 +
3055 +
3056 +def make_block_entry(di, block):
3057 + """
3058 + Create class and function docstrings of a gnuradio block
3059 + """
3060 + descriptions = []
3061 + # Get the documentation associated with the class.
3062 + class_desc = combine_descriptions(block)
3063 + if class_desc:
3064 + descriptions.append(class_desc)
3065 + # Get the documentation associated with the make function
3066 + make_func = di.get_member(make_name(block.name()), DoxyFunction)
3067 + make_func_desc = combine_descriptions(make_func)
3068 + if make_func_desc:
3069 + descriptions.append(make_func_desc)
3070 + # Get the documentation associated with the file
3071 + try:
3072 + block_file = di.get_member(block.name() + ".h", DoxyFile)
3073 + file_desc = combine_descriptions(block_file)
3074 + if file_desc:
3075 + descriptions.append(file_desc)
3076 + except base.Base.NoSuchMember:
3077 + # Don't worry if we can't find a matching file.
3078 + pass
3079 + # And join them all together to make a super duper description.
3080 + super_description = "\n\n".join(descriptions)
3081 + # Associate the combined description with the class and
3082 + # the make function.
3083 + output = {}
3084 + output.update(make_class_entry(block, description=super_description))
3085 + output.update(make_entry(make_func, description=super_description,
3086 + params=block.params))
3087 + return output
3088 +
3089 +def make_block2_entry(di, block):
3090 + """
3091 + Create class and function docstrings of a new style gnuradio block
3092 + """
3093 + # For new style blocks all the relevant documentation should be
3094 + # associated with the 'make' method.
3095 + class_description = combine_descriptions(block)
3096 + make_func = block.get_member('make', DoxyFunction)
3097 + make_description = combine_descriptions(make_func)
3098 + description = class_description + "\n\nConstructor Specific Documentation:\n\n" + make_description
3099 + # Associate the combined description with the class and
3100 + # the make function.
3101 + output = {}
3102 + output.update(make_class_entry(
3103 + block, description=description,
3104 + ignored_methods=['make'], params=make_func.params))
3105 + makename = block.name() + '::make'
3106 + output.update(make_entry(
3107 + make_func, name=makename, description=description,
3108 + params=make_func.params))
3109 + return output
3110 +
3111 +def get_docstrings_dict(di, custom_output=None):
3112 +
3113 + output = {}
3114 + if custom_output:
3115 + output.update(custom_output)
3116 +
3117 + # Create docstrings for the blocks.
3118 + blocks = di.in_category(Block)
3119 + blocks2 = di.in_category(Block2)
3120 +
3121 + make_funcs = set([])
3122 + for block in blocks:
3123 + try:
3124 + make_func = di.get_member(make_name(block.name()), DoxyFunction)
3125 + # Don't want to risk writing to output twice.
3126 + if make_func.name() not in make_funcs:
3127 + make_funcs.add(make_func.name())
3128 + output.update(make_block_entry(di, block))
3129 + except block.ParsingError:
3130 + sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
3131 + raise
3132 +
3133 + for block in blocks2:
3134 + try:
3135 + make_func = block.get_member('make', DoxyFunction)
3136 + make_func_name = block.name() +'::make'
3137 + # Don't want to risk writing to output twice.
3138 + if make_func_name not in make_funcs:
3139 + make_funcs.add(make_func_name)
3140 + output.update(make_block2_entry(di, block))
3141 + except block.ParsingError:
3142 + sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
3143 + raise
3144 +
3145 + # Create docstrings for functions
3146 + # Don't include the make functions since they have already been dealt with.
3147 + funcs = [f for f in di.in_category(DoxyFunction)
3148 + if f.name() not in make_funcs and not f.name().startswith('std::')]
3149 + for f in funcs:
3150 + try:
3151 + output.update(make_entry(f))
3152 + except f.ParsingError:
3153 + sys.stderr.write('Parsing error for function {0}\n'.format(f.name()))
3154 +
3155 + # Create docstrings for classes
3156 + block_names = [block.name() for block in blocks]
3157 + block_names += [block.name() for block in blocks2]
3158 + klasses = [k for k in di.in_category(DoxyClass)
3159 + if k.name() not in block_names and not k.name().startswith('std::')]
3160 + for k in klasses:
3161 + try:
3162 + output.update(make_class_entry(k))
3163 + except k.ParsingError:
3164 + sys.stderr.write('Parsing error for class {0}\n'.format(k.name()))
3165 +
3166 + # Docstrings are not created for anything that is not a function or a class.
3167 + # If this excludes anything important please add it here.
3168 +
3169 + return output
3170 +
3171 +def sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, output_dir, filter_str=None):
3172 + if filter_str:
3173 + docstrings_dict = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str)}
3174 +
3175 + with open(os.path.join(output_dir,'docstring_status'),'w') as status_file:
3176 +
3177 + for pydoc_file in pydoc_files:
3178 + if filter_str:
3179 + filter_str2 = "::".join((filter_str,os.path.split(pydoc_file)[-1].split('_pydoc_template.h')[0]))
3180 + docstrings_dict2 = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str2)}
3181 + else:
3182 + docstrings_dict2 = docstrings_dict
3183 +
3184 +
3185 +
3186 + file_in = open(pydoc_file,'r').read()
3187 + for key, value in docstrings_dict2.items():
3188 + file_in_tmp = file_in
3189 + try:
3190 + doc_key = key.split("::")
3191 + # if 'gr' in doc_key:
3192 + # doc_key.remove('gr')
3193 + doc_key = '_'.join(doc_key)
3194 + regexp = r'(__doc_{} =\sR\"doc\()[^)]*(\)doc\")'.format(doc_key)
3195 + regexp = re.compile(regexp, re.MULTILINE)
3196 +
3197 + (file_in, nsubs) = regexp.subn(r'\1'+value+r'\2', file_in, count=1)
3198 + if nsubs == 1:
3199 + status_file.write("PASS: " + pydoc_file + "\n")
3200 + except KeyboardInterrupt:
3201 + raise KeyboardInterrupt
3202 + except: # be permissive, TODO log, but just leave the docstring blank
3203 + status_file.write("FAIL: " + pydoc_file + "\n")
3204 + file_in = file_in_tmp
3205 +
3206 + output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h'))
3207 + # FIXME: Remove this debug print
3208 + print('output docstrings to {}'.format(output_pathname))
3209 + with open(output_pathname,'w') as file_out:
3210 + file_out.write(file_in)
3211 +
3212 +def copy_docstring_templates(pydoc_files, output_dir):
3213 + with open(os.path.join(output_dir,'docstring_status'),'w') as status_file:
3214 + for pydoc_file in pydoc_files:
3215 + file_in = open(pydoc_file,'r').read()
3216 + output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h'))
3217 + # FIXME: Remove this debug print
3218 + print('copy docstrings to {}'.format(output_pathname))
3219 + with open(output_pathname,'w') as file_out:
3220 + file_out.write(file_in)
3221 + status_file.write("DONE")
3222 +
3223 +def argParse():
3224 + """Parses commandline args."""
3225 + desc='Scrape the doxygen generated xml for docstrings to insert into python bindings'
3226 + parser = ArgumentParser(description=desc)
3227 +
3228 + parser.add_argument("function", help="Operation to perform on docstrings", choices=["scrape","sub","copy"])
3229 +
3230 + parser.add_argument("--xml_path")
3231 + parser.add_argument("--bindings_dir")
3232 + parser.add_argument("--output_dir")
3233 + parser.add_argument("--json_path")
3234 + parser.add_argument("--filter", default=None)
3235 +
3236 + return parser.parse_args()
3237 +
3238 +if __name__ == "__main__":
3239 + # Parse command line options and set up doxyxml.
3240 + args = argParse()
3241 + if args.function.lower() == 'scrape':
3242 + di = DoxyIndex(args.xml_path)
3243 + docstrings_dict = get_docstrings_dict(di)
3244 + with open(args.json_path, 'w') as fp:
3245 + json.dump(docstrings_dict, fp)
3246 + elif args.function.lower() == 'sub':
3247 + with open(args.json_path, 'r') as fp:
3248 + docstrings_dict = json.load(fp)
3249 + pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h'))
3250 + sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, args.output_dir, args.filter)
3251 + elif args.function.lower() == 'copy':
3252 + pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h'))
3253 + copy_docstring_templates(pydoc_files, args.output_dir)
3254 +
3255 +
3256 diff --git a/docs/known_issues.txt b/docs/known_issues.txt
3257 new file mode 100755
3258 index 0000000..085b78a
3259 --- /dev/null
3260 +++ b/docs/known_issues.txt
3261 @@ -0,0 +1,13 @@
3262 +1. Python Path is not /usr/lib/python2.7/site-package/:/usr/local/lib/python2.7/site-package/
3263 +export PYTHONPATH="/usr/lib/python2.7/site-packages/:/usr/local/lib/python2.7/site-packages"
3264 +
3265 +this line is need to be added in the end of .bashrc file.
3266 +
3267 +2. Blocks work with LimeSuite version 17.10.0 and above.
3268 +
3269 +3. While running GNU Radio flowgraph “aUaU” message is thrown. This means audio underrun (not enough
3270 +samples ready to send to sound sink.
3271 +
3272 +4. Doesn't compile with GNU Radio 3.8.
3273 +
3274 +5. CW is being transmitted when flowgraph is killed.
3275 diff --git a/examples/DVB_T_2k_64QAM_TX.grc b/examples/DVB_T_2k_64QAM_TX.grc
3276 new file mode 100644
3277 index 0000000..05850e7
3278 --- /dev/null
3279 +++ b/examples/DVB_T_2k_64QAM_TX.grc
3280 @@ -0,0 +1,1415 @@
3281 +<?xml version='1.0' encoding='utf-8'?>
3282 +<?grc format='1' created='3.7.13'?>
3283 +<flow_graph>
3284 + <timestamp>Thu Jan 16 23:00:58 2014</timestamp>
3285 + <block>
3286 + <key>options</key>
3287 + <param>
3288 + <key>author</key>
3289 + <value></value>
3290 + </param>
3291 + <param>
3292 + <key>window_size</key>
3293 + <value>1280, 1024</value>
3294 + </param>
3295 + <param>
3296 + <key>category</key>
3297 + <value>Custom</value>
3298 + </param>
3299 + <param>
3300 + <key>comment</key>
3301 + <value></value>
3302 + </param>
3303 + <param>
3304 + <key>description</key>
3305 + <value></value>
3306 + </param>
3307 + <param>
3308 + <key>_enabled</key>
3309 + <value>True</value>
3310 + </param>
3311 + <param>
3312 + <key>_coordinate</key>
3313 + <value>(8, 12)</value>
3314 + </param>
3315 + <param>
3316 + <key>_rotation</key>
3317 + <value>0</value>
3318 + </param>
3319 + <param>
3320 + <key>generate_options</key>
3321 + <value>qt_gui</value>
3322 + </param>
3323 + <param>
3324 + <key>hier_block_src_path</key>
3325 + <value>.:</value>
3326 + </param>
3327 + <param>
3328 + <key>id</key>
3329 + <value>LimeSDR_USB_DVB_T_Demo_2k</value>
3330 + </param>
3331 + <param>
3332 + <key>max_nouts</key>
3333 + <value>0</value>
3334 + </param>
3335 + <param>
3336 + <key>qt_qss_theme</key>
3337 + <value></value>
3338 + </param>
3339 + <param>
3340 + <key>realtime_scheduling</key>
3341 + <value></value>
3342 + </param>
3343 + <param>
3344 + <key>run_command</key>
3345 + <value>{python} -u {filename}</value>
3346 + </param>
3347 + <param>
3348 + <key>run_options</key>
3349 + <value>prompt</value>
3350 + </param>
3351 + <param>
3352 + <key>run</key>
3353 + <value>True</value>
3354 + </param>
3355 + <param>
3356 + <key>sizing_mode</key>
3357 + <value>fixed</value>
3358 + </param>
3359 + <param>
3360 + <key>thread_safe_setters</key>
3361 + <value></value>
3362 + </param>
3363 + <param>
3364 + <key>title</key>
3365 + <value></value>
3366 + </param>
3367 + <param>
3368 + <key>placement</key>
3369 + <value>(0,0)</value>
3370 + </param>
3371 + </block>
3372 + <block>
3373 + <key>variable</key>
3374 + <param>
3375 + <key>comment</key>
3376 + <value></value>
3377 + </param>
3378 + <param>
3379 + <key>_enabled</key>
3380 + <value>True</value>
3381 + </param>
3382 + <param>
3383 + <key>_coordinate</key>
3384 + <value>(216, 12)</value>
3385 + </param>
3386 + <param>
3387 + <key>_rotation</key>
3388 + <value>0</value>
3389 + </param>
3390 + <param>
3391 + <key>id</key>
3392 + <value>center_freq</value>
3393 + </param>
3394 + <param>
3395 + <key>value</key>
3396 + <value>700e6</value>
3397 + </param>
3398 + </block>
3399 + <block>
3400 + <key>variable</key>
3401 + <param>
3402 + <key>comment</key>
3403 + <value></value>
3404 + </param>
3405 + <param>
3406 + <key>_enabled</key>
3407 + <value>True</value>
3408 + </param>
3409 + <param>
3410 + <key>_coordinate</key>
3411 + <value>(320, 12)</value>
3412 + </param>
3413 + <param>
3414 + <key>_rotation</key>
3415 + <value>0</value>
3416 + </param>
3417 + <param>
3418 + <key>id</key>
3419 + <value>samp_rate</value>
3420 + </param>
3421 + <param>
3422 + <key>value</key>
3423 + <value>(8000000.0 * 8) / 7</value>
3424 + </param>
3425 + </block>
3426 + <block>
3427 + <key>blocks_file_source</key>
3428 + <param>
3429 + <key>begin_tag</key>
3430 + <value>pmt.PMT_NIL</value>
3431 + </param>
3432 + <param>
3433 + <key>alias</key>
3434 + <value></value>
3435 + </param>
3436 + <param>
3437 + <key>comment</key>
3438 + <value></value>
3439 + </param>
3440 + <param>
3441 + <key>affinity</key>
3442 + <value></value>
3443 + </param>
3444 + <param>
3445 + <key>_enabled</key>
3446 + <value>True</value>
3447 + </param>
3448 + <param>
3449 + <key>file</key>
3450 + <value>adv8dvbt23qam64.ts</value>
3451 + </param>
3452 + <param>
3453 + <key>_coordinate</key>
3454 + <value>(16, 84)</value>
3455 + </param>
3456 + <param>
3457 + <key>_rotation</key>
3458 + <value>0</value>
3459 + </param>
3460 + <param>
3461 + <key>id</key>
3462 + <value>blocks_file_source_0</value>
3463 + </param>
3464 + <param>
3465 + <key>maxoutbuf</key>
3466 + <value>0</value>
3467 + </param>
3468 + <param>
3469 + <key>minoutbuf</key>
3470 + <value>0</value>
3471 + </param>
3472 + <param>
3473 + <key>type</key>
3474 + <value>byte</value>
3475 + </param>
3476 + <param>
3477 + <key>repeat</key>
3478 + <value>True</value>
3479 + </param>
3480 + <param>
3481 + <key>vlen</key>
3482 + <value>1</value>
3483 + </param>
3484 + </block>
3485 + <block>
3486 + <key>blocks_multiply_const_xx</key>
3487 + <param>
3488 + <key>alias</key>
3489 + <value></value>
3490 + </param>
3491 + <param>
3492 + <key>comment</key>
3493 + <value></value>
3494 + </param>
3495 + <param>
3496 + <key>const</key>
3497 + <value>0.0022097087</value>
3498 + </param>
3499 + <param>
3500 + <key>affinity</key>
3501 + <value></value>
3502 + </param>
3503 + <param>
3504 + <key>_enabled</key>
3505 + <value>True</value>
3506 + </param>
3507 + <param>
3508 + <key>_coordinate</key>
3509 + <value>(688, 404)</value>
3510 + </param>
3511 + <param>
3512 + <key>_rotation</key>
3513 + <value>0</value>
3514 + </param>
3515 + <param>
3516 + <key>id</key>
3517 + <value>blocks_multiply_const_xx_0</value>
3518 + </param>
3519 + <param>
3520 + <key>type</key>
3521 + <value>complex</value>
3522 + </param>
3523 + <param>
3524 + <key>maxoutbuf</key>
3525 + <value>0</value>
3526 + </param>
3527 + <param>
3528 + <key>minoutbuf</key>
3529 + <value>0</value>
3530 + </param>
3531 + <param>
3532 + <key>vlen</key>
3533 + <value>1</value>
3534 + </param>
3535 + </block>
3536 + <block>
3537 + <key>blocks_vector_to_stream</key>
3538 + <param>
3539 + <key>alias</key>
3540 + <value></value>
3541 + </param>
3542 + <param>
3543 + <key>comment</key>
3544 + <value></value>
3545 + </param>
3546 + <param>
3547 + <key>affinity</key>
3548 + <value></value>
3549 + </param>
3550 + <param>
3551 + <key>_enabled</key>
3552 + <value>True</value>
3553 + </param>
3554 + <param>
3555 + <key>_coordinate</key>
3556 + <value>(160, 332)</value>
3557 + </param>
3558 + <param>
3559 + <key>_rotation</key>
3560 + <value>0</value>
3561 + </param>
3562 + <param>
3563 + <key>id</key>
3564 + <value>blocks_vector_to_stream_0</value>
3565 + </param>
3566 + <param>
3567 + <key>type</key>
3568 + <value>complex</value>
3569 + </param>
3570 + <param>
3571 + <key>maxoutbuf</key>
3572 + <value>0</value>
3573 + </param>
3574 + <param>
3575 + <key>minoutbuf</key>
3576 + <value>0</value>
3577 + </param>
3578 + <param>
3579 + <key>num_items</key>
3580 + <value>2048</value>
3581 + </param>
3582 + <param>
3583 + <key>vlen</key>
3584 + <value>1</value>
3585 + </param>
3586 + </block>
3587 + <block>
3588 + <key>digital_ofdm_cyclic_prefixer</key>
3589 + <param>
3590 + <key>alias</key>
3591 + <value></value>
3592 + </param>
3593 + <param>
3594 + <key>cp_len</key>
3595 + <value>64</value>
3596 + </param>
3597 + <param>
3598 + <key>comment</key>
3599 + <value></value>
3600 + </param>
3601 + <param>
3602 + <key>affinity</key>
3603 + <value></value>
3604 + </param>
3605 + <param>
3606 + <key>_enabled</key>
3607 + <value>True</value>
3608 + </param>
3609 + <param>
3610 + <key>input_size</key>
3611 + <value>2048</value>
3612 + </param>
3613 + <param>
3614 + <key>_coordinate</key>
3615 + <value>(432, 400)</value>
3616 + </param>
3617 + <param>
3618 + <key>_rotation</key>
3619 + <value>0</value>
3620 + </param>
3621 + <param>
3622 + <key>id</key>
3623 + <value>digital_ofdm_cyclic_prefixer_0</value>
3624 + </param>
3625 + <param>
3626 + <key>tagname</key>
3627 + <value></value>
3628 + </param>
3629 + <param>
3630 + <key>maxoutbuf</key>
3631 + <value>0</value>
3632 + </param>
3633 + <param>
3634 + <key>minoutbuf</key>
3635 + <value>0</value>
3636 + </param>
3637 + <param>
3638 + <key>rolloff</key>
3639 + <value>0</value>
3640 + </param>
3641 + </block>
3642 + <block>
3643 + <key>dtv_dvbt_bit_inner_interleaver</key>
3644 + <param>
3645 + <key>alias</key>
3646 + <value></value>
3647 + </param>
3648 + <param>
3649 + <key>comment</key>
3650 + <value></value>
3651 + </param>
3652 + <param>
3653 + <key>constellation</key>
3654 + <value>64qam</value>
3655 + </param>
3656 + <param>
3657 + <key>affinity</key>
3658 + <value></value>
3659 + </param>
3660 + <param>
3661 + <key>_enabled</key>
3662 + <value>True</value>
3663 + </param>
3664 + <param>
3665 + <key>_coordinate</key>
3666 + <value>(1064, 204)</value>
3667 + </param>
3668 + <param>
3669 + <key>_rotation</key>
3670 + <value>180</value>
3671 + </param>
3672 + <param>
3673 + <key>hierarchy</key>
3674 + <value>nh</value>
3675 + </param>
3676 + <param>
3677 + <key>id</key>
3678 + <value>dtv_dvbt_bit_inner_interleaver_0</value>
3679 + </param>
3680 + <param>
3681 + <key>maxoutbuf</key>
3682 + <value>0</value>
3683 + </param>
3684 + <param>
3685 + <key>minoutbuf</key>
3686 + <value>0</value>
3687 + </param>
3688 + <param>
3689 + <key>transmission_mode</key>
3690 + <value>T2k</value>
3691 + </param>
3692 + </block>
3693 + <block>
3694 + <key>dtv_dvbt_convolutional_interleaver</key>
3695 + <param>
3696 + <key>alias</key>
3697 + <value></value>
3698 + </param>
3699 + <param>
3700 + <key>blocks</key>
3701 + <value>136</value>
3702 + </param>
3703 + <param>
3704 + <key>comment</key>
3705 + <value></value>
3706 + </param>
3707 + <param>
3708 + <key>affinity</key>
3709 + <value></value>
3710 + </param>
3711 + <param>
3712 + <key>M</key>
3713 + <value>17</value>
3714 + </param>
3715 + <param>
3716 + <key>_enabled</key>
3717 + <value>True</value>
3718 + </param>
3719 + <param>
3720 + <key>_coordinate</key>
3721 + <value>(784, 84)</value>
3722 + </param>
3723 + <param>
3724 + <key>_rotation</key>
3725 + <value>0</value>
3726 + </param>
3727 + <param>
3728 + <key>id</key>
3729 + <value>dtv_dvbt_convolutional_interleaver_0</value>
3730 + </param>
3731 + <param>
3732 + <key>maxoutbuf</key>
3733 + <value>0</value>
3734 + </param>
3735 + <param>
3736 + <key>minoutbuf</key>
3737 + <value>0</value>
3738 + </param>
3739 + <param>
3740 + <key>I</key>
3741 + <value>12</value>
3742 + </param>
3743 + </block>
3744 + <block>
3745 + <key>dtv_dvbt_energy_dispersal</key>
3746 + <param>
3747 + <key>alias</key>
3748 + <value></value>
3749 + </param>
3750 + <param>
3751 + <key>nsize</key>
3752 + <value>1</value>
3753 + </param>
3754 + <param>
3755 + <key>comment</key>
3756 + <value></value>
3757 + </param>
3758 + <param>
3759 + <key>affinity</key>
3760 + <value></value>
3761 + </param>
3762 + <param>
3763 + <key>_enabled</key>
3764 + <value>True</value>
3765 + </param>
3766 + <param>
3767 + <key>_coordinate</key>
3768 + <value>(280, 104)</value>
3769 + </param>
3770 + <param>
3771 + <key>_rotation</key>
3772 + <value>0</value>
3773 + </param>
3774 + <param>
3775 + <key>id</key>
3776 + <value>dtv_dvbt_energy_dispersal_0</value>
3777 + </param>
3778 + <param>
3779 + <key>maxoutbuf</key>
3780 + <value>0</value>
3781 + </param>
3782 + <param>
3783 + <key>minoutbuf</key>
3784 + <value>0</value>
3785 + </param>
3786 + </block>
3787 + <block>
3788 + <key>dtv_dvbt_inner_coder</key>
3789 + <param>
3790 + <key>alias</key>
3791 + <value></value>
3792 + </param>
3793 + <param>
3794 + <key>code_rate</key>
3795 + <value>C2_3</value>
3796 + </param>
3797 + <param>
3798 + <key>comment</key>
3799 + <value></value>
3800 + </param>
3801 + <param>
3802 + <key>constellation</key>
3803 + <value>64qam</value>
3804 + </param>
3805 + <param>
3806 + <key>affinity</key>
3807 + <value></value>
3808 + </param>
3809 + <param>
3810 + <key>_enabled</key>
3811 + <value>True</value>
3812 + </param>
3813 + <param>
3814 + <key>_coordinate</key>
3815 + <value>(1040, 80)</value>
3816 + </param>
3817 + <param>
3818 + <key>_rotation</key>
3819 + <value>0</value>
3820 + </param>
3821 + <param>
3822 + <key>hierarchy</key>
3823 + <value>nh</value>
3824 + </param>
3825 + <param>
3826 + <key>id</key>
3827 + <value>dtv_dvbt_inner_coder_0</value>
3828 + </param>
3829 + <param>
3830 + <key>ninput</key>
3831 + <value>1</value>
3832 + </param>
3833 + <param>
3834 + <key>maxoutbuf</key>
3835 + <value>0</value>
3836 + </param>
3837 + <param>
3838 + <key>minoutbuf</key>
3839 + <value>0</value>
3840 + </param>
3841 + <param>
3842 + <key>noutput</key>
3843 + <value>1512</value>
3844 + </param>
3845 + </block>
3846 + <block>
3847 + <key>dtv_dvbt_map</key>
3848 + <param>
3849 + <key>alias</key>
3850 + <value></value>
3851 + </param>
3852 + <param>
3853 + <key>comment</key>
3854 + <value></value>
3855 + </param>
3856 + <param>
3857 + <key>constellation</key>
3858 + <value>64qam</value>
3859 + </param>
3860 + <param>
3861 + <key>affinity</key>
3862 + <value></value>
3863 + </param>
3864 + <param>
3865 + <key>_enabled</key>
3866 + <value>True</value>
3867 + </param>
3868 + <param>
3869 + <key>_coordinate</key>
3870 + <value>(464, 192)</value>
3871 + </param>
3872 + <param>
3873 + <key>_rotation</key>
3874 + <value>180</value>
3875 + </param>
3876 + <param>
3877 + <key>gain</key>
3878 + <value>1</value>
3879 + </param>
3880 + <param>
3881 + <key>hierarchy</key>
3882 + <value>nh</value>
3883 + </param>
3884 + <param>
3885 + <key>id</key>
3886 + <value>dtv_dvbt_map_0</value>
3887 + </param>
3888 + <param>
3889 + <key>maxoutbuf</key>
3890 + <value>0</value>
3891 + </param>
3892 + <param>
3893 + <key>minoutbuf</key>
3894 + <value>0</value>
3895 + </param>
3896 + <param>
3897 + <key>transmission_mode</key>
3898 + <value>T2k</value>
3899 + </param>
3900 + </block>
3901 + <block>
3902 + <key>dtv_dvbt_reed_solomon_enc</key>
3903 + <param>
3904 + <key>alias</key>
3905 + <value></value>
3906 + </param>
3907 + <param>
3908 + <key>blocks</key>
3909 + <value>8</value>
3910 + </param>
3911 + <param>
3912 + <key>comment</key>
3913 + <value></value>
3914 + </param>
3915 + <param>
3916 + <key>affinity</key>
3917 + <value></value>
3918 + </param>
3919 + <param>
3920 + <key>_enabled</key>
3921 + <value>True</value>
3922 + </param>
3923 + <param>
3924 + <key>gfpoly</key>
3925 + <value>0x11d</value>
3926 + </param>
3927 + <param>
3928 + <key>_coordinate</key>
3929 + <value>(496, 56)</value>
3930 + </param>
3931 + <param>
3932 + <key>_rotation</key>
3933 + <value>0</value>
3934 + </param>
3935 + <param>
3936 + <key>id</key>
3937 + <value>dtv_dvbt_reed_solomon_enc_0</value>
3938 + </param>
3939 + <param>
3940 + <key>k</key>
3941 + <value>239</value>
3942 + </param>
3943 + <param>
3944 + <key>maxoutbuf</key>
3945 + <value>0</value>
3946 + </param>
3947 + <param>
3948 + <key>minoutbuf</key>
3949 + <value>0</value>
3950 + </param>
3951 + <param>
3952 + <key>n</key>
3953 + <value>255</value>
3954 + </param>
3955 + <param>
3956 + <key>s</key>
3957 + <value>51</value>
3958 + </param>
3959 + <param>
3960 + <key>m</key>
3961 + <value>8</value>
3962 + </param>
3963 + <param>
3964 + <key>p</key>
3965 + <value>2</value>
3966 + </param>
3967 + <param>
3968 + <key>t</key>
3969 + <value>8</value>
3970 + </param>
3971 + </block>
3972 + <block>
3973 + <key>dtv_dvbt_reference_signals</key>
3974 + <param>
3975 + <key>alias</key>
3976 + <value></value>
3977 + </param>
3978 + <param>
3979 + <key>cell_id</key>
3980 + <value>0</value>
3981 + </param>
3982 + <param>
3983 + <key>code_rate_hp</key>
3984 + <value>C2_3</value>
3985 + </param>
3986 + <param>
3987 + <key>code_rate_lp</key>
3988 + <value>C2_3</value>
3989 + </param>
3990 + <param>
3991 + <key>comment</key>
3992 + <value></value>
3993 + </param>
3994 + <param>
3995 + <key>constellation</key>
3996 + <value>64qam</value>
3997 + </param>
3998 + <param>
3999 + <key>affinity</key>
4000 + <value></value>
4001 + </param>
4002 + <param>
4003 + <key>_enabled</key>
4004 + <value>True</value>
4005 + </param>
4006 + <param>
4007 + <key>_coordinate</key>
4008 + <value>(184, 156)</value>
4009 + </param>
4010 + <param>
4011 + <key>_rotation</key>
4012 + <value>180</value>
4013 + </param>
4014 + <param>
4015 + <key>guard_interval</key>
4016 + <value>GI_1_32</value>
4017 + </param>
4018 + <param>
4019 + <key>hierarchy</key>
4020 + <value>nh</value>
4021 + </param>
4022 + <param>
4023 + <key>id</key>
4024 + <value>dtv_dvbt_reference_signals_0</value>
4025 + </param>
4026 + <param>
4027 + <key>type</key>
4028 + <value>complex</value>
4029 + </param>
4030 + <param>
4031 + <key>include_cell_id</key>
4032 + <value>call_id_yes</value>
4033 + </param>
4034 + <param>
4035 + <key>maxoutbuf</key>
4036 + <value>0</value>
4037 + </param>
4038 + <param>
4039 + <key>minoutbuf</key>
4040 + <value>0</value>
4041 + </param>
4042 + <param>
4043 + <key>transmission_mode</key>
4044 + <value>T2k</value>
4045 + </param>
4046 + </block>
4047 + <block>
4048 + <key>dtv_dvbt_symbol_inner_interleaver</key>
4049 + <param>
4050 + <key>alias</key>
4051 + <value></value>
4052 + </param>
4053 + <param>
4054 + <key>comment</key>
4055 + <value></value>
4056 + </param>
4057 + <param>
4058 + <key>affinity</key>
4059 + <value></value>
4060 + </param>
4061 + <param>
4062 + <key>direction</key>
4063 + <value>Interleave</value>
4064 + </param>
4065 + <param>
4066 + <key>_enabled</key>
4067 + <value>True</value>
4068 + </param>
4069 + <param>
4070 + <key>_coordinate</key>
4071 + <value>(792, 204)</value>
4072 + </param>
4073 + <param>
4074 + <key>_rotation</key>
4075 + <value>180</value>
4076 + </param>
4077 + <param>
4078 + <key>id</key>
4079 + <value>dtv_dvbt_symbol_inner_interleaver_0</value>
4080 + </param>
4081 + <param>
4082 + <key>maxoutbuf</key>
4083 + <value>0</value>
4084 + </param>
4085 + <param>
4086 + <key>minoutbuf</key>
4087 + <value>0</value>
4088 + </param>
4089 + <param>
4090 + <key>transmission_mode</key>
4091 + <value>T2k</value>
4092 + </param>
4093 + </block>
4094 + <block>
4095 + <key>fft_vxx</key>
4096 + <param>
4097 + <key>alias</key>
4098 + <value></value>
4099 + </param>
4100 + <param>
4101 + <key>comment</key>
4102 + <value></value>
4103 + </param>
4104 + <param>
4105 + <key>affinity</key>
4106 + <value></value>
4107 + </param>
4108 + <param>
4109 + <key>_enabled</key>
4110 + <value>True</value>
4111 + </param>
4112 + <param>
4113 + <key>fft_size</key>
4114 + <value>2048</value>
4115 + </param>
4116 + <param>
4117 + <key>forward</key>
4118 + <value>False</value>
4119 + </param>
4120 + <param>
4121 + <key>_coordinate</key>
4122 + <value>(104, 392)</value>
4123 + </param>
4124 + <param>
4125 + <key>_rotation</key>
4126 + <value>0</value>
4127 + </param>
4128 + <param>
4129 + <key>id</key>
4130 + <value>fft_vxx_0</value>
4131 + </param>
4132 + <param>
4133 + <key>type</key>
4134 + <value>complex</value>
4135 + </param>
4136 + <param>
4137 + <key>maxoutbuf</key>
4138 + <value>0</value>
4139 + </param>
4140 + <param>
4141 + <key>minoutbuf</key>
4142 + <value>0</value>
4143 + </param>
4144 + <param>
4145 + <key>nthreads</key>
4146 + <value>1</value>
4147 + </param>
4148 + <param>
4149 + <key>shift</key>
4150 + <value>True</value>
4151 + </param>
4152 + <param>
4153 + <key>window</key>
4154 + <value>window.rectangular(2048)</value>
4155 + </param>
4156 + </block>
4157 + <block>
4158 + <key>limesdr_sink</key>
4159 + <param>
4160 + <key>alias</key>
4161 + <value></value>
4162 + </param>
4163 + <param>
4164 + <key>analog_bandw_ch0</key>
4165 + <value>0</value>
4166 + </param>
4167 + <param>
4168 + <key>calibr_bandw_ch0</key>
4169 + <value>0</value>
4170 + </param>
4171 + <param>
4172 + <key>digital_bandw_ch0</key>
4173 + <value>0</value>
4174 + </param>
4175 + <param>
4176 + <key>gain_dB_ch0</key>
4177 + <value>60</value>
4178 + </param>
4179 + <param>
4180 + <key>nco_freq_ch0</key>
4181 + <value>0</value>
4182 + </param>
4183 + <param>
4184 + <key>pa_path_ch0</key>
4185 + <value>1</value>
4186 + </param>
4187 + <param>
4188 + <key>analog_bandw_ch1</key>
4189 + <value>0</value>
4190 + </param>
4191 + <param>
4192 + <key>calibr_bandw_ch1</key>
4193 + <value>0</value>
4194 + </param>
4195 + <param>
4196 + <key>digital_bandw_ch1</key>
4197 + <value>0</value>
4198 + </param>
4199 + <param>
4200 + <key>gain_dB_ch1</key>
4201 + <value>60</value>
4202 + </param>
4203 + <param>
4204 + <key>nco_freq_ch1</key>
4205 + <value>0</value>
4206 + </param>
4207 + <param>
4208 + <key>pa_path_ch1</key>
4209 + <value>1</value>
4210 + </param>
4211 + <param>
4212 + <key>channel_mode</key>
4213 + <value>0</value>
4214 + </param>
4215 + <param>
4216 + <key>comment</key>
4217 + <value></value>
4218 + </param>
4219 + <param>
4220 + <key>affinity</key>
4221 + <value></value>
4222 + </param>
4223 + <param>
4224 + <key>serial</key>
4225 + <value></value>
4226 + </param>
4227 + <param>
4228 + <key>_enabled</key>
4229 + <value>True</value>
4230 + </param>
4231 + <param>
4232 + <key>filename</key>
4233 + <value></value>
4234 + </param>
4235 + <param>
4236 + <key>_coordinate</key>
4237 + <value>(920, 300)</value>
4238 + </param>
4239 + <param>
4240 + <key>_rotation</key>
4241 + <value>0</value>
4242 + </param>
4243 + <param>
4244 + <key>id</key>
4245 + <value>limesdr_sink_0</value>
4246 + </param>
4247 + <param>
4248 + <key>length_tag_name</key>
4249 + <value></value>
4250 + </param>
4251 + <param>
4252 + <key>oversample</key>
4253 + <value>0</value>
4254 + </param>
4255 + <param>
4256 + <key>rf_freq</key>
4257 + <value>center_freq</value>
4258 + </param>
4259 + <param>
4260 + <key>samp_rate</key>
4261 + <value>samp_rate</value>
4262 + </param>
4263 + </block>
4264 + <block>
4265 + <key>qtgui_const_sink_x</key>
4266 + <param>
4267 + <key>autoscale</key>
4268 + <value>False</value>
4269 + </param>
4270 + <param>
4271 + <key>axislabels</key>
4272 + <value>True</value>
4273 + </param>
4274 + <param>
4275 + <key>alias</key>
4276 + <value></value>
4277 + </param>
4278 + <param>
4279 + <key>comment</key>
4280 + <value></value>
4281 + </param>
4282 + <param>
4283 + <key>affinity</key>
4284 + <value></value>
4285 + </param>
4286 + <param>
4287 + <key>_enabled</key>
4288 + <value>True</value>
4289 + </param>
4290 + <param>
4291 + <key>_coordinate</key>
4292 + <value>(376, 324)</value>
4293 + </param>
4294 + <param>
4295 + <key>gui_hint</key>
4296 + <value></value>
4297 + </param>
4298 + <param>
4299 + <key>_rotation</key>
4300 + <value>0</value>
4301 + </param>
4302 + <param>
4303 + <key>grid</key>
4304 + <value>False</value>
4305 + </param>
4306 + <param>
4307 + <key>id</key>
4308 + <value>qtgui_const_sink_x_0</value>
4309 + </param>
4310 + <param>
4311 + <key>legend</key>
4312 + <value>True</value>
4313 + </param>
4314 + <param>
4315 + <key>alpha1</key>
4316 + <value>1.0</value>
4317 + </param>
4318 + <param>
4319 + <key>color1</key>
4320 + <value>"blue"</value>
4321 + </param>
4322 + <param>
4323 + <key>label1</key>
4324 + <value></value>
4325 + </param>
4326 + <param>
4327 + <key>marker1</key>
4328 + <value>0</value>
4329 + </param>
4330 + <param>
4331 + <key>style1</key>
4332 + <value>0</value>
4333 + </param>
4334 + <param>
4335 + <key>width1</key>
4336 + <value>1</value>
4337 + </param>
4338 + <param>
4339 + <key>alpha10</key>
4340 + <value>1.0</value>
4341 + </param>
4342 + <param>
4343 + <key>color10</key>
4344 + <value>"red"</value>
4345 + </param>
4346 + <param>
4347 + <key>label10</key>
4348 + <value></value>
4349 + </param>
4350 + <param>
4351 + <key>marker10</key>
4352 + <value>0</value>
4353 + </param>
4354 + <param>
4355 + <key>style10</key>
4356 + <value>0</value>
4357 + </param>
4358 + <param>
4359 + <key>width10</key>
4360 + <value>1</value>
4361 + </param>
4362 + <param>
4363 + <key>alpha2</key>
4364 + <value>1.0</value>
4365 + </param>
4366 + <param>
4367 + <key>color2</key>
4368 + <value>"red"</value>
4369 + </param>
4370 + <param>
4371 + <key>label2</key>
4372 + <value></value>
4373 + </param>
4374 + <param>
4375 + <key>marker2</key>
4376 + <value>0</value>
4377 + </param>
4378 + <param>
4379 + <key>style2</key>
4380 + <value>0</value>
4381 + </param>
4382 + <param>
4383 + <key>width2</key>
4384 + <value>1</value>
4385 + </param>
4386 + <param>
4387 + <key>alpha3</key>
4388 + <value>1.0</value>
4389 + </param>
4390 + <param>
4391 + <key>color3</key>
4392 + <value>"red"</value>
4393 + </param>
4394 + <param>
4395 + <key>label3</key>
4396 + <value></value>
4397 + </param>
4398 + <param>
4399 + <key>marker3</key>
4400 + <value>0</value>
4401 + </param>
4402 + <param>
4403 + <key>style3</key>
4404 + <value>0</value>
4405 + </param>
4406 + <param>
4407 + <key>width3</key>
4408 + <value>1</value>
4409 + </param>
4410 + <param>
4411 + <key>alpha4</key>
4412 + <value>1.0</value>
4413 + </param>
4414 + <param>
4415 + <key>color4</key>
4416 + <value>"red"</value>
4417 + </param>
4418 + <param>
4419 + <key>label4</key>
4420 + <value></value>
4421 + </param>
4422 + <param>
4423 + <key>marker4</key>
4424 + <value>0</value>
4425 + </param>
4426 + <param>
4427 + <key>style4</key>
4428 + <value>0</value>
4429 + </param>
4430 + <param>
4431 + <key>width4</key>
4432 + <value>1</value>
4433 + </param>
4434 + <param>
4435 + <key>alpha5</key>
4436 + <value>1.0</value>
4437 + </param>
4438 + <param>
4439 + <key>color5</key>
4440 + <value>"red"</value>
4441 + </param>
4442 + <param>
4443 + <key>label5</key>
4444 + <value></value>
4445 + </param>
4446 + <param>
4447 + <key>marker5</key>
4448 + <value>0</value>
4449 + </param>
4450 + <param>
4451 + <key>style5</key>
4452 + <value>0</value>
4453 + </param>
4454 + <param>
4455 + <key>width5</key>
4456 + <value>1</value>
4457 + </param>
4458 + <param>
4459 + <key>alpha6</key>
4460 + <value>1.0</value>
4461 + </param>
4462 + <param>
4463 + <key>color6</key>
4464 + <value>"red"</value>
4465 + </param>
4466 + <param>
4467 + <key>label6</key>
4468 + <value></value>
4469 + </param>
4470 + <param>
4471 + <key>marker6</key>
4472 + <value>0</value>
4473 + </param>
4474 + <param>
4475 + <key>style6</key>
4476 + <value>0</value>
4477 + </param>
4478 + <param>
4479 + <key>width6</key>
4480 + <value>1</value>
4481 + </param>
4482 + <param>
4483 + <key>alpha7</key>
4484 + <value>1.0</value>
4485 + </param>
4486 + <param>
4487 + <key>color7</key>
4488 + <value>"red"</value>
4489 + </param>
4490 + <param>
4491 + <key>label7</key>
4492 + <value></value>
4493 + </param>
4494 + <param>
4495 + <key>marker7</key>
4496 + <value>0</value>
4497 + </param>
4498 + <param>
4499 + <key>style7</key>
4500 + <value>0</value>
4501 + </param>
4502 + <param>
4503 + <key>width7</key>
4504 + <value>1</value>
4505 + </param>
4506 + <param>
4507 + <key>alpha8</key>
4508 + <value>1.0</value>
4509 + </param>
4510 + <param>
4511 + <key>color8</key>
4512 + <value>"red"</value>
4513 + </param>
4514 + <param>
4515 + <key>label8</key>
4516 + <value></value>
4517 + </param>
4518 + <param>
4519 + <key>marker8</key>
4520 + <value>0</value>
4521 + </param>
4522 + <param>
4523 + <key>style8</key>
4524 + <value>0</value>
4525 + </param>
4526 + <param>
4527 + <key>width8</key>
4528 + <value>1</value>
4529 + </param>
4530 + <param>
4531 + <key>alpha9</key>
4532 + <value>1.0</value>
4533 + </param>
4534 + <param>
4535 + <key>color9</key>
4536 + <value>"red"</value>
4537 + </param>
4538 + <param>
4539 + <key>label9</key>
4540 + <value></value>
4541 + </param>
4542 + <param>
4543 + <key>marker9</key>
4544 + <value>0</value>
4545 + </param>
4546 + <param>
4547 + <key>style9</key>
4548 + <value>0</value>
4549 + </param>
4550 + <param>
4551 + <key>width9</key>
4552 + <value>1</value>
4553 + </param>
4554 + <param>
4555 + <key>name</key>
4556 + <value>""</value>
4557 + </param>
4558 + <param>
4559 + <key>nconnections</key>
4560 + <value>1</value>
4561 + </param>
4562 + <param>
4563 + <key>size</key>
4564 + <value>1024</value>
4565 + </param>
4566 + <param>
4567 + <key>tr_chan</key>
4568 + <value>0</value>
4569 + </param>
4570 + <param>
4571 + <key>tr_level</key>
4572 + <value>0.0</value>
4573 + </param>
4574 + <param>
4575 + <key>tr_mode</key>
4576 + <value>qtgui.TRIG_MODE_FREE</value>
4577 + </param>
4578 + <param>
4579 + <key>tr_slope</key>
4580 + <value>qtgui.TRIG_SLOPE_POS</value>
4581 + </param>
4582 + <param>
4583 + <key>tr_tag</key>
4584 + <value>""</value>
4585 + </param>
4586 + <param>
4587 + <key>type</key>
4588 + <value>complex</value>
4589 + </param>
4590 + <param>
4591 + <key>update_time</key>
4592 + <value>0.10</value>
4593 + </param>
4594 + <param>
4595 + <key>xmax</key>
4596 + <value>2</value>
4597 + </param>
4598 + <param>
4599 + <key>xmin</key>
4600 + <value>-2</value>
4601 + </param>
4602 + <param>
4603 + <key>ymax</key>
4604 + <value>2</value>
4605 + </param>
4606 + <param>
4607 + <key>ymin</key>
4608 + <value>-2</value>
4609 + </param>
4610 + </block>
4611 + <connection>
4612 + <source_block_id>blocks_file_source_0</source_block_id>
4613 + <sink_block_id>dtv_dvbt_energy_dispersal_0</sink_block_id>
4614 + <source_key>0</source_key>
4615 + <sink_key>0</sink_key>
4616 + </connection>
4617 + <connection>
4618 + <source_block_id>blocks_multiply_const_xx_0</source_block_id>
4619 + <sink_block_id>limesdr_sink_0</sink_block_id>
4620 + <source_key>0</source_key>
4621 + <sink_key>0</sink_key>
4622 + </connection>
4623 + <connection>
4624 + <source_block_id>blocks_vector_to_stream_0</source_block_id>
4625 + <sink_block_id>qtgui_const_sink_x_0</sink_block_id>
4626 + <source_key>0</source_key>
4627 + <sink_key>0</sink_key>
4628 + </connection>
4629 + <connection>
4630 + <source_block_id>digital_ofdm_cyclic_prefixer_0</source_block_id>
4631 + <sink_block_id>blocks_multiply_const_xx_0</sink_block_id>
4632 + <source_key>0</source_key>
4633 + <sink_key>0</sink_key>
4634 + </connection>
4635 + <connection>
4636 + <source_block_id>dtv_dvbt_bit_inner_interleaver_0</source_block_id>
4637 + <sink_block_id>dtv_dvbt_symbol_inner_interleaver_0</sink_block_id>
4638 + <source_key>0</source_key>
4639 + <sink_key>0</sink_key>
4640 + </connection>
4641 + <connection>
4642 + <source_block_id>dtv_dvbt_convolutional_interleaver_0</source_block_id>
4643 + <sink_block_id>dtv_dvbt_inner_coder_0</sink_block_id>
4644 + <source_key>0</source_key>
4645 + <sink_key>0</sink_key>
4646 + </connection>
4647 + <connection>
4648 + <source_block_id>dtv_dvbt_energy_dispersal_0</source_block_id>
4649 + <sink_block_id>dtv_dvbt_reed_solomon_enc_0</sink_block_id>
4650 + <source_key>0</source_key>
4651 + <sink_key>0</sink_key>
4652 + </connection>
4653 + <connection>
4654 + <source_block_id>dtv_dvbt_inner_coder_0</source_block_id>
4655 + <sink_block_id>dtv_dvbt_bit_inner_interleaver_0</sink_block_id>
4656 + <source_key>0</source_key>
4657 + <sink_key>0</sink_key>
4658 + </connection>
4659 + <connection>
4660 + <source_block_id>dtv_dvbt_map_0</source_block_id>
4661 + <sink_block_id>dtv_dvbt_reference_signals_0</sink_block_id>
4662 + <source_key>0</source_key>
4663 + <sink_key>0</sink_key>
4664 + </connection>
4665 + <connection>
4666 + <source_block_id>dtv_dvbt_reed_solomon_enc_0</source_block_id>
4667 + <sink_block_id>dtv_dvbt_convolutional_interleaver_0</sink_block_id>
4668 + <source_key>0</source_key>
4669 + <sink_key>0</sink_key>
4670 + </connection>
4671 + <connection>
4672 + <source_block_id>dtv_dvbt_reference_signals_0</source_block_id>
4673 + <sink_block_id>blocks_vector_to_stream_0</sink_block_id>
4674 + <source_key>0</source_key>
4675 + <sink_key>0</sink_key>
4676 + </connection>
4677 + <connection>
4678 + <source_block_id>dtv_dvbt_reference_signals_0</source_block_id>
4679 + <sink_block_id>fft_vxx_0</sink_block_id>
4680 + <source_key>0</source_key>
4681 + <sink_key>0</sink_key>
4682 + </connection>
4683 + <connection>
4684 + <source_block_id>dtv_dvbt_symbol_inner_interleaver_0</source_block_id>
4685 + <sink_block_id>dtv_dvbt_map_0</sink_block_id>
4686 + <source_key>0</source_key>
4687 + <sink_key>0</sink_key>
4688 + </connection>
4689 + <connection>
4690 + <source_block_id>fft_vxx_0</source_block_id>
4691 + <sink_block_id>digital_ofdm_cyclic_prefixer_0</sink_block_id>
4692 + <source_key>0</source_key>
4693 + <sink_key>0</sink_key>
4694 + </connection>
4695 +</flow_graph>
4696 diff --git a/examples/FM_RDS.grc b/examples/FM_RDS.grc
4697 new file mode 100644
4698 index 0000000..04b9288
4699 --- /dev/null
4700 +++ b/examples/FM_RDS.grc
4701 @@ -0,0 +1,3510 @@
4702 +<?xml version='1.0' encoding='utf-8'?>
4703 +<?grc format='1' created='3.7.13'?>
4704 +<flow_graph>
4705 + <timestamp>Thu Aug 28 08:24:49 2014</timestamp>
4706 + <block>
4707 + <key>options</key>
4708 + <param>
4709 + <key>author</key>
4710 + <value>Lime Microsystems</value>
4711 + </param>
4712 + <param>
4713 + <key>window_size</key>
4714 + <value>4096,4096</value>
4715 + </param>
4716 + <param>
4717 + <key>category</key>
4718 + <value>Custom</value>
4719 + </param>
4720 + <param>
4721 + <key>comment</key>
4722 + <value></value>
4723 + </param>
4724 + <param>
4725 + <key>description</key>
4726 + <value></value>
4727 + </param>
4728 + <param>
4729 + <key>_enabled</key>
4730 + <value>True</value>
4731 + </param>
4732 + <param>
4733 + <key>_coordinate</key>
4734 + <value>(14, 9)</value>
4735 + </param>
4736 + <param>
4737 + <key>_rotation</key>
4738 + <value>0</value>
4739 + </param>
4740 + <param>
4741 + <key>generate_options</key>
4742 + <value>wx_gui</value>
4743 + </param>
4744 + <param>
4745 + <key>hier_block_src_path</key>
4746 + <value>.:</value>
4747 + </param>
4748 + <param>
4749 + <key>id</key>
4750 + <value>rds_rx</value>
4751 + </param>
4752 + <param>
4753 + <key>max_nouts</key>
4754 + <value>0</value>
4755 + </param>
4756 + <param>
4757 + <key>qt_qss_theme</key>
4758 + <value></value>
4759 + </param>
4760 + <param>
4761 + <key>realtime_scheduling</key>
4762 + <value></value>
4763 + </param>
4764 + <param>
4765 + <key>run_command</key>
4766 + <value>{python} -u {filename}</value>
4767 + </param>
4768 + <param>
4769 + <key>run_options</key>
4770 + <value>prompt</value>
4771 + </param>
4772 + <param>
4773 + <key>run</key>
4774 + <value>True</value>
4775 + </param>
4776 + <param>
4777 + <key>sizing_mode</key>
4778 + <value>fixed</value>
4779 + </param>
4780 + <param>
4781 + <key>thread_safe_setters</key>
4782 + <value></value>
4783 + </param>
4784 + <param>
4785 + <key>title</key>
4786 + <value>FM RDS receiver</value>
4787 + </param>
4788 + <param>
4789 + <key>placement</key>
4790 + <value>(0,0)</value>
4791 + </param>
4792 + </block>
4793 + <block>
4794 + <key>variable</key>
4795 + <param>
4796 + <key>comment</key>
4797 + <value></value>
4798 + </param>
4799 + <param>
4800 + <key>_enabled</key>
4801 + <value>True</value>
4802 + </param>
4803 + <param>
4804 + <key>_coordinate</key>
4805 + <value>(560, 4)</value>
4806 + </param>
4807 + <param>
4808 + <key>_rotation</key>
4809 + <value>0</value>
4810 + </param>
4811 + <param>
4812 + <key>id</key>
4813 + <value>audio_decim</value>
4814 + </param>
4815 + <param>
4816 + <key>value</key>
4817 + <value>5</value>
4818 + </param>
4819 + </block>
4820 + <block>
4821 + <key>variable</key>
4822 + <param>
4823 + <key>comment</key>
4824 + <value></value>
4825 + </param>
4826 + <param>
4827 + <key>_enabled</key>
4828 + <value>True</value>
4829 + </param>
4830 + <param>
4831 + <key>_coordinate</key>
4832 + <value>(368, 1380)</value>
4833 + </param>
4834 + <param>
4835 + <key>_rotation</key>
4836 + <value>0</value>
4837 + </param>
4838 + <param>
4839 + <key>id</key>
4840 + <value>audio_decim_rate</value>
4841 + </param>
4842 + <param>
4843 + <key>value</key>
4844 + <value>baseband_rate/audio_decim</value>
4845 + </param>
4846 + </block>
4847 + <block>
4848 + <key>variable</key>
4849 + <param>
4850 + <key>comment</key>
4851 + <value></value>
4852 + </param>
4853 + <param>
4854 + <key>_enabled</key>
4855 + <value>True</value>
4856 + </param>
4857 + <param>
4858 + <key>_coordinate</key>
4859 + <value>(272, 1380)</value>
4860 + </param>
4861 + <param>
4862 + <key>_rotation</key>
4863 + <value>0</value>
4864 + </param>
4865 + <param>
4866 + <key>id</key>
4867 + <value>audio_rate</value>
4868 + </param>
4869 + <param>
4870 + <key>value</key>
4871 + <value>48000</value>
4872 + </param>
4873 + </block>
4874 + <block>
4875 + <key>variable</key>
4876 + <param>
4877 + <key>comment</key>
4878 + <value></value>
4879 + </param>
4880 + <param>
4881 + <key>_enabled</key>
4882 + <value>True</value>
4883 + </param>
4884 + <param>
4885 + <key>_coordinate</key>
4886 + <value>(448, 4)</value>
4887 + </param>
4888 + <param>
4889 + <key>_rotation</key>
4890 + <value>0</value>
4891 + </param>
4892 + <param>
4893 + <key>id</key>
4894 + <value>baseband_rate</value>
4895 + </param>
4896 + <param>
4897 + <key>value</key>
4898 + <value>samp_rate/bb_decim</value>
4899 + </param>
4900 + </block>
4901 + <block>
4902 + <key>variable</key>
4903 + <param>
4904 + <key>comment</key>
4905 + <value></value>
4906 + </param>
4907 + <param>
4908 + <key>_enabled</key>
4909 + <value>True</value>
4910 + </param>
4911 + <param>
4912 + <key>_coordinate</key>
4913 + <value>(664, 4)</value>
4914 + </param>
4915 + <param>
4916 + <key>_rotation</key>
4917 + <value>0</value>
4918 + </param>
4919 + <param>
4920 + <key>id</key>
4921 + <value>bb_decim</value>
4922 + </param>
4923 + <param>
4924 + <key>value</key>
4925 + <value>4</value>
4926 + </param>
4927 + </block>
4928 + <block>
4929 + <key>variable_slider</key>
4930 + <param>
4931 + <key>comment</key>
4932 + <value></value>
4933 + </param>
4934 + <param>
4935 + <key>converver</key>
4936 + <value>float_converter</value>
4937 + </param>
4938 + <param>
4939 + <key>value</key>
4940 + <value>100.1e6</value>
4941 + </param>
4942 + <param>
4943 + <key>_enabled</key>
4944 + <value>True</value>
4945 + </param>
4946 + <param>
4947 + <key>_coordinate</key>
4948 + <value>(1360, 16)</value>
4949 + </param>
4950 + <param>
4951 + <key>_rotation</key>
4952 + <value>0</value>
4953 + </param>
4954 + <param>
4955 + <key>grid_pos</key>
4956 + <value>(1,0,1,2)</value>
4957 + </param>
4958 + <param>
4959 + <key>id</key>
4960 + <value>freq</value>
4961 + </param>
4962 + <param>
4963 + <key>label</key>
4964 + <value>Frequency</value>
4965 + </param>
4966 + <param>
4967 + <key>max</key>
4968 + <value>108e6</value>
4969 + </param>
4970 + <param>
4971 + <key>min</key>
4972 + <value>88e6</value>
4973 + </param>
4974 + <param>
4975 + <key>notebook</key>
4976 + <value></value>
4977 + </param>
4978 + <param>
4979 + <key>num_steps</key>
4980 + <value>1000</value>
4981 + </param>
4982 + <param>
4983 + <key>style</key>
4984 + <value>wx.SL_HORIZONTAL</value>
4985 + </param>
4986 + </block>
4987 + <block>
4988 + <key>variable_slider</key>
4989 + <param>
4990 + <key>comment</key>
4991 + <value></value>
4992 + </param>
4993 + <param>
4994 + <key>converver</key>
4995 + <value>int_converter</value>
4996 + </param>
4997 + <param>
4998 + <key>value</key>
4999 + <value>40</value>
5000 + </param>
5001 + <param>
5002 + <key>_enabled</key>
5003 + <value>True</value>
5004 + </param>
5005 + <param>
5006 + <key>_coordinate</key>
5007 + <value>(1216, 16)</value>
5008 + </param>
5009 + <param>
5010 + <key>_rotation</key>
5011 + <value>0</value>
5012 + </param>
5013 + <param>
5014 + <key>grid_pos</key>
5015 + <value>(0,0,1,1)</value>
5016 + </param>
5017 + <param>
5018 + <key>id</key>
5019 + <value>gain</value>
5020 + </param>
5021 + <param>
5022 + <key>label</key>
5023 + <value>RF Gain</value>
5024 + </param>
5025 + <param>
5026 + <key>max</key>
5027 + <value>70</value>
5028 + </param>
5029 + <param>
5030 + <key>min</key>
5031 + <value>0</value>
5032 + </param>
5033 + <param>
5034 + <key>notebook</key>
5035 + <value></value>
5036 + </param>
5037 + <param>
5038 + <key>num_steps</key>
5039 + <value>70</value>
5040 + </param>
5041 + <param>
5042 + <key>style</key>
5043 + <value>wx.SL_HORIZONTAL</value>
5044 + </param>
5045 + </block>
5046 + <block>
5047 + <key>variable</key>
5048 + <param>
5049 + <key>comment</key>
5050 + <value></value>
5051 + </param>
5052 + <param>
5053 + <key>_enabled</key>
5054 + <value>True</value>
5055 + </param>
5056 + <param>
5057 + <key>_coordinate</key>
5058 + <value>(344, 4)</value>
5059 + </param>
5060 + <param>
5061 + <key>_rotation</key>
5062 + <value>0</value>
5063 + </param>
5064 + <param>
5065 + <key>id</key>
5066 + <value>samp_rate</value>
5067 + </param>
5068 + <param>
5069 + <key>value</key>
5070 + <value>1000000</value>
5071 + </param>
5072 + </block>
5073 + <block>
5074 + <key>variable_slider</key>
5075 + <param>
5076 + <key>comment</key>
5077 + <value></value>
5078 + </param>
5079 + <param>
5080 + <key>converver</key>
5081 + <value>float_converter</value>
5082 + </param>
5083 + <param>
5084 + <key>value</key>
5085 + <value>0.5</value>
5086 + </param>
5087 + <param>
5088 + <key>_enabled</key>
5089 + <value>True</value>
5090 + </param>
5091 + <param>
5092 + <key>_coordinate</key>
5093 + <value>(1504, 16)</value>
5094 + </param>
5095 + <param>
5096 + <key>_rotation</key>
5097 + <value>0</value>
5098 + </param>
5099 + <param>
5100 + <key>grid_pos</key>
5101 + <value>(0,1,1,1)</value>
5102 + </param>
5103 + <param>
5104 + <key>id</key>
5105 + <value>volume</value>
5106 + </param>
5107 + <param>
5108 + <key>label</key>
5109 + <value>Volume</value>
5110 + </param>
5111 + <param>
5112 + <key>max</key>
5113 + <value>2</value>
5114 + </param>
5115 + <param>
5116 + <key>min</key>
5117 + <value>0</value>
5118 + </param>
5119 + <param>
5120 + <key>notebook</key>
5121 + <value></value>
5122 + </param>
5123 + <param>
5124 + <key>num_steps</key>
5125 + <value>51</value>
5126 + </param>
5127 + <param>
5128 + <key>style</key>
5129 + <value>wx.SL_HORIZONTAL</value>
5130 + </param>
5131 + </block>
5132 + <block>
5133 + <key>variable</key>
5134 + <param>
5135 + <key>comment</key>
5136 + <value></value>
5137 + </param>
5138 + <param>
5139 + <key>_enabled</key>
5140 + <value>True</value>
5141 + </param>
5142 + <param>
5143 + <key>_coordinate</key>
5144 + <value>(280, 308)</value>
5145 + </param>
5146 + <param>
5147 + <key>_rotation</key>
5148 + <value>0</value>
5149 + </param>
5150 + <param>
5151 + <key>id</key>
5152 + <value>xlate_bandwidth</value>
5153 + </param>
5154 + <param>
5155 + <key>value</key>
5156 + <value>100000</value>
5157 + </param>
5158 + </block>
5159 + <block>
5160 + <key>analog_fm_deemph</key>
5161 + <param>
5162 + <key>alias</key>
5163 + <value></value>
5164 + </param>
5165 + <param>
5166 + <key>comment</key>
5167 + <value></value>
5168 + </param>
5169 + <param>
5170 + <key>affinity</key>
5171 + <value></value>
5172 + </param>
5173 + <param>
5174 + <key>_enabled</key>
5175 + <value>True</value>
5176 + </param>
5177 + <param>
5178 + <key>_coordinate</key>
5179 + <value>(632, 1308)</value>
5180 + </param>
5181 + <param>
5182 + <key>_rotation</key>
5183 + <value>180</value>
5184 + </param>
5185 + <param>
5186 + <key>id</key>
5187 + <value>analog_fm_deemph_0_0</value>
5188 + </param>
5189 + <param>
5190 + <key>maxoutbuf</key>
5191 + <value>0</value>
5192 + </param>
5193 + <param>
5194 + <key>minoutbuf</key>
5195 + <value>0</value>
5196 + </param>
5197 + <param>
5198 + <key>samp_rate</key>
5199 + <value>audio_decim_rate</value>
5200 + </param>
5201 + <param>
5202 + <key>tau</key>
5203 + <value>75e-6</value>
5204 + </param>
5205 + </block>
5206 + <block>
5207 + <key>analog_fm_deemph</key>
5208 + <param>
5209 + <key>alias</key>
5210 + <value></value>
5211 + </param>
5212 + <param>
5213 + <key>comment</key>
5214 + <value></value>
5215 + </param>
5216 + <param>
5217 + <key>affinity</key>
5218 + <value></value>
5219 + </param>
5220 + <param>
5221 + <key>_enabled</key>
5222 + <value>True</value>
5223 + </param>
5224 + <param>
5225 + <key>_coordinate</key>
5226 + <value>(640, 1460)</value>
5227 + </param>
5228 + <param>
5229 + <key>_rotation</key>
5230 + <value>180</value>
5231 + </param>
5232 + <param>
5233 + <key>id</key>
5234 + <value>analog_fm_deemph_0_0_0</value>
5235 + </param>
5236 + <param>
5237 + <key>maxoutbuf</key>
5238 + <value>0</value>
5239 + </param>
5240 + <param>
5241 + <key>minoutbuf</key>
5242 + <value>0</value>
5243 + </param>
5244 + <param>
5245 + <key>samp_rate</key>
5246 + <value>audio_decim_rate</value>
5247 + </param>
5248 + <param>
5249 + <key>tau</key>
5250 + <value>75e-6</value>
5251 + </param>
5252 + </block>
5253 + <block>
5254 + <key>analog_pll_refout_cc</key>
5255 + <param>
5256 + <key>alias</key>
5257 + <value></value>
5258 + </param>
5259 + <param>
5260 + <key>comment</key>
5261 + <value></value>
5262 + </param>
5263 + <param>
5264 + <key>affinity</key>
5265 + <value></value>
5266 + </param>
5267 + <param>
5268 + <key>_enabled</key>
5269 + <value>True</value>
5270 + </param>
5271 + <param>
5272 + <key>_coordinate</key>
5273 + <value>(864, 532)</value>
5274 + </param>
5275 + <param>
5276 + <key>_rotation</key>
5277 + <value>0</value>
5278 + </param>
5279 + <param>
5280 + <key>id</key>
5281 + <value>analog_pll_refout_cc_0</value>
5282 + </param>
5283 + <param>
5284 + <key>w</key>
5285 + <value>0.001</value>
5286 + </param>
5287 + <param>
5288 + <key>max_freq</key>
5289 + <value>2 * math.pi * (19000+200) / baseband_rate</value>
5290 + </param>
5291 + <param>
5292 + <key>maxoutbuf</key>
5293 + <value>0</value>
5294 + </param>
5295 + <param>
5296 + <key>min_freq</key>
5297 + <value>2 * math.pi * (19000-200) / baseband_rate</value>
5298 + </param>
5299 + <param>
5300 + <key>minoutbuf</key>
5301 + <value>0</value>
5302 + </param>
5303 + </block>
5304 + <block>
5305 + <key>analog_wfm_rcv</key>
5306 + <param>
5307 + <key>audio_decimation</key>
5308 + <value>bb_decim</value>
5309 + </param>
5310 + <param>
5311 + <key>alias</key>
5312 + <value></value>
5313 + </param>
5314 + <param>
5315 + <key>comment</key>
5316 + <value></value>
5317 + </param>
5318 + <param>
5319 + <key>affinity</key>
5320 + <value></value>
5321 + </param>
5322 + <param>
5323 + <key>_enabled</key>
5324 + <value>True</value>
5325 + </param>
5326 + <param>
5327 + <key>_coordinate</key>
5328 + <value>(536, 380)</value>
5329 + </param>
5330 + <param>
5331 + <key>_rotation</key>
5332 + <value>0</value>
5333 + </param>
5334 + <param>
5335 + <key>id</key>
5336 + <value>analog_wfm_rcv_0</value>
5337 + </param>
5338 + <param>
5339 + <key>maxoutbuf</key>
5340 + <value>0</value>
5341 + </param>
5342 + <param>
5343 + <key>minoutbuf</key>
5344 + <value>0</value>
5345 + </param>
5346 + <param>
5347 + <key>quad_rate</key>
5348 + <value>samp_rate</value>
5349 + </param>
5350 + </block>
5351 + <block>
5352 + <key>audio_sink</key>
5353 + <param>
5354 + <key>alias</key>
5355 + <value></value>
5356 + </param>
5357 + <param>
5358 + <key>comment</key>
5359 + <value></value>
5360 + </param>
5361 + <param>
5362 + <key>affinity</key>
5363 + <value></value>
5364 + </param>
5365 + <param>
5366 + <key>device_name</key>
5367 + <value></value>
5368 + </param>
5369 + <param>
5370 + <key>_enabled</key>
5371 + <value>True</value>
5372 + </param>
5373 + <param>
5374 + <key>_coordinate</key>
5375 + <value>(48, 1352)</value>
5376 + </param>
5377 + <param>
5378 + <key>_rotation</key>
5379 + <value>180</value>
5380 + </param>
5381 + <param>
5382 + <key>id</key>
5383 + <value>audio_sink_0</value>
5384 + </param>
5385 + <param>
5386 + <key>num_inputs</key>
5387 + <value>2</value>
5388 + </param>
5389 + <param>
5390 + <key>ok_to_block</key>
5391 + <value>True</value>
5392 + </param>
5393 + <param>
5394 + <key>samp_rate</key>
5395 + <value>audio_rate</value>
5396 + </param>
5397 + </block>
5398 + <block>
5399 + <key>blocks_add_xx</key>
5400 + <param>
5401 + <key>alias</key>
5402 + <value></value>
5403 + </param>
5404 + <param>
5405 + <key>comment</key>
5406 + <value></value>
5407 + </param>
5408 + <param>
5409 + <key>affinity</key>
5410 + <value></value>
5411 + </param>
5412 + <param>
5413 + <key>_enabled</key>
5414 + <value>True</value>
5415 + </param>
5416 + <param>
5417 + <key>_coordinate</key>
5418 + <value>(824, 1456)</value>
5419 + </param>
5420 + <param>
5421 + <key>_rotation</key>
5422 + <value>180</value>
5423 + </param>
5424 + <param>
5425 + <key>id</key>
5426 + <value>blocks_add_xx_0</value>
5427 + </param>
5428 + <param>
5429 + <key>type</key>
5430 + <value>float</value>
5431 + </param>
5432 + <param>
5433 + <key>maxoutbuf</key>
5434 + <value>0</value>
5435 + </param>
5436 + <param>
5437 + <key>minoutbuf</key>
5438 + <value>0</value>
5439 + </param>
5440 + <param>
5441 + <key>num_inputs</key>
5442 + <value>2</value>
5443 + </param>
5444 + <param>
5445 + <key>vlen</key>
5446 + <value>1</value>
5447 + </param>
5448 + </block>
5449 + <block>
5450 + <key>blocks_complex_to_imag</key>
5451 + <param>
5452 + <key>alias</key>
5453 + <value></value>
5454 + </param>
5455 + <param>
5456 + <key>comment</key>
5457 + <value></value>
5458 + </param>
5459 + <param>
5460 + <key>affinity</key>
5461 + <value></value>
5462 + </param>
5463 + <param>
5464 + <key>_enabled</key>
5465 + <value>True</value>
5466 + </param>
5467 + <param>
5468 + <key>_coordinate</key>
5469 + <value>(872, 680)</value>
5470 + </param>
5471 + <param>
5472 + <key>_rotation</key>
5473 + <value>0</value>
5474 + </param>
5475 + <param>
5476 + <key>id</key>
5477 + <value>blocks_complex_to_imag_0</value>
5478 + </param>
5479 + <param>
5480 + <key>maxoutbuf</key>
5481 + <value>0</value>
5482 + </param>
5483 + <param>
5484 + <key>minoutbuf</key>
5485 + <value>0</value>
5486 + </param>
5487 + <param>
5488 + <key>vlen</key>
5489 + <value>1</value>
5490 + </param>
5491 + </block>
5492 + <block>
5493 + <key>blocks_complex_to_real</key>
5494 + <param>
5495 + <key>alias</key>
5496 + <value></value>
5497 + </param>
5498 + <param>
5499 + <key>comment</key>
5500 + <value></value>
5501 + </param>
5502 + <param>
5503 + <key>affinity</key>
5504 + <value></value>
5505 + </param>
5506 + <param>
5507 + <key>_enabled</key>
5508 + <value>True</value>
5509 + </param>
5510 + <param>
5511 + <key>_coordinate</key>
5512 + <value>(272, 1056)</value>
5513 + </param>
5514 + <param>
5515 + <key>_rotation</key>
5516 + <value>0</value>
5517 + </param>
5518 + <param>
5519 + <key>id</key>
5520 + <value>blocks_complex_to_real_0</value>
5521 + </param>
5522 + <param>
5523 + <key>maxoutbuf</key>
5524 + <value>0</value>
5525 + </param>
5526 + <param>
5527 + <key>minoutbuf</key>
5528 + <value>0</value>
5529 + </param>
5530 + <param>
5531 + <key>vlen</key>
5532 + <value>1</value>
5533 + </param>
5534 + </block>
5535 + <block>
5536 + <key>blocks_keep_one_in_n</key>
5537 + <param>
5538 + <key>alias</key>
5539 + <value></value>
5540 + </param>
5541 + <param>
5542 + <key>comment</key>
5543 + <value></value>
5544 + </param>
5545 + <param>
5546 + <key>affinity</key>
5547 + <value></value>
5548 + </param>
5549 + <param>
5550 + <key>_enabled</key>
5551 + <value>True</value>
5552 + </param>
5553 + <param>
5554 + <key>_coordinate</key>
5555 + <value>(232, 1100)</value>
5556 + </param>
5557 + <param>
5558 + <key>_rotation</key>
5559 + <value>0</value>
5560 + </param>
5561 + <param>
5562 + <key>id</key>
5563 + <value>blocks_keep_one_in_n_0</value>
5564 + </param>
5565 + <param>
5566 + <key>maxoutbuf</key>
5567 + <value>0</value>
5568 + </param>
5569 + <param>
5570 + <key>minoutbuf</key>
5571 + <value>0</value>
5572 + </param>
5573 + <param>
5574 + <key>n</key>
5575 + <value>2</value>
5576 + </param>
5577 + <param>
5578 + <key>type</key>
5579 + <value>byte</value>
5580 + </param>
5581 + <param>
5582 + <key>vlen</key>
5583 + <value>1</value>
5584 + </param>
5585 + </block>
5586 + <block>
5587 + <key>blocks_multiply_const_vxx</key>
5588 + <param>
5589 + <key>alias</key>
5590 + <value></value>
5591 + </param>
5592 + <param>
5593 + <key>comment</key>
5594 + <value></value>
5595 + </param>
5596 + <param>
5597 + <key>const</key>
5598 + <value>volume</value>
5599 + </param>
5600 + <param>
5601 + <key>affinity</key>
5602 + <value></value>
5603 + </param>
5604 + <param>
5605 + <key>_enabled</key>
5606 + <value>True</value>
5607 + </param>
5608 + <param>
5609 + <key>_coordinate</key>
5610 + <value>(472, 1468)</value>
5611 + </param>
5612 + <param>
5613 + <key>_rotation</key>
5614 + <value>180</value>
5615 + </param>
5616 + <param>
5617 + <key>id</key>
5618 + <value>blocks_multiply_const_vxx_0</value>
5619 + </param>
5620 + <param>
5621 + <key>type</key>
5622 + <value>float</value>
5623 + </param>
5624 + <param>
5625 + <key>maxoutbuf</key>
5626 + <value>0</value>
5627 + </param>
5628 + <param>
5629 + <key>minoutbuf</key>
5630 + <value>0</value>
5631 + </param>
5632 + <param>
5633 + <key>vlen</key>
5634 + <value>1</value>
5635 + </param>
5636 + </block>
5637 + <block>
5638 + <key>blocks_multiply_const_vxx</key>
5639 + <param>
5640 + <key>alias</key>
5641 + <value></value>
5642 + </param>
5643 + <param>
5644 + <key>comment</key>
5645 + <value></value>
5646 + </param>
5647 + <param>
5648 + <key>const</key>
5649 + <value>volume</value>
5650 + </param>
5651 + <param>
5652 + <key>affinity</key>
5653 + <value></value>
5654 + </param>
5655 + <param>
5656 + <key>_enabled</key>
5657 + <value>True</value>
5658 + </param>
5659 + <param>
5660 + <key>_coordinate</key>
5661 + <value>(472, 1316)</value>
5662 + </param>
5663 + <param>
5664 + <key>_rotation</key>
5665 + <value>180</value>
5666 + </param>
5667 + <param>
5668 + <key>id</key>
5669 + <value>blocks_multiply_const_vxx_0_0</value>
5670 + </param>
5671 + <param>
5672 + <key>type</key>
5673 + <value>float</value>
5674 + </param>
5675 + <param>
5676 + <key>maxoutbuf</key>
5677 + <value>0</value>
5678 + </param>
5679 + <param>
5680 + <key>minoutbuf</key>
5681 + <value>0</value>
5682 + </param>
5683 + <param>
5684 + <key>vlen</key>
5685 + <value>1</value>
5686 + </param>
5687 + </block>
5688 + <block>
5689 + <key>blocks_multiply_xx</key>
5690 + <param>
5691 + <key>alias</key>
5692 + <value></value>
5693 + </param>
5694 + <param>
5695 + <key>comment</key>
5696 + <value></value>
5697 + </param>
5698 + <param>
5699 + <key>affinity</key>
5700 + <value></value>
5701 + </param>
5702 + <param>
5703 + <key>_enabled</key>
5704 + <value>True</value>
5705 + </param>
5706 + <param>
5707 + <key>_coordinate</key>
5708 + <value>(1264, 736)</value>
5709 + </param>
5710 + <param>
5711 + <key>_rotation</key>
5712 + <value>270</value>
5713 + </param>
5714 + <param>
5715 + <key>id</key>
5716 + <value>blocks_multiply_xx_0</value>
5717 + </param>
5718 + <param>
5719 + <key>type</key>
5720 + <value>float</value>
5721 + </param>
5722 + <param>
5723 + <key>maxoutbuf</key>
5724 + <value>0</value>
5725 + </param>
5726 + <param>
5727 + <key>minoutbuf</key>
5728 + <value>0</value>
5729 + </param>
5730 + <param>
5731 + <key>num_inputs</key>
5732 + <value>2</value>
5733 + </param>
5734 + <param>
5735 + <key>vlen</key>
5736 + <value>1</value>
5737 + </param>
5738 + </block>
5739 + <block>
5740 + <key>blocks_multiply_xx</key>
5741 + <param>
5742 + <key>alias</key>
5743 + <value></value>
5744 + </param>
5745 + <param>
5746 + <key>comment</key>
5747 + <value></value>
5748 + </param>
5749 + <param>
5750 + <key>affinity</key>
5751 + <value></value>
5752 + </param>
5753 + <param>
5754 + <key>_enabled</key>
5755 + <value>True</value>
5756 + </param>
5757 + <param>
5758 + <key>_coordinate</key>
5759 + <value>(928, 608)</value>
5760 + </param>
5761 + <param>
5762 + <key>_rotation</key>
5763 + <value>180</value>
5764 + </param>
5765 + <param>
5766 + <key>id</key>
5767 + <value>blocks_multiply_xx_1</value>
5768 + </param>
5769 + <param>
5770 + <key>type</key>
5771 + <value>complex</value>
5772 + </param>
5773 + <param>
5774 + <key>maxoutbuf</key>
5775 + <value>0</value>
5776 + </param>
5777 + <param>
5778 + <key>minoutbuf</key>
5779 + <value>0</value>
5780 + </param>
5781 + <param>
5782 + <key>num_inputs</key>
5783 + <value>2</value>
5784 + </param>
5785 + <param>
5786 + <key>vlen</key>
5787 + <value>1</value>
5788 + </param>
5789 + </block>
5790 + <block>
5791 + <key>blocks_sub_xx</key>
5792 + <param>
5793 + <key>alias</key>
5794 + <value></value>
5795 + </param>
5796 + <param>
5797 + <key>comment</key>
5798 + <value></value>
5799 + </param>
5800 + <param>
5801 + <key>affinity</key>
5802 + <value></value>
5803 + </param>
5804 + <param>
5805 + <key>_enabled</key>
5806 + <value>True</value>
5807 + </param>
5808 + <param>
5809 + <key>_coordinate</key>
5810 + <value>(808, 1304)</value>
5811 + </param>
5812 + <param>
5813 + <key>_rotation</key>
5814 + <value>180</value>
5815 + </param>
5816 + <param>
5817 + <key>id</key>
5818 + <value>blocks_sub_xx_0</value>
5819 + </param>
5820 + <param>
5821 + <key>type</key>
5822 + <value>float</value>
5823 + </param>
5824 + <param>
5825 + <key>maxoutbuf</key>
5826 + <value>0</value>
5827 + </param>
5828 + <param>
5829 + <key>minoutbuf</key>
5830 + <value>0</value>
5831 + </param>
5832 + <param>
5833 + <key>num_inputs</key>
5834 + <value>2</value>
5835 + </param>
5836 + <param>
5837 + <key>vlen</key>
5838 + <value>1</value>
5839 + </param>
5840 + </block>
5841 + <block>
5842 + <key>digital_binary_slicer_fb</key>
5843 + <param>
5844 + <key>alias</key>
5845 + <value></value>
5846 + </param>
5847 + <param>
5848 + <key>comment</key>
5849 + <value></value>
5850 + </param>
5851 + <param>
5852 + <key>affinity</key>
5853 + <value></value>
5854 + </param>
5855 + <param>
5856 + <key>_enabled</key>
5857 + <value>True</value>
5858 + </param>
5859 + <param>
5860 + <key>_coordinate</key>
5861 + <value>(80, 1104)</value>
5862 + </param>
5863 + <param>
5864 + <key>_rotation</key>
5865 + <value>0</value>
5866 + </param>
5867 + <param>
5868 + <key>id</key>
5869 + <value>digital_binary_slicer_fb_0</value>
5870 + </param>
5871 + <param>
5872 + <key>maxoutbuf</key>
5873 + <value>0</value>
5874 + </param>
5875 + <param>
5876 + <key>minoutbuf</key>
5877 + <value>0</value>
5878 + </param>
5879 + </block>
5880 + <block>
5881 + <key>digital_diff_decoder_bb</key>
5882 + <param>
5883 + <key>alias</key>
5884 + <value></value>
5885 + </param>
5886 + <param>
5887 + <key>comment</key>
5888 + <value></value>
5889 + </param>
5890 + <param>
5891 + <key>affinity</key>
5892 + <value></value>
5893 + </param>
5894 + <param>
5895 + <key>_enabled</key>
5896 + <value>True</value>
5897 + </param>
5898 + <param>
5899 + <key>_coordinate</key>
5900 + <value>(368, 1100)</value>
5901 + </param>
5902 + <param>
5903 + <key>_rotation</key>
5904 + <value>0</value>
5905 + </param>
5906 + <param>
5907 + <key>id</key>
5908 + <value>digital_diff_decoder_bb_0</value>
5909 + </param>
5910 + <param>
5911 + <key>maxoutbuf</key>
5912 + <value>0</value>
5913 + </param>
5914 + <param>
5915 + <key>minoutbuf</key>
5916 + <value>0</value>
5917 + </param>
5918 + <param>
5919 + <key>modulus</key>
5920 + <value>2</value>
5921 + </param>
5922 + </block>
5923 + <block>
5924 + <key>digital_mpsk_receiver_cc</key>
5925 + <param>
5926 + <key>alias</key>
5927 + <value></value>
5928 + </param>
5929 + <param>
5930 + <key>comment</key>
5931 + <value></value>
5932 + </param>
5933 + <param>
5934 + <key>affinity</key>
5935 + <value></value>
5936 + </param>
5937 + <param>
5938 + <key>_enabled</key>
5939 + <value>True</value>
5940 + </param>
5941 + <param>
5942 + <key>_coordinate</key>
5943 + <value>(48, 884)</value>
5944 + </param>
5945 + <param>
5946 + <key>_rotation</key>
5947 + <value>0</value>
5948 + </param>
5949 + <param>
5950 + <key>gain_mu</key>
5951 + <value>0.05</value>
5952 + </param>
5953 + <param>
5954 + <key>gain_omega</key>
5955 + <value>0.001</value>
5956 + </param>
5957 + <param>
5958 + <key>id</key>
5959 + <value>digital_mpsk_receiver_cc_0</value>
5960 + </param>
5961 + <param>
5962 + <key>w</key>
5963 + <value>1*cmath.pi/100.0</value>
5964 + </param>
5965 + <param>
5966 + <key>M</key>
5967 + <value>2</value>
5968 + </param>
5969 + <param>
5970 + <key>fmax</key>
5971 + <value>0.06</value>
5972 + </param>
5973 + <param>
5974 + <key>maxoutbuf</key>
5975 + <value>0</value>
5976 + </param>
5977 + <param>
5978 + <key>fmin</key>
5979 + <value>-0.06</value>
5980 + </param>
5981 + <param>
5982 + <key>minoutbuf</key>
5983 + <value>0</value>
5984 + </param>
5985 + <param>
5986 + <key>mu</key>
5987 + <value>0.5</value>
5988 + </param>
5989 + <param>
5990 + <key>omega_relative_limit</key>
5991 + <value>0.005</value>
5992 + </param>
5993 + <param>
5994 + <key>omega</key>
5995 + <value>samp_rate/bb_decim/audio_decim/ 2375.0</value>
5996 + </param>
5997 + <param>
5998 + <key>theta</key>
5999 + <value>0</value>
6000 + </param>
6001 + </block>
6002 + <block>
6003 + <key>fir_filter_xxx</key>
6004 + <param>
6005 + <key>alias</key>
6006 + <value></value>
6007 + </param>
6008 + <param>
6009 + <key>comment</key>
6010 + <value></value>
6011 + </param>
6012 + <param>
6013 + <key>affinity</key>
6014 + <value></value>
6015 + </param>
6016 + <param>
6017 + <key>decim</key>
6018 + <value>audio_decim</value>
6019 + </param>
6020 + <param>
6021 + <key>_enabled</key>
6022 + <value>True</value>
6023 + </param>
6024 + <param>
6025 + <key>_coordinate</key>
6026 + <value>(668, 696)</value>
6027 + </param>
6028 + <param>
6029 + <key>_rotation</key>
6030 + <value>270</value>
6031 + </param>
6032 + <param>
6033 + <key>id</key>
6034 + <value>fir_filter_xxx_1</value>
6035 + </param>
6036 + <param>
6037 + <key>maxoutbuf</key>
6038 + <value>0</value>
6039 + </param>
6040 + <param>
6041 + <key>minoutbuf</key>
6042 + <value>0</value>
6043 + </param>
6044 + <param>
6045 + <key>samp_delay</key>
6046 + <value>0</value>
6047 + </param>
6048 + <param>
6049 + <key>taps</key>
6050 + <value>firdes.low_pass(1.0,baseband_rate,13e3,3e3,firdes.WIN_HAMMING)</value>
6051 + </param>
6052 + <param>
6053 + <key>type</key>
6054 + <value>fff</value>
6055 + </param>
6056 + </block>
6057 + <block>
6058 + <key>fir_filter_xxx</key>
6059 + <param>
6060 + <key>alias</key>
6061 + <value></value>
6062 + </param>
6063 + <param>
6064 + <key>comment</key>
6065 + <value></value>
6066 + </param>
6067 + <param>
6068 + <key>affinity</key>
6069 + <value></value>
6070 + </param>
6071 + <param>
6072 + <key>decim</key>
6073 + <value>1</value>
6074 + </param>
6075 + <param>
6076 + <key>_enabled</key>
6077 + <value>True</value>
6078 + </param>
6079 + <param>
6080 + <key>_coordinate</key>
6081 + <value>(864, 412)</value>
6082 + </param>
6083 + <param>
6084 + <key>_rotation</key>
6085 + <value>180</value>
6086 + </param>
6087 + <param>
6088 + <key>id</key>
6089 + <value>fir_filter_xxx_2</value>
6090 + </param>
6091 + <param>
6092 + <key>maxoutbuf</key>
6093 + <value>0</value>
6094 + </param>
6095 + <param>
6096 + <key>minoutbuf</key>
6097 + <value>0</value>
6098 + </param>
6099 + <param>
6100 + <key>samp_delay</key>
6101 + <value>0</value>
6102 + </param>
6103 + <param>
6104 + <key>taps</key>
6105 + <value>firdes.complex_band_pass(1.0,baseband_rate,19e3-500,19e3+500,1e3,firdes.WIN_HAMMING)</value>
6106 + </param>
6107 + <param>
6108 + <key>type</key>
6109 + <value>fcc</value>
6110 + </param>
6111 + </block>
6112 + <block>
6113 + <key>fir_filter_xxx</key>
6114 + <param>
6115 + <key>alias</key>
6116 + <value></value>
6117 + </param>
6118 + <param>
6119 + <key>comment</key>
6120 + <value></value>
6121 + </param>
6122 + <param>
6123 + <key>affinity</key>
6124 + <value></value>
6125 + </param>
6126 + <param>
6127 + <key>decim</key>
6128 + <value>1</value>
6129 + </param>
6130 + <param>
6131 + <key>_enabled</key>
6132 + <value>True</value>
6133 + </param>
6134 + <param>
6135 + <key>_coordinate</key>
6136 + <value>(1272, 380)</value>
6137 + </param>
6138 + <param>
6139 + <key>_rotation</key>
6140 + <value>0</value>
6141 + </param>
6142 + <param>
6143 + <key>id</key>
6144 + <value>fir_filter_xxx_3</value>
6145 + </param>
6146 + <param>
6147 + <key>maxoutbuf</key>
6148 + <value>0</value>
6149 + </param>
6150 + <param>
6151 + <key>minoutbuf</key>
6152 + <value>0</value>
6153 + </param>
6154 + <param>
6155 + <key>samp_delay</key>
6156 + <value>0</value>
6157 + </param>
6158 + <param>
6159 + <key>taps</key>
6160 + <value>firdes.band_pass(1.0,baseband_rate,38e3-13e3,38e3+13e3,3e3,firdes.WIN_HAMMING)</value>
6161 + </param>
6162 + <param>
6163 + <key>type</key>
6164 + <value>fff</value>
6165 + </param>
6166 + </block>
6167 + <block>
6168 + <key>fir_filter_xxx</key>
6169 + <param>
6170 + <key>alias</key>
6171 + <value></value>
6172 + </param>
6173 + <param>
6174 + <key>comment</key>
6175 + <value></value>
6176 + </param>
6177 + <param>
6178 + <key>affinity</key>
6179 + <value></value>
6180 + </param>
6181 + <param>
6182 + <key>decim</key>
6183 + <value>audio_decim</value>
6184 + </param>
6185 + <param>
6186 + <key>_enabled</key>
6187 + <value>True</value>
6188 + </param>
6189 + <param>
6190 + <key>_coordinate</key>
6191 + <value>(1268, 1144)</value>
6192 + </param>
6193 + <param>
6194 + <key>_rotation</key>
6195 + <value>270</value>
6196 + </param>
6197 + <param>
6198 + <key>id</key>
6199 + <value>fir_filter_xxx_5</value>
6200 + </param>
6201 + <param>
6202 + <key>maxoutbuf</key>
6203 + <value>0</value>
6204 + </param>
6205 + <param>
6206 + <key>minoutbuf</key>
6207 + <value>0</value>
6208 + </param>
6209 + <param>
6210 + <key>samp_delay</key>
6211 + <value>0</value>
6212 + </param>
6213 + <param>
6214 + <key>taps</key>
6215 + <value>firdes.low_pass(1.0,baseband_rate,20e3,40e3,firdes.WIN_HAMMING)</value>
6216 + </param>
6217 + <param>
6218 + <key>type</key>
6219 + <value>fff</value>
6220 + </param>
6221 + </block>
6222 + <block>
6223 + <key>freq_xlating_fir_filter_xxx</key>
6224 + <param>
6225 + <key>alias</key>
6226 + <value></value>
6227 + </param>
6228 + <param>
6229 + <key>center_freq</key>
6230 + <value>0</value>
6231 + </param>
6232 + <param>
6233 + <key>comment</key>
6234 + <value></value>
6235 + </param>
6236 + <param>
6237 + <key>affinity</key>
6238 + <value></value>
6239 + </param>
6240 + <param>
6241 + <key>decim</key>
6242 + <value>1</value>
6243 + </param>
6244 + <param>
6245 + <key>_enabled</key>
6246 + <value>True</value>
6247 + </param>
6248 + <param>
6249 + <key>_coordinate</key>
6250 + <value>(240, 368)</value>
6251 + </param>
6252 + <param>
6253 + <key>_rotation</key>
6254 + <value>0</value>
6255 + </param>
6256 + <param>
6257 + <key>id</key>
6258 + <value>freq_xlating_fir_filter_xxx_0</value>
6259 + </param>
6260 + <param>
6261 + <key>maxoutbuf</key>
6262 + <value>0</value>
6263 + </param>
6264 + <param>
6265 + <key>minoutbuf</key>
6266 + <value>0</value>
6267 + </param>
6268 + <param>
6269 + <key>samp_rate</key>
6270 + <value>samp_rate</value>
6271 + </param>
6272 + <param>
6273 + <key>taps</key>
6274 + <value>firdes.low_pass(1, samp_rate, xlate_bandwidth, 100000)</value>
6275 + </param>
6276 + <param>
6277 + <key>type</key>
6278 + <value>ccc</value>
6279 + </param>
6280 + </block>
6281 + <block>
6282 + <key>freq_xlating_fir_filter_xxx</key>
6283 + <param>
6284 + <key>alias</key>
6285 + <value></value>
6286 + </param>
6287 + <param>
6288 + <key>center_freq</key>
6289 + <value>57e3</value>
6290 + </param>
6291 + <param>
6292 + <key>comment</key>
6293 + <value></value>
6294 + </param>
6295 + <param>
6296 + <key>affinity</key>
6297 + <value></value>
6298 + </param>
6299 + <param>
6300 + <key>decim</key>
6301 + <value>audio_decim</value>
6302 + </param>
6303 + <param>
6304 + <key>_enabled</key>
6305 + <value>True</value>
6306 + </param>
6307 + <param>
6308 + <key>_coordinate</key>
6309 + <value>(48, 648)</value>
6310 + </param>
6311 + <param>
6312 + <key>_rotation</key>
6313 + <value>0</value>
6314 + </param>
6315 + <param>
6316 + <key>id</key>
6317 + <value>freq_xlating_fir_filter_xxx_1</value>
6318 + </param>
6319 + <param>
6320 + <key>maxoutbuf</key>
6321 + <value>0</value>
6322 + </param>
6323 + <param>
6324 + <key>minoutbuf</key>
6325 + <value>0</value>
6326 + </param>
6327 + <param>
6328 + <key>samp_rate</key>
6329 + <value>baseband_rate</value>
6330 + </param>
6331 + <param>
6332 + <key>taps</key>
6333 + <value>firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING)</value>
6334 + </param>
6335 + <param>
6336 + <key>type</key>
6337 + <value>fcc</value>
6338 + </param>
6339 + </block>
6340 + <block>
6341 + <key>gr_rds_decoder</key>
6342 + <param>
6343 + <key>alias</key>
6344 + <value></value>
6345 + </param>
6346 + <param>
6347 + <key>comment</key>
6348 + <value></value>
6349 + </param>
6350 + <param>
6351 + <key>affinity</key>
6352 + <value></value>
6353 + </param>
6354 + <param>
6355 + <key>debug</key>
6356 + <value>False</value>
6357 + </param>
6358 + <param>
6359 + <key>_enabled</key>
6360 + <value>True</value>
6361 + </param>
6362 + <param>
6363 + <key>_coordinate</key>
6364 + <value>(408, 1156)</value>
6365 + </param>
6366 + <param>
6367 + <key>_rotation</key>
6368 + <value>180</value>
6369 + </param>
6370 + <param>
6371 + <key>id</key>
6372 + <value>gr_rds_decoder_0</value>
6373 + </param>
6374 + <param>
6375 + <key>log</key>
6376 + <value>True</value>
6377 + </param>
6378 + <param>
6379 + <key>maxoutbuf</key>
6380 + <value>0</value>
6381 + </param>
6382 + <param>
6383 + <key>minoutbuf</key>
6384 + <value>0</value>
6385 + </param>
6386 + </block>
6387 + <block>
6388 + <key>gr_rds_panel</key>
6389 + <param>
6390 + <key>alias</key>
6391 + <value></value>
6392 + </param>
6393 + <param>
6394 + <key>comment</key>
6395 + <value></value>
6396 + </param>
6397 + <param>
6398 + <key>affinity</key>
6399 + <value></value>
6400 + </param>
6401 + <param>
6402 + <key>_enabled</key>
6403 + <value>True</value>
6404 + </param>
6405 + <param>
6406 + <key>freq</key>
6407 + <value>freq</value>
6408 + </param>
6409 + <param>
6410 + <key>_coordinate</key>
6411 + <value>(40, 1168)</value>
6412 + </param>
6413 + <param>
6414 + <key>_rotation</key>
6415 + <value>180</value>
6416 + </param>
6417 + <param>
6418 + <key>grid_pos</key>
6419 + <value></value>
6420 + </param>
6421 + <param>
6422 + <key>id</key>
6423 + <value>gr_rds_panel_0</value>
6424 + </param>
6425 + <param>
6426 + <key>notebook</key>
6427 + <value></value>
6428 + </param>
6429 + </block>
6430 + <block>
6431 + <key>gr_rds_parser</key>
6432 + <param>
6433 + <key>alias</key>
6434 + <value></value>
6435 + </param>
6436 + <param>
6437 + <key>comment</key>
6438 + <value></value>
6439 + </param>
6440 + <param>
6441 + <key>affinity</key>
6442 + <value></value>
6443 + </param>
6444 + <param>
6445 + <key>debug</key>
6446 + <value>False</value>
6447 + </param>
6448 + <param>
6449 + <key>_enabled</key>
6450 + <value>True</value>
6451 + </param>
6452 + <param>
6453 + <key>_coordinate</key>
6454 + <value>(224, 1148)</value>
6455 + </param>
6456 + <param>
6457 + <key>_rotation</key>
6458 + <value>180</value>
6459 + </param>
6460 + <param>
6461 + <key>id</key>
6462 + <value>gr_rds_parser_0</value>
6463 + </param>
6464 + <param>
6465 + <key>log</key>
6466 + <value>True</value>
6467 + </param>
6468 + <param>
6469 + <key>maxoutbuf</key>
6470 + <value>0</value>
6471 + </param>
6472 + <param>
6473 + <key>minoutbuf</key>
6474 + <value>0</value>
6475 + </param>
6476 + <param>
6477 + <key>pty_locale</key>
6478 + <value>0</value>
6479 + </param>
6480 + <param>
6481 + <key>reset</key>
6482 + <value>0</value>
6483 + </param>
6484 + </block>
6485 + <block>
6486 + <key>import</key>
6487 + <param>
6488 + <key>alias</key>
6489 + <value></value>
6490 + </param>
6491 + <param>
6492 + <key>comment</key>
6493 + <value></value>
6494 + </param>
6495 + <param>
6496 + <key>_enabled</key>
6497 + <value>True</value>
6498 + </param>
6499 + <param>
6500 + <key>_coordinate</key>
6501 + <value>(888, 484)</value>
6502 + </param>
6503 + <param>
6504 + <key>_rotation</key>
6505 + <value>0</value>
6506 + </param>
6507 + <param>
6508 + <key>id</key>
6509 + <value>import_0</value>
6510 + </param>
6511 + <param>
6512 + <key>import</key>
6513 + <value>import math</value>
6514 + </param>
6515 + </block>
6516 + <block>
6517 + <key>limesdr_source</key>
6518 + <param>
6519 + <key>alias</key>
6520 + <value></value>
6521 + </param>
6522 + <param>
6523 + <key>analog_bandw_ch0</key>
6524 + <value>1.5e6</value>
6525 + </param>
6526 + <param>
6527 + <key>calibr_bandw_ch0</key>
6528 + <value>2.5e6</value>
6529 + </param>
6530 + <param>
6531 + <key>digital_bandw_ch0</key>
6532 + <value>100e3</value>
6533 + </param>
6534 + <param>
6535 + <key>gain_dB_ch0</key>
6536 + <value>gain</value>
6537 + </param>
6538 + <param>
6539 + <key>lna_path_ch0</key>
6540 + <value>3</value>
6541 + </param>
6542 + <param>
6543 + <key>nco_freq_ch0</key>
6544 + <value>0</value>
6545 + </param>
6546 + <param>
6547 + <key>analog_bandw_ch1</key>
6548 + <value>1.5e6</value>
6549 + </param>
6550 + <param>
6551 + <key>calibr_bandw_ch1</key>
6552 + <value>2.5e6</value>
6553 + </param>
6554 + <param>
6555 + <key>digital_bandw_ch1</key>
6556 + <value>100e3</value>
6557 + </param>
6558 + <param>
6559 + <key>gain_dB_ch1</key>
6560 + <value>gain</value>
6561 + </param>
6562 + <param>
6563 + <key>lna_path_ch1</key>
6564 + <value>3</value>
6565 + </param>
6566 + <param>
6567 + <key>nco_freq_ch1</key>
6568 + <value>0</value>
6569 + </param>
6570 + <param>
6571 + <key>channel_mode</key>
6572 + <value>0</value>
6573 + </param>
6574 + <param>
6575 + <key>comment</key>
6576 + <value></value>
6577 + </param>
6578 + <param>
6579 + <key>affinity</key>
6580 + <value></value>
6581 + </param>
6582 + <param>
6583 + <key>serial</key>
6584 + <value></value>
6585 + </param>
6586 + <param>
6587 + <key>_enabled</key>
6588 + <value>True</value>
6589 + </param>
6590 + <param>
6591 + <key>filename</key>
6592 + <value></value>
6593 + </param>
6594 + <param>
6595 + <key>_coordinate</key>
6596 + <value>(8, 260)</value>
6597 + </param>
6598 + <param>
6599 + <key>_rotation</key>
6600 + <value>0</value>
6601 + </param>
6602 + <param>
6603 + <key>id</key>
6604 + <value>limesdr_source_0</value>
6605 + </param>
6606 + <param>
6607 + <key>maxoutbuf</key>
6608 + <value>0</value>
6609 + </param>
6610 + <param>
6611 + <key>minoutbuf</key>
6612 + <value>0</value>
6613 + </param>
6614 + <param>
6615 + <key>oversample</key>
6616 + <value>0</value>
6617 + </param>
6618 + <param>
6619 + <key>rf_freq</key>
6620 + <value>freq</value>
6621 + </param>
6622 + <param>
6623 + <key>samp_rate</key>
6624 + <value>samp_rate</value>
6625 + </param>
6626 + </block>
6627 + <block>
6628 + <key>notebook</key>
6629 + <param>
6630 + <key>alias</key>
6631 + <value></value>
6632 + </param>
6633 + <param>
6634 + <key>comment</key>
6635 + <value></value>
6636 + </param>
6637 + <param>
6638 + <key>_enabled</key>
6639 + <value>True</value>
6640 + </param>
6641 + <param>
6642 + <key>_coordinate</key>
6643 + <value>(184, 6)</value>
6644 + </param>
6645 + <param>
6646 + <key>_rotation</key>
6647 + <value>0</value>
6648 + </param>
6649 + <param>
6650 + <key>grid_pos</key>
6651 + <value>(2,0,1,2)</value>
6652 + </param>
6653 + <param>
6654 + <key>id</key>
6655 + <value>nb</value>
6656 + </param>
6657 + <param>
6658 + <key>labels</key>
6659 + <value>['BB', 'Demod', 'L+R', 'L-R', 'Pilot', 'DSBSC', 'RDS', 'RDS constellation','Waterfall']</value>
6660 + </param>
6661 + <param>
6662 + <key>notebook</key>
6663 + <value></value>
6664 + </param>
6665 + <param>
6666 + <key>style</key>
6667 + <value>wx.NB_TOP</value>
6668 + </param>
6669 + </block>
6670 + <block>
6671 + <key>note</key>
6672 + <param>
6673 + <key>alias</key>
6674 + <value></value>
6675 + </param>
6676 + <param>
6677 + <key>comment</key>
6678 + <value>L+R for
6679 +stereo
6680 +receivers</value>
6681 + </param>
6682 + <param>
6683 + <key>_enabled</key>
6684 + <value>True</value>
6685 + </param>
6686 + <param>
6687 + <key>_coordinate</key>
6688 + <value>(776, 900)</value>
6689 + </param>
6690 + <param>
6691 + <key>_rotation</key>
6692 + <value>180</value>
6693 + </param>
6694 + <param>
6695 + <key>id</key>
6696 + <value>note_0</value>
6697 + </param>
6698 + <param>
6699 + <key>note</key>
6700 + <value>L+R</value>
6701 + </param>
6702 + </block>
6703 + <block>
6704 + <key>note</key>
6705 + <param>
6706 + <key>alias</key>
6707 + <value></value>
6708 + </param>
6709 + <param>
6710 + <key>comment</key>
6711 + <value>In FM stereo broadcasting,
6712 +a pilot tone of 19 kHz indicates
6713 +that there is stereophonic
6714 +information at 38 kHz
6715 +(19×2, the second harmonic of the pilot).
6716 +The receiver doubles the frequency
6717 +of the pilot tone and uses it as a
6718 +frequency and phase reference to
6719 +demodulate the stereo information.</value>
6720 + </param>
6721 + <param>
6722 + <key>_enabled</key>
6723 + <value>True</value>
6724 + </param>
6725 + <param>
6726 + <key>_coordinate</key>
6727 + <value>(1048, 460)</value>
6728 + </param>
6729 + <param>
6730 + <key>_rotation</key>
6731 + <value>180</value>
6732 + </param>
6733 + <param>
6734 + <key>id</key>
6735 + <value>note_0_0</value>
6736 + </param>
6737 + <param>
6738 + <key>note</key>
6739 + <value>Pilot</value>
6740 + </param>
6741 + </block>
6742 + <block>
6743 + <key>note</key>
6744 + <param>
6745 + <key>alias</key>
6746 + <value></value>
6747 + </param>
6748 + <param>
6749 + <key>comment</key>
6750 + <value>DSBSC modulation
6751 +of 38 kHz sinewave
6752 +for mono</value>
6753 + </param>
6754 + <param>
6755 + <key>_enabled</key>
6756 + <value>True</value>
6757 + </param>
6758 + <param>
6759 + <key>_coordinate</key>
6760 + <value>(1272, 276)</value>
6761 + </param>
6762 + <param>
6763 + <key>_rotation</key>
6764 + <value>180</value>
6765 + </param>
6766 + <param>
6767 + <key>id</key>
6768 + <value>note_0_0_0</value>
6769 + </param>
6770 + <param>
6771 + <key>note</key>
6772 + <value>DSBSC</value>
6773 + </param>
6774 + </block>
6775 + <block>
6776 + <key>note</key>
6777 + <param>
6778 + <key>alias</key>
6779 + <value></value>
6780 + </param>
6781 + <param>
6782 + <key>comment</key>
6783 + <value>L-R for
6784 +mono
6785 +receivers</value>
6786 + </param>
6787 + <param>
6788 + <key>_enabled</key>
6789 + <value>True</value>
6790 + </param>
6791 + <param>
6792 + <key>_coordinate</key>
6793 + <value>(1136, 900)</value>
6794 + </param>
6795 + <param>
6796 + <key>_rotation</key>
6797 + <value>0</value>
6798 + </param>
6799 + <param>
6800 + <key>id</key>
6801 + <value>note_0_1</value>
6802 + </param>
6803 + <param>
6804 + <key>note</key>
6805 + <value>L-R</value>
6806 + </param>
6807 + </block>
6808 + <block>
6809 + <key>note</key>
6810 + <param>
6811 + <key>alias</key>
6812 + <value></value>
6813 + </param>
6814 + <param>
6815 + <key>comment</key>
6816 + <value>Digital signal which
6817 +includes information such
6818 +as the name of the station,
6819 +or free text such as the title
6820 +of the program or the music.</value>
6821 + </param>
6822 + <param>
6823 + <key>_enabled</key>
6824 + <value>True</value>
6825 + </param>
6826 + <param>
6827 + <key>_coordinate</key>
6828 + <value>(264, 548)</value>
6829 + </param>
6830 + <param>
6831 + <key>_rotation</key>
6832 + <value>180</value>
6833 + </param>
6834 + <param>
6835 + <key>id</key>
6836 + <value>note_0_2</value>
6837 + </param>
6838 + <param>
6839 + <key>note</key>
6840 + <value>RDS</value>
6841 + </param>
6842 + </block>
6843 + <block>
6844 + <key>note</key>
6845 + <param>
6846 + <key>alias</key>
6847 + <value></value>
6848 + </param>
6849 + <param>
6850 + <key>comment</key>
6851 + <value>We use lowest possible
6852 +analog filter bandwidth
6853 +and
6854 +100 kHz digital filter bandwidth</value>
6855 + </param>
6856 + <param>
6857 + <key>_enabled</key>
6858 + <value>True</value>
6859 + </param>
6860 + <param>
6861 + <key>_coordinate</key>
6862 + <value>(8, 140)</value>
6863 + </param>
6864 + <param>
6865 + <key>_rotation</key>
6866 + <value>180</value>
6867 + </param>
6868 + <param>
6869 + <key>id</key>
6870 + <value>note_10</value>
6871 + </param>
6872 + <param>
6873 + <key>note</key>
6874 + <value>LimeSDR</value>
6875 + </param>
6876 + </block>
6877 + <block>
6878 + <key>rational_resampler_xxx</key>
6879 + <param>
6880 + <key>alias</key>
6881 + <value></value>
6882 + </param>
6883 + <param>
6884 + <key>comment</key>
6885 + <value></value>
6886 + </param>
6887 + <param>
6888 + <key>affinity</key>
6889 + <value></value>
6890 + </param>
6891 + <param>
6892 + <key>decim</key>
6893 + <value>audio_decim_rate</value>
6894 + </param>
6895 + <param>
6896 + <key>_enabled</key>
6897 + <value>True</value>
6898 + </param>
6899 + <param>
6900 + <key>fbw</key>
6901 + <value>0</value>
6902 + </param>
6903 + <param>
6904 + <key>_coordinate</key>
6905 + <value>(280, 1448)</value>
6906 + </param>
6907 + <param>
6908 + <key>_rotation</key>
6909 + <value>180</value>
6910 + </param>
6911 + <param>
6912 + <key>id</key>
6913 + <value>rational_resampler_xxx_0</value>
6914 + </param>
6915 + <param>
6916 + <key>interp</key>
6917 + <value>audio_rate</value>
6918 + </param>
6919 + <param>
6920 + <key>maxoutbuf</key>
6921 + <value>0</value>
6922 + </param>
6923 + <param>
6924 + <key>minoutbuf</key>
6925 + <value>0</value>
6926 + </param>
6927 + <param>
6928 + <key>taps</key>
6929 + <value>[]</value>
6930 + </param>
6931 + <param>
6932 + <key>type</key>
6933 + <value>fff</value>
6934 + </param>
6935 + </block>
6936 + <block>
6937 + <key>rational_resampler_xxx</key>
6938 + <param>
6939 + <key>alias</key>
6940 + <value></value>
6941 + </param>
6942 + <param>
6943 + <key>comment</key>
6944 + <value></value>
6945 + </param>
6946 + <param>
6947 + <key>affinity</key>
6948 + <value></value>
6949 + </param>
6950 + <param>
6951 + <key>decim</key>
6952 + <value>audio_decim_rate</value>
6953 + </param>
6954 + <param>
6955 + <key>_enabled</key>
6956 + <value>True</value>
6957 + </param>
6958 + <param>
6959 + <key>fbw</key>
6960 + <value>0</value>
6961 + </param>
6962 + <param>
6963 + <key>_coordinate</key>
6964 + <value>(280, 1296)</value>
6965 + </param>
6966 + <param>
6967 + <key>_rotation</key>
6968 + <value>180</value>
6969 + </param>
6970 + <param>
6971 + <key>id</key>
6972 + <value>rational_resampler_xxx_0_0</value>
6973 + </param>
6974 + <param>
6975 + <key>interp</key>
6976 + <value>audio_rate</value>
6977 + </param>
6978 + <param>
6979 + <key>maxoutbuf</key>
6980 + <value>0</value>
6981 + </param>
6982 + <param>
6983 + <key>minoutbuf</key>
6984 + <value>0</value>
6985 + </param>
6986 + <param>
6987 + <key>taps</key>
6988 + <value>[]</value>
6989 + </param>
6990 + <param>
6991 + <key>type</key>
6992 + <value>fff</value>
6993 + </param>
6994 + </block>
6995 + <block>
6996 + <key>root_raised_cosine_filter</key>
6997 + <param>
6998 + <key>alpha</key>
6999 + <value>1</value>
7000 + </param>
7001 + <param>
7002 + <key>alias</key>
7003 + <value></value>
7004 + </param>
7005 + <param>
7006 + <key>comment</key>
7007 + <value></value>
7008 + </param>
7009 + <param>
7010 + <key>affinity</key>
7011 + <value></value>
7012 + </param>
7013 + <param>
7014 + <key>decim</key>
7015 + <value>1</value>
7016 + </param>
7017 + <param>
7018 + <key>_enabled</key>
7019 + <value>True</value>
7020 + </param>
7021 + <param>
7022 + <key>type</key>
7023 + <value>fir_filter_ccf</value>
7024 + </param>
7025 + <param>
7026 + <key>_coordinate</key>
7027 + <value>(48, 760)</value>
7028 + </param>
7029 + <param>
7030 + <key>_rotation</key>
7031 + <value>180</value>
7032 + </param>
7033 + <param>
7034 + <key>gain</key>
7035 + <value>1</value>
7036 + </param>
7037 + <param>
7038 + <key>id</key>
7039 + <value>root_raised_cosine_filter_0</value>
7040 + </param>
7041 + <param>
7042 + <key>interp</key>
7043 + <value>1</value>
7044 + </param>
7045 + <param>
7046 + <key>maxoutbuf</key>
7047 + <value>0</value>
7048 + </param>
7049 + <param>
7050 + <key>minoutbuf</key>
7051 + <value>0</value>
7052 + </param>
7053 + <param>
7054 + <key>ntaps</key>
7055 + <value>100</value>
7056 + </param>
7057 + <param>
7058 + <key>samp_rate</key>
7059 + <value>samp_rate/bb_decim/audio_decim</value>
7060 + </param>
7061 + <param>
7062 + <key>sym_rate</key>
7063 + <value>2375</value>
7064 + </param>
7065 + </block>
7066 + <block>
7067 + <key>wxgui_fftsink2</key>
7068 + <param>
7069 + <key>avg_alpha</key>
7070 + <value>0.8</value>
7071 + </param>
7072 + <param>
7073 + <key>average</key>
7074 + <value>True</value>
7075 + </param>
7076 + <param>
7077 + <key>baseband_freq</key>
7078 + <value>0</value>
7079 + </param>
7080 + <param>
7081 + <key>alias</key>
7082 + <value></value>
7083 + </param>
7084 + <param>
7085 + <key>comment</key>
7086 + <value></value>
7087 + </param>
7088 + <param>
7089 + <key>affinity</key>
7090 + <value></value>
7091 + </param>
7092 + <param>
7093 + <key>_enabled</key>
7094 + <value>True</value>
7095 + </param>
7096 + <param>
7097 + <key>fft_size</key>
7098 + <value>1024</value>
7099 + </param>
7100 + <param>
7101 + <key>freqvar</key>
7102 + <value>None</value>
7103 + </param>
7104 + <param>
7105 + <key>_coordinate</key>
7106 + <value>(544, 120)</value>
7107 + </param>
7108 + <param>
7109 + <key>_rotation</key>
7110 + <value>0</value>
7111 + </param>
7112 + <param>
7113 + <key>grid_pos</key>
7114 + <value></value>
7115 + </param>
7116 + <param>
7117 + <key>id</key>
7118 + <value>wxgui_fftsink2_0</value>
7119 + </param>
7120 + <param>
7121 + <key>notebook</key>
7122 + <value>nb, 0</value>
7123 + </param>
7124 + <param>
7125 + <key>peak_hold</key>
7126 + <value>False</value>
7127 + </param>
7128 + <param>
7129 + <key>ref_level</key>
7130 + <value>-30</value>
7131 + </param>
7132 + <param>
7133 + <key>ref_scale</key>
7134 + <value>2.0</value>
7135 + </param>
7136 + <param>
7137 + <key>fft_rate</key>
7138 + <value>15</value>
7139 + </param>
7140 + <param>
7141 + <key>samp_rate</key>
7142 + <value>samp_rate</value>
7143 + </param>
7144 + <param>
7145 + <key>title</key>
7146 + <value>Baseband</value>
7147 + </param>
7148 + <param>
7149 + <key>type</key>
7150 + <value>complex</value>
7151 + </param>
7152 + <param>
7153 + <key>win_size</key>
7154 + <value></value>
7155 + </param>
7156 + <param>
7157 + <key>win</key>
7158 + <value>None</value>
7159 + </param>
7160 + <param>
7161 + <key>y_divs</key>
7162 + <value>10</value>
7163 + </param>
7164 + <param>
7165 + <key>y_per_div</key>
7166 + <value>10</value>
7167 + </param>
7168 + </block>
7169 + <block>
7170 + <key>wxgui_fftsink2</key>
7171 + <param>
7172 + <key>avg_alpha</key>
7173 + <value>0.8</value>
7174 + </param>
7175 + <param>
7176 + <key>average</key>
7177 + <value>True</value>
7178 + </param>
7179 + <param>
7180 + <key>baseband_freq</key>
7181 + <value>0</value>
7182 + </param>
7183 + <param>
7184 + <key>alias</key>
7185 + <value></value>
7186 + </param>
7187 + <param>
7188 + <key>comment</key>
7189 + <value></value>
7190 + </param>
7191 + <param>
7192 + <key>affinity</key>
7193 + <value></value>
7194 + </param>
7195 + <param>
7196 + <key>_enabled</key>
7197 + <value>True</value>
7198 + </param>
7199 + <param>
7200 + <key>fft_size</key>
7201 + <value>1024</value>
7202 + </param>
7203 + <param>
7204 + <key>freqvar</key>
7205 + <value>None</value>
7206 + </param>
7207 + <param>
7208 + <key>_coordinate</key>
7209 + <value>(904, 120)</value>
7210 + </param>
7211 + <param>
7212 + <key>_rotation</key>
7213 + <value>180</value>
7214 + </param>
7215 + <param>
7216 + <key>grid_pos</key>
7217 + <value></value>
7218 + </param>
7219 + <param>
7220 + <key>id</key>
7221 + <value>wxgui_fftsink2_0_0</value>
7222 + </param>
7223 + <param>
7224 + <key>notebook</key>
7225 + <value>nb, 1</value>
7226 + </param>
7227 + <param>
7228 + <key>peak_hold</key>
7229 + <value>False</value>
7230 + </param>
7231 + <param>
7232 + <key>ref_level</key>
7233 + <value>0</value>
7234 + </param>
7235 + <param>
7236 + <key>ref_scale</key>
7237 + <value>2.0</value>
7238 + </param>
7239 + <param>
7240 + <key>fft_rate</key>
7241 + <value>15</value>
7242 + </param>
7243 + <param>
7244 + <key>samp_rate</key>
7245 + <value>baseband_rate</value>
7246 + </param>
7247 + <param>
7248 + <key>title</key>
7249 + <value>FM Demod</value>
7250 + </param>
7251 + <param>
7252 + <key>type</key>
7253 + <value>float</value>
7254 + </param>
7255 + <param>
7256 + <key>win_size</key>
7257 + <value></value>
7258 + </param>
7259 + <param>
7260 + <key>win</key>
7261 + <value>None</value>
7262 + </param>
7263 + <param>
7264 + <key>y_divs</key>
7265 + <value>10</value>
7266 + </param>
7267 + <param>
7268 + <key>y_per_div</key>
7269 + <value>10</value>
7270 + </param>
7271 + </block>
7272 + <block>
7273 + <key>wxgui_fftsink2</key>
7274 + <param>
7275 + <key>avg_alpha</key>
7276 + <value>0</value>
7277 + </param>
7278 + <param>
7279 + <key>average</key>
7280 + <value>False</value>
7281 + </param>
7282 + <param>
7283 + <key>baseband_freq</key>
7284 + <value>0</value>
7285 + </param>
7286 + <param>
7287 + <key>alias</key>
7288 + <value></value>
7289 + </param>
7290 + <param>
7291 + <key>comment</key>
7292 + <value></value>
7293 + </param>
7294 + <param>
7295 + <key>affinity</key>
7296 + <value></value>
7297 + </param>
7298 + <param>
7299 + <key>_enabled</key>
7300 + <value>True</value>
7301 + </param>
7302 + <param>
7303 + <key>fft_size</key>
7304 + <value>1024</value>
7305 + </param>
7306 + <param>
7307 + <key>freqvar</key>
7308 + <value>None</value>
7309 + </param>
7310 + <param>
7311 + <key>_coordinate</key>
7312 + <value>(736, 1012)</value>
7313 + </param>
7314 + <param>
7315 + <key>_rotation</key>
7316 + <value>0</value>
7317 + </param>
7318 + <param>
7319 + <key>grid_pos</key>
7320 + <value></value>
7321 + </param>
7322 + <param>
7323 + <key>id</key>
7324 + <value>wxgui_fftsink2_0_0_0</value>
7325 + </param>
7326 + <param>
7327 + <key>notebook</key>
7328 + <value>nb, 2</value>
7329 + </param>
7330 + <param>
7331 + <key>peak_hold</key>
7332 + <value>False</value>
7333 + </param>
7334 + <param>
7335 + <key>ref_level</key>
7336 + <value>0</value>
7337 + </param>
7338 + <param>
7339 + <key>ref_scale</key>
7340 + <value>2.0</value>
7341 + </param>
7342 + <param>
7343 + <key>fft_rate</key>
7344 + <value>15</value>
7345 + </param>
7346 + <param>
7347 + <key>samp_rate</key>
7348 + <value>audio_decim_rate</value>
7349 + </param>
7350 + <param>
7351 + <key>title</key>
7352 + <value>L+R</value>
7353 + </param>
7354 + <param>
7355 + <key>type</key>
7356 + <value>float</value>
7357 + </param>
7358 + <param>
7359 + <key>win_size</key>
7360 + <value></value>
7361 + </param>
7362 + <param>
7363 + <key>win</key>
7364 + <value>None</value>
7365 + </param>
7366 + <param>
7367 + <key>y_divs</key>
7368 + <value>10</value>
7369 + </param>
7370 + <param>
7371 + <key>y_per_div</key>
7372 + <value>10</value>
7373 + </param>
7374 + </block>
7375 + <block>
7376 + <key>wxgui_fftsink2</key>
7377 + <param>
7378 + <key>avg_alpha</key>
7379 + <value>0</value>
7380 + </param>
7381 + <param>
7382 + <key>average</key>
7383 + <value>False</value>
7384 + </param>
7385 + <param>
7386 + <key>baseband_freq</key>
7387 + <value>0</value>
7388 + </param>
7389 + <param>
7390 + <key>alias</key>
7391 + <value></value>
7392 + </param>
7393 + <param>
7394 + <key>comment</key>
7395 + <value></value>
7396 + </param>
7397 + <param>
7398 + <key>affinity</key>
7399 + <value></value>
7400 + </param>
7401 + <param>
7402 + <key>_enabled</key>
7403 + <value>True</value>
7404 + </param>
7405 + <param>
7406 + <key>fft_size</key>
7407 + <value>1024</value>
7408 + </param>
7409 + <param>
7410 + <key>freqvar</key>
7411 + <value>None</value>
7412 + </param>
7413 + <param>
7414 + <key>_coordinate</key>
7415 + <value>(1504, 316)</value>
7416 + </param>
7417 + <param>
7418 + <key>_rotation</key>
7419 + <value>0</value>
7420 + </param>
7421 + <param>
7422 + <key>grid_pos</key>
7423 + <value></value>
7424 + </param>
7425 + <param>
7426 + <key>id</key>
7427 + <value>wxgui_fftsink2_0_0_0_1</value>
7428 + </param>
7429 + <param>
7430 + <key>notebook</key>
7431 + <value>nb, 5</value>
7432 + </param>
7433 + <param>
7434 + <key>peak_hold</key>
7435 + <value>False</value>
7436 + </param>
7437 + <param>
7438 + <key>ref_level</key>
7439 + <value>0</value>
7440 + </param>
7441 + <param>
7442 + <key>ref_scale</key>
7443 + <value>2.0</value>
7444 + </param>
7445 + <param>
7446 + <key>fft_rate</key>
7447 + <value>15</value>
7448 + </param>
7449 + <param>
7450 + <key>samp_rate</key>
7451 + <value>baseband_rate</value>
7452 + </param>
7453 + <param>
7454 + <key>title</key>
7455 + <value>DSBSC Sub-carrier</value>
7456 + </param>
7457 + <param>
7458 + <key>type</key>
7459 + <value>float</value>
7460 + </param>
7461 + <param>
7462 + <key>win_size</key>
7463 + <value></value>
7464 + </param>
7465 + <param>
7466 + <key>win</key>
7467 + <value>None</value>
7468 + </param>
7469 + <param>
7470 + <key>y_divs</key>
7471 + <value>10</value>
7472 + </param>
7473 + <param>
7474 + <key>y_per_div</key>
7475 + <value>10</value>
7476 + </param>
7477 + </block>
7478 + <block>
7479 + <key>wxgui_fftsink2</key>
7480 + <param>
7481 + <key>avg_alpha</key>
7482 + <value>0</value>
7483 + </param>
7484 + <param>
7485 + <key>average</key>
7486 + <value>False</value>
7487 + </param>
7488 + <param>
7489 + <key>baseband_freq</key>
7490 + <value>0</value>
7491 + </param>
7492 + <param>
7493 + <key>alias</key>
7494 + <value></value>
7495 + </param>
7496 + <param>
7497 + <key>comment</key>
7498 + <value></value>
7499 + </param>
7500 + <param>
7501 + <key>affinity</key>
7502 + <value></value>
7503 + </param>
7504 + <param>
7505 + <key>_enabled</key>
7506 + <value>True</value>
7507 + </param>
7508 + <param>
7509 + <key>fft_size</key>
7510 + <value>1024</value>
7511 + </param>
7512 + <param>
7513 + <key>freqvar</key>
7514 + <value>None</value>
7515 + </param>
7516 + <param>
7517 + <key>_coordinate</key>
7518 + <value>(1096, 1012)</value>
7519 + </param>
7520 + <param>
7521 + <key>_rotation</key>
7522 + <value>180</value>
7523 + </param>
7524 + <param>
7525 + <key>grid_pos</key>
7526 + <value></value>
7527 + </param>
7528 + <param>
7529 + <key>id</key>
7530 + <value>wxgui_fftsink2_0_0_0_1_0_0</value>
7531 + </param>
7532 + <param>
7533 + <key>notebook</key>
7534 + <value>nb, 3</value>
7535 + </param>
7536 + <param>
7537 + <key>peak_hold</key>
7538 + <value>False</value>
7539 + </param>
7540 + <param>
7541 + <key>ref_level</key>
7542 + <value>-50</value>
7543 + </param>
7544 + <param>
7545 + <key>ref_scale</key>
7546 + <value>2.0</value>
7547 + </param>
7548 + <param>
7549 + <key>fft_rate</key>
7550 + <value>15</value>
7551 + </param>
7552 + <param>
7553 + <key>samp_rate</key>
7554 + <value>baseband_rate</value>
7555 + </param>
7556 + <param>
7557 + <key>title</key>
7558 + <value>L-R</value>
7559 + </param>
7560 + <param>
7561 + <key>type</key>
7562 + <value>float</value>
7563 + </param>
7564 + <param>
7565 + <key>win_size</key>
7566 + <value></value>
7567 + </param>
7568 + <param>
7569 + <key>win</key>
7570 + <value>None</value>
7571 + </param>
7572 + <param>
7573 + <key>y_divs</key>
7574 + <value>10</value>
7575 + </param>
7576 + <param>
7577 + <key>y_per_div</key>
7578 + <value>10</value>
7579 + </param>
7580 + </block>
7581 + <block>
7582 + <key>wxgui_fftsink2</key>
7583 + <param>
7584 + <key>avg_alpha</key>
7585 + <value>0</value>
7586 + </param>
7587 + <param>
7588 + <key>average</key>
7589 + <value>False</value>
7590 + </param>
7591 + <param>
7592 + <key>baseband_freq</key>
7593 + <value>0</value>
7594 + </param>
7595 + <param>
7596 + <key>alias</key>
7597 + <value></value>
7598 + </param>
7599 + <param>
7600 + <key>comment</key>
7601 + <value></value>
7602 + </param>
7603 + <param>
7604 + <key>affinity</key>
7605 + <value></value>
7606 + </param>
7607 + <param>
7608 + <key>_enabled</key>
7609 + <value>True</value>
7610 + </param>
7611 + <param>
7612 + <key>fft_size</key>
7613 + <value>1024</value>
7614 + </param>
7615 + <param>
7616 + <key>freqvar</key>
7617 + <value>None</value>
7618 + </param>
7619 + <param>
7620 + <key>_coordinate</key>
7621 + <value>(312, 684)</value>
7622 + </param>
7623 + <param>
7624 + <key>_rotation</key>
7625 + <value>0</value>
7626 + </param>
7627 + <param>
7628 + <key>grid_pos</key>
7629 + <value></value>
7630 + </param>
7631 + <param>
7632 + <key>id</key>
7633 + <value>wxgui_fftsink2_0_0_0_1_0_1</value>
7634 + </param>
7635 + <param>
7636 + <key>notebook</key>
7637 + <value>nb,6</value>
7638 + </param>
7639 + <param>
7640 + <key>peak_hold</key>
7641 + <value>False</value>
7642 + </param>
7643 + <param>
7644 + <key>ref_level</key>
7645 + <value>0</value>
7646 + </param>
7647 + <param>
7648 + <key>ref_scale</key>
7649 + <value>2.0</value>
7650 + </param>
7651 + <param>
7652 + <key>fft_rate</key>
7653 + <value>15</value>
7654 + </param>
7655 + <param>
7656 + <key>samp_rate</key>
7657 + <value>audio_rate</value>
7658 + </param>
7659 + <param>
7660 + <key>title</key>
7661 + <value>RDS</value>
7662 + </param>
7663 + <param>
7664 + <key>type</key>
7665 + <value>complex</value>
7666 + </param>
7667 + <param>
7668 + <key>win_size</key>
7669 + <value></value>
7670 + </param>
7671 + <param>
7672 + <key>win</key>
7673 + <value>None</value>
7674 + </param>
7675 + <param>
7676 + <key>y_divs</key>
7677 + <value>10</value>
7678 + </param>
7679 + <param>
7680 + <key>y_per_div</key>
7681 + <value>10</value>
7682 + </param>
7683 + </block>
7684 + <block>
7685 + <key>wxgui_scopesink2</key>
7686 + <param>
7687 + <key>ac_couple</key>
7688 + <value>False</value>
7689 + </param>
7690 + <param>
7691 + <key>alias</key>
7692 + <value></value>
7693 + </param>
7694 + <param>
7695 + <key>comment</key>
7696 + <value></value>
7697 + </param>
7698 + <param>
7699 + <key>affinity</key>
7700 + <value></value>
7701 + </param>
7702 + <param>
7703 + <key>_enabled</key>
7704 + <value>1</value>
7705 + </param>
7706 + <param>
7707 + <key>_coordinate</key>
7708 + <value>(864, 728)</value>
7709 + </param>
7710 + <param>
7711 + <key>_rotation</key>
7712 + <value>180</value>
7713 + </param>
7714 + <param>
7715 + <key>grid_pos</key>
7716 + <value></value>
7717 + </param>
7718 + <param>
7719 + <key>id</key>
7720 + <value>wxgui_scopesink2_0</value>
7721 + </param>
7722 + <param>
7723 + <key>notebook</key>
7724 + <value>nb, 4</value>
7725 + </param>
7726 + <param>
7727 + <key>num_inputs</key>
7728 + <value>1</value>
7729 + </param>
7730 + <param>
7731 + <key>samp_rate</key>
7732 + <value>baseband_rate</value>
7733 + </param>
7734 + <param>
7735 + <key>t_scale</key>
7736 + <value>0</value>
7737 + </param>
7738 + <param>
7739 + <key>title</key>
7740 + <value>Pilot</value>
7741 + </param>
7742 + <param>
7743 + <key>trig_mode</key>
7744 + <value>wxgui.TRIG_MODE_AUTO</value>
7745 + </param>
7746 + <param>
7747 + <key>type</key>
7748 + <value>float</value>
7749 + </param>
7750 + <param>
7751 + <key>v_offset</key>
7752 + <value>0</value>
7753 + </param>
7754 + <param>
7755 + <key>v_scale</key>
7756 + <value>0</value>
7757 + </param>
7758 + <param>
7759 + <key>win_size</key>
7760 + <value></value>
7761 + </param>
7762 + <param>
7763 + <key>xy_mode</key>
7764 + <value>False</value>
7765 + </param>
7766 + <param>
7767 + <key>y_axis_label</key>
7768 + <value>Counts</value>
7769 + </param>
7770 + </block>
7771 + <block>
7772 + <key>wxgui_scopesink2</key>
7773 + <param>
7774 + <key>ac_couple</key>
7775 + <value>False</value>
7776 + </param>
7777 + <param>
7778 + <key>alias</key>
7779 + <value></value>
7780 + </param>
7781 + <param>
7782 + <key>comment</key>
7783 + <value></value>
7784 + </param>
7785 + <param>
7786 + <key>affinity</key>
7787 + <value></value>
7788 + </param>
7789 + <param>
7790 + <key>_enabled</key>
7791 + <value>True</value>
7792 + </param>
7793 + <param>
7794 + <key>_coordinate</key>
7795 + <value>(320, 904)</value>
7796 + </param>
7797 + <param>
7798 + <key>_rotation</key>
7799 + <value>0</value>
7800 + </param>
7801 + <param>
7802 + <key>grid_pos</key>
7803 + <value></value>
7804 + </param>
7805 + <param>
7806 + <key>id</key>
7807 + <value>wxgui_scopesink2_1</value>
7808 + </param>
7809 + <param>
7810 + <key>notebook</key>
7811 + <value>nb,7</value>
7812 + </param>
7813 + <param>
7814 + <key>num_inputs</key>
7815 + <value>1</value>
7816 + </param>
7817 + <param>
7818 + <key>samp_rate</key>
7819 + <value>2375</value>
7820 + </param>
7821 + <param>
7822 + <key>t_scale</key>
7823 + <value>0</value>
7824 + </param>
7825 + <param>
7826 + <key>title</key>
7827 + <value>Scope Plot</value>
7828 + </param>
7829 + <param>
7830 + <key>trig_mode</key>
7831 + <value>wxgui.TRIG_MODE_AUTO</value>
7832 + </param>
7833 + <param>
7834 + <key>type</key>
7835 + <value>complex</value>
7836 + </param>
7837 + <param>
7838 + <key>v_offset</key>
7839 + <value>0</value>
7840 + </param>
7841 + <param>
7842 + <key>v_scale</key>
7843 + <value>0.4</value>
7844 + </param>
7845 + <param>
7846 + <key>win_size</key>
7847 + <value></value>
7848 + </param>
7849 + <param>
7850 + <key>xy_mode</key>
7851 + <value>True</value>
7852 + </param>
7853 + <param>
7854 + <key>y_axis_label</key>
7855 + <value>Counts</value>
7856 + </param>
7857 + </block>
7858 + <block>
7859 + <key>wxgui_waterfallsink2</key>
7860 + <param>
7861 + <key>avg_alpha</key>
7862 + <value>0</value>
7863 + </param>
7864 + <param>
7865 + <key>average</key>
7866 + <value>False</value>
7867 + </param>
7868 + <param>
7869 + <key>baseband_freq</key>
7870 + <value>0</value>
7871 + </param>
7872 + <param>
7873 + <key>alias</key>
7874 + <value></value>
7875 + </param>
7876 + <param>
7877 + <key>comment</key>
7878 + <value></value>
7879 + </param>
7880 + <param>
7881 + <key>affinity</key>
7882 + <value></value>
7883 + </param>
7884 + <param>
7885 + <key>dynamic_range</key>
7886 + <value>100</value>
7887 + </param>
7888 + <param>
7889 + <key>_enabled</key>
7890 + <value>True</value>
7891 + </param>
7892 + <param>
7893 + <key>fft_rate</key>
7894 + <value>15</value>
7895 + </param>
7896 + <param>
7897 + <key>fft_size</key>
7898 + <value>512</value>
7899 + </param>
7900 + <param>
7901 + <key>freqvar</key>
7902 + <value>None</value>
7903 + </param>
7904 + <param>
7905 + <key>_coordinate</key>
7906 + <value>(736, 124)</value>
7907 + </param>
7908 + <param>
7909 + <key>_rotation</key>
7910 + <value>0</value>
7911 + </param>
7912 + <param>
7913 + <key>grid_pos</key>
7914 + <value></value>
7915 + </param>
7916 + <param>
7917 + <key>id</key>
7918 + <value>wxgui_waterfallsink2_0</value>
7919 + </param>
7920 + <param>
7921 + <key>notebook</key>
7922 + <value>nb,8</value>
7923 + </param>
7924 + <param>
7925 + <key>ref_scale</key>
7926 + <value>2.0</value>
7927 + </param>
7928 + <param>
7929 + <key>ref_level</key>
7930 + <value>0</value>
7931 + </param>
7932 + <param>
7933 + <key>samp_rate</key>
7934 + <value>baseband_rate</value>
7935 + </param>
7936 + <param>
7937 + <key>title</key>
7938 + <value>Waterfall Plot</value>
7939 + </param>
7940 + <param>
7941 + <key>type</key>
7942 + <value>float</value>
7943 + </param>
7944 + <param>
7945 + <key>win_size</key>
7946 + <value></value>
7947 + </param>
7948 + <param>
7949 + <key>win</key>
7950 + <value>None</value>
7951 + </param>
7952 + </block>
7953 + <connection>
7954 + <source_block_id>analog_fm_deemph_0_0</source_block_id>
7955 + <sink_block_id>blocks_multiply_const_vxx_0_0</sink_block_id>
7956 + <source_key>0</source_key>
7957 + <sink_key>0</sink_key>
7958 + </connection>
7959 + <connection>
7960 + <source_block_id>analog_fm_deemph_0_0_0</source_block_id>
7961 + <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id>
7962 + <source_key>0</source_key>
7963 + <sink_key>0</sink_key>
7964 + </connection>
7965 + <connection>
7966 + <source_block_id>analog_pll_refout_cc_0</source_block_id>
7967 + <sink_block_id>blocks_multiply_xx_1</sink_block_id>
7968 + <source_key>0</source_key>
7969 + <sink_key>0</sink_key>
7970 + </connection>
7971 + <connection>
7972 + <source_block_id>analog_pll_refout_cc_0</source_block_id>
7973 + <sink_block_id>blocks_multiply_xx_1</sink_block_id>
7974 + <source_key>0</source_key>
7975 + <sink_key>1</sink_key>
7976 + </connection>
7977 + <connection>
7978 + <source_block_id>analog_wfm_rcv_0</source_block_id>
7979 + <sink_block_id>fir_filter_xxx_1</sink_block_id>
7980 + <source_key>0</source_key>
7981 + <sink_key>0</sink_key>
7982 + </connection>
7983 + <connection>
7984 + <source_block_id>analog_wfm_rcv_0</source_block_id>
7985 + <sink_block_id>fir_filter_xxx_2</sink_block_id>
7986 + <source_key>0</source_key>
7987 + <sink_key>0</sink_key>
7988 + </connection>
7989 + <connection>
7990 + <source_block_id>analog_wfm_rcv_0</source_block_id>
7991 + <sink_block_id>fir_filter_xxx_3</sink_block_id>
7992 + <source_key>0</source_key>
7993 + <sink_key>0</sink_key>
7994 + </connection>
7995 + <connection>
7996 + <source_block_id>analog_wfm_rcv_0</source_block_id>
7997 + <sink_block_id>freq_xlating_fir_filter_xxx_1</sink_block_id>
7998 + <source_key>0</source_key>
7999 + <sink_key>0</sink_key>
8000 + </connection>
8001 + <connection>
8002 + <source_block_id>analog_wfm_rcv_0</source_block_id>
8003 + <sink_block_id>wxgui_fftsink2_0_0</sink_block_id>
8004 + <source_key>0</source_key>
8005 + <sink_key>0</sink_key>
8006 + </connection>
8007 + <connection>
8008 + <source_block_id>analog_wfm_rcv_0</source_block_id>
8009 + <sink_block_id>wxgui_waterfallsink2_0</sink_block_id>
8010 + <source_key>0</source_key>
8011 + <sink_key>0</sink_key>
8012 + </connection>
8013 + <connection>
8014 + <source_block_id>blocks_add_xx_0</source_block_id>
8015 + <sink_block_id>analog_fm_deemph_0_0_0</sink_block_id>
8016 + <source_key>0</source_key>
8017 + <sink_key>0</sink_key>
8018 + </connection>
8019 + <connection>
8020 + <source_block_id>blocks_complex_to_imag_0</source_block_id>
8021 + <sink_block_id>blocks_multiply_xx_0</sink_block_id>
8022 + <source_key>0</source_key>
8023 + <sink_key>1</sink_key>
8024 + </connection>
8025 + <connection>
8026 + <source_block_id>blocks_complex_to_imag_0</source_block_id>
8027 + <sink_block_id>wxgui_scopesink2_0</sink_block_id>
8028 + <source_key>0</source_key>
8029 + <sink_key>0</sink_key>
8030 + </connection>
8031 + <connection>
8032 + <source_block_id>blocks_complex_to_real_0</source_block_id>
8033 + <sink_block_id>digital_binary_slicer_fb_0</sink_block_id>
8034 + <source_key>0</source_key>
8035 + <sink_key>0</sink_key>
8036 + </connection>
8037 + <connection>
8038 + <source_block_id>blocks_keep_one_in_n_0</source_block_id>
8039 + <sink_block_id>digital_diff_decoder_bb_0</sink_block_id>
8040 + <source_key>0</source_key>
8041 + <sink_key>0</sink_key>
8042 + </connection>
8043 + <connection>
8044 + <source_block_id>blocks_multiply_const_vxx_0</source_block_id>
8045 + <sink_block_id>rational_resampler_xxx_0</sink_block_id>
8046 + <source_key>0</source_key>
8047 + <sink_key>0</sink_key>
8048 + </connection>
8049 + <connection>
8050 + <source_block_id>blocks_multiply_const_vxx_0_0</source_block_id>
8051 + <sink_block_id>rational_resampler_xxx_0_0</sink_block_id>
8052 + <source_key>0</source_key>
8053 + <sink_key>0</sink_key>
8054 + </connection>
8055 + <connection>
8056 + <source_block_id>blocks_multiply_xx_0</source_block_id>
8057 + <sink_block_id>fir_filter_xxx_5</sink_block_id>
8058 + <source_key>0</source_key>
8059 + <sink_key>0</sink_key>
8060 + </connection>
8061 + <connection>
8062 + <source_block_id>blocks_multiply_xx_0</source_block_id>
8063 + <sink_block_id>wxgui_fftsink2_0_0_0_1_0_0</sink_block_id>
8064 + <source_key>0</source_key>
8065 + <sink_key>0</sink_key>
8066 + </connection>
8067 + <connection>
8068 + <source_block_id>blocks_multiply_xx_1</source_block_id>
8069 + <sink_block_id>blocks_complex_to_imag_0</sink_block_id>
8070 + <source_key>0</source_key>
8071 + <sink_key>0</sink_key>
8072 + </connection>
8073 + <connection>
8074 + <source_block_id>blocks_sub_xx_0</source_block_id>
8075 + <sink_block_id>analog_fm_deemph_0_0</sink_block_id>
8076 + <source_key>0</source_key>
8077 + <sink_key>0</sink_key>
8078 + </connection>
8079 + <connection>
8080 + <source_block_id>digital_binary_slicer_fb_0</source_block_id>
8081 + <sink_block_id>blocks_keep_one_in_n_0</sink_block_id>
8082 + <source_key>0</source_key>
8083 + <sink_key>0</sink_key>
8084 + </connection>
8085 + <connection>
8086 + <source_block_id>digital_diff_decoder_bb_0</source_block_id>
8087 + <sink_block_id>gr_rds_decoder_0</sink_block_id>
8088 + <source_key>0</source_key>
8089 + <sink_key>0</sink_key>
8090 + </connection>
8091 + <connection>
8092 + <source_block_id>digital_mpsk_receiver_cc_0</source_block_id>
8093 + <sink_block_id>blocks_complex_to_real_0</sink_block_id>
8094 + <source_key>0</source_key>
8095 + <sink_key>0</sink_key>
8096 + </connection>
8097 + <connection>
8098 + <source_block_id>digital_mpsk_receiver_cc_0</source_block_id>
8099 + <sink_block_id>wxgui_scopesink2_1</sink_block_id>
8100 + <source_key>0</source_key>
8101 + <sink_key>0</sink_key>
8102 + </connection>
8103 + <connection>
8104 + <source_block_id>fir_filter_xxx_1</source_block_id>
8105 + <sink_block_id>blocks_add_xx_0</sink_block_id>
8106 + <source_key>0</source_key>
8107 + <sink_key>0</sink_key>
8108 + </connection>
8109 + <connection>
8110 + <source_block_id>fir_filter_xxx_1</source_block_id>
8111 + <sink_block_id>blocks_sub_xx_0</sink_block_id>
8112 + <source_key>0</source_key>
8113 + <sink_key>0</sink_key>
8114 + </connection>
8115 + <connection>
8116 + <source_block_id>fir_filter_xxx_1</source_block_id>
8117 + <sink_block_id>wxgui_fftsink2_0_0_0</sink_block_id>
8118 + <source_key>0</source_key>
8119 + <sink_key>0</sink_key>
8120 + </connection>
8121 + <connection>
8122 + <source_block_id>fir_filter_xxx_2</source_block_id>
8123 + <sink_block_id>analog_pll_refout_cc_0</sink_block_id>
8124 + <source_key>0</source_key>
8125 + <sink_key>0</sink_key>
8126 + </connection>
8127 + <connection>
8128 + <source_block_id>fir_filter_xxx_3</source_block_id>
8129 + <sink_block_id>blocks_multiply_xx_0</sink_block_id>
8130 + <source_key>0</source_key>
8131 + <sink_key>0</sink_key>
8132 + </connection>
8133 + <connection>
8134 + <source_block_id>fir_filter_xxx_3</source_block_id>
8135 + <sink_block_id>wxgui_fftsink2_0_0_0_1</sink_block_id>
8136 + <source_key>0</source_key>
8137 + <sink_key>0</sink_key>
8138 + </connection>
8139 + <connection>
8140 + <source_block_id>fir_filter_xxx_5</source_block_id>
8141 + <sink_block_id>blocks_add_xx_0</sink_block_id>
8142 + <source_key>0</source_key>
8143 + <sink_key>1</sink_key>
8144 + </connection>
8145 + <connection>
8146 + <source_block_id>fir_filter_xxx_5</source_block_id>
8147 + <sink_block_id>blocks_sub_xx_0</sink_block_id>
8148 + <source_key>0</source_key>
8149 + <sink_key>1</sink_key>
8150 + </connection>
8151 + <connection>
8152 + <source_block_id>freq_xlating_fir_filter_xxx_0</source_block_id>
8153 + <sink_block_id>analog_wfm_rcv_0</sink_block_id>
8154 + <source_key>0</source_key>
8155 + <sink_key>0</sink_key>
8156 + </connection>
8157 + <connection>
8158 + <source_block_id>freq_xlating_fir_filter_xxx_0</source_block_id>
8159 + <sink_block_id>wxgui_fftsink2_0</sink_block_id>
8160 + <source_key>0</source_key>
8161 + <sink_key>0</sink_key>
8162 + </connection>
8163 + <connection>
8164 + <source_block_id>freq_xlating_fir_filter_xxx_1</source_block_id>
8165 + <sink_block_id>root_raised_cosine_filter_0</sink_block_id>
8166 + <source_key>0</source_key>
8167 + <sink_key>0</sink_key>
8168 + </connection>
8169 + <connection>
8170 + <source_block_id>freq_xlating_fir_filter_xxx_1</source_block_id>
8171 + <sink_block_id>wxgui_fftsink2_0_0_0_1_0_1</sink_block_id>
8172 + <source_key>0</source_key>
8173 + <sink_key>0</sink_key>
8174 + </connection>
8175 + <connection>
8176 + <source_block_id>gr_rds_decoder_0</source_block_id>
8177 + <sink_block_id>gr_rds_parser_0</sink_block_id>
8178 + <source_key>out</source_key>
8179 + <sink_key>in</sink_key>
8180 + </connection>
8181 + <connection>
8182 + <source_block_id>gr_rds_parser_0</source_block_id>
8183 + <sink_block_id>gr_rds_panel_0</sink_block_id>
8184 + <source_key>out</source_key>
8185 + <sink_key>in</sink_key>
8186 + </connection>
8187 + <connection>
8188 + <source_block_id>limesdr_source_0</source_block_id>
8189 + <sink_block_id>freq_xlating_fir_filter_xxx_0</sink_block_id>
8190 + <source_key>0</source_key>
8191 + <sink_key>0</sink_key>
8192 + </connection>
8193 + <connection>
8194 + <source_block_id>rational_resampler_xxx_0</source_block_id>
8195 + <sink_block_id>audio_sink_0</sink_block_id>
8196 + <source_key>0</source_key>
8197 + <sink_key>0</sink_key>
8198 + </connection>
8199 + <connection>
8200 + <source_block_id>rational_resampler_xxx_0_0</source_block_id>
8201 + <sink_block_id>audio_sink_0</sink_block_id>
8202 + <source_key>0</source_key>
8203 + <sink_key>1</sink_key>
8204 + </connection>
8205 + <connection>
8206 + <source_block_id>root_raised_cosine_filter_0</source_block_id>
8207 + <sink_block_id>digital_mpsk_receiver_cc_0</sink_block_id>
8208 + <source_key>0</source_key>
8209 + <sink_key>0</sink_key>
8210 + </connection>
8211 +</flow_graph>
8212 diff --git a/examples/FM_receiver.grc b/examples/FM_receiver.grc
8213 index a47f6f2..17c8b42 100644
8214 --- a/examples/FM_receiver.grc
8215 +++ b/examples/FM_receiver.grc
8216 @@ -1,396 +1,798 @@
8217 -options:
8218 - parameters:
8219 - author: Lime Microsystems
8220 - category: '[GRC Hier Blocks]'
8221 - cmake_opt: ''
8222 - comment: ''
8223 - copyright: ''
8224 - description: ''
8225 - gen_cmake: 'On'
8226 - gen_linking: dynamic
8227 - generate_options: qt_gui
8228 - hier_block_src_path: '.:'
8229 - id: top_block
8230 - max_nouts: '0'
8231 - output_language: python
8232 - placement: (0,0)
8233 - qt_qss_theme: ''
8234 - realtime_scheduling: ''
8235 - run: 'True'
8236 - run_command: '{python} -u {filename}'
8237 - run_options: prompt
8238 - sizing_mode: fixed
8239 - thread_safe_setters: ''
8240 - title: FM Receiver
8241 - window_size: ''
8242 - states:
8243 - bus_sink: false
8244 - bus_source: false
8245 - bus_structure: null
8246 - coordinate: [8, 8]
8247 - rotation: 0
8248 - state: enabled
8249 -
8250 -blocks:
8251 -- name: baseband
8252 - id: variable_qtgui_entry
8253 - parameters:
8254 - comment: ''
8255 - gui_hint: 0,0,1,1
8256 - label: RX Baseband [MHz]
8257 - type: real
8258 - value: '100'
8259 - states:
8260 - bus_sink: false
8261 - bus_source: false
8262 - bus_structure: null
8263 - coordinate: [165, 293]
8264 - rotation: 0
8265 - state: true
8266 -- name: cut_freq
8267 - id: variable_qtgui_range
8268 - parameters:
8269 - comment: ''
8270 - gui_hint: 2,0,1,1
8271 - label: Cutoff frequency
8272 - min_len: '200'
8273 - orient: Qt.Horizontal
8274 - rangeType: float
8275 - start: 1e3
8276 - step: 1e3
8277 - stop: samp_rate/2
8278 - value: 500e3
8279 - widget: counter_slider
8280 - states:
8281 - bus_sink: false
8282 - bus_source: false
8283 - bus_structure: null
8284 - coordinate: [460, 323]
8285 - rotation: 0
8286 - state: true
8287 -- name: gain
8288 - id: variable_qtgui_range
8289 - parameters:
8290 - comment: ''
8291 - gui_hint: 1,0,1,1
8292 - label: Gain [dB]
8293 - min_len: '70'
8294 - orient: Qt.Horizontal
8295 - rangeType: int
8296 - start: '0'
8297 - step: '1'
8298 - stop: '70'
8299 - value: '30'
8300 - widget: counter_slider
8301 - states:
8302 - bus_sink: false
8303 - bus_source: false
8304 - bus_structure: null
8305 - coordinate: [193, 80]
8306 - rotation: 0
8307 - state: true
8308 -- name: lna_path
8309 - id: variable_qtgui_chooser
8310 - parameters:
8311 - comment: ''
8312 - gui_hint: 0,1,1,1
8313 - label: LNA Path
8314 - label0: Auto
8315 - label1: H
8316 - label2: L
8317 - label3: W
8318 - label4: ''
8319 - labels: '[]'
8320 - num_opts: '4'
8321 - option1: '1'
8322 - option2: '2'
8323 - option3: '3'
8324 - option4: '4'
8325 - options: '[0, 1, 2]'
8326 - orient: Qt.QVBoxLayout
8327 - type: int
8328 - value: '255'
8329 - widget: combo_box
8330 - states:
8331 - bus_sink: false
8332 - bus_source: false
8333 - bus_structure: null
8334 - coordinate: [10, 167]
8335 - rotation: 0
8336 - state: true
8337 -- name: samp_rate
8338 - id: variable
8339 - parameters:
8340 - comment: ''
8341 - value: 2e6
8342 - states:
8343 - bus_sink: false
8344 - bus_source: false
8345 - bus_structure: null
8346 - coordinate: [9, 104]
8347 - rotation: 0
8348 - state: enabled
8349 -- name: trans_width
8350 - id: variable_qtgui_range
8351 - parameters:
8352 - comment: ''
8353 - gui_hint: 2,1,1,1
8354 - label: Transition width
8355 - min_len: '200'
8356 - orient: Qt.Horizontal
8357 - rangeType: float
8358 - start: 10e3
8359 - step: '500'
8360 - stop: 500e3
8361 - value: 100e3
8362 - widget: counter_slider
8363 - states:
8364 - bus_sink: false
8365 - bus_source: false
8366 - bus_structure: null
8367 - coordinate: [328, 323]
8368 - rotation: 0
8369 - state: true
8370 -- name: volume
8371 - id: variable_qtgui_range
8372 - parameters:
8373 - comment: ''
8374 - gui_hint: 1,1,1,1
8375 - label: Volume
8376 - min_len: '200'
8377 - orient: Qt.Horizontal
8378 - rangeType: float
8379 - start: '0'
8380 - step: '0.1'
8381 - stop: '10'
8382 - value: '5'
8383 - widget: counter_slider
8384 - states:
8385 - bus_sink: false
8386 - bus_source: false
8387 - bus_structure: null
8388 - coordinate: [1010, 102]
8389 - rotation: 0
8390 - state: true
8391 -- name: analog_wfm_rcv_0
8392 - id: analog_wfm_rcv
8393 - parameters:
8394 - affinity: ''
8395 - alias: ''
8396 - audio_decimation: '10'
8397 - comment: ''
8398 - maxoutbuf: '0'
8399 - minoutbuf: '0'
8400 - quad_rate: 480e3
8401 - states:
8402 - bus_sink: false
8403 - bus_source: false
8404 - bus_structure: null
8405 - coordinate: [807, 218]
8406 - rotation: 0
8407 - state: true
8408 -- name: audio_sink_0
8409 - id: audio_sink
8410 - parameters:
8411 - affinity: ''
8412 - alias: ''
8413 - comment: ''
8414 - device_name: ''
8415 - num_inputs: '1'
8416 - ok_to_block: 'True'
8417 - samp_rate: '48000'
8418 - states:
8419 - bus_sink: false
8420 - bus_source: false
8421 - bus_structure: null
8422 - coordinate: [1174, 226]
8423 - rotation: 0
8424 - state: true
8425 -- name: blocks_multiply_const_vxx_0
8426 - id: blocks_multiply_const_vxx
8427 - parameters:
8428 - affinity: ''
8429 - alias: ''
8430 - comment: ''
8431 - const: volume
8432 - maxoutbuf: '0'
8433 - minoutbuf: '0'
8434 - type: float
8435 - vlen: '1'
8436 - states:
8437 - bus_sink: false
8438 - bus_source: false
8439 - bus_structure: null
8440 - coordinate: [1010, 226]
8441 - rotation: 0
8442 - state: enabled
8443 -- name: limesdr_source_0
8444 - id: limesdr_source
8445 - parameters:
8446 - affinity: ''
8447 - alias: ''
8448 - allow_tcxo_dac: '0'
8449 - analog_bandw_ch0: 2e6
8450 - analog_bandw_ch1: 1.5e6
8451 - calibr_bandw_ch0: 2.5e6
8452 - calibr_bandw_ch1: 2.5e6
8453 - channel_mode: '0'
8454 - comment: ''
8455 - dacVal: '180'
8456 - digital_bandw_ch0: 1.8e6
8457 - digital_bandw_ch1: samp_rate
8458 - filename: ''
8459 - gain_dB_ch0: gain
8460 - gain_dB_ch1: '1'
8461 - lna_path_ch0: '255'
8462 - lna_path_ch1: '2'
8463 - maxoutbuf: '0'
8464 - minoutbuf: '0'
8465 - nco_freq_ch0: '0'
8466 - nco_freq_ch1: '0'
8467 - oversample: '0'
8468 - rf_freq: baseband*1e6
8469 - samp_rate: samp_rate
8470 - serial: ''
8471 - states:
8472 - bus_sink: false
8473 - bus_source: false
8474 - bus_structure: null
8475 - coordinate: [165, 210]
8476 - rotation: 0
8477 - state: true
8478 -- name: low_pass_filter_0
8479 - id: low_pass_filter
8480 - parameters:
8481 - affinity: ''
8482 - alias: ''
8483 - beta: '6.76'
8484 - comment: ''
8485 - cutoff_freq: cut_freq
8486 - decim: '1'
8487 - gain: '1'
8488 - interp: '1'
8489 - maxoutbuf: '0'
8490 - minoutbuf: '0'
8491 - samp_rate: samp_rate
8492 - type: fir_filter_ccf
8493 - width: trans_width
8494 - win: firdes.WIN_HAMMING
8495 - states:
8496 - bus_sink: false
8497 - bus_source: false
8498 - bus_structure: null
8499 - coordinate: [391, 178]
8500 - rotation: 0
8501 - state: true
8502 -- name: qtgui_freq_sink_x_0
8503 - id: qtgui_freq_sink_x
8504 - parameters:
8505 - affinity: ''
8506 - alias: ''
8507 - alpha1: '1.0'
8508 - alpha10: '1.0'
8509 - alpha2: '1.0'
8510 - alpha3: '1.0'
8511 - alpha4: '1.0'
8512 - alpha5: '1.0'
8513 - alpha6: '1.0'
8514 - alpha7: '1.0'
8515 - alpha8: '1.0'
8516 - alpha9: '1.0'
8517 - autoscale: 'False'
8518 - average: '1.0'
8519 - axislabels: 'True'
8520 - bw: samp_rate
8521 - color1: '"blue"'
8522 - color10: '"dark blue"'
8523 - color2: '"red"'
8524 - color3: '"green"'
8525 - color4: '"black"'
8526 - color5: '"cyan"'
8527 - color6: '"magenta"'
8528 - color7: '"yellow"'
8529 - color8: '"dark red"'
8530 - color9: '"dark green"'
8531 - comment: ''
8532 - ctrlpanel: 'False'
8533 - fc: baseband*1e6
8534 - fftsize: '1024'
8535 - freqhalf: 'True'
8536 - grid: 'False'
8537 - gui_hint: 3,0,15,2
8538 - label: Relative Gain
8539 - label1: ''
8540 - label10: ''''''
8541 - label2: ''''''
8542 - label3: ''''''
8543 - label4: ''''''
8544 - label5: ''''''
8545 - label6: ''''''
8546 - label7: ''''''
8547 - label8: ''''''
8548 - label9: ''''''
8549 - legend: 'True'
8550 - maxoutbuf: '0'
8551 - minoutbuf: '0'
8552 - name: '"Low Pass filtered"'
8553 - nconnections: '1'
8554 - showports: 'False'
8555 - tr_chan: '0'
8556 - tr_level: '0.0'
8557 - tr_mode: qtgui.TRIG_MODE_FREE
8558 - tr_tag: '""'
8559 - type: complex
8560 - units: dB
8561 - update_time: '0.10'
8562 - width1: '1'
8563 - width10: '1'
8564 - width2: '1'
8565 - width3: '1'
8566 - width4: '1'
8567 - width5: '1'
8568 - width6: '1'
8569 - width7: '1'
8570 - width8: '1'
8571 - width9: '1'
8572 - wintype: firdes.WIN_BLACKMAN_hARRIS
8573 - ymax: '10'
8574 - ymin: '-140'
8575 - states:
8576 - bus_sink: false
8577 - bus_source: false
8578 - bus_structure: null
8579 - coordinate: [606, 75]
8580 - rotation: 0
8581 - state: enabled
8582 -- name: rational_resampler_xxx_0
8583 - id: rational_resampler_xxx
8584 - parameters:
8585 - affinity: ''
8586 - alias: ''
8587 - comment: ''
8588 - decim: '200'
8589 - fbw: '0'
8590 - interp: '48'
8591 - maxoutbuf: '0'
8592 - minoutbuf: '0'
8593 - taps: ''
8594 - type: ccc
8595 - states:
8596 - bus_sink: false
8597 - bus_source: false
8598 - bus_structure: null
8599 - coordinate: [606, 202]
8600 - rotation: 0
8601 - state: true
8602 -
8603 -connections:
8604 -- [analog_wfm_rcv_0, '0', blocks_multiply_const_vxx_0, '0']
8605 -- [blocks_multiply_const_vxx_0, '0', audio_sink_0, '0']
8606 -- [limesdr_source_0, '0', low_pass_filter_0, '0']
8607 -- [low_pass_filter_0, '0', qtgui_freq_sink_x_0, '0']
8608 -- [low_pass_filter_0, '0', rational_resampler_xxx_0, '0']
8609 -- [rational_resampler_xxx_0, '0', analog_wfm_rcv_0, '0']
8610 -
8611 -metadata:
8612 - file_format: 1
8613 +<?xml version='1.0' encoding='utf-8'?>
8614 +<?grc format='1' created='3.7.13'?>
8615 +<flow_graph>
8616 + <timestamp>Tue Feb 20 16:15:20 2018</timestamp>
8617 + <block>
8618 + <key>options</key>
8619 + <param>
8620 + <key>author</key>
8621 + <value>Lime Microsystems</value>
8622 + </param>
8623 + <param>
8624 + <key>window_size</key>
8625 + <value>(1200,500)</value>
8626 + </param>
8627 + <param>
8628 + <key>category</key>
8629 + <value>Custom</value>
8630 + </param>
8631 + <param>
8632 + <key>comment</key>
8633 + <value></value>
8634 + </param>
8635 + <param>
8636 + <key>description</key>
8637 + <value></value>
8638 + </param>
8639 + <param>
8640 + <key>_enabled</key>
8641 + <value>True</value>
8642 + </param>
8643 + <param>
8644 + <key>_coordinate</key>
8645 + <value>(8, 8)</value>
8646 + </param>
8647 + <param>
8648 + <key>_rotation</key>
8649 + <value>0</value>
8650 + </param>
8651 + <param>
8652 + <key>generate_options</key>
8653 + <value>wx_gui</value>
8654 + </param>
8655 + <param>
8656 + <key>hier_block_src_path</key>
8657 + <value>.:</value>
8658 + </param>
8659 + <param>
8660 + <key>id</key>
8661 + <value>top_block</value>
8662 + </param>
8663 + <param>
8664 + <key>max_nouts</key>
8665 + <value>0</value>
8666 + </param>
8667 + <param>
8668 + <key>qt_qss_theme</key>
8669 + <value></value>
8670 + </param>
8671 + <param>
8672 + <key>realtime_scheduling</key>
8673 + <value></value>
8674 + </param>
8675 + <param>
8676 + <key>run_command</key>
8677 + <value>{python} -u {filename}</value>
8678 + </param>
8679 + <param>
8680 + <key>run_options</key>
8681 + <value>prompt</value>
8682 + </param>
8683 + <param>
8684 + <key>run</key>
8685 + <value>True</value>
8686 + </param>
8687 + <param>
8688 + <key>sizing_mode</key>
8689 + <value>fixed</value>
8690 + </param>
8691 + <param>
8692 + <key>thread_safe_setters</key>
8693 + <value></value>
8694 + </param>
8695 + <param>
8696 + <key>title</key>
8697 + <value>FM receiver</value>
8698 + </param>
8699 + <param>
8700 + <key>placement</key>
8701 + <value>(0,0)</value>
8702 + </param>
8703 + </block>
8704 + <block>
8705 + <key>variable_slider</key>
8706 + <param>
8707 + <key>comment</key>
8708 + <value></value>
8709 + </param>
8710 + <param>
8711 + <key>converver</key>
8712 + <value>float_converter</value>
8713 + </param>
8714 + <param>
8715 + <key>value</key>
8716 + <value>500e3</value>
8717 + </param>
8718 + <param>
8719 + <key>_enabled</key>
8720 + <value>True</value>
8721 + </param>
8722 + <param>
8723 + <key>_coordinate</key>
8724 + <value>(248, 368)</value>
8725 + </param>
8726 + <param>
8727 + <key>_rotation</key>
8728 + <value>0</value>
8729 + </param>
8730 + <param>
8731 + <key>grid_pos</key>
8732 + <value></value>
8733 + </param>
8734 + <param>
8735 + <key>id</key>
8736 + <value>cut_freq</value>
8737 + </param>
8738 + <param>
8739 + <key>label</key>
8740 + <value>Cutoff frequency</value>
8741 + </param>
8742 + <param>
8743 + <key>max</key>
8744 + <value>1e6</value>
8745 + </param>
8746 + <param>
8747 + <key>min</key>
8748 + <value>1e3</value>
8749 + </param>
8750 + <param>
8751 + <key>notebook</key>
8752 + <value></value>
8753 + </param>
8754 + <param>
8755 + <key>num_steps</key>
8756 + <value>1000</value>
8757 + </param>
8758 + <param>
8759 + <key>style</key>
8760 + <value>wx.SL_HORIZONTAL</value>
8761 + </param>
8762 + </block>
8763 + <block>
8764 + <key>variable_slider</key>
8765 + <param>
8766 + <key>comment</key>
8767 + <value></value>
8768 + </param>
8769 + <param>
8770 + <key>converver</key>
8771 + <value>float_converter</value>
8772 + </param>
8773 + <param>
8774 + <key>value</key>
8775 + <value>100e3</value>
8776 + </param>
8777 + <param>
8778 + <key>_enabled</key>
8779 + <value>True</value>
8780 + </param>
8781 + <param>
8782 + <key>_coordinate</key>
8783 + <value>(392, 368)</value>
8784 + </param>
8785 + <param>
8786 + <key>_rotation</key>
8787 + <value>0</value>
8788 + </param>
8789 + <param>
8790 + <key>grid_pos</key>
8791 + <value></value>
8792 + </param>
8793 + <param>
8794 + <key>id</key>
8795 + <value>trans_width</value>
8796 + </param>
8797 + <param>
8798 + <key>label</key>
8799 + <value>Transition width</value>
8800 + </param>
8801 + <param>
8802 + <key>max</key>
8803 + <value>500e3</value>
8804 + </param>
8805 + <param>
8806 + <key>min</key>
8807 + <value>10e3</value>
8808 + </param>
8809 + <param>
8810 + <key>notebook</key>
8811 + <value></value>
8812 + </param>
8813 + <param>
8814 + <key>num_steps</key>
8815 + <value>1000</value>
8816 + </param>
8817 + <param>
8818 + <key>style</key>
8819 + <value>wx.SL_HORIZONTAL</value>
8820 + </param>
8821 + </block>
8822 + <block>
8823 + <key>variable_slider</key>
8824 + <param>
8825 + <key>comment</key>
8826 + <value></value>
8827 + </param>
8828 + <param>
8829 + <key>converver</key>
8830 + <value>float_converter</value>
8831 + </param>
8832 + <param>
8833 + <key>value</key>
8834 + <value>5</value>
8835 + </param>
8836 + <param>
8837 + <key>_enabled</key>
8838 + <value>True</value>
8839 + </param>
8840 + <param>
8841 + <key>_coordinate</key>
8842 + <value>(896, 152)</value>
8843 + </param>
8844 + <param>
8845 + <key>_rotation</key>
8846 + <value>0</value>
8847 + </param>
8848 + <param>
8849 + <key>grid_pos</key>
8850 + <value></value>
8851 + </param>
8852 + <param>
8853 + <key>id</key>
8854 + <value>volume</value>
8855 + </param>
8856 + <param>
8857 + <key>label</key>
8858 + <value>Volume</value>
8859 + </param>
8860 + <param>
8861 + <key>max</key>
8862 + <value>10</value>
8863 + </param>
8864 + <param>
8865 + <key>min</key>
8866 + <value>0</value>
8867 + </param>
8868 + <param>
8869 + <key>notebook</key>
8870 + <value></value>
8871 + </param>
8872 + <param>
8873 + <key>num_steps</key>
8874 + <value>100</value>
8875 + </param>
8876 + <param>
8877 + <key>style</key>
8878 + <value>wx.SL_HORIZONTAL</value>
8879 + </param>
8880 + </block>
8881 + <block>
8882 + <key>analog_wfm_rcv</key>
8883 + <param>
8884 + <key>audio_decimation</key>
8885 + <value>10</value>
8886 + </param>
8887 + <param>
8888 + <key>alias</key>
8889 + <value></value>
8890 + </param>
8891 + <param>
8892 + <key>comment</key>
8893 + <value></value>
8894 + </param>
8895 + <param>
8896 + <key>affinity</key>
8897 + <value></value>
8898 + </param>
8899 + <param>
8900 + <key>_enabled</key>
8901 + <value>1</value>
8902 + </param>
8903 + <param>
8904 + <key>_coordinate</key>
8905 + <value>(704, 260)</value>
8906 + </param>
8907 + <param>
8908 + <key>_rotation</key>
8909 + <value>0</value>
8910 + </param>
8911 + <param>
8912 + <key>id</key>
8913 + <value>analog_wfm_rcv_0_1</value>
8914 + </param>
8915 + <param>
8916 + <key>maxoutbuf</key>
8917 + <value>0</value>
8918 + </param>
8919 + <param>
8920 + <key>minoutbuf</key>
8921 + <value>0</value>
8922 + </param>
8923 + <param>
8924 + <key>quad_rate</key>
8925 + <value>480e3</value>
8926 + </param>
8927 + </block>
8928 + <block>
8929 + <key>audio_sink</key>
8930 + <param>
8931 + <key>alias</key>
8932 + <value></value>
8933 + </param>
8934 + <param>
8935 + <key>comment</key>
8936 + <value></value>
8937 + </param>
8938 + <param>
8939 + <key>affinity</key>
8940 + <value></value>
8941 + </param>
8942 + <param>
8943 + <key>device_name</key>
8944 + <value></value>
8945 + </param>
8946 + <param>
8947 + <key>_enabled</key>
8948 + <value>1</value>
8949 + </param>
8950 + <param>
8951 + <key>_coordinate</key>
8952 + <value>(1056, 268)</value>
8953 + </param>
8954 + <param>
8955 + <key>_rotation</key>
8956 + <value>0</value>
8957 + </param>
8958 + <param>
8959 + <key>id</key>
8960 + <value>audio_sink_0_0</value>
8961 + </param>
8962 + <param>
8963 + <key>num_inputs</key>
8964 + <value>1</value>
8965 + </param>
8966 + <param>
8967 + <key>ok_to_block</key>
8968 + <value>True</value>
8969 + </param>
8970 + <param>
8971 + <key>samp_rate</key>
8972 + <value>48000</value>
8973 + </param>
8974 + </block>
8975 + <block>
8976 + <key>blocks_multiply_const_vxx</key>
8977 + <param>
8978 + <key>alias</key>
8979 + <value></value>
8980 + </param>
8981 + <param>
8982 + <key>comment</key>
8983 + <value></value>
8984 + </param>
8985 + <param>
8986 + <key>const</key>
8987 + <value>volume</value>
8988 + </param>
8989 + <param>
8990 + <key>affinity</key>
8991 + <value></value>
8992 + </param>
8993 + <param>
8994 + <key>_enabled</key>
8995 + <value>1</value>
8996 + </param>
8997 + <param>
8998 + <key>_coordinate</key>
8999 + <value>(896, 268)</value>
9000 + </param>
9001 + <param>
9002 + <key>_rotation</key>
9003 + <value>0</value>
9004 + </param>
9005 + <param>
9006 + <key>id</key>
9007 + <value>blocks_multiply_const_vxx_0_1</value>
9008 + </param>
9009 + <param>
9010 + <key>type</key>
9011 + <value>float</value>
9012 + </param>
9013 + <param>
9014 + <key>maxoutbuf</key>
9015 + <value>0</value>
9016 + </param>
9017 + <param>
9018 + <key>minoutbuf</key>
9019 + <value>0</value>
9020 + </param>
9021 + <param>
9022 + <key>vlen</key>
9023 + <value>1</value>
9024 + </param>
9025 + </block>
9026 + <block>
9027 + <key>limesdr_source</key>
9028 + <param>
9029 + <key>alias</key>
9030 + <value></value>
9031 + </param>
9032 + <param>
9033 + <key>analog_bandw_ch0</key>
9034 + <value>1.5e6</value>
9035 + </param>
9036 + <param>
9037 + <key>calibr_bandw_ch0</key>
9038 + <value>0</value>
9039 + </param>
9040 + <param>
9041 + <key>digital_bandw_ch0</key>
9042 + <value>100e3</value>
9043 + </param>
9044 + <param>
9045 + <key>gain_dB_ch0</key>
9046 + <value>60</value>
9047 + </param>
9048 + <param>
9049 + <key>lna_path_ch0</key>
9050 + <value>255</value>
9051 + </param>
9052 + <param>
9053 + <key>nco_freq_ch0</key>
9054 + <value>0</value>
9055 + </param>
9056 + <param>
9057 + <key>analog_bandw_ch1</key>
9058 + <value>1.5e6</value>
9059 + </param>
9060 + <param>
9061 + <key>calibr_bandw_ch1</key>
9062 + <value>0</value>
9063 + </param>
9064 + <param>
9065 + <key>digital_bandw_ch1</key>
9066 + <value>100e3</value>
9067 + </param>
9068 + <param>
9069 + <key>gain_dB_ch1</key>
9070 + <value>60</value>
9071 + </param>
9072 + <param>
9073 + <key>lna_path_ch1</key>
9074 + <value>1</value>
9075 + </param>
9076 + <param>
9077 + <key>nco_freq_ch1</key>
9078 + <value>0</value>
9079 + </param>
9080 + <param>
9081 + <key>channel_mode</key>
9082 + <value>0</value>
9083 + </param>
9084 + <param>
9085 + <key>comment</key>
9086 + <value></value>
9087 + </param>
9088 + <param>
9089 + <key>affinity</key>
9090 + <value></value>
9091 + </param>
9092 + <param>
9093 + <key>serial</key>
9094 + <value></value>
9095 + </param>
9096 + <param>
9097 + <key>_enabled</key>
9098 + <value>1</value>
9099 + </param>
9100 + <param>
9101 + <key>filename</key>
9102 + <value></value>
9103 + </param>
9104 + <param>
9105 + <key>_coordinate</key>
9106 + <value>(8, 148)</value>
9107 + </param>
9108 + <param>
9109 + <key>_rotation</key>
9110 + <value>0</value>
9111 + </param>
9112 + <param>
9113 + <key>id</key>
9114 + <value>limesdr_source_0_0</value>
9115 + </param>
9116 + <param>
9117 + <key>maxoutbuf</key>
9118 + <value>0</value>
9119 + </param>
9120 + <param>
9121 + <key>minoutbuf</key>
9122 + <value>0</value>
9123 + </param>
9124 + <param>
9125 + <key>oversample</key>
9126 + <value>0</value>
9127 + </param>
9128 + <param>
9129 + <key>rf_freq</key>
9130 + <value>100.1e6</value>
9131 + </param>
9132 + <param>
9133 + <key>samp_rate</key>
9134 + <value>2e6</value>
9135 + </param>
9136 + </block>
9137 + <block>
9138 + <key>low_pass_filter</key>
9139 + <param>
9140 + <key>beta</key>
9141 + <value>6.76</value>
9142 + </param>
9143 + <param>
9144 + <key>alias</key>
9145 + <value></value>
9146 + </param>
9147 + <param>
9148 + <key>comment</key>
9149 + <value></value>
9150 + </param>
9151 + <param>
9152 + <key>affinity</key>
9153 + <value></value>
9154 + </param>
9155 + <param>
9156 + <key>cutoff_freq</key>
9157 + <value>cut_freq</value>
9158 + </param>
9159 + <param>
9160 + <key>decim</key>
9161 + <value>1</value>
9162 + </param>
9163 + <param>
9164 + <key>_enabled</key>
9165 + <value>1</value>
9166 + </param>
9167 + <param>
9168 + <key>type</key>
9169 + <value>fir_filter_ccf</value>
9170 + </param>
9171 + <param>
9172 + <key>_coordinate</key>
9173 + <value>(288, 224)</value>
9174 + </param>
9175 + <param>
9176 + <key>_rotation</key>
9177 + <value>0</value>
9178 + </param>
9179 + <param>
9180 + <key>gain</key>
9181 + <value>1</value>
9182 + </param>
9183 + <param>
9184 + <key>id</key>
9185 + <value>low_pass_filter_0_1</value>
9186 + </param>
9187 + <param>
9188 + <key>interp</key>
9189 + <value>1</value>
9190 + </param>
9191 + <param>
9192 + <key>maxoutbuf</key>
9193 + <value>0</value>
9194 + </param>
9195 + <param>
9196 + <key>minoutbuf</key>
9197 + <value>0</value>
9198 + </param>
9199 + <param>
9200 + <key>samp_rate</key>
9201 + <value>2e6</value>
9202 + </param>
9203 + <param>
9204 + <key>width</key>
9205 + <value>trans_width</value>
9206 + </param>
9207 + <param>
9208 + <key>win</key>
9209 + <value>firdes.WIN_HAMMING</value>
9210 + </param>
9211 + </block>
9212 + <block>
9213 + <key>rational_resampler_xxx</key>
9214 + <param>
9215 + <key>alias</key>
9216 + <value></value>
9217 + </param>
9218 + <param>
9219 + <key>comment</key>
9220 + <value></value>
9221 + </param>
9222 + <param>
9223 + <key>affinity</key>
9224 + <value></value>
9225 + </param>
9226 + <param>
9227 + <key>decim</key>
9228 + <value>200</value>
9229 + </param>
9230 + <param>
9231 + <key>_enabled</key>
9232 + <value>1</value>
9233 + </param>
9234 + <param>
9235 + <key>fbw</key>
9236 + <value>0</value>
9237 + </param>
9238 + <param>
9239 + <key>_coordinate</key>
9240 + <value>(520, 248)</value>
9241 + </param>
9242 + <param>
9243 + <key>_rotation</key>
9244 + <value>0</value>
9245 + </param>
9246 + <param>
9247 + <key>id</key>
9248 + <value>rational_resampler_xxx_1_0_1</value>
9249 + </param>
9250 + <param>
9251 + <key>interp</key>
9252 + <value>48</value>
9253 + </param>
9254 + <param>
9255 + <key>maxoutbuf</key>
9256 + <value>0</value>
9257 + </param>
9258 + <param>
9259 + <key>minoutbuf</key>
9260 + <value>0</value>
9261 + </param>
9262 + <param>
9263 + <key>taps</key>
9264 + <value></value>
9265 + </param>
9266 + <param>
9267 + <key>type</key>
9268 + <value>ccc</value>
9269 + </param>
9270 + </block>
9271 + <block>
9272 + <key>wxgui_fftsink2</key>
9273 + <param>
9274 + <key>avg_alpha</key>
9275 + <value>0</value>
9276 + </param>
9277 + <param>
9278 + <key>average</key>
9279 + <value>False</value>
9280 + </param>
9281 + <param>
9282 + <key>baseband_freq</key>
9283 + <value>100.1e6</value>
9284 + </param>
9285 + <param>
9286 + <key>alias</key>
9287 + <value></value>
9288 + </param>
9289 + <param>
9290 + <key>comment</key>
9291 + <value></value>
9292 + </param>
9293 + <param>
9294 + <key>affinity</key>
9295 + <value></value>
9296 + </param>
9297 + <param>
9298 + <key>_enabled</key>
9299 + <value>True</value>
9300 + </param>
9301 + <param>
9302 + <key>fft_size</key>
9303 + <value>1024</value>
9304 + </param>
9305 + <param>
9306 + <key>freqvar</key>
9307 + <value>None</value>
9308 + </param>
9309 + <param>
9310 + <key>_coordinate</key>
9311 + <value>(520, 12)</value>
9312 + </param>
9313 + <param>
9314 + <key>_rotation</key>
9315 + <value>0</value>
9316 + </param>
9317 + <param>
9318 + <key>grid_pos</key>
9319 + <value></value>
9320 + </param>
9321 + <param>
9322 + <key>id</key>
9323 + <value>wxgui_fftsink2_0</value>
9324 + </param>
9325 + <param>
9326 + <key>notebook</key>
9327 + <value></value>
9328 + </param>
9329 + <param>
9330 + <key>peak_hold</key>
9331 + <value>False</value>
9332 + </param>
9333 + <param>
9334 + <key>ref_level</key>
9335 + <value>0</value>
9336 + </param>
9337 + <param>
9338 + <key>ref_scale</key>
9339 + <value>2.0</value>
9340 + </param>
9341 + <param>
9342 + <key>fft_rate</key>
9343 + <value>15</value>
9344 + </param>
9345 + <param>
9346 + <key>samp_rate</key>
9347 + <value>2e6</value>
9348 + </param>
9349 + <param>
9350 + <key>title</key>
9351 + <value>Low Pass Filter</value>
9352 + </param>
9353 + <param>
9354 + <key>type</key>
9355 + <value>complex</value>
9356 + </param>
9357 + <param>
9358 + <key>win_size</key>
9359 + <value></value>
9360 + </param>
9361 + <param>
9362 + <key>win</key>
9363 + <value>None</value>
9364 + </param>
9365 + <param>
9366 + <key>y_divs</key>
9367 + <value>10</value>
9368 + </param>
9369 + <param>
9370 + <key>y_per_div</key>
9371 + <value>10</value>
9372 + </param>
9373 + </block>
9374 + <connection>
9375 + <source_block_id>analog_wfm_rcv_0_1</source_block_id>
9376 + <sink_block_id>blocks_multiply_const_vxx_0_1</sink_block_id>
9377 + <source_key>0</source_key>
9378 + <sink_key>0</sink_key>
9379 + </connection>
9380 + <connection>
9381 + <source_block_id>blocks_multiply_const_vxx_0_1</source_block_id>
9382 + <sink_block_id>audio_sink_0_0</sink_block_id>
9383 + <source_key>0</source_key>
9384 + <sink_key>0</sink_key>
9385 + </connection>
9386 + <connection>
9387 + <source_block_id>limesdr_source_0_0</source_block_id>
9388 + <sink_block_id>low_pass_filter_0_1</sink_block_id>
9389 + <source_key>0</source_key>
9390 + <sink_key>0</sink_key>
9391 + </connection>
9392 + <connection>
9393 + <source_block_id>low_pass_filter_0_1</source_block_id>
9394 + <sink_block_id>rational_resampler_xxx_1_0_1</sink_block_id>
9395 + <source_key>0</source_key>
9396 + <sink_key>0</sink_key>
9397 + </connection>
9398 + <connection>
9399 + <source_block_id>low_pass_filter_0_1</source_block_id>
9400 + <sink_block_id>wxgui_fftsink2_0</sink_block_id>
9401 + <source_key>0</source_key>
9402 + <sink_key>0</sink_key>
9403 + </connection>
9404 + <connection>
9405 + <source_block_id>rational_resampler_xxx_1_0_1</source_block_id>
9406 + <sink_block_id>analog_wfm_rcv_0_1</sink_block_id>
9407 + <source_key>0</source_key>
9408 + <sink_key>0</sink_key>
9409 + </connection>
9410 +</flow_graph>
9411 diff --git a/examples/FM_transmitter.grc b/examples/FM_transmitter.grc
9412 index 2580567..2450776 100644
9413 --- a/examples/FM_transmitter.grc
9414 +++ b/examples/FM_transmitter.grc
9415 @@ -1,292 +1,495 @@
9416 -options:
9417 - parameters:
9418 - author: Lime Microsystems
9419 - category: '[GRC Hier Blocks]'
9420 - cmake_opt: ''
9421 - comment: ''
9422 - copyright: ''
9423 - description: ''
9424 - gen_cmake: 'On'
9425 - gen_linking: dynamic
9426 - generate_options: qt_gui
9427 - hier_block_src_path: '.:'
9428 - id: fm_transmitter
9429 - max_nouts: '0'
9430 - output_language: python
9431 - placement: (0,0)
9432 - qt_qss_theme: ''
9433 - realtime_scheduling: ''
9434 - run: 'True'
9435 - run_command: '{python} -u {filename}'
9436 - run_options: prompt
9437 - sizing_mode: fixed
9438 - thread_safe_setters: ''
9439 - title: FM transmitter
9440 - window_size: ''
9441 - states:
9442 - bus_sink: false
9443 - bus_source: false
9444 - bus_structure: null
9445 - coordinate: [8, 8]
9446 - rotation: 0
9447 - state: enabled
9448 -
9449 -blocks:
9450 -- name: baseband
9451 - id: variable_qtgui_entry
9452 - parameters:
9453 - comment: ''
9454 - gui_hint: 0,0,1,2
9455 - label: TX Baseband [MHz]
9456 - type: real
9457 - value: '446.094'
9458 - states:
9459 - bus_sink: false
9460 - bus_source: false
9461 - bus_structure: null
9462 - coordinate: [180, 8]
9463 - rotation: 0
9464 - state: true
9465 -- name: gain
9466 - id: variable_qtgui_range
9467 - parameters:
9468 - comment: ''
9469 - gui_hint: 1,0,1,1
9470 - label: Gain [dB]
9471 - min_len: '70'
9472 - orient: Qt.Horizontal
9473 - rangeType: int
9474 - start: '0'
9475 - step: '1'
9476 - stop: '60'
9477 - value: '40'
9478 - widget: counter_slider
9479 - states:
9480 - bus_sink: false
9481 - bus_source: false
9482 - bus_structure: null
9483 - coordinate: [336, 9]
9484 - rotation: 0
9485 - state: true
9486 -- name: pa_path
9487 - id: variable_qtgui_chooser
9488 - parameters:
9489 - comment: ''
9490 - gui_hint: 1,1,1,1
9491 - label: PA Path
9492 - label0: Auto
9493 - label1: Band1
9494 - label2: Band2
9495 - label3: W
9496 - label4: ''
9497 - labels: '[]'
9498 - num_opts: '3'
9499 - option1: '1'
9500 - option2: '2'
9501 - option3: '3'
9502 - option4: '4'
9503 - options: '[0, 1, 2]'
9504 - orient: Qt.QVBoxLayout
9505 - type: int
9506 - value: '255'
9507 - widget: combo_box
9508 - states:
9509 - bus_sink: false
9510 - bus_source: false
9511 - bus_structure: null
9512 - coordinate: [462, 8]
9513 - rotation: 0
9514 - state: true
9515 -- name: samp_rate
9516 - id: variable
9517 - parameters:
9518 - comment: ''
9519 - value: 2e6
9520 - states:
9521 - bus_sink: false
9522 - bus_source: false
9523 - bus_structure: null
9524 - coordinate: [10, 106]
9525 - rotation: 0
9526 - state: enabled
9527 -- name: analog_nbfm_tx_0
9528 - id: analog_nbfm_tx
9529 - parameters:
9530 - affinity: ''
9531 - alias: ''
9532 - audio_rate: '48000'
9533 - comment: ''
9534 - fh: '-1.0'
9535 - max_dev: 2e3
9536 - maxoutbuf: '0'
9537 - minoutbuf: '0'
9538 - quad_rate: '480000'
9539 - tau: 75e-6
9540 - states:
9541 - bus_sink: false
9542 - bus_source: false
9543 - bus_structure: null
9544 - coordinate: [249, 189]
9545 - rotation: 0
9546 - state: true
9547 -- name: blocks_wavfile_source_0
9548 - id: blocks_wavfile_source
9549 - parameters:
9550 - affinity: ''
9551 - alias: ''
9552 - comment: ''
9553 - file: '.../examples/guitar.wav'
9554 - maxoutbuf: '0'
9555 - minoutbuf: '0'
9556 - nchan: '1'
9557 - repeat: 'True'
9558 - states:
9559 - bus_sink: false
9560 - bus_source: false
9561 - bus_structure: null
9562 - coordinate: [16, 213]
9563 - rotation: 0
9564 - state: true
9565 -- name: limesdr_sink_0_0
9566 - id: limesdr_sink
9567 - parameters:
9568 - affinity: ''
9569 - alias: ''
9570 - allow_tcxo_dac: '0'
9571 - analog_bandw_ch0: 5e6
9572 - analog_bandw_ch1: 5e6
9573 - calibr_bandw_ch0: 2.5e6
9574 - calibr_bandw_ch1: 2.5e6
9575 - channel_mode: '0'
9576 - comment: ''
9577 - dacVal: '180'
9578 - digital_bandw_ch0: samp_rate
9579 - digital_bandw_ch1: samp_rate
9580 - filename: ''
9581 - gain_dB_ch0: gain
9582 - gain_dB_ch1: '1'
9583 - length_tag_name: ''
9584 - nco_freq_ch0: '0'
9585 - nco_freq_ch1: '0'
9586 - oversample: '0'
9587 - pa_path_ch0: pa_path
9588 - pa_path_ch1: '255'
9589 - rf_freq: baseband*1e6
9590 - samp_rate: samp_rate
9591 - serial: ''
9592 - states:
9593 - bus_sink: false
9594 - bus_source: false
9595 - bus_structure: null
9596 - coordinate: [755, 197]
9597 - rotation: 0
9598 - state: enabled
9599 -- name: qtgui_freq_sink_x_0
9600 - id: qtgui_freq_sink_x
9601 - parameters:
9602 - affinity: ''
9603 - alias: ''
9604 - alpha1: '1.0'
9605 - alpha10: '1.0'
9606 - alpha2: '1.0'
9607 - alpha3: '1.0'
9608 - alpha4: '1.0'
9609 - alpha5: '1.0'
9610 - alpha6: '1.0'
9611 - alpha7: '1.0'
9612 - alpha8: '1.0'
9613 - alpha9: '1.0'
9614 - autoscale: 'False'
9615 - average: '1.0'
9616 - axislabels: 'True'
9617 - bw: samp_rate
9618 - color1: '"blue"'
9619 - color10: '"dark blue"'
9620 - color2: '"red"'
9621 - color3: '"green"'
9622 - color4: '"black"'
9623 - color5: '"cyan"'
9624 - color6: '"magenta"'
9625 - color7: '"yellow"'
9626 - color8: '"dark red"'
9627 - color9: '"dark green"'
9628 - comment: ''
9629 - ctrlpanel: 'False'
9630 - fc: baseband*1e6
9631 - fftsize: '2048'
9632 - freqhalf: 'True'
9633 - grid: 'False'
9634 - gui_hint: 2,0,1,2
9635 - label: Relative Gain
9636 - label1: ''
9637 - label10: ''''''
9638 - label2: ''''''
9639 - label3: ''''''
9640 - label4: ''''''
9641 - label5: ''''''
9642 - label6: ''''''
9643 - label7: ''''''
9644 - label8: ''''''
9645 - label9: ''''''
9646 - legend: 'True'
9647 - maxoutbuf: '0'
9648 - minoutbuf: '0'
9649 - name: '"Transmiting data"'
9650 - nconnections: '1'
9651 - showports: 'False'
9652 - tr_chan: '0'
9653 - tr_level: '0.0'
9654 - tr_mode: qtgui.TRIG_MODE_FREE
9655 - tr_tag: '""'
9656 - type: complex
9657 - units: dB
9658 - update_time: '0.10'
9659 - width1: '1'
9660 - width10: '1'
9661 - width2: '1'
9662 - width3: '1'
9663 - width4: '1'
9664 - width5: '1'
9665 - width6: '1'
9666 - width7: '1'
9667 - width8: '1'
9668 - width9: '1'
9669 - wintype: firdes.WIN_BLACKMAN_hARRIS
9670 - ymax: '10'
9671 - ymin: '-140'
9672 - states:
9673 - bus_sink: false
9674 - bus_source: false
9675 - bus_structure: null
9676 - coordinate: [755, 302]
9677 - rotation: 0
9678 - state: true
9679 -- name: rational_resampler_xxx_0
9680 - id: rational_resampler_xxx
9681 - parameters:
9682 - affinity: ''
9683 - alias: ''
9684 - comment: ''
9685 - decim: '6'
9686 - fbw: '0'
9687 - interp: '25'
9688 - maxoutbuf: '0'
9689 - minoutbuf: '0'
9690 - taps: ''
9691 - type: ccc
9692 - states:
9693 - bus_sink: false
9694 - bus_source: false
9695 - bus_structure: null
9696 - coordinate: [533, 197]
9697 - rotation: 0
9698 - state: true
9699 -
9700 -connections:
9701 -- [analog_nbfm_tx_0, '0', rational_resampler_xxx_0, '0']
9702 -- [blocks_wavfile_source_0, '0', analog_nbfm_tx_0, '0']
9703 -- [rational_resampler_xxx_0, '0', limesdr_sink_0_0, '0']
9704 -- [rational_resampler_xxx_0, '0', qtgui_freq_sink_x_0, '0']
9705 -
9706 -metadata:
9707 - file_format: 1
9708 +<?xml version='1.0' encoding='utf-8'?>
9709 +<?grc format='1' created='3.7.13'?>
9710 +<flow_graph>
9711 + <timestamp>Tue Feb 20 16:22:48 2018</timestamp>
9712 + <block>
9713 + <key>options</key>
9714 + <param>
9715 + <key>author</key>
9716 + <value>Lime Microsystems</value>
9717 + </param>
9718 + <param>
9719 + <key>window_size</key>
9720 + <value>(1000,500)</value>
9721 + </param>
9722 + <param>
9723 + <key>category</key>
9724 + <value>Custom</value>
9725 + </param>
9726 + <param>
9727 + <key>comment</key>
9728 + <value></value>
9729 + </param>
9730 + <param>
9731 + <key>description</key>
9732 + <value></value>
9733 + </param>
9734 + <param>
9735 + <key>_enabled</key>
9736 + <value>True</value>
9737 + </param>
9738 + <param>
9739 + <key>_coordinate</key>
9740 + <value>(8, 8)</value>
9741 + </param>
9742 + <param>
9743 + <key>_rotation</key>
9744 + <value>0</value>
9745 + </param>
9746 + <param>
9747 + <key>generate_options</key>
9748 + <value>wx_gui</value>
9749 + </param>
9750 + <param>
9751 + <key>hier_block_src_path</key>
9752 + <value>.:</value>
9753 + </param>
9754 + <param>
9755 + <key>id</key>
9756 + <value>top_block</value>
9757 + </param>
9758 + <param>
9759 + <key>max_nouts</key>
9760 + <value>0</value>
9761 + </param>
9762 + <param>
9763 + <key>qt_qss_theme</key>
9764 + <value></value>
9765 + </param>
9766 + <param>
9767 + <key>realtime_scheduling</key>
9768 + <value></value>
9769 + </param>
9770 + <param>
9771 + <key>run_command</key>
9772 + <value>{python} -u {filename}</value>
9773 + </param>
9774 + <param>
9775 + <key>run_options</key>
9776 + <value>run</value>
9777 + </param>
9778 + <param>
9779 + <key>run</key>
9780 + <value>True</value>
9781 + </param>
9782 + <param>
9783 + <key>sizing_mode</key>
9784 + <value>fixed</value>
9785 + </param>
9786 + <param>
9787 + <key>thread_safe_setters</key>
9788 + <value></value>
9789 + </param>
9790 + <param>
9791 + <key>title</key>
9792 + <value>FM transmitter</value>
9793 + </param>
9794 + <param>
9795 + <key>placement</key>
9796 + <value>(0,0)</value>
9797 + </param>
9798 + </block>
9799 + <block>
9800 + <key>analog_nbfm_tx</key>
9801 + <param>
9802 + <key>audio_rate</key>
9803 + <value>48000</value>
9804 + </param>
9805 + <param>
9806 + <key>alias</key>
9807 + <value></value>
9808 + </param>
9809 + <param>
9810 + <key>comment</key>
9811 + <value></value>
9812 + </param>
9813 + <param>
9814 + <key>affinity</key>
9815 + <value></value>
9816 + </param>
9817 + <param>
9818 + <key>_enabled</key>
9819 + <value>1</value>
9820 + </param>
9821 + <param>
9822 + <key>_coordinate</key>
9823 + <value>(200, 200)</value>
9824 + </param>
9825 + <param>
9826 + <key>_rotation</key>
9827 + <value>0</value>
9828 + </param>
9829 + <param>
9830 + <key>id</key>
9831 + <value>analog_nbfm_tx_0_0</value>
9832 + </param>
9833 + <param>
9834 + <key>max_dev</key>
9835 + <value>2e3</value>
9836 + </param>
9837 + <param>
9838 + <key>maxoutbuf</key>
9839 + <value>0</value>
9840 + </param>
9841 + <param>
9842 + <key>minoutbuf</key>
9843 + <value>0</value>
9844 + </param>
9845 + <param>
9846 + <key>fh</key>
9847 + <value>-1.0</value>
9848 + </param>
9849 + <param>
9850 + <key>quad_rate</key>
9851 + <value>480000</value>
9852 + </param>
9853 + <param>
9854 + <key>tau</key>
9855 + <value>75e-6</value>
9856 + </param>
9857 + </block>
9858 + <block>
9859 + <key>blocks_wavfile_source</key>
9860 + <param>
9861 + <key>alias</key>
9862 + <value></value>
9863 + </param>
9864 + <param>
9865 + <key>comment</key>
9866 + <value></value>
9867 + </param>
9868 + <param>
9869 + <key>affinity</key>
9870 + <value></value>
9871 + </param>
9872 + <param>
9873 + <key>_enabled</key>
9874 + <value>1</value>
9875 + </param>
9876 + <param>
9877 + <key>file</key>
9878 + <value>/home/garmus/GITHUB/gr-limesdr/examples/guitar.wav</value>
9879 + </param>
9880 + <param>
9881 + <key>_coordinate</key>
9882 + <value>(16, 220)</value>
9883 + </param>
9884 + <param>
9885 + <key>_rotation</key>
9886 + <value>0</value>
9887 + </param>
9888 + <param>
9889 + <key>id</key>
9890 + <value>blocks_wavfile_source_0_0</value>
9891 + </param>
9892 + <param>
9893 + <key>maxoutbuf</key>
9894 + <value>0</value>
9895 + </param>
9896 + <param>
9897 + <key>minoutbuf</key>
9898 + <value>0</value>
9899 + </param>
9900 + <param>
9901 + <key>nchan</key>
9902 + <value>1</value>
9903 + </param>
9904 + <param>
9905 + <key>repeat</key>
9906 + <value>True</value>
9907 + </param>
9908 + </block>
9909 + <block>
9910 + <key>limesdr_sink</key>
9911 + <param>
9912 + <key>alias</key>
9913 + <value></value>
9914 + </param>
9915 + <param>
9916 + <key>analog_bandw_ch0</key>
9917 + <value>5e6</value>
9918 + </param>
9919 + <param>
9920 + <key>calibr_bandw_ch0</key>
9921 + <value>0</value>
9922 + </param>
9923 + <param>
9924 + <key>digital_bandw_ch0</key>
9925 + <value>100e3</value>
9926 + </param>
9927 + <param>
9928 + <key>gain_dB_ch0</key>
9929 + <value>60</value>
9930 + </param>
9931 + <param>
9932 + <key>nco_freq_ch0</key>
9933 + <value>0</value>
9934 + </param>
9935 + <param>
9936 + <key>pa_path_ch0</key>
9937 + <value>255</value>
9938 + </param>
9939 + <param>
9940 + <key>analog_bandw_ch1</key>
9941 + <value>5e6</value>
9942 + </param>
9943 + <param>
9944 + <key>calibr_bandw_ch1</key>
9945 + <value>0</value>
9946 + </param>
9947 + <param>
9948 + <key>digital_bandw_ch1</key>
9949 + <value>100e3</value>
9950 + </param>
9951 + <param>
9952 + <key>gain_dB_ch1</key>
9953 + <value>60</value>
9954 + </param>
9955 + <param>
9956 + <key>nco_freq_ch1</key>
9957 + <value>0</value>
9958 + </param>
9959 + <param>
9960 + <key>pa_path_ch1</key>
9961 + <value>1</value>
9962 + </param>
9963 + <param>
9964 + <key>channel_mode</key>
9965 + <value>0</value>
9966 + </param>
9967 + <param>
9968 + <key>comment</key>
9969 + <value></value>
9970 + </param>
9971 + <param>
9972 + <key>affinity</key>
9973 + <value></value>
9974 + </param>
9975 + <param>
9976 + <key>serial</key>
9977 + <value></value>
9978 + </param>
9979 + <param>
9980 + <key>_enabled</key>
9981 + <value>True</value>
9982 + </param>
9983 + <param>
9984 + <key>filename</key>
9985 + <value></value>
9986 + </param>
9987 + <param>
9988 + <key>_coordinate</key>
9989 + <value>(696, 20)</value>
9990 + </param>
9991 + <param>
9992 + <key>_rotation</key>
9993 + <value>0</value>
9994 + </param>
9995 + <param>
9996 + <key>id</key>
9997 + <value>limesdr_sink_0</value>
9998 + </param>
9999 + <param>
10000 + <key>length_tag_name</key>
10001 + <value></value>
10002 + </param>
10003 + <param>
10004 + <key>oversample</key>
10005 + <value>0</value>
10006 + </param>
10007 + <param>
10008 + <key>rf_freq</key>
10009 + <value>446.09375e6</value>
10010 + </param>
10011 + <param>
10012 + <key>samp_rate</key>
10013 + <value>2e6</value>
10014 + </param>
10015 + </block>
10016 + <block>
10017 + <key>rational_resampler_xxx</key>
10018 + <param>
10019 + <key>alias</key>
10020 + <value></value>
10021 + </param>
10022 + <param>
10023 + <key>comment</key>
10024 + <value></value>
10025 + </param>
10026 + <param>
10027 + <key>affinity</key>
10028 + <value></value>
10029 + </param>
10030 + <param>
10031 + <key>decim</key>
10032 + <value>6</value>
10033 + </param>
10034 + <param>
10035 + <key>_enabled</key>
10036 + <value>1</value>
10037 + </param>
10038 + <param>
10039 + <key>fbw</key>
10040 + <value>0</value>
10041 + </param>
10042 + <param>
10043 + <key>_coordinate</key>
10044 + <value>(448, 208)</value>
10045 + </param>
10046 + <param>
10047 + <key>_rotation</key>
10048 + <value>0</value>
10049 + </param>
10050 + <param>
10051 + <key>id</key>
10052 + <value>rational_resampler_xxx_0</value>
10053 + </param>
10054 + <param>
10055 + <key>interp</key>
10056 + <value>25</value>
10057 + </param>
10058 + <param>
10059 + <key>maxoutbuf</key>
10060 + <value>0</value>
10061 + </param>
10062 + <param>
10063 + <key>minoutbuf</key>
10064 + <value>0</value>
10065 + </param>
10066 + <param>
10067 + <key>taps</key>
10068 + <value></value>
10069 + </param>
10070 + <param>
10071 + <key>type</key>
10072 + <value>ccf</value>
10073 + </param>
10074 + </block>
10075 + <block>
10076 + <key>wxgui_fftsink2</key>
10077 + <param>
10078 + <key>avg_alpha</key>
10079 + <value>0</value>
10080 + </param>
10081 + <param>
10082 + <key>average</key>
10083 + <value>False</value>
10084 + </param>
10085 + <param>
10086 + <key>baseband_freq</key>
10087 + <value>446.09375e6</value>
10088 + </param>
10089 + <param>
10090 + <key>alias</key>
10091 + <value></value>
10092 + </param>
10093 + <param>
10094 + <key>comment</key>
10095 + <value></value>
10096 + </param>
10097 + <param>
10098 + <key>affinity</key>
10099 + <value></value>
10100 + </param>
10101 + <param>
10102 + <key>_enabled</key>
10103 + <value>True</value>
10104 + </param>
10105 + <param>
10106 + <key>fft_size</key>
10107 + <value>1024</value>
10108 + </param>
10109 + <param>
10110 + <key>freqvar</key>
10111 + <value>None</value>
10112 + </param>
10113 + <param>
10114 + <key>_coordinate</key>
10115 + <value>(696, 308)</value>
10116 + </param>
10117 + <param>
10118 + <key>_rotation</key>
10119 + <value>0</value>
10120 + </param>
10121 + <param>
10122 + <key>grid_pos</key>
10123 + <value></value>
10124 + </param>
10125 + <param>
10126 + <key>id</key>
10127 + <value>wxgui_fftsink2_0</value>
10128 + </param>
10129 + <param>
10130 + <key>notebook</key>
10131 + <value></value>
10132 + </param>
10133 + <param>
10134 + <key>peak_hold</key>
10135 + <value>False</value>
10136 + </param>
10137 + <param>
10138 + <key>ref_level</key>
10139 + <value>0</value>
10140 + </param>
10141 + <param>
10142 + <key>ref_scale</key>
10143 + <value>2.0</value>
10144 + </param>
10145 + <param>
10146 + <key>fft_rate</key>
10147 + <value>15</value>
10148 + </param>
10149 + <param>
10150 + <key>samp_rate</key>
10151 + <value>2e6</value>
10152 + </param>
10153 + <param>
10154 + <key>title</key>
10155 + <value>Transmitting data</value>
10156 + </param>
10157 + <param>
10158 + <key>type</key>
10159 + <value>complex</value>
10160 + </param>
10161 + <param>
10162 + <key>win_size</key>
10163 + <value></value>
10164 + </param>
10165 + <param>
10166 + <key>win</key>
10167 + <value>None</value>
10168 + </param>
10169 + <param>
10170 + <key>y_divs</key>
10171 + <value>10</value>
10172 + </param>
10173 + <param>
10174 + <key>y_per_div</key>
10175 + <value>10</value>
10176 + </param>
10177 + </block>
10178 + <connection>
10179 + <source_block_id>analog_nbfm_tx_0_0</source_block_id>
10180 + <sink_block_id>rational_resampler_xxx_0</sink_block_id>
10181 + <source_key>0</source_key>
10182 + <sink_key>0</sink_key>
10183 + </connection>
10184 + <connection>
10185 + <source_block_id>blocks_wavfile_source_0_0</source_block_id>
10186 + <sink_block_id>analog_nbfm_tx_0_0</sink_block_id>
10187 + <source_key>0</source_key>
10188 + <sink_key>0</sink_key>
10189 + </connection>
10190 + <connection>
10191 + <source_block_id>rational_resampler_xxx_0</source_block_id>
10192 + <sink_block_id>limesdr_sink_0</sink_block_id>
10193 + <source_key>0</source_key>
10194 + <sink_key>0</sink_key>
10195 + </connection>
10196 + <connection>
10197 + <source_block_id>rational_resampler_xxx_0</source_block_id>
10198 + <sink_block_id>wxgui_fftsink2_0</sink_block_id>
10199 + <source_key>0</source_key>
10200 + <sink_key>0</sink_key>
10201 + </connection>
10202 +</flow_graph>
10203 diff --git a/examples/GFSK.grc b/examples/GFSK.grc
10204 new file mode 100644
10205 index 0000000..3802007
10206 --- /dev/null
10207 +++ b/examples/GFSK.grc
10208 @@ -0,0 +1,1548 @@
10209 +<?xml version='1.0' encoding='utf-8'?>
10210 +<?grc format='1' created='3.7.13'?>
10211 +<flow_graph>
10212 + <timestamp>Thu May 24 14:58:19 2018</timestamp>
10213 + <block>
10214 + <key>options</key>
10215 + <param>
10216 + <key>author</key>
10217 + <value>Lime Microsystems</value>
10218 + </param>
10219 + <param>
10220 + <key>window_size</key>
10221 + <value>(1000,500)</value>
10222 + </param>
10223 + <param>
10224 + <key>category</key>
10225 + <value>Custom</value>
10226 + </param>
10227 + <param>
10228 + <key>comment</key>
10229 + <value></value>
10230 + </param>
10231 + <param>
10232 + <key>description</key>
10233 + <value></value>
10234 + </param>
10235 + <param>
10236 + <key>_enabled</key>
10237 + <value>True</value>
10238 + </param>
10239 + <param>
10240 + <key>_coordinate</key>
10241 + <value>(8, 8)</value>
10242 + </param>
10243 + <param>
10244 + <key>_rotation</key>
10245 + <value>0</value>
10246 + </param>
10247 + <param>
10248 + <key>generate_options</key>
10249 + <value>qt_gui</value>
10250 + </param>
10251 + <param>
10252 + <key>hier_block_src_path</key>
10253 + <value>.:</value>
10254 + </param>
10255 + <param>
10256 + <key>id</key>
10257 + <value>top_block</value>
10258 + </param>
10259 + <param>
10260 + <key>max_nouts</key>
10261 + <value>0</value>
10262 + </param>
10263 + <param>
10264 + <key>qt_qss_theme</key>
10265 + <value></value>
10266 + </param>
10267 + <param>
10268 + <key>realtime_scheduling</key>
10269 + <value></value>
10270 + </param>
10271 + <param>
10272 + <key>run_command</key>
10273 + <value>{python} -u {filename}</value>
10274 + </param>
10275 + <param>
10276 + <key>run_options</key>
10277 + <value>prompt</value>
10278 + </param>
10279 + <param>
10280 + <key>run</key>
10281 + <value>True</value>
10282 + </param>
10283 + <param>
10284 + <key>sizing_mode</key>
10285 + <value>fixed</value>
10286 + </param>
10287 + <param>
10288 + <key>thread_safe_setters</key>
10289 + <value></value>
10290 + </param>
10291 + <param>
10292 + <key>title</key>
10293 + <value>GFSK loopback</value>
10294 + </param>
10295 + <param>
10296 + <key>placement</key>
10297 + <value>(0,0)</value>
10298 + </param>
10299 + </block>
10300 + <block>
10301 + <key>analog_quadrature_demod_cf</key>
10302 + <param>
10303 + <key>alias</key>
10304 + <value></value>
10305 + </param>
10306 + <param>
10307 + <key>comment</key>
10308 + <value></value>
10309 + </param>
10310 + <param>
10311 + <key>affinity</key>
10312 + <value></value>
10313 + </param>
10314 + <param>
10315 + <key>_enabled</key>
10316 + <value>True</value>
10317 + </param>
10318 + <param>
10319 + <key>_coordinate</key>
10320 + <value>(656, 52)</value>
10321 + </param>
10322 + <param>
10323 + <key>_rotation</key>
10324 + <value>0</value>
10325 + </param>
10326 + <param>
10327 + <key>gain</key>
10328 + <value>1</value>
10329 + </param>
10330 + <param>
10331 + <key>id</key>
10332 + <value>analog_quadrature_demod_cf_0</value>
10333 + </param>
10334 + <param>
10335 + <key>maxoutbuf</key>
10336 + <value>0</value>
10337 + </param>
10338 + <param>
10339 + <key>minoutbuf</key>
10340 + <value>0</value>
10341 + </param>
10342 + </block>
10343 + <block>
10344 + <key>analog_quadrature_demod_cf</key>
10345 + <param>
10346 + <key>alias</key>
10347 + <value></value>
10348 + </param>
10349 + <param>
10350 + <key>comment</key>
10351 + <value></value>
10352 + </param>
10353 + <param>
10354 + <key>affinity</key>
10355 + <value></value>
10356 + </param>
10357 + <param>
10358 + <key>_enabled</key>
10359 + <value>True</value>
10360 + </param>
10361 + <param>
10362 + <key>_coordinate</key>
10363 + <value>(256, 292)</value>
10364 + </param>
10365 + <param>
10366 + <key>_rotation</key>
10367 + <value>0</value>
10368 + </param>
10369 + <param>
10370 + <key>gain</key>
10371 + <value>1</value>
10372 + </param>
10373 + <param>
10374 + <key>id</key>
10375 + <value>analog_quadrature_demod_cf_0_0</value>
10376 + </param>
10377 + <param>
10378 + <key>maxoutbuf</key>
10379 + <value>0</value>
10380 + </param>
10381 + <param>
10382 + <key>minoutbuf</key>
10383 + <value>0</value>
10384 + </param>
10385 + </block>
10386 + <block>
10387 + <key>blks2_packet_decoder</key>
10388 + <param>
10389 + <key>access_code</key>
10390 + <value></value>
10391 + </param>
10392 + <param>
10393 + <key>alias</key>
10394 + <value></value>
10395 + </param>
10396 + <param>
10397 + <key>comment</key>
10398 + <value></value>
10399 + </param>
10400 + <param>
10401 + <key>affinity</key>
10402 + <value></value>
10403 + </param>
10404 + <param>
10405 + <key>_enabled</key>
10406 + <value>1</value>
10407 + </param>
10408 + <param>
10409 + <key>_coordinate</key>
10410 + <value>(472, 388)</value>
10411 + </param>
10412 + <param>
10413 + <key>_rotation</key>
10414 + <value>0</value>
10415 + </param>
10416 + <param>
10417 + <key>id</key>
10418 + <value>blks2_packet_decoder_0</value>
10419 + </param>
10420 + <param>
10421 + <key>maxoutbuf</key>
10422 + <value>0</value>
10423 + </param>
10424 + <param>
10425 + <key>minoutbuf</key>
10426 + <value>0</value>
10427 + </param>
10428 + <param>
10429 + <key>type</key>
10430 + <value>byte</value>
10431 + </param>
10432 + <param>
10433 + <key>threshold</key>
10434 + <value>-1</value>
10435 + </param>
10436 + </block>
10437 + <block>
10438 + <key>blks2_packet_encoder</key>
10439 + <param>
10440 + <key>access_code</key>
10441 + <value></value>
10442 + </param>
10443 + <param>
10444 + <key>bits_per_symbol</key>
10445 + <value>1</value>
10446 + </param>
10447 + <param>
10448 + <key>alias</key>
10449 + <value></value>
10450 + </param>
10451 + <param>
10452 + <key>comment</key>
10453 + <value></value>
10454 + </param>
10455 + <param>
10456 + <key>affinity</key>
10457 + <value></value>
10458 + </param>
10459 + <param>
10460 + <key>_enabled</key>
10461 + <value>True</value>
10462 + </param>
10463 + <param>
10464 + <key>_coordinate</key>
10465 + <value>(240, 96)</value>
10466 + </param>
10467 + <param>
10468 + <key>_rotation</key>
10469 + <value>0</value>
10470 + </param>
10471 + <param>
10472 + <key>id</key>
10473 + <value>blks2_packet_encoder_0</value>
10474 + </param>
10475 + <param>
10476 + <key>type</key>
10477 + <value>byte</value>
10478 + </param>
10479 + <param>
10480 + <key>maxoutbuf</key>
10481 + <value>0</value>
10482 + </param>
10483 + <param>
10484 + <key>minoutbuf</key>
10485 + <value>0</value>
10486 + </param>
10487 + <param>
10488 + <key>pad_for_usrp</key>
10489 + <value>False</value>
10490 + </param>
10491 + <param>
10492 + <key>payload_length</key>
10493 + <value>16</value>
10494 + </param>
10495 + <param>
10496 + <key>preamble</key>
10497 + <value></value>
10498 + </param>
10499 + <param>
10500 + <key>samples_per_symbol</key>
10501 + <value>4</value>
10502 + </param>
10503 + </block>
10504 + <block>
10505 + <key>blocks_file_sink</key>
10506 + <param>
10507 + <key>append</key>
10508 + <value>False</value>
10509 + </param>
10510 + <param>
10511 + <key>alias</key>
10512 + <value></value>
10513 + </param>
10514 + <param>
10515 + <key>comment</key>
10516 + <value></value>
10517 + </param>
10518 + <param>
10519 + <key>affinity</key>
10520 + <value></value>
10521 + </param>
10522 + <param>
10523 + <key>_enabled</key>
10524 + <value>1</value>
10525 + </param>
10526 + <param>
10527 + <key>file</key>
10528 + <value></value>
10529 + </param>
10530 + <param>
10531 + <key>_coordinate</key>
10532 + <value>(640, 380)</value>
10533 + </param>
10534 + <param>
10535 + <key>_rotation</key>
10536 + <value>0</value>
10537 + </param>
10538 + <param>
10539 + <key>id</key>
10540 + <value>blocks_file_sink_0</value>
10541 + </param>
10542 + <param>
10543 + <key>type</key>
10544 + <value>byte</value>
10545 + </param>
10546 + <param>
10547 + <key>unbuffered</key>
10548 + <value>True</value>
10549 + </param>
10550 + <param>
10551 + <key>vlen</key>
10552 + <value>1</value>
10553 + </param>
10554 + </block>
10555 + <block>
10556 + <key>blocks_file_source</key>
10557 + <param>
10558 + <key>begin_tag</key>
10559 + <value>pmt.PMT_NIL</value>
10560 + </param>
10561 + <param>
10562 + <key>alias</key>
10563 + <value></value>
10564 + </param>
10565 + <param>
10566 + <key>comment</key>
10567 + <value></value>
10568 + </param>
10569 + <param>
10570 + <key>affinity</key>
10571 + <value></value>
10572 + </param>
10573 + <param>
10574 + <key>_enabled</key>
10575 + <value>True</value>
10576 + </param>
10577 + <param>
10578 + <key>file</key>
10579 + <value></value>
10580 + </param>
10581 + <param>
10582 + <key>_coordinate</key>
10583 + <value>(72, 116)</value>
10584 + </param>
10585 + <param>
10586 + <key>_rotation</key>
10587 + <value>0</value>
10588 + </param>
10589 + <param>
10590 + <key>id</key>
10591 + <value>blocks_file_source_0</value>
10592 + </param>
10593 + <param>
10594 + <key>maxoutbuf</key>
10595 + <value>0</value>
10596 + </param>
10597 + <param>
10598 + <key>minoutbuf</key>
10599 + <value>0</value>
10600 + </param>
10601 + <param>
10602 + <key>type</key>
10603 + <value>byte</value>
10604 + </param>
10605 + <param>
10606 + <key>repeat</key>
10607 + <value>True</value>
10608 + </param>
10609 + <param>
10610 + <key>vlen</key>
10611 + <value>1</value>
10612 + </param>
10613 + </block>
10614 + <block>
10615 + <key>digital_gfsk_demod</key>
10616 + <param>
10617 + <key>alias</key>
10618 + <value></value>
10619 + </param>
10620 + <param>
10621 + <key>comment</key>
10622 + <value></value>
10623 + </param>
10624 + <param>
10625 + <key>affinity</key>
10626 + <value></value>
10627 + </param>
10628 + <param>
10629 + <key>_enabled</key>
10630 + <value>1</value>
10631 + </param>
10632 + <param>
10633 + <key>freq_error</key>
10634 + <value>0.0</value>
10635 + </param>
10636 + <param>
10637 + <key>_coordinate</key>
10638 + <value>(256, 360)</value>
10639 + </param>
10640 + <param>
10641 + <key>_rotation</key>
10642 + <value>0</value>
10643 + </param>
10644 + <param>
10645 + <key>gain_mu</key>
10646 + <value>0.175</value>
10647 + </param>
10648 + <param>
10649 + <key>id</key>
10650 + <value>digital_gfsk_demod_0</value>
10651 + </param>
10652 + <param>
10653 + <key>log</key>
10654 + <value>False</value>
10655 + </param>
10656 + <param>
10657 + <key>maxoutbuf</key>
10658 + <value>0</value>
10659 + </param>
10660 + <param>
10661 + <key>minoutbuf</key>
10662 + <value>0</value>
10663 + </param>
10664 + <param>
10665 + <key>mu</key>
10666 + <value>0.5</value>
10667 + </param>
10668 + <param>
10669 + <key>omega_relative_limit</key>
10670 + <value>0.005</value>
10671 + </param>
10672 + <param>
10673 + <key>samples_per_symbol</key>
10674 + <value>4</value>
10675 + </param>
10676 + <param>
10677 + <key>sensitivity</key>
10678 + <value>1</value>
10679 + </param>
10680 + <param>
10681 + <key>verbose</key>
10682 + <value>False</value>
10683 + </param>
10684 + </block>
10685 + <block>
10686 + <key>digital_gfsk_mod</key>
10687 + <param>
10688 + <key>bt</key>
10689 + <value>0.35</value>
10690 + </param>
10691 + <param>
10692 + <key>alias</key>
10693 + <value></value>
10694 + </param>
10695 + <param>
10696 + <key>comment</key>
10697 + <value></value>
10698 + </param>
10699 + <param>
10700 + <key>affinity</key>
10701 + <value></value>
10702 + </param>
10703 + <param>
10704 + <key>_enabled</key>
10705 + <value>True</value>
10706 + </param>
10707 + <param>
10708 + <key>_coordinate</key>
10709 + <value>(448, 112)</value>
10710 + </param>
10711 + <param>
10712 + <key>_rotation</key>
10713 + <value>0</value>
10714 + </param>
10715 + <param>
10716 + <key>id</key>
10717 + <value>digital_gfsk_mod_0</value>
10718 + </param>
10719 + <param>
10720 + <key>log</key>
10721 + <value>False</value>
10722 + </param>
10723 + <param>
10724 + <key>maxoutbuf</key>
10725 + <value>0</value>
10726 + </param>
10727 + <param>
10728 + <key>minoutbuf</key>
10729 + <value>0</value>
10730 + </param>
10731 + <param>
10732 + <key>samples_per_symbol</key>
10733 + <value>4</value>
10734 + </param>
10735 + <param>
10736 + <key>sensitivity</key>
10737 + <value>1</value>
10738 + </param>
10739 + <param>
10740 + <key>verbose</key>
10741 + <value>True</value>
10742 + </param>
10743 + </block>
10744 + <block>
10745 + <key>limesdr_sink</key>
10746 + <param>
10747 + <key>alias</key>
10748 + <value></value>
10749 + </param>
10750 + <param>
10751 + <key>analog_bandw_ch0</key>
10752 + <value>10e6</value>
10753 + </param>
10754 + <param>
10755 + <key>calibr_bandw_ch0</key>
10756 + <value>0</value>
10757 + </param>
10758 + <param>
10759 + <key>digital_bandw_ch0</key>
10760 + <value>0</value>
10761 + </param>
10762 + <param>
10763 + <key>gain_dB_ch0</key>
10764 + <value>40</value>
10765 + </param>
10766 + <param>
10767 + <key>nco_freq_ch0</key>
10768 + <value>0</value>
10769 + </param>
10770 + <param>
10771 + <key>pa_path_ch0</key>
10772 + <value>255</value>
10773 + </param>
10774 + <param>
10775 + <key>analog_bandw_ch1</key>
10776 + <value>10e6</value>
10777 + </param>
10778 + <param>
10779 + <key>calibr_bandw_ch1</key>
10780 + <value>0</value>
10781 + </param>
10782 + <param>
10783 + <key>digital_bandw_ch1</key>
10784 + <value>0</value>
10785 + </param>
10786 + <param>
10787 + <key>gain_dB_ch1</key>
10788 + <value>40</value>
10789 + </param>
10790 + <param>
10791 + <key>nco_freq_ch1</key>
10792 + <value>0</value>
10793 + </param>
10794 + <param>
10795 + <key>pa_path_ch1</key>
10796 + <value>1</value>
10797 + </param>
10798 + <param>
10799 + <key>channel_mode</key>
10800 + <value>0</value>
10801 + </param>
10802 + <param>
10803 + <key>comment</key>
10804 + <value></value>
10805 + </param>
10806 + <param>
10807 + <key>affinity</key>
10808 + <value></value>
10809 + </param>
10810 + <param>
10811 + <key>serial</key>
10812 + <value></value>
10813 + </param>
10814 + <param>
10815 + <key>_enabled</key>
10816 + <value>1</value>
10817 + </param>
10818 + <param>
10819 + <key>filename</key>
10820 + <value></value>
10821 + </param>
10822 + <param>
10823 + <key>_coordinate</key>
10824 + <value>(808, 124)</value>
10825 + </param>
10826 + <param>
10827 + <key>_rotation</key>
10828 + <value>0</value>
10829 + </param>
10830 + <param>
10831 + <key>id</key>
10832 + <value>limesdr_sink_0</value>
10833 + </param>
10834 + <param>
10835 + <key>length_tag_name</key>
10836 + <value></value>
10837 + </param>
10838 + <param>
10839 + <key>oversample</key>
10840 + <value>0</value>
10841 + </param>
10842 + <param>
10843 + <key>rf_freq</key>
10844 + <value>1e9</value>
10845 + </param>
10846 + <param>
10847 + <key>samp_rate</key>
10848 + <value>0.5e6</value>
10849 + </param>
10850 + </block>
10851 + <block>
10852 + <key>limesdr_source</key>
10853 + <param>
10854 + <key>alias</key>
10855 + <value></value>
10856 + </param>
10857 + <param>
10858 + <key>analog_bandw_ch0</key>
10859 + <value>10e6</value>
10860 + </param>
10861 + <param>
10862 + <key>calibr_bandw_ch0</key>
10863 + <value>0</value>
10864 + </param>
10865 + <param>
10866 + <key>digital_bandw_ch0</key>
10867 + <value>0</value>
10868 + </param>
10869 + <param>
10870 + <key>gain_dB_ch0</key>
10871 + <value>40</value>
10872 + </param>
10873 + <param>
10874 + <key>lna_path_ch0</key>
10875 + <value>255</value>
10876 + </param>
10877 + <param>
10878 + <key>nco_freq_ch0</key>
10879 + <value>0</value>
10880 + </param>
10881 + <param>
10882 + <key>analog_bandw_ch1</key>
10883 + <value>10e6</value>
10884 + </param>
10885 + <param>
10886 + <key>calibr_bandw_ch1</key>
10887 + <value>0</value>
10888 + </param>
10889 + <param>
10890 + <key>digital_bandw_ch1</key>
10891 + <value>0</value>
10892 + </param>
10893 + <param>
10894 + <key>gain_dB_ch1</key>
10895 + <value>40</value>
10896 + </param>
10897 + <param>
10898 + <key>lna_path_ch1</key>
10899 + <value>1</value>
10900 + </param>
10901 + <param>
10902 + <key>nco_freq_ch1</key>
10903 + <value>0</value>
10904 + </param>
10905 + <param>
10906 + <key>channel_mode</key>
10907 + <value>0</value>
10908 + </param>
10909 + <param>
10910 + <key>comment</key>
10911 + <value></value>
10912 + </param>
10913 + <param>
10914 + <key>affinity</key>
10915 + <value></value>
10916 + </param>
10917 + <param>
10918 + <key>serial</key>
10919 + <value></value>
10920 + </param>
10921 + <param>
10922 + <key>_enabled</key>
10923 + <value>1</value>
10924 + </param>
10925 + <param>
10926 + <key>filename</key>
10927 + <value></value>
10928 + </param>
10929 + <param>
10930 + <key>_coordinate</key>
10931 + <value>(8, 240)</value>
10932 + </param>
10933 + <param>
10934 + <key>_rotation</key>
10935 + <value>0</value>
10936 + </param>
10937 + <param>
10938 + <key>id</key>
10939 + <value>limesdr_source_0</value>
10940 + </param>
10941 + <param>
10942 + <key>maxoutbuf</key>
10943 + <value>0</value>
10944 + </param>
10945 + <param>
10946 + <key>minoutbuf</key>
10947 + <value>0</value>
10948 + </param>
10949 + <param>
10950 + <key>oversample</key>
10951 + <value>0</value>
10952 + </param>
10953 + <param>
10954 + <key>rf_freq</key>
10955 + <value>1e9</value>
10956 + </param>
10957 + <param>
10958 + <key>samp_rate</key>
10959 + <value>0.5e6</value>
10960 + </param>
10961 + </block>
10962 + <block>
10963 + <key>qtgui_time_sink_x</key>
10964 + <param>
10965 + <key>autoscale</key>
10966 + <value>False</value>
10967 + </param>
10968 + <param>
10969 + <key>axislabels</key>
10970 + <value>True</value>
10971 + </param>
10972 + <param>
10973 + <key>alias</key>
10974 + <value></value>
10975 + </param>
10976 + <param>
10977 + <key>comment</key>
10978 + <value></value>
10979 + </param>
10980 + <param>
10981 + <key>ctrlpanel</key>
10982 + <value>False</value>
10983 + </param>
10984 + <param>
10985 + <key>affinity</key>
10986 + <value></value>
10987 + </param>
10988 + <param>
10989 + <key>entags</key>
10990 + <value>True</value>
10991 + </param>
10992 + <param>
10993 + <key>_enabled</key>
10994 + <value>True</value>
10995 + </param>
10996 + <param>
10997 + <key>_coordinate</key>
10998 + <value>(832, 32)</value>
10999 + </param>
11000 + <param>
11001 + <key>gui_hint</key>
11002 + <value></value>
11003 + </param>
11004 + <param>
11005 + <key>_rotation</key>
11006 + <value>0</value>
11007 + </param>
11008 + <param>
11009 + <key>grid</key>
11010 + <value>False</value>
11011 + </param>
11012 + <param>
11013 + <key>id</key>
11014 + <value>qtgui_time_sink_x_0</value>
11015 + </param>
11016 + <param>
11017 + <key>legend</key>
11018 + <value>True</value>
11019 + </param>
11020 + <param>
11021 + <key>alpha1</key>
11022 + <value>1.0</value>
11023 + </param>
11024 + <param>
11025 + <key>color1</key>
11026 + <value>"blue"</value>
11027 + </param>
11028 + <param>
11029 + <key>label1</key>
11030 + <value></value>
11031 + </param>
11032 + <param>
11033 + <key>marker1</key>
11034 + <value>-1</value>
11035 + </param>
11036 + <param>
11037 + <key>style1</key>
11038 + <value>1</value>
11039 + </param>
11040 + <param>
11041 + <key>width1</key>
11042 + <value>1</value>
11043 + </param>
11044 + <param>
11045 + <key>alpha10</key>
11046 + <value>1.0</value>
11047 + </param>
11048 + <param>
11049 + <key>color10</key>
11050 + <value>"blue"</value>
11051 + </param>
11052 + <param>
11053 + <key>label10</key>
11054 + <value></value>
11055 + </param>
11056 + <param>
11057 + <key>marker10</key>
11058 + <value>-1</value>
11059 + </param>
11060 + <param>
11061 + <key>style10</key>
11062 + <value>1</value>
11063 + </param>
11064 + <param>
11065 + <key>width10</key>
11066 + <value>1</value>
11067 + </param>
11068 + <param>
11069 + <key>alpha2</key>
11070 + <value>1.0</value>
11071 + </param>
11072 + <param>
11073 + <key>color2</key>
11074 + <value>"red"</value>
11075 + </param>
11076 + <param>
11077 + <key>label2</key>
11078 + <value></value>
11079 + </param>
11080 + <param>
11081 + <key>marker2</key>
11082 + <value>-1</value>
11083 + </param>
11084 + <param>
11085 + <key>style2</key>
11086 + <value>1</value>
11087 + </param>
11088 + <param>
11089 + <key>width2</key>
11090 + <value>1</value>
11091 + </param>
11092 + <param>
11093 + <key>alpha3</key>
11094 + <value>1.0</value>
11095 + </param>
11096 + <param>
11097 + <key>color3</key>
11098 + <value>"green"</value>
11099 + </param>
11100 + <param>
11101 + <key>label3</key>
11102 + <value></value>
11103 + </param>
11104 + <param>
11105 + <key>marker3</key>
11106 + <value>-1</value>
11107 + </param>
11108 + <param>
11109 + <key>style3</key>
11110 + <value>1</value>
11111 + </param>
11112 + <param>
11113 + <key>width3</key>
11114 + <value>1</value>
11115 + </param>
11116 + <param>
11117 + <key>alpha4</key>
11118 + <value>1.0</value>
11119 + </param>
11120 + <param>
11121 + <key>color4</key>
11122 + <value>"black"</value>
11123 + </param>
11124 + <param>
11125 + <key>label4</key>
11126 + <value></value>
11127 + </param>
11128 + <param>
11129 + <key>marker4</key>
11130 + <value>-1</value>
11131 + </param>
11132 + <param>
11133 + <key>style4</key>
11134 + <value>1</value>
11135 + </param>
11136 + <param>
11137 + <key>width4</key>
11138 + <value>1</value>
11139 + </param>
11140 + <param>
11141 + <key>alpha5</key>
11142 + <value>1.0</value>
11143 + </param>
11144 + <param>
11145 + <key>color5</key>
11146 + <value>"cyan"</value>
11147 + </param>
11148 + <param>
11149 + <key>label5</key>
11150 + <value></value>
11151 + </param>
11152 + <param>
11153 + <key>marker5</key>
11154 + <value>-1</value>
11155 + </param>
11156 + <param>
11157 + <key>style5</key>
11158 + <value>1</value>
11159 + </param>
11160 + <param>
11161 + <key>width5</key>
11162 + <value>1</value>
11163 + </param>
11164 + <param>
11165 + <key>alpha6</key>
11166 + <value>1.0</value>
11167 + </param>
11168 + <param>
11169 + <key>color6</key>
11170 + <value>"magenta"</value>
11171 + </param>
11172 + <param>
11173 + <key>label6</key>
11174 + <value></value>
11175 + </param>
11176 + <param>
11177 + <key>marker6</key>
11178 + <value>-1</value>
11179 + </param>
11180 + <param>
11181 + <key>style6</key>
11182 + <value>1</value>
11183 + </param>
11184 + <param>
11185 + <key>width6</key>
11186 + <value>1</value>
11187 + </param>
11188 + <param>
11189 + <key>alpha7</key>
11190 + <value>1.0</value>
11191 + </param>
11192 + <param>
11193 + <key>color7</key>
11194 + <value>"yellow"</value>
11195 + </param>
11196 + <param>
11197 + <key>label7</key>
11198 + <value></value>
11199 + </param>
11200 + <param>
11201 + <key>marker7</key>
11202 + <value>-1</value>
11203 + </param>
11204 + <param>
11205 + <key>style7</key>
11206 + <value>1</value>
11207 + </param>
11208 + <param>
11209 + <key>width7</key>
11210 + <value>1</value>
11211 + </param>
11212 + <param>
11213 + <key>alpha8</key>
11214 + <value>1.0</value>
11215 + </param>
11216 + <param>
11217 + <key>color8</key>
11218 + <value>"dark red"</value>
11219 + </param>
11220 + <param>
11221 + <key>label8</key>
11222 + <value></value>
11223 + </param>
11224 + <param>
11225 + <key>marker8</key>
11226 + <value>-1</value>
11227 + </param>
11228 + <param>
11229 + <key>style8</key>
11230 + <value>1</value>
11231 + </param>
11232 + <param>
11233 + <key>width8</key>
11234 + <value>1</value>
11235 + </param>
11236 + <param>
11237 + <key>alpha9</key>
11238 + <value>1.0</value>
11239 + </param>
11240 + <param>
11241 + <key>color9</key>
11242 + <value>"dark green"</value>
11243 + </param>
11244 + <param>
11245 + <key>label9</key>
11246 + <value></value>
11247 + </param>
11248 + <param>
11249 + <key>marker9</key>
11250 + <value>-1</value>
11251 + </param>
11252 + <param>
11253 + <key>style9</key>
11254 + <value>1</value>
11255 + </param>
11256 + <param>
11257 + <key>width9</key>
11258 + <value>1</value>
11259 + </param>
11260 + <param>
11261 + <key>name</key>
11262 + <value>Sent Signal</value>
11263 + </param>
11264 + <param>
11265 + <key>nconnections</key>
11266 + <value>1</value>
11267 + </param>
11268 + <param>
11269 + <key>size</key>
11270 + <value>1024</value>
11271 + </param>
11272 + <param>
11273 + <key>srate</key>
11274 + <value>2.4e6</value>
11275 + </param>
11276 + <param>
11277 + <key>stemplot</key>
11278 + <value>False</value>
11279 + </param>
11280 + <param>
11281 + <key>tr_chan</key>
11282 + <value>0</value>
11283 + </param>
11284 + <param>
11285 + <key>tr_delay</key>
11286 + <value>0</value>
11287 + </param>
11288 + <param>
11289 + <key>tr_level</key>
11290 + <value>0.0</value>
11291 + </param>
11292 + <param>
11293 + <key>tr_mode</key>
11294 + <value>qtgui.TRIG_MODE_FREE</value>
11295 + </param>
11296 + <param>
11297 + <key>tr_slope</key>
11298 + <value>qtgui.TRIG_SLOPE_POS</value>
11299 + </param>
11300 + <param>
11301 + <key>tr_tag</key>
11302 + <value>""</value>
11303 + </param>
11304 + <param>
11305 + <key>type</key>
11306 + <value>float</value>
11307 + </param>
11308 + <param>
11309 + <key>update_time</key>
11310 + <value>0.10</value>
11311 + </param>
11312 + <param>
11313 + <key>ylabel</key>
11314 + <value>Amplitude</value>
11315 + </param>
11316 + <param>
11317 + <key>yunit</key>
11318 + <value>""</value>
11319 + </param>
11320 + <param>
11321 + <key>ymax</key>
11322 + <value>1</value>
11323 + </param>
11324 + <param>
11325 + <key>ymin</key>
11326 + <value>-1</value>
11327 + </param>
11328 + </block>
11329 + <block>
11330 + <key>qtgui_time_sink_x</key>
11331 + <param>
11332 + <key>autoscale</key>
11333 + <value>False</value>
11334 + </param>
11335 + <param>
11336 + <key>axislabels</key>
11337 + <value>True</value>
11338 + </param>
11339 + <param>
11340 + <key>alias</key>
11341 + <value></value>
11342 + </param>
11343 + <param>
11344 + <key>comment</key>
11345 + <value></value>
11346 + </param>
11347 + <param>
11348 + <key>ctrlpanel</key>
11349 + <value>False</value>
11350 + </param>
11351 + <param>
11352 + <key>affinity</key>
11353 + <value></value>
11354 + </param>
11355 + <param>
11356 + <key>entags</key>
11357 + <value>True</value>
11358 + </param>
11359 + <param>
11360 + <key>_enabled</key>
11361 + <value>True</value>
11362 + </param>
11363 + <param>
11364 + <key>_coordinate</key>
11365 + <value>(440, 272)</value>
11366 + </param>
11367 + <param>
11368 + <key>gui_hint</key>
11369 + <value></value>
11370 + </param>
11371 + <param>
11372 + <key>_rotation</key>
11373 + <value>0</value>
11374 + </param>
11375 + <param>
11376 + <key>grid</key>
11377 + <value>False</value>
11378 + </param>
11379 + <param>
11380 + <key>id</key>
11381 + <value>qtgui_time_sink_x_0_0</value>
11382 + </param>
11383 + <param>
11384 + <key>legend</key>
11385 + <value>True</value>
11386 + </param>
11387 + <param>
11388 + <key>alpha1</key>
11389 + <value>1.0</value>
11390 + </param>
11391 + <param>
11392 + <key>color1</key>
11393 + <value>"blue"</value>
11394 + </param>
11395 + <param>
11396 + <key>label1</key>
11397 + <value></value>
11398 + </param>
11399 + <param>
11400 + <key>marker1</key>
11401 + <value>-1</value>
11402 + </param>
11403 + <param>
11404 + <key>style1</key>
11405 + <value>1</value>
11406 + </param>
11407 + <param>
11408 + <key>width1</key>
11409 + <value>1</value>
11410 + </param>
11411 + <param>
11412 + <key>alpha10</key>
11413 + <value>1.0</value>
11414 + </param>
11415 + <param>
11416 + <key>color10</key>
11417 + <value>"blue"</value>
11418 + </param>
11419 + <param>
11420 + <key>label10</key>
11421 + <value></value>
11422 + </param>
11423 + <param>
11424 + <key>marker10</key>
11425 + <value>-1</value>
11426 + </param>
11427 + <param>
11428 + <key>style10</key>
11429 + <value>1</value>
11430 + </param>
11431 + <param>
11432 + <key>width10</key>
11433 + <value>1</value>
11434 + </param>
11435 + <param>
11436 + <key>alpha2</key>
11437 + <value>1.0</value>
11438 + </param>
11439 + <param>
11440 + <key>color2</key>
11441 + <value>"red"</value>
11442 + </param>
11443 + <param>
11444 + <key>label2</key>
11445 + <value></value>
11446 + </param>
11447 + <param>
11448 + <key>marker2</key>
11449 + <value>-1</value>
11450 + </param>
11451 + <param>
11452 + <key>style2</key>
11453 + <value>1</value>
11454 + </param>
11455 + <param>
11456 + <key>width2</key>
11457 + <value>1</value>
11458 + </param>
11459 + <param>
11460 + <key>alpha3</key>
11461 + <value>1.0</value>
11462 + </param>
11463 + <param>
11464 + <key>color3</key>
11465 + <value>"green"</value>
11466 + </param>
11467 + <param>
11468 + <key>label3</key>
11469 + <value></value>
11470 + </param>
11471 + <param>
11472 + <key>marker3</key>
11473 + <value>-1</value>
11474 + </param>
11475 + <param>
11476 + <key>style3</key>
11477 + <value>1</value>
11478 + </param>
11479 + <param>
11480 + <key>width3</key>
11481 + <value>1</value>
11482 + </param>
11483 + <param>
11484 + <key>alpha4</key>
11485 + <value>1.0</value>
11486 + </param>
11487 + <param>
11488 + <key>color4</key>
11489 + <value>"black"</value>
11490 + </param>
11491 + <param>
11492 + <key>label4</key>
11493 + <value></value>
11494 + </param>
11495 + <param>
11496 + <key>marker4</key>
11497 + <value>-1</value>
11498 + </param>
11499 + <param>
11500 + <key>style4</key>
11501 + <value>1</value>
11502 + </param>
11503 + <param>
11504 + <key>width4</key>
11505 + <value>1</value>
11506 + </param>
11507 + <param>
11508 + <key>alpha5</key>
11509 + <value>1.0</value>
11510 + </param>
11511 + <param>
11512 + <key>color5</key>
11513 + <value>"cyan"</value>
11514 + </param>
11515 + <param>
11516 + <key>label5</key>
11517 + <value></value>
11518 + </param>
11519 + <param>
11520 + <key>marker5</key>
11521 + <value>-1</value>
11522 + </param>
11523 + <param>
11524 + <key>style5</key>
11525 + <value>1</value>
11526 + </param>
11527 + <param>
11528 + <key>width5</key>
11529 + <value>1</value>
11530 + </param>
11531 + <param>
11532 + <key>alpha6</key>
11533 + <value>1.0</value>
11534 + </param>
11535 + <param>
11536 + <key>color6</key>
11537 + <value>"magenta"</value>
11538 + </param>
11539 + <param>
11540 + <key>label6</key>
11541 + <value></value>
11542 + </param>
11543 + <param>
11544 + <key>marker6</key>
11545 + <value>-1</value>
11546 + </param>
11547 + <param>
11548 + <key>style6</key>
11549 + <value>1</value>
11550 + </param>
11551 + <param>
11552 + <key>width6</key>
11553 + <value>1</value>
11554 + </param>
11555 + <param>
11556 + <key>alpha7</key>
11557 + <value>1.0</value>
11558 + </param>
11559 + <param>
11560 + <key>color7</key>
11561 + <value>"yellow"</value>
11562 + </param>
11563 + <param>
11564 + <key>label7</key>
11565 + <value></value>
11566 + </param>
11567 + <param>
11568 + <key>marker7</key>
11569 + <value>-1</value>
11570 + </param>
11571 + <param>
11572 + <key>style7</key>
11573 + <value>1</value>
11574 + </param>
11575 + <param>
11576 + <key>width7</key>
11577 + <value>1</value>
11578 + </param>
11579 + <param>
11580 + <key>alpha8</key>
11581 + <value>1.0</value>
11582 + </param>
11583 + <param>
11584 + <key>color8</key>
11585 + <value>"dark red"</value>
11586 + </param>
11587 + <param>
11588 + <key>label8</key>
11589 + <value></value>
11590 + </param>
11591 + <param>
11592 + <key>marker8</key>
11593 + <value>-1</value>
11594 + </param>
11595 + <param>
11596 + <key>style8</key>
11597 + <value>1</value>
11598 + </param>
11599 + <param>
11600 + <key>width8</key>
11601 + <value>1</value>
11602 + </param>
11603 + <param>
11604 + <key>alpha9</key>
11605 + <value>1.0</value>
11606 + </param>
11607 + <param>
11608 + <key>color9</key>
11609 + <value>"dark green"</value>
11610 + </param>
11611 + <param>
11612 + <key>label9</key>
11613 + <value></value>
11614 + </param>
11615 + <param>
11616 + <key>marker9</key>
11617 + <value>-1</value>
11618 + </param>
11619 + <param>
11620 + <key>style9</key>
11621 + <value>1</value>
11622 + </param>
11623 + <param>
11624 + <key>width9</key>
11625 + <value>1</value>
11626 + </param>
11627 + <param>
11628 + <key>name</key>
11629 + <value>Received Signal</value>
11630 + </param>
11631 + <param>
11632 + <key>nconnections</key>
11633 + <value>1</value>
11634 + </param>
11635 + <param>
11636 + <key>size</key>
11637 + <value>1024</value>
11638 + </param>
11639 + <param>
11640 + <key>srate</key>
11641 + <value>2.4e6</value>
11642 + </param>
11643 + <param>
11644 + <key>stemplot</key>
11645 + <value>False</value>
11646 + </param>
11647 + <param>
11648 + <key>tr_chan</key>
11649 + <value>0</value>
11650 + </param>
11651 + <param>
11652 + <key>tr_delay</key>
11653 + <value>0</value>
11654 + </param>
11655 + <param>
11656 + <key>tr_level</key>
11657 + <value>0.0</value>
11658 + </param>
11659 + <param>
11660 + <key>tr_mode</key>
11661 + <value>qtgui.TRIG_MODE_FREE</value>
11662 + </param>
11663 + <param>
11664 + <key>tr_slope</key>
11665 + <value>qtgui.TRIG_SLOPE_POS</value>
11666 + </param>
11667 + <param>
11668 + <key>tr_tag</key>
11669 + <value>""</value>
11670 + </param>
11671 + <param>
11672 + <key>type</key>
11673 + <value>float</value>
11674 + </param>
11675 + <param>
11676 + <key>update_time</key>
11677 + <value>0.10</value>
11678 + </param>
11679 + <param>
11680 + <key>ylabel</key>
11681 + <value>Amplitude</value>
11682 + </param>
11683 + <param>
11684 + <key>yunit</key>
11685 + <value>""</value>
11686 + </param>
11687 + <param>
11688 + <key>ymax</key>
11689 + <value>1</value>
11690 + </param>
11691 + <param>
11692 + <key>ymin</key>
11693 + <value>-1</value>
11694 + </param>
11695 + </block>
11696 + <connection>
11697 + <source_block_id>analog_quadrature_demod_cf_0</source_block_id>
11698 + <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
11699 + <source_key>0</source_key>
11700 + <sink_key>0</sink_key>
11701 + </connection>
11702 + <connection>
11703 + <source_block_id>analog_quadrature_demod_cf_0_0</source_block_id>
11704 + <sink_block_id>qtgui_time_sink_x_0_0</sink_block_id>
11705 + <source_key>0</source_key>
11706 + <sink_key>0</sink_key>
11707 + </connection>
11708 + <connection>
11709 + <source_block_id>blks2_packet_decoder_0</source_block_id>
11710 + <sink_block_id>blocks_file_sink_0</sink_block_id>
11711 + <source_key>0</source_key>
11712 + <sink_key>0</sink_key>
11713 + </connection>
11714 + <connection>
11715 + <source_block_id>blks2_packet_encoder_0</source_block_id>
11716 + <sink_block_id>digital_gfsk_mod_0</sink_block_id>
11717 + <source_key>0</source_key>
11718 + <sink_key>0</sink_key>
11719 + </connection>
11720 + <connection>
11721 + <source_block_id>blocks_file_source_0</source_block_id>
11722 + <sink_block_id>blks2_packet_encoder_0</sink_block_id>
11723 + <source_key>0</source_key>
11724 + <sink_key>0</sink_key>
11725 + </connection>
11726 + <connection>
11727 + <source_block_id>digital_gfsk_demod_0</source_block_id>
11728 + <sink_block_id>blks2_packet_decoder_0</sink_block_id>
11729 + <source_key>0</source_key>
11730 + <sink_key>0</sink_key>
11731 + </connection>
11732 + <connection>
11733 + <source_block_id>digital_gfsk_mod_0</source_block_id>
11734 + <sink_block_id>analog_quadrature_demod_cf_0</sink_block_id>
11735 + <source_key>0</source_key>
11736 + <sink_key>0</sink_key>
11737 + </connection>
11738 + <connection>
11739 + <source_block_id>digital_gfsk_mod_0</source_block_id>
11740 + <sink_block_id>limesdr_sink_0</sink_block_id>
11741 + <source_key>0</source_key>
11742 + <sink_key>0</sink_key>
11743 + </connection>
11744 + <connection>
11745 + <source_block_id>limesdr_source_0</source_block_id>
11746 + <sink_block_id>analog_quadrature_demod_cf_0_0</sink_block_id>
11747 + <source_key>0</source_key>
11748 + <sink_key>0</sink_key>
11749 + </connection>
11750 + <connection>
11751 + <source_block_id>limesdr_source_0</source_block_id>
11752 + <sink_block_id>digital_gfsk_demod_0</sink_block_id>
11753 + <source_key>0</source_key>
11754 + <sink_key>0</sink_key>
11755 + </connection>
11756 +</flow_graph>
11757 diff --git a/examples/README b/examples/README
11758 new file mode 100644
11759 index 0000000..c012bdf
11760 --- /dev/null
11761 +++ b/examples/README
11762 @@ -0,0 +1,4 @@
11763 +It is considered good practice to add examples in here to demonstrate the
11764 +functionality of your OOT module. Python scripts, GRC flow graphs or other
11765 +code can go here.
11766 +
11767 diff --git a/examples/signal_analyzer.grc b/examples/signal_analyzer.grc
11768 index 5389ee6..6d3b641 100644
11769 --- a/examples/signal_analyzer.grc
11770 +++ b/examples/signal_analyzer.grc
11771 @@ -1,226 +1,570 @@
11772 -options:
11773 - parameters:
11774 - author: Lime Microsystems
11775 - category: '[GRC Hier Blocks]'
11776 - cmake_opt: ''
11777 - comment: ''
11778 - copyright: ''
11779 - description: ''
11780 - gen_cmake: 'On'
11781 - gen_linking: dynamic
11782 - generate_options: qt_gui
11783 - hier_block_src_path: '.:'
11784 - id: top_block
11785 - max_nouts: '0'
11786 - output_language: python
11787 - placement: (0,0)
11788 - qt_qss_theme: ''
11789 - realtime_scheduling: ''
11790 - run: 'True'
11791 - run_command: '{python} -u {filename}'
11792 - run_options: prompt
11793 - sizing_mode: fixed
11794 - thread_safe_setters: ''
11795 - title: Signal analyzer
11796 - window_size: (300,300)
11797 - states:
11798 - bus_sink: false
11799 - bus_source: false
11800 - bus_structure: null
11801 - coordinate: [8, 6]
11802 - rotation: 0
11803 - state: enabled
11804 -
11805 -blocks:
11806 -- name: analog_filter
11807 - id: variable_qtgui_entry
11808 - parameters:
11809 - comment: ''
11810 - gui_hint: 1,0,1,1
11811 - label: Analog filter bandwidth [MHz]
11812 - type: real
11813 - value: samp_rate/1e6
11814 - states:
11815 - bus_sink: false
11816 - bus_source: false
11817 - bus_structure: null
11818 - coordinate: [339, 8]
11819 - rotation: 0
11820 - state: true
11821 -- name: baseband
11822 - id: variable_qtgui_entry
11823 - parameters:
11824 - comment: ''
11825 - gui_hint: 0,0,1,1
11826 - label: RX Baseband [MHz]
11827 - type: real
11828 - value: '100'
11829 - states:
11830 - bus_sink: false
11831 - bus_source: false
11832 - bus_structure: null
11833 - coordinate: [178, 8]
11834 - rotation: 0
11835 - state: true
11836 -- name: digital_filter
11837 - id: variable_qtgui_entry
11838 - parameters:
11839 - comment: ''
11840 - gui_hint: 1,1,1,1
11841 - label: Digital filter bandwidth [MHz]
11842 - type: real
11843 - value: samp_rate/1e6 - 0.3
11844 - states:
11845 - bus_sink: false
11846 - bus_source: false
11847 - bus_structure: null
11848 - coordinate: [339, 88]
11849 - rotation: 0
11850 - state: true
11851 -- name: gain
11852 - id: variable_qtgui_range
11853 - parameters:
11854 - comment: ''
11855 - gui_hint: 2,0,1,1
11856 - label: Gain [dB]
11857 - min_len: '70'
11858 - orient: Qt.Horizontal
11859 - rangeType: int
11860 - start: '0'
11861 - step: '1'
11862 - stop: '70'
11863 - value: '30'
11864 - widget: counter_slider
11865 - states:
11866 - bus_sink: false
11867 - bus_source: false
11868 - bus_structure: null
11869 - coordinate: [510, 8]
11870 - rotation: 0
11871 - state: true
11872 -- name: lna_path
11873 - id: variable_qtgui_chooser
11874 - parameters:
11875 - comment: ''
11876 - gui_hint: 2,1,1,1
11877 - label: LNA Path
11878 - label0: Auto
11879 - label1: H
11880 - label2: L
11881 - label3: W
11882 - label4: ''
11883 - labels: '[]'
11884 - num_opts: '4'
11885 - option1: '1'
11886 - option2: '2'
11887 - option3: '3'
11888 - option4: '4'
11889 - options: '[0, 1, 2]'
11890 - orient: Qt.QVBoxLayout
11891 - type: int
11892 - value: '255'
11893 - widget: combo_box
11894 - states:
11895 - bus_sink: false
11896 - bus_source: false
11897 - bus_structure: null
11898 - coordinate: [10, 171]
11899 - rotation: 0
11900 - state: true
11901 -- name: nco
11902 - id: variable_qtgui_entry
11903 - parameters:
11904 - comment: ''
11905 - gui_hint: 0,1,1,1
11906 - label: NCO [MHz]
11907 - type: real
11908 - value: '0'
11909 - states:
11910 - bus_sink: false
11911 - bus_source: false
11912 - bus_structure: null
11913 - coordinate: [178, 87]
11914 - rotation: 0
11915 - state: true
11916 -- name: samp_rate
11917 - id: variable
11918 - parameters:
11919 - comment: ''
11920 - value: 5e6
11921 - states:
11922 - bus_sink: false
11923 - bus_source: false
11924 - bus_structure: null
11925 - coordinate: [9, 102]
11926 - rotation: 0
11927 - state: enabled
11928 -- name: limesdr_source_0
11929 - id: limesdr_source
11930 - parameters:
11931 - affinity: ''
11932 - alias: ''
11933 - allow_tcxo_dac: '0'
11934 - analog_bandw_ch0: analog_filter*1e6
11935 - analog_bandw_ch1: 1.5e6
11936 - calibr_bandw_ch0: samp_rate
11937 - calibr_bandw_ch1: 2.5e6
11938 - channel_mode: '0'
11939 - comment: ''
11940 - dacVal: '180'
11941 - digital_bandw_ch0: digital_filter*1e6
11942 - digital_bandw_ch1: samp_rate
11943 - filename: ''
11944 - gain_dB_ch0: gain
11945 - gain_dB_ch1: '1'
11946 - lna_path_ch0: lna_path
11947 - lna_path_ch1: '2'
11948 - maxoutbuf: '0'
11949 - minoutbuf: '0'
11950 - nco_freq_ch0: nco
11951 - nco_freq_ch1: '0'
11952 - oversample: '0'
11953 - rf_freq: baseband*1e6
11954 - samp_rate: samp_rate
11955 - serial: ''
11956 - states:
11957 - bus_sink: false
11958 - bus_source: false
11959 - bus_structure: null
11960 - coordinate: [177, 233]
11961 - rotation: 0
11962 - state: true
11963 -- name: qtgui_sink_x_0
11964 - id: qtgui_sink_x
11965 - parameters:
11966 - affinity: ''
11967 - alias: ''
11968 - bw: samp_rate
11969 - comment: ''
11970 - fc: baseband*1e6
11971 - fftsize: '4096'
11972 - gui_hint: 3,0,2,2
11973 - maxoutbuf: '0'
11974 - minoutbuf: '0'
11975 - name: '""'
11976 - plotconst: 'True'
11977 - plotfreq: 'True'
11978 - plottime: 'True'
11979 - plotwaterfall: 'True'
11980 - rate: '10'
11981 - showports: 'False'
11982 - showrf: 'True'
11983 - type: complex
11984 - wintype: firdes.WIN_BLACKMAN_hARRIS
11985 - states:
11986 - bus_sink: false
11987 - bus_source: false
11988 - bus_structure: null
11989 - coordinate: [427, 233]
11990 - rotation: 0
11991 - state: true
11992 -
11993 -connections:
11994 -- [limesdr_source_0, '0', qtgui_sink_x_0, '0']
11995 -
11996 -metadata:
11997 - file_format: 1
11998 +<?xml version='1.0' encoding='utf-8'?>
11999 +<?grc format='1' created='3.7.13'?>
12000 +<flow_graph>
12001 + <timestamp>Mon May 21 21:44:03 2018</timestamp>
12002 + <block>
12003 + <key>options</key>
12004 + <param>
12005 + <key>author</key>
12006 + <value>Lime Microsystems</value>
12007 + </param>
12008 + <param>
12009 + <key>window_size</key>
12010 + <value>(1000,500)</value>
12011 + </param>
12012 + <param>
12013 + <key>category</key>
12014 + <value>Custom</value>
12015 + </param>
12016 + <param>
12017 + <key>comment</key>
12018 + <value></value>
12019 + </param>
12020 + <param>
12021 + <key>description</key>
12022 + <value></value>
12023 + </param>
12024 + <param>
12025 + <key>_enabled</key>
12026 + <value>True</value>
12027 + </param>
12028 + <param>
12029 + <key>_coordinate</key>
12030 + <value>(8, 8)</value>
12031 + </param>
12032 + <param>
12033 + <key>_rotation</key>
12034 + <value>0</value>
12035 + </param>
12036 + <param>
12037 + <key>generate_options</key>
12038 + <value>qt_gui</value>
12039 + </param>
12040 + <param>
12041 + <key>hier_block_src_path</key>
12042 + <value>.:</value>
12043 + </param>
12044 + <param>
12045 + <key>id</key>
12046 + <value>top_block</value>
12047 + </param>
12048 + <param>
12049 + <key>max_nouts</key>
12050 + <value>0</value>
12051 + </param>
12052 + <param>
12053 + <key>qt_qss_theme</key>
12054 + <value></value>
12055 + </param>
12056 + <param>
12057 + <key>realtime_scheduling</key>
12058 + <value></value>
12059 + </param>
12060 + <param>
12061 + <key>run_command</key>
12062 + <value>{python} -u {filename}</value>
12063 + </param>
12064 + <param>
12065 + <key>run_options</key>
12066 + <value>prompt</value>
12067 + </param>
12068 + <param>
12069 + <key>run</key>
12070 + <value>True</value>
12071 + </param>
12072 + <param>
12073 + <key>sizing_mode</key>
12074 + <value>fixed</value>
12075 + </param>
12076 + <param>
12077 + <key>thread_safe_setters</key>
12078 + <value></value>
12079 + </param>
12080 + <param>
12081 + <key>title</key>
12082 + <value>Signal analyzer</value>
12083 + </param>
12084 + <param>
12085 + <key>placement</key>
12086 + <value>(0,0)</value>
12087 + </param>
12088 + </block>
12089 + <block>
12090 + <key>variable_qtgui_entry</key>
12091 + <param>
12092 + <key>comment</key>
12093 + <value></value>
12094 + </param>
12095 + <param>
12096 + <key>value</key>
12097 + <value>10</value>
12098 + </param>
12099 + <param>
12100 + <key>_enabled</key>
12101 + <value>True</value>
12102 + </param>
12103 + <param>
12104 + <key>_coordinate</key>
12105 + <value>(176, 206)</value>
12106 + </param>
12107 + <param>
12108 + <key>gui_hint</key>
12109 + <value>2,0,1,1</value>
12110 + </param>
12111 + <param>
12112 + <key>_rotation</key>
12113 + <value>0</value>
12114 + </param>
12115 + <param>
12116 + <key>id</key>
12117 + <value>analog_filter_bandwidth_rx</value>
12118 + </param>
12119 + <param>
12120 + <key>label</key>
12121 + <value>RX analog filter bandwidth [MHz]</value>
12122 + </param>
12123 + <param>
12124 + <key>type</key>
12125 + <value>real</value>
12126 + </param>
12127 + </block>
12128 + <block>
12129 + <key>variable_qtgui_entry</key>
12130 + <param>
12131 + <key>comment</key>
12132 + <value></value>
12133 + </param>
12134 + <param>
12135 + <key>value</key>
12136 + <value>600</value>
12137 + </param>
12138 + <param>
12139 + <key>_enabled</key>
12140 + <value>True</value>
12141 + </param>
12142 + <param>
12143 + <key>_coordinate</key>
12144 + <value>(176, 118)</value>
12145 + </param>
12146 + <param>
12147 + <key>gui_hint</key>
12148 + <value>0,1,1,1</value>
12149 + </param>
12150 + <param>
12151 + <key>_rotation</key>
12152 + <value>0</value>
12153 + </param>
12154 + <param>
12155 + <key>id</key>
12156 + <value>baseband_rx</value>
12157 + </param>
12158 + <param>
12159 + <key>label</key>
12160 + <value>RX baseband [MHz]</value>
12161 + </param>
12162 + <param>
12163 + <key>type</key>
12164 + <value>real</value>
12165 + </param>
12166 + </block>
12167 + <block>
12168 + <key>variable_qtgui_entry</key>
12169 + <param>
12170 + <key>comment</key>
12171 + <value></value>
12172 + </param>
12173 + <param>
12174 + <key>value</key>
12175 + <value>sample_rate/2e6</value>
12176 + </param>
12177 + <param>
12178 + <key>_enabled</key>
12179 + <value>True</value>
12180 + </param>
12181 + <param>
12182 + <key>_coordinate</key>
12183 + <value>(368, 206)</value>
12184 + </param>
12185 + <param>
12186 + <key>gui_hint</key>
12187 + <value>2,1,1,1</value>
12188 + </param>
12189 + <param>
12190 + <key>_rotation</key>
12191 + <value>0</value>
12192 + </param>
12193 + <param>
12194 + <key>id</key>
12195 + <value>digital_filter_bandwidth_rx</value>
12196 + </param>
12197 + <param>
12198 + <key>label</key>
12199 + <value>RX digital filter bandwidth [MHz]</value>
12200 + </param>
12201 + <param>
12202 + <key>type</key>
12203 + <value>real</value>
12204 + </param>
12205 + </block>
12206 + <block>
12207 + <key>variable_qtgui_range</key>
12208 + <param>
12209 + <key>comment</key>
12210 + <value></value>
12211 + </param>
12212 + <param>
12213 + <key>value</key>
12214 + <value>0</value>
12215 + </param>
12216 + <param>
12217 + <key>_enabled</key>
12218 + <value>1</value>
12219 + </param>
12220 + <param>
12221 + <key>_coordinate</key>
12222 + <value>(392, 73)</value>
12223 + </param>
12224 + <param>
12225 + <key>gui_hint</key>
12226 + <value>1,0,1,1</value>
12227 + </param>
12228 + <param>
12229 + <key>_rotation</key>
12230 + <value>0</value>
12231 + </param>
12232 + <param>
12233 + <key>id</key>
12234 + <value>gain_rx</value>
12235 + </param>
12236 + <param>
12237 + <key>label</key>
12238 + <value>RX gain</value>
12239 + </param>
12240 + <param>
12241 + <key>min_len</key>
12242 + <value>200</value>
12243 + </param>
12244 + <param>
12245 + <key>orient</key>
12246 + <value>Qt.Horizontal</value>
12247 + </param>
12248 + <param>
12249 + <key>start</key>
12250 + <value>0</value>
12251 + </param>
12252 + <param>
12253 + <key>step</key>
12254 + <value>1</value>
12255 + </param>
12256 + <param>
12257 + <key>stop</key>
12258 + <value>70</value>
12259 + </param>
12260 + <param>
12261 + <key>rangeType</key>
12262 + <value>int</value>
12263 + </param>
12264 + <param>
12265 + <key>widget</key>
12266 + <value>counter_slider</value>
12267 + </param>
12268 + </block>
12269 + <block>
12270 + <key>variable_qtgui_entry</key>
12271 + <param>
12272 + <key>comment</key>
12273 + <value></value>
12274 + </param>
12275 + <param>
12276 + <key>value</key>
12277 + <value>0</value>
12278 + </param>
12279 + <param>
12280 + <key>_enabled</key>
12281 + <value>True</value>
12282 + </param>
12283 + <param>
12284 + <key>_coordinate</key>
12285 + <value>(16, 206)</value>
12286 + </param>
12287 + <param>
12288 + <key>gui_hint</key>
12289 + <value>1,1,1,1</value>
12290 + </param>
12291 + <param>
12292 + <key>_rotation</key>
12293 + <value>0</value>
12294 + </param>
12295 + <param>
12296 + <key>id</key>
12297 + <value>nco_freq_rx</value>
12298 + </param>
12299 + <param>
12300 + <key>label</key>
12301 + <value>RX NCO [MHz]</value>
12302 + </param>
12303 + <param>
12304 + <key>type</key>
12305 + <value>real</value>
12306 + </param>
12307 + </block>
12308 + <block>
12309 + <key>variable_qtgui_label</key>
12310 + <param>
12311 + <key>comment</key>
12312 + <value></value>
12313 + </param>
12314 + <param>
12315 + <key>value</key>
12316 + <value>5e6</value>
12317 + </param>
12318 + <param>
12319 + <key>_enabled</key>
12320 + <value>True</value>
12321 + </param>
12322 + <param>
12323 + <key>formatter</key>
12324 + <value>None</value>
12325 + </param>
12326 + <param>
12327 + <key>_coordinate</key>
12328 + <value>(192, 14)</value>
12329 + </param>
12330 + <param>
12331 + <key>gui_hint</key>
12332 + <value>0,0,1,1</value>
12333 + </param>
12334 + <param>
12335 + <key>_rotation</key>
12336 + <value>0</value>
12337 + </param>
12338 + <param>
12339 + <key>id</key>
12340 + <value>sample_rate</value>
12341 + </param>
12342 + <param>
12343 + <key>label</key>
12344 + <value>Sample rate [S/s]</value>
12345 + </param>
12346 + <param>
12347 + <key>type</key>
12348 + <value>raw</value>
12349 + </param>
12350 + </block>
12351 + <block>
12352 + <key>limesdr_source</key>
12353 + <param>
12354 + <key>alias</key>
12355 + <value></value>
12356 + </param>
12357 + <param>
12358 + <key>analog_bandw_ch0</key>
12359 + <value>analog_filter_bandwidth_rx*1e6</value>
12360 + </param>
12361 + <param>
12362 + <key>calibr_bandw_ch0</key>
12363 + <value>sample_rate</value>
12364 + </param>
12365 + <param>
12366 + <key>digital_bandw_ch0</key>
12367 + <value>digital_filter_bandwidth_rx*1e6</value>
12368 + </param>
12369 + <param>
12370 + <key>gain_dB_ch0</key>
12371 + <value>gain_rx</value>
12372 + </param>
12373 + <param>
12374 + <key>lna_path_ch0</key>
12375 + <value>255</value>
12376 + </param>
12377 + <param>
12378 + <key>nco_freq_ch0</key>
12379 + <value>nco_freq_rx*1e6</value>
12380 + </param>
12381 + <param>
12382 + <key>analog_bandw_ch1</key>
12383 + <value>0</value>
12384 + </param>
12385 + <param>
12386 + <key>calibr_bandw_ch1</key>
12387 + <value>0</value>
12388 + </param>
12389 + <param>
12390 + <key>digital_bandw_ch1</key>
12391 + <value>0</value>
12392 + </param>
12393 + <param>
12394 + <key>gain_dB_ch1</key>
12395 + <value>0</value>
12396 + </param>
12397 + <param>
12398 + <key>lna_path_ch1</key>
12399 + <value>2</value>
12400 + </param>
12401 + <param>
12402 + <key>nco_freq_ch1</key>
12403 + <value>0</value>
12404 + </param>
12405 + <param>
12406 + <key>channel_mode</key>
12407 + <value>0</value>
12408 + </param>
12409 + <param>
12410 + <key>comment</key>
12411 + <value></value>
12412 + </param>
12413 + <param>
12414 + <key>affinity</key>
12415 + <value></value>
12416 + </param>
12417 + <param>
12418 + <key>serial</key>
12419 + <value></value>
12420 + </param>
12421 + <param>
12422 + <key>_enabled</key>
12423 + <value>1</value>
12424 + </param>
12425 + <param>
12426 + <key>filename</key>
12427 + <value></value>
12428 + </param>
12429 + <param>
12430 + <key>_coordinate</key>
12431 + <value>(552, 120)</value>
12432 + </param>
12433 + <param>
12434 + <key>_rotation</key>
12435 + <value>0</value>
12436 + </param>
12437 + <param>
12438 + <key>id</key>
12439 + <value>limesdr_source_0</value>
12440 + </param>
12441 + <param>
12442 + <key>maxoutbuf</key>
12443 + <value>0</value>
12444 + </param>
12445 + <param>
12446 + <key>minoutbuf</key>
12447 + <value>0</value>
12448 + </param>
12449 + <param>
12450 + <key>oversample</key>
12451 + <value>0</value>
12452 + </param>
12453 + <param>
12454 + <key>rf_freq</key>
12455 + <value>baseband_rx*1e6</value>
12456 + </param>
12457 + <param>
12458 + <key>samp_rate</key>
12459 + <value>sample_rate</value>
12460 + </param>
12461 + </block>
12462 + <block>
12463 + <key>qtgui_sink_x</key>
12464 + <param>
12465 + <key>bw</key>
12466 + <value>sample_rate</value>
12467 + </param>
12468 + <param>
12469 + <key>alias</key>
12470 + <value></value>
12471 + </param>
12472 + <param>
12473 + <key>fc</key>
12474 + <value>baseband_rx*1e6</value>
12475 + </param>
12476 + <param>
12477 + <key>freqchangevar</key>
12478 + <value>None</value>
12479 + </param>
12480 + <param>
12481 + <key>comment</key>
12482 + <value></value>
12483 + </param>
12484 + <param>
12485 + <key>affinity</key>
12486 + <value></value>
12487 + </param>
12488 + <param>
12489 + <key>_enabled</key>
12490 + <value>True</value>
12491 + </param>
12492 + <param>
12493 + <key>fftsize</key>
12494 + <value>4096</value>
12495 + </param>
12496 + <param>
12497 + <key>_coordinate</key>
12498 + <value>(776, 200)</value>
12499 + </param>
12500 + <param>
12501 + <key>gui_hint</key>
12502 + <value>3,0,1,2</value>
12503 + </param>
12504 + <param>
12505 + <key>_rotation</key>
12506 + <value>0</value>
12507 + </param>
12508 + <param>
12509 + <key>id</key>
12510 + <value>qtgui_sink_x_0</value>
12511 + </param>
12512 + <param>
12513 + <key>maxoutbuf</key>
12514 + <value>0</value>
12515 + </param>
12516 + <param>
12517 + <key>minoutbuf</key>
12518 + <value>0</value>
12519 + </param>
12520 + <param>
12521 + <key>name</key>
12522 + <value></value>
12523 + </param>
12524 + <param>
12525 + <key>plotconst</key>
12526 + <value>True</value>
12527 + </param>
12528 + <param>
12529 + <key>plotfreq</key>
12530 + <value>True</value>
12531 + </param>
12532 + <param>
12533 + <key>plottime</key>
12534 + <value>True</value>
12535 + </param>
12536 + <param>
12537 + <key>plotwaterfall</key>
12538 + <value>True</value>
12539 + </param>
12540 + <param>
12541 + <key>showports</key>
12542 + <value>True</value>
12543 + </param>
12544 + <param>
12545 + <key>showrf</key>
12546 + <value>True</value>
12547 + </param>
12548 + <param>
12549 + <key>type</key>
12550 + <value>complex</value>
12551 + </param>
12552 + <param>
12553 + <key>rate</key>
12554 + <value>10</value>
12555 + </param>
12556 + <param>
12557 + <key>wintype</key>
12558 + <value>firdes.WIN_BLACKMAN_hARRIS</value>
12559 + </param>
12560 + </block>
12561 + <connection>
12562 + <source_block_id>limesdr_source_0</source_block_id>
12563 + <sink_block_id>qtgui_sink_x_0</sink_block_id>
12564 + <source_key>0</source_key>
12565 + <sink_key>0</sink_key>
12566 + </connection>
12567 +</flow_graph>
12568 diff --git a/examples/signal_analyzer_with_rfe.grc b/examples/signal_analyzer_with_rfe.grc
12569 new file mode 100644
12570 index 0000000..485e8c8
12571 --- /dev/null
12572 +++ b/examples/signal_analyzer_with_rfe.grc
12573 @@ -0,0 +1,950 @@
12574 +<?xml version='1.0' encoding='utf-8'?>
12575 +<?grc format='1' created='3.7.14'?>
12576 +<flow_graph>
12577 + <timestamp>Mon May 21 21:44:03 2018</timestamp>
12578 + <block>
12579 + <key>options</key>
12580 + <param>
12581 + <key>author</key>
12582 + <value>Lime Microsystems</value>
12583 + </param>
12584 + <param>
12585 + <key>window_size</key>
12586 + <value>(2000,1000)</value>
12587 + </param>
12588 + <param>
12589 + <key>category</key>
12590 + <value>Custom</value>
12591 + </param>
12592 + <param>
12593 + <key>comment</key>
12594 + <value></value>
12595 + </param>
12596 + <param>
12597 + <key>description</key>
12598 + <value></value>
12599 + </param>
12600 + <param>
12601 + <key>_enabled</key>
12602 + <value>True</value>
12603 + </param>
12604 + <param>
12605 + <key>_coordinate</key>
12606 + <value>(8, 8)</value>
12607 + </param>
12608 + <param>
12609 + <key>_rotation</key>
12610 + <value>0</value>
12611 + </param>
12612 + <param>
12613 + <key>generate_options</key>
12614 + <value>qt_gui</value>
12615 + </param>
12616 + <param>
12617 + <key>hier_block_src_path</key>
12618 + <value>.:</value>
12619 + </param>
12620 + <param>
12621 + <key>id</key>
12622 + <value>top_block</value>
12623 + </param>
12624 + <param>
12625 + <key>max_nouts</key>
12626 + <value>0</value>
12627 + </param>
12628 + <param>
12629 + <key>qt_qss_theme</key>
12630 + <value></value>
12631 + </param>
12632 + <param>
12633 + <key>realtime_scheduling</key>
12634 + <value></value>
12635 + </param>
12636 + <param>
12637 + <key>run_command</key>
12638 + <value>{python} -u {filename}</value>
12639 + </param>
12640 + <param>
12641 + <key>run_options</key>
12642 + <value>prompt</value>
12643 + </param>
12644 + <param>
12645 + <key>run</key>
12646 + <value>True</value>
12647 + </param>
12648 + <param>
12649 + <key>sizing_mode</key>
12650 + <value>fixed</value>
12651 + </param>
12652 + <param>
12653 + <key>thread_safe_setters</key>
12654 + <value></value>
12655 + </param>
12656 + <param>
12657 + <key>title</key>
12658 + <value>Signal analyzer</value>
12659 + </param>
12660 + <param>
12661 + <key>placement</key>
12662 + <value>(0,0)</value>
12663 + </param>
12664 + </block>
12665 + <block>
12666 + <key>variable_qtgui_entry</key>
12667 + <param>
12668 + <key>comment</key>
12669 + <value></value>
12670 + </param>
12671 + <param>
12672 + <key>value</key>
12673 + <value>10</value>
12674 + </param>
12675 + <param>
12676 + <key>_enabled</key>
12677 + <value>True</value>
12678 + </param>
12679 + <param>
12680 + <key>_coordinate</key>
12681 + <value>(336, 4)</value>
12682 + </param>
12683 + <param>
12684 + <key>gui_hint</key>
12685 + <value>2,0,1,1</value>
12686 + </param>
12687 + <param>
12688 + <key>_rotation</key>
12689 + <value>0</value>
12690 + </param>
12691 + <param>
12692 + <key>id</key>
12693 + <value>analog_filter_bandwidth_rx</value>
12694 + </param>
12695 + <param>
12696 + <key>label</key>
12697 + <value>RX analog filter bandwidth [MHz]</value>
12698 + </param>
12699 + <param>
12700 + <key>type</key>
12701 + <value>real</value>
12702 + </param>
12703 + </block>
12704 + <block>
12705 + <key>variable_qtgui_entry</key>
12706 + <param>
12707 + <key>comment</key>
12708 + <value></value>
12709 + </param>
12710 + <param>
12711 + <key>value</key>
12712 + <value>600</value>
12713 + </param>
12714 + <param>
12715 + <key>_enabled</key>
12716 + <value>True</value>
12717 + </param>
12718 + <param>
12719 + <key>_coordinate</key>
12720 + <value>(176, 4)</value>
12721 + </param>
12722 + <param>
12723 + <key>gui_hint</key>
12724 + <value>0,1,1,1</value>
12725 + </param>
12726 + <param>
12727 + <key>_rotation</key>
12728 + <value>0</value>
12729 + </param>
12730 + <param>
12731 + <key>id</key>
12732 + <value>baseband_rx</value>
12733 + </param>
12734 + <param>
12735 + <key>label</key>
12736 + <value>RX baseband [MHz]</value>
12737 + </param>
12738 + <param>
12739 + <key>type</key>
12740 + <value>real</value>
12741 + </param>
12742 + </block>
12743 + <block>
12744 + <key>variable_qtgui_entry</key>
12745 + <param>
12746 + <key>comment</key>
12747 + <value></value>
12748 + </param>
12749 + <param>
12750 + <key>value</key>
12751 + <value>sample_rate/2e6</value>
12752 + </param>
12753 + <param>
12754 + <key>_enabled</key>
12755 + <value>True</value>
12756 + </param>
12757 + <param>
12758 + <key>_coordinate</key>
12759 + <value>(336, 84)</value>
12760 + </param>
12761 + <param>
12762 + <key>gui_hint</key>
12763 + <value>2,1,1,1</value>
12764 + </param>
12765 + <param>
12766 + <key>_rotation</key>
12767 + <value>0</value>
12768 + </param>
12769 + <param>
12770 + <key>id</key>
12771 + <value>digital_filter_bandwidth_rx</value>
12772 + </param>
12773 + <param>
12774 + <key>label</key>
12775 + <value>RX digital filter bandwidth [MHz]</value>
12776 + </param>
12777 + <param>
12778 + <key>type</key>
12779 + <value>real</value>
12780 + </param>
12781 + </block>
12782 + <block>
12783 + <key>variable_qtgui_range</key>
12784 + <param>
12785 + <key>comment</key>
12786 + <value></value>
12787 + </param>
12788 + <param>
12789 + <key>value</key>
12790 + <value>0</value>
12791 + </param>
12792 + <param>
12793 + <key>_enabled</key>
12794 + <value>1</value>
12795 + </param>
12796 + <param>
12797 + <key>_coordinate</key>
12798 + <value>(8, 196)</value>
12799 + </param>
12800 + <param>
12801 + <key>gui_hint</key>
12802 + <value>1,0,1,1</value>
12803 + </param>
12804 + <param>
12805 + <key>_rotation</key>
12806 + <value>0</value>
12807 + </param>
12808 + <param>
12809 + <key>id</key>
12810 + <value>gain_rx</value>
12811 + </param>
12812 + <param>
12813 + <key>label</key>
12814 + <value>RX gain</value>
12815 + </param>
12816 + <param>
12817 + <key>min_len</key>
12818 + <value>200</value>
12819 + </param>
12820 + <param>
12821 + <key>orient</key>
12822 + <value>Qt.Horizontal</value>
12823 + </param>
12824 + <param>
12825 + <key>start</key>
12826 + <value>0</value>
12827 + </param>
12828 + <param>
12829 + <key>step</key>
12830 + <value>1</value>
12831 + </param>
12832 + <param>
12833 + <key>stop</key>
12834 + <value>70</value>
12835 + </param>
12836 + <param>
12837 + <key>rangeType</key>
12838 + <value>int</value>
12839 + </param>
12840 + <param>
12841 + <key>widget</key>
12842 + <value>counter_slider</value>
12843 + </param>
12844 + </block>
12845 + <block>
12846 + <key>variable_qtgui_entry</key>
12847 + <param>
12848 + <key>comment</key>
12849 + <value></value>
12850 + </param>
12851 + <param>
12852 + <key>value</key>
12853 + <value>0</value>
12854 + </param>
12855 + <param>
12856 + <key>_enabled</key>
12857 + <value>True</value>
12858 + </param>
12859 + <param>
12860 + <key>_coordinate</key>
12861 + <value>(176, 84)</value>
12862 + </param>
12863 + <param>
12864 + <key>gui_hint</key>
12865 + <value>1,1,1,1</value>
12866 + </param>
12867 + <param>
12868 + <key>_rotation</key>
12869 + <value>0</value>
12870 + </param>
12871 + <param>
12872 + <key>id</key>
12873 + <value>nco_freq_rx</value>
12874 + </param>
12875 + <param>
12876 + <key>label</key>
12877 + <value>RX NCO [MHz]</value>
12878 + </param>
12879 + <param>
12880 + <key>type</key>
12881 + <value>real</value>
12882 + </param>
12883 + </block>
12884 + <block>
12885 + <key>variable_qtgui_chooser</key>
12886 + <param>
12887 + <key>comment</key>
12888 + <value></value>
12889 + </param>
12890 + <param>
12891 + <key>value</key>
12892 + <value>0</value>
12893 + </param>
12894 + <param>
12895 + <key>_enabled</key>
12896 + <value>True</value>
12897 + </param>
12898 + <param>
12899 + <key>_coordinate</key>
12900 + <value>(648, 4)</value>
12901 + </param>
12902 + <param>
12903 + <key>gui_hint</key>
12904 + <value>3,1,1,1</value>
12905 + </param>
12906 + <param>
12907 + <key>_rotation</key>
12908 + <value>0</value>
12909 + </param>
12910 + <param>
12911 + <key>id</key>
12912 + <value>rfe_attenuation</value>
12913 + </param>
12914 + <param>
12915 + <key>label0</key>
12916 + <value></value>
12917 + </param>
12918 + <param>
12919 + <key>label1</key>
12920 + <value></value>
12921 + </param>
12922 + <param>
12923 + <key>label2</key>
12924 + <value></value>
12925 + </param>
12926 + <param>
12927 + <key>label3</key>
12928 + <value></value>
12929 + </param>
12930 + <param>
12931 + <key>label4</key>
12932 + <value></value>
12933 + </param>
12934 + <param>
12935 + <key>label</key>
12936 + <value>RFE Attenuation [dB]</value>
12937 + </param>
12938 + <param>
12939 + <key>labels</key>
12940 + <value>['0', '2', '4', '6', '8', '10', '12', '14']</value>
12941 + </param>
12942 + <param>
12943 + <key>num_opts</key>
12944 + <value>0</value>
12945 + </param>
12946 + <param>
12947 + <key>option0</key>
12948 + <value>0</value>
12949 + </param>
12950 + <param>
12951 + <key>option1</key>
12952 + <value>1</value>
12953 + </param>
12954 + <param>
12955 + <key>option2</key>
12956 + <value>2</value>
12957 + </param>
12958 + <param>
12959 + <key>option3</key>
12960 + <value>3</value>
12961 + </param>
12962 + <param>
12963 + <key>option4</key>
12964 + <value>4</value>
12965 + </param>
12966 + <param>
12967 + <key>options</key>
12968 + <value>[0, 1, 2, 3, 4, 5 ,6 , 7]</value>
12969 + </param>
12970 + <param>
12971 + <key>orient</key>
12972 + <value>Qt.QVBoxLayout</value>
12973 + </param>
12974 + <param>
12975 + <key>type</key>
12976 + <value>int</value>
12977 + </param>
12978 + <param>
12979 + <key>widget</key>
12980 + <value>combo_box</value>
12981 + </param>
12982 + </block>
12983 + <block>
12984 + <key>variable_qtgui_chooser</key>
12985 + <param>
12986 + <key>comment</key>
12987 + <value></value>
12988 + </param>
12989 + <param>
12990 + <key>value</key>
12991 + <value>0</value>
12992 + </param>
12993 + <param>
12994 + <key>_enabled</key>
12995 + <value>True</value>
12996 + </param>
12997 + <param>
12998 + <key>_coordinate</key>
12999 + <value>(512, 8)</value>
13000 + </param>
13001 + <param>
13002 + <key>gui_hint</key>
13003 + <value>3,0,1,1</value>
13004 + </param>
13005 + <param>
13006 + <key>_rotation</key>
13007 + <value>0</value>
13008 + </param>
13009 + <param>
13010 + <key>id</key>
13011 + <value>rfe_mode</value>
13012 + </param>
13013 + <param>
13014 + <key>label0</key>
13015 + <value>RX</value>
13016 + </param>
13017 + <param>
13018 + <key>label1</key>
13019 + <value>NONE</value>
13020 + </param>
13021 + <param>
13022 + <key>label2</key>
13023 + <value>TXRX</value>
13024 + </param>
13025 + <param>
13026 + <key>label3</key>
13027 + <value></value>
13028 + </param>
13029 + <param>
13030 + <key>label4</key>
13031 + <value></value>
13032 + </param>
13033 + <param>
13034 + <key>label</key>
13035 + <value>LimeRFE Mode</value>
13036 + </param>
13037 + <param>
13038 + <key>labels</key>
13039 + <value>[]</value>
13040 + </param>
13041 + <param>
13042 + <key>num_opts</key>
13043 + <value>3</value>
13044 + </param>
13045 + <param>
13046 + <key>option0</key>
13047 + <value>0</value>
13048 + </param>
13049 + <param>
13050 + <key>option1</key>
13051 + <value>2</value>
13052 + </param>
13053 + <param>
13054 + <key>option2</key>
13055 + <value>3</value>
13056 + </param>
13057 + <param>
13058 + <key>option3</key>
13059 + <value>3</value>
13060 + </param>
13061 + <param>
13062 + <key>option4</key>
13063 + <value>4</value>
13064 + </param>
13065 + <param>
13066 + <key>options</key>
13067 + <value>[0, 1, 2]</value>
13068 + </param>
13069 + <param>
13070 + <key>orient</key>
13071 + <value>Qt.QVBoxLayout</value>
13072 + </param>
13073 + <param>
13074 + <key>type</key>
13075 + <value>int</value>
13076 + </param>
13077 + <param>
13078 + <key>widget</key>
13079 + <value>combo_box</value>
13080 + </param>
13081 + </block>
13082 + <block>
13083 + <key>variable_qtgui_chooser</key>
13084 + <param>
13085 + <key>comment</key>
13086 + <value></value>
13087 + </param>
13088 + <param>
13089 + <key>value</key>
13090 + <value>1</value>
13091 + </param>
13092 + <param>
13093 + <key>_enabled</key>
13094 + <value>True</value>
13095 + </param>
13096 + <param>
13097 + <key>_coordinate</key>
13098 + <value>(808, 4)</value>
13099 + </param>
13100 + <param>
13101 + <key>gui_hint</key>
13102 + <value>4,0,1,1</value>
13103 + </param>
13104 + <param>
13105 + <key>_rotation</key>
13106 + <value>0</value>
13107 + </param>
13108 + <param>
13109 + <key>id</key>
13110 + <value>rfe_notch</value>
13111 + </param>
13112 + <param>
13113 + <key>label0</key>
13114 + <value>Enabled</value>
13115 + </param>
13116 + <param>
13117 + <key>label1</key>
13118 + <value>Disabled</value>
13119 + </param>
13120 + <param>
13121 + <key>label2</key>
13122 + <value></value>
13123 + </param>
13124 + <param>
13125 + <key>label3</key>
13126 + <value></value>
13127 + </param>
13128 + <param>
13129 + <key>label4</key>
13130 + <value></value>
13131 + </param>
13132 + <param>
13133 + <key>label</key>
13134 + <value>AM/FM Notch Filter</value>
13135 + </param>
13136 + <param>
13137 + <key>labels</key>
13138 + <value>[]</value>
13139 + </param>
13140 + <param>
13141 + <key>num_opts</key>
13142 + <value>2</value>
13143 + </param>
13144 + <param>
13145 + <key>option0</key>
13146 + <value>1</value>
13147 + </param>
13148 + <param>
13149 + <key>option1</key>
13150 + <value>0</value>
13151 + </param>
13152 + <param>
13153 + <key>option2</key>
13154 + <value>2</value>
13155 + </param>
13156 + <param>
13157 + <key>option3</key>
13158 + <value>3</value>
13159 + </param>
13160 + <param>
13161 + <key>option4</key>
13162 + <value>4</value>
13163 + </param>
13164 + <param>
13165 + <key>options</key>
13166 + <value>[0, 1, 2]</value>
13167 + </param>
13168 + <param>
13169 + <key>orient</key>
13170 + <value>Qt.QVBoxLayout</value>
13171 + </param>
13172 + <param>
13173 + <key>type</key>
13174 + <value>int</value>
13175 + </param>
13176 + <param>
13177 + <key>widget</key>
13178 + <value>combo_box</value>
13179 + </param>
13180 + </block>
13181 + <block>
13182 + <key>variable_qtgui_label</key>
13183 + <param>
13184 + <key>comment</key>
13185 + <value></value>
13186 + </param>
13187 + <param>
13188 + <key>value</key>
13189 + <value>5e6</value>
13190 + </param>
13191 + <param>
13192 + <key>_enabled</key>
13193 + <value>True</value>
13194 + </param>
13195 + <param>
13196 + <key>formatter</key>
13197 + <value>None</value>
13198 + </param>
13199 + <param>
13200 + <key>_coordinate</key>
13201 + <value>(8, 108)</value>
13202 + </param>
13203 + <param>
13204 + <key>gui_hint</key>
13205 + <value>0,0,1,1</value>
13206 + </param>
13207 + <param>
13208 + <key>_rotation</key>
13209 + <value>0</value>
13210 + </param>
13211 + <param>
13212 + <key>id</key>
13213 + <value>sample_rate</value>
13214 + </param>
13215 + <param>
13216 + <key>label</key>
13217 + <value>Sample rate [S/s]</value>
13218 + </param>
13219 + <param>
13220 + <key>type</key>
13221 + <value>raw</value>
13222 + </param>
13223 + </block>
13224 + <block>
13225 + <key>limesdr_rfe</key>
13226 + <param>
13227 + <key>notch</key>
13228 + <value>rfe_notch</value>
13229 + </param>
13230 + <param>
13231 + <key>alias</key>
13232 + <value></value>
13233 + </param>
13234 + <param>
13235 + <key>comment</key>
13236 + <value></value>
13237 + </param>
13238 + <param>
13239 + <key>comm_type</key>
13240 + <value>1</value>
13241 + </param>
13242 + <param>
13243 + <key>filename</key>
13244 + <value></value>
13245 + </param>
13246 + <param>
13247 + <key>fan</key>
13248 + <value>0</value>
13249 + </param>
13250 + <param>
13251 + <key>_enabled</key>
13252 + <value>True</value>
13253 + </param>
13254 + <param>
13255 + <key>_coordinate</key>
13256 + <value>(184, 388)</value>
13257 + </param>
13258 + <param>
13259 + <key>_rotation</key>
13260 + <value>0</value>
13261 + </param>
13262 + <param>
13263 + <key>id</key>
13264 + <value>limesdr_rfe_0</value>
13265 + </param>
13266 + <param>
13267 + <key>mode</key>
13268 + <value>rfe_mode</value>
13269 + </param>
13270 + <param>
13271 + <key>atten</key>
13272 + <value>rfe_attenuation</value>
13273 + </param>
13274 + <param>
13275 + <key>rx_channel</key>
13276 + <value>-2</value>
13277 + </param>
13278 + <param>
13279 + <key>rx_port</key>
13280 + <value>1</value>
13281 + </param>
13282 + <param>
13283 + <key>sdr_serial</key>
13284 + <value></value>
13285 + </param>
13286 + <param>
13287 + <key>tx_channel</key>
13288 + <value>-2</value>
13289 + </param>
13290 + <param>
13291 + <key>tx_port</key>
13292 + <value>2</value>
13293 + </param>
13294 + <param>
13295 + <key>com_port</key>
13296 + <value></value>
13297 + </param>
13298 + </block>
13299 + <block>
13300 + <key>limesdr_source</key>
13301 + <param>
13302 + <key>allow_tcxo_dac</key>
13303 + <value>0</value>
13304 + </param>
13305 + <param>
13306 + <key>analog_bandw_ch0</key>
13307 + <value>analog_filter_bandwidth_rx*1e6</value>
13308 + </param>
13309 + <param>
13310 + <key>analog_bandw_ch1</key>
13311 + <value>0</value>
13312 + </param>
13313 + <param>
13314 + <key>alias</key>
13315 + <value></value>
13316 + </param>
13317 + <param>
13318 + <key>calibr_bandw_ch0</key>
13319 + <value>sample_rate</value>
13320 + </param>
13321 + <param>
13322 + <key>calibr_bandw_ch1</key>
13323 + <value>0</value>
13324 + </param>
13325 + <param>
13326 + <key>channel_mode</key>
13327 + <value>0</value>
13328 + </param>
13329 + <param>
13330 + <key>comment</key>
13331 + <value></value>
13332 + </param>
13333 + <param>
13334 + <key>affinity</key>
13335 + <value></value>
13336 + </param>
13337 + <param>
13338 + <key>serial</key>
13339 + <value></value>
13340 + </param>
13341 + <param>
13342 + <key>digital_bandw_ch0</key>
13343 + <value>digital_filter_bandwidth_rx*1e6</value>
13344 + </param>
13345 + <param>
13346 + <key>digital_bandw_ch1</key>
13347 + <value>0</value>
13348 + </param>
13349 + <param>
13350 + <key>_enabled</key>
13351 + <value>1</value>
13352 + </param>
13353 + <param>
13354 + <key>filename</key>
13355 + <value></value>
13356 + </param>
13357 + <param>
13358 + <key>_coordinate</key>
13359 + <value>(184, 184)</value>
13360 + </param>
13361 + <param>
13362 + <key>_rotation</key>
13363 + <value>0</value>
13364 + </param>
13365 + <param>
13366 + <key>gain_dB_ch0</key>
13367 + <value>gain_rx</value>
13368 + </param>
13369 + <param>
13370 + <key>gain_dB_ch1</key>
13371 + <value>0</value>
13372 + </param>
13373 + <param>
13374 + <key>id</key>
13375 + <value>limesdr_source_0</value>
13376 + </param>
13377 + <param>
13378 + <key>lna_path_ch0</key>
13379 + <value>255</value>
13380 + </param>
13381 + <param>
13382 + <key>lna_path_ch1</key>
13383 + <value>2</value>
13384 + </param>
13385 + <param>
13386 + <key>maxoutbuf</key>
13387 + <value>0</value>
13388 + </param>
13389 + <param>
13390 + <key>minoutbuf</key>
13391 + <value>0</value>
13392 + </param>
13393 + <param>
13394 + <key>nco_freq_ch0</key>
13395 + <value>nco_freq_rx*1e6</value>
13396 + </param>
13397 + <param>
13398 + <key>nco_freq_ch1</key>
13399 + <value>0</value>
13400 + </param>
13401 + <param>
13402 + <key>oversample</key>
13403 + <value>0</value>
13404 + </param>
13405 + <param>
13406 + <key>rf_freq</key>
13407 + <value>baseband_rx*1e6</value>
13408 + </param>
13409 + <param>
13410 + <key>samp_rate</key>
13411 + <value>sample_rate</value>
13412 + </param>
13413 + <param>
13414 + <key>dacVal</key>
13415 + <value>125</value>
13416 + </param>
13417 + </block>
13418 + <block>
13419 + <key>qtgui_sink_x</key>
13420 + <param>
13421 + <key>bw</key>
13422 + <value>sample_rate</value>
13423 + </param>
13424 + <param>
13425 + <key>alias</key>
13426 + <value></value>
13427 + </param>
13428 + <param>
13429 + <key>fc</key>
13430 + <value>baseband_rx*1e6</value>
13431 + </param>
13432 + <param>
13433 + <key>freqchangevar</key>
13434 + <value>None</value>
13435 + </param>
13436 + <param>
13437 + <key>comment</key>
13438 + <value></value>
13439 + </param>
13440 + <param>
13441 + <key>affinity</key>
13442 + <value></value>
13443 + </param>
13444 + <param>
13445 + <key>_enabled</key>
13446 + <value>True</value>
13447 + </param>
13448 + <param>
13449 + <key>fftsize</key>
13450 + <value>4096</value>
13451 + </param>
13452 + <param>
13453 + <key>_coordinate</key>
13454 + <value>(440, 236)</value>
13455 + </param>
13456 + <param>
13457 + <key>gui_hint</key>
13458 + <value>5,0,1,2</value>
13459 + </param>
13460 + <param>
13461 + <key>_rotation</key>
13462 + <value>0</value>
13463 + </param>
13464 + <param>
13465 + <key>id</key>
13466 + <value>qtgui_sink_x_0</value>
13467 + </param>
13468 + <param>
13469 + <key>maxoutbuf</key>
13470 + <value>0</value>
13471 + </param>
13472 + <param>
13473 + <key>minoutbuf</key>
13474 + <value>0</value>
13475 + </param>
13476 + <param>
13477 + <key>name</key>
13478 + <value></value>
13479 + </param>
13480 + <param>
13481 + <key>plotconst</key>
13482 + <value>True</value>
13483 + </param>
13484 + <param>
13485 + <key>plotfreq</key>
13486 + <value>True</value>
13487 + </param>
13488 + <param>
13489 + <key>plottime</key>
13490 + <value>True</value>
13491 + </param>
13492 + <param>
13493 + <key>plotwaterfall</key>
13494 + <value>True</value>
13495 + </param>
13496 + <param>
13497 + <key>showports</key>
13498 + <value>True</value>
13499 + </param>
13500 + <param>
13501 + <key>showrf</key>
13502 + <value>True</value>
13503 + </param>
13504 + <param>
13505 + <key>type</key>
13506 + <value>complex</value>
13507 + </param>
13508 + <param>
13509 + <key>rate</key>
13510 + <value>10</value>
13511 + </param>
13512 + <param>
13513 + <key>wintype</key>
13514 + <value>firdes.WIN_BLACKMAN_hARRIS</value>
13515 + </param>
13516 + </block>
13517 + <connection>
13518 + <source_block_id>limesdr_source_0</source_block_id>
13519 + <sink_block_id>qtgui_sink_x_0</sink_block_id>
13520 + <source_key>0</source_key>
13521 + <sink_key>0</sink_key>
13522 + </connection>
13523 +</flow_graph>
13524 diff --git a/examples/signal_generator.grc b/examples/signal_generator.grc
13525 index 4e787f4..7b8fbb3 100644
13526 --- a/examples/signal_generator.grc
13527 +++ b/examples/signal_generator.grc
13528 @@ -1,307 +1,761 @@
13529 -options:
13530 - parameters:
13531 - author: Lime Microsystems
13532 - category: '[GRC Hier Blocks]'
13533 - cmake_opt: ''
13534 - comment: ''
13535 - copyright: ''
13536 - description: ''
13537 - gen_cmake: 'On'
13538 - gen_linking: dynamic
13539 - generate_options: qt_gui
13540 - hier_block_src_path: '.:'
13541 - id: signal_generator
13542 - max_nouts: '0'
13543 - output_language: python
13544 - placement: (0,0)
13545 - qt_qss_theme: ''
13546 - realtime_scheduling: ''
13547 - run: 'True'
13548 - run_command: '{python} -u {filename}'
13549 - run_options: prompt
13550 - sizing_mode: fixed
13551 - thread_safe_setters: ''
13552 - title: Signal generator
13553 - window_size: ''
13554 - states:
13555 - bus_sink: false
13556 - bus_source: false
13557 - bus_structure: null
13558 - coordinate: [8, 8]
13559 - rotation: 0
13560 - state: enabled
13561 -
13562 -blocks:
13563 -- name: analog_filter
13564 - id: variable_qtgui_entry
13565 - parameters:
13566 - comment: ''
13567 - gui_hint: 1,0,1,1
13568 - label: Analog filter bandwidth [MHz]
13569 - type: real
13570 - value: samp_rate/1e6
13571 - states:
13572 - bus_sink: false
13573 - bus_source: false
13574 - bus_structure: null
13575 - coordinate: [339, 8]
13576 - rotation: 0
13577 - state: true
13578 -- name: baseband
13579 - id: variable_qtgui_entry
13580 - parameters:
13581 - comment: ''
13582 - gui_hint: 0,0,1,1
13583 - label: TX Baseband [MHz]
13584 - type: real
13585 - value: '100'
13586 - states:
13587 - bus_sink: false
13588 - bus_source: false
13589 - bus_structure: null
13590 - coordinate: [178, 8]
13591 - rotation: 0
13592 - state: true
13593 -- name: digital_filter
13594 - id: variable_qtgui_entry
13595 - parameters:
13596 - comment: ''
13597 - gui_hint: 1,1,1,1
13598 - label: Digital filter bandwidth [MHz]
13599 - type: real
13600 - value: samp_rate/1e6 - 0.3
13601 - states:
13602 - bus_sink: false
13603 - bus_source: false
13604 - bus_structure: null
13605 - coordinate: [339, 88]
13606 - rotation: 0
13607 - state: true
13608 -- name: gain
13609 - id: variable_qtgui_range
13610 - parameters:
13611 - comment: ''
13612 - gui_hint: 5,0,1,2
13613 - label: Gain [dB]
13614 - min_len: '70'
13615 - orient: Qt.Horizontal
13616 - rangeType: int
13617 - start: '0'
13618 - step: '1'
13619 - stop: '60'
13620 - value: '40'
13621 - widget: counter_slider
13622 - states:
13623 - bus_sink: false
13624 - bus_source: false
13625 - bus_structure: null
13626 - coordinate: [510, 8]
13627 - rotation: 0
13628 - state: true
13629 -- name: nco
13630 - id: variable_qtgui_entry
13631 - parameters:
13632 - comment: ''
13633 - gui_hint: 0,1,1,1
13634 - label: NCO [MHz]
13635 - type: real
13636 - value: '0'
13637 - states:
13638 - bus_sink: false
13639 - bus_source: false
13640 - bus_structure: null
13641 - coordinate: [178, 87]
13642 - rotation: 0
13643 - state: true
13644 -- name: pa_path
13645 - id: variable_qtgui_chooser
13646 - parameters:
13647 - comment: ''
13648 - gui_hint: 4,0
13649 - label: PA Path
13650 - label0: Auto
13651 - label1: Band1
13652 - label2: Band2
13653 - label3: W
13654 - label4: ''
13655 - labels: '[]'
13656 - num_opts: '3'
13657 - option1: '1'
13658 - option2: '2'
13659 - option3: '3'
13660 - option4: '4'
13661 - options: '[0, 1, 2]'
13662 - orient: Qt.QVBoxLayout
13663 - type: int
13664 - value: '255'
13665 - widget: combo_box
13666 - states:
13667 - bus_sink: false
13668 - bus_source: false
13669 - bus_structure: null
13670 - coordinate: [8, 170]
13671 - rotation: 0
13672 - state: true
13673 -- name: samp_rate
13674 - id: variable
13675 - parameters:
13676 - comment: ''
13677 - value: 5e6
13678 - states:
13679 - bus_sink: false
13680 - bus_source: false
13681 - bus_structure: null
13682 - coordinate: [9, 103]
13683 - rotation: 0
13684 - state: enabled
13685 -- name: signal_freq
13686 - id: variable_qtgui_entry
13687 - parameters:
13688 - comment: ''
13689 - gui_hint: 2,0,1,1
13690 - label: Signal frequency [MHz]
13691 - type: real
13692 - value: '1'
13693 - states:
13694 - bus_sink: false
13695 - bus_source: false
13696 - bus_structure: null
13697 - coordinate: [633, 6]
13698 - rotation: 0
13699 - state: true
13700 -- name: signal_samp_rate
13701 - id: variable_qtgui_entry
13702 - parameters:
13703 - comment: ''
13704 - gui_hint: 2,1,1,1
13705 - label: Signal sampling rate [MHz]
13706 - type: real
13707 - value: samp_rate/1e6
13708 - states:
13709 - bus_sink: false
13710 - bus_source: false
13711 - bus_structure: null
13712 - coordinate: [633, 86]
13713 - rotation: 0
13714 - state: true
13715 -- name: waveform
13716 - id: variable_qtgui_chooser
13717 - parameters:
13718 - comment: ''
13719 - gui_hint: 4,1
13720 - label: Waveform
13721 - label0: Cosine
13722 - label1: Square
13723 - label2: Triangle
13724 - label3: Saw tooth
13725 - label4: Saw tooth
13726 - labels: '["0","1","2","3","4","5"]'
13727 - num_opts: '4'
13728 - option1: '103'
13729 - option2: '104'
13730 - option3: '105'
13731 - option4: '105'
13732 - options: '[100, 101, 102,103,104,105]'
13733 - orient: Qt.QVBoxLayout
13734 - type: int
13735 - value: '102'
13736 - widget: combo_box
13737 - states:
13738 - bus_sink: false
13739 - bus_source: false
13740 - bus_structure: null
13741 - coordinate: [815, 5]
13742 - rotation: 0
13743 - state: true
13744 -- name: analog_sig_source_x_0
13745 - id: analog_sig_source_x
13746 - parameters:
13747 - affinity: ''
13748 - alias: ''
13749 - amp: '1'
13750 - comment: ''
13751 - freq: signal_freq*1e6
13752 - maxoutbuf: '0'
13753 - minoutbuf: '0'
13754 - offset: '0'
13755 - phase: '0'
13756 - samp_rate: signal_samp_rate*1e6
13757 - type: complex
13758 - waveform: waveform
13759 - states:
13760 - bus_sink: false
13761 - bus_source: false
13762 - bus_structure: null
13763 - coordinate: [193, 219]
13764 - rotation: 0
13765 - state: true
13766 -- name: limesdr_sink_0
13767 - id: limesdr_sink
13768 - parameters:
13769 - affinity: ''
13770 - alias: ''
13771 - allow_tcxo_dac: '0'
13772 - analog_bandw_ch0: analog_filter*1e6
13773 - analog_bandw_ch1: 5e6
13774 - calibr_bandw_ch0: samp_rate
13775 - calibr_bandw_ch1: 2.5e6
13776 - channel_mode: '0'
13777 - comment: ''
13778 - dacVal: '180'
13779 - digital_bandw_ch0: digital_filter*1e6
13780 - digital_bandw_ch1: samp_rate
13781 - filename: ''
13782 - gain_dB_ch0: gain
13783 - gain_dB_ch1: '1'
13784 - length_tag_name: ''
13785 - nco_freq_ch0: nco
13786 - nco_freq_ch1: '0'
13787 - oversample: '0'
13788 - pa_path_ch0: pa_path
13789 - pa_path_ch1: '255'
13790 - rf_freq: baseband*1e6
13791 - samp_rate: samp_rate
13792 - serial: ''
13793 - states:
13794 - bus_sink: false
13795 - bus_source: false
13796 - bus_structure: null
13797 - coordinate: [533, 296]
13798 - rotation: 0
13799 - state: enabled
13800 -- name: qtgui_sink_x_0
13801 - id: qtgui_sink_x
13802 - parameters:
13803 - affinity: ''
13804 - alias: ''
13805 - bw: samp_rate
13806 - comment: ''
13807 - fc: baseband*1e6
13808 - fftsize: '4096'
13809 - gui_hint: 6,0,5,2
13810 - maxoutbuf: '0'
13811 - minoutbuf: '0'
13812 - name: '""'
13813 - plotconst: 'True'
13814 - plotfreq: 'True'
13815 - plottime: 'True'
13816 - plotwaterfall: 'True'
13817 - rate: '10'
13818 - showports: 'False'
13819 - showrf: 'True'
13820 - type: complex
13821 - wintype: firdes.WIN_BLACKMAN_hARRIS
13822 - states:
13823 - bus_sink: false
13824 - bus_source: false
13825 - bus_structure: null
13826 - coordinate: [533, 173]
13827 - rotation: 0
13828 - state: true
13829 -
13830 -connections:
13831 -- [analog_sig_source_x_0, '0', limesdr_sink_0, '0']
13832 -- [analog_sig_source_x_0, '0', qtgui_sink_x_0, '0']
13833 -
13834 -metadata:
13835 - file_format: 1
13836 +<?xml version='1.0' encoding='utf-8'?>
13837 +<?grc format='1' created='3.7.13'?>
13838 +<flow_graph>
13839 + <timestamp>Mon May 21 21:11:53 2018</timestamp>
13840 + <block>
13841 + <key>options</key>
13842 + <param>
13843 + <key>author</key>
13844 + <value>Lime Microsystems</value>
13845 + </param>
13846 + <param>
13847 + <key>window_size</key>
13848 + <value> (1200,400)</value>
13849 + </param>
13850 + <param>
13851 + <key>category</key>
13852 + <value>Custom</value>
13853 + </param>
13854 + <param>
13855 + <key>comment</key>
13856 + <value></value>
13857 + </param>
13858 + <param>
13859 + <key>description</key>
13860 + <value></value>
13861 + </param>
13862 + <param>
13863 + <key>_enabled</key>
13864 + <value>True</value>
13865 + </param>
13866 + <param>
13867 + <key>_coordinate</key>
13868 + <value>(16, 23)</value>
13869 + </param>
13870 + <param>
13871 + <key>_rotation</key>
13872 + <value>0</value>
13873 + </param>
13874 + <param>
13875 + <key>generate_options</key>
13876 + <value>qt_gui</value>
13877 + </param>
13878 + <param>
13879 + <key>hier_block_src_path</key>
13880 + <value>.:</value>
13881 + </param>
13882 + <param>
13883 + <key>id</key>
13884 + <value>top_block</value>
13885 + </param>
13886 + <param>
13887 + <key>max_nouts</key>
13888 + <value>0</value>
13889 + </param>
13890 + <param>
13891 + <key>qt_qss_theme</key>
13892 + <value></value>
13893 + </param>
13894 + <param>
13895 + <key>realtime_scheduling</key>
13896 + <value></value>
13897 + </param>
13898 + <param>
13899 + <key>run_command</key>
13900 + <value>{python} -u {filename}</value>
13901 + </param>
13902 + <param>
13903 + <key>run_options</key>
13904 + <value>prompt</value>
13905 + </param>
13906 + <param>
13907 + <key>run</key>
13908 + <value>True</value>
13909 + </param>
13910 + <param>
13911 + <key>sizing_mode</key>
13912 + <value>fixed</value>
13913 + </param>
13914 + <param>
13915 + <key>thread_safe_setters</key>
13916 + <value></value>
13917 + </param>
13918 + <param>
13919 + <key>title</key>
13920 + <value>Signal generator</value>
13921 + </param>
13922 + <param>
13923 + <key>placement</key>
13924 + <value>(0,0)</value>
13925 + </param>
13926 + </block>
13927 + <block>
13928 + <key>variable_qtgui_entry</key>
13929 + <param>
13930 + <key>comment</key>
13931 + <value></value>
13932 + </param>
13933 + <param>
13934 + <key>value</key>
13935 + <value>10</value>
13936 + </param>
13937 + <param>
13938 + <key>_enabled</key>
13939 + <value>True</value>
13940 + </param>
13941 + <param>
13942 + <key>_coordinate</key>
13943 + <value>(776, 166)</value>
13944 + </param>
13945 + <param>
13946 + <key>gui_hint</key>
13947 + <value>3,0,1,1</value>
13948 + </param>
13949 + <param>
13950 + <key>_rotation</key>
13951 + <value>0</value>
13952 + </param>
13953 + <param>
13954 + <key>id</key>
13955 + <value>analog_filter_bandwidth_tx</value>
13956 + </param>
13957 + <param>
13958 + <key>label</key>
13959 + <value>TX analog filter bandwidth [MHz]</value>
13960 + </param>
13961 + <param>
13962 + <key>type</key>
13963 + <value>real</value>
13964 + </param>
13965 + </block>
13966 + <block>
13967 + <key>variable_qtgui_entry</key>
13968 + <param>
13969 + <key>comment</key>
13970 + <value></value>
13971 + </param>
13972 + <param>
13973 + <key>value</key>
13974 + <value>600</value>
13975 + </param>
13976 + <param>
13977 + <key>_enabled</key>
13978 + <value>True</value>
13979 + </param>
13980 + <param>
13981 + <key>_coordinate</key>
13982 + <value>(784, 86)</value>
13983 + </param>
13984 + <param>
13985 + <key>gui_hint</key>
13986 + <value>0,1,1,1</value>
13987 + </param>
13988 + <param>
13989 + <key>_rotation</key>
13990 + <value>0</value>
13991 + </param>
13992 + <param>
13993 + <key>id</key>
13994 + <value>baseband_tx</value>
13995 + </param>
13996 + <param>
13997 + <key>label</key>
13998 + <value>TX:Baseband [MHz]</value>
13999 + </param>
14000 + <param>
14001 + <key>type</key>
14002 + <value>real</value>
14003 + </param>
14004 + </block>
14005 + <block>
14006 + <key>variable_qtgui_entry</key>
14007 + <param>
14008 + <key>comment</key>
14009 + <value></value>
14010 + </param>
14011 + <param>
14012 + <key>value</key>
14013 + <value>sample_rate/2e6</value>
14014 + </param>
14015 + <param>
14016 + <key>_enabled</key>
14017 + <value>True</value>
14018 + </param>
14019 + <param>
14020 + <key>_coordinate</key>
14021 + <value>(944, 166)</value>
14022 + </param>
14023 + <param>
14024 + <key>gui_hint</key>
14025 + <value>3,1,1,1</value>
14026 + </param>
14027 + <param>
14028 + <key>_rotation</key>
14029 + <value>0</value>
14030 + </param>
14031 + <param>
14032 + <key>id</key>
14033 + <value>digital_filter_bandwidth_tx</value>
14034 + </param>
14035 + <param>
14036 + <key>label</key>
14037 + <value>TX digital filter bandwidth [MHz]</value>
14038 + </param>
14039 + <param>
14040 + <key>type</key>
14041 + <value>real</value>
14042 + </param>
14043 + </block>
14044 + <block>
14045 + <key>variable_qtgui_range</key>
14046 + <param>
14047 + <key>comment</key>
14048 + <value></value>
14049 + </param>
14050 + <param>
14051 + <key>value</key>
14052 + <value>0</value>
14053 + </param>
14054 + <param>
14055 + <key>_enabled</key>
14056 + <value>True</value>
14057 + </param>
14058 + <param>
14059 + <key>_coordinate</key>
14060 + <value>(16, 113)</value>
14061 + </param>
14062 + <param>
14063 + <key>gui_hint</key>
14064 + <value>1,1,1,1</value>
14065 + </param>
14066 + <param>
14067 + <key>_rotation</key>
14068 + <value>0</value>
14069 + </param>
14070 + <param>
14071 + <key>id</key>
14072 + <value>frequency</value>
14073 + </param>
14074 + <param>
14075 + <key>label</key>
14076 + <value>Signal source frequency</value>
14077 + </param>
14078 + <param>
14079 + <key>min_len</key>
14080 + <value>1</value>
14081 + </param>
14082 + <param>
14083 + <key>orient</key>
14084 + <value>Qt.Horizontal</value>
14085 + </param>
14086 + <param>
14087 + <key>start</key>
14088 + <value>0</value>
14089 + </param>
14090 + <param>
14091 + <key>step</key>
14092 + <value>0.05e6</value>
14093 + </param>
14094 + <param>
14095 + <key>stop</key>
14096 + <value>20e6</value>
14097 + </param>
14098 + <param>
14099 + <key>rangeType</key>
14100 + <value>float</value>
14101 + </param>
14102 + <param>
14103 + <key>widget</key>
14104 + <value>counter_slider</value>
14105 + </param>
14106 + </block>
14107 + <block>
14108 + <key>variable_qtgui_range</key>
14109 + <param>
14110 + <key>comment</key>
14111 + <value></value>
14112 + </param>
14113 + <param>
14114 + <key>value</key>
14115 + <value>30</value>
14116 + </param>
14117 + <param>
14118 + <key>_enabled</key>
14119 + <value>True</value>
14120 + </param>
14121 + <param>
14122 + <key>_coordinate</key>
14123 + <value>(976, 41)</value>
14124 + </param>
14125 + <param>
14126 + <key>gui_hint</key>
14127 + <value>2,1,1,1</value>
14128 + </param>
14129 + <param>
14130 + <key>_rotation</key>
14131 + <value>0</value>
14132 + </param>
14133 + <param>
14134 + <key>id</key>
14135 + <value>gain_tx</value>
14136 + </param>
14137 + <param>
14138 + <key>label</key>
14139 + <value>TX gain</value>
14140 + </param>
14141 + <param>
14142 + <key>min_len</key>
14143 + <value>200</value>
14144 + </param>
14145 + <param>
14146 + <key>orient</key>
14147 + <value>Qt.Horizontal</value>
14148 + </param>
14149 + <param>
14150 + <key>start</key>
14151 + <value>0</value>
14152 + </param>
14153 + <param>
14154 + <key>step</key>
14155 + <value>1</value>
14156 + </param>
14157 + <param>
14158 + <key>stop</key>
14159 + <value>60</value>
14160 + </param>
14161 + <param>
14162 + <key>rangeType</key>
14163 + <value>int</value>
14164 + </param>
14165 + <param>
14166 + <key>widget</key>
14167 + <value>counter_slider</value>
14168 + </param>
14169 + </block>
14170 + <block>
14171 + <key>variable_qtgui_entry</key>
14172 + <param>
14173 + <key>comment</key>
14174 + <value></value>
14175 + </param>
14176 + <param>
14177 + <key>value</key>
14178 + <value>0</value>
14179 + </param>
14180 + <param>
14181 + <key>_enabled</key>
14182 + <value>True</value>
14183 + </param>
14184 + <param>
14185 + <key>_coordinate</key>
14186 + <value>(616, 166)</value>
14187 + </param>
14188 + <param>
14189 + <key>gui_hint</key>
14190 + <value>2,0,1,1</value>
14191 + </param>
14192 + <param>
14193 + <key>_rotation</key>
14194 + <value>0</value>
14195 + </param>
14196 + <param>
14197 + <key>id</key>
14198 + <value>nco_freq_tx</value>
14199 + </param>
14200 + <param>
14201 + <key>label</key>
14202 + <value>TX NCO value [MHz]</value>
14203 + </param>
14204 + <param>
14205 + <key>type</key>
14206 + <value>real</value>
14207 + </param>
14208 + </block>
14209 + <block>
14210 + <key>variable_qtgui_range</key>
14211 + <param>
14212 + <key>comment</key>
14213 + <value></value>
14214 + </param>
14215 + <param>
14216 + <key>value</key>
14217 + <value>sample_rate</value>
14218 + </param>
14219 + <param>
14220 + <key>_enabled</key>
14221 + <value>True</value>
14222 + </param>
14223 + <param>
14224 + <key>_coordinate</key>
14225 + <value>(16, 233)</value>
14226 + </param>
14227 + <param>
14228 + <key>gui_hint</key>
14229 + <value>1,0,1,1</value>
14230 + </param>
14231 + <param>
14232 + <key>_rotation</key>
14233 + <value>0</value>
14234 + </param>
14235 + <param>
14236 + <key>id</key>
14237 + <value>samp_rate_sig_source</value>
14238 + </param>
14239 + <param>
14240 + <key>label</key>
14241 + <value>Signal source sample rate</value>
14242 + </param>
14243 + <param>
14244 + <key>min_len</key>
14245 + <value>1</value>
14246 + </param>
14247 + <param>
14248 + <key>orient</key>
14249 + <value>Qt.Horizontal</value>
14250 + </param>
14251 + <param>
14252 + <key>start</key>
14253 + <value>0</value>
14254 + </param>
14255 + <param>
14256 + <key>step</key>
14257 + <value>0.1e6</value>
14258 + </param>
14259 + <param>
14260 + <key>stop</key>
14261 + <value>20e6</value>
14262 + </param>
14263 + <param>
14264 + <key>rangeType</key>
14265 + <value>float</value>
14266 + </param>
14267 + <param>
14268 + <key>widget</key>
14269 + <value>counter_slider</value>
14270 + </param>
14271 + </block>
14272 + <block>
14273 + <key>variable_qtgui_label</key>
14274 + <param>
14275 + <key>comment</key>
14276 + <value></value>
14277 + </param>
14278 + <param>
14279 + <key>value</key>
14280 + <value>5e6</value>
14281 + </param>
14282 + <param>
14283 + <key>_enabled</key>
14284 + <value>True</value>
14285 + </param>
14286 + <param>
14287 + <key>formatter</key>
14288 + <value>None</value>
14289 + </param>
14290 + <param>
14291 + <key>_coordinate</key>
14292 + <value>(192, 30)</value>
14293 + </param>
14294 + <param>
14295 + <key>gui_hint</key>
14296 + <value>0,0,1,1</value>
14297 + </param>
14298 + <param>
14299 + <key>_rotation</key>
14300 + <value>0</value>
14301 + </param>
14302 + <param>
14303 + <key>id</key>
14304 + <value>sample_rate</value>
14305 + </param>
14306 + <param>
14307 + <key>label</key>
14308 + <value>Sample rate [S/s]</value>
14309 + </param>
14310 + <param>
14311 + <key>type</key>
14312 + <value>real</value>
14313 + </param>
14314 + </block>
14315 + <block>
14316 + <key>analog_sig_source_x</key>
14317 + <param>
14318 + <key>amp</key>
14319 + <value>1</value>
14320 + </param>
14321 + <param>
14322 + <key>alias</key>
14323 + <value></value>
14324 + </param>
14325 + <param>
14326 + <key>comment</key>
14327 + <value></value>
14328 + </param>
14329 + <param>
14330 + <key>affinity</key>
14331 + <value></value>
14332 + </param>
14333 + <param>
14334 + <key>_enabled</key>
14335 + <value>1</value>
14336 + </param>
14337 + <param>
14338 + <key>freq</key>
14339 + <value>frequency</value>
14340 + </param>
14341 + <param>
14342 + <key>_coordinate</key>
14343 + <value>(216, 216)</value>
14344 + </param>
14345 + <param>
14346 + <key>_rotation</key>
14347 + <value>0</value>
14348 + </param>
14349 + <param>
14350 + <key>id</key>
14351 + <value>analog_sig_source_x_0_0_0</value>
14352 + </param>
14353 + <param>
14354 + <key>maxoutbuf</key>
14355 + <value>0</value>
14356 + </param>
14357 + <param>
14358 + <key>minoutbuf</key>
14359 + <value>0</value>
14360 + </param>
14361 + <param>
14362 + <key>offset</key>
14363 + <value>0</value>
14364 + </param>
14365 + <param>
14366 + <key>type</key>
14367 + <value>complex</value>
14368 + </param>
14369 + <param>
14370 + <key>samp_rate</key>
14371 + <value>samp_rate_sig_source</value>
14372 + </param>
14373 + <param>
14374 + <key>waveform</key>
14375 + <value>analog.GR_COS_WAVE</value>
14376 + </param>
14377 + </block>
14378 + <block>
14379 + <key>limesdr_sink</key>
14380 + <param>
14381 + <key>alias</key>
14382 + <value></value>
14383 + </param>
14384 + <param>
14385 + <key>analog_bandw_ch0</key>
14386 + <value>analog_filter_bandwidth_tx*1e6</value>
14387 + </param>
14388 + <param>
14389 + <key>calibr_bandw_ch0</key>
14390 + <value>0</value>
14391 + </param>
14392 + <param>
14393 + <key>digital_bandw_ch0</key>
14394 + <value>digital_filter_bandwidth_tx*1e6</value>
14395 + </param>
14396 + <param>
14397 + <key>gain_dB_ch0</key>
14398 + <value>gain_tx</value>
14399 + </param>
14400 + <param>
14401 + <key>nco_freq_ch0</key>
14402 + <value>nco_freq_tx*1e6</value>
14403 + </param>
14404 + <param>
14405 + <key>pa_path_ch0</key>
14406 + <value>255</value>
14407 + </param>
14408 + <param>
14409 + <key>analog_bandw_ch1</key>
14410 + <value>0</value>
14411 + </param>
14412 + <param>
14413 + <key>calibr_bandw_ch1</key>
14414 + <value>0</value>
14415 + </param>
14416 + <param>
14417 + <key>digital_bandw_ch1</key>
14418 + <value>0</value>
14419 + </param>
14420 + <param>
14421 + <key>gain_dB_ch1</key>
14422 + <value>0</value>
14423 + </param>
14424 + <param>
14425 + <key>nco_freq_ch1</key>
14426 + <value>0</value>
14427 + </param>
14428 + <param>
14429 + <key>pa_path_ch1</key>
14430 + <value>1</value>
14431 + </param>
14432 + <param>
14433 + <key>channel_mode</key>
14434 + <value>0</value>
14435 + </param>
14436 + <param>
14437 + <key>comment</key>
14438 + <value></value>
14439 + </param>
14440 + <param>
14441 + <key>affinity</key>
14442 + <value></value>
14443 + </param>
14444 + <param>
14445 + <key>serial</key>
14446 + <value></value>
14447 + </param>
14448 + <param>
14449 + <key>_enabled</key>
14450 + <value>1</value>
14451 + </param>
14452 + <param>
14453 + <key>filename</key>
14454 + <value></value>
14455 + </param>
14456 + <param>
14457 + <key>_coordinate</key>
14458 + <value>(416, 144)</value>
14459 + </param>
14460 + <param>
14461 + <key>_rotation</key>
14462 + <value>0</value>
14463 + </param>
14464 + <param>
14465 + <key>id</key>
14466 + <value>limesdr_sink_0</value>
14467 + </param>
14468 + <param>
14469 + <key>length_tag_name</key>
14470 + <value></value>
14471 + </param>
14472 + <param>
14473 + <key>oversample</key>
14474 + <value>0</value>
14475 + </param>
14476 + <param>
14477 + <key>rf_freq</key>
14478 + <value>baseband_tx*1e6</value>
14479 + </param>
14480 + <param>
14481 + <key>samp_rate</key>
14482 + <value>sample_rate</value>
14483 + </param>
14484 + </block>
14485 + <block>
14486 + <key>qtgui_sink_x</key>
14487 + <param>
14488 + <key>bw</key>
14489 + <value>sample_rate</value>
14490 + </param>
14491 + <param>
14492 + <key>alias</key>
14493 + <value></value>
14494 + </param>
14495 + <param>
14496 + <key>fc</key>
14497 + <value>baseband_tx*1e6</value>
14498 + </param>
14499 + <param>
14500 + <key>freqchangevar</key>
14501 + <value>None</value>
14502 + </param>
14503 + <param>
14504 + <key>comment</key>
14505 + <value></value>
14506 + </param>
14507 + <param>
14508 + <key>affinity</key>
14509 + <value></value>
14510 + </param>
14511 + <param>
14512 + <key>_enabled</key>
14513 + <value>1</value>
14514 + </param>
14515 + <param>
14516 + <key>fftsize</key>
14517 + <value>4096</value>
14518 + </param>
14519 + <param>
14520 + <key>_coordinate</key>
14521 + <value>(416, 32)</value>
14522 + </param>
14523 + <param>
14524 + <key>gui_hint</key>
14525 + <value>4,0,1,2</value>
14526 + </param>
14527 + <param>
14528 + <key>_rotation</key>
14529 + <value>0</value>
14530 + </param>
14531 + <param>
14532 + <key>id</key>
14533 + <value>qtgui_sink_x_0_1</value>
14534 + </param>
14535 + <param>
14536 + <key>maxoutbuf</key>
14537 + <value>0</value>
14538 + </param>
14539 + <param>
14540 + <key>minoutbuf</key>
14541 + <value>0</value>
14542 + </param>
14543 + <param>
14544 + <key>name</key>
14545 + <value>"Signal Source"</value>
14546 + </param>
14547 + <param>
14548 + <key>plotconst</key>
14549 + <value>True</value>
14550 + </param>
14551 + <param>
14552 + <key>plotfreq</key>
14553 + <value>True</value>
14554 + </param>
14555 + <param>
14556 + <key>plottime</key>
14557 + <value>True</value>
14558 + </param>
14559 + <param>
14560 + <key>plotwaterfall</key>
14561 + <value>True</value>
14562 + </param>
14563 + <param>
14564 + <key>showports</key>
14565 + <value>True</value>
14566 + </param>
14567 + <param>
14568 + <key>showrf</key>
14569 + <value>True</value>
14570 + </param>
14571 + <param>
14572 + <key>type</key>
14573 + <value>complex</value>
14574 + </param>
14575 + <param>
14576 + <key>rate</key>
14577 + <value>10</value>
14578 + </param>
14579 + <param>
14580 + <key>wintype</key>
14581 + <value>firdes.WIN_BLACKMAN_hARRIS</value>
14582 + </param>
14583 + </block>
14584 + <connection>
14585 + <source_block_id>analog_sig_source_x_0_0_0</source_block_id>
14586 + <sink_block_id>limesdr_sink_0</sink_block_id>
14587 + <source_key>0</source_key>
14588 + <sink_key>0</sink_key>
14589 + </connection>
14590 + <connection>
14591 + <source_block_id>analog_sig_source_x_0_0_0</source_block_id>
14592 + <sink_block_id>qtgui_sink_x_0_1</sink_block_id>
14593 + <source_key>0</source_key>
14594 + <sink_key>0</sink_key>
14595 + </connection>
14596 +</flow_graph>
14597 diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt
14598 index b0aaa71..e0f8082 100644
14599 --- a/grc/CMakeLists.txt
14600 +++ b/grc/CMakeLists.txt
14601 @@ -1,7 +1,6 @@
14602 # Copyright 2011 Free Software Foundation, Inc.
14603 #
14604 -# This file was generated by gr_modtool, a tool from the GNU Radio framework
14605 -# This file is a part of gr-limesdr
14606 +# This file is part of GNU Radio
14607 #
14608 # GNU Radio is free software; you can redistribute it and/or modify
14609 # it under the terms of the GNU General Public License as published by
14610 @@ -20,5 +19,9 @@
14611
14612 install(FILES
14613 limesdr_source.block.yml
14614 - limesdr_sink.block.yml DESTINATION share/gnuradio/grc/blocks
14615 + limesdr_sink.block.yml
14616 + DESTINATION share/gnuradio/grc/blocks
14617 )
14618 +if(ENABLE_RFE)
14619 + install(FILES limesdr_rfe.block.yml DESTINATION share/gnuradio/grc/blocks)
14620 +endif()
14621 \ No newline at end of file
14622 diff --git a/grc/limesdr_rfe.block.yml b/grc/limesdr_rfe.block.yml
14623 new file mode 100644
14624 index 0000000..59c7d13
14625 --- /dev/null
14626 +++ b/grc/limesdr_rfe.block.yml
14627 @@ -0,0 +1,172 @@
14628 +# auto-generated by grc.converter
14629 +
14630 +id: limesdr_rfe
14631 +label: LimeRFE Control
14632 +category: '[LimeSuite]'
14633 +
14634 +parameters:
14635 +- id: comm_type
14636 + label: Communication
14637 + dtype: int
14638 + default: '0'
14639 + options: ['0', '1']
14640 + option_labels: [Direct USB, SDR]
14641 +- id: com_port
14642 + label: USB COM Port
14643 + dtype: string
14644 + hide: ${ 'part' if comm_type == 0 else 'all' }
14645 +- id: sdr_serial
14646 + label: SDR Device Serial
14647 + dtype: string
14648 + hide: ${ 'part' if comm_type == 1 else 'all' }
14649 +- id: filename
14650 + label: Configuration File
14651 + category: Advanced
14652 + dtype: file_open
14653 + hide: part
14654 +- id: fan
14655 + label: Enable Fan
14656 + dtype: int
14657 + default: '0'
14658 + options: ['0', '1']
14659 + option_labels: ['False', 'True']
14660 + hide: part
14661 +- id: mode
14662 + label: Mode
14663 + dtype: int
14664 + default: '0'
14665 + options: ['0', '1', '3', '2']
14666 + option_labels: [RX, TX, RX+TX, NONE]
14667 +- id: rx_channel
14668 + label: RX Channel
14669 + dtype: int
14670 + default: '1'
14671 + options: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13',
14672 + '14', '15', '16', '-2']
14673 + option_labels: [Wideband 1-1000, Wideband 1000-4000, HAM 30, HAM 50-70, HAM 144-146,
14674 + HAM 220-225, HAM 430-440, HAM 902-928, HAM 1240-1325, HAM 2300-2450, HAM 3300-3500,
14675 + Cellular Band 1, Cellular Band 2/PCS-1900, Cellular Band 3/PCS-1800, Cellular
14676 + Band 7, Cellular Band 38, Auto]
14677 +- id: rx_port
14678 + label: RX Port
14679 + dtype: int
14680 + default: '1'
14681 + options: ['1', '3']
14682 + option_labels: [TX/RX(J3), 30 MHz TX/RX(J5)]
14683 +- id: atten
14684 + label: RX Attenuation(dB)
14685 + dtype: int
14686 + default: '0'
14687 + options: ['0', '1', '2', '3', '4', '5', '6', '7']
14688 + option_labels: ['0', '2', '4', '6', '8', '10', '12', '14']
14689 + hide: part
14690 +- id: notch
14691 + label: AM FM Notch Filter
14692 + dtype: int
14693 + default: '0'
14694 + options: ['0', '1']
14695 + option_labels: [Disabled, Enabled]
14696 + hide: part
14697 +- id: tx_channel
14698 + label: TX Channel
14699 + dtype: int
14700 + default: '1'
14701 + options: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '-2']
14702 + option_labels: [Wideband 1-1000, Wideband 1000-4000, HAM 30, HAM 50-70, HAM 144-146,
14703 + HAM 220-225, HAM 430-440, HAM 902-928, HAM 1240-1325, HAM 2300-2450, HAM 3300-3500,
14704 + Auto]
14705 + hide: ${ 'all' if rx_channel > 11 else 'none' }
14706 +- id: tx_port
14707 + label: TX Port
14708 + dtype: int
14709 + default: '1'
14710 + options: ['1', '2', '3']
14711 + option_labels: [TX/RX(J3), TX (J4), 30 MHz TX/RX(J5)]
14712 +
14713 +templates:
14714 + imports: import limesdr
14715 + make: |-
14716 + limesdr.rfe(${comm_type},
14717 + % if comm_type == 0:
14718 + ${com_port},
14719 + % else:
14720 + ${sdr_serial},
14721 + % endif
14722 + ${filename}, ${rx_channel}, ${tx_channel}, ${rx_port}, ${tx_port}, ${mode}, ${notch}, ${atten})
14723 + callbacks:
14724 + - change_mode(${mode})
14725 + - set_attenuation(${atten})
14726 + - set_notch(${notch})
14727 + - set_fan(${fan})
14728 +
14729 +documentation: |-
14730 + -------------------------------------------------------------------------------------------------------------------
14731 + COMMUNICATION
14732 +
14733 + Type of communication used to configure LimeRFE board.
14734 + Direct USB: LimeRFE is configured directly through USB COM port
14735 + SDR: LimeRFE is configured through LimeSDR device GPIO ports
14736 +
14737 + -------------------------------------------------------------------------------------------------------------------
14738 + USB COM PORT
14739 +
14740 + Specified USB COM Port device is connected to e.g. /dev/ttyUSB0 on linux or COM0 on windows
14741 + -------------------------------------------------------------------------------------------------------------------
14742 + SDR DEVICE SERIAL
14743 +
14744 + SDR Device serial number obtained by running
14745 +
14746 + LimeUtil --find
14747 +
14748 + If left blank, the first device in the list will be used to configure LimeRFE board
14749 + -------------------------------------------------------------------------------------------------------------------
14750 + ENABLE FAN
14751 +
14752 + Enable or disable fan connected to LimeRFE device
14753 + -------------------------------------------------------------------------------------------------------------------
14754 + MODE
14755 +
14756 + Select LimeRFE mode to be used, valid values are: RX(0), TX(1), RX+TX(2), NONE(3)
14757 +
14758 + -------------------------------------------------------------------------------------------------------------------
14759 + RX CHANNEL
14760 +
14761 + Select RX channel to be configured, if Cellular Bands are selected, the same channel is set for TX
14762 +
14763 + -------------------------------------------------------------------------------------------------------------------
14764 + RX PORT
14765 +
14766 + Select hardware port to be used for receive
14767 +
14768 + -------------------------------------------------------------------------------------------------------------------
14769 + RX ATTENUATION
14770 +
14771 + Specifies the attenuation in the RX path. Attenuation [dB] = 2 * attenuation.
14772 + Valid value range is [0,7]
14773 +
14774 + -------------------------------------------------------------------------------------------------------------------
14775 + AM FM NOTCH FILTER
14776 +
14777 + Enables or disables AM FM notch filter
14778 +
14779 + Note: Only works for specific channels(see block diagram of LimeRFE)
14780 +
14781 + -------------------------------------------------------------------------------------------------------------------
14782 + TX CHANNEL
14783 +
14784 + Select TX channel to be configured
14785 +
14786 + -------------------------------------------------------------------------------------------------------------------
14787 + TX PORT
14788 +
14789 + Select hardware port to be used for transmit
14790 + -------------------------------------------------------------------------------------------------------------------
14791 + CONFIGURATION FILE
14792 +
14793 + This setting is available in "Advanced" tab of grc block.
14794 + If set LimeRFE device will be configured using already generated .ini file
14795 +
14796 + Note: .ini file must be generated using LimeSuite->Modules->LimeRFE->save, general LimeSuite .ini file will not work
14797 + -------------------------------------------------------------------------------------------------------------------
14798 +
14799 +file_format: 1
14800 diff --git a/grc/limesdr_rfe.xml b/grc/limesdr_rfe.xml
14801 new file mode 100644
14802 index 0000000..2ae2f3a
14803 --- /dev/null
14804 +++ b/grc/limesdr_rfe.xml
14805 @@ -0,0 +1,410 @@
14806 +<?xml version="1.0"?>
14807 +<block>
14808 + <name>LimeRFE Control</name>
14809 + <key>limesdr_rfe</key>
14810 + <category>[LimeSuite]</category>
14811 + <import>import limesdr</import>
14812 + <make>limesdr.rfe($comm_type,
14813 + #if $comm_type() == 0
14814 + $com_port,
14815 + #else
14816 + $sdr_serial,
14817 + #end if
14818 + $filename,
14819 + $rx_channel,
14820 + $tx_channel,
14821 + $rx_port, $tx_port, $mode, $notch, $atten)
14822 + </make>
14823 +
14824 + <callback>change_mode($mode)</callback>
14825 + <callback>set_attenuation($atten)</callback>
14826 + <callback>set_notch($notch)</callback>
14827 + <callback>set_fan($fan)</callback>
14828 +
14829 + <param>
14830 + <name>Communication</name>
14831 + <key>comm_type</key>
14832 + <value>0</value>
14833 + <type>int</type>
14834 + <option>
14835 + <name>Direct USB</name>
14836 + <key>0</key>
14837 + </option>
14838 + <option>
14839 + <name>SDR</name>
14840 + <key>1</key>
14841 + </option>
14842 + </param>
14843 +
14844 + <param>
14845 + <name>USB COM Port</name>
14846 + <key>com_port</key>
14847 + <value></value>
14848 + <type>string</type>
14849 + <hide>
14850 + #if $comm_type() == 0
14851 + part
14852 + #else
14853 + all
14854 + #end if
14855 + </hide>
14856 + </param>
14857 +
14858 + <param>
14859 + <name>SDR Device Serial</name>
14860 + <key>sdr_serial</key>
14861 + <value></value>
14862 + <type>string</type>
14863 + <hide>
14864 + #if $comm_type() == 1
14865 + part
14866 + #else
14867 + all
14868 + #end if
14869 + </hide>
14870 + </param>
14871 +
14872 + <param>
14873 + <name>Configuration File</name>
14874 + <key>filename</key>
14875 + <value></value>
14876 + <type>file_open</type>
14877 + <hide>part</hide>
14878 + <tab>Advanced</tab>
14879 + </param>
14880 +
14881 + <param>
14882 + <name>Enable Fan</name>
14883 + <key>fan</key>
14884 + <value>0</value>
14885 + <type>int</type>
14886 + <hide>part</hide>
14887 + <option>
14888 + <name>False</name>
14889 + <key>0</key>
14890 + </option>
14891 + <option>
14892 + <name>True</name>
14893 + <key>1</key>
14894 + </option>
14895 + </param>
14896 +
14897 + <param>
14898 + <name>Mode</name>
14899 + <key>mode</key>
14900 + <value>0</value>
14901 + <type>int</type>
14902 + <option>
14903 + <name>RX</name>
14904 + <key>0</key>
14905 + </option>
14906 + <option>
14907 + <name>TX</name>
14908 + <key>1</key>
14909 + </option>
14910 + <option>
14911 + <name>RX+TX</name>
14912 + <key>3</key>
14913 + </option>
14914 + <option>
14915 + <name>NONE</name>
14916 + <key>2</key>
14917 + </option>
14918 + </param>
14919 +
14920 + <param>
14921 + <name>RX Channel</name>
14922 + <key>rx_channel</key>
14923 + <value>1</value>
14924 + <type>int</type>
14925 + <option>
14926 + <name>Wideband 1-1000</name>
14927 + <key>1</key>
14928 + </option>
14929 + <option>
14930 + <name>Wideband 1000-4000</name>
14931 + <key>2</key>
14932 + </option>
14933 + <option>
14934 + <name>HAM 30</name>
14935 + <key>3</key>
14936 + </option>
14937 + <option>
14938 + <name>HAM 50-70</name>
14939 + <key>4</key>
14940 + </option>
14941 + <option>
14942 + <name>HAM 144-146</name>
14943 + <key>5</key>
14944 + </option>
14945 + <option>
14946 + <name>HAM 220-225</name>
14947 + <key>6</key>
14948 + </option>
14949 + <option>
14950 + <name>HAM 430-440</name>
14951 + <key>7</key>
14952 + </option>
14953 + <option>
14954 + <name>HAM 902-928</name>
14955 + <key>8</key>
14956 + </option>
14957 + <option>
14958 + <name>HAM 1240-1325</name>
14959 + <key>9</key>
14960 + </option>
14961 + <option>
14962 + <name>HAM 2300-2450</name>
14963 + <key>10</key>
14964 + </option>
14965 + <option>
14966 + <name>HAM 3300-3500</name>
14967 + <key>11</key>
14968 + </option>
14969 + <option>
14970 + <name>Cellular Band 1</name>
14971 + <key>12</key>
14972 + </option>
14973 + <option>
14974 + <name>Cellular Band 2/PCS-1900</name>
14975 + <key>13</key>
14976 + </option>
14977 + <option>
14978 + <name>Cellular Band 3/PCS-1800</name>
14979 + <key>14</key>
14980 + </option>
14981 + <option>
14982 + <name>Cellular Band 7</name>
14983 + <key>15</key>
14984 + </option>
14985 + <option>
14986 + <name>Cellular Band 38</name>
14987 + <key>16</key>
14988 + </option>
14989 + <option>
14990 + <name>Auto</name>
14991 + <key>-2</key>
14992 + </option>
14993 + </param>
14994 +
14995 + <param>
14996 + <name>RX Port</name>
14997 + <key>rx_port</key>
14998 + <value>1</value>
14999 + <type>int</type>
15000 + <option>
15001 + <name>TX/RX(J3)</name>
15002 + <key>1</key>
15003 + </option>
15004 + <option>
15005 + <name>30 MHz TX/RX(J5)</name>
15006 + <key>3</key>
15007 + </option>
15008 + </param>
15009 +
15010 + <param>
15011 + <name>RX Attenuation(dB)</name>
15012 + <key>atten</key>
15013 + <value>0</value>
15014 + <type>int</type>
15015 + <hide>part</hide>
15016 + <option>
15017 + <name>0</name>
15018 + <key>0</key>
15019 + </option>
15020 + <option>
15021 + <name>2</name>
15022 + <key>1</key>
15023 + </option>
15024 + <option>
15025 + <name>4</name>
15026 + <key>2</key>
15027 + </option>
15028 + <option>
15029 + <name>6</name>
15030 + <key>3</key>
15031 + </option>
15032 + <option>
15033 + <name>8</name>
15034 + <key>4</key>
15035 + </option>
15036 + <option>
15037 + <name>10</name>
15038 + <key>5</key>
15039 + </option><option>
15040 + <name>12</name>
15041 + <key>6</key>
15042 + </option>
15043 + <option>
15044 + <name>14</name>
15045 + <key>7</key>
15046 + </option>
15047 + </param>
15048 +
15049 + <param>
15050 + <name>AM FM Notch Filter</name>
15051 + <key>notch</key>
15052 + <value>0</value>
15053 + <type>int</type>
15054 + <hide>part</hide>
15055 + <option>
15056 + <name>Disabled</name>
15057 + <key>0</key>
15058 + </option>
15059 + <option>
15060 + <name>Enabled</name>
15061 + <key>1</key>
15062 + </option>
15063 + </param>
15064 +
15065 + <param>
15066 + <name>TX Channel</name>
15067 + <key>tx_channel</key>
15068 + <value>1</value>
15069 + <type>int</type>
15070 + <hide>
15071 + #if $rx_channel() > 11
15072 + all
15073 + #else
15074 + none
15075 + #end if
15076 + </hide>
15077 + <option>
15078 + <name>Wideband 1-1000</name>
15079 + <key>1</key>
15080 + </option>
15081 + <option>
15082 + <name>Wideband 1000-4000</name>
15083 + <key>2</key>
15084 + </option>
15085 + <option>
15086 + <name>HAM 30</name>
15087 + <key>3</key>
15088 + </option>
15089 + <option>
15090 + <name>HAM 50-70</name>
15091 + <key>4</key>
15092 + </option>
15093 + <option>
15094 + <name>HAM 144-146</name>
15095 + <key>5</key>
15096 + </option>
15097 + <option>
15098 + <name>HAM 220-225</name>
15099 + <key>6</key>
15100 + </option>
15101 + <option>
15102 + <name>HAM 430-440</name>
15103 + <key>7</key>
15104 + </option>
15105 + <option>
15106 + <name>HAM 902-928</name>
15107 + <key>8</key>
15108 + </option>
15109 + <option>
15110 + <name>HAM 1240-1325</name>
15111 + <key>9</key>
15112 + </option>
15113 + <option>
15114 + <name>HAM 2300-2450</name>
15115 + <key>10</key>
15116 + </option>
15117 + <option>
15118 + <name>HAM 3300-3500</name>
15119 + <key>11</key>
15120 + </option>
15121 + <option>
15122 + <name>Auto</name>
15123 + <key>-2</key>
15124 + </option>
15125 + </param>
15126 +
15127 + <param>
15128 + <name>TX Port</name>
15129 + <key>tx_port</key>
15130 + <value>1</value>
15131 + <type>int</type>
15132 + <option>
15133 + <name>TX/RX(J3)</name>
15134 + <key>1</key>
15135 + </option>
15136 + <option>
15137 + <name>TX (J4)</name>
15138 + <key>2</key>
15139 + </option>
15140 + <option>
15141 + <name>30 MHz TX/RX(J5)</name>
15142 + <key>3</key>
15143 + </option>
15144 + </param>
15145 +<doc>
15146 +-------------------------------------------------------------------------------------------------------------------
15147 +COMMUNICATION
15148 +
15149 +Type of communication used to configure LimeRFE board.
15150 +Direct USB: LimeRFE is configured directly through USB COM port
15151 +SDR: LimeRFE is configured through LimeSDR device GPIO ports
15152 +
15153 +-------------------------------------------------------------------------------------------------------------------
15154 +USB COM PORT
15155 +
15156 +Specified USB COM Port device is connected to e.g. /dev/ttyUSB0 on linux or COM0 on windows
15157 +-------------------------------------------------------------------------------------------------------------------
15158 +SDR DEVICE SERIAL
15159 +
15160 +SDR Device serial number obtained by running
15161 +
15162 +LimeUtil --find
15163 +
15164 +If left blank, the first device in the list will be used to configure LimeRFE board
15165 +-------------------------------------------------------------------------------------------------------------------
15166 +ENABLE FAN
15167 +
15168 +Enable or disable fan connected to LimeRFE device
15169 +-------------------------------------------------------------------------------------------------------------------
15170 +MODE
15171 +
15172 +Select LimeRFE mode to be used, valid values are: RX(0), TX(1), RX+TX(2), NONE(3)
15173 +
15174 +-------------------------------------------------------------------------------------------------------------------
15175 +RX CHANNEL
15176 +
15177 +Select RX channel to be configured, if Cellular Bands are selected, the same channel is set for TX
15178 +
15179 +-------------------------------------------------------------------------------------------------------------------
15180 +RX PORT
15181 +
15182 +Select hardware port to be used for receive
15183 +
15184 +-------------------------------------------------------------------------------------------------------------------
15185 +RX ATTENUATION
15186 +
15187 +Specifies the attenuation in the RX path. Attenuation [dB] = 2 * attenuation.
15188 +Valid value range is [0,7]
15189 +
15190 +-------------------------------------------------------------------------------------------------------------------
15191 +AM FM NOTCH FILTER
15192 +
15193 +Enables or disables AM FM notch filter
15194 +
15195 +Note: Only works for specific channels(see block diagram of LimeRFE)
15196 +
15197 +-------------------------------------------------------------------------------------------------------------------
15198 +TX CHANNEL
15199 +
15200 +Select TX channel to be configured
15201 +
15202 +-------------------------------------------------------------------------------------------------------------------
15203 +TX PORT
15204 +
15205 +Select hardware port to be used for transmit
15206 +-------------------------------------------------------------------------------------------------------------------
15207 +CONFIGURATION FILE
15208 +
15209 +This setting is available in "Advanced" tab of grc block.
15210 +If set LimeRFE device will be configured using already generated .ini file
15211 +
15212 +Note: .ini file must be generated using LimeSuite->Modules->LimeRFE->save, general LimeSuite .ini file will not work
15213 +-------------------------------------------------------------------------------------------------------------------
15214 +</doc>
15215 +</block>
15216 diff --git a/grc/limesdr_sink.block.yml b/grc/limesdr_sink.block.yml
15217 index e8e6052..56f61f4 100644
15218 --- a/grc/limesdr_sink.block.yml
15219 +++ b/grc/limesdr_sink.block.yml
15220 @@ -1,379 +1,323 @@
15221 +# auto-generated by grc.converter
15222 +
15223 id: limesdr_sink
15224 -label: LimeSDR Sink (TX)
15225 -category: '[LimeSDR]'
15226 -flags: throttle
15227 +label: LimeSuite Sink (TX)
15228 +category: '[LimeSuite]'
15229 +flags:
15230 +- throttle
15231
15232 parameters:
15233 -- id: serial
15234 - label: Device serial
15235 - dtype: string
15236 - hide: part
15237 - category: General
15238 -
15239 -- id: filename
15240 - label: File
15241 - dtype: file_open
15242 - hide: part
15243 - category: General
15244 -
15245 -- id: channel_mode
15246 - label: Channel
15247 - dtype: enum
15248 - options: ['0', '1', '2']
15249 - option_labels: ['A', 'B', 'A+B']
15250 - default: 0
15251 - hide: part
15252 - category: General
15253 -
15254 -- id: rf_freq
15255 - label: RF frequency
15256 - dtype: float
15257 - default: 100e6
15258 - category: General
15259 -
15260 -- id: samp_rate
15261 - label: Sample rate
15262 - dtype: float
15263 - default: samp_rate
15264 - category: General
15265 -
15266 -- id: oversample
15267 - label: Oversample
15268 - dtype: enum
15269 - options: ['0', '1', '2', '4', '8', '16', '32']
15270 - option_labels: ['Default', '1', '2', '4', '8', '16', '32']
15271 - default: 0
15272 - category: General
15273 -
15274 -- id: length_tag_name
15275 - label: Length tag name
15276 - dtype: string
15277 - hide: part
15278 - category: General
15279 -
15280 -- id: samp_rate
15281 - label: Sample rate
15282 - dtype: float
15283 - default: samp_rate
15284 - category: General
15285 -
15286 -- id: nco_freq_ch0
15287 - label: NCO frequency
15288 - dtype: float
15289 - default: 0
15290 - hide: part
15291 - category: Channel A
15292 -
15293 -- id: calibr_bandw_ch0
15294 - label: Calibration bandwidth
15295 - dtype: float
15296 - default: 2.5e6
15297 - hide: part
15298 - category: Channel A
15299 -
15300 -- id: pa_path_ch0
15301 - label: PA path
15302 - dtype: int
15303 - options: ['1', '2', '255']
15304 - option_labels: ['Band1', 'Band2', 'Auto']
15305 - default: '255'
15306 - hide: part
15307 - category: Channel A
15308 -
15309 -- id: analog_bandw_ch0
15310 - label: Analog filter bandwidth
15311 - dtype: float
15312 - default: 5e6
15313 - hide: part
15314 - category: Channel A
15315 -
15316 -- id: digital_bandw_ch0
15317 - label: Digital filter bandwidth
15318 - dtype: float
15319 - default: samp_rate
15320 - hide: part
15321 - category: Channel A
15322 -
15323 -- id: gain_dB_ch0
15324 - label: Gain (dB)
15325 - dtype: int
15326 - default: 1
15327 - hide: part
15328 - category: Channel A
15329 -
15330 -- id: nco_freq_ch1
15331 - label: NCO frequency
15332 - dtype: float
15333 - default: 0
15334 - hide: part
15335 - category: Channel B
15336 -
15337 -- id: calibr_bandw_ch1
15338 - label: Calibration bandwidth
15339 - dtype: float
15340 - default: 2.5e6
15341 - hide: part
15342 - category: Channel B
15343 -
15344 -- id: pa_path_ch1
15345 - label: PA path
15346 - dtype: int
15347 - options: ['1', '2', '255']
15348 - option_labels: ['Band1', 'Band2', 'Auto']
15349 - default: '255'
15350 - hide: part
15351 - category: Channel B
15352 -
15353 -- id: analog_bandw_ch1
15354 - label: Analog filter bandwidth
15355 - dtype: float
15356 - default: 5e6
15357 - hide: part
15358 - category: Channel B
15359 -
15360 -- id: digital_bandw_ch1
15361 - label: Digital filter bandwidth
15362 - dtype: float
15363 - default: samp_rate
15364 - hide: part
15365 - category: Channel B
15366 -
15367 -- id: gain_dB_ch1
15368 - label: Gain (dB)
15369 - dtype: int
15370 - default: 1
15371 - hide: part
15372 - category: Channel B
15373 -
15374 -- id: allow_tcxo_dac
15375 - label: Allow TCXO DAC control
15376 - dtype: enum
15377 - options: ['0', '1']
15378 - option_labels: ['No', 'Yes']
15379 - default: 0
15380 - hide: part
15381 - category: Advanced
15382 -
15383 -- id: dacVal
15384 - label: TCX0:DAC val
15385 - dtype: int
15386 - default: 180
15387 - hide: part
15388 - category: Advanced
15389 -
15390 -templates:
15391 - imports: import limesdr
15392 - make: |-
15393 - limesdr.sink(${serial}, ${channel_mode}, ${filename}, ${length_tag_name})
15394 -
15395 - % if filename() == "":
15396 -
15397 - self.${id}.set_sample_rate(${samp_rate})
15398 -
15399 - % if int(oversample()) > 0:
15400 - self.${id}.set_oversampling(${oversample})
15401 - % endif
15402 -
15403 - self.${id}.set_center_freq(${rf_freq}, 0)
15404 -
15405 - % if analog_bandw_ch0() > 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
15406 - self.${id}.set_bandwidth(${analog_bandw_ch0}, 0)
15407 - % endif
15408 -
15409 - % if analog_bandw_ch1() > 0 and int(channel_mode()) > 0:
15410 - self.${id}.set_bandwidth(${analog_bandw_ch1}, 1)
15411 - % endif
15412 -
15413 - % if digital_bandw_ch0() > 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
15414 - self.${id}.set_digital_filter(${digital_bandw_ch0}, 0)
15415 - % endif
15416 -
15417 - % if digital_bandw_ch1() > 0 and int(channel_mode()) > 0:
15418 - self.${id}.set_digital_filter(${digital_bandw_ch1}, 1)
15419 - % endif
15420 -
15421 - % if int(channel_mode()) == 0 or int(channel_mode()) == 2:
15422 - self.${id}.set_gain(${gain_dB_ch0}, 0)
15423 - % endif
15424 -
15425 - % if int(channel_mode()) > 0:
15426 - self.${id}.set_gain(${gain_dB_ch1}, 1)
15427 - % endif
15428 -
15429 - % if int(channel_mode()) == 0 or int(channel_mode()) == 2:
15430 - self.${id}.set_antenna(${pa_path_ch0}, 0)
15431 - % endif
15432 -
15433 - % if int(channel_mode()) > 0:
15434 - self.${id}.set_antenna(${pa_path_ch1}, 1)
15435 - % endif
15436 -
15437 - % if calibr_bandw_ch0() > 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
15438 - self.${id}.calibrate(${calibr_bandw_ch0}, 0)
15439 - % endif
15440 -
15441 - % if calibr_bandw_ch1() > 0 and int(channel_mode()) > 0:
15442 - self.${id}.calibrate(${calibr_bandw_ch1}, 1)
15443 - % endif
15444 -
15445 - % if nco_freq_ch0() != 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
15446 - self.${id}.set_nco(${nco_freq_ch0},0)
15447 - % endif
15448 -
15449 - % if nco_freq_ch1() != 0 and int(channel_mode()) > 0:
15450 - self.${id}.set_nco(${nco_freq_ch1}, 1)
15451 - % endif
15452 -
15453 - % endif # if filename() == ""
15454 -
15455 - % if int(allow_tcxo_dac) == 1:
15456 - self.${id}.set_tcxo_dac(${dacVal})
15457 - % endif
15458 -
15459 - callbacks:
15460 - - set_center_freq(${rf_freq}, 0)
15461 - - set_antenna(${pa_path_ch0}, 0)
15462 - - set_antenna(${pa_path_ch1}, 1)
15463 - - set_nco(${nco_freq_ch0}, 0)
15464 - - set_nco(${nco_freq_ch1}, 1)
15465 - - set_bandwidth(${analog_bandw_ch0}, 0)
15466 - - set_bandwidth(${analog_bandw_ch1}, 1)
15467 - - set_digital_filter(${digital_bandw_ch0}, 0)
15468 - - set_digital_filter(${digital_bandw_ch1}, 1)
15469 - - set_gain(${gain_dB_ch0}, 0)
15470 - - set_gain(${gain_dB_ch1}, 1)
15471 - - set_tcxo_dac(${dacVal})
15472 +- id: serial
15473 + label: Device Serial
15474 + dtype: string
15475 + hide: none
15476 +- id: filename
15477 + label: File
15478 + category: Advanced
15479 + dtype: file_open
15480 +- id: channel_mode
15481 + label: Channel
15482 + dtype: int
15483 + default: '0'
15484 + options: ['0', '1', '2']
15485 + option_labels: [A, B, A+B (MIMO)]
15486 + hide: part
15487 +- id: rf_freq
15488 + label: RF Frequency
15489 + dtype: float
15490 + default: 100e6
15491 +- id: samp_rate
15492 + label: Sample Rate
15493 + dtype: float
15494 + default: samp_rate
15495 + hide: ${ 'all' if filename != "" else 'none' }
15496 +- id: oversample
15497 + label: Oversample
15498 + dtype: int
15499 + default: '0'
15500 + options: ['0', '1', '2', '4', '8', '16', '32']
15501 + option_labels: [Default, '1', '2', '4', '8', '16', '32']
15502 + hide: ${ 'all' if filename != "" else 'none' }
15503 +- id: dacVal
15504 + label: DAC Value (TCXO)
15505 + dtype: int
15506 + default: '125'
15507 + hide: ${ 'all' if allow_tcxo_dac == 0 else 'none' }
15508 +- id: length_tag_name
15509 + label: Length Tag Name
15510 + dtype: string
15511 + hide: none
15512 +- id: nco_freq_ch0
15513 + label: NCO Frequency
15514 + category: Channel A
15515 + dtype: float
15516 + default: '0'
15517 + hide: ${ 'all' if channel_mode == 1 else 'none' }
15518 +- id: calibr_bandw_ch0
15519 + label: Calibration BW
15520 + category: Channel A
15521 + dtype: float
15522 + default: 5e6
15523 + hide: ${ 'all' if channel_mode == 1 or filename != "" else 'none' }
15524 +- id: pa_path_ch0
15525 + label: PA Path
15526 + category: Channel A
15527 + dtype: int
15528 + default: '255'
15529 + options: ['255', '1', '2']
15530 + option_labels: [Auto (Default), Band 1, Band 2]
15531 + hide: ${ 'all' if channel_mode == 1 else 'none' }
15532 +- id: analog_bandw_ch0
15533 + label: Analog Filter BW
15534 + category: Channel A
15535 + dtype: float
15536 + default: 5e6
15537 + hide: ${ 'all' if channel_mode == 1 else 'none' }
15538 +- id: digital_bandw_ch0
15539 + label: Digital Filter BW
15540 + category: Channel A
15541 + dtype: float
15542 + default: '0'
15543 + hide: ${ 'all' if channel_mode == 1 else 'none' }
15544 +- id: gain_dB_ch0
15545 + label: Gain (dB)
15546 + category: Channel A
15547 + dtype: int
15548 + default: '30'
15549 + hide: ${ 'all' if channel_mode == 1 else 'none' }
15550 +- id: nco_freq_ch1
15551 + label: NCO Frequency
15552 + category: Channel B
15553 + dtype: float
15554 + default: '0'
15555 + hide: ${ 'all' if channel_mode == 0 else 'none' }
15556 +- id: calibr_bandw_ch1
15557 + label: Calibration BW
15558 + category: Channel B
15559 + dtype: float
15560 + default: 5e6
15561 + hide: ${ 'all' if channel_mode == 0 or filename != "" else 'none' }
15562 +- id: pa_path_ch1
15563 + label: PA Path
15564 + category: Channel B
15565 + dtype: int
15566 + default: '1'
15567 + options: ['1', '2']
15568 + option_labels: [Band 1, Band 2]
15569 + hide: ${ 'all' if channel_mode == 0 else 'none' }
15570 +- id: analog_bandw_ch1
15571 + label: Analog Filter BW
15572 + category: Channel B
15573 + dtype: float
15574 + default: 5e6
15575 + hide: ${ 'all' if channel_mode == 0 else 'none' }
15576 +
15577 +- id: digital_bandw_ch1
15578 + label: Digital Filter BW
15579 + category: Channel B
15580 + dtype: float
15581 + default: '0'
15582 + hide: ${ 'all' if channel_mode == 0 else 'none' }
15583 +- id: gain_dB_ch1
15584 + label: Gain (dB)
15585 + category: Channel B
15586 + dtype: int
15587 + default: '30'
15588 + hide: ${ 'all' if channel_mode == 0 else 'none' }
15589 +- id: allow_tcxo_dac
15590 + label: Allow TCXO DAC Control
15591 + category: Advanced
15592 + dtype: int
15593 + default: '0'
15594 + options: ['1', '0']
15595 + option_labels: ['Yes', 'No']
15596 + hide: part
15597
15598 +inputs:
15599 +- domain: stream
15600 + dtype: complex
15601 + multiplicity: ${ channel_mode }
15602 asserts:
15603 -- ${ int(channel_mode) >= 0 }
15604 -- ${ 2 >= int(channel_mode) }
15605 -
15606 +- ${ channel_mode >= 0 }
15607 +- ${ 2 >= channel_mode }
15608 - ${ rf_freq > 0 }
15609 -
15610 - ${ calibr_bandw_ch0 >= 2.5e6 or calibr_bandw_ch0 == 0 }
15611 - ${ 120e6 >= calibr_bandw_ch0 }
15612 -
15613 - ${ calibr_bandw_ch1 >= 2.5e6 or calibr_bandw_ch1 == 0 }
15614 - ${ 120e6 >= calibr_bandw_ch1 }
15615 -
15616 - ${ analog_bandw_ch0 >= 5e6 or analog_bandw_ch0 == 0 }
15617 - ${ 130e6 >= analog_bandw_ch0 }
15618 -
15619 - ${ analog_bandw_ch1 >= 5e6 or analog_bandw_ch1 == 0 }
15620 - ${ 130e6 >= analog_bandw_ch1 }
15621 -
15622 - ${ digital_bandw_ch0 >= 0 }
15623 - ${ samp_rate >= digital_bandw_ch0 or digital_bandw_ch0 == 0 }
15624 -
15625 - ${ digital_bandw_ch1 >= 0 }
15626 -- ${ samp_rate >= digital_bandw_ch1 or digital_bandw_ch0 == 0 }
15627 -
15628 +- ${ samp_rate >= digital_bandw_ch1 or digital_bandw_ch1 == 0 }
15629 - ${ gain_dB_ch0 >= 0 }
15630 -- ${ 60 >= gain_dB_ch0 }
15631 -
15632 +- ${ 73 >= gain_dB_ch0 }
15633 - ${ gain_dB_ch1 >= 0 }
15634 -- ${ 60 >= gain_dB_ch1 }
15635 -
15636 +- ${ 73 >= gain_dB_ch1 }
15637 - ${ samp_rate > 0 }
15638 - ${ 61.44e6 >= samp_rate }
15639
15640 -inputs:
15641 -- label: in
15642 - domain: stream
15643 - dtype: complex
15644 - multiplicity: ${ (2 if int(channel_mode) == 2 else 1) }
15645 -
15646 -file_format: 1
15647 +templates:
15648 + imports: import limesdr
15649 + make: |-
15650 + limesdr.sink(${serial}, ${channel_mode}, ${filename}, ${length_tag_name})
15651 + % if context.get('filename')() == "":
15652 + self.${id}.set_sample_rate(${samp_rate})
15653 + % if context.get('oversample')() > 0:
15654 + self.${id}.set_oversampling(${oversample})
15655 + % endif
15656 + self.${id}.set_center_freq(${rf_freq}, 0)
15657 + % if context.get('analog_bandw_ch0')() > 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
15658 + self.${id}.set_bandwidth(${analog_bandw_ch0},0)
15659 + % endif
15660 + % if context.get('analog_bandw_ch1')() > 0 and context.get('channel_mode')() > 0:
15661 + self.${id}.set_bandwidth(${analog_bandw_ch1},1)
15662 + % endif
15663 + % if context.get('digital_bandw_ch0')() > 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
15664 + self.${id}.set_digital_filter(${digital_bandw_ch0},0)
15665 + % endif
15666 + % if context.get('digital_bandw_ch1')() > 0 and context.get('channel_mode')() > 0:
15667 + self.${id}.set_digital_filter(${digital_bandw_ch1},1)
15668 + % endif
15669 + % if context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2:
15670 + self.${id}.set_gain(${gain_dB_ch0},0)
15671 + % endif
15672 + % if context.get('channel_mode')() > 0:
15673 + self.${id}.set_gain(${gain_dB_ch1},1)
15674 + % endif
15675 + % if context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2:
15676 + self.${id}.set_antenna(${pa_path_ch0},0)
15677 + % endif
15678 + % if context.get('channel_mode')() > 0:
15679 + self.${id}.set_antenna(${pa_path_ch1},1)
15680 + % endif
15681 + % if context.get('calibr_bandw_ch0')() > 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
15682 + self.${id}.calibrate(${calibr_bandw_ch0}, 0)
15683 + % endif
15684 + % if context.get('calibr_bandw_ch1')() > 0 and context.get('channel_mode')() > 0:
15685 + self.${id}.calibrate(${calibr_bandw_ch1}, 1)
15686 + % endif
15687 + % if context.get('nco_freq_ch0')() != 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
15688 + self.${id}.set_nco(${nco_freq_ch0},0)
15689 + % endif
15690 + % if context.get('nco_freq_ch1')() != 0 and context.get('channel_mode')() > 0:
15691 + self.${id}.set_nco(${nco_freq_ch1},1)
15692 + % endif
15693 + % endif
15694 + % if context.get('allow_tcxo_dac')() == 1:
15695 + self.${id}.set_tcxo_dac(${dacVal})
15696 + % endif
15697 + callbacks:
15698 + - set_center_freq(${rf_freq}, 0)
15699 + - set_antenna(${pa_path_ch0},0)
15700 + - set_antenna(${pa_path_ch1},1)
15701 + - set_nco(${nco_freq_ch0},0)
15702 + - set_nco(${nco_freq_ch1},1)
15703 + - set_bandwidth(${analog_bandw_ch0},0)
15704 + - set_bandwidth(${analog_bandw_ch1},1)
15705 + - set_digital_filter(${digital_bandw_ch0},0)
15706 + - set_digital_filter(${digital_bandw_ch1},1)
15707 + - set_gain(${gain_dB_ch0},0)
15708 + - set_gain(${gain_dB_ch1},1)
15709 + - set_tcxo_dac(${dacVal})
15710
15711 documentation: |-
15712 - -------------------------------------------------------------------------------------------------------------------
15713 - DEVICE SERIAL
15714 + -------------------------------------------------------------------------------------------------------------------
15715 + DEVICE SERIAL
15716 +
15717 + Device serial number obtained by running
15718
15719 - Device serial number obtained by running
15720 + LimeUtil --find
15721
15722 - LimeUtil --find
15723 + If left blank, the first device in the list is used.
15724 + -------------------------------------------------------------------------------------------------------------------
15725 + CHANNEL
15726
15727 - If left blank, the first device in the list is used.
15728 - -------------------------------------------------------------------------------------------------------------------
15729 - CHANNEL
15730 + Use this setting to choose between SISO channels or MIMO mode.
15731
15732 - Use this setting to choose between SISO channels or MIMO mode.
15733 + Note: not all devices support MIMO mode and have more than one channel.
15734 + -------------------------------------------------------------------------------------------------------------------
15735 + RF FREQUENCY
15736
15737 - Note: not all devices support MIMO mode and have more than one channel.
15738 - -------------------------------------------------------------------------------------------------------------------
15739 - FILE
15740 + Set RF center frequency for TX (both channels).
15741 + LimeSDR-USB supports [100e3,3800e6] Hz.
15742 + LimeSDR-PCIe supports [100e3,3800e6] Hz.
15743 + LimeSDR-Mini supports [10e6,3500e6] Hz.
15744 + LimeNET-Micro supports [10e6,3500e6] Hz.
15745 + -------------------------------------------------------------------------------------------------------------------
15746 + SAMPLE RATE
15747
15748 - Generate .ini file with LimeSuite and select path.
15749 + Here you can enter sample rate for TX.
15750
15751 - Note: setting must match in LimeSuite Source and Sink for the same device.
15752 - -------------------------------------------------------------------------------------------------------------------
15753 - RF FREQUENCY
15754 + LimeSDR-USB sample rate must be no more than 61.44e6 S/s.
15755 + LimeSDR-PCIe sample rate must be no more than 61.44e6 S/s.
15756 + LimeSDR-Mini sample rate must be no more than 30.72e6 S/s.
15757 + LimeNET-Micro sample rate must be no more than 10e6 S/s.
15758
15759 - Set RF center frequency for TX (both channels).
15760 - LimeSDR-USB supports [100e3,3800e6] Hz.
15761 - LimeSDR-PCIe supports [100e3,3800e6] Hz.
15762 - LimeSDR-Mini supports [10e6,3500e6] Hz.
15763 - LimeNET-Micro supports [10e6,3500e6] Hz.
15764 - -------------------------------------------------------------------------------------------------------------------
15765 - SAMPLE RATE
15766 + Note: LimeSDR-Mini and LimeNET-Micro supports only the same sample rate for TX and RX.
15767 + -------------------------------------------------------------------------------------------------------------------
15768 + OVERSAMPLE
15769
15770 - Here you can enter sample rate for TX.
15771 + Here you can select oversampling value for TX. Default value uses highest possible oversampling value.
15772
15773 - LimeSDR-USB sample rate must be no more than 61.44e6 S/s.
15774 - LimeSDR-PCIe sample rate must be no more than 61.44e6 S/s.
15775 - LimeSDR-Mini sample rate must be no more than 30.72e6 S/s.
15776 - LimeNET-Micro sample rate must be no more than 10e6 S/s.
15777 + Note: LimeSDR-Mini and LimeNET-Micro supports only the same oversampling value for TX and RX.
15778 + -------------------------------------------------------------------------------------------------------------------
15779 + Length tag name
15780
15781 - Note: LimeSDR-Mini and LimeNET-Micro supports only the same sample rate for TX and RX.
15782 - -------------------------------------------------------------------------------------------------------------------
15783 - OVERSAMPLE
15784 + Set name of stream tag with which number of samples sent is set.
15785 + -------------------------------------------------------------------------------------------------------------------
15786 + NCO FREQUENCY
15787
15788 - Here you can select oversampling value for TX. Default value uses highest possible oversampling value.
15789 + Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF.
15790 + -------------------------------------------------------------------------------------------------------------------
15791 + CALIBRATION BANDW.
15792
15793 - Note: LimeSDR-Mini and LimeNET-Micro supports only the same oversampling value for TX and RX.
15794 - -------------------------------------------------------------------------------------------------------------------
15795 - Length tag name
15796 + This setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth.
15797 + Calibration is off when bandwidth is set to 0.
15798
15799 - Set name of stream tag with which number of samples sent is set.
15800 - -------------------------------------------------------------------------------------------------------------------
15801 - NCO FREQUENCY
15802 + Calibration bandwidth range must be [2.5e6,120e6] Hz.
15803 + -------------------------------------------------------------------------------------------------------------------
15804 + PA PATH
15805
15806 - Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF.
15807 - -------------------------------------------------------------------------------------------------------------------
15808 - CALIBRATION BANDW.
15809 + Select active power amplifier path of each channel.
15810 + For LimeSDR-Mini and LimeNET-Micro Auto(Default) option sets preferred PA path depending on RF frequency.
15811 + For LimeSDR-USB and LimeSDR-PCIe Auto(Default) sets PA path to Band1.
15812 + -------------------------------------------------------------------------------------------------------------------
15813 + ANALOG FILTER BANDW.
15814
15815 - This setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth.
15816 - Calibration is off when bandwidth is set to 0.
15817 + Enter analog filter bandwidth for each channel. Analog filter is off if bandwidth is set to 0.
15818 + Analog filter bandwidth range must be [5e6,130e6] Hz.
15819 + -------------------------------------------------------------------------------------------------------------------
15820 + DIGITAL FILTER BANDW.
15821
15822 - Calibration bandwidth range must be [2.5e6,120e6] Hz.
15823 - -------------------------------------------------------------------------------------------------------------------
15824 - PA PATH
15825 + Enter digital filter bandwidth for each channel. Digital filter if off if bandwidth is set to 0.
15826 + Bandwidth should not be higher than sample rate.
15827 + -------------------------------------------------------------------------------------------------------------------
15828 + GAIN
15829
15830 - Select active power amplifier path of each channel.
15831 - For LimeSDR-Mini and LimeNET-Micro Auto(Default) option sets preferred PA path depending on RF frequency.
15832 - For LimeSDR-USB and LimeSDR-PCIe Auto(Default) sets PA path to Band1.
15833 - -------------------------------------------------------------------------------------------------------------------
15834 - ANALOG FILTER BANDW.
15835 + Controls combined TX gain settings. Gain range must be [0,73] dB.
15836 + -------------------------------------------------------------------------------------------------------------------
15837 + FILE
15838
15839 - Enter analog filter bandwidth for each channel. Analog filter is off if bandwidth is set to 0.
15840 - Analog filter bandwidth range must be [5e6,130e6] Hz.
15841 - -------------------------------------------------------------------------------------------------------------------
15842 - DIGITAL FILTER BANDW.
15843 + This setting is available in "Advanced" tab of grc block.
15844 + Use .ini file generated by LimeSuiteGUI to configure the device.
15845 + RF frequency, sampling rate, oversampling, filters, gain and antenna settings won't be used from GRC blocks when
15846 + device is started. Runtime variables(RF frequency, gain...) can still be modified when flowgraph is running.
15847
15848 - Enter digital filter bandwidth for each channel. Digital filter if off if bandwidth is set to 0.
15849 - Bandwidth should not be higher than sample rate.
15850 - -------------------------------------------------------------------------------------------------------------------
15851 - GAIN
15852 + Note: setting must match in LimeSuite Source and Sink for the same device.
15853 + -------------------------------------------------------------------------------------------------------------------
15854 + TCXO DAC
15855
15856 - Controls combined TX gain settings. Gain range must be [0,60] dB.
15857 - -------------------------------------------------------------------------------------------------------------------
15858 - TCXO DAC
15859 + Controls 40 MHz TCXO DAC settings. To enable this parameter "Allow TCXO DAC control" in the "Advanced" tab must be set to "Yes"
15860 + Care must be taken as this parameter is returned to default value only after power off.
15861
15862 - Controls 40 MHz TCXO DAC settings. To enable this parameter "Allow TCXO DAC control" in the "Advanced" tab must be set to "Yes"
15863 - Care must be taken as this parameter is returned to default value only after power off.
15864 + LimeSDR-Mini default value is 180 range is [0,255]
15865 + LimeSDR-USB default value is 125 range is [0,255]
15866 + LimeSDR-PCIe default value is 134 range is [0,255]
15867 + LimeNET-Micro default value is 30714 range is [0,65535]
15868 + -------------------------------------------------------------------------------------------------------------------
15869
15870 - LimeSDR-Mini default value is 180 range is [0,255]
15871 - LimeSDR-USB default value is 125 range is [0,255]
15872 - LimeSDR-PCIe default value is 134 range is [0,255]
15873 - LimeNET-Micro default value is 30714 range is [0,65535]
15874 - -------------------------------------------------------------------------------------------------------------------
15875 +file_format: 1
15876 diff --git a/grc/limesdr_sink.xml b/grc/limesdr_sink.xml
15877 new file mode 100755
15878 index 0000000..a4474df
15879 --- /dev/null
15880 +++ b/grc/limesdr_sink.xml
15881 @@ -0,0 +1,556 @@
15882 +<?xml version="1.0"?>
15883 +<block>
15884 + <name>LimeSuite Sink (TX)</name>
15885 + <key>limesdr_sink</key>
15886 + <category>[LimeSuite]</category>
15887 + <flags>throttle</flags>
15888 + <import>import limesdr</import>
15889 + <make>limesdr.sink($serial, $channel_mode, $filename, $length_tag_name)
15890 +#if $filename() == ""
15891 +self.$(id).set_sample_rate($samp_rate)
15892 +#if $oversample() > 0
15893 +self.$(id).set_oversampling($oversample)
15894 +#end if
15895 +self.$(id).set_center_freq($rf_freq, 0)
15896 +#if $analog_bandw_ch0() > 0 and ($channel_mode() == 0 or $channel_mode() == 2)
15897 +self.$(id).set_bandwidth($analog_bandw_ch0,0)
15898 +#end if
15899 +#if $analog_bandw_ch1() > 0 and $channel_mode() > 0
15900 +self.$(id).set_bandwidth($analog_bandw_ch1,1)
15901 +#end if
15902 +#if $digital_bandw_ch0() > 0 and ($channel_mode() == 0 or $channel_mode() == 2)
15903 +self.$(id).set_digital_filter($digital_bandw_ch0,0)
15904 +#end if
15905 +#if $digital_bandw_ch1() > 0 and $channel_mode() > 0
15906 +self.$(id).set_digital_filter($digital_bandw_ch1,1)
15907 +#end if
15908 +#if $channel_mode() == 0 or $channel_mode() == 2
15909 +self.$(id).set_gain($gain_dB_ch0,0)
15910 +#end if
15911 +#if $channel_mode() > 0
15912 +self.$(id).set_gain($gain_dB_ch1,1)
15913 +#end if
15914 +#if $channel_mode() == 0 or $channel_mode() == 2
15915 +self.$(id).set_antenna($pa_path_ch0,0)
15916 +#end if
15917 +#if $channel_mode() > 0
15918 +self.$(id).set_antenna($pa_path_ch1,1)
15919 +#end if
15920 +#if $calibr_bandw_ch0() > 0 and ($channel_mode() == 0 or $channel_mode() == 2)
15921 +self.$(id).calibrate($calibr_bandw_ch0, 0)
15922 +#end if
15923 +#if $calibr_bandw_ch1() > 0 and $channel_mode() > 0
15924 +self.$(id).calibrate($calibr_bandw_ch1, 1)
15925 +#end if
15926 +#if $nco_freq_ch0() != 0 and ($channel_mode() == 0 or $channel_mode() == 2)
15927 +self.$(id).set_nco($nco_freq_ch0,0)
15928 +#end if
15929 +#if $nco_freq_ch1() != 0 and $channel_mode() > 0
15930 +self.$(id).set_nco($nco_freq_ch1,1)
15931 +#end if
15932 +#end if
15933 +#if $allow_tcxo_dac() == 1
15934 +self.$(id).set_tcxo_dac($dacVal)
15935 +#end if
15936 + </make>
15937 +
15938 + <callback>set_center_freq($rf_freq, 0)</callback>
15939 + <callback>set_antenna($pa_path_ch0,0)</callback>
15940 + <callback>set_antenna($pa_path_ch1,1)</callback>
15941 + <callback>set_nco($nco_freq_ch0,0)</callback>
15942 + <callback>set_nco($nco_freq_ch1,1)</callback>
15943 + <callback>set_bandwidth($analog_bandw_ch0,0)</callback>
15944 + <callback>set_bandwidth($analog_bandw_ch1,1)</callback>
15945 + <callback>set_digital_filter($digital_bandw_ch0,0)</callback>
15946 + <callback>set_digital_filter($digital_bandw_ch1,1)</callback>
15947 + <callback>set_gain($gain_dB_ch0,0)</callback>
15948 + <callback>set_gain($gain_dB_ch1,1)</callback>
15949 + <callback>set_tcxo_dac($dacVal)</callback>
15950 +
15951 + <param_tab_order>
15952 + <tab>General</tab>
15953 + <tab>Channel A</tab>
15954 + <tab>Channel B</tab>
15955 + </param_tab_order>
15956 +
15957 + <param>
15958 + <name>Device Serial</name>
15959 + <key>serial</key>
15960 + <value></value>
15961 + <type>string</type>
15962 + <hide>none</hide>
15963 + </param>
15964 +
15965 + <param>
15966 + <name>File</name>
15967 + <key>filename</key>
15968 + <value></value>
15969 + <type>file_open</type>
15970 + <tab>Advanced</tab>
15971 + </param>
15972 +
15973 + <param>
15974 + <name>Channel</name>
15975 + <key>channel_mode</key>
15976 + <value>0</value>
15977 + <type>int</type>
15978 + <option>
15979 + <name>A</name>
15980 + <key>0</key>
15981 + </option>
15982 + <option>
15983 + <name>B</name>
15984 + <key>1</key>
15985 + </option>
15986 + <option>
15987 + <name>A+B (MIMO)</name>
15988 + <key>2</key>
15989 + </option>
15990 + </param>
15991 +
15992 + <param>
15993 + <name>RF Frequency</name>
15994 + <key>rf_freq</key>
15995 + <value>100e6</value>
15996 + <type>float</type>
15997 + </param>
15998 +
15999 + <param>
16000 + <name>Sample Rate</name>
16001 + <key>samp_rate</key>
16002 + <value>samp_rate</value>
16003 + <type>float</type>
16004 + <hide>
16005 + #if $filename() != ""
16006 + all
16007 + #else
16008 + none
16009 + #end if
16010 + </hide>
16011 + </param>
16012 +
16013 + <param>
16014 + <name>Oversample</name>
16015 + <key>oversample</key>
16016 + <value>0</value>
16017 + <type>int</type>
16018 + <hide>
16019 + #if $filename() != ""
16020 + all
16021 + #else
16022 + none
16023 + #end if
16024 + </hide>
16025 + <option>
16026 + <name>Default</name>
16027 + <key>0</key>
16028 + </option>
16029 + <option>
16030 + <name>1</name>
16031 + <key>1</key>
16032 + </option>
16033 + <option>
16034 + <name>2</name>
16035 + <key>2</key>
16036 + </option>
16037 + <option>
16038 + <name>4</name>
16039 + <key>4</key>
16040 + </option>
16041 + <option>
16042 + <name>8</name>
16043 + <key>8</key>
16044 + </option>
16045 + <option>
16046 + <name>16</name>
16047 + <key>16</key>
16048 + </option>
16049 + <option>
16050 + <name>32</name>
16051 + <key>32</key>
16052 + </option>
16053 + </param>
16054 +
16055 + <param>
16056 + <name>DAC Value (TCXO)</name>
16057 + <key>dacVal</key>
16058 + <value>125</value>
16059 + <type>int</type>
16060 + <hide>
16061 + #if $allow_tcxo_dac() == 0
16062 + all
16063 + #else
16064 + none
16065 + #end if
16066 + </hide>
16067 + </param>
16068 +
16069 + <param>
16070 + <name>Length Tag Name</name>
16071 + <key>length_tag_name</key>
16072 + <value></value>
16073 + <type>string</type>
16074 + <hide>none</hide>
16075 + </param>
16076 +
16077 + <param>
16078 + <name>NCO Frequency</name>
16079 + <key>nco_freq_ch0</key>
16080 + <value>0</value>
16081 + <type>float</type>
16082 + <hide>
16083 + #if $channel_mode() == 1
16084 + all
16085 + #else
16086 + none
16087 + #end if
16088 + </hide>
16089 + <tab>Channel A</tab>
16090 + </param>
16091 +
16092 + <param>
16093 + <name>Calibration BW</name>
16094 + <key>calibr_bandw_ch0</key>
16095 + <value>5e6</value>
16096 + <type>float</type>
16097 + <hide>
16098 + #if $filename() != ""
16099 + all
16100 + #else if $channel_mode() == 1
16101 + all
16102 + #else
16103 + none
16104 + #end if
16105 + </hide>
16106 + <tab>Channel A</tab>
16107 + </param>
16108 +
16109 + <param>
16110 + <name>PA Path</name>
16111 + <key>pa_path_ch0</key>
16112 + <value>255</value>
16113 + <type>int</type>
16114 + <hide>
16115 + #if $channel_mode() == 1
16116 + all
16117 + #else
16118 + none
16119 + #end if
16120 + </hide>
16121 + <option>
16122 + <name>Auto (Default)</name>
16123 + <key>255</key>
16124 + </option>
16125 + <option>
16126 + <name>Band 1</name>
16127 + <key>1</key>
16128 + </option>
16129 + <option>
16130 + <name>Band 2</name>
16131 + <key>2</key>
16132 + </option>
16133 + <tab>Channel A</tab>
16134 + </param>
16135 +
16136 + <param>
16137 + <name>Analog Filter BW</name>
16138 + <key>analog_bandw_ch0</key>
16139 + <value>5e6</value>
16140 + <type>float</type>
16141 + <hide>
16142 + #if $channel_mode() == 1
16143 + all
16144 + #else
16145 + none
16146 + #end if
16147 + </hide>
16148 + <tab>Channel A</tab>
16149 + </param>
16150 +
16151 +
16152 + <param>
16153 + <name>Digital Filter BW</name>
16154 + <key>digital_bandw_ch0</key>
16155 + <value>0</value>
16156 + <type>float</type>
16157 + <hide>
16158 + #if $channel_mode() == 1
16159 + all
16160 + #else
16161 + none
16162 + #end if
16163 + </hide>
16164 + <tab>Channel A</tab>
16165 + </param>
16166 +
16167 + <param>
16168 + <name>Gain (dB)</name>
16169 + <key>gain_dB_ch0</key>
16170 + <value>30</value>
16171 + <type>int</type>
16172 + <hide>
16173 + #if $channel_mode() == 1
16174 + all
16175 + #else
16176 + none
16177 + #end if
16178 + </hide>
16179 + <tab>Channel A</tab>
16180 + </param>
16181 +
16182 + <param>
16183 + <name>NCO Frequency</name>
16184 + <key>nco_freq_ch1</key>
16185 + <value>0</value>
16186 + <type>float</type>
16187 + <hide>
16188 + #if $channel_mode() == 0
16189 + all
16190 + #else
16191 + none
16192 + #end if
16193 + </hide>
16194 + <tab>Channel B</tab>
16195 + </param>
16196 +
16197 + <param>
16198 + <name>Calibration BW</name>
16199 + <key>calibr_bandw_ch1</key>
16200 + <value>5e6</value>
16201 + <type>float</type>
16202 + <hide>
16203 + #if $channel_mode() == 0
16204 + all
16205 + #else if $filename() != ""
16206 + all
16207 + #else
16208 + none
16209 + #end if
16210 + </hide>
16211 + <tab>Channel B</tab>
16212 + </param>
16213 +
16214 + <param>
16215 + <name>PA Path</name>
16216 + <key>pa_path_ch1</key>
16217 + <value>1</value>
16218 + <type>int</type>
16219 + <hide>
16220 + #if $channel_mode() == 0
16221 + all
16222 + #else
16223 + none
16224 + #end if
16225 + </hide>
16226 + <option>
16227 + <name>Band 1</name>
16228 + <key>1</key>
16229 + </option>
16230 + <option>
16231 + <name>Band 2</name>
16232 + <key>2</key>
16233 + </option>
16234 + <tab>Channel B</tab>
16235 + </param>
16236 +
16237 + <param>
16238 + <name>Analog Filter BW</name>
16239 + <key>analog_bandw_ch1</key>
16240 + <value>5e6</value>
16241 + <type>float</type>
16242 + <hide>
16243 + #if $channel_mode() == 0
16244 + all
16245 + #else
16246 + none
16247 + #end if
16248 + </hide>
16249 + <tab>Channel B</tab>
16250 + </param>
16251 +
16252 + <param>
16253 + <name>Digital Filter BW</name>
16254 + <key>digital_bandw_ch1</key>
16255 + <value>0</value>
16256 + <type>float</type>
16257 + <hide>
16258 + #if $channel_mode() == 0
16259 + all
16260 + #else
16261 + none
16262 + #end if
16263 + </hide>
16264 + <tab>Channel B</tab>
16265 + </param>
16266 +
16267 + <param>
16268 + <name>Gain (dB)</name>
16269 + <key>gain_dB_ch1</key>
16270 + <value>30</value>
16271 + <type>int</type>
16272 + <hide>
16273 + #if $channel_mode() == 0
16274 + all
16275 + #else
16276 + none
16277 + #end if
16278 + </hide>
16279 + <tab>Channel B</tab>
16280 + </param>
16281 +
16282 + <param>
16283 + <name>Allow TCXO DAC Control</name>
16284 + <key>allow_tcxo_dac</key>
16285 + <value>0</value>
16286 + <type>int</type>
16287 + <hide>part</hide>
16288 + <option>
16289 + <name>Yes</name>
16290 + <key>1</key>
16291 + </option>
16292 + <option>
16293 + <name>No</name>
16294 + <key>0</key>
16295 + </option>
16296 + <tab>Advanced</tab>
16297 + </param>
16298 +
16299 + <!--<check> $device_type >= $channel_mode-1 </check>-->
16300 + <check> $channel_mode >= 0 </check>
16301 + <check> 2 >= $channel_mode </check>
16302 +
16303 + <check> $rf_freq > 0 </check>
16304 +
16305 + <check> $calibr_bandw_ch0 >= 2.5e6 or $calibr_bandw_ch0 == 0</check>
16306 + <check> 120e6 >= $calibr_bandw_ch0</check>
16307 +
16308 + <check> $calibr_bandw_ch1 >= 2.5e6 or $calibr_bandw_ch1 == 0 </check>
16309 + <check> 120e6 >= $calibr_bandw_ch1</check>
16310 +
16311 + <check> $analog_bandw_ch0 >= 5e6 or $analog_bandw_ch0 == 0 </check>
16312 + <check> 130e6 >= $analog_bandw_ch0</check>
16313 +
16314 + <check> $analog_bandw_ch1 >= 5e6 or $analog_bandw_ch1 == 0</check>
16315 + <check> 130e6 >= $analog_bandw_ch1</check>
16316 +
16317 + <check> $digital_bandw_ch0 >= 0 </check>
16318 + <check> $samp_rate >= $digital_bandw_ch0 or $digital_bandw_ch0 == 0 </check>
16319 +
16320 + <check> $digital_bandw_ch1 >= 0 </check>
16321 + <check> $samp_rate >= $digital_bandw_ch1 or $digital_bandw_ch1 == 0 </check>
16322 +
16323 + <check> $gain_dB_ch0 >= 0 </check>
16324 + <check> 73 >= $gain_dB_ch0 </check>
16325 +
16326 + <check> $gain_dB_ch1 >= 0 </check>
16327 + <check> 73 >= $gain_dB_ch1 </check>
16328 +
16329 + <check> $samp_rate > 0 </check>
16330 + <check> 61.44e6 >= $samp_rate </check>
16331 +
16332 + <!--<check> $txco_dac >= 0 </check>
16333 + <check> 255 > $tcxo_dac </check>-->
16334 +
16335 + <sink>
16336 + <name>in</name>
16337 + <type>complex</type>
16338 + <nports>$channel_mode</nports>
16339 + </sink>
16340 +
16341 +<doc>
16342 +-------------------------------------------------------------------------------------------------------------------
16343 +DEVICE SERIAL
16344 +
16345 +Device serial number obtained by running
16346 +
16347 + LimeUtil --find
16348 +
16349 +If left blank, the first device in the list is used.
16350 +-------------------------------------------------------------------------------------------------------------------
16351 +CHANNEL
16352 +
16353 +Use this setting to choose between SISO channels or MIMO mode.
16354 +
16355 +Note: not all devices support MIMO mode and have more than one channel.
16356 +-------------------------------------------------------------------------------------------------------------------
16357 +RF FREQUENCY
16358 +
16359 +Set RF center frequency for TX (both channels).
16360 +LimeSDR-USB supports [100e3,3800e6] Hz.
16361 +LimeSDR-PCIe supports [100e3,3800e6] Hz.
16362 +LimeSDR-Mini supports [10e6,3500e6] Hz.
16363 +LimeNET-Micro supports [10e6,3500e6] Hz.
16364 +-------------------------------------------------------------------------------------------------------------------
16365 +SAMPLE RATE
16366 +
16367 +Here you can enter sample rate for TX.
16368 +
16369 +LimeSDR-USB sample rate must be no more than 61.44e6 S/s.
16370 +LimeSDR-PCIe sample rate must be no more than 61.44e6 S/s.
16371 +LimeSDR-Mini sample rate must be no more than 30.72e6 S/s.
16372 +LimeNET-Micro sample rate must be no more than 10e6 S/s.
16373 +
16374 +Note: LimeSDR-Mini and LimeNET-Micro supports only the same sample rate for TX and RX.
16375 +-------------------------------------------------------------------------------------------------------------------
16376 +OVERSAMPLE
16377 +
16378 +Here you can select oversampling value for TX. Default value uses highest possible oversampling value.
16379 +
16380 +Note: LimeSDR-Mini and LimeNET-Micro supports only the same oversampling value for TX and RX.
16381 +-------------------------------------------------------------------------------------------------------------------
16382 +Length tag name
16383 +
16384 +Set name of stream tag with which number of samples sent is set.
16385 +-------------------------------------------------------------------------------------------------------------------
16386 +NCO FREQUENCY
16387 +
16388 +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF.
16389 +-------------------------------------------------------------------------------------------------------------------
16390 +CALIBRATION BANDW.
16391 +
16392 +This setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth.
16393 +Calibration is off when bandwidth is set to 0.
16394 +
16395 +Calibration bandwidth range must be [2.5e6,120e6] Hz.
16396 +-------------------------------------------------------------------------------------------------------------------
16397 +PA PATH
16398 +
16399 +Select active power amplifier path of each channel.
16400 +For LimeSDR-Mini and LimeNET-Micro Auto(Default) option sets preferred PA path depending on RF frequency.
16401 +For LimeSDR-USB and LimeSDR-PCIe Auto(Default) sets PA path to Band1.
16402 +-------------------------------------------------------------------------------------------------------------------
16403 +ANALOG FILTER BANDW.
16404 +
16405 +Enter analog filter bandwidth for each channel. Analog filter is off if bandwidth is set to 0.
16406 +Analog filter bandwidth range must be [5e6,130e6] Hz.
16407 +-------------------------------------------------------------------------------------------------------------------
16408 +DIGITAL FILTER BANDW.
16409 +
16410 +Enter digital filter bandwidth for each channel. Digital filter if off if bandwidth is set to 0.
16411 +Bandwidth should not be higher than sample rate.
16412 +-------------------------------------------------------------------------------------------------------------------
16413 +GAIN
16414 +
16415 +Controls combined TX gain settings. Gain range must be [0,73] dB.
16416 +-------------------------------------------------------------------------------------------------------------------
16417 +FILE
16418 +
16419 +This setting is available in "Advanced" tab of grc block.
16420 +Use .ini file generated by LimeSuiteGUI to configure the device.
16421 +RF frequency, sampling rate, oversampling, filters, gain and antenna settings won't be used from GRC blocks when
16422 +device is started. Runtime variables(RF frequency, gain...) can still be modified when flowgraph is running.
16423 +
16424 +Note: setting must match in LimeSuite Source and Sink for the same device.
16425 +-------------------------------------------------------------------------------------------------------------------
16426 +TCXO DAC
16427 +
16428 +Controls 40 MHz TCXO DAC settings. To enable this parameter "Allow TCXO DAC control" in the "Advanced" tab must be set to "Yes"
16429 +Care must be taken as this parameter is returned to default value only after power off.
16430 +
16431 +LimeSDR-Mini default value is 180 range is [0,255]
16432 +LimeSDR-USB default value is 125 range is [0,255]
16433 +LimeSDR-PCIe default value is 134 range is [0,255]
16434 +LimeNET-Micro default value is 30714 range is [0,65535]
16435 +-------------------------------------------------------------------------------------------------------------------
16436 +</doc>
16437 +</block>
16438 diff --git a/grc/limesdr_source.block.yml b/grc/limesdr_source.block.yml
16439 index 9280ce4..d98742c 100644
16440 --- a/grc/limesdr_source.block.yml
16441 +++ b/grc/limesdr_source.block.yml
16442 @@ -1,363 +1,314 @@
16443 +# auto-generated by grc.converter
16444 +
16445 id: limesdr_source
16446 -label: LimeSDR Source (RX)
16447 -category: '[LimeSDR]'
16448 -flags: throttle
16449 +label: LimeSuite Source (RX)
16450 +category: '[LimeSuite]'
16451 +flags:
16452 +- throttle
16453
16454 parameters:
16455 -- id: serial
16456 - label: Device serial
16457 - dtype: string
16458 - hide: part
16459 - category: General
16460 -
16461 -- id: filename
16462 - label: File
16463 - dtype: file_open
16464 - hide: part
16465 - category: General
16466 -
16467 -- id: channel_mode
16468 - label: Channel
16469 - dtype: enum
16470 - options: ['0', '1', '2']
16471 - option_labels: ['A', 'B', 'A+B']
16472 - default: 0
16473 - hide: part
16474 - category: General
16475 -
16476 -- id: rf_freq
16477 - label: RF frequency
16478 - dtype: float
16479 - default: 100e6
16480 - category: General
16481 -
16482 -- id: samp_rate
16483 - label: Sample rate
16484 - dtype: float
16485 - default: samp_rate
16486 - category: General
16487 -
16488 -- id: oversample
16489 - label: Oversample
16490 - dtype: enum
16491 - options: ['0', '1', '2', '4', '8', '16', '32']
16492 - option_labels: ['Default', '1', '2', '4', '8', '16', '32']
16493 - default: 0
16494 - category: General
16495 -
16496 -- id: nco_freq_ch0
16497 - label: NCO frequency
16498 - dtype: float
16499 - default: 0
16500 - hide: part
16501 - category: Channel A
16502 -
16503 -- id: calibr_bandw_ch0
16504 - label: Calibration bandwidth
16505 - dtype: float
16506 - default: 2.5e6
16507 - hide: part
16508 - category: Channel A
16509 -
16510 -- id: lna_path_ch0
16511 - label: LNA path
16512 - dtype: int
16513 - options: ['1', '2', '3', '255']
16514 - option_labels: ['H', 'L', 'W', 'Auto']
16515 - default: '255'
16516 - hide: part
16517 - category: Channel A
16518 -
16519 -- id: analog_bandw_ch0
16520 - label: Analog filter bandwidth
16521 - dtype: float
16522 - default: 1.5e6
16523 - hide: part
16524 - category: Channel A
16525 -
16526 -- id: digital_bandw_ch0
16527 - label: Digital filter bandwidth
16528 - dtype: float
16529 - default: samp_rate
16530 - hide: part
16531 - category: Channel A
16532 -
16533 -- id: gain_dB_ch0
16534 - label: Gain (dB)
16535 - dtype: int
16536 - default: 1
16537 - hide: part
16538 - category: Channel A
16539 -
16540 -- id: nco_freq_ch1
16541 - label: NCO frequency
16542 - dtype: float
16543 - default: 0
16544 - hide: part
16545 - category: Channel B
16546 -
16547 -- id: calibr_bandw_ch1
16548 - label: Calibration bandwidth
16549 - dtype: float
16550 - default: 2.5e6
16551 - hide: part
16552 - category: Channel B
16553 -
16554 -- id: lna_path_ch1
16555 - label: LNA path
16556 - dtype: int
16557 - options: ['1', '2', '3']
16558 - option_labels: ['H', 'L', 'W']
16559 - default: 2
16560 - hide: part
16561 - category: Channel B
16562 -
16563 -- id: analog_bandw_ch1
16564 - label: Analog filter bandwidth
16565 - dtype: float
16566 - default: 1.5e6
16567 - hide: part
16568 - category: Channel B
16569 -
16570 -- id: digital_bandw_ch1
16571 - label: Digital filter bandwidth
16572 - dtype: float
16573 - default: samp_rate
16574 - hide: part
16575 - category: Channel B
16576 +- id: serial
16577 + label: Device Serial
16578 + dtype: string
16579 + hide: none
16580 +- id: filename
16581 + label: File
16582 + category: Advanced
16583 + dtype: file_open
16584 +- id: channel_mode
16585 + label: Channel
16586 + dtype: int
16587 + default: '0'
16588 + options: ['0', '1', '2']
16589 + option_labels: [A, B, A+B (MIMO)]
16590 + hide: part
16591 +- id: rf_freq
16592 + label: RF Frequency
16593 + dtype: float
16594 + default: 100e6
16595 +- id: samp_rate
16596 + label: Sample Rate
16597 + dtype: float
16598 + default: samp_rate
16599 + hide: ${ 'all' if filename != "" else 'none' }
16600 +- id: oversample
16601 + label: Oversample
16602 + dtype: int
16603 + default: '0'
16604 + options: ['0', '1', '2', '4', '8', '16', '32']
16605 + option_labels: [Default, '1', '2', '4', '8', '16', '32']
16606 + hide: ${ 'all' if filename != "" else 'none' }
16607 +- id: dacVal
16608 + label: TCXO DAC Value
16609 + dtype: int
16610 + default: '125'
16611 + hide: ${ 'all' if allow_tcxo_dac == 0 else 'none' }
16612 +- id: nco_freq_ch0
16613 + label: NCO Frequency
16614 + category: Channel A
16615 + dtype: float
16616 + default: '0'
16617 + hide: ${ 'all' if channel_mode == 1 else 'none' }
16618 +- id: calibr_bandw_ch0
16619 + label: Calibration BW
16620 + category: Channel A
16621 + dtype: float
16622 + default: 5e6
16623 + hide: ${ 'all' if filename != "" or channel_mode == 1 else 'none' }
16624 +- id: lna_path_ch0
16625 + label: LNA Path
16626 + category: Channel A
16627 + dtype: int
16628 + default: '255'
16629 + options: ['255', '1', '2', '3']
16630 + option_labels: [Auto(Default), H, L, W]
16631 + hide: ${ 'all' if channel_mode == 1 else 'none' }
16632 +- id: analog_bandw_ch0
16633 + label: Analog Filter BW
16634 + category: Channel A
16635 + dtype: float
16636 + default: 5e6
16637 + hide: ${ 'all' if channel_mode == 1 else 'none' }
16638 +- id: digital_bandw_ch0
16639 + label: Digital Filter BW
16640 + category: Channel A
16641 + dtype: float
16642 + default: '0'
16643 + hide: ${ 'all' if channel_mode == 1 else 'none' }
16644 +- id: gain_dB_ch0
16645 + label: Gain (dB)
16646 + category: Channel A
16647 + dtype: int
16648 + default: '30'
16649 + hide: ${ 'all' if channel_mode == 1 else 'none' }
16650 +- id: nco_freq_ch1
16651 + label: NCO Frequency
16652 + category: Channel B
16653 + dtype: float
16654 + default: '0'
16655 + hide: ${ 'all' if channel_mode == 0 else 'none' }
16656 +- id: calibr_bandw_ch1
16657 + label: Calibration BW
16658 + category: Channel B
16659 + dtype: float
16660 + default: 5e6
16661 + hide: ${ 'all' if filename != "" or channel_mode == 0 else 'none' }
16662 +- id: lna_path_ch1
16663 + label: LNA Path
16664 + category: Channel B
16665 + dtype: int
16666 + default: '2'
16667 + options: ['1', '2', '3']
16668 + option_labels: [H, L, W]
16669 + hide: ${ 'all' if channel_mode == 0 else 'none' }
16670 +- id: analog_bandw_ch1
16671 + label: Analog Filter BW
16672 + category: Channel B
16673 + dtype: float
16674 + default: 5e6
16675 + hide: ${ 'all' if channel_mode == 0 else 'none' }
16676 +- id: digital_bandw_ch1
16677 + label: Digital Filter BW
16678 + category: Channel B
16679 + dtype: float
16680 + default: '0'
16681 + hide: ${ 'all' if channel_mode == 0 else 'none' }
16682 +- id: gain_dB_ch1
16683 + label: Gain (dB)
16684 + category: Channel B
16685 + dtype: int
16686 + default: '30'
16687 + hide: ${ 'all' if channel_mode == 0 else 'none' }
16688 +- id: allow_tcxo_dac
16689 + label: Allow TCXO DAC Control
16690 + category: Advanced
16691 + dtype: int
16692 + default: '0'
16693 + options: ['1', '0']
16694 + option_labels: ['Yes', 'No']
16695 + hide: part
16696
16697 -- id: gain_dB_ch1
16698 - label: Gain (dB)
16699 - dtype: int
16700 - default: 1
16701 - hide: part
16702 - category: Channel B
16703 -
16704 -- id: allow_tcxo_dac
16705 - label: Allow TCXO DAC control
16706 - dtype: enum
16707 - options: ['0', '1']
16708 - option_labels: ['No', 'Yes']
16709 - default: 0
16710 - hide: part
16711 - category: Advanced
16712 -
16713 -- id: dacVal
16714 - label: TCX0:DAC val
16715 - dtype: int
16716 - default: 180
16717 - hide: part
16718 - category: Advanced
16719 +outputs:
16720 +- domain: stream
16721 + dtype: complex
16722 + multiplicity: ${ channel_mode }
16723 +asserts:
16724 +- ${ channel_mode >= 0 }
16725 +- ${ 2 >= channel_mode }
16726 +- ${ rf_freq > 0 }
16727 +- ${ calibr_bandw_ch0 >= 2.5e6 or calibr_bandw_ch0 == 0 }
16728 +- ${ 120e6 >= calibr_bandw_ch0 }
16729 +- ${ calibr_bandw_ch1 >= 2.5e6 or calibr_bandw_ch1 == 0 }
16730 +- ${ 120e6 >= calibr_bandw_ch1 }
16731 +- ${ analog_bandw_ch0 >= 1.5e6 or analog_bandw_ch0 == 0 }
16732 +- ${ 130e6 >= analog_bandw_ch0 }
16733 +- ${ analog_bandw_ch1 >= 1.5e6 or analog_bandw_ch1 == 0 }
16734 +- ${ 130e6 >= analog_bandw_ch1 }
16735 +- ${ digital_bandw_ch0 >= 0 }
16736 +- ${ samp_rate >= digital_bandw_ch0 or digital_bandw_ch0 == 0 }
16737 +- ${ digital_bandw_ch1 >= 0 }
16738 +- ${ samp_rate >= digital_bandw_ch1 or digital_bandw_ch0 == 0 }
16739 +- ${ gain_dB_ch0 >= 0 }
16740 +- ${ 73 >= gain_dB_ch0 }
16741 +- ${ gain_dB_ch1 >= 0 }
16742 +- ${ 73 >= gain_dB_ch1 }
16743 +- ${ samp_rate > 0 }
16744 +- ${ 61.44e6 >= samp_rate }
16745
16746 templates:
16747 - imports: import limesdr
16748 - make: |-
16749 - limesdr.source(${serial}, ${channel_mode}, ${filename})
16750 + imports: import limesdr
16751 + make: |-
16752 + limesdr.source(${serial}, ${channel_mode}, ${filename})
16753 + % if context.get('filename')() == "":
16754 + self.${id}.set_sample_rate(${samp_rate})
16755 + % if context.get('oversample')() > 0:
16756 + self.${id}.set_oversampling(${oversample})
16757 + % endif
16758 + self.${id}.set_center_freq(${rf_freq}, 0)
16759 + % if context.get('analog_bandw_ch0')() > 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
16760 + self.${id}.set_bandwidth(${analog_bandw_ch0}, 0)
16761 + % endif
16762 + % if context.get('analog_bandw_ch1')() > 0 and context.get('channel_mode')() > 0:
16763 + self.${id}.set_bandwidth(${analog_bandw_ch1}, 1)
16764 + % endif
16765 + % if context.get('digital_bandw_ch0')() > 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
16766 + self.${id}.set_digital_filter(${digital_bandw_ch0},0)
16767 + % endif
16768 + % if context.get('digital_bandw_ch1')() > 0 and context.get('channel_mode')() > 0:
16769 + self.${id}.set_digital_filter(${digital_bandw_ch1},1)
16770 + % endif
16771 + % if context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2:
16772 + self.${id}.set_gain(${gain_dB_ch0},0)
16773 + % endif
16774 + % if context.get('channel_mode')() > 0:
16775 + self.${id}.set_gain(${gain_dB_ch1},1)
16776 + % endif
16777 + % if context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2:
16778 + self.${id}.set_antenna(${lna_path_ch0},0)
16779 + % endif
16780 + % if context.get('channel_mode')() > 0:
16781 + self.${id}.set_antenna(${lna_path_ch1},1)
16782 + % endif
16783 + % if context.get('calibr_bandw_ch0')() > 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
16784 + self.${id}.calibrate(${calibr_bandw_ch0}, 0)
16785 + % endif
16786 + % if context.get('calibr_bandw_ch1')() > 0 and context.get('channel_mode')() > 0:
16787 + self.${id}.calibrate(${calibr_bandw_ch1}, 1)
16788 + % endif
16789 + % if context.get('nco_freq_ch0')() != 0 and (context.get('channel_mode')() == 0 or context.get('channel_mode')() == 2):
16790 + self.${id}.set_nco(${nco_freq_ch0},0)
16791 + % endif
16792 + % if context.get('nco_freq_ch1')() != 0 and context.get('channel_mode')() > 0:
16793 + self.${id}.set_nco(${nco_freq_ch1},1)
16794 + % endif
16795 + % endif
16796 + % if context.get('allow_tcxo_dac')() == 1:
16797 + self.${id}.set_tcxo_dac(${dacVal})
16798 + % endif
16799 + callbacks:
16800 + - set_center_freq(${rf_freq}, 0)
16801 + - set_antenna(${lna_path_ch0},0)
16802 + - set_antenna(${lna_path_ch1},1)
16803 + - set_nco(${nco_freq_ch0},0)
16804 + - set_nco(${nco_freq_ch1},1)
16805 + - set_bandwidth(${analog_bandw_ch0},0)
16806 + - set_bandwidth(${analog_bandw_ch1},1)
16807 + - set_digital_filter(${digital_bandw_ch0},0)
16808 + - set_digital_filter(${digital_bandw_ch1},1)
16809 + - set_gain(${gain_dB_ch0},0)
16810 + - set_gain(${gain_dB_ch1},1)
16811 + - set_tcxo_dac(${dacVal})
16812
16813 - % if filename() == "":
16814 +documentation: |-
16815 + -------------------------------------------------------------------------------------------------------------------
16816 + DEVICE SERIAL
16817
16818 - self.${id}.set_sample_rate(${samp_rate})
16819 -
16820 - % if int(oversample()) > 0:
16821 - self.${id}.set_oversampling(${oversample})
16822 - % endif
16823 + Device serial number obtained by running
16824
16825 - self.${id}.set_center_freq(${rf_freq}, 0)
16826 + LimeUtil --find
16827
16828 - % if analog_bandw_ch0() > 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
16829 - self.${id}.set_bandwidth(${analog_bandw_ch0}, 0)
16830 - % endif
16831 + If left blank, the first device in the list is used.
16832 + -------------------------------------------------------------------------------------------------------------------
16833 + CHANNEL
16834
16835 - % if analog_bandw_ch1() > 0 and int(channel_mode()) > 0:
16836 - self.${id}.set_bandwidth(${analog_bandw_ch1}, 1)
16837 - % endif
16838 + Use this setting to choose between SISO channels or MIMO mode.
16839
16840 - % if digital_bandw_ch0() > 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
16841 - self.${id}.set_digital_filter(${digital_bandw_ch0}, 0)
16842 - % endif
16843 + Note: not all devices support MIMO mode and have more than one channel.
16844 + -------------------------------------------------------------------------------------------------------------------
16845 + RF FREQUENCY
16846
16847 - % if digital_bandw_ch1() > 0 and int(channel_mode()) > 0:
16848 - self.${id}.set_digital_filter(${digital_bandw_ch1}, 1)
16849 - % endif
16850 + Set RF center frequency for RX (both channels).
16851 + LimeSDR-USB supports [100e3,3800e6] Hz.
16852 + LimeSDR-PCIe supports [100e3,3800e6] Hz.
16853 + LimeSDR-Mini supports [10e6,3500e6] Hz.
16854 + LimeSDR-Micro supports [10e6,3500e6] Hz.
16855 + -------------------------------------------------------------------------------------------------------------------
16856 + SAMPLE RATE
16857
16858 - % if int(channel_mode()) == 0 or int(channel_mode()) == 2:
16859 - self.${id}.set_gain(${gain_dB_ch0}, 0)
16860 - % endif
16861 + Here you can enter sample rate for RX.
16862
16863 - % if int(channel_mode()) > 0:
16864 - self.${id}.set_gain(${gain_dB_ch1}, 1)
16865 - % endif
16866 + LimeSDR-USB sample rate must be no more than 61.44e6 S/s.
16867 + LimeSDR-PCIe sample rate must be no more than 61.44e6 S/s.
16868 + LimeSDR-Mini sample rate must be no more than 30.72e6 S/s.
16869 + LimeSDR-Micro sample rate must be no more than 10e6 S/s.
16870
16871 - % if int(channel_mode()) == 0 or int(channel_mode()) == 2:
16872 - self.${id}.set_antenna(${lna_path_ch0}, 0)
16873 - % endif
16874 + Note: LimeSDR-Mini and LimeSDR-Micro supports only the same sample rate for TX and RX.
16875 + -------------------------------------------------------------------------------------------------------------------
16876 + OVERSAMPLE
16877
16878 - % if int(channel_mode()) > 0:
16879 - self.${id}.set_antenna(${lna_path_ch1}, 1)
16880 - % endif
16881 + Here you can select oversampling value for RX. Default value uses highest possible oversampling value.
16882
16883 - % if calibr_bandw_ch0() > 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
16884 - self.${id}.calibrate(${calibr_bandw_ch0}, 0)
16885 - % endif
16886 + Note: LimeSDR-Mini and LimeSDR-Micro supports only the same oversampling value for TX and RX.
16887 + -------------------------------------------------------------------------------------------------------------------
16888 + NCO FREQUENCY
16889
16890 - % if calibr_bandw_ch1() > 0 and int(channel_mode()) > 0:
16891 - self.${id}.calibrate(${calibr_bandw_ch1}, 1)
16892 - % endif
16893 + Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF.
16894 + -------------------------------------------------------------------------------------------------------------------
16895 + CALIBRATION BANDW.
16896
16897 - % if nco_freq_ch0() != 0 and (int(channel_mode()) == 0 or int(channel_mode()) == 2):
16898 - self.${id}.set_nco(${nco_freq_ch0},0)
16899 - % endif
16900 + This setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth.
16901 + Calibration is off when bandwidth is set to 0.
16902
16903 - % if nco_freq_ch1() != 0 and int(channel_mode()) > 0:
16904 - self.${id}.set_nco(${nco_freq_ch1}, 1)
16905 - % endif
16906 + Calibration bandwidth range must be [2.5e6,120e6] Hz.
16907 + -------------------------------------------------------------------------------------------------------------------
16908 + LNA PATH
16909
16910 - % endif # if filename() == ""
16911 -
16912 - % if int(allow_tcxo_dac) == 1:
16913 - self.${id}.set_tcxo_dac(${dacVal})
16914 - % endif
16915 + Select active low-noise amplifier path of each channel.
16916 + For LimeSDR-Mini and LimeNET-Micro Auto(Default) option sets preferred LNA path depending on RF frequency.
16917 + For LimeSDR-USB and LimeSDR-PCIe Auto(Default) sets LNA path to LNAL.
16918 + -------------------------------------------------------------------------------------------------------------------
16919 + ANALOG FILTER BANDW.
16920
16921 - callbacks:
16922 - - set_center_freq(${rf_freq}, 0)
16923 - - set_antenna(${lna_path_ch0}, 0)
16924 - - set_antenna(${lna_path_ch1}, 1)
16925 - - set_nco(${nco_freq_ch0}, 0)
16926 - - set_nco(${nco_freq_ch1}, 1)
16927 - - set_bandwidth(${analog_bandw_ch0}, 0)
16928 - - set_bandwidth(${analog_bandw_ch1}, 1)
16929 - - set_digital_filter(${digital_bandw_ch0}, 0)
16930 - - set_digital_filter(${digital_bandw_ch1}, 1)
16931 - - set_gain(${gain_dB_ch0}, 0)
16932 - - set_gain(${gain_dB_ch1}, 1)
16933 - - set_tcxo_dac(${dacVal})
16934 + Enter analog filter bandwidth for each channel. Analog filter is off if bandwidth is set to 0.
16935 + Analog filter bandwidth range must be [1.5e6,130e6] Hz.
16936 + -------------------------------------------------------------------------------------------------------------------
16937 + DIGITAL FILTER BANDW.
16938
16939 -asserts:
16940 -- ${ int(channel_mode) >= 0 }
16941 -- ${ 2 >= int(channel_mode) }
16942 + Enter digital filter bandwidth for each channel. Digital filter if off if bandwidth is set to 0.
16943 + Bandwidth should not be higher than sample rate.
16944 + -------------------------------------------------------------------------------------------------------------------
16945 + GAIN
16946
16947 -- ${ rf_freq > 0 }
16948 + Controls combined RX gain settings. Gain range must be [0,73] dB.
16949 + -------------------------------------------------------------------------------------------------------------------
16950 + FILE
16951
16952 -- ${ calibr_bandw_ch0 >= 2.5e6 or calibr_bandw_ch0 == 0 }
16953 -- ${ 120e6 >= calibr_bandw_ch0 }
16954 + This setting is available in "Advanced" tab of grc block.
16955 + Use .ini file generated by LimeSuiteGUI to configure the device.
16956 + RF frequency, sampling rate, oversampling, filters, gain and antenna settings won't be used from GRC blocks when
16957 + device is started. Runtime variables(RF frequency, gain...) can still be modified when flowgraph is running.
16958
16959 -- ${ calibr_bandw_ch1 >= 2.5e6 or calibr_bandw_ch1 == 0 }
16960 -- ${ 120e6 >= calibr_bandw_ch1 }
16961 + Note: setting must match in LimeSuite Source and Sink for the same device.
16962 + -------------------------------------------------------------------------------------------------------------------
16963 + TCXO DAC
16964
16965 -- ${ analog_bandw_ch0 >= 1.5e6 or analog_bandw_ch0 == 0 }
16966 -- ${ 130e6 >= analog_bandw_ch0 }
16967 + Controls 40 MHz TCXO DAC settings. To enable this parameter "Allow TCXO DAC control" in the "Advanced" tab must be set to "Yes"
16968 + Care must be taken as this parameter is returned to default value only after power off.
16969
16970 -- ${ analog_bandw_ch1 >= 1.5e6 or analog_bandw_ch1 == 0 }
16971 -- ${ 130e6 >= analog_bandw_ch1 }
16972 -
16973 -- ${ digital_bandw_ch0 >= 0 }
16974 -- ${ samp_rate >= digital_bandw_ch0 or digital_bandw_ch0 == 0 }
16975 -
16976 -- ${ digital_bandw_ch1 >= 0 }
16977 -- ${ samp_rate >= digital_bandw_ch1 or digital_bandw_ch0 == 0 }
16978 -
16979 -- ${ gain_dB_ch0 >= 0 }
16980 -- ${ 70 >= gain_dB_ch0 }
16981 -
16982 -- ${ gain_dB_ch1 >= 0 }
16983 -- ${ 70 >= gain_dB_ch1 }
16984 -
16985 -- ${ samp_rate > 0 }
16986 -- ${ 61.44e6 >= samp_rate }
16987 -
16988 -outputs:
16989 -- label: out
16990 - domain: stream
16991 - dtype: complex
16992 - multiplicity: ${ (2 if int(channel_mode) == 2 else 1) }
16993 + LimeSDR-Mini default value is 180 range is [0,255]
16994 + LimeSDR-USB default value is 125 range is [0,255]
16995 + LimeSDR-PCIe default value is 134 range is [0,255]
16996 + LimeNET-Micro default value is 30714 range is [0,65535]
16997 + -------------------------------------------------------------------------------------------------------------------
16998
16999 file_format: 1
17000 -
17001 -documentation: |-
17002 - -------------------------------------------------------------------------------------------------------------------
17003 - DEVICE SERIAL
17004 -
17005 - Device serial number obtained by running
17006 -
17007 - LimeUtil --find
17008 -
17009 - If left blank, the first device in the list is used.
17010 - -------------------------------------------------------------------------------------------------------------------
17011 - CHANNEL
17012 -
17013 - Use this setting to choose between SISO channels or MIMO mode.
17014 -
17015 - Note: not all devices support MIMO mode and have more than one channel.
17016 - -------------------------------------------------------------------------------------------------------------------
17017 - FILE
17018 -
17019 - Generate .ini file with LimeSuite and select path.
17020 -
17021 - Note: setting must match in LimeSuite Source and Sink for the same device.
17022 - -------------------------------------------------------------------------------------------------------------------
17023 - RF FREQUENCY
17024 -
17025 - Set RF center frequency for RX (both channels).
17026 - LimeSDR-USB supports [100e3,3800e6] Hz.
17027 - LimeSDR-PCIe supports [100e3,3800e6] Hz.
17028 - LimeSDR-Mini supports [10e6,3500e6] Hz.
17029 - LimeSDR-Micro supports [10e6,3500e6] Hz.
17030 - -------------------------------------------------------------------------------------------------------------------
17031 - SAMPLE RATE
17032 -
17033 - Here you can enter sample rate for RX.
17034 -
17035 - LimeSDR-USB sample rate must be no more than 61.44e6 S/s.
17036 - LimeSDR-PCIe sample rate must be no more than 61.44e6 S/s.
17037 - LimeSDR-Mini sample rate must be no more than 30.72e6 S/s.
17038 - LimeSDR-Micro sample rate must be no more than 10e6 S/s.
17039 -
17040 - Note: LimeSDR-Mini and LimeSDR-Micro supports only the same sample rate for TX and RX.
17041 - -------------------------------------------------------------------------------------------------------------------
17042 - OVERSAMPLE
17043 -
17044 - Here you can select oversampling value for RX. Default value uses highest possible oversampling value.
17045 -
17046 - Note: LimeSDR-Mini and LimeSDR-Micro supports only the same oversampling value for TX and RX.
17047 - -------------------------------------------------------------------------------------------------------------------
17048 - NCO FREQUENCY
17049 -
17050 - Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF.
17051 - -------------------------------------------------------------------------------------------------------------------
17052 - CALIBRATION BANDW.
17053 -
17054 - This setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth.
17055 - Calibration is off when bandwidth is set to 0.
17056 -
17057 - Calibration bandwidth range must be [2.5e6,120e6] Hz.
17058 - -------------------------------------------------------------------------------------------------------------------
17059 - LNA PATH
17060 -
17061 - Select active low-noise amplifier path of each channel.
17062 - For LimeSDR-Mini and LimeNET-Micro Auto(Default) option sets preferred LNA path depending on RF frequency.
17063 - For LimeSDR-USB and LimeSDR-PCIe Auto(Default) sets LNA path to LNAL.
17064 - -------------------------------------------------------------------------------------------------------------------
17065 - ANALOG FILTER BANDW.
17066 -
17067 - Enter analog filter bandwidth for each channel. Analog filter is off if bandwidth is set to 0.
17068 - Analog filter bandwidth range must be [1.5e6,130e6] Hz.
17069 - -------------------------------------------------------------------------------------------------------------------
17070 - DIGITAL FILTER BANDW.
17071 -
17072 - Enter digital filter bandwidth for each channel. Digital filter if off if bandwidth is set to 0.
17073 - Bandwidth should not be higher than sample rate.
17074 - -------------------------------------------------------------------------------------------------------------------
17075 - GAIN
17076 -
17077 - Controls combined RX gain settings. Gain range must be [0,70] dB.
17078 - -------------------------------------------------------------------------------------------------------------------
17079 - TCXO DAC
17080 -
17081 - Controls 40 MHz TCXO DAC settings. To enable this parameter "Allow TCXO DAC control" in the "Advanced" tab must be set to "Yes"
17082 - Care must be taken as this parameter is returned to default value only after power off.
17083 -
17084 - LimeSDR-Mini default value is 180 range is [0,255]
17085 - LimeSDR-USB default value is 125 range is [0,255]
17086 - LimeSDR-PCIe default value is 134 range is [0,255]
17087 - LimeNET-Micro default value is 30714 range is [0,65535]
17088 - -------------------------------------------------------------------------------------------------------------------
17089 diff --git a/grc/limesdr_source.xml b/grc/limesdr_source.xml
17090 new file mode 100755
17091 index 0000000..ae9b13e
17092 --- /dev/null
17093 +++ b/grc/limesdr_source.xml
17094 @@ -0,0 +1,549 @@
17095 +<?xml version="1.0"?>
17096 +<block>
17097 + <name>LimeSuite Source (RX)</name>
17098 + <key>limesdr_source</key>
17099 + <category>[LimeSuite]</category>
17100 + <flags>throttle</flags>
17101 + <import>import limesdr</import>
17102 + <make>limesdr.source($serial, $channel_mode, $filename)
17103 +#if $filename() == ""
17104 +self.$(id).set_sample_rate($samp_rate)
17105 +#if $oversample() > 0
17106 +self.$(id).set_oversampling($oversample)
17107 +#end if
17108 +self.$(id).set_center_freq($rf_freq, 0)
17109 +#if $analog_bandw_ch0() > 0 and ($channel_mode() == 0 or $channel_mode() == 2)
17110 +self.$(id).set_bandwidth($analog_bandw_ch0,0)
17111 +#end if
17112 +#if $analog_bandw_ch1() > 0 and $channel_mode() > 0
17113 +self.$(id).set_bandwidth($analog_bandw_ch1,1)
17114 +#end if
17115 +#if $digital_bandw_ch0() > 0 and ($channel_mode() == 0 or $channel_mode() == 2)
17116 +self.$(id).set_digital_filter($digital_bandw_ch0,0)
17117 +#end if
17118 +#if $digital_bandw_ch1() > 0 and $channel_mode() > 0
17119 +self.$(id).set_digital_filter($digital_bandw_ch1,1)
17120 +#end if
17121 +#if $channel_mode() == 0 or $channel_mode() == 2
17122 +self.$(id).set_gain($gain_dB_ch0,0)
17123 +#end if
17124 +#if $channel_mode() > 0
17125 +self.$(id).set_gain($gain_dB_ch1,1)
17126 +#end if
17127 +#if $channel_mode() == 0 or $channel_mode() == 2
17128 +self.$(id).set_antenna($lna_path_ch0,0)
17129 +#end if
17130 +#if $channel_mode() > 0
17131 +self.$(id).set_antenna($lna_path_ch1,1)
17132 +#end if
17133 +#if $calibr_bandw_ch0() > 0 and ($channel_mode() == 0 or $channel_mode() == 2)
17134 +self.$(id).calibrate($calibr_bandw_ch0, 0)
17135 +#end if
17136 +#if $calibr_bandw_ch1() > 0 and $channel_mode() > 0
17137 +self.$(id).calibrate($calibr_bandw_ch1, 1)
17138 +#end if
17139 +#if $nco_freq_ch0() != 0 and ($channel_mode() == 0 or $channel_mode() == 2)
17140 +self.$(id).set_nco($nco_freq_ch0,0)
17141 +#end if
17142 +#if $nco_freq_ch1() != 0 and $channel_mode() > 0
17143 +self.$(id).set_nco($nco_freq_ch1,1)
17144 +#end if
17145 +#end if
17146 +#if $allow_tcxo_dac() == 1
17147 +self.$(id).set_tcxo_dac($dacVal)
17148 +#end if
17149 + </make>
17150 +
17151 + <callback>set_center_freq($rf_freq, 0)</callback>
17152 + <callback>set_antenna($lna_path_ch0,0)</callback>
17153 + <callback>set_antenna($lna_path_ch1,1)</callback>
17154 + <callback>set_nco($nco_freq_ch0,0)</callback>
17155 + <callback>set_nco($nco_freq_ch1,1)</callback>
17156 + <callback>set_bandwidth($analog_bandw_ch0,0)</callback>
17157 + <callback>set_bandwidth($analog_bandw_ch1,1)</callback>
17158 + <callback>set_digital_filter($digital_bandw_ch0,0)</callback>
17159 + <callback>set_digital_filter($digital_bandw_ch1,1)</callback>
17160 + <callback>set_gain($gain_dB_ch0,0)</callback>
17161 + <callback>set_gain($gain_dB_ch1,1)</callback>
17162 + <callback>set_tcxo_dac($dacVal)</callback>
17163 +
17164 + <param_tab_order>
17165 + <tab>General</tab>
17166 + <tab>Channel A</tab>
17167 + <tab>Channel B</tab>
17168 + </param_tab_order>
17169 +
17170 + <param>
17171 + <name>Device Serial</name>
17172 + <key>serial</key>
17173 + <value></value>
17174 + <type>string</type>
17175 + <hide>none</hide>
17176 + </param>
17177 +
17178 + <param>
17179 + <name>File</name>
17180 + <key>filename</key>
17181 + <value></value>
17182 + <type>file_open</type>
17183 + <tab>Advanced</tab>
17184 + </param>
17185 +
17186 + <param>
17187 + <name>Channel</name>
17188 + <key>channel_mode</key>
17189 + <value>0</value>
17190 + <type>int</type>
17191 + <option>
17192 + <name>A</name>
17193 + <key>0</key>
17194 + </option>
17195 + <option>
17196 + <name>B</name>
17197 + <key>1</key>
17198 + </option>
17199 + <option>
17200 + <name>A+B (MIMO)</name>
17201 + <key>2</key>
17202 + </option>
17203 + </param>
17204 +
17205 + <param>
17206 + <name>RF Frequency</name>
17207 + <key>rf_freq</key>
17208 + <value>100e6</value>
17209 + <type>float</type>
17210 + </param>
17211 +
17212 + <param>
17213 + <name>Sample Rate</name>
17214 + <key>samp_rate</key>
17215 + <value>samp_rate</value>
17216 + <type>float</type>
17217 + <hide>
17218 + #if $filename() != ""
17219 + all
17220 + #else
17221 + none
17222 + #end if
17223 + </hide>
17224 + </param>
17225 +
17226 + <param>
17227 + <name>Oversample</name>
17228 + <key>oversample</key>
17229 + <value>0</value>
17230 + <type>int</type>
17231 + <hide>
17232 + #if $filename() != ""
17233 + all
17234 + #else
17235 + none
17236 + #end if
17237 + </hide>
17238 + <option>
17239 + <name>Default</name>
17240 + <key>0</key>
17241 + </option>
17242 + <option>
17243 + <name>1</name>
17244 + <key>1</key>
17245 + </option>
17246 + <option>
17247 + <name>2</name>
17248 + <key>2</key>
17249 + </option>
17250 + <option>
17251 + <name>4</name>
17252 + <key>4</key>
17253 + </option>
17254 + <option>
17255 + <name>8</name>
17256 + <key>8</key>
17257 + </option>
17258 + <option>
17259 + <name>16</name>
17260 + <key>16</key>
17261 + </option>
17262 + <option>
17263 + <name>32</name>
17264 + <key>32</key>
17265 + </option>
17266 + </param>
17267 +
17268 + <param>
17269 + <name>TCXO DAC Value</name>
17270 + <key>dacVal</key>
17271 + <value>125</value>
17272 + <type>int</type>
17273 + <hide>
17274 + #if $allow_tcxo_dac() == 0
17275 + all
17276 + #else
17277 + none
17278 + #end if
17279 + </hide>
17280 + </param>
17281 +
17282 + <param>
17283 + <name>NCO Frequency</name>
17284 + <key>nco_freq_ch0</key>
17285 + <value>0</value>
17286 + <type>float</type>
17287 + <hide>
17288 + #if $channel_mode() == 1
17289 + all
17290 + #else
17291 + none
17292 + #end if
17293 + </hide>
17294 + <tab>Channel A</tab>
17295 + </param>
17296 +
17297 + <param>
17298 + <name>Calibration BW</name>
17299 + <key>calibr_bandw_ch0</key>
17300 + <value>5e6</value>
17301 + <type>float</type>
17302 + <hide>
17303 + #if $filename() != ""
17304 + all
17305 + #else if $channel_mode() == 1
17306 + all
17307 + #else
17308 + none
17309 + #end if
17310 + </hide>
17311 + <tab>Channel A</tab>
17312 + </param>
17313 + <param>
17314 + <name>LNA Path</name>
17315 + <key>lna_path_ch0</key>
17316 + <value>255</value>
17317 + <type>int</type>
17318 + <hide>
17319 + #if $channel_mode() == 1
17320 + all
17321 + #else
17322 + none
17323 + #end if
17324 + </hide>
17325 + <option>
17326 + <name>Auto(Default)</name>
17327 + <key>255</key>
17328 + </option>
17329 + <option>
17330 + <name>H</name>
17331 + <key>1</key>
17332 + </option>
17333 + <option>
17334 + <name>L</name>
17335 + <key>2</key>
17336 + </option>
17337 + <option>
17338 + <name>W</name>
17339 + <key>3</key>
17340 + </option>
17341 + <tab>Channel A</tab>
17342 + </param>
17343 +
17344 + <param>
17345 + <name>Analog Filter BW</name>
17346 + <key>analog_bandw_ch0</key>
17347 + <value>5e6</value>
17348 + <type>float</type>
17349 + <hide>
17350 + #if $channel_mode() == 1
17351 + all
17352 + #else
17353 + none
17354 + #end if
17355 + </hide>
17356 + <tab>Channel A</tab>
17357 + </param>
17358 +
17359 + <param>
17360 + <name>Digital Filter BW</name>
17361 + <key>digital_bandw_ch0</key>
17362 + <value>0</value>
17363 + <type>float</type>
17364 + <hide>
17365 + #if $channel_mode() == 1
17366 + all
17367 + #else
17368 + none
17369 + #end if
17370 + </hide>
17371 + <tab>Channel A</tab>
17372 + </param>
17373 +
17374 + <param>
17375 + <name>Gain (dB)</name>
17376 + <key>gain_dB_ch0</key>
17377 + <value>30</value>
17378 + <type>int</type>
17379 + <hide>
17380 + #if $channel_mode() == 1
17381 + all
17382 + #else
17383 + none
17384 + #end if
17385 + </hide>
17386 + <tab>Channel A</tab>
17387 + </param>
17388 +
17389 + <param>
17390 + <name>NCO Frequency</name>
17391 + <key>nco_freq_ch1</key>
17392 + <value>0</value>
17393 + <type>float</type>
17394 + <hide>
17395 + #if $channel_mode() == 0
17396 + all
17397 + #else
17398 + none
17399 + #end if
17400 + </hide>
17401 + <tab>Channel B</tab>
17402 + </param>
17403 +
17404 + <param>
17405 + <name>Calibration BW</name>
17406 + <key>calibr_bandw_ch1</key>
17407 + <value>5e6</value>
17408 + <type>float</type>
17409 + <hide>
17410 + #if $channel_mode() == 0
17411 + all
17412 + #else if $filename() != ""
17413 + all
17414 + #else
17415 + none
17416 + #end if
17417 + </hide>
17418 + <tab>Channel B</tab>
17419 + </param>
17420 +
17421 + <param>
17422 + <name>LNA Path</name>
17423 + <key>lna_path_ch1</key>
17424 + <value>2</value>
17425 + <type>int</type>
17426 + <hide>
17427 + #if $channel_mode() == 0
17428 + all
17429 + #else
17430 + none
17431 + #end if
17432 + </hide>
17433 + <option>
17434 + <name>H</name>
17435 + <key>1</key>
17436 + </option>
17437 + <option>
17438 + <name>L</name>
17439 + <key>2</key>
17440 + </option>
17441 + <option>
17442 + <name>W</name>
17443 + <key>3</key>
17444 + </option>
17445 + <tab>Channel B</tab>
17446 + </param>
17447 +
17448 + <param>
17449 + <name>Analog Filter BW</name>
17450 + <key>analog_bandw_ch1</key>
17451 + <value>5e6</value>
17452 + <type>float</type>
17453 + <hide>
17454 + #if $channel_mode() == 0
17455 + all
17456 + #else
17457 + none
17458 + #end if
17459 + </hide>
17460 + <tab>Channel B</tab>
17461 + </param>
17462 +
17463 + <param>
17464 + <name>Digital Filter BW</name>
17465 + <key>digital_bandw_ch1</key>
17466 + <value>0</value>
17467 + <type>float</type>
17468 + <hide>
17469 + #if $channel_mode() == 0
17470 + all
17471 + #else
17472 + none
17473 + #end if
17474 + </hide>
17475 + <tab>Channel B</tab>
17476 + </param>
17477 +
17478 + <param>
17479 + <name>Gain (dB)</name>
17480 + <key>gain_dB_ch1</key>
17481 + <value>30</value>
17482 + <type>int</type>
17483 + <hide>
17484 + #if $channel_mode() == 0
17485 + all
17486 + #else
17487 + none
17488 + #end if
17489 + </hide>
17490 + <tab>Channel B</tab>
17491 + </param>
17492 +
17493 + <param>
17494 + <name>Allow TCXO DAC Control</name>
17495 + <key>allow_tcxo_dac</key>
17496 + <value>0</value>
17497 + <type>int</type>
17498 + <hide>part</hide>
17499 + <option>
17500 + <name>Yes</name>
17501 + <key>1</key>
17502 + </option>
17503 + <option>
17504 + <name>No</name>
17505 + <key>0</key>
17506 + </option>
17507 + <tab>Advanced</tab>
17508 + </param>
17509 +
17510 + <check> $channel_mode >= 0 </check>
17511 + <check> 2 >= $channel_mode </check>
17512 +
17513 + <check> $rf_freq > 0 </check>
17514 +
17515 + <check> $calibr_bandw_ch0 >= 2.5e6 or $calibr_bandw_ch0 == 0</check>
17516 + <check> 120e6 >= $calibr_bandw_ch0</check>
17517 +
17518 + <check> $calibr_bandw_ch1 >= 2.5e6 or $calibr_bandw_ch1 == 0 </check>
17519 + <check> 120e6 >= $calibr_bandw_ch1</check>
17520 +
17521 + <check> $analog_bandw_ch0 >= 1.5e6 or $analog_bandw_ch0 == 0 </check>
17522 + <check> 130e6 >= $analog_bandw_ch0</check>
17523 +
17524 + <check> $analog_bandw_ch1 >= 1.5e6 or $analog_bandw_ch1 == 0</check>
17525 + <check> 130e6 >= $analog_bandw_ch1</check>
17526 +
17527 + <check> $digital_bandw_ch0 >= 0 </check>
17528 + <check> $samp_rate >= $digital_bandw_ch0 or $digital_bandw_ch0 == 0 </check>
17529 +
17530 + <check> $digital_bandw_ch1 >= 0 </check>
17531 + <check> $samp_rate >= $digital_bandw_ch1 or $digital_bandw_ch0 == 0 </check>
17532 +
17533 + <check> $gain_dB_ch0 >= 0 </check>
17534 + <check> 73 >= $gain_dB_ch0 </check>
17535 +
17536 + <check> $gain_dB_ch1 >= 0 </check>
17537 + <check> 73 >= $gain_dB_ch1 </check>
17538 +
17539 + <check> $samp_rate > 0 </check>
17540 + <check> 61.44e6 >= $samp_rate </check>
17541 +
17542 + <!--<check> $txco_dac >= 0 </check>
17543 + <check> 255 > $tcxo_dac </check>-->
17544 +
17545 + <source>
17546 + <name>out</name>
17547 + <type>complex</type>
17548 + <nports>$channel_mode</nports>
17549 + </source>
17550 +
17551 +<doc>
17552 +-------------------------------------------------------------------------------------------------------------------
17553 +DEVICE SERIAL
17554 +
17555 +Device serial number obtained by running
17556 +
17557 + LimeUtil --find
17558 +
17559 +If left blank, the first device in the list is used.
17560 +-------------------------------------------------------------------------------------------------------------------
17561 +CHANNEL
17562 +
17563 +Use this setting to choose between SISO channels or MIMO mode.
17564 +
17565 +Note: not all devices support MIMO mode and have more than one channel.
17566 +-------------------------------------------------------------------------------------------------------------------
17567 +RF FREQUENCY
17568 +
17569 +Set RF center frequency for RX (both channels).
17570 +LimeSDR-USB supports [100e3,3800e6] Hz.
17571 +LimeSDR-PCIe supports [100e3,3800e6] Hz.
17572 +LimeSDR-Mini supports [10e6,3500e6] Hz.
17573 +LimeSDR-Micro supports [10e6,3500e6] Hz.
17574 +-------------------------------------------------------------------------------------------------------------------
17575 +SAMPLE RATE
17576 +
17577 +Here you can enter sample rate for RX.
17578 +
17579 +LimeSDR-USB sample rate must be no more than 61.44e6 S/s.
17580 +LimeSDR-PCIe sample rate must be no more than 61.44e6 S/s.
17581 +LimeSDR-Mini sample rate must be no more than 30.72e6 S/s.
17582 +LimeSDR-Micro sample rate must be no more than 10e6 S/s.
17583 +
17584 +Note: LimeSDR-Mini and LimeSDR-Micro supports only the same sample rate for TX and RX.
17585 +-------------------------------------------------------------------------------------------------------------------
17586 +OVERSAMPLE
17587 +
17588 +Here you can select oversampling value for RX. Default value uses highest possible oversampling value.
17589 +
17590 +Note: LimeSDR-Mini and LimeSDR-Micro supports only the same oversampling value for TX and RX.
17591 +-------------------------------------------------------------------------------------------------------------------
17592 +NCO FREQUENCY
17593 +
17594 +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF.
17595 +-------------------------------------------------------------------------------------------------------------------
17596 +CALIBRATION BANDW.
17597 +
17598 +This setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth.
17599 +Calibration is off when bandwidth is set to 0.
17600 +
17601 +Calibration bandwidth range must be [2.5e6,120e6] Hz.
17602 +-------------------------------------------------------------------------------------------------------------------
17603 +LNA PATH
17604 +
17605 +Select active low-noise amplifier path of each channel.
17606 +For LimeSDR-Mini and LimeNET-Micro Auto(Default) option sets preferred LNA path depending on RF frequency.
17607 +For LimeSDR-USB and LimeSDR-PCIe Auto(Default) sets LNA path to LNAL.
17608 +-------------------------------------------------------------------------------------------------------------------
17609 +ANALOG FILTER BANDW.
17610 +
17611 +Enter analog filter bandwidth for each channel. Analog filter is off if bandwidth is set to 0.
17612 +Analog filter bandwidth range must be [1.5e6,130e6] Hz.
17613 +-------------------------------------------------------------------------------------------------------------------
17614 +DIGITAL FILTER BANDW.
17615 +
17616 +Enter digital filter bandwidth for each channel. Digital filter if off if bandwidth is set to 0.
17617 +Bandwidth should not be higher than sample rate.
17618 +-------------------------------------------------------------------------------------------------------------------
17619 +GAIN
17620 +
17621 +Controls combined RX gain settings. Gain range must be [0,73] dB.
17622 +-------------------------------------------------------------------------------------------------------------------
17623 +FILE
17624 +
17625 +This setting is available in "Advanced" tab of grc block.
17626 +Use .ini file generated by LimeSuiteGUI to configure the device.
17627 +RF frequency, sampling rate, oversampling, filters, gain and antenna settings won't be used from GRC blocks when
17628 +device is started. Runtime variables(RF frequency, gain...) can still be modified when flowgraph is running.
17629 +
17630 +Note: setting must match in LimeSuite Source and Sink for the same device.
17631 +-------------------------------------------------------------------------------------------------------------------
17632 +TCXO DAC
17633 +
17634 +Controls 40 MHz TCXO DAC settings. To enable this parameter "Allow TCXO DAC control" in the "Advanced" tab must be set to "Yes"
17635 +Care must be taken as this parameter is returned to default value only after power off.
17636 +
17637 +LimeSDR-Mini default value is 180 range is [0,255]
17638 +LimeSDR-USB default value is 125 range is [0,255]
17639 +LimeSDR-PCIe default value is 134 range is [0,255]
17640 +LimeNET-Micro default value is 30714 range is [0,65535]
17641 +-------------------------------------------------------------------------------------------------------------------
17642 +</doc>
17643 +</block>
17644 \ No newline at end of file
17645 diff --git a/include/limesdr/CMakeLists.txt b/include/limesdr/CMakeLists.txt
17646 index 8197333..79db477 100644
17647 --- a/include/limesdr/CMakeLists.txt
17648 +++ b/include/limesdr/CMakeLists.txt
17649 @@ -3,26 +3,19 @@
17650 # This file was generated by gr_modtool, a tool from the GNU Radio framework
17651 # This file is a part of gr-limesdr
17652 #
17653 -# GNU Radio is free software; you can redistribute it and/or modify
17654 -# it under the terms of the GNU General Public License as published by
17655 -# the Free Software Foundation; either version 3, or (at your option)
17656 -# any later version.
17657 +# SPDX-License-Identifier: GPL-3.0-or-later
17658 #
17659 -# GNU Radio is distributed in the hope that it will be useful,
17660 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
17661 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17662 -# GNU General Public License for more details.
17663 -#
17664 -# You should have received a copy of the GNU General Public License
17665 -# along with GNU Radio; see the file COPYING. If not, write to
17666 -# the Free Software Foundation, Inc., 51 Franklin Street,
17667 -# Boston, MA 02110-1301, USA.
17668
17669 ########################################################################
17670 # Install public header files
17671 ########################################################################
17672 install(FILES
17673 api.h
17674 + sink.h
17675 source.h
17676 - sink.h DESTINATION include/limesdr
17677 + DESTINATION include/limesdr
17678 )
17679 +if(ENABLE_RFE)
17680 + install(FILES rfe.h DESTINATION include/limesdr
17681 + )
17682 +endif()
17683 diff --git a/include/limesdr/api.h b/include/limesdr/api.h
17684 index 38ea315..82d99e3 100644
17685 --- a/include/limesdr/api.h
17686 +++ b/include/limesdr/api.h
17687 @@ -1,23 +1,11 @@
17688 /*
17689 - * Copyright 2019 Lime Microsystems <info@limemicro.com>
17690 + * Copyright 2011 Free Software Foundation, Inc.
17691 *
17692 * This file was generated by gr_modtool, a tool from the GNU Radio framework
17693 * This file is a part of gr-limesdr
17694 *
17695 - * GNU Radio is free software; you can redistribute it and/or modify
17696 - * it under the terms of the GNU General Public License as published by
17697 - * the Free Software Foundation; either version 3, or (at your option)
17698 - * any later version.
17699 + * SPDX-License-Identifier: GPL-3.0-or-later
17700 *
17701 - * GNU Radio is distributed in the hope that it will be useful,
17702 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
17703 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17704 - * GNU General Public License for more details.
17705 - *
17706 - * You should have received a copy of the GNU General Public License
17707 - * along with GNU Radio; see the file COPYING. If not, write to
17708 - * the Free Software Foundation, Inc., 51 Franklin Street,
17709 - * Boston, MA 02110-1301, USA.
17710 */
17711
17712 #ifndef INCLUDED_LIMESDR_API_H
17713 diff --git a/include/limesdr/rfe.h b/include/limesdr/rfe.h
17714 new file mode 100644
17715 index 0000000..0a63f2f
17716 --- /dev/null
17717 +++ b/include/limesdr/rfe.h
17718 @@ -0,0 +1,124 @@
17719 +/* -*- c++ -*- */
17720 +/*
17721 + * Copyright 2020 Lime Microsystems <info@limemicro.com>
17722 + *
17723 + * This is free software; you can redistribute it and/or modify
17724 + * it under the terms of the GNU General Public License as published by
17725 + * the Free Software Foundation; either version 3, or (at your option)
17726 + * any later version.
17727 + *
17728 + * This software is distributed in the hope that it will be useful,
17729 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
17730 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17731 + * GNU General Public License for more details.
17732 + *
17733 + * You should have received a copy of the GNU General Public License
17734 + * along with this software; see the file COPYING. If not, write to
17735 + * the Free Software Foundation, Inc., 51 Franklin Street,
17736 + * Boston, MA 02110-1301, USA.
17737 + */
17738 +
17739 +#ifndef INCLUDED_LIMERFE_H
17740 +#define INCLUDED_LIMERFE_H
17741 +
17742 +#include <lime/limeRFE.h>
17743 +#include <limesdr/api.h>
17744 +#include <iostream>
17745 +#include <string>
17746 +
17747 +namespace gr {
17748 +namespace limesdr {
17749 +
17750 +/*!
17751 + * \brief GNURadio block to control LimeRFE boards
17752 + * \ingroup limesdr
17753 + *
17754 + */
17755 +class LIMESDR_API rfe
17756 +{
17757 +public:
17758 + rfe(int comm_type,
17759 + std::string device,
17760 + std::string config_file,
17761 + char IDRX,
17762 + char IDTX,
17763 + char PortRX,
17764 + char PortTX,
17765 + char Mode,
17766 + char Notch,
17767 + char Atten);
17768 + ~rfe();
17769 + /**
17770 + * Change LimeRFE Mode
17771 + *
17772 + * @param mode Mode to be set: RX(0), TX(1), NONE(2), TXRX(3)
17773 + *
17774 + * @return 0 on success, other on failure (see LimeRFE error codes)
17775 + */
17776 + int change_mode(int mode);
17777 + /**
17778 + * Enable or disbale fan
17779 + *
17780 + * @param enable fan state: 0 - disable; 1 - enable.
17781 + *
17782 + * @return 0 on success, other on failure (see LimeRFE error codes)
17783 + */
17784 + int set_fan(int enable);
17785 + /**
17786 + * Set RX Attenuation value
17787 + *
17788 + * @param attenuation Specifies the attenuation in the RX path. Attenuation [dB] =
17789 + * 2 * attenuation. Value range: [0,7]
17790 + *
17791 + * @return 0 on success, other on failure (see LimeRFE error codes)
17792 + */
17793 + int set_attenuation(int attenuation);
17794 + /**
17795 + * Enable or disable AM/FM notch filter
17796 + *
17797 + * @param enable notch state: 0 - disable; 1 - enable
17798 + *
17799 + * @note Notch filter is only possible up to HAM 430-440 MHz, or Wideband 1-1000 MHz
17800 + * @return 0 on success, other on failure (see LimeRFE error codes)
17801 + */
17802 + int set_notch(int enable);
17803 +
17804 +private:
17805 + rfe_dev_t* rfe_dev = nullptr;
17806 + rfe_boardState boardState = { RFE_CID_WB_1000,
17807 + RFE_CID_WB_1000,
17808 + RFE_PORT_1,
17809 + RFE_PORT_1,
17810 + RFE_MODE_NONE,
17811 + RFE_NOTCH_OFF,
17812 + 0,
17813 + 0,
17814 + 0 };
17815 + int sdr_device_num = 0;
17816 +
17817 + void print_error(int error);
17818 +
17819 + void get_board_state()
17820 + {
17821 + rfe_boardState currentState = { 0 };
17822 + if (RFE_GetState(rfe_dev, &currentState) != 0) {
17823 + std::cout << "LimeRFE: failed to get board state" << std::endl;
17824 + return;
17825 + }
17826 +
17827 + std::cout << "LimeRFE: RX channel: " << (int)currentState.channelIDRX << std::endl;
17828 + std::cout << "LimeRFE: TX channel: " << (int)currentState.channelIDTX << std::endl;
17829 + std::cout << "LimeRFE: PortRX: " << (int)currentState.selPortRX << std::endl;
17830 + std::cout << "LimeRFE: PortTx: " << (int)currentState.selPortTX << std::endl;
17831 + std::cout << "LimeRFE: Mode: " << (int)currentState.mode << std::endl;
17832 + std::cout << "LimeRFE: Notch: " << (int)currentState.notchOnOff << std::endl;
17833 + std::cout << "LimeRFE: Attenuation: " << (int)currentState.attValue << std::endl;
17834 + std::cout << "LimeRFE: Enable SWR: " << (int)currentState.enableSWR << std::endl;
17835 + std::cout << "LimeRFE: SourceSWR: " << (int)currentState.sourceSWR << std::endl;
17836 + }
17837 +};
17838 +
17839 +} // namespace limesdr
17840 +} // namespace gr
17841 +
17842 +#endif /* INCLUDED_LIMERFE_H */
17843 diff --git a/include/limesdr/sink.h b/include/limesdr/sink.h
17844 index 76b3fa9..578dd80 100755
17845 --- a/include/limesdr/sink.h
17846 +++ b/include/limesdr/sink.h
17847 @@ -1,19 +1,19 @@
17848 /* -*- c++ -*- */
17849 /*
17850 - * Copyright 2019 Lime Microsystems <info@limemicro.com>
17851 + * Copyright 2018 Lime Microsystems info@limemicro.com
17852 *
17853 - * This is free software; you can redistribute it and/or modify
17854 + * GNU Radio is free software; you can redistribute it and/or modify
17855 * it under the terms of the GNU General Public License as published by
17856 * the Free Software Foundation; either version 3, or (at your option)
17857 * any later version.
17858 *
17859 - * This software is distributed in the hope that it will be useful,
17860 + * GNU Radio is distributed in the hope that it will be useful,
17861 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17862 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17863 * GNU General Public License for more details.
17864 *
17865 * You should have received a copy of the GNU General Public License
17866 - * along with this software; see the file COPYING. If not, write to
17867 + * along with GNU Radio; see the file COPYING. If not, write to
17868 * the Free Software Foundation, Inc., 51 Franklin Street,
17869 * Boston, MA 02110-1301, USA.
17870 */
17871 @@ -21,15 +21,14 @@
17872 #ifndef INCLUDED_LIMESDR_SINK_H
17873 #define INCLUDED_LIMESDR_SINK_H
17874
17875 -#include <gnuradio/sync_block.h>
17876 +#include <gnuradio/block.h>
17877 #include <limesdr/api.h>
17878
17879 namespace gr {
17880 namespace limesdr {
17881 -class LIMESDR_API sink : virtual public gr::sync_block
17882 -{
17883 -public:
17884 - typedef boost::shared_ptr<sink> sptr;
17885 +class LIMESDR_API sink : virtual public gr::block {
17886 + public:
17887 + typedef std::shared_ptr<sink> sptr;
17888 /*!
17889 * @brief Return a shared_ptr to a new instance of sink.
17890 *
17891 @@ -65,8 +64,8 @@ public:
17892 /**
17893 * Set which antenna is used
17894 *
17895 - * @note setting antenna to BAND1 or BAND2 will enable PA path and because of that
17896 - * Lime boards will transmit CW signal, even when stream is stopped.
17897 + * @note setting antenna to BAND1 or BAND2 will enable PA path and because of that Lime boards
17898 + * will transmit CW signal, even when stream is stopped.
17899 *
17900 * @param antenna Antenna to set: None(0), BAND1(1), BAND(2), NONE(3), AUTO(255)
17901 *
17902 @@ -107,7 +106,7 @@ public:
17903 * @note actual gain depends on LO frequency and analog LPF configuration and
17904 * resulting output signal level may be different when those values are changed
17905 *
17906 - * @param gain_dB Desired gain: [0,60]
17907 + * @param gain_dB Desired gain: [0,73] dB
17908 *
17909 * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1).
17910 *
17911 @@ -144,8 +143,7 @@ public:
17912 virtual void set_buffer_size(uint32_t size) = 0;
17913 /**
17914 * Set TCXO DAC.
17915 - * @note Care must be taken as this parameter is returned to default value only after
17916 - * power off.
17917 + * @note Care must be taken as this parameter is returned to default value only after power off.
17918 * @note LimeSDR-Mini default value is 180 range is [0,255]
17919 * LimeSDR-USB default value is 125 range is [0,255]
17920 * LimeSDR-PCIe default value is 134 range is [0,255]
17921 @@ -153,7 +151,7 @@ public:
17922 *
17923 * @param dacVal DAC value (0-65535)
17924 */
17925 - virtual void set_tcxo_dac(uint16_t dacVal = 125) = 0;
17926 + virtual void set_tcxo_dac(uint16_t dacVal = 125 ) = 0;
17927 };
17928 } // namespace limesdr
17929 } // namespace gr
17930 diff --git a/include/limesdr/source.h b/include/limesdr/source.h
17931 old mode 100644
17932 new mode 100755
17933 index 7c0454d..82fda31
17934 --- a/include/limesdr/source.h
17935 +++ b/include/limesdr/source.h
17936 @@ -1,19 +1,19 @@
17937 /* -*- c++ -*- */
17938 /*
17939 - * Copyright 2019 Lime Microsystems <info@limemicro.com>
17940 + * Copyright 2018 Lime Microsystems info@limemicro.com
17941 *
17942 - * This is free software; you can redistribute it and/or modify
17943 + * GNU Radio is free software; you can redistribute it and/or modify
17944 * it under the terms of the GNU General Public License as published by
17945 * the Free Software Foundation; either version 3, or (at your option)
17946 * any later version.
17947 *
17948 - * This software is distributed in the hope that it will be useful,
17949 + * GNU Radio is distributed in the hope that it will be useful,
17950 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17951 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17952 * GNU General Public License for more details.
17953 *
17954 * You should have received a copy of the GNU General Public License
17955 - * along with this software; see the file COPYING. If not, write to
17956 + * along with GNU Radio; see the file COPYING. If not, write to
17957 * the Free Software Foundation, Inc., 51 Franklin Street,
17958 * Boston, MA 02110-1301, USA.
17959 */
17960 @@ -21,29 +21,22 @@
17961 #ifndef INCLUDED_LIMESDR_SOURCE_H
17962 #define INCLUDED_LIMESDR_SOURCE_H
17963
17964 -#include <gnuradio/sync_block.h>
17965 +#include <gnuradio/block.h>
17966 #include <limesdr/api.h>
17967
17968 namespace gr {
17969 namespace limesdr {
17970 -
17971 -/*!
17972 - * \brief <+description of block+>
17973 - * \ingroup limesdr
17974 - *
17975 - */
17976 -class LIMESDR_API source : virtual public gr::sync_block
17977 -{
17978 -public:
17979 - typedef boost::shared_ptr<source> sptr;
17980 +class LIMESDR_API source : virtual public gr::block {
17981 + public:
17982 + typedef std::shared_ptr<source> sptr;
17983
17984 /*!
17985 - * \brief Return a shared_ptr to a new instance of limesdr::source.
17986 + * @brief Return a shared_ptr to a new instance of source.
17987 + *
17988 + * To avoid accidental use of raw pointers, source's
17989 + * constructor is private. limesdr::source::make is the public
17990 + * interface for creating new instances.
17991 *
17992 - * To avoid accidental use of raw pointers, limesdr::source's
17993 - * constructor is in a private implementation
17994 - * class. limesdr::source::make is the public interface for
17995 - * creating new instances.
17996 * @param serial Device serial number. Cannot be left blank.
17997 *
17998 * @param channel_mode Channel and mode selection A(1), B(2), (A+B)MIMO(3).
17999 @@ -60,7 +53,7 @@ public:
18000 * @param freq Frequency to set in Hz
18001 *
18002 * @param chan Channel (not used)
18003 - *
18004 + *
18005 * @return actual center frequency in Hz
18006 */
18007 virtual double set_center_freq(double freq, size_t chan = 0) = 0;
18008 @@ -69,92 +62,82 @@ public:
18009 * Set which antenna is used
18010 *
18011 * @param antenna Antenna to set: None(0), LNAH(1), LNAL(2), LNAW(3), AUTO(255)
18012 - *
18013 + *
18014 * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1).
18015 */
18016 virtual void set_antenna(int antenna, int channel = 0) = 0;
18017 -
18018 /**
18019 * Set NCO (numerically controlled oscillator).
18020 * By selecting NCO frequency
18021 * configure NCO. When NCO frequency is 0, NCO is off.
18022 *
18023 * @param nco_freq NCO frequency in Hz.
18024 - *
18025 + *
18026 * @param channel Channel index.
18027 */
18028 virtual void set_nco(float nco_freq, int channel) = 0;
18029 -
18030 /**
18031 * Set analog filters.
18032 - *
18033 + *
18034 * @param analog_bandw Channel filter bandwidth in Hz.
18035 - *
18036 + *
18037 * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1).
18038 - *
18039 + *
18040 * @return actual filter bandwidth in Hz
18041 */
18042 virtual double set_bandwidth(double analog_bandw, int channel = 0) = 0;
18043 -
18044 /**
18045 * Set digital filters (GFIR).
18046 - *
18047 + *
18048 * @param digital_bandw Channel filter bandwidth in Hz.
18049 - *
18050 + *
18051 * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1).
18052 */
18053 virtual void set_digital_filter(double digital_bandw, int channel) = 0;
18054 -
18055 /**
18056 * Set the combined gain value in dB
18057 - *
18058 + *
18059 * @note actual gain depends on LO frequency and analog LPF configuration and
18060 * resulting output signal level may be different when those values are changed
18061 *
18062 - * @param gain_dB Desired gain: [0,70] RX
18063 - *
18064 + * @param gain_dB Desired gain: [0,73] dB
18065 + *
18066 * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1).
18067 - *
18068 + *
18069 * @return actual gain in dB
18070 */
18071 virtual unsigned set_gain(unsigned gain_dB, int channel = 0) = 0;
18072 -
18073 /**
18074 * Set the same sample rate for both channels.
18075 *
18076 * @param rate Sample rate in S/s.
18077 - *
18078 + *
18079 * @return actual sample rate in S/s
18080 */
18081 virtual double set_sample_rate(double rate) = 0;
18082 -
18083 /**
18084 * Set oversampling for both channels.
18085 *
18086 * @param oversample Oversampling value (0 (default),1,2,4,8,16,32).
18087 */
18088 virtual void set_oversampling(int oversample) = 0;
18089 -
18090 /**
18091 * Perform device calibration.
18092 *
18093 * @param bandw Set calibration bandwidth in Hz.
18094 - *
18095 + *
18096 * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1).
18097 */
18098 - virtual void calibrate(double bandw, int channel = 0) = 0;
18099 -
18100 + virtual void calibrate(double bandw, int channel = 0) = 0;
18101 /**
18102 * Set stream buffer size
18103 *
18104 * @param size FIFO buffer size in samples
18105 */
18106 virtual void set_buffer_size(uint32_t size) = 0;
18107 -
18108 /**
18109 * Set TCXO DAC.
18110 - * @note Care must be taken as this parameter is returned to default value only after
18111 - * power off.
18112 + * @note Care must be taken as this parameter is returned to default value only after power off.
18113 * @note LimeSDR-Mini default value is 180 range is [0,255]
18114 * LimeSDR-USB default value is 125 range is [0,255]
18115 * LimeSDR-PCIe default value is 134 range is [0,255]
18116 @@ -162,10 +145,9 @@ public:
18117 *
18118 * @param dacVal DAC value (0-65535)
18119 */
18120 - virtual void set_tcxo_dac(uint16_t dacVal = 125) = 0;
18121 + virtual void set_tcxo_dac(uint16_t dacVal = 125 ) = 0;
18122 };
18123 -
18124 } // namespace limesdr
18125 } // namespace gr
18126
18127 -#endif /* INCLUDED_LIMESDR_SOURCE_H */
18128 +#endif
18129 diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
18130 index dc18ca7..81c9482 100644
18131 --- a/lib/CMakeLists.txt
18132 +++ b/lib/CMakeLists.txt
18133 @@ -3,20 +3,8 @@
18134 # This file was generated by gr_modtool, a tool from the GNU Radio framework
18135 # This file is a part of gr-limesdr
18136 #
18137 -# GNU Radio is free software; you can redistribute it and/or modify
18138 -# it under the terms of the GNU General Public License as published by
18139 -# the Free Software Foundation; either version 3, or (at your option)
18140 -# any later version.
18141 +# SPDX-License-Identifier: GPL-3.0-or-later
18142 #
18143 -# GNU Radio is distributed in the hope that it will be useful,
18144 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
18145 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18146 -# GNU General Public License for more details.
18147 -#
18148 -# You should have received a copy of the GNU General Public License
18149 -# along with GNU Radio; see the file COPYING. If not, write to
18150 -# the Free Software Foundation, Inc., 51 Franklin Street,
18151 -# Boston, MA 02110-1301, USA.
18152
18153 ########################################################################
18154 # Setup library
18155 @@ -24,11 +12,17 @@
18156 include(GrPlatform) #define LIB_SUFFIX
18157
18158 list(APPEND limesdr_sources
18159 - device_handler.cc
18160 source_impl.cc
18161 sink_impl.cc
18162 + common/device_handler.cc
18163 )
18164
18165 +if(ENABLE_RFE)
18166 + list(APPEND limesdr_sources
18167 + rfe_impl.cc
18168 + )
18169 +endif()
18170 +
18171 set(limesdr_sources "${limesdr_sources}" PARENT_SCOPE)
18172 if(NOT limesdr_sources)
18173 MESSAGE(STATUS "No C++ sources... skipping lib/")
18174 @@ -36,8 +30,7 @@ if(NOT limesdr_sources)
18175 endif(NOT limesdr_sources)
18176
18177 add_library(gnuradio-limesdr SHARED ${limesdr_sources})
18178 -target_link_libraries(gnuradio-limesdr gnuradio::gnuradio-runtime ${LIMESUITE_LIBRARY})
18179 -
18180 +target_link_libraries(gnuradio-limesdr gnuradio::gnuradio-runtime LimeSuite)
18181 target_include_directories(gnuradio-limesdr
18182 PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
18183 PUBLIC $<INSTALL_INTERFACE:include>
18184 @@ -50,8 +43,6 @@ if(APPLE)
18185 )
18186 endif(APPLE)
18187
18188 -add_definitions( -DGR_LIMESDR_VER="${VERSION}" )
18189 -
18190 ########################################################################
18191 # Install built library files
18192 ########################################################################
18193 diff --git a/lib/device_handler.cc b/lib/common/device_handler.cc
18194 old mode 100644
18195 new mode 100755
18196 similarity index 75%
18197 rename from lib/device_handler.cc
18198 rename to lib/common/device_handler.cc
18199 index 478d663..80070fb
18200 --- a/lib/device_handler.cc
18201 +++ b/lib/common/device_handler.cc
18202 @@ -19,24 +19,21 @@
18203 */
18204
18205 #include "device_handler.h"
18206 -#include <LMS7002M_parameters.h>
18207 +#include <lime/LMS7002M_parameters.h>
18208
18209 device_handler::~device_handler() { delete list; }
18210
18211 -void device_handler::error(int device_number)
18212 -{
18213 +void device_handler::error(int device_number) {
18214 // std::cout << "ERROR: " << LMS_GetLastErrorMessage() << std::endl;
18215 if (this->device_vector[device_number].address != NULL)
18216 close_all_devices();
18217 }
18218
18219 -lms_device_t* device_handler::get_device(int device_number)
18220 -{
18221 +lms_device_t* device_handler::get_device(int device_number) {
18222 return this->device_vector[device_number].address;
18223 }
18224
18225 -int device_handler::open_device(std::string& serial)
18226 -{
18227 +int device_handler::open_device(std::string& serial) {
18228
18229 int device_number;
18230 std::string search_name;
18231 @@ -67,8 +64,7 @@ int device_handler::open_device(std::string& serial)
18232 }
18233
18234 if (serial.empty()) {
18235 - std::cout << "INFO: device_handler::open_device(): no serial number. Using first "
18236 - "device in "
18237 + std::cout << "INFO: device_handler::open_device(): no serial number. Using first device in "
18238 "the list."
18239 << std::endl
18240 << "Use \"LimeUtil --find\" in terminal to find prefered device serial."
18241 @@ -93,8 +89,7 @@ int device_handler::open_device(std::string& serial)
18242 }
18243 // If program was unable to find device in list print error and stop program
18244 else if (i == device_count - 1 && (aquired_serial != serial)) {
18245 - std::cout << "Unable to find LMS device with serial " << serial << "."
18246 - << std::endl;
18247 + std::cout << "Unable to find LMS device with serial " << serial << "." << std::endl;
18248 std::cout << "##################" << std::endl;
18249 close_all_devices();
18250 }
18251 @@ -106,8 +101,7 @@ int device_handler::open_device(std::string& serial)
18252 LMS_SUCCESS)
18253 exit(0);
18254 LMS_Init(device_vector[device_number].address);
18255 - const lms_dev_info_t* info =
18256 - LMS_GetDeviceInfo(device_vector[device_number].address);
18257 + const lms_dev_info_t* info = LMS_GetDeviceInfo(device_vector[device_number].address);
18258 std::cout << "Using device: " << info->deviceName << "(" << serial
18259 << ") GW: " << info->gatewareVersion << " FW: " << info->firmwareVersion
18260 << std::endl;
18261 @@ -124,13 +118,11 @@ int device_handler::open_device(std::string& serial)
18262 }
18263
18264
18265 - return device_number; // return device number to identify
18266 - // device_vector[device_number].address connection in other
18267 - // functions
18268 + return device_number; // return device number to identify device_vector[device_number].address
18269 + // connection in other functions
18270 }
18271
18272 -void device_handler::close_device(int device_number, int block_type)
18273 -{
18274 +void device_handler::close_device(int device_number, int block_type) {
18275 // Check if other block finished and close device
18276 if (device_vector[device_number].source_flag == false ||
18277 device_vector[device_number].sink_flag == false) {
18278 @@ -141,8 +133,7 @@ void device_handler::close_device(int device_number, int block_type)
18279 error(device_number);
18280 if (LMS_Close(this->device_vector[device_number].address) != LMS_SUCCESS)
18281 error(device_number);
18282 - std::cout << "INFO: device_handler::close_device(): Disconnected from device "
18283 - "number "
18284 + std::cout << "INFO: device_handler::close_device(): Disconnected from device number "
18285 << device_number << "." << std::endl;
18286 device_vector[device_number].address = NULL;
18287 std::cout << "##################" << std::endl;
18288 @@ -161,8 +152,7 @@ void device_handler::close_device(int device_number, int block_type)
18289 }
18290 }
18291
18292 -void device_handler::close_all_devices()
18293 -{
18294 +void device_handler::close_all_devices() {
18295 if (close_flag == false) {
18296 for (int i = 0; i <= open_devices; i++) {
18297 if (this->device_vector[i].address != NULL) {
18298 @@ -178,14 +168,12 @@ void device_handler::close_all_devices()
18299 void device_handler::check_blocks(int device_number,
18300 int block_type,
18301 int channel_mode,
18302 - const std::string& filename)
18303 -{
18304 + const std::string& filename) {
18305 // Get each block settings
18306 switch (block_type) {
18307 case 1: // Source block
18308 if (device_vector[device_number].source_flag == true) {
18309 - std::cout << "ERROR: device_handler::check_blocks(): only one LimeSuite "
18310 - "Source (RX) "
18311 + std::cout << "ERROR: device_handler::check_blocks(): only one LimeSuite Source (RX) "
18312 "block is allowed per device."
18313 << std::endl;
18314 close_all_devices();
18315 @@ -198,10 +186,9 @@ void device_handler::check_blocks(int device_number,
18316
18317 case 2: // Sink block
18318 if (device_vector[device_number].sink_flag == true) {
18319 - std::cout
18320 - << "ERROR: device_handler::check_blocks(): only one LimeSuite Sink (TX) "
18321 - "block is allowed per device."
18322 - << std::endl;
18323 + std::cout << "ERROR: device_handler::check_blocks(): only one LimeSuite Sink (TX) "
18324 + "block is allowed per device."
18325 + << std::endl;
18326 close_all_devices();
18327 } else {
18328 device_vector[device_number].sink_flag = true;
18329 @@ -217,30 +204,25 @@ void device_handler::check_blocks(int device_number,
18330 }
18331
18332 // Check block settings which must match
18333 - if (device_vector[device_number].source_flag &&
18334 - device_vector[device_number].sink_flag) {
18335 + if (device_vector[device_number].source_flag && device_vector[device_number].sink_flag) {
18336 // Chip_mode must match in blocks with the same serial
18337 if (device_vector[device_number].source_channel_mode !=
18338 device_vector[device_number].sink_channel_mode) {
18339 std::cout << "Source: " << device_vector[device_number].source_channel_mode
18340 << std::endl;
18341 - std::cout << "Sink: " << device_vector[device_number].sink_channel_mode
18342 + std::cout << "Sink: " << device_vector[device_number].sink_channel_mode << std::endl;
18343 + std::cout << "ERROR: device_handler::check_blocks(): channel mismatch in LimeSuite "
18344 + "Source (RX) and LimeSuite Sink (TX)."
18345 << std::endl;
18346 - std::cout
18347 - << "ERROR: device_handler::check_blocks(): channel mismatch in LimeSuite "
18348 - "Source (RX) and LimeSuite Sink (TX)."
18349 - << std::endl;
18350 close_all_devices();
18351 }
18352
18353 - // When file_switch is 1 check filename match throughout the blocks with the same
18354 - // serial
18355 + // When file_switch is 1 check filename match throughout the blocks with the same serial
18356 if (device_vector[device_number].source_filename !=
18357 device_vector[device_number].sink_filename) {
18358 - std::cout
18359 - << "ERROR: device_handler::check_blocks(): file must match in LimeSuite "
18360 - "Source (RX) and LimeSuite Sink (TX)."
18361 - << std::endl;
18362 + std::cout << "ERROR: device_handler::check_blocks(): file must match in LimeSuite "
18363 + "Source (RX) and LimeSuite Sink (TX)."
18364 + << std::endl;
18365 close_all_devices();
18366 }
18367 }
18368 @@ -248,15 +230,13 @@ void device_handler::check_blocks(int device_number,
18369
18370 void device_handler::settings_from_file(int device_number,
18371 const std::string& filename,
18372 - int* pAntenna_tx)
18373 -{
18374 - if (LMS_LoadConfig(device_handler::getInstance().get_device(device_number),
18375 - filename.c_str()))
18376 + int* pAntenna_tx) {
18377 + if (LMS_LoadConfig(device_handler::getInstance().get_device(device_number), filename.c_str()))
18378 device_handler::getInstance().error(device_number);
18379
18380 // Set LimeSDR-Mini switches based on .ini file
18381 int antenna_rx = LMS_PATH_NONE;
18382 - int antenna_tx[2] = { LMS_PATH_NONE };
18383 + int antenna_tx[2] = {LMS_PATH_NONE};
18384 antenna_tx[0] = LMS_GetAntenna(
18385 device_handler::getInstance().get_device(device_number), LMS_CH_TX, LMS_CH_0);
18386 /* Don't print error message for the mini board */
18387 @@ -276,14 +256,11 @@ void device_handler::settings_from_file(int device_number,
18388 LMS_CH_TX,
18389 LMS_CH_0,
18390 antenna_tx[0]);
18391 - LMS_SetAntenna(device_handler::getInstance().get_device(device_number),
18392 - LMS_CH_RX,
18393 - LMS_CH_0,
18394 - antenna_rx);
18395 + LMS_SetAntenna(
18396 + device_handler::getInstance().get_device(device_number), LMS_CH_RX, LMS_CH_0, antenna_rx);
18397 }
18398
18399 -void device_handler::enable_channels(int device_number, int channel_mode, bool direction)
18400 -{
18401 +void device_handler::enable_channels(int device_number, int channel_mode, bool direction) {
18402 std::cout << "INFO: device_handler::enable_channels(): ";
18403 if (channel_mode < 2) {
18404
18405 @@ -292,8 +269,19 @@ void device_handler::enable_channels(int device_number, int channel_mode, bool d
18406 channel_mode,
18407 true) != LMS_SUCCESS)
18408 device_handler::getInstance().error(device_number);
18409 - std::cout << "SISO CH" << channel_mode << " set for device number "
18410 + std::cout << "SISO CH" << channel_mode << " set for device number " << device_number << "."
18411 + << std::endl;
18412 + std::cout << "SISO CH" << channel_mode << " set for device number "
18413 << device_number << "." << std::endl;
18414 +
18415 + if (direction)
18416 + rfe_device.tx_channel = channel_mode;
18417 + else
18418 + rfe_device.rx_channel = channel_mode;
18419 +
18420 + if (rfe_device.rfe_dev) {
18421 + update_rfe_channels();
18422 + }
18423 } else if (channel_mode == 2) {
18424 if (LMS_EnableChannel(device_handler::getInstance().get_device(device_number),
18425 direction,
18426 @@ -305,17 +293,14 @@ void device_handler::enable_channels(int device_number, int channel_mode, bool d
18427 LMS_CH_1,
18428 true) != LMS_SUCCESS)
18429 device_handler::getInstance().error(device_number);
18430 - std::cout << "MIMO mode set for device number " << device_number << "."
18431 - << std::endl;
18432 + std::cout << "MIMO mode set for device number " << device_number << "." << std::endl;
18433 }
18434 }
18435
18436 -void device_handler::set_samp_rate(int device_number, double& rate)
18437 -{
18438 +void device_handler::set_samp_rate(int device_number, double& rate) {
18439 std::cout << "INFO: device_handler::set_samp_rate(): ";
18440 - if (LMS_SetSampleRate(device_handler::getInstance().get_device(device_number),
18441 - rate,
18442 - 0) != LMS_SUCCESS)
18443 + if (LMS_SetSampleRate(device_handler::getInstance().get_device(device_number), rate, 0) !=
18444 + LMS_SUCCESS)
18445 device_handler::getInstance().error(device_number);
18446 double host_value;
18447 double rf_value;
18448 @@ -329,8 +314,7 @@ void device_handler::set_samp_rate(int device_number, double& rate)
18449 rate = host_value; // Get the real rate back;
18450 }
18451
18452 -void device_handler::set_oversampling(int device_number, int oversample)
18453 -{
18454 +void device_handler::set_oversampling(int device_number, int oversample) {
18455 if (oversample == 0 || oversample == 1 || oversample == 2 || oversample == 4 ||
18456 oversample == 8 || oversample == 16 || oversample == 32) {
18457 std::cout << "INFO: device_handler::set_oversampling(): ";
18458 @@ -350,21 +334,17 @@ void device_handler::set_oversampling(int device_number, int oversample)
18459
18460 std::cout << "Oversampling set to: " << oversample << std::endl;
18461 } else {
18462 - std::cout
18463 - << "ERROR: device_handler::set_oversampling(): valid oversample values are: "
18464 - "0,1,2,4,8,16,32."
18465 - << std::endl;
18466 + std::cout << "ERROR: device_handler::set_oversampling(): valid oversample values are: "
18467 + "0,1,2,4,8,16,32."
18468 + << std::endl;
18469 close_all_devices();
18470 }
18471 }
18472
18473 -double
18474 -device_handler::set_rf_freq(int device_number, bool direction, int channel, float rf_freq)
18475 -{
18476 +double device_handler::set_rf_freq(int device_number, bool direction, int channel, float rf_freq) {
18477 if (rf_freq <= 0) {
18478 - std::cout
18479 - << "ERROR: device_handler::set_rf_freq(): rf_freq must be more than 0 Hz."
18480 - << std::endl;
18481 + std::cout << "ERROR: device_handler::set_rf_freq(): rf_freq must be more than 0 Hz."
18482 + << std::endl;
18483 close_all_devices();
18484 } else {
18485 std::cout << "INFO: device_handler::set_rf_freq(): ";
18486 @@ -375,29 +355,21 @@ device_handler::set_rf_freq(int device_number, bool direction, int channel, floa
18487 device_handler::getInstance().error(device_number);
18488
18489 double value = 0;
18490 - LMS_GetLOFrequency(device_handler::getInstance().get_device(device_number),
18491 - direction,
18492 - channel,
18493 - &value);
18494 + LMS_GetLOFrequency(
18495 + device_handler::getInstance().get_device(device_number), direction, channel, &value);
18496
18497 - std::string s_dir[2] = { "RX", "TX" };
18498 - std::cout << "RF frequency set [" << s_dir[direction] << "]: " << value / 1e6
18499 - << " MHz." << std::endl;
18500 + std::string s_dir[2] = {"RX", "TX"};
18501 + std::cout << "RF frequency set [" << s_dir[direction] << "]: " << value / 1e6 << " MHz."
18502 + << std::endl;
18503 return value;
18504 }
18505 }
18506
18507 -void device_handler::calibrate(int device_number,
18508 - int direction,
18509 - int channel,
18510 - double bandwidth)
18511 -{
18512 +void device_handler::calibrate(int device_number, int direction, int channel, double bandwidth) {
18513 std::cout << "INFO: device_handler::calibrate(): ";
18514 double rf_freq = 0;
18515 - LMS_GetLOFrequency(device_handler::getInstance().get_device(device_number),
18516 - direction,
18517 - channel,
18518 - &rf_freq);
18519 + LMS_GetLOFrequency(
18520 + device_handler::getInstance().get_device(device_number), direction, channel, &rf_freq);
18521 if (rf_freq > 31e6) // Normal calibration
18522 LMS_Calibrate(device_handler::getInstance().get_device(device_number),
18523 direction,
18524 @@ -405,38 +377,28 @@ void device_handler::calibrate(int device_number,
18525 bandwidth,
18526 0);
18527 else { // Workaround
18528 - LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number),
18529 - direction,
18530 - channel,
18531 - 50e6);
18532 + LMS_SetLOFrequency(
18533 + device_handler::getInstance().get_device(device_number), direction, channel, 50e6);
18534 LMS_Calibrate(device_handler::getInstance().get_device(device_number),
18535 direction,
18536 channel,
18537 bandwidth,
18538 0);
18539 - LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number),
18540 - direction,
18541 - channel,
18542 - rf_freq);
18543 + LMS_SetLOFrequency(
18544 + device_handler::getInstance().get_device(device_number), direction, channel, rf_freq);
18545 }
18546 }
18547
18548 -void device_handler::set_antenna(int device_number,
18549 - int channel,
18550 - int direction,
18551 - int antenna)
18552 -{
18553 +void device_handler::set_antenna(int device_number, int channel, int direction, int antenna) {
18554 std::cout << "INFO: device_handler::set_antenna(): ";
18555 - LMS_SetAntenna(device_handler::getInstance().get_device(device_number),
18556 - direction,
18557 - channel,
18558 - antenna);
18559 - int antenna_value = LMS_GetAntenna(
18560 - device_handler::getInstance().get_device(device_number), direction, channel);
18561 + LMS_SetAntenna(
18562 + device_handler::getInstance().get_device(device_number), direction, channel, antenna);
18563 + int antenna_value =
18564 + LMS_GetAntenna(device_handler::getInstance().get_device(device_number), direction, channel);
18565
18566 - std::string s_antenna[2][4] = { { "Auto(NONE)", "LNAH", "LNAL", "LNAW" },
18567 - { "Auto(NONE)", "BAND1", "BAND2", "NONE" } };
18568 - std::string s_dir[2] = { "RX", "TX" };
18569 + std::string s_antenna[2][4] = {{"Auto(NONE)", "LNAH", "LNAL", "LNAW"},
18570 + {"Auto(NONE)", "BAND1", "BAND2", "NONE"}};
18571 + std::string s_dir[2] = {"RX", "TX"};
18572
18573 std::cout << "CH" << channel << " antenna set [" << s_dir[direction]
18574 << "]: " << s_antenna[direction][antenna_value] << "." << std::endl;
18575 @@ -445,8 +407,7 @@ void device_handler::set_antenna(int device_number,
18576 double device_handler::set_analog_filter(int device_number,
18577 bool direction,
18578 int channel,
18579 - double analog_bandw)
18580 -{
18581 + double analog_bandw) {
18582 if (channel == 0 || channel == 1) {
18583 if (direction == LMS_CH_TX || direction == LMS_CH_RX) {
18584 std::cout << "INFO: device_handler::set_analog_filter(): ";
18585 @@ -477,8 +438,7 @@ double device_handler::set_analog_filter(int device_number,
18586 double device_handler::set_digital_filter(int device_number,
18587 bool direction,
18588 int channel,
18589 - double digital_bandw)
18590 -{
18591 + double digital_bandw) {
18592 if (channel == 0 || channel == 1) {
18593 if (direction == LMS_CH_TX || direction == LMS_CH_RX) {
18594 bool enable = (digital_bandw > 0) ? true : false;
18595 @@ -488,9 +448,8 @@ double device_handler::set_digital_filter(int device_number,
18596 channel,
18597 enable,
18598 digital_bandw);
18599 - std::string s_dir[2] = { "RX", "TX" };
18600 - std::cout << "digital filter CH" << channel << " [" << s_dir[direction]
18601 - << "]: ";
18602 + std::string s_dir[2] = {"RX", "TX"};
18603 + std::cout << "digital filter CH" << channel << " [" << s_dir[direction] << "]: ";
18604 if (enable)
18605 std::cout << digital_bandw / 1e6 << " MHz." << std::endl;
18606 else
18607 @@ -503,60 +462,45 @@ double device_handler::set_digital_filter(int device_number,
18608 close_all_devices();
18609 }
18610 } else {
18611 - std::cout
18612 - << "ERROR: device_handler::set_digital_filter(): channel must be 0 or 1."
18613 - << std::endl;
18614 + std::cout << "ERROR: device_handler::set_digital_filter(): channel must be 0 or 1."
18615 + << std::endl;
18616 close_all_devices();
18617 }
18618 }
18619
18620 unsigned
18621 -device_handler::set_gain(int device_number, bool direction, int channel, unsigned gain_dB)
18622 -{
18623 - if ((direction == LMS_CH_RX && gain_dB >= 0 && gain_dB <= 70) ||
18624 - (direction == LMS_CH_TX && gain_dB >= 0 && gain_dB <= 60)) {
18625 +device_handler::set_gain(int device_number, bool direction, int channel, unsigned gain_dB) {
18626 + if (gain_dB >= 0 && gain_dB <= 73) {
18627 std::cout << "INFO: device_handler::set_gain(): ";
18628 - LMS_SetGaindB(device_handler::getInstance().get_device(device_number),
18629 - direction,
18630 - channel,
18631 - gain_dB);
18632 + LMS_SetGaindB(
18633 + device_handler::getInstance().get_device(device_number), direction, channel, gain_dB);
18634
18635 - std::string s_dir[2] = { "RX", "TX" };
18636 + std::string s_dir[2] = {"RX", "TX"};
18637
18638 unsigned int gain_value;
18639 LMS_GetGaindB(device_handler::getInstance().get_device(device_number),
18640 direction,
18641 channel,
18642 &gain_value);
18643 - std::cout << "set gain [" << s_dir[direction] << "] CH" << channel << ": "
18644 - << gain_value << " dB." << std::endl;
18645 + std::cout << "set gain [" << s_dir[direction] << "] CH" << channel << ": " << gain_value
18646 + << " dB." << std::endl;
18647 return gain_value;
18648 } else {
18649 - std::cout
18650 - << "ERROR: device_handler::set_gain(): valid RX gain range [0, 70], TX gain "
18651 - "range [0, 60]."
18652 - << std::endl;
18653 + std::cout << "ERROR: device_handler::set_gain(): valid gain range [0, 73] "
18654 + << std::endl;
18655 close_all_devices();
18656 }
18657 }
18658
18659 -void device_handler::set_nco(int device_number,
18660 - bool direction,
18661 - int channel,
18662 - float nco_freq)
18663 -{
18664 - std::string s_dir[2] = { "RX", "TX" };
18665 +void device_handler::set_nco(int device_number, bool direction, int channel, float nco_freq) {
18666 + std::string s_dir[2] = {"RX", "TX"};
18667 std::cout << "INFO: device_handler::set_nco(): ";
18668 if (nco_freq == 0) {
18669 - LMS_SetNCOIndex(device_handler::getInstance().get_device(device_number),
18670 - direction,
18671 - channel,
18672 - -1,
18673 - 0);
18674 - std::cout << "NCO [" << s_dir[direction] << "] CH" << channel << " disabled"
18675 - << std::endl;
18676 + LMS_SetNCOIndex(
18677 + device_handler::getInstance().get_device(device_number), direction, channel, -1, 0);
18678 + std::cout << "NCO [" << s_dir[direction] << "] CH" << channel << " disabled" << std::endl;
18679 } else {
18680 - double freq_value_in[16] = { nco_freq };
18681 + double freq_value_in[16] = {nco_freq};
18682 int cmix_mode;
18683
18684 if (nco_freq > 0)
18685 @@ -574,7 +518,7 @@ void device_handler::set_nco(int device_number,
18686 channel,
18687 0,
18688 cmix_mode);
18689 - std::string s_cmix[2] = { "UPCONVERT", "DOWNCONVERT" };
18690 + std::string s_cmix[2] = {"UPCONVERT", "DOWNCONVERT"};
18691 std::string cmix_mode_string;
18692
18693 double freq_value_out[16];
18694 @@ -590,24 +534,18 @@ void device_handler::set_nco(int device_number,
18695 }
18696 }
18697
18698 -void device_handler::disable_DC_corrections(int device_number)
18699 -{
18700 - LMS_WriteParam(
18701 - device_handler::getInstance().get_device(device_number), LMS7_DC_BYP_RXTSP, 1);
18702 - LMS_WriteParam(
18703 - device_handler::getInstance().get_device(device_number), LMS7_DCLOOP_STOP, 1);
18704 +void device_handler::disable_DC_corrections(int device_number) {
18705 + LMS_WriteParam(device_handler::getInstance().get_device(device_number), LMS7_DC_BYP_RXTSP, 1);
18706 + LMS_WriteParam(device_handler::getInstance().get_device(device_number), LMS7_DCLOOP_STOP, 1);
18707 }
18708
18709 -void device_handler::set_tcxo_dac(int device_number, uint16_t dacVal)
18710 -{
18711 +void device_handler::set_tcxo_dac(int device_number, uint16_t dacVal) {
18712 if (dacVal >= 0 && dacVal <= 65535) {
18713 std::cout << "INFO: device_handler::set_tcxo_dac(): ";
18714 float_type dac_value = dacVal;
18715
18716 - LMS_WriteCustomBoardParam(device_handler::getInstance().get_device(device_number),
18717 - BOARD_PARAM_DAC,
18718 - dacVal,
18719 - NULL);
18720 + LMS_WriteCustomBoardParam(
18721 + device_handler::getInstance().get_device(device_number), BOARD_PARAM_DAC, dacVal, NULL);
18722
18723 LMS_ReadCustomBoardParam(device_handler::getInstance().get_device(device_number),
18724 BOARD_PARAM_DAC,
18725 @@ -616,8 +554,27 @@ void device_handler::set_tcxo_dac(int device_number, uint16_t dacVal)
18726
18727 std::cout << "VCTCXO DAC value set to: " << dac_value << std::endl;
18728 } else {
18729 - std::cout << "ERROR: device_handler::set_tcxo_dac(): valid range [0, 65535]"
18730 - << std::endl;
18731 + std::cout << "ERROR: device_handler::set_tcxo_dac(): valid range [0, 65535]" << std::endl;
18732 close_all_devices();
18733 }
18734 }
18735 +
18736 +void device_handler::set_rfe_device(rfe_dev_t* rfe_dev) { rfe_device.rfe_dev = rfe_dev; }
18737 +
18738 +void device_handler::update_rfe_channels()
18739 +{
18740 + if (rfe_device.rfe_dev) {
18741 + std::cout << "INFO: device_handler::update_rfe_channels(): ";
18742 + if (RFE_AssignSDRChannels(
18743 + rfe_device.rfe_dev, rfe_device.rx_channel, rfe_device.tx_channel) != 0) {
18744 + std::cout << std::endl << "ERROR: Failed to assign SDR channels" << std::endl;
18745 + return;
18746 + }
18747 + std::cout << "RFE RX channel: " << rfe_device.rx_channel
18748 + << " TX channel: " << rfe_device.tx_channel << std::endl;
18749 + } else {
18750 + std::cout
18751 + << "ERROR: device_handler::update_rfe_channels(): no assigned RFE device"
18752 + << std::endl;
18753 + }
18754 +}
18755 diff --git a/lib/device_handler.h b/lib/common/device_handler.h
18756 old mode 100644
18757 new mode 100755
18758 similarity index 87%
18759 rename from lib/device_handler.h
18760 rename to lib/common/device_handler.h
18761 index fa4d549..d34756e
18762 --- a/lib/device_handler.h
18763 +++ b/lib/common/device_handler.h
18764 @@ -21,11 +21,12 @@
18765 #ifndef DEVICE_HANDLER_H
18766 #define DEVICE_HANDLER_H
18767
18768 -#include <LimeSuite.h>
18769 -#include <math.h>
18770 +#include <lime/LimeSuite.h>
18771 +#include <lime/limeRFE.h>
18772 #include <cmath>
18773 #include <iostream>
18774 #include <list>
18775 +#include <math.h>
18776 #include <mutex>
18777 #include <string>
18778 #include <vector>
18779 @@ -37,9 +38,10 @@
18780 #define LimeNET_Micro 2
18781 #define LimeSDR_USB 3
18782
18783 -class device_handler
18784 -{
18785 -private:
18786 +#define GR_LIMESDR_VER "2.2.7"
18787 +
18788 +class device_handler {
18789 + private:
18790 int open_devices = 0;
18791 // Read device list once flag
18792 bool list_read = false;
18793 @@ -60,6 +62,12 @@ private:
18794 std::string sink_filename;
18795 };
18796
18797 + struct rfe_device
18798 + {
18799 + int rx_channel = 0;
18800 + int tx_channel = 0;
18801 + rfe_dev_t* rfe_dev = nullptr;
18802 + }rfe_device;
18803 // Device list
18804 lms_info_str_t* list = new lms_info_str_t[20];
18805 // Device vector. Adds devices from the list
18806 @@ -72,9 +80,8 @@ private:
18807 void operator=(device_handler const&);
18808
18809
18810 -public:
18811 - static device_handler& getInstance()
18812 - {
18813 + public:
18814 + static device_handler& getInstance() {
18815 static device_handler instance;
18816 return instance;
18817 }
18818 @@ -129,10 +136,8 @@ public:
18819 *
18820 * @param filename Path to file if file switch is turned on.
18821 */
18822 - void check_blocks(int device_number,
18823 - int block_type,
18824 - int channel_mode,
18825 - const std::string& filename);
18826 + void
18827 + check_blocks(int device_number, int block_type, int channel_mode, const std::string& filename);
18828
18829 /**
18830 * Load settings from .ini file.
18831 @@ -140,12 +145,10 @@ public:
18832 * @param device_number Device number from the list of LMS_GetDeviceList.
18833 *
18834 * @param filename Path to file if file switch is turned on.
18835 - *
18836 - * @param antenna_tx Pointer to TX antenna, so PA path would be updated in sink
18837 - * block
18838 + *
18839 + * @param antenna_tx Pointer to TX antenna, so PA path would be updated in sink block
18840 */
18841 - void
18842 - settings_from_file(int device_number, const std::string& filename, int* antenna_tx);
18843 + void settings_from_file(int device_number, const std::string& filename, int* antenna_tx);
18844
18845 /**
18846 * Set used channels
18847 @@ -231,10 +234,7 @@ public:
18848 *
18849 * @param analog_bandw Channel filter bandwidth in Hz.
18850 */
18851 - double set_analog_filter(int device_number,
18852 - bool direction,
18853 - int channel,
18854 - double analog_bandw);
18855 + double set_analog_filter(int device_number, bool direction, int channel, double analog_bandw);
18856
18857 /**
18858 * Set digital filters (GFIR).
18859 @@ -247,10 +247,7 @@ public:
18860 *
18861 * @param digital_bandw Channel filter bandwidth in Hz.
18862 */
18863 - double set_digital_filter(int device_number,
18864 - bool direction,
18865 - int channel,
18866 - double digital_bandw);
18867 + double set_digital_filter(int device_number, bool direction, int channel, double digital_bandw);
18868
18869 /**
18870 * Set the combined gain value in dB
18871 @@ -266,7 +263,7 @@ public:
18872 *
18873 * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1).
18874 *
18875 - * @param gain_dB Desired gain: [0,70] RX, [0,60] TX.
18876 + * @param gain_dB Desired gain: [0,73] dB
18877 */
18878 unsigned set_gain(int device_number, bool direction, int channel, unsigned gain_dB);
18879
18880 @@ -289,18 +286,27 @@ public:
18881
18882 /**
18883 * Set TCXO DAC.
18884 - * @note Care must be taken as this parameter is returned to default value only after
18885 - * power off.
18886 + * @note Care must be taken as this parameter is returned to default value only after power off.
18887 * @note LimeSDR-Mini default value is 180 range is [0,255]
18888 * LimeSDR-USB default value is 125 range is [0,255]
18889 * LimeSDR-PCIe default value is 134 range is [0,255]
18890 * LimeNET-Micro default value is 30714 range is [0,65535]
18891 - *
18892 + *
18893 * @param device_number Device number from the list of LMS_GetDeviceList.
18894 *
18895 * @param dacVal DAC value (0-65535)
18896 */
18897 void set_tcxo_dac(int device_number, uint16_t dacVal);
18898 + /**
18899 + * Sets up LimeRFE device pointer so that automatic channel configuration could be made
18900 + * @param rfe_dev Pointer to LimeRFE device descriptor
18901 + */
18902 + void set_rfe_device(rfe_dev_t* rfe_dev);
18903 + /**
18904 + * Assigns configured LimeSDR channels to LimeRFE for automatic channel switching
18905 + */
18906 + void update_rfe_channels();
18907 +
18908 };
18909
18910
18911 diff --git a/lib/rfe_impl.cc b/lib/rfe_impl.cc
18912 new file mode 100644
18913 index 0000000..611daf7
18914 --- /dev/null
18915 +++ b/lib/rfe_impl.cc
18916 @@ -0,0 +1,262 @@
18917 +/* -*- c++ -*- */
18918 +/*
18919 + * Copyright 2020 Lime Microsystems.
18920 + *
18921 + * This is free software; you can redistribute it and/or modify
18922 + * it under the terms of the GNU General Public License as published by
18923 + * the Free Software Foundation; either version 3, or (at your option)
18924 + * any later version.
18925 + *
18926 + * This software is distributed in the hope that it will be useful,
18927 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
18928 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18929 + * GNU General Public License for more details.
18930 + *
18931 + * You should have received a copy of the GNU General Public License
18932 + * along with this software; see the file COPYING. If not, write to
18933 + * the Free Software Foundation, Inc., 51 Franklin Street,
18934 + * Boston, MA 02110-1301, USA.
18935 + */
18936 +
18937 +#ifdef HAVE_CONFIG_H
18938 +#include "config.h"
18939 +#endif
18940 +
18941 +#include "common/device_handler.h"
18942 +#include <limesdr/rfe.h>
18943 +
18944 +namespace gr {
18945 +namespace limesdr {
18946 +rfe::rfe(int comm_type,
18947 + std::string device,
18948 + std::string config_file,
18949 + char IDRX,
18950 + char IDTX,
18951 + char PortRX,
18952 + char PortTX,
18953 + char Mode,
18954 + char Notch,
18955 + char Atten)
18956 +{
18957 + std::cout << "---------------------------------------------------------------"
18958 + << std::endl;
18959 + std::cout << "LimeSuite RFE info" << std::endl;
18960 + std::cout << std::endl;
18961 +
18962 + boardState.channelIDRX = IDRX;
18963 + boardState.channelIDTX = IDTX;
18964 + boardState.selPortRX = PortRX;
18965 + boardState.selPortTX = PortTX;
18966 + boardState.mode = Mode;
18967 + boardState.notchOnOff = Notch;
18968 + boardState.attValue = Atten;
18969 +
18970 + if (comm_type) // SDR GPIO communication
18971 + {
18972 + sdr_device_num = device_handler::getInstance().open_device(device);
18973 +
18974 + std::cout << "LimeRFE: Opening through GPIO communication" << std::endl;
18975 + rfe_dev =
18976 + RFE_Open(nullptr, device_handler::getInstance().get_device(sdr_device_num));
18977 + if (!rfe_dev) {
18978 + std::cout << "LimeRFE: Failed to open device, exiting" << std::endl;
18979 + exit(0);
18980 + }
18981 +
18982 + // No need to set up this if it isn't automatic
18983 + if (boardState.channelIDRX == RFE_CID_AUTO ||
18984 + boardState.channelIDTX == RFE_CID_AUTO) {
18985 + device_handler::getInstance().set_rfe_device(rfe_dev);
18986 +
18987 + // Update the channels since the SDR could already be set up and working
18988 + device_handler::getInstance().update_rfe_channels();
18989 + }
18990 + } else // Direct USB
18991 + {
18992 + // Not using device handler so print the version
18993 + std::cout << "##################" << std::endl;
18994 + std::cout << "LimeSuite version: " << LMS_GetLibraryVersion() << std::endl;
18995 + std::cout << "gr-limesdr version: " << GR_LIMESDR_VER << std::endl;
18996 + std::cout << "##################" << std::endl;
18997 +
18998 + std::cout << "LimeRFE: Opening " << device << std::endl;
18999 + rfe_dev = RFE_Open(device.c_str(), nullptr);
19000 + if (!rfe_dev) {
19001 + std::cout << "LimeRFE: Failed to open device, exiting" << std::endl;
19002 + exit(0);
19003 + }
19004 + }
19005 +
19006 + int error = 0;
19007 + unsigned char info[4] = { 0 };
19008 + if ((error = RFE_GetInfo(rfe_dev, info)) != 0) {
19009 + std::cout << "LimeRFE: Failed to get device info: ";
19010 + print_error(error);
19011 + exit(0);
19012 + }
19013 + std::cout << "LimeRFE: FW: " << (int)info[0] << " HW: " << (int)info[1] << std::endl;
19014 +
19015 + if (config_file.empty()) {
19016 + if ((error = RFE_ConfigureState(rfe_dev, boardState)) != 0) {
19017 + std::cout << "LimeRFE: Failed to configure device: ";
19018 + print_error(error);
19019 + exit(0);
19020 + }
19021 + } else {
19022 + std::cout << "LimeRFE: Loading configuration file" << std::endl;
19023 + if ((error = RFE_LoadConfig(rfe_dev, config_file.c_str())) != 0) {
19024 + std::cout << "LimeRFE: Failed to load configuration file: ";
19025 + print_error(error);
19026 + exit(0);
19027 + }
19028 + }
19029 + std::cout << "LimeRFE: Board state: " << std::endl;
19030 + get_board_state();
19031 + std::cout << "---------------------------------------------------------------"
19032 + << std::endl;
19033 +}
19034 +
19035 +rfe::~rfe()
19036 +{
19037 + std::cout << "LimeRFE: closing" << std::endl;
19038 + if (rfe_dev) {
19039 + RFE_Reset(rfe_dev);
19040 + RFE_Close(rfe_dev);
19041 + }
19042 +}
19043 +
19044 +int rfe::change_mode(int mode)
19045 +{
19046 + if (rfe_dev) {
19047 + if (mode == RFE_MODE_TXRX) {
19048 + if (boardState.selPortRX == boardState.selPortTX &&
19049 + boardState.channelIDRX < RFE_CID_CELL_BAND01) {
19050 + std::cout
19051 + << "LimeRFE: mode cannot be set to RX+TX when same port is selected"
19052 + << std::endl;
19053 + return -1;
19054 + }
19055 + }
19056 + int error = 0;
19057 + if (mode > 3 || mode < 0)
19058 + std::cout << "LimeRFE: invalid mode" << std::endl;
19059 + std::string mode_str[4] = { "RX", "TX", "NONE", "RX+TX" };
19060 + std::cout << "LimeRFE: changing mode to " << mode_str[mode] << std::endl;
19061 + if ((error = RFE_Mode(rfe_dev, mode)) != 0) {
19062 + std::cout << "LimeRFE: failed to change mode:";
19063 + print_error(error);
19064 + }
19065 + boardState.mode = mode;
19066 + return error;
19067 + }
19068 + std::cout << "LimeRFE: no RFE device opened" << std::endl;
19069 + return -1;
19070 +}
19071 +
19072 +int rfe::set_fan(int enable)
19073 +{
19074 + if (rfe_dev) {
19075 + std::string enable_str[2] = { "disabling", "enabling" };
19076 + std::cout << "LimeRFE: " << enable_str[enable] << " fan" << std::endl;
19077 + int error = 0;
19078 + if ((error = RFE_Fan(rfe_dev, enable)) != 0) {
19079 + std::cout << "LimeRFE: failed to change mode:";
19080 + print_error(error);
19081 + }
19082 + return error;
19083 + }
19084 + std::cout << "LimeRFE: no RFE device opened" << std::endl;
19085 + return -1;
19086 +}
19087 +
19088 +int rfe::set_attenuation(int attenuation)
19089 +{
19090 + if (rfe_dev) {
19091 + int error = 0;
19092 + if (attenuation > 7) {
19093 + std::cout << "LimeRFE: attenuation value too high, valid range [0, 7]"
19094 + << std::endl;
19095 + return -1;
19096 + }
19097 + std::cout << "LimeRFE: changing attenuation value to: " << attenuation
19098 + << std::endl;
19099 + ;
19100 +
19101 + boardState.attValue = attenuation;
19102 + if ((error = RFE_ConfigureState(rfe_dev, boardState)) != 0) {
19103 + std::cout << "LimeRFE: failed to change attenuation: ";
19104 + print_error(error);
19105 + }
19106 + return error;
19107 + }
19108 + std::cout << "LimeRFE: no RFE device opened" << std::endl;
19109 + return -1;
19110 +}
19111 +
19112 +int rfe::set_notch(int enable)
19113 +{
19114 + if (rfe_dev) {
19115 + if (boardState.channelIDRX > RFE_CID_HAM_0920 ||
19116 + boardState.channelIDRX == RFE_CID_WB_4000) {
19117 + std::cout << "LimeRFE: notch filter cannot be se for this RX channel"
19118 + << std::endl;
19119 + return -1;
19120 + }
19121 + int error = 0; //! TODO: might need renaming
19122 + boardState.notchOnOff = enable;
19123 + std::string en_dis[2] = { "disabling", "enabling" };
19124 + std::cout << "LimeRFE: " << en_dis[enable] << " notch filter" << std::endl;
19125 + if ((error = RFE_ConfigureState(rfe_dev, boardState)) != 0) {
19126 + std::cout << "LimeRFE: failed to change change attenuation: ";
19127 + print_error(error);
19128 + }
19129 + return error;
19130 + }
19131 + return -1;
19132 +}
19133 +void rfe::print_error(int error)
19134 +{
19135 + switch (error) {
19136 + case -4:
19137 + std::cout << "error synchronizing communication" << std::endl;
19138 + break;
19139 + case -3:
19140 + std::cout
19141 + << "non-configurable GPIO pin specified. Only pins 4 and 5 are configurable."
19142 + << std::endl;
19143 + break;
19144 + case -2:
19145 + std::cout << "couldn't read the .ini configuration file" << std::endl;
19146 + break;
19147 + case -1:
19148 + std::cout << "communication error" << std::endl;
19149 + break;
19150 + case 1:
19151 + std::cout << "wrong TX port - not possible to route selected TX channel"
19152 + << std::endl;
19153 + break;
19154 + case 2:
19155 + std::cout << "wrong RX port - not possible to route selected RX channel"
19156 + << std::endl;
19157 + break;
19158 + case 3:
19159 + std::cout << "TX+RX mode cannot be used when same TX and RX port is used"
19160 + << std::endl;
19161 + break;
19162 + case 4:
19163 + std::cout << "wrong mode for the cellular channel" << std::endl;
19164 + break;
19165 + case 5:
19166 + std::cout << "cellular channels must be the same both for RX and TX" << std::endl;
19167 + break;
19168 + case 6:
19169 + std::cout << "requested channel code is wrong" << std::endl;
19170 + break;
19171 + default:
19172 + std::cout << "error code doesn't match" << std::endl;
19173 + break;
19174 + }
19175 +}
19176 +
19177 +} // namespace limesdr
19178 +} // namespace gr
19179 diff --git a/lib/sink_impl.cc b/lib/sink_impl.cc
19180 index 4fc7d34..d33ecf4 100755
19181 --- a/lib/sink_impl.cc
19182 +++ b/lib/sink_impl.cc
19183 @@ -1,19 +1,19 @@
19184 /* -*- c++ -*- */
19185 /*
19186 - * Copyright 2019 Lime Microsystems.
19187 + * Copyright 2018 Lime Microsystems info@limemicro.com
19188 *
19189 - * This is free software; you can redistribute it and/or modify
19190 + * GNU Radio is free software; you can redistribute it and/or modify
19191 * it under the terms of the GNU General Public License as published by
19192 * the Free Software Foundation; either version 3, or (at your option)
19193 * any later version.
19194 *
19195 - * This software is distributed in the hope that it will be useful,
19196 + * GNU Radio is distributed in the hope that it will be useful,
19197 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19198 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19199 * GNU General Public License for more details.
19200 *
19201 * You should have received a copy of the GNU General Public License
19202 - * along with this software; see the file COPYING. If not, write to
19203 + * along with GNU Radio; see the file COPYING. If not, write to
19204 * the Free Software Foundation, Inc., 51 Franklin Street,
19205 * Boston, MA 02110-1301, USA.
19206 */
19207 @@ -30,8 +30,7 @@ namespace limesdr {
19208 sink::sptr sink::make(std::string serial,
19209 int channel_mode,
19210 const std::string& filename,
19211 - const std::string& length_tag_name)
19212 -{
19213 + const std::string& length_tag_name) {
19214 return gnuradio::get_initial_sptr(
19215 new sink_impl(serial, channel_mode, filename, length_tag_name));
19216 }
19217 @@ -40,23 +39,22 @@ sink_impl::sink_impl(std::string serial,
19218 int channel_mode,
19219 const std::string& filename,
19220 const std::string& length_tag_name)
19221 - : gr::sync_block(
19222 - "sink", args_to_io_signature(channel_mode), gr::io_signature::make(0, 0, 0))
19223 -{
19224 - std::cout << "---------------------------------------------------------------"
19225 - << std::endl;
19226 + : gr::block(
19227 + "sink",
19228 + args_to_io_signature(
19229 + channel_mode), // Based on channel_mode SISO/MIMO use appropriate input signature
19230 + gr::io_signature::make(0, 0, 0)) {
19231 + std::cout << "---------------------------------------------------------------" << std::endl;
19232 std::cout << "LimeSuite Sink (TX) info" << std::endl;
19233 std::cout << std::endl;
19234
19235 - LENGTH_TAG =
19236 - length_tag_name.empty() ? pmt::PMT_NIL : pmt::string_to_symbol(length_tag_name);
19237 + LENGTH_TAG = length_tag_name.empty() ? pmt::PMT_NIL : pmt::string_to_symbol(length_tag_name);
19238 // 1. Store private variables upon implementation to protect from changing them later
19239 stored.serial = serial;
19240 stored.channel_mode = channel_mode;
19241
19242 if (stored.channel_mode < 0 && stored.channel_mode > 2) {
19243 - std::cout << "ERROR: sink_impl::sink_impl(): Channel must be A(1), B(2) or (A+B) "
19244 - "MIMO(3)"
19245 + std::cout << "ERROR: sink_impl::sink_impl(): Channel must be A(1), B(2) or (A+B) MIMO(3)"
19246 << std::endl;
19247 exit(0);
19248 }
19249 @@ -65,8 +63,7 @@ sink_impl::sink_impl(std::string serial,
19250 stored.device_number = device_handler::getInstance().open_device(stored.serial);
19251 // 3. Check where to load settings from (file or block)
19252 if (!filename.empty()) {
19253 - device_handler::getInstance().settings_from_file(
19254 - stored.device_number, filename, pa_path);
19255 + device_handler::getInstance().settings_from_file(stored.device_number, filename, pa_path);
19256 device_handler::getInstance().check_blocks(
19257 stored.device_number, sink_block, stored.channel_mode, filename);
19258 } else {
19259 @@ -83,8 +80,7 @@ sink_impl::sink_impl(std::string serial,
19260 }
19261 }
19262
19263 -sink_impl::~sink_impl()
19264 -{
19265 +sink_impl::~sink_impl() {
19266 // Stop and destroy stream for channel 0 (if channel_mode is SISO)
19267 if (stored.channel_mode < 2) {
19268 this->release_stream(stored.device_number, &streamId[stored.channel_mode]);
19269 @@ -97,10 +93,8 @@ sink_impl::~sink_impl()
19270 device_handler::getInstance().close_device(stored.device_number, sink_block);
19271 }
19272
19273 -bool sink_impl::start(void)
19274 -{
19275 - std::unique_lock<std::recursive_mutex> lock(
19276 - device_handler::getInstance().block_mutex);
19277 +bool sink_impl::start(void) {
19278 + std::unique_lock<std::recursive_mutex> lock(device_handler::getInstance().block_mutex);
19279 // Init timestamp
19280 tx_meta.timestamp = 0;
19281
19282 @@ -124,15 +118,12 @@ bool sink_impl::start(void)
19283 LMS_StartStream(&streamId[LMS_CH_0]);
19284 LMS_StartStream(&streamId[LMS_CH_1]);
19285 }
19286 - std::unique_lock<std::recursive_mutex> unlock(
19287 - device_handler::getInstance().block_mutex);
19288 + std::unique_lock<std::recursive_mutex> unlock(device_handler::getInstance().block_mutex);
19289 return true;
19290 }
19291
19292 -bool sink_impl::stop(void)
19293 -{
19294 - std::unique_lock<std::recursive_mutex> lock(
19295 - device_handler::getInstance().block_mutex);
19296 +bool sink_impl::stop(void) {
19297 + std::unique_lock<std::recursive_mutex> lock(device_handler::getInstance().block_mutex);
19298 // Stop stream for channel 0 (if channel_mode is SISO)
19299 if (stored.channel_mode < 2) {
19300 this->release_stream(stored.device_number, &streamId[stored.channel_mode]);
19301 @@ -144,15 +135,14 @@ bool sink_impl::stop(void)
19302 }
19303 // Disable PA path
19304 this->toggle_pa_path(stored.device_number, false);
19305 - std::unique_lock<std::recursive_mutex> unlock(
19306 - device_handler::getInstance().block_mutex);
19307 + std::unique_lock<std::recursive_mutex> unlock(device_handler::getInstance().block_mutex);
19308 return true;
19309 }
19310
19311 -int sink_impl::work(int noutput_items,
19312 - gr_vector_const_void_star& input_items,
19313 - gr_vector_void_star& output_items)
19314 -{
19315 +int sink_impl::general_work(int noutput_items,
19316 + gr_vector_int& ninput_items,
19317 + gr_vector_const_void_star& input_items,
19318 + gr_vector_void_star& output_items) {
19319 // Init number of items to be sent and timestamps
19320 nitems_send = noutput_items;
19321 int current_sample = nitems_read(0);
19322 @@ -192,10 +182,8 @@ int sink_impl::work(int noutput_items,
19323 if (stream_analyzer == true) {
19324 this->print_stream_stats(LMS_CH_0);
19325 }
19326 - ret[0] = LMS_SendStream(
19327 - &streamId[LMS_CH_0], input_items[0], nitems_send, &tx_meta, 100);
19328 - ret[1] = LMS_SendStream(
19329 - &streamId[LMS_CH_1], input_items[1], nitems_send, &tx_meta, 100);
19330 + ret[0] = LMS_SendStream(&streamId[LMS_CH_0], input_items[0], nitems_send, &tx_meta, 100);
19331 + ret[1] = LMS_SendStream(&streamId[LMS_CH_1], input_items[1], nitems_send, &tx_meta, 100);
19332 // Send data
19333 if (ret[0] < 0 || ret[1] < 0) {
19334 return 0;
19335 @@ -207,8 +195,7 @@ int sink_impl::work(int noutput_items,
19336 }
19337 return 0;
19338 }
19339 -void sink_impl::work_tags(int noutput_items)
19340 -{
19341 +void sink_impl::work_tags(int noutput_items) {
19342 std::vector<tag_t> tags;
19343 int current_sample = nitems_read(0);
19344 get_tags_in_range(tags, 0, current_sample, current_sample + noutput_items);
19345 @@ -251,11 +238,9 @@ void sink_impl::work_tags(int noutput_items)
19346 }
19347 }
19348 // Print stream status
19349 -void sink_impl::print_stream_stats(int channel)
19350 -{
19351 +void sink_impl::print_stream_stats(int channel) {
19352 t2 = std::chrono::high_resolution_clock::now();
19353 - auto timePeriod =
19354 - std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
19355 + auto timePeriod = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
19356 if (timePeriod >= 1000) {
19357 lms_stream_status_t status;
19358 LMS_GetStreamStatus(&streamId[channel], &status);
19359 @@ -269,8 +254,7 @@ void sink_impl::print_stream_stats(int channel)
19360 }
19361 }
19362 // Setup stream
19363 -void sink_impl::init_stream(int device_number, int channel)
19364 -{
19365 +void sink_impl::init_stream(int device_number, int channel) {
19366 streamId[channel].channel = channel;
19367 streamId[channel].fifoSize =
19368 (stored.FIFO_size == 0) ? (int)stored.samp_rate / 10 : stored.FIFO_size;
19369 @@ -282,50 +266,42 @@ void sink_impl::init_stream(int device_number, int channel)
19370 &streamId[channel]) != LMS_SUCCESS)
19371 device_handler::getInstance().error(device_number);
19372
19373 - std::cout << "INFO: sink_impl::init_stream(): sink channel " << channel
19374 - << " (device nr. " << device_number << ") stream setup done." << std::endl;
19375 + std::cout << "INFO: sink_impl::init_stream(): sink channel " << channel << " (device nr. "
19376 + << device_number << ") stream setup done." << std::endl;
19377 }
19378
19379 -void sink_impl::release_stream(int device_number, lms_stream_t* stream)
19380 -{
19381 +void sink_impl::release_stream(int device_number, lms_stream_t* stream) {
19382 if (stream->handle != 0) {
19383 LMS_StopStream(stream);
19384 - LMS_DestroyStream(device_handler::getInstance().get_device(device_number),
19385 - stream);
19386 + LMS_DestroyStream(device_handler::getInstance().get_device(device_number), stream);
19387 }
19388 }
19389
19390 // Return io_signature to manage module input count
19391 // based on SISO (one input) and MIMO (two inputs) modes
19392 -inline gr::io_signature::sptr sink_impl::args_to_io_signature(int channel_number)
19393 -{
19394 +inline gr::io_signature::sptr sink_impl::args_to_io_signature(int channel_number) {
19395 if (channel_number < 2) {
19396 return gr::io_signature::make(1, 1, sizeof(gr_complex));
19397 } else if (channel_number == 2) {
19398 return gr::io_signature::make(2, 2, sizeof(gr_complex));
19399 } else {
19400 - std::cout << "ERROR: sink_impl::args_to_io_signature(): channel_number must be "
19401 - "0,1 or 2."
19402 + std::cout << "ERROR: sink_impl::args_to_io_signature(): channel_number must be 0,1 or 2."
19403 << std::endl;
19404 exit(0);
19405 }
19406 }
19407
19408 -double sink_impl::set_center_freq(double freq, size_t chan)
19409 -{
19410 +double sink_impl::set_center_freq(double freq, size_t chan) {
19411 return device_handler::getInstance().set_rf_freq(
19412 stored.device_number, LMS_CH_TX, LMS_CH_0, freq);
19413 }
19414
19415 -void sink_impl::set_antenna(int antenna, int channel)
19416 -{
19417 +void sink_impl::set_antenna(int antenna, int channel) {
19418 pa_path[channel] = antenna;
19419 - device_handler::getInstance().set_antenna(
19420 - stored.device_number, channel, LMS_CH_TX, antenna);
19421 + device_handler::getInstance().set_antenna(stored.device_number, channel, LMS_CH_TX, antenna);
19422 }
19423
19424 -void sink_impl::toggle_pa_path(int device_number, bool enable)
19425 -{
19426 +void sink_impl::toggle_pa_path(int device_number, bool enable) {
19427 LMS_RegisterLogHandler([](int, const char*) {});
19428 if (stored.channel_mode < 2) {
19429 LMS_SetAntenna(device_handler::getInstance().get_device(device_number),
19430 @@ -345,40 +321,32 @@ void sink_impl::toggle_pa_path(int device_number, bool enable)
19431 LMS_RegisterLogHandler(nullptr);
19432 }
19433
19434 -void sink_impl::set_nco(float nco_freq, int channel)
19435 -{
19436 - device_handler::getInstance().set_nco(
19437 - stored.device_number, LMS_CH_TX, channel, nco_freq);
19438 +void sink_impl::set_nco(float nco_freq, int channel) {
19439 + device_handler::getInstance().set_nco(stored.device_number, LMS_CH_TX, channel, nco_freq);
19440 }
19441
19442 -double sink_impl::set_bandwidth(double analog_bandw, int channel)
19443 -{
19444 +double sink_impl::set_bandwidth(double analog_bandw, int channel) {
19445 return device_handler::getInstance().set_analog_filter(
19446 stored.device_number, LMS_CH_TX, channel, analog_bandw);
19447 }
19448
19449 -void sink_impl::set_digital_filter(double digital_bandw, int channel)
19450 -{
19451 +void sink_impl::set_digital_filter(double digital_bandw, int channel) {
19452 device_handler::getInstance().set_digital_filter(
19453 stored.device_number, LMS_CH_TX, channel, digital_bandw);
19454 }
19455
19456 -unsigned sink_impl::set_gain(unsigned gain_dB, int channel)
19457 -{
19458 +unsigned sink_impl::set_gain(unsigned gain_dB, int channel) {
19459 return device_handler::getInstance().set_gain(
19460 stored.device_number, LMS_CH_TX, channel, gain_dB);
19461 }
19462 -void sink_impl::calibrate(double bandw, int channel)
19463 -{
19464 +void sink_impl::calibrate(double bandw, int channel) {
19465 // PA path needs to be enabled for calibration
19466 this->toggle_pa_path(stored.device_number, true);
19467 - device_handler::getInstance().calibrate(
19468 - stored.device_number, LMS_CH_TX, channel, bandw);
19469 + device_handler::getInstance().calibrate(stored.device_number, LMS_CH_TX, channel, bandw);
19470 this->toggle_pa_path(stored.device_number, false);
19471 }
19472
19473 -double sink_impl::set_sample_rate(double rate)
19474 -{
19475 +double sink_impl::set_sample_rate(double rate) {
19476 device_handler::getInstance().set_samp_rate(stored.device_number, rate);
19477 stored.samp_rate = rate;
19478 return rate;
19479 @@ -386,13 +354,11 @@ double sink_impl::set_sample_rate(double rate)
19480
19481 void sink_impl::set_buffer_size(uint32_t size) { stored.FIFO_size = size; }
19482
19483 -void sink_impl::set_oversampling(int oversample)
19484 -{
19485 +void sink_impl::set_oversampling(int oversample) {
19486 device_handler::getInstance().set_oversampling(stored.device_number, oversample);
19487 }
19488
19489 -void sink_impl::set_tcxo_dac(uint16_t dacVal)
19490 -{
19491 +void sink_impl::set_tcxo_dac(uint16_t dacVal) {
19492 device_handler::getInstance().set_tcxo_dac(stored.device_number, dacVal);
19493 }
19494
19495 diff --git a/lib/sink_impl.h b/lib/sink_impl.h
19496 index 890a89a..5a88135 100755
19497 --- a/lib/sink_impl.h
19498 +++ b/lib/sink_impl.h
19499 @@ -1,19 +1,19 @@
19500 /* -*- c++ -*- */
19501 /*
19502 - * Copyright 2019 Lime Microsystems.
19503 + * Copyright 2018 Lime Microsystems info@limemicro.com
19504 *
19505 - * This is free software; you can redistribute it and/or modify
19506 + * GNU Radio is free software; you can redistribute it and/or modify
19507 * it under the terms of the GNU General Public License as published by
19508 * the Free Software Foundation; either version 3, or (at your option)
19509 * any later version.
19510 *
19511 - * This software is distributed in the hope that it will be useful,
19512 + * GNU Radio is distributed in the hope that it will be useful,
19513 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19514 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19515 * GNU General Public License for more details.
19516 *
19517 * You should have received a copy of the GNU General Public License
19518 - * along with this software; see the file COPYING. If not, write to
19519 + * along with GNU Radio; see the file COPYING. If not, write to
19520 * the Free Software Foundation, Inc., 51 Franklin Street,
19521 * Boston, MA 02110-1301, USA.
19522 */
19523 @@ -21,7 +21,7 @@
19524 #ifndef INCLUDED_LIMESDR_SINK_IMPL_H
19525 #define INCLUDED_LIMESDR_SINK_IMPL_H
19526
19527 -#include "device_handler.h"
19528 +#include "common/device_handler.h"
19529 #include <limesdr/sink.h>
19530
19531
19532 @@ -29,9 +29,8 @@ static const pmt::pmt_t TIME_TAG = pmt::string_to_symbol("tx_time");
19533
19534 namespace gr {
19535 namespace limesdr {
19536 -class sink_impl : public sink
19537 -{
19538 -private:
19539 +class sink_impl : public sink {
19540 + private:
19541 lms_stream_t streamId[2];
19542
19543 bool stream_analyzer = false;
19544 @@ -42,8 +41,8 @@ private:
19545 lms_stream_meta_t tx_meta;
19546 long burst_length = 0;
19547 int nitems_send = 0;
19548 - int ret[2] = { 0 };
19549 - int pa_path[2] = { 0 }; // TX PA path NONE
19550 + int ret[2] = {0};
19551 + int pa_path[2] = {0}; // TX PA path NONE
19552
19553 struct constant_data {
19554 std::string serial;
19555 @@ -59,16 +58,17 @@ private:
19556
19557 void print_stream_stats(int channel);
19558
19559 -public:
19560 + public:
19561 sink_impl(std::string serial,
19562 int channel_mode,
19563 const std::string& filename,
19564 const std::string& length_tag_name);
19565 ~sink_impl();
19566
19567 - int work(int noutput_items,
19568 - gr_vector_const_void_star& input_items,
19569 - gr_vector_void_star& output_items);
19570 + int general_work(int noutput_items,
19571 + gr_vector_int& ninput_items,
19572 + gr_vector_const_void_star& input_items,
19573 + gr_vector_void_star& output_items);
19574
19575 bool start(void);
19576
19577 @@ -80,7 +80,7 @@ public:
19578 void release_stream(int device_number, lms_stream_t* stream);
19579
19580 double set_center_freq(double freq, size_t chan = 0);
19581 -
19582 +
19583 void set_antenna(int antenna, int channel = 0);
19584 void toggle_pa_path(int device_number, bool enable);
19585
19586 @@ -99,7 +99,7 @@ public:
19587 void set_buffer_size(uint32_t size);
19588
19589 void calibrate(double bandw, int channel = 0);
19590 -
19591 +
19592 void set_tcxo_dac(uint16_t dacVal = 125);
19593 };
19594 } // namespace limesdr
19595 diff --git a/lib/source_impl.cc b/lib/source_impl.cc
19596 old mode 100644
19597 new mode 100755
19598 index a756d15..8650f36
19599 --- a/lib/source_impl.cc
19600 +++ b/lib/source_impl.cc
19601 @@ -1,19 +1,19 @@
19602 /* -*- c++ -*- */
19603 /*
19604 - * Copyright 2019 Lime Microsystems.
19605 + * Copyright 2018 Lime Microsystems info@limemicro.com
19606 *
19607 - * This is free software; you can redistribute it and/or modify
19608 + * GNU Radio is free software; you can redistribute it and/or modify
19609 * it under the terms of the GNU General Public License as published by
19610 * the Free Software Foundation; either version 3, or (at your option)
19611 * any later version.
19612 *
19613 - * This software is distributed in the hope that it will be useful,
19614 + * GNU Radio is distributed in the hope that it will be useful,
19615 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19616 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19617 * GNU General Public License for more details.
19618 *
19619 * You should have received a copy of the GNU General Public License
19620 - * along with this software; see the file COPYING. If not, write to
19621 + * along with GNU Radio; see the file COPYING. If not, write to
19622 * the Free Software Foundation, Inc., 51 Franklin Street,
19623 * Boston, MA 02110-1301, USA.
19624 */
19625 @@ -27,39 +27,27 @@
19626
19627 namespace gr {
19628 namespace limesdr {
19629 -
19630 -source::sptr
19631 -source::make(std::string serial, int channel_mode, const std::string& filename)
19632 -{
19633 +source::sptr source::make(std::string serial, int channel_mode, const std::string& filename) {
19634 return gnuradio::get_initial_sptr(new source_impl(serial, channel_mode, filename));
19635 }
19636
19637 -/*
19638 - * The private constructor
19639 - */
19640 -// gr::sync_block("source", gr::io_signature::make(0, 0, 0), gr::io_signature::make(1, 1,
19641 -// sizeof(gr_complex)))
19642 -
19643 -source_impl::source_impl(std::string serial,
19644 - int channel_mode,
19645 - const std::string& filename)
19646 - : gr::sync_block(
19647 - "source", gr::io_signature::make(0, 0, 0), args_to_io_signature(channel_mode))
19648 -{
19649 - std::cout << "---------------------------------------------------------------"
19650 - << std::endl;
19651 +source_impl::source_impl(std::string serial, int channel_mode, const std::string& filename)
19652 + : gr::block("source",
19653 + gr::io_signature::make(
19654 + 0, 0, 0), // Based on channel_mode SISO/MIMO use appropriate output signature
19655 + args_to_io_signature(channel_mode)) {
19656 + std::cout << "---------------------------------------------------------------" << std::endl;
19657 std::cout << "LimeSuite Source (RX) info" << std::endl;
19658 std::cout << std::endl;
19659
19660 - // 1. Store private variables upon implementation to protect from changing
19661 - // them later
19662 + // 1. Store private variables upon implementation to protect from changing them later
19663 stored.serial = serial;
19664 stored.channel_mode = channel_mode;
19665
19666 if (stored.channel_mode < 0 && stored.channel_mode > 2) {
19667 - std::cout << "ERROR: source_impl::source_impl(): Channel must be A(0), "
19668 - "B(1) or (A+B) MIMO(2)"
19669 - << std::endl;
19670 + std::cout
19671 + << "ERROR: source_impl::source_impl(): Channel must be A(0), B(1) or (A+B) MIMO(2)"
19672 + << std::endl;
19673 exit(0);
19674 }
19675
19676 @@ -67,8 +55,7 @@ source_impl::source_impl(std::string serial,
19677 stored.device_number = device_handler::getInstance().open_device(stored.serial);
19678 // 3. Check where to load settings from (file or block)
19679 if (!filename.empty()) {
19680 - device_handler::getInstance().settings_from_file(
19681 - stored.device_number, filename, nullptr);
19682 + device_handler::getInstance().settings_from_file(stored.device_number, filename, nullptr);
19683 device_handler::getInstance().check_blocks(
19684 stored.device_number, source_block, stored.channel_mode, filename);
19685 } else {
19686 @@ -82,11 +69,7 @@ source_impl::source_impl(std::string serial,
19687 }
19688 }
19689
19690 -/*
19691 - * Our virtual destructor.
19692 - */
19693 -source_impl::~source_impl()
19694 -{
19695 +source_impl::~source_impl() {
19696 // Stop and destroy stream for channel 0 (if channel_mode is SISO)
19697 if (stored.channel_mode < 2) {
19698 this->release_stream(stored.device_number, &streamId[stored.channel_mode]);
19699 @@ -99,10 +82,8 @@ source_impl::~source_impl()
19700 device_handler::getInstance().close_device(stored.device_number, source_block);
19701 }
19702
19703 -bool source_impl::start(void)
19704 -{
19705 - std::unique_lock<std::recursive_mutex> lock(
19706 - device_handler::getInstance().block_mutex);
19707 +bool source_impl::start(void) {
19708 + std::unique_lock<std::recursive_mutex> lock(device_handler::getInstance().block_mutex);
19709 // Initialize and start stream for channel 0 (if channel_mode is SISO)
19710 if (stored.channel_mode < 2) // If SISO configure prefered channel
19711 {
19712 @@ -122,8 +103,7 @@ bool source_impl::start(void)
19713 if (LMS_StartStream(&streamId[LMS_CH_1]) != LMS_SUCCESS)
19714 device_handler::getInstance().error(stored.device_number);
19715 }
19716 - std::unique_lock<std::recursive_mutex> unlock(
19717 - device_handler::getInstance().block_mutex);
19718 + std::unique_lock<std::recursive_mutex> unlock(device_handler::getInstance().block_mutex);
19719
19720 if (stream_analyzer) {
19721 t1 = std::chrono::high_resolution_clock::now();
19722 @@ -135,10 +115,8 @@ bool source_impl::start(void)
19723 return true;
19724 }
19725
19726 -bool source_impl::stop(void)
19727 -{
19728 - std::unique_lock<std::recursive_mutex> lock(
19729 - device_handler::getInstance().block_mutex);
19730 +bool source_impl::stop(void) {
19731 + std::unique_lock<std::recursive_mutex> lock(device_handler::getInstance().block_mutex);
19732 // Stop stream for channel 0 (if channel_mode is SISO)
19733 if (stored.channel_mode < 2) {
19734 this->release_stream(stored.device_number, &streamId[stored.channel_mode]);
19735 @@ -148,27 +126,21 @@ bool source_impl::stop(void)
19736 this->release_stream(stored.device_number, &streamId[LMS_CH_0]);
19737 this->release_stream(stored.device_number, &streamId[LMS_CH_1]);
19738 }
19739 - std::unique_lock<std::recursive_mutex> unlock(
19740 - device_handler::getInstance().block_mutex);
19741 + std::unique_lock<std::recursive_mutex> unlock(device_handler::getInstance().block_mutex);
19742 return true;
19743 }
19744
19745 -int source_impl::work(int noutput_items,
19746 - gr_vector_const_void_star& input_items,
19747 - gr_vector_void_star& output_items)
19748 -{
19749 - gr_complex* out = (gr_complex*)output_items[0];
19750 -
19751 +int source_impl::general_work(int noutput_items,
19752 + gr_vector_int& ninput_items,
19753 + gr_vector_const_void_star& input_items,
19754 + gr_vector_void_star& output_items) {
19755 // Receive stream for channel 0 (if channel_mode is SISO)
19756 if (stored.channel_mode < 2) {
19757 lms_stream_status_t status;
19758 lms_stream_meta_t rx_metadata;
19759
19760 - int ret0 = LMS_RecvStream(&streamId[stored.channel_mode],
19761 - output_items[0],
19762 - noutput_items,
19763 - &rx_metadata,
19764 - 100);
19765 + int ret0 = LMS_RecvStream(
19766 + &streamId[stored.channel_mode], output_items[0], noutput_items, &rx_metadata, 100);
19767 if (ret0 < 0) {
19768 return 0;
19769 }
19770 @@ -205,9 +177,8 @@ int source_impl::work(int noutput_items,
19771 LMS_GetStreamStatus(&streamId[LMS_CH_1], &status[1]);
19772
19773 if (add_tag || status[0].droppedPackets > 0 || status[1].droppedPackets > 0) {
19774 - pktLoss +=
19775 - status[0].droppedPackets; // because every time GetStreamStatus is called,
19776 - // packet loss is reset
19777 + pktLoss += status[0].droppedPackets; // because every time GetStreamStatus is called,
19778 + // packet loss is reset
19779 add_tag = false;
19780 this->add_time_tag(LMS_CH_0, rx_metadata[0]);
19781 this->add_time_tag(LMS_CH_1, rx_metadata[1]);
19782 @@ -226,8 +197,7 @@ int source_impl::work(int noutput_items,
19783 }
19784
19785 // Setup stream
19786 -void source_impl::init_stream(int device_number, int channel)
19787 -{
19788 +void source_impl::init_stream(int device_number, int channel) {
19789 streamId[channel].channel = channel;
19790 streamId[channel].fifoSize =
19791 (stored.FIFO_size == 0) ? (int)stored.samp_rate / 10 : stored.FIFO_size;
19792 @@ -239,25 +209,21 @@ void source_impl::init_stream(int device_number, int channel)
19793 &streamId[channel]) != LMS_SUCCESS)
19794 device_handler::getInstance().error(stored.device_number);
19795
19796 - std::cout << "INFO: source_impl::init_stream(): source channel " << channel
19797 - << " (device nr. " << device_number << ") stream setup done." << std::endl;
19798 + std::cout << "INFO: source_impl::init_stream(): source channel " << channel << " (device nr. "
19799 + << device_number << ") stream setup done." << std::endl;
19800 }
19801
19802 -void source_impl::release_stream(int device_number, lms_stream_t* stream)
19803 -{
19804 +void source_impl::release_stream(int device_number, lms_stream_t* stream) {
19805 if (stream->handle != 0) {
19806 LMS_StopStream(stream);
19807 - LMS_DestroyStream(device_handler::getInstance().get_device(device_number),
19808 - stream);
19809 + LMS_DestroyStream(device_handler::getInstance().get_device(device_number), stream);
19810 }
19811 }
19812
19813 // Print stream status
19814 -void source_impl::print_stream_stats(lms_stream_status_t status)
19815 -{
19816 +void source_impl::print_stream_stats(lms_stream_status_t status) {
19817 t2 = std::chrono::high_resolution_clock::now();
19818 - auto timePeriod =
19819 - std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
19820 + auto timePeriod = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
19821 if (timePeriod >= 1000) {
19822 std::cout << std::endl;
19823 std::cout << "RX";
19824 @@ -271,85 +237,67 @@ void source_impl::print_stream_stats(lms_stream_status_t status)
19825 }
19826
19827 // Add rx_time tag to stream
19828 -void source_impl::add_time_tag(int channel, lms_stream_meta_t meta)
19829 -{
19830 +void source_impl::add_time_tag(int channel, lms_stream_meta_t meta) {
19831
19832 uint64_t u_rate = (uint64_t)stored.samp_rate;
19833 double f_rate = stored.samp_rate - u_rate;
19834 uint64_t intpart = meta.timestamp / u_rate;
19835 - double fracpart =
19836 - (meta.timestamp - intpart * u_rate - intpart * f_rate) / stored.samp_rate;
19837 + double fracpart = (meta.timestamp - intpart * u_rate - intpart * f_rate) / stored.samp_rate;
19838
19839 const pmt::pmt_t ID = pmt::string_to_symbol(stored.serial);
19840 - const pmt::pmt_t t_val =
19841 - pmt::make_tuple(pmt::from_uint64(intpart), pmt::from_double(fracpart));
19842 + const pmt::pmt_t t_val = pmt::make_tuple(pmt::from_uint64(intpart), pmt::from_double(fracpart));
19843 this->add_item_tag(channel, nitems_written(channel), TIME_TAG, t_val, ID);
19844 }
19845 -
19846 // Return io_signature to manage module output count
19847 // based on SISO (one output) and MIMO (two outputs) modes
19848 -inline gr::io_signature::sptr source_impl::args_to_io_signature(int channel_number)
19849 -{
19850 +inline gr::io_signature::sptr source_impl::args_to_io_signature(int channel_number) {
19851 if (channel_number < 2) {
19852 return gr::io_signature::make(1, 1, sizeof(gr_complex));
19853 } else if (channel_number == 2) {
19854 return gr::io_signature::make(2, 2, sizeof(gr_complex));
19855 } else {
19856 - std::cout << "ERROR: source_impl::args_to_io_signature(): channel_number "
19857 - "must be 0,1 or 2."
19858 + std::cout << "ERROR: source_impl::args_to_io_signature(): channel_number must be 0,1 or 2."
19859 << std::endl;
19860 exit(0);
19861 }
19862 }
19863 -
19864 -double source_impl::set_center_freq(double freq, size_t chan)
19865 -{
19866 +double source_impl::set_center_freq(double freq, size_t chan) {
19867 add_tag = true;
19868 return device_handler::getInstance().set_rf_freq(
19869 stored.device_number, LMS_CH_RX, LMS_CH_0, freq);
19870 }
19871
19872 -void source_impl::set_nco(float nco_freq, int channel)
19873 -{
19874 - device_handler::getInstance().set_nco(
19875 - stored.device_number, LMS_CH_RX, channel, nco_freq);
19876 +void source_impl::set_nco(float nco_freq, int channel) {
19877 + device_handler::getInstance().set_nco(stored.device_number, LMS_CH_RX, channel, nco_freq);
19878 add_tag = true;
19879 }
19880
19881 -void source_impl::set_antenna(int antenna, int channel)
19882 -{
19883 - device_handler::getInstance().set_antenna(
19884 - stored.device_number, channel, LMS_CH_RX, antenna);
19885 +void source_impl::set_antenna(int antenna, int channel) {
19886 + device_handler::getInstance().set_antenna(stored.device_number, channel, LMS_CH_RX, antenna);
19887 }
19888
19889 -double source_impl::set_bandwidth(double analog_bandw, int channel)
19890 -{
19891 +double source_impl::set_bandwidth(double analog_bandw, int channel) {
19892 add_tag = true;
19893 return device_handler::getInstance().set_analog_filter(
19894 stored.device_number, LMS_CH_RX, channel, analog_bandw);
19895 }
19896
19897 -void source_impl::set_digital_filter(double digital_bandw, int channel)
19898 -{
19899 +void source_impl::set_digital_filter(double digital_bandw, int channel) {
19900 device_handler::getInstance().set_digital_filter(
19901 stored.device_number, LMS_CH_RX, channel, digital_bandw);
19902 add_tag = true;
19903 }
19904
19905 -unsigned source_impl::set_gain(unsigned gain_dB, int channel)
19906 -{
19907 +unsigned source_impl::set_gain(unsigned gain_dB, int channel) {
19908 return device_handler::getInstance().set_gain(
19909 stored.device_number, LMS_CH_RX, channel, gain_dB);
19910 }
19911
19912 -void source_impl::calibrate(double bandw, int channel)
19913 -{
19914 - device_handler::getInstance().calibrate(
19915 - stored.device_number, LMS_CH_RX, channel, bandw);
19916 +void source_impl::calibrate(double bandw, int channel) {
19917 + device_handler::getInstance().calibrate(stored.device_number, LMS_CH_RX, channel, bandw);
19918 }
19919
19920 -double source_impl::set_sample_rate(double rate)
19921 -{
19922 +double source_impl::set_sample_rate(double rate) {
19923 device_handler::getInstance().set_samp_rate(stored.device_number, rate);
19924 stored.samp_rate = rate;
19925 return rate;
19926 @@ -357,15 +305,13 @@ double source_impl::set_sample_rate(double rate)
19927
19928 void source_impl::set_buffer_size(uint32_t size) { stored.FIFO_size = size; }
19929
19930 -void source_impl::set_oversampling(int oversample)
19931 -{
19932 +void source_impl::set_oversampling(int oversample) {
19933 device_handler::getInstance().set_oversampling(stored.device_number, oversample);
19934 }
19935
19936 -void source_impl::set_tcxo_dac(uint16_t dacVal)
19937 -{
19938 +void source_impl::set_tcxo_dac(uint16_t dacVal) {
19939 device_handler::getInstance().set_tcxo_dac(stored.device_number, dacVal);
19940 }
19941
19942 -} /* namespace limesdr */
19943 -} /* namespace gr */
19944 +} // namespace limesdr
19945 +} // namespace gr
19946 diff --git a/lib/source_impl.h b/lib/source_impl.h
19947 old mode 100644
19948 new mode 100755
19949 index 7d1bfc3..ccd4921
19950 --- a/lib/source_impl.h
19951 +++ b/lib/source_impl.h
19952 @@ -1,19 +1,19 @@
19953 /* -*- c++ -*- */
19954 /*
19955 - * Copyright 2019 Lime Microsystems <info@limemicro.com>
19956 + * Copyright 2018 Lime Microsystems info@limemicro.com
19957 *
19958 - * This is free software; you can redistribute it and/or modify
19959 + * GNU Radio is free software; you can redistribute it and/or modify
19960 * it under the terms of the GNU General Public License as published by
19961 * the Free Software Foundation; either version 3, or (at your option)
19962 * any later version.
19963 *
19964 - * This software is distributed in the hope that it will be useful,
19965 + * GNU Radio is distributed in the hope that it will be useful,
19966 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19967 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19968 * GNU General Public License for more details.
19969 *
19970 * You should have received a copy of the GNU General Public License
19971 - * along with this software; see the file COPYING. If not, write to
19972 + * along with GNU Radio; see the file COPYING. If not, write to
19973 * the Free Software Foundation, Inc., 51 Franklin Street,
19974 * Boston, MA 02110-1301, USA.
19975 */
19976 @@ -21,18 +21,16 @@
19977 #ifndef INCLUDED_LIMESDR_SOURCE_IMPL_H
19978 #define INCLUDED_LIMESDR_SOURCE_IMPL_H
19979
19980 +#include "common/device_handler.h"
19981 #include <limesdr/source.h>
19982
19983 -#include "device_handler.h"
19984
19985 static const pmt::pmt_t TIME_TAG = pmt::string_to_symbol("rx_time");
19986
19987 namespace gr {
19988 namespace limesdr {
19989 -
19990 -class source_impl : public source
19991 -{
19992 -private:
19993 +class source_impl : public source {
19994 + private:
19995 lms_stream_t streamId[2];
19996
19997 bool stream_analyzer = false;
19998 @@ -56,23 +54,23 @@ private:
19999
20000 void add_time_tag(int channel, lms_stream_meta_t meta);
20001
20002 -public:
20003 + public:
20004 source_impl(std::string serial, int channel_mode, const std::string& filename);
20005 ~source_impl();
20006
20007 + int general_work(int noutput_items,
20008 + gr_vector_int& ninput_items,
20009 + gr_vector_const_void_star& input_items,
20010 + gr_vector_void_star& output_items);
20011 +
20012 bool start(void);
20013
20014 bool stop(void);
20015
20016 - // Where all the action really happens
20017 - int work(int noutput_items,
20018 - gr_vector_const_void_star& input_items,
20019 - gr_vector_void_star& output_items);
20020 -
20021 inline gr::io_signature::sptr args_to_io_signature(int channel_mode);
20022
20023 void init_stream(int device_number, int channel);
20024 - void release_stream(int device_number, lms_stream_t* stream);
20025 + void release_stream(int device_number, lms_stream_t *stream);
20026
20027 double set_center_freq(double freq, size_t chan = 0);
20028
20029 @@ -93,11 +91,10 @@ public:
20030 void set_buffer_size(uint32_t size);
20031
20032 void calibrate(double bandw, int channel = 0);
20033 -
20034 +
20035 void set_tcxo_dac(uint16_t dacVal = 125);
20036 };
20037 -
20038 } // namespace limesdr
20039 } // namespace gr
20040
20041 -#endif /* INCLUDED_LIMESDR_SOURCE_IMPL_H */
20042 +#endif
20043 diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
20044 index 3fc8d46..7a00d10 100644
20045 --- a/python/CMakeLists.txt
20046 +++ b/python/CMakeLists.txt
20047 @@ -3,20 +3,8 @@
20048 # This file was generated by gr_modtool, a tool from the GNU Radio framework
20049 # This file is a part of gr-limesdr
20050 #
20051 -# GNU Radio is free software; you can redistribute it and/or modify
20052 -# it under the terms of the GNU General Public License as published by
20053 -# the Free Software Foundation; either version 3, or (at your option)
20054 -# any later version.
20055 +# SPDX-License-Identifier: GPL-3.0-or-later
20056 #
20057 -# GNU Radio is distributed in the hope that it will be useful,
20058 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
20059 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20060 -# GNU General Public License for more details.
20061 -#
20062 -# You should have received a copy of the GNU General Public License
20063 -# along with GNU Radio; see the file COPYING. If not, write to
20064 -# the Free Software Foundation, Inc., 51 Franklin Street,
20065 -# Boston, MA 02110-1301, USA.
20066
20067 ########################################################################
20068 # Include python install macros
20069 @@ -26,6 +14,8 @@ if(NOT PYTHONINTERP_FOUND)
20070 return()
20071 endif()
20072
20073 +add_subdirectory(bindings)
20074 +
20075 ########################################################################
20076 # Install python sources
20077 ########################################################################
20078 @@ -41,5 +31,3 @@ GR_PYTHON_INSTALL(
20079 include(GrTest)
20080
20081 set(GR_TEST_TARGET_DEPS gnuradio-limesdr)
20082 -set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
20083 -GR_ADD_TEST(qa_source ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_source.py)
20084 diff --git a/python/__init__.py b/python/__init__.py
20085 index caf39b9..6c22ce0 100644
20086 --- a/python/__init__.py
20087 +++ b/python/__init__.py
20088 @@ -1,19 +1,7 @@
20089 #
20090 # Copyright 2008,2009 Free Software Foundation, Inc.
20091 #
20092 -# This application is free software; you can redistribute it and/or modify
20093 -# it under the terms of the GNU General Public License as published by
20094 -# the Free Software Foundation; either version 3, or (at your option)
20095 -# any later version.
20096 -#
20097 -# This application is distributed in the hope that it will be useful,
20098 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
20099 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20100 -# GNU General Public License for more details.
20101 -#
20102 -# You should have received a copy of the GNU General Public License along
20103 -# with this program; if not, write to the Free Software Foundation, Inc.,
20104 -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20105 +# SPDX-License-Identifier: GPL-3.0-or-later
20106 #
20107
20108 # The presence of this file turns this directory into a Python package
20109 @@ -22,13 +10,13 @@
20110 This is the GNU Radio LIMESDR module. Place your Python package
20111 description here (python/__init__.py).
20112 '''
20113 -from __future__ import unicode_literals
20114 +import os
20115
20116 -# import swig generated symbols into the limesdr namespace
20117 +# import pybind11 generated symbols into the limesdr namespace
20118 try:
20119 # this might fail if the module is python-only
20120 - from .limesdr_swig import *
20121 -except ImportError:
20122 + from .limesdr_python import *
20123 +except ModuleNotFoundError:
20124 pass
20125
20126 # import any pure python here
20127 diff --git a/python/bindings/CMakeLists.txt b/python/bindings/CMakeLists.txt
20128 new file mode 100644
20129 index 0000000..218be96
20130 --- /dev/null
20131 +++ b/python/bindings/CMakeLists.txt
20132 @@ -0,0 +1,46 @@
20133 +# Copyright 2020 Free Software Foundation, Inc.
20134 +#
20135 +# This file is part of GNU Radio
20136 +#
20137 +# SPDX-License-Identifier: GPL-3.0-or-later
20138 +#
20139 +
20140 +########################################################################
20141 +# Check if there is C++ code at all
20142 +########################################################################
20143 +if(NOT limesdr_sources)
20144 + MESSAGE(STATUS "No C++ sources... skipping python bindings")
20145 + return()
20146 +endif(NOT limesdr_sources)
20147 +
20148 +########################################################################
20149 +# Check for pygccxml
20150 +########################################################################
20151 +GR_PYTHON_CHECK_MODULE_RAW(
20152 + "pygccxml"
20153 + "import pygccxml"
20154 + PYGCCXML_FOUND
20155 + )
20156 +
20157 +include(GrPybind)
20158 +
20159 +########################################################################
20160 +# Python Bindings
20161 +########################################################################
20162 +
20163 +list(APPEND limesdr_python_files
20164 + sink_python.cc
20165 + source_python.cc
20166 + python_bindings.cc)
20167 +
20168 +if(ENABLE_RFE)
20169 + list(APPEND limesdr_python_files rfe_python.cc)
20170 + add_compile_definitions(ENABLE_RFE)
20171 +endif()
20172 +
20173 +GR_PYBIND_MAKE_OOT(limesdr
20174 + ../..
20175 + gr::limesdr
20176 + "${limesdr_python_files}")
20177 +
20178 +install(TARGETS limesdr_python DESTINATION ${GR_PYTHON_DIR}/limesdr COMPONENT pythonapi)
20179 diff --git a/python/bindings/README.md b/python/bindings/README.md
20180 new file mode 100644
20181 index 0000000..e69de29
20182 diff --git a/python/bindings/bind_oot_file.py b/python/bindings/bind_oot_file.py
20183 new file mode 100644
20184 index 0000000..91719f7
20185 --- /dev/null
20186 +++ b/python/bindings/bind_oot_file.py
20187 @@ -0,0 +1,57 @@
20188 +import warnings
20189 +import argparse
20190 +import os
20191 +from gnuradio.bindtool import BindingGenerator
20192 +import pathlib
20193 +import sys
20194 +
20195 +parser = argparse.ArgumentParser(description='Bind a GR Out of Tree Block')
20196 +parser.add_argument('--module', type=str,
20197 + help='Name of gr module containing file to bind (e.g. fft digital analog)')
20198 +
20199 +parser.add_argument('--output_dir', default='/tmp',
20200 + help='Output directory of generated bindings')
20201 +parser.add_argument('--prefix', help='Prefix of Installed GNU Radio')
20202 +parser.add_argument('--src', help='Directory of gnuradio source tree',
20203 + default=os.path.dirname(os.path.abspath(__file__))+'/../../..')
20204 +
20205 +parser.add_argument(
20206 + '--filename', help="File to be parsed")
20207 +
20208 +parser.add_argument(
20209 + '--defines', help='Set additional defines for precompiler',default=(), nargs='*')
20210 +parser.add_argument(
20211 + '--include', help='Additional Include Dirs, separated', default=(), nargs='*')
20212 +
20213 +parser.add_argument(
20214 + '--status', help='Location of output file for general status (used during cmake)', default=None
20215 +)
20216 +parser.add_argument(
20217 + '--flag_automatic', default='0'
20218 +)
20219 +parser.add_argument(
20220 + '--flag_pygccxml', default='0'
20221 +)
20222 +
20223 +args = parser.parse_args()
20224 +
20225 +prefix = args.prefix
20226 +output_dir = args.output_dir
20227 +defines = tuple(','.join(args.defines).split(','))
20228 +includes = ','.join(args.include)
20229 +name = args.module
20230 +
20231 +namespace = ['gr', name]
20232 +prefix_include_root = name
20233 +
20234 +
20235 +with warnings.catch_warnings():
20236 + warnings.filterwarnings("ignore", category=DeprecationWarning)
20237 +
20238 + bg = BindingGenerator(prefix, namespace,
20239 + prefix_include_root, output_dir, define_symbols=defines, addl_includes=includes,
20240 + catch_exceptions=False, write_json_output=False, status_output=args.status,
20241 + flag_automatic=True if args.flag_automatic.lower() in [
20242 + '1', 'true'] else False,
20243 + flag_pygccxml=True if args.flag_pygccxml.lower() in ['1', 'true'] else False)
20244 + bg.gen_file_binding(args.filename)
20245 diff --git a/python/bindings/docstrings/README.md b/python/bindings/docstrings/README.md
20246 new file mode 100644
20247 index 0000000..295455a
20248 --- /dev/null
20249 +++ b/python/bindings/docstrings/README.md
20250 @@ -0,0 +1 @@
20251 +This directory stores templates for docstrings that are scraped from the include header files for each block
20252 \ No newline at end of file
20253 diff --git a/python/bindings/docstrings/rfe_pydoc_template.h b/python/bindings/docstrings/rfe_pydoc_template.h
20254 new file mode 100644
20255 index 0000000..239a87a
20256 --- /dev/null
20257 +++ b/python/bindings/docstrings/rfe_pydoc_template.h
20258 @@ -0,0 +1,39 @@
20259 +/*
20260 + * Copyright 2021 Free Software Foundation, Inc.
20261 + *
20262 + * This file is part of GNU Radio
20263 + *
20264 + * SPDX-License-Identifier: GPL-3.0-or-later
20265 + *
20266 + */
20267 +#include "pydoc_macros.h"
20268 +#define D(...) DOC(gr,limesdr, __VA_ARGS__ )
20269 +/*
20270 + This file contains placeholders for docstrings for the Python bindings.
20271 + Do not edit! These were automatically extracted during the binding process
20272 + and will be overwritten during the build process
20273 + */
20274 +
20275 +
20276 +
20277 + static const char *__doc_gr_limesdr_rfe = R"doc()doc";
20278 +
20279 +
20280 + static const char *__doc_gr_limesdr_rfe_rfe_0 = R"doc()doc";
20281 +
20282 +
20283 + static const char *__doc_gr_limesdr_rfe_rfe_1 = R"doc()doc";
20284 +
20285 +
20286 + static const char *__doc_gr_limesdr_rfe_change_mode = R"doc()doc";
20287 +
20288 +
20289 + static const char *__doc_gr_limesdr_rfe_set_fan = R"doc()doc";
20290 +
20291 +
20292 + static const char *__doc_gr_limesdr_rfe_set_attenuation = R"doc()doc";
20293 +
20294 +
20295 + static const char *__doc_gr_limesdr_rfe_set_notch = R"doc()doc";
20296 +
20297 +
20298 diff --git a/python/bindings/docstrings/sink_pydoc_template.h b/python/bindings/docstrings/sink_pydoc_template.h
20299 new file mode 100644
20300 index 0000000..4a1ecac
20301 --- /dev/null
20302 +++ b/python/bindings/docstrings/sink_pydoc_template.h
20303 @@ -0,0 +1,63 @@
20304 +/*
20305 + * Copyright 2021 Free Software Foundation, Inc.
20306 + *
20307 + * This file is part of GNU Radio
20308 + *
20309 + * SPDX-License-Identifier: GPL-3.0-or-later
20310 + *
20311 + */
20312 +#include "pydoc_macros.h"
20313 +#define D(...) DOC(gr,limesdr, __VA_ARGS__ )
20314 +/*
20315 + This file contains placeholders for docstrings for the Python bindings.
20316 + Do not edit! These were automatically extracted during the binding process
20317 + and will be overwritten during the build process
20318 + */
20319 +
20320 +
20321 +
20322 + static const char *__doc_gr_limesdr_sink = R"doc()doc";
20323 +
20324 +
20325 + static const char *__doc_gr_limesdr_sink_sink_0 = R"doc()doc";
20326 +
20327 +
20328 + static const char *__doc_gr_limesdr_sink_sink_1 = R"doc()doc";
20329 +
20330 +
20331 + static const char *__doc_gr_limesdr_sink_make = R"doc()doc";
20332 +
20333 +
20334 + static const char *__doc_gr_limesdr_sink_set_center_freq = R"doc()doc";
20335 +
20336 +
20337 + static const char *__doc_gr_limesdr_sink_set_antenna = R"doc()doc";
20338 +
20339 +
20340 + static const char *__doc_gr_limesdr_sink_set_nco = R"doc()doc";
20341 +
20342 +
20343 + static const char *__doc_gr_limesdr_sink_set_bandwidth = R"doc()doc";
20344 +
20345 +
20346 + static const char *__doc_gr_limesdr_sink_set_digital_filter = R"doc()doc";
20347 +
20348 +
20349 + static const char *__doc_gr_limesdr_sink_set_gain = R"doc()doc";
20350 +
20351 +
20352 + static const char *__doc_gr_limesdr_sink_set_sample_rate = R"doc()doc";
20353 +
20354 +
20355 + static const char *__doc_gr_limesdr_sink_set_oversampling = R"doc()doc";
20356 +
20357 +
20358 + static const char *__doc_gr_limesdr_sink_calibrate = R"doc()doc";
20359 +
20360 +
20361 + static const char *__doc_gr_limesdr_sink_set_buffer_size = R"doc()doc";
20362 +
20363 +
20364 + static const char *__doc_gr_limesdr_sink_set_tcxo_dac = R"doc()doc";
20365 +
20366 +
20367 diff --git a/python/bindings/docstrings/source_pydoc_template.h b/python/bindings/docstrings/source_pydoc_template.h
20368 new file mode 100644
20369 index 0000000..c105b3d
20370 --- /dev/null
20371 +++ b/python/bindings/docstrings/source_pydoc_template.h
20372 @@ -0,0 +1,63 @@
20373 +/*
20374 + * Copyright 2021 Free Software Foundation, Inc.
20375 + *
20376 + * This file is part of GNU Radio
20377 + *
20378 + * SPDX-License-Identifier: GPL-3.0-or-later
20379 + *
20380 + */
20381 +#include "pydoc_macros.h"
20382 +#define D(...) DOC(gr,limesdr, __VA_ARGS__ )
20383 +/*
20384 + This file contains placeholders for docstrings for the Python bindings.
20385 + Do not edit! These were automatically extracted during the binding process
20386 + and will be overwritten during the build process
20387 + */
20388 +
20389 +
20390 +
20391 + static const char *__doc_gr_limesdr_source = R"doc()doc";
20392 +
20393 +
20394 + static const char *__doc_gr_limesdr_source_source_0 = R"doc()doc";
20395 +
20396 +
20397 + static const char *__doc_gr_limesdr_source_source_1 = R"doc()doc";
20398 +
20399 +
20400 + static const char *__doc_gr_limesdr_source_make = R"doc()doc";
20401 +
20402 +
20403 + static const char *__doc_gr_limesdr_source_set_center_freq = R"doc()doc";
20404 +
20405 +
20406 + static const char *__doc_gr_limesdr_source_set_antenna = R"doc()doc";
20407 +
20408 +
20409 + static const char *__doc_gr_limesdr_source_set_nco = R"doc()doc";
20410 +
20411 +
20412 + static const char *__doc_gr_limesdr_source_set_bandwidth = R"doc()doc";
20413 +
20414 +
20415 + static const char *__doc_gr_limesdr_source_set_digital_filter = R"doc()doc";
20416 +
20417 +
20418 + static const char *__doc_gr_limesdr_source_set_gain = R"doc()doc";
20419 +
20420 +
20421 + static const char *__doc_gr_limesdr_source_set_sample_rate = R"doc()doc";
20422 +
20423 +
20424 + static const char *__doc_gr_limesdr_source_set_oversampling = R"doc()doc";
20425 +
20426 +
20427 + static const char *__doc_gr_limesdr_source_calibrate = R"doc()doc";
20428 +
20429 +
20430 + static const char *__doc_gr_limesdr_source_set_buffer_size = R"doc()doc";
20431 +
20432 +
20433 + static const char *__doc_gr_limesdr_source_set_tcxo_dac = R"doc()doc";
20434 +
20435 +
20436 diff --git a/python/bindings/header_utils.py b/python/bindings/header_utils.py
20437 new file mode 100644
20438 index 0000000..165124e
20439 --- /dev/null
20440 +++ b/python/bindings/header_utils.py
20441 @@ -0,0 +1,78 @@
20442 +# Utilities for reading values in header files
20443 +
20444 +from argparse import ArgumentParser
20445 +import re
20446 +
20447 +
20448 +class PybindHeaderParser:
20449 + def __init__(self, pathname):
20450 + with open(pathname,'r') as f:
20451 + self.file_txt = f.read()
20452 +
20453 + def get_flag_automatic(self):
20454 + # p = re.compile(r'BINDTOOL_GEN_AUTOMATIC\(([^\s])\)')
20455 + # m = p.search(self.file_txt)
20456 + m = re.search(r'BINDTOOL_GEN_AUTOMATIC\(([^\s])\)', self.file_txt)
20457 + if (m and m.group(1) == '1'):
20458 + return True
20459 + else:
20460 + return False
20461 +
20462 + def get_flag_pygccxml(self):
20463 + # p = re.compile(r'BINDTOOL_USE_PYGCCXML\(([^\s])\)')
20464 + # m = p.search(self.file_txt)
20465 + m = re.search(r'BINDTOOL_USE_PYGCCXML\(([^\s])\)', self.file_txt)
20466 + if (m and m.group(1) == '1'):
20467 + return True
20468 + else:
20469 + return False
20470 +
20471 + def get_header_filename(self):
20472 + # p = re.compile(r'BINDTOOL_HEADER_FILE\(([^\s]*)\)')
20473 + # m = p.search(self.file_txt)
20474 + m = re.search(r'BINDTOOL_HEADER_FILE\(([^\s]*)\)', self.file_txt)
20475 + if (m):
20476 + return m.group(1)
20477 + else:
20478 + return None
20479 +
20480 + def get_header_file_hash(self):
20481 + # p = re.compile(r'BINDTOOL_HEADER_FILE_HASH\(([^\s]*)\)')
20482 + # m = p.search(self.file_txt)
20483 + m = re.search(r'BINDTOOL_HEADER_FILE_HASH\(([^\s]*)\)', self.file_txt)
20484 + if (m):
20485 + return m.group(1)
20486 + else:
20487 + return None
20488 +
20489 + def get_flags(self):
20490 + return f'{self.get_flag_automatic()};{self.get_flag_pygccxml()};{self.get_header_filename()};{self.get_header_file_hash()};'
20491 +
20492 +
20493 +
20494 +def argParse():
20495 + """Parses commandline args."""
20496 + desc='Reads the parameters from the comment block in the pybind files'
20497 + parser = ArgumentParser(description=desc)
20498 +
20499 + parser.add_argument("function", help="Operation to perform on comment block of pybind file", choices=["flag_auto","flag_pygccxml","header_filename","header_file_hash","all"])
20500 + parser.add_argument("pathname", help="Pathname of pybind c++ file to read, e.g. blockname_python.cc")
20501 +
20502 + return parser.parse_args()
20503 +
20504 +if __name__ == "__main__":
20505 + # Parse command line options and set up doxyxml.
20506 + args = argParse()
20507 +
20508 + pbhp = PybindHeaderParser(args.pathname)
20509 +
20510 + if args.function == "flag_auto":
20511 + print(pbhp.get_flag_automatic())
20512 + elif args.function == "flag_pygccxml":
20513 + print(pbhp.get_flag_pygccxml())
20514 + elif args.function == "header_filename":
20515 + print(pbhp.get_header_filename())
20516 + elif args.function == "header_file_hash":
20517 + print(pbhp.get_header_file_hash())
20518 + elif args.function == "all":
20519 + print(pbhp.get_flags())
20520 \ No newline at end of file
20521 diff --git a/python/bindings/python_bindings.cc b/python/bindings/python_bindings.cc
20522 new file mode 100644
20523 index 0000000..e7ad9ad
20524 --- /dev/null
20525 +++ b/python/bindings/python_bindings.cc
20526 @@ -0,0 +1,63 @@
20527 +/*
20528 + * Copyright 2020 Free Software Foundation, Inc.
20529 + *
20530 + * This file is part of GNU Radio
20531 + *
20532 + * SPDX-License-Identifier: GPL-3.0-or-later
20533 + *
20534 + */
20535 +
20536 +#include <pybind11/pybind11.h>
20537 +
20538 +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
20539 +#include <numpy/arrayobject.h>
20540 +
20541 +namespace py = pybind11;
20542 +
20543 +// Headers for binding functions
20544 +/**************************************/
20545 +// The following comment block is used for
20546 +// gr_modtool to insert function prototypes
20547 +// Please do not delete
20548 +/**************************************/
20549 +// BINDING_FUNCTION_PROTOTYPES(
20550 + void bind_sink(py::module& m);
20551 + void bind_source(py::module& m);
20552 +#ifdef ENABLE_RFE
20553 + void bind_rfe(py::module& m);
20554 +#endif
20555 +// ) END BINDING_FUNCTION_PROTOTYPES
20556 +
20557 +
20558 +// We need this hack because import_array() returns NULL
20559 +// for newer Python versions.
20560 +// This function is also necessary because it ensures access to the C API
20561 +// and removes a warning.
20562 +void* init_numpy()
20563 +{
20564 + import_array();
20565 + return NULL;
20566 +}
20567 +
20568 +PYBIND11_MODULE(limesdr_python, m)
20569 +{
20570 + // Initialize the numpy C API
20571 + // (otherwise we will see segmentation faults)
20572 + init_numpy();
20573 +
20574 + // Allow access to base block methods
20575 + py::module::import("gnuradio.gr");
20576 +
20577 + /**************************************/
20578 + // The following comment block is used for
20579 + // gr_modtool to insert binding function calls
20580 + // Please do not delete
20581 + /**************************************/
20582 + // BINDING_FUNCTION_CALLS(
20583 + bind_sink(m);
20584 + bind_source(m);
20585 +#ifdef ENABLE_RFE
20586 + bind_rfe(m);
20587 +#endif
20588 + // ) END BINDING_FUNCTION_CALLS
20589 +}
20590 \ No newline at end of file
20591 diff --git a/python/bindings/rfe_python.cc b/python/bindings/rfe_python.cc
20592 new file mode 100644
20593 index 0000000..6b9945d
20594 --- /dev/null
20595 +++ b/python/bindings/rfe_python.cc
20596 @@ -0,0 +1,96 @@
20597 +/*
20598 + * Copyright 2021 Free Software Foundation, Inc.
20599 + *
20600 + * This file is part of GNU Radio
20601 + *
20602 + * SPDX-License-Identifier: GPL-3.0-or-later
20603 + *
20604 + */
20605 +
20606 +/***********************************************************************************/
20607 +/* This file is automatically generated using bindtool and can be manually edited */
20608 +/* The following lines can be configured to regenerate this file during cmake */
20609 +/* If manual edits are made, the following tags should be modified accordingly. */
20610 +/* BINDTOOL_GEN_AUTOMATIC(0) */
20611 +/* BINDTOOL_USE_PYGCCXML(0) */
20612 +/* BINDTOOL_HEADER_FILE(rfe.h) */
20613 +/* BINDTOOL_HEADER_FILE_HASH(f9a316bfe452c1b3fe6c6ba827ced967) */
20614 +/***********************************************************************************/
20615 +
20616 +#include <pybind11/complex.h>
20617 +#include <pybind11/pybind11.h>
20618 +#include <pybind11/stl.h>
20619 +
20620 +namespace py = pybind11;
20621 +
20622 +#include <limesdr/rfe.h>
20623 +// pydoc.h is automatically generated in the build directory
20624 +#include <rfe_pydoc.h>
20625 +
20626 +void bind_rfe(py::module& m)
20627 +{
20628 +
20629 + using rfe = ::gr::limesdr::rfe;
20630 +
20631 +
20632 + py::class_<rfe,
20633 + std::shared_ptr<rfe>>(m, "rfe", D(rfe))
20634 +
20635 + .def(py::init<int,std::string,std::string,char,char,char,char,char,char,char>(), py::arg("comm_type"),
20636 + py::arg("device"),
20637 + py::arg("config_file"),
20638 + py::arg("IDRX"),
20639 + py::arg("IDTX"),
20640 + py::arg("PortRX"),
20641 + py::arg("PortTX"),
20642 + py::arg("Mode"),
20643 + py::arg("Notch"),
20644 + py::arg("Atten"),
20645 + D(rfe,rfe,0)
20646 + )
20647 + .def(py::init<gr::limesdr::rfe const &>(), py::arg("arg0"),
20648 + D(rfe,rfe,1)
20649 + )
20650 +
20651 +
20652 +
20653 + .def("change_mode",&rfe::change_mode,
20654 + py::arg("mode"),
20655 + D(rfe,change_mode)
20656 + )
20657 +
20658 +
20659 +
20660 + .def("set_fan",&rfe::set_fan,
20661 + py::arg("enable"),
20662 + D(rfe,set_fan)
20663 + )
20664 +
20665 +
20666 +
20667 + .def("set_attenuation",&rfe::set_attenuation,
20668 + py::arg("attenuation"),
20669 + D(rfe,set_attenuation)
20670 + )
20671 +
20672 +
20673 +
20674 + .def("set_notch",&rfe::set_notch,
20675 + py::arg("enable"),
20676 + D(rfe,set_notch)
20677 + )
20678 +
20679 + ;
20680 +
20681 +
20682 +
20683 +
20684 +}
20685 +
20686 +
20687 +
20688 +
20689 +
20690 +
20691 +
20692 +
20693 diff --git a/python/bindings/sink_python.cc b/python/bindings/sink_python.cc
20694 new file mode 100644
20695 index 0000000..f624d7a
20696 --- /dev/null
20697 +++ b/python/bindings/sink_python.cc
20698 @@ -0,0 +1,147 @@
20699 +/*
20700 + * Copyright 2021 Free Software Foundation, Inc.
20701 + *
20702 + * This file is part of GNU Radio
20703 + *
20704 + * SPDX-License-Identifier: GPL-3.0-or-later
20705 + *
20706 + */
20707 +
20708 +/***********************************************************************************/
20709 +/* This file is automatically generated using bindtool and can be manually edited */
20710 +/* The following lines can be configured to regenerate this file during cmake */
20711 +/* If manual edits are made, the following tags should be modified accordingly. */
20712 +/* BINDTOOL_GEN_AUTOMATIC(0) */
20713 +/* BINDTOOL_USE_PYGCCXML(0) */
20714 +/* BINDTOOL_HEADER_FILE(sink.h) */
20715 +/* BINDTOOL_HEADER_FILE_HASH(86de0559ad51d7da08762714c3ed3f77) */
20716 +/***********************************************************************************/
20717 +
20718 +#include <pybind11/complex.h>
20719 +#include <pybind11/pybind11.h>
20720 +#include <pybind11/stl.h>
20721 +
20722 +namespace py = pybind11;
20723 +
20724 +#include <limesdr/sink.h>
20725 +// pydoc.h is automatically generated in the build directory
20726 +#include <sink_pydoc.h>
20727 +
20728 +void bind_sink(py::module& m)
20729 +{
20730 +
20731 + using sink = ::gr::limesdr::sink;
20732 +
20733 +
20734 + py::class_<sink, gr::block, gr::basic_block,
20735 + std::shared_ptr<sink>>(m, "sink", D(sink))
20736 +
20737 + .def(py::init(&sink::make),
20738 + py::arg("serial"),
20739 + py::arg("channel_mode"),
20740 + py::arg("filename"),
20741 + py::arg("length_tag_name"),
20742 + D(sink,make)
20743 + )
20744 +
20745 +
20746 +
20747 +
20748 +
20749 +
20750 + .def("set_center_freq",&sink::set_center_freq,
20751 + py::arg("freq"),
20752 + py::arg("chan") = 0,
20753 + D(sink,set_center_freq)
20754 + )
20755 +
20756 +
20757 +
20758 + .def("set_antenna",&sink::set_antenna,
20759 + py::arg("antenna"),
20760 + py::arg("channel") = 0,
20761 + D(sink,set_antenna)
20762 + )
20763 +
20764 +
20765 +
20766 + .def("set_nco",&sink::set_nco,
20767 + py::arg("nco_freq"),
20768 + py::arg("channel"),
20769 + D(sink,set_nco)
20770 + )
20771 +
20772 +
20773 +
20774 + .def("set_bandwidth",&sink::set_bandwidth,
20775 + py::arg("analog_bandw"),
20776 + py::arg("channel") = 0,
20777 + D(sink,set_bandwidth)
20778 + )
20779 +
20780 +
20781 +
20782 + .def("set_digital_filter",&sink::set_digital_filter,
20783 + py::arg("digital_bandw"),
20784 + py::arg("channel"),
20785 + D(sink,set_digital_filter)
20786 + )
20787 +
20788 +
20789 +
20790 + .def("set_gain",&sink::set_gain,
20791 + py::arg("gain_dB"),
20792 + py::arg("channel") = 0,
20793 + D(sink,set_gain)
20794 + )
20795 +
20796 +
20797 +
20798 + .def("set_sample_rate",&sink::set_sample_rate,
20799 + py::arg("rate"),
20800 + D(sink,set_sample_rate)
20801 + )
20802 +
20803 +
20804 +
20805 + .def("set_oversampling",&sink::set_oversampling,
20806 + py::arg("oversample"),
20807 + D(sink,set_oversampling)
20808 + )
20809 +
20810 +
20811 +
20812 + .def("calibrate",&sink::calibrate,
20813 + py::arg("bandw"),
20814 + py::arg("channel") = 0,
20815 + D(sink,calibrate)
20816 + )
20817 +
20818 +
20819 +
20820 + .def("set_buffer_size",&sink::set_buffer_size,
20821 + py::arg("size"),
20822 + D(sink,set_buffer_size)
20823 + )
20824 +
20825 +
20826 +
20827 + .def("set_tcxo_dac",&sink::set_tcxo_dac,
20828 + py::arg("dacVal") = 125,
20829 + D(sink,set_tcxo_dac)
20830 + )
20831 +
20832 + ;
20833 +
20834 +
20835 +
20836 +
20837 +}
20838 +
20839 +
20840 +
20841 +
20842 +
20843 +
20844 +
20845 +
20846 diff --git a/python/bindings/source_python.cc b/python/bindings/source_python.cc
20847 new file mode 100644
20848 index 0000000..d8584be
20849 --- /dev/null
20850 +++ b/python/bindings/source_python.cc
20851 @@ -0,0 +1,146 @@
20852 +/*
20853 + * Copyright 2021 Free Software Foundation, Inc.
20854 + *
20855 + * This file is part of GNU Radio
20856 + *
20857 + * SPDX-License-Identifier: GPL-3.0-or-later
20858 + *
20859 + */
20860 +
20861 +/***********************************************************************************/
20862 +/* This file is automatically generated using bindtool and can be manually edited */
20863 +/* The following lines can be configured to regenerate this file during cmake */
20864 +/* If manual edits are made, the following tags should be modified accordingly. */
20865 +/* BINDTOOL_GEN_AUTOMATIC(0) */
20866 +/* BINDTOOL_USE_PYGCCXML(0) */
20867 +/* BINDTOOL_HEADER_FILE(source.h) */
20868 +/* BINDTOOL_HEADER_FILE_HASH(202afe28ab16609914f3a3a1dbdb9e56) */
20869 +/***********************************************************************************/
20870 +
20871 +#include <pybind11/complex.h>
20872 +#include <pybind11/pybind11.h>
20873 +#include <pybind11/stl.h>
20874 +
20875 +namespace py = pybind11;
20876 +
20877 +#include <limesdr/source.h>
20878 +// pydoc.h is automatically generated in the build directory
20879 +#include <source_pydoc.h>
20880 +
20881 +void bind_source(py::module& m)
20882 +{
20883 +
20884 + using source = ::gr::limesdr::source;
20885 +
20886 +
20887 + py::class_<source, gr::block, gr::basic_block,
20888 + std::shared_ptr<source>>(m, "source", D(source))
20889 +
20890 + .def(py::init(&source::make),
20891 + py::arg("serial"),
20892 + py::arg("channel_mode"),
20893 + py::arg("filename"),
20894 + D(source,make)
20895 + )
20896 +
20897 +
20898 +
20899 +
20900 +
20901 +
20902 + .def("set_center_freq",&source::set_center_freq,
20903 + py::arg("freq"),
20904 + py::arg("chan") = 0,
20905 + D(source,set_center_freq)
20906 + )
20907 +
20908 +
20909 +
20910 + .def("set_antenna",&source::set_antenna,
20911 + py::arg("antenna"),
20912 + py::arg("channel") = 0,
20913 + D(source,set_antenna)
20914 + )
20915 +
20916 +
20917 +
20918 + .def("set_nco",&source::set_nco,
20919 + py::arg("nco_freq"),
20920 + py::arg("channel"),
20921 + D(source,set_nco)
20922 + )
20923 +
20924 +
20925 +
20926 + .def("set_bandwidth",&source::set_bandwidth,
20927 + py::arg("analog_bandw"),
20928 + py::arg("channel") = 0,
20929 + D(source,set_bandwidth)
20930 + )
20931 +
20932 +
20933 +
20934 + .def("set_digital_filter",&source::set_digital_filter,
20935 + py::arg("digital_bandw"),
20936 + py::arg("channel"),
20937 + D(source,set_digital_filter)
20938 + )
20939 +
20940 +
20941 +
20942 + .def("set_gain",&source::set_gain,
20943 + py::arg("gain_dB"),
20944 + py::arg("channel") = 0,
20945 + D(source,set_gain)
20946 + )
20947 +
20948 +
20949 +
20950 + .def("set_sample_rate",&source::set_sample_rate,
20951 + py::arg("rate"),
20952 + D(source,set_sample_rate)
20953 + )
20954 +
20955 +
20956 +
20957 + .def("set_oversampling",&source::set_oversampling,
20958 + py::arg("oversample"),
20959 + D(source,set_oversampling)
20960 + )
20961 +
20962 +
20963 +
20964 + .def("calibrate",&source::calibrate,
20965 + py::arg("bandw"),
20966 + py::arg("channel") = 0,
20967 + D(source,calibrate)
20968 + )
20969 +
20970 +
20971 +
20972 + .def("set_buffer_size",&source::set_buffer_size,
20973 + py::arg("size"),
20974 + D(source,set_buffer_size)
20975 + )
20976 +
20977 +
20978 +
20979 + .def("set_tcxo_dac",&source::set_tcxo_dac,
20980 + py::arg("dacVal") = 125,
20981 + D(source,set_tcxo_dac)
20982 + )
20983 +
20984 + ;
20985 +
20986 +
20987 +
20988 +
20989 +}
20990 +
20991 +
20992 +
20993 +
20994 +
20995 +
20996 +
20997 +
20998 diff --git a/python/qa_source.py b/python/qa_source.py
20999 deleted file mode 100755
21000 index b5c5e68..0000000
21001 --- a/python/qa_source.py
21002 +++ /dev/null
21003 @@ -1,41 +0,0 @@
21004 -#!/usr/bin/env python
21005 -# -*- coding: utf-8 -*-
21006 -#
21007 -# Copyright 2019 Lime Microsystems <info@limemicro.com>
21008 -#
21009 -# This is free software; you can redistribute it and/or modify
21010 -# it under the terms of the GNU General Public License as published by
21011 -# the Free Software Foundation; either version 3, or (at your option)
21012 -# any later version.
21013 -#
21014 -# This software is distributed in the hope that it will be useful,
21015 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
21016 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21017 -# GNU General Public License for more details.
21018 -#
21019 -# You should have received a copy of the GNU General Public License
21020 -# along with this software; see the file COPYING. If not, write to
21021 -# the Free Software Foundation, Inc., 51 Franklin Street,
21022 -# Boston, MA 02110-1301, USA.
21023 -#
21024 -
21025 -from gnuradio import gr, gr_unittest
21026 -from gnuradio import blocks
21027 -import limesdr_swig as limesdr
21028 -
21029 -class qa_source(gr_unittest.TestCase):
21030 -
21031 - def setUp(self):
21032 - self.tb = gr.top_block()
21033 -
21034 - def tearDown(self):
21035 - self.tb = None
21036 -
21037 - def test_001_t(self):
21038 - # set up fg
21039 - self.tb.run()
21040 - # check data
21041 -
21042 -
21043 -if __name__ == '__main__':
21044 - gr_unittest.run(qa_source)
21045 diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt
21046 deleted file mode 100644
21047 index 5e1c011..0000000
21048 --- a/swig/CMakeLists.txt
21049 +++ /dev/null
21050 @@ -1,66 +0,0 @@
21051 -# Copyright 2011 Free Software Foundation, Inc.
21052 -#
21053 -# This file was generated by gr_modtool, a tool from the GNU Radio framework
21054 -# This file is a part of gr-limesdr
21055 -#
21056 -# GNU Radio is free software; you can redistribute it and/or modify
21057 -# it under the terms of the GNU General Public License as published by
21058 -# the Free Software Foundation; either version 3, or (at your option)
21059 -# any later version.
21060 -#
21061 -# GNU Radio is distributed in the hope that it will be useful,
21062 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
21063 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21064 -# GNU General Public License for more details.
21065 -#
21066 -# You should have received a copy of the GNU General Public License
21067 -# along with GNU Radio; see the file COPYING. If not, write to
21068 -# the Free Software Foundation, Inc., 51 Franklin Street,
21069 -# Boston, MA 02110-1301, USA.
21070 -
21071 -########################################################################
21072 -# Check if there is C++ code at all
21073 -########################################################################
21074 -if(NOT limesdr_sources)
21075 - MESSAGE(STATUS "No C++ sources... skipping swig/")
21076 - return()
21077 -endif(NOT limesdr_sources)
21078 -
21079 -########################################################################
21080 -# Include swig generation macros
21081 -########################################################################
21082 -find_package(SWIG)
21083 -find_package(PythonLibs)
21084 -if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
21085 - return()
21086 -endif()
21087 -include(GrSwig)
21088 -include(GrPython)
21089 -
21090 -########################################################################
21091 -# Setup swig generation
21092 -########################################################################
21093 -set(GR_SWIG_INCLUDE_DIRS $<TARGET_PROPERTY:gnuradio::runtime_swig,INTERFACE_INCLUDE_DIRECTORIES>)
21094 -set(GR_SWIG_TARGET_DEPS gnuradio::runtime_swig)
21095 -
21096 -set(GR_SWIG_LIBRARIES gnuradio-limesdr)
21097 -
21098 -set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/limesdr_swig_doc.i)
21099 -set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
21100 -
21101 -GR_SWIG_MAKE(limesdr_swig limesdr_swig.i)
21102 -
21103 -########################################################################
21104 -# Install the build swig module
21105 -########################################################################
21106 -GR_SWIG_INSTALL(TARGETS limesdr_swig DESTINATION ${GR_PYTHON_DIR}/limesdr)
21107 -
21108 -########################################################################
21109 -# Install swig .i files for development
21110 -########################################################################
21111 -install(
21112 - FILES
21113 - limesdr_swig.i
21114 - ${CMAKE_CURRENT_BINARY_DIR}/limesdr_swig_doc.i
21115 - DESTINATION ${GR_INCLUDE_DIR}/limesdr/swig
21116 -)
21117 diff --git a/swig/limesdr_swig.i b/swig/limesdr_swig.i
21118 deleted file mode 100644
21119 index 665c560..0000000
21120 --- a/swig/limesdr_swig.i
21121 +++ /dev/null
21122 @@ -1,18 +0,0 @@
21123 -/* -*- c++ -*- */
21124 -
21125 -#define LIMESDR_API
21126 -
21127 -%include "gnuradio.i" // the common stuff
21128 -
21129 -//load generated python docstrings
21130 -%include "limesdr_swig_doc.i"
21131 -
21132 -%{
21133 -#include "limesdr/source.h"
21134 -#include "limesdr/sink.h"
21135 -%}
21136 -
21137 -%include "limesdr/source.h"
21138 -%include "limesdr/sink.h"
21139 -GR_SWIG_BLOCK_MAGIC2(limesdr, source);
21140 -GR_SWIG_BLOCK_MAGIC2(limesdr, sink);